Skip to content

fix(web): keep message navigation visible on touch when there is room - #26806

Merged
shivamhwp merged 1 commit into
mainfrom
issue-watch/26190
Nov 5, 2026
Merged

shivamhwp merged 1 commit into
mainfrom
issue-watch/26190

Conversation

@shivamhwp

@shivamhwp shivamhwp commented Oct 29, 2026 •

Copy link
Copy Markdown
Collaborator

Unproven: the exact build/commit in the reporter's Surface Pro recording and independently repeated physical keyboard-detachment testing. Our packaged-app recordings use emulated pointer changes and touch input with synthetic conversation projections.

Closes #26190

What's fixed

At a wide conversation width, changing the primary pointer to coarse hid the minimap even though its persistent gutter remained available. The existing 48px gutter measurement now controls persistent visibility; narrow-gutter hover/focus behavior stays the same. This is submitted under CONTRIBUTING.md's focused obvious-bug exception because it restores existing navigation across a pointer change without adding a feature; no prior maintainer approval is claimed.

Evidence

Current head: cd9d62fc52b3d135b4b2272519d6489232b15f06, rebased onto 059804dfdaba54bd6f997355c30e102dae20d3b4. The two-line visibility patch is unchanged. Required checks pass or have accepted skips. A fresh independent Codex source review found no conflicts with upstream minimap highlights, wheel glide, gutter measurement or side-chat keyboard handling. Macroscope requests human review because the rail becomes visible automatically on wide touch screens.

Ready-check base review: current main 8b44f42b14c8e273156474a924ccf29680dd7857 merges cleanly with this head and retains exactly the same two-line minimap diff. A separate Codex review found no affected minimap behavior, gutter geometry, pointer gating, highlights, wheel handling, shared CSS, resize observation or dependency lockfile changes since the recorded build. Later main changes affect server recovery, diff metadata, footer alignment and native Android panes; release metadata changes 0.1.6 to 0.1.7 while Electron stays 44.10.1. Recordings remain evidence for this exact head and its 0.1.6 packages, not an executed merged-main build.

New-head verification on corex: vp run check:changed origin/main passed format, lint, both knip checks, the two affected typechecks and React compiler validation. vp test run apps/web/src/components/chat/timelineMinimapWheel.browser.test.ts passed all four existing cases, including wheel glide interrupted by navigation. Fixture rows decode against this head's contracts.

The built-in Browser client at 1600x900 kept the persistent rail visible, navigated from scrollTop 6482 to 291 using its message button, and updated the new pseudo-element highlights to opacity 1 for visible messages. At 600x900, the nonpersistent rail faded to opacity 0 after focus left it. This pass used synthetic projection data and a fine pointer. Browser snapshot calls timed out, but the recording worked and its extracted frame was inspected. It does not establish pointer transitions or touch behavior.

browser-pass.mp4

Packaged Linux at current head cd9d62fc52b3d135b4b2272519d6489232b15f06: physical corex, Ubuntu 26.04.1 x64, T3 0.1.6, Electron 44.10.1. The original package ran in a private Sway 1.11 native Wayland compositor at fixed 1600x900, with a wlr virtual pointer for fine capability. Actual Chromium touch emulation changed the primary pointer to coarse and back. All 935 samples kept the rail block/opacity 1/persistent true. Trusted touch navigated from scrollTop 6734 to 115; restored mouse navigation and changing scroll highlights worked. Trusted touch stopped an in-progress wheel glide at 982 before its 1700 target, and it stayed at 982 after 300ms.

linux-native.mp4

Linux initial fine pointer

Linux coarse pointer, rail remains visible

Linux trusted touch reveals earlier text

Linux fine pointer restored

Boat build j_4th3b23zve5v34ndmyv5 completed with exit 0. Archive SHA-256 a9c3c39f5e1479986fa7fe672ccd4e7ea3656b67e76d53ab2297522c7e35f9ef; app.asar SHA-256 f213d2b45b6bac711d08ba324b1ab8a9411a5654fdc24b5da2ae9f83d0b95c9c. Runtime reports app.isPackaged=true and package commit cd9d62f. Five served HTML/JS/CSS assets match the archive. Native MP4 is 19.23 seconds, 578 frames; full decoding passed and extracted frames were inspected. Isolation used a runtime os.homedir() filesystem shim and --password-store=basic. Package bytes stayed unchanged. Synthetic projections test visual navigation, not backend orchestration; user prompts group together in this fixture. This uses CPU rendering and emulated touch, not a physical touchscreen or keyboard detach. Narrow native states were not exercised because the 860px window minimum retained a 48px persistent gutter. App/compositor/pointer processes and host scratch state were removed.

Packaged macOS at current head cd9d62fc52b3d135b4b2272519d6489232b15f06: physical shiv, macOS 27.0.1 arm64, T3 0.1.6, Electron 44.10.1. At fixed native/CSS 1600x900, actual Chromium touch emulation changed the pointer from fine to coarse and back. All 601 samples kept the rail block/opacity 1/persistent true. Trusted touch navigated from scrollTop 6734 to 115; restored mouse navigation moved 87 to 495. Highlights followed the visible messages. A trusted pointerdown stopped a wheel glide at 993 before its 1495 target, held it there for 300ms, and release navigated to 36.

macos-cd9d62f-pointer.mp4

Current-head macOS initial fine pointer

Current-head macOS coarse pointer retains the rail

Current-head macOS trusted touch reveals earlier text

Current-head macOS fine pointer restored

Build, pointer sequence and full video decode exited 0. Native window recording is 32.72 seconds, 642 encoded frames; wrec reported six dropped capture frames. Extracted stage frames and the full contact sheet were inspected. Runtime reports app.isPackaged=true and package commit cd9d62f. All 278 served frontend resources match the original archive. App.asar SHA-256 28074f8edc6cabcb8f7af9c72fef547604c22727d273e98c9011211f1a38ea91; all 176 package entries stayed unchanged. Isolation used --use-mock-keychain, a runtime os.homedir() filesystem shim, and focus/showInactive shims to keep the test window in the background. These recordings do not establish normal Keychain startup, foreground activation or signed distribution. Synthetic projections test visual navigation, not backend orchestration. Native nonpersistent states were unreachable because the 840px window minimum retained a 48px gutter. Test app, backend, monitors, profiles, build and scratch state were cleaned up; shiv was never slept or locked.

The packaged recordings below are historical evidence for e124ec628aedf8d72c1fd8d08a007e5228ab8a53, not the rebased build.

The reporter confirms that the PR works on their Surface Pro and supplied this 52-second recording. It shows the Windows app, including a section labeled 'pr' with the minimap visible. The recording does not identify an exact build or commit.

Recording.2026-11-01.180838.mp4

Packaged macOS, physical shiv, macOS 27.0.1 arm64, T3 0.1.5, Electron 44.10.0. At fixed 1600x900, the rail stays visible through fine, coarse and restored fine pointer states. Trusted touch navigation moves scrollTop from 6818 to 127. The native recording is 22.98 seconds. The original package and served frontend bytes match. Isolation used --use-mock-keychain and a runtime os.homedir() filesystem shim; archive and executable bytes were unchanged.

packaged-macos-pointer.mp4

Packaged macOS, initial fine pointer

Packaged macOS, coarse pointer with persistent rail

Packaged macOS, trusted touch reveals earlier messages

Packaged macOS, fine pointer restored

Packaged Linux, physical corex, Ubuntu 26.04.1 x64, T3 0.1.5, Electron 44.10.0. A private headless Sway 1.11 display records the fullscreen native Wayland app at fixed 1600x900. A standard Wayland virtual pointer supplies initial fine capability; Chromium touch emulation changes it to coarse and back. Trusted touch on the actual rail button moves scrollTop from 6818 to 127. The rail stays visible across all four stages and 202 samples. wf-recorder captured a 20.08-second native compositor video. The original package is unchanged, and served HTML, entry JavaScript and CSS match its app.asar bytes. No CSS, matchMedia or device-metrics overrides were used. This avoids the unavailable GNOME window-capture helper without capturing Shivam's desktop.

packaged-linux-e124ec6.mp4

Packaged Linux, initial fine pointer

Packaged Linux, coarse pointer with persistent rail

Packaged Linux, trusted touch reveals earlier messages

Packaged Linux, fine pointer restored

Independent verification from Maria on this exact head reproduced the baseline failure and the fix in a real web development environment with completed Codex turns. Trusted touch and restored mouse navigation worked; narrow coarse-pointer gating and fine-pointer hover behavior remained correct. That pass explicitly excludes packaged Electron.

Earlier before/after macOS desktop captures, baseline fe219c4de18f5ee37c28cbd3914a5569b1579156 and pre-rebase head 073c03f600b465c9aecd0ae7eb5eb3afaaa4aa7a. These demonstrate the same visibility-class patch before the rebase; they are not recordings of the current package.

https://github.com/user-attachments/assets/437e78f8-65a1-46b8-8cac-2329b80d82e2
macOS desktop before: the minimap disappears when the pointer becomes coarse.

https://github.com/user-attachments/assets/d19cfde7-7d82-4a8a-b8aa-9aeb9469f3f8
macOS desktop after: the minimap stays visible and supports touch navigation.

Baseline desktop, rail hidden in coarse mode

Pre-rebase fixed desktop, rail visible in coarse mode

Earlier physical POCO F4 Android Chrome touch navigation on 073c03f, before the rebase:

touch-rail.mp4

Not independently tested by us: physical Surface keyboard detachment, Windows Electron, GNOME window recording, normal Keychain startup or signed distribution. All test apps, processes and isolated state were cleaned up.

Implemented with Claude Opus 5.5; investigated, tested and reviewed with gpt-6.1-sol through Codex.

@github-actions github-actions Bot added vouch:trusted PR author is trusted by repo permissions or the VOUCHED list. size:XS 0-9 changed lines (additions + deletions). labels Oct 29, 2026
@macroscopeapp

macroscopeapp Bot commented Oct 29, 2026 •

Copy link
Copy Markdown
Contributor

Approvability

Verdict: Needs Human Approval

Macroscope's review found this PR requires human approval — Message navigation will appear automatically on touch devices when sufficient gutter space exists. This changes the default presentation for those users and requires human confirmation.

No code changes detected at cd9d62f. Prior analysis still applies.

You can add or adjust custom eligibility rules. Learn more.

@coderabbitai

coderabbitai Bot commented Oct 29, 2026 •

Copy link
Copy Markdown
Contributor

Review in Change Stack →

No actionable comments were generated in the recent review.

Walkthrough

The timeline minimap now remains visible when a persistent gutter is present. Without a persistent gutter, it is hidden by default and appears transparently on fine-pointer devices, becoming opaque on hover or keyboard focus.

Changes: Timeline minimap visibility

Layer / File(s) Summary
Minimap visibility classes
apps/web/src/components/chat/TimelineMinimap.tsx
The container remains opaque when hasPersistentGutter is true. Otherwise, it is hidden by default and uses opacity transitions on fine-pointer devices.

Estimated code review effort: 1 (Trivial) | ~3 minutes

Change: Bug fix

Possibly related issues

Suggested reviewers: juliusmarminge

Merge Risk: Minimal · up to 073c0

The minimap visibility change matches the stated behavior and has no established merge-blocking risk.

Pre-merge checks: Passed 4
Check name Status Explanation
Title check Passed The title clearly and concisely describes the main change: keeping message navigation visible on touch devices when space is available.
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.
Description check Passed The description follows the repository template closely. It has a clear Problem statement (wide-width minimap hidden on coarse pointers despite a persistent gutter), a Change section (the existing 48p…
Full details: Description check

Explanation

The description follows the repository template closely. It has a clear Problem statement (wide-width minimap hidden on coarse pointers despite a persistent gutter), a Change section (the existing 48px gutter measurement now controls persistent visibility, with narrow-gutter hover/focus unchanged), and a Scope and approval section. That section cites CONTRIBUTING.md's focused obvious-bug exception and explicitly claims no prior maintainer approval. The Verification section is very thorough: packaged Linux and macOS runs, a Windows reporter confirmation, an independent reviewer, and repo checks. Before/after captures and the exact commit hashes are included, and the untested items are listed. Minor gaps: the description is very long and dense, the template's Verification guidance asks for focused tests, and the Scope section depends on the author's own exemption claim, which a maintainer must judge. The Problem section is concise but lacks a reproduction step beyond the linked issue.

Finishing Touches
Generate docstrings
  • Commit to this branch
  • Create a new PR
🧪 Generate unit tests (beta)
  • Commit to this branch
  • Create a new PR
  • Autofix · Keep fixing CodeRabbit findings and required CI, and resolving merge conflicts
Recent review info
Run configuration
Commits

Reviewing files that changed from the base of the PR and between fe219c4 and 073c03f.

Files selected for processing: 1
  • apps/web/src/components/chat/TimelineMinimap.tsx

Included review availability: This review used your included allowance. Your plan provides up to 10 included reviews per hour; 2 remain after this review.

GigaZoro pushed a commit to GigaZoro/CodeShip that referenced this pull request Oct 30, 2026
… (upstream pingdotgg#26806)

Cherry-picked from pingdotgg#26806

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

Copy link
Copy Markdown
Collaborator

Note

Written by gpt-6.1-sol on behalf of Maria

Verified in a real dev environment

verified as-is on e124ec628aedf8d72c1fd8d08a007e5228ab8a53 in a disposable linux boat vm. no source changes or pushes were needed.

ran vp i and background vp run dev on github/main (15fe283272) in a separate worktree, then on the exact pr head. only one dev server ran at a time. playwright from the repository drove /usr/bin/google-chrome through pairing, project creation, model selection and message submission. the project points at a real git worktree. two real codex gpt-6.1-sol turns completed on main; their app-created state was copied into the pr's isolated home with the server stopped. a third real codex turn completed on the pr. no mocks, fixtures or demo data.

at 1600x1000, chromium's touch emulation changed actual pointer media queries from fine to coarse. main hid the minimap despite a persistent gutter. the pr kept it visible. trusted touch input on the rail navigated to an earlier message. restoring a fine pointer preserved the rail, and mouse navigation still worked. at 600x1000 without a persistent gutter, touch correctly hid the rail; mouse hover revealed it.

main fine:   persistent=true, display=block
main coarse: persistent=true, display=none
pr fine:     persistent=true, display=block, opacity=1
pr coarse:   persistent=true, display=block, opacity=1
touch navigation: scrollTop 788 -> 399
touchstart, touchend, click: isTrusted=true
mouse navigation: scrollTop -> 0
narrow coarse: persistent=false, display=none
narrow fine: display=block, opacity=0 idle -> 1 on hover

before and after use the same two completed turns and viewport. current main includes unrelated layout changes, so text lane widths differ. the recording uses the third real turn to provide more scrollable content. inspected the captures and verified uploaded video playback and seeking in the t3 browser. cafe reports 32 successful checks, zero failing or pending checks; no local automated checks were rerun for this verification-only pass.

before: main hides the minimap with a coarse pointer

after: pr keeps the minimap visible with the same conversation and coarse pointer

pr: real conversation touch and mouse navigation

Not verified

physical surface keyboard detachment and physical touchscreen hardware; pointer changes and touch input used chromium emulation. packaged electron on linux, macos or windows; native ios/android clients; remote relay/tunnel connections. this pass exercised the local web client and real codex provider through the running server. other providers were outside this css-only change.

@nosabecom

Copy link
Copy Markdown

I'm the author of the issue. I will test if this works on my surface pro

@nosabecom

Copy link
Copy Markdown
Recording.2026-11-01.180838.mp4

Pr works on surface pro. YAY!!!!!

The minimap was hidden for any non-fine pointer, so a Surface Pro dropped
it when its keyboard was detached even with a wide gutter. Only hide it on
coarse pointers when it would otherwise rely on hover to appear.

Fixes #26190

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@shivamhwp
shivamhwp merged commit c1f91b5 into main Nov 5, 2026
38 checks passed
@shivamhwp
shivamhwp deleted the issue-watch/26190 branch November 5, 2026 01:12
github-actions Bot added a commit to omarcresp/t3code-flake that referenced this pull request Nov 5, 2026
**v0.1.8-nightly.20261105.4205** · 28 changes from 3 contributors

- **Claude MCP Apps.** Use interactive MCP Apps in Claude Code threads.
- **Organized repository clones.** Clone repositories into host, owner, and repository folders, including repositories with the same name.
- **Agent browser tabs.** Open new agent browser tabs when idle tabs have filled the shared limit.
- **Pending questions.** Answer or dismiss older questions and approval prompts even after their messages leave the loaded conversation.

### Plus 22 more bug fixes.

<details>
<summary>Full changelog</summary>

## What's Changed
* docs: scope managed-policy LAN note to old background services by @b2bvic in pingdotgg/t3code#30900
* feat(server): render MCP Apps from Claude tool calls by @juliusmarminge in pingdotgg/t3code#29803
* build: run Effect rules on mobile and lock in clean suggestion rules by @juliusmarminge in pingdotgg/t3code#31111
* fix(mobile): keep iOS composer empty after sending an autocorrected word by @shivamhwp in pingdotgg/t3code#30308
* fix(server): idle agent tabs free a slot when the server's 32-tab browser limit is full by @shivamhwp in pingdotgg/t3code#24186
* fix(web): keep message navigation visible on touch when there is room by @shivamhwp in pingdotgg/t3code#26806
* fix(mobile): pinch wide images from anywhere in the Android viewer by @shivamhwp in pingdotgg/t3code#30929
* fix(mobile): preserve autocorrect in custom question answers by @shivamhwp in pingdotgg/t3code#30744
* fix(web): show Setting up during worktree setup by @shivamhwp in pingdotgg/t3code#28832
* fix(mobile): keep iOS thread menus short enough for drag selection by @shivamhwp in pingdotgg/t3code#30944
* fix(web): show the comparison base beside Changes totals by @shivamhwp in pingdotgg/t3code#30085
* fix(mobile): use H.264 for iOS previews and keep Close reachable by @shivamhwp in pingdotgg/t3code#28622
* fix(mobile): iOS image previews open without waiting for the gallery by @shivamhwp in pingdotgg/t3code#29044
* feat: optionally clone repos into ghq-style <host>/<owner>/<repo> folders by @shivamhwp in pingdotgg/t3code#24904
* fix(devices): explain Windows SSH host failures by @shivamhwp in pingdotgg/t3code#30941
* fix(web): make styled composer Markdown markers editable by @shivamhwp in pingdotgg/t3code#30421
* fix(mobile): configure another Claude account from Providers by @shivamhwp in pingdotgg/t3code#28928
* fix(web,mobile): save pull request description checkbox changes by @shivamhwp in pingdotgg/t3code#30704
* fix(client): a big server config on a slow link no longer drops the connection in a loop by @shivamhwp in pingdotgg/t3code#23758
* fix(server): restart T3 Connect's tunnel client when Cloudflare drops it by @shivamhwp in pingdotgg/t3code#24946
* fix(mobile): compact stale Claude threads before sending by @shivamhwp in pingdotgg/t3code#27935
* fix(web): show saved service access with Local environment off by @shivamhwp in pingdotgg/t3code#26464
* fix: keep older pending questions answerable by @shivamhwp in pingdotgg/t3code#26435
* fix(web): deleted forks no longer remain in Lineage by @shivamhwp in pingdotgg/t3code#29000
* fix(server): preserve sibling wakeups when interrupting a completion wake by @shivamhwp in pingdotgg/t3code#28204
* fix(server): attribute usage-limit auto-resume to T3 Code by @shivamhwp in pingdotgg/t3code#29838
* fix(acp): time out silent Antigravity prompts by @shivamhwp in pingdotgg/t3code#30377
* fix(codex): sharing usage limits offer the existing recovery options by @shivamhwp in pingdotgg/t3code#25341

## New Contributors
* @b2bvic made their first contribution in pingdotgg/t3code#30900

**Full Changelog**: pingdotgg/t3code@v0.1.8-nightly.20261104.4192...v0.1.8-nightly.20261105.4205

</details>


Upstream release: https://github.com/pingdotgg/t3code/releases/tag/v0.1.8-nightly.20261105.4205
Pipyakas pushed a commit to Pipyakas/t3code that referenced this pull request Nov 5, 2026
…pingdotgg#26806)

Co-authored-by: PR Batch Tester <agent@local.test>
Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
(cherry picked from commit c1f91b5)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size:XS 0-9 changed lines (additions + deletions). vouch:trusted PR author is trusted by repo permissions or the VOUCHED list.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[Bug]: Message navigation minimap disappears when Surface keyboard is detached

3 participants