fix: stop rubber-band bounce of the Control UI shell in the Mac app web view#99830
Conversation
The Control UI is an app shell: inner panes scroll, the root never should. macOS WKWebView (Mac app dashboard window) and desktop Safari still rubber-band the root scroller, so the whole UI bounced up and down whenever content fit the viewport. Apply overscroll-behavior: none to html/body globally instead of only in standalone PWA mode, and drop the now-redundant standalone-mode declaration.
|
Codex review: needs real behavior proof before merge. Reviewed July 4, 2026, 1:51 AM ET / 05:51 UTC. Summary PR surface: Source +3. Total +3 across 1 file. Reproducibility: yes. for the CSS root-scroller condition: current main leaves non-standalone Review metrics: 1 noteworthy metric.
Merge readiness Overall follows the weaker of proof and patch quality, so missing proof can cap an otherwise strong patch. Rank-up moves:
Proof guidance:
Mantis proof suggestion Risk before merge
Maintainer options:
Next step before merge
Security Review findings
Review detailsBest possible solution: Keep the root app-shell fix, but suppress only vertical root overscroll globally and add real non-standalone browser or Mac app proof showing the root no longer bounces while inner scrollers and horizontal navigation remain intact. Do we have a high-confidence way to reproduce the issue? Yes for the CSS root-scroller condition: current main leaves non-standalone Is this the best way to solve the issue? No as written. Moving the rule to the root is the right layer for the app shell, but the shorthand is broader than the vertical failure and should be narrowed to the y-axis. Full review comments:
Overall correctness: patch is incorrect AGENTS.md: found and applied where relevant. Codex review notes: model internal, reasoning high; reviewed against 1b84316a91dc. Label changesLabel changes:
Label justifications:
Evidence reviewedPR surface: Source +3. Total +3 across 1 file. View PR surface stats
What I checked:
Likely related people:
What the crustacean ranks mean
Shiny media proof means a screenshot, video, or linked artifact directly shows the changed behavior. Runtime, network, CSP, and security claims still need visible diagnostics. How this review workflow works
|
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: 9e5dca3b03
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
| /* App shell: inner panes scroll, the root never should. Without this the | ||
| macOS WKWebView (Mac app) and Safari rubber-band the whole window, even | ||
| when nothing overflows. */ | ||
| overscroll-behavior: none; |
There was a problem hiding this comment.
Limit root overscroll suppression to the Y axis
In regular browser contexts, this shorthand sets both overscroll-behavior-x and overscroll-behavior-y to none; MDN documents that the shorthand applies to both axes and that non-default root overscroll handling disables native browser navigation such as horizontal swipe history. The Control UI does use browser history for tab routes (pushState/popstate), so users who open it in Safari/Chrome/Edge/Firefox and navigate between tabs can lose trackpad/swipe back-forward gestures even though the bug being fixed is only vertical rubber-band bounce. Use a Y-only rule such as overscroll-behavior-y: none to preserve horizontal history navigation.
Useful? React with 👍 / 👎.
|
Landing note (process transparency): this went through
Per the gate's own baseline-noise protocol, documenting and landing on hosted evidence instead: all 52 CI checks are green on the exact head |
…eb view (openclaw#99830) The Control UI is an app shell: inner panes scroll, the root never should. macOS WKWebView (Mac app dashboard window) and desktop Safari still rubber-band the root scroller, so the whole UI bounced up and down whenever content fit the viewport. Apply overscroll-behavior: none to html/body globally instead of only in standalone PWA mode, and drop the now-redundant standalone-mode declaration.
What Problem This Solves
Opening the Control UI in the macOS app's dashboard window (a WKWebView) lets the whole page rubber-band vertically — even when the content fits the viewport with nothing to scroll. The entire shell shifts up and down on trackpad scroll, which feels broken for an app shell. Desktop Safari shows the same bounce.
Why This Change Was Made
The root scroller of the Control UI is never supposed to scroll — the shell is a fixed grid and inner panes (chat thread, lists) own scrolling.
overscroll-behavior: nonewas only applied in@media (display-mode: standalone)(installed PWA), so plain browser contexts — which is what WKWebView is — kept WebKit's default elastic bounce. The fix applies the rule tohtml, bodyglobally and removes the now-redundant standalone-mode declaration. Inner scrollers keep their native elasticity; only chaining/bouncing of the root is suppressed. Safari has supportedoverscroll-behaviorsince 16; the macOS app targets macOS 15 (Safari 18+ WebKit).User Impact
The Mac app's dashboard window (and the Control UI in any browser) no longer bounces the whole UI when there is nothing to scroll. Inner panes scroll exactly as before.
Evidence
Computed-style probe (Playwright + the repo's mock-gateway e2e harness, non-standalone context,
/chat):main(before):{"html":"auto","body":"auto","standaloneMediaMatches":false}— root bounces{"html":"none","body":"none","standaloneMediaMatches":false}— root bounce disabledDiff is CSS-only (+4/−1 in
ui/src/styles/base.css).