fix(web): popovers over the desktop header respond to the pointer#31794
Problem
The model picker loses hover feedback where it overlaps the desktop header because Electron intercepts native pointer events in the window drag region.
Change
The shared popover popup now uses no-drag, matching menus and dialogs.
Scope and approval
Closes https://github.com/pingdotgg/t3code/issues/31783.
This qualifies for the small, focused fix exception in CONTRIBUTING.md. It fixes an independently reproduced hit-testing defect by applying the same popup exclusion already used by menus and dialogs.
Verification
Before, at bfb388415e8d3d39e5a7b3844fa7bc299c64f725, the Favorites button's center at window coordinates (372, 28) lies inside the 40-pixel header and gets no native hover. Its lower edge at (372, 44) gets a highlight and tooltip. After rebuilding the renderer at 2360902acf3a0ed6aaed5d2cc346647dba374216, both points work, and clicking the center opens Favorites.
Verified in the real Linux desktop app on physical corex, Electron 44.10.1, using a private X11 display with Openbox and a 1000×620 window. Cua moved that display's native pointer; CDP was used for setup and DOM readback only. The normal GNOME Wayland session was unavailable to Cua window discovery. All app data is isolated test data.
Before: the native pointer is inside the header strip, with no highlight or tooltip.
After: the same point highlights Favorites and shows its tooltip.
Before recording, at 2× speed: upper center fails, lower edge works, upper center fails again.
https://github.com/user-attachments/assets/538a4ee9-fb9e-42a5-a303-8e4c1b2ac9ec
After recording, at 3× speed: upper center and lower edge both work, and a center click opens Favorites.
https://github.com/user-attachments/assets/83c3a44f-c386-417d-a739-56736ed08b3d
Validation at the head above:
vp run --filter @t3tools/web buildpassed.- Browser pass through T3's Browser panel: open the picker, hover Favorites, see the tooltip, select Favorites, and dismiss with Escape. The popup's computed app region is
no-drag. device-route apps/web/src/components/ui/popover.tsx --jsonadds the web client. The issue requires the Linux desktop app; both were exercised.fleet-job check 31794passed on Boat at2360902acf3a0ed6aaed5d2cc346647dba374216, job6muzy6i3esjw376e, exit 0: format, lint, both knip passes, affected typechecks, and React compiler coverage.- Independent Codex review found no issues. A second round was unnecessary.
- CI passed, including web tests, build, and typecheck.
fleet-job ui 31794passed at the same head. I inspected its root-page captures at desktop and phone widths; they match before and after. This was a rendering check; native pointer proof is in the recordings above.
Not shown: KDE Wayland, macOS, or Windows runtime behavior. Shared desktop code was verified on Linux.
Implemented by Claude Opus 5.5 through Claude Code. Reproduced and verified by GPT-6.1-Sol through Codex in T3 Code.
Checks
Added 1 commit
- fix(web): popovers over the window drag region respond to the pointer2360902
Approvability
Verdict: Approved at 2360902
Macroscope's review found this PR approvable — Popovers now opt out of Electron window dragging so they remain interactive over the desktop header. This follows the existing menu and dialog pattern and has limited UI-only impact.
No code changes detected at 20ee85c. Prior analysis still applies.
You can add or adjust custom eligibility rules. Learn more.
No actionable comments were generated in the recent review.
Walkthrough
-
PopoverPopupnow includes the[-webkit-app-region:no-drag]class. This change prevents Electron from treating the popup as a draggable region.Changes: Popover interaction
Layer / File(s) Summary Set popover popup to no-drag
apps/web/src/components/ui/popover.tsxPopoverPopupadds the[-webkit-app-region:no-drag]class.Estimated code review effort: 1 (Trivial) | ~5 minutes
Change: Bug fix · Severity of issue fixed: Medium
Possibly related issues
- pingdotgg/t3code#31551 — Both reports involve Electron drag-region hit testing intercepting pointer input, but this change does not address the hidden chat header regions.
Possibly related PRs
- pingdotgg/t3code#31813 — This PR adds the same no-drag class to
PopoverPopupto address pointer input over the desktop title bar.
Suggested reviewers:
maria-rcks
Merge Risk: External image Minimal · up to 20ee8
-
The popover change is ready to merge, with no actionable risk identified.
Pre-merge checks: Passed 4
-
Check name Status Explanation Title check Passed The title names the fix that the change makes: popovers over the desktop header now receive pointer events. The raw summary shows PopoverPopup gains a no-drag app-region style, which stops Electron fr… Description check Passed The description covers the problem, the change, scope and approval, and verification. The Problem section explains that the model picker loses hover feedback where it overlaps the desktop header. The … Linked Issues check Passed [ #31783] Requirement: restore hover feedback and the Favorites tooltip in the header-height strip where the model picker overlaps the desktop header. The whole-PR diff (base 23bdb9ef to head 20ee85ca)…Out of Scope Changes check Passed [ #31783] The whole-PR diff contains one code change: a two-line hunk inPopoverPopupin apps/web/src/components/ui/popover.tsx. It adds a comment and the[-webkit-app-region:no-drag]class. The ch…Full details: Title check
-
Explanation
The title names the fix that the change makes: popovers over the desktop header now receive pointer events. The raw summary shows PopoverPopup gains a no-drag app-region style, which stops Electron from treating the popup as a drag region. The title is specific and matches the main change. It follows the conventional commit format from the repository template.
Full details: Description check
-
Explanation
The description covers the problem, the change, scope and approval, and verification. The Problem section explains that the model picker loses hover feedback where it overlaps the desktop header. The Change section states the popover popup now uses no-drag. The Scope and approval section links issue
#31783and explains why the small-fix exception applies. The Verification section gives before and after pointer results, platform details, build and CI results, and lists what was not tested (KDE Wayland, macOS, Windows). Screenshots and recordings are embedded, as the template requires for UI changes. The description is complete and meets the template's requirements. It does not state a maintainer approval comment, but the author argues the small-fix exception applies, which the template allows.
Full details: Linked Issues check
-
Explanation
[
#31783] Requirement: restore hover feedback and the Favorites tooltip in the header-height strip where the model picker overlaps the desktop header. The whole-PR diff (base 23bdb9ef to head 20ee85ca) adds[-webkit-app-region:no-drag]to thePopoverPopupclass list in apps/web/src/components/ui/popover.tsx. This targets the diagnosed cause: Electron drag hit-testing over the popup.ProviderModelPicker.tsximportsPopoverPopupfrom../ui/popover, which matches the issue's diagnosis. The PR reports before and after native-pointer recordings in the Linux Electron desktop app (Electron 44.10.1, X11 with Openbox). The upper header point failed before and works after. The lower edge worked in both cases. A center click opens Favorites. Limits: the reported runtime checks name head 2360902a, not the current head 20ee85ca. The incremental diff between those heads could not be read, so the runtime evidence is not confirmed for the exact current head. The whole-PR diff shows the same single-line change the PR describes. KDE Wayland, the issue's reported environment, was not exercised. The issue does not require an automated regression test. The change is a CSS class with no added test, which is consistent with the issue scope.
Full details: Out of Scope Changes check
-
Explanation
[
#31783] The whole-PR diff contains one code change: a two-line hunk inPopoverPopupin apps/web/src/components/ui/popover.tsx. It adds a comment and the[-webkit-app-region:no-drag]class. The change connects directly to the linked issue, because the shared popover popup hosts the model picker. No unrelated files, refactors, or documentation changes appear in the whole-PR diff. The incremental diff from 2360902a to 20ee85ca could not be read, so changes between those heads are not checked by diff. The whole-PR diff at the current head contains no unrelated changes.
-
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
External image Recent review info
-
External image Run configuration
-
- Source mode: Auto
- Repository: pingdotgg/t3code
- Branch: issue-watch/31783
- File: .coderabbit.config.ts
- Commit: 20ee85c
- Layers: Repository TS config
- Review profile: CHILL
- Plan: Advanced
- Run ID:
2194d6e2-9695-406e-909b-a80f3840fd84
External image Commits
-
Reviewing files that changed from the base of the PR and between 2360902acf3a0ed6aaed5d2cc346647dba374216 and 20ee85ca6f92c42ad7dbcb4ef9c4c91ec230134b.
External image Files selected for processing: 1
-
apps/web/src/components/ui/popover.tsx
Included review availability: This review used your included allowance. Your plan provides up to 10 included reviews per hour; 9 remain after this review.
External image Recent review info
-
External image Run configuration
-
- Source mode: Auto
- Repository: pingdotgg/t3code
- Branch: issue-watch/31783
- File: .coderabbit.config.ts
- Commit: 20ee85c
- Layers: Repository TS config
- Review profile: CHILL
- Plan: Advanced
- Run ID:
2194d6e2-9695-406e-909b-a80f3840fd84
External image Commits
-
Reviewing files that changed from the base of the PR and between 2360902acf3a0ed6aaed5d2cc346647dba374216 and 20ee85ca6f92c42ad7dbcb4ef9c4c91ec230134b.
External image Files selected for processing: 1
-
apps/web/src/components/ui/popover.tsx
Included review availability: This review used your included allowance. Your plan provides up to 10 included reviews per hour; 9 remain after this review.
-
Worker16 separate nonauthor review for setup HL-SB-20261102; receiving task 6ae9048924888191ba619eb5249ca846, invocation b4ab9a30-8a55-4d65-9e58-73c92e9e92d7.
Reviewed the exact one-file PR delta at 2360902acf3a0ed6aaed5d2cc346647dba374216 against main at 3d78e915e3998eed664469486527b596af8f2f3e. The added [-webkit-app-region:no-drag] on the shared PopoverPopup matches the established MenuPopup/Dialog no-drag treatment and addresses the reported Electron titlebar drag-region hit-testing issue. I found no P1/P2 in the scoped source delta.
Normal PR CI #42160058111 checked out synthetic merge commit 026a819 (exact candidate plus target). Test Web passed 525 files / 5,577 tests; Test passed 35 files / 246 tests; Build and Typecheck, Lint, Aggregate Check, Agent Context Budget and Mobile Fingerprint Check succeeded. Mobile EAS Preview, Release Smoke, Rust and Mobile Native Static Analysis were skipped, not passed.
The PR supplies before/after screenshots and native-pointer recordings, plus author-reported Linux desktop verification on an isolated X11/Openbox session. The issue's original KDE Wayland environment, macOS and Windows were not manually exercised in the supplied evidence; I did not independently operate a packaged desktop or physical host. This is a source review of the exact CSS delta, not a claim of cross-platform live acceptance. Author retains branch custody; landing remains with the designated steward.
Added 1 commit
- Merge branch 'main' into issue-watch/3178320ee85c