Skip to content

fix(ui): stop vertical overscroll in standalone apps - #2248

Merged
4gray merged 2 commits into
masterfrom
codex/standalone-workspace-overscroll
Nov 14, 2026
Merged

4gray merged 2 commits into
masterfrom
codex/standalone-workspace-overscroll

Conversation

@4gray

@4gray 4gray commented Nov 14, 2026 •

Copy link
Copy Markdown
Owner

The dashboard can still bounce when dragged past its top or bottom in the installed app. This extends the vertical overscroll fix from #2227 to the workspace and its independent scrollers, including settings, sources, channel lists, catalogs, search, and the programme guide.

The rule applies in standalone PWA windows and the Android TV WebView. Browser tabs keep their existing behavior, and horizontal rails still pass vertical gestures to the page.

Validation

  • Installed PWA on an iPhone 17 Pro simulator: dragging past both dashboard edges kept the page in place. An Android emulator confirmed that the native WebView applies the rule. An emulated Android Chrome tab retained default overscroll.
  • The new dashboard regression failed before the fix and passed afterwards. The focused suite passed 17 checks across Chromium and WebKit, and the browser dashboard check also passed in Firefox.
  • The production PWA and Android APK builds passed, along with affected lint, 1,284 unit tests, and release-note validation.
  • Additional checks reproduced the known Firefox scrollbar assertion failures from fix(ui): stop vertical overscroll in standalone details #2227. The M3U URL editing scenario also failed when importing its mock playlist in Chromium and WebKit.

Startup bundle size

The nested scroll rules now load with the workspace route. The production build reproduces the CI measurement before the fix and passes the existing startup budget after it.

J1 startup counter Before After Limit
renderer.initialBytes 1,200,414 1,200,075 1,200,301

After the move, 16 targeted E2E checks and 396 workspace unit tests passed. The PWA and Android APK built successfully, and the Android emulator confirmed that the workspace still stops vertical overscroll.

Release note

  • Added a note under .changes/

@chatgpt-codex-connector

chatgpt-codex-connector Bot commented Nov 14, 2026 •

Copy link
Copy Markdown
Codex Review Summary: ✅ Completed

This comment shows the latest Codex review activity on this pull request.

Review Status Commit Review trigger
📝 Code Review ✅ Completed 2026-11-14T15:47:12.860441Z 0c0603a PR opened
ℹ️ 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" or "@codex security review".

Codex reacts with 👀 while any review is running, comments if it has suggestions, and reacts with 👍 once all reviews finish with no findings.

@codecov

codecov Bot commented Nov 14, 2026 •

Copy link
Copy Markdown

Bundle Report

Changes will increase total bundle size by 667 bytes (0.0%) ⬆️. This is within the configured threshold ✅

Detailed changes
Bundle name Size Change
iptvnator-renderer 17.41MB 667 bytes (0.0%) ⬆️

Affected Assets, Files, and Routes:

view changes for bundle: iptvnator-renderer

Assets Changed:

Asset Name Size Change Total Size Change (%)
chunk-1LALF9On.js (New) 2.65MB 2.65MB 100.0% 🚀
chunk-BQMNMwbV.js (New) 872.02kB 872.02kB 100.0% 🚀
chunk-CDieahjb.js (New) 350.69kB 350.69kB 100.0% 🚀
chunk-7eS6Tk8V.js (New) 325.62kB 325.62kB 100.0% 🚀
styles-O7ZH7F6J.css (New) 284.73kB 284.73kB 100.0% 🚀
main-K7VVBLGR.js (New) 276.12kB 276.12kB 100.0% 🚀
chunk-B0Qa7KHn.js (New) 222.48kB 222.48kB 100.0% 🚀
chunk-BvYjD82J.js (New) 209.44kB 209.44kB 100.0% 🚀
chunk-BnqJY6IM.js (New) 187.37kB 187.37kB 100.0% 🚀
chunk-D1A3Ft7h.js (New) 169.82kB 169.82kB 100.0% 🚀
chunk-Dlb4mNee.js (New) 166.59kB 166.59kB 100.0% 🚀
chunk-A-JZ-uIN.js (New) 159.95kB 159.95kB 100.0% 🚀
chunk-CFPgklhg.js (New) 149.78kB 149.78kB 100.0% 🚀
chunk-VSjgTtcX.js (New) 145.1kB 145.1kB 100.0% 🚀
chunk-DucPqamH.js (New) 124.14kB 124.14kB 100.0% 🚀
chunk-e6LjjlDs.js (New) 90.55kB 90.55kB 100.0% 🚀
chunk-CXEdoAK-.js (New) 70.14kB 70.14kB 100.0% 🚀
chunk-CxxHWMt5.js (New) 65.44kB 65.44kB 100.0% 🚀
chunk-BLepycvk.js (New) 59.83kB 59.83kB 100.0% 🚀
chunk-WIxNj3Gn.js (New) 55.97kB 55.97kB 100.0% 🚀
chunk-D8qaWXAI.js (New) 54.17kB 54.17kB 100.0% 🚀
chunk-BACzAli-.js (New) 52.45kB 52.45kB 100.0% 🚀
chunk-DoyIF342.js (New) 49.69kB 49.69kB 100.0% 🚀
chunk-B-JBWSdz.js (New) 46.26kB 46.26kB 100.0% 🚀
chunk-DkcYY9oZ.js (New) 43.12kB 43.12kB 100.0% 🚀
chunk-8wpNiiZ_.js (New) 40.18kB 40.18kB 100.0% 🚀
chunk-5n1qMlkR.js (New) 35.22kB 35.22kB 100.0% 🚀
chunk-A3acepSH.js (New) 34.73kB 34.73kB 100.0% 🚀
chunk-DkDW2z2p.js (New) 30.2kB 30.2kB 100.0% 🚀
chunk-D8f8iw_b.js (New) 30.11kB 30.11kB 100.0% 🚀
chunk-BlrXV8UQ.js (New) 26.8kB 26.8kB 100.0% 🚀
chunk-BpdB6myQ.js (New) 22.32kB 22.32kB 100.0% 🚀
chunk-DSA0WiVa.js (New) 21.5kB 21.5kB 100.0% 🚀
chunk-CiHSkEti.js (New) 19.91kB 19.91kB 100.0% 🚀
chunk-3BMLb9z_.js (New) 19.84kB 19.84kB 100.0% 🚀
chunk-CuL8q3B5.js (New) 18.05kB 18.05kB 100.0% 🚀
chunk-BO2JJBOi.js (New) 17.91kB 17.91kB 100.0% 🚀
chunk-CA8R19js.js (New) 16.86kB 16.86kB 100.0% 🚀
chunk-R5WTRrXB.js (New) 15.62kB 15.62kB 100.0% 🚀
chunk-DLXy-PpB.js (New) 15.4kB 15.4kB 100.0% 🚀
chunk-C41i-HM5.js (New) 13.29kB 13.29kB 100.0% 🚀
chunk-oTxOvZHs.js (New) 12.54kB 12.54kB 100.0% 🚀
chunk-DWZKeqwQ.js (New) 12.11kB 12.11kB 100.0% 🚀
chunk-J36q_cW8.js (New) 11.04kB 11.04kB 100.0% 🚀
chunk-nGW4T9IL.js (New) 10.63kB 10.63kB 100.0% 🚀
chunk-CvuNjaqk.js (New) 10.15kB 10.15kB 100.0% 🚀
chunk-DgHg7y7-.js (New) 9.49kB 9.49kB 100.0% 🚀
chunk-BtwsWzm-.js (New) 8.85kB 8.85kB 100.0% 🚀
chunk-CwSCb8nQ.js (New) 8.25kB 8.25kB 100.0% 🚀
chunk-B68ii0tj.js (New) 7.34kB 7.34kB 100.0% 🚀
chunk-DAEDjhmX.js (New) 5.67kB 5.67kB 100.0% 🚀
chunk-C8IUWt_g.js (New) 5.47kB 5.47kB 100.0% 🚀
chunk-BqN2FD8b.js (New) 5.15kB 5.15kB 100.0% 🚀
chunk-1BQ-Qu3S.js (New) 4.9kB 4.9kB 100.0% 🚀
chunk-CE0DXsv9.js (New) 4.72kB 4.72kB 100.0% 🚀
chunk-CqYngfOI.js (New) 4.45kB 4.45kB 100.0% 🚀
chunk-b--MGOa5.js (New) 4.44kB 4.44kB 100.0% 🚀
chunk-BxmgLo9H.js (New) 3.61kB 3.61kB 100.0% 🚀
chunk-LaQ_RLdz.js (New) 2.86kB 2.86kB 100.0% 🚀
chunk-BwE3lJM2.js (New) 2.83kB 2.83kB 100.0% 🚀
chunk-Czef8lZU.js (New) 2.8kB 2.8kB 100.0% 🚀
chunk-JWqLPx5U.js (New) 2.28kB 2.28kB 100.0% 🚀
chunk-63cv-qhM.js (New) 2.24kB 2.24kB 100.0% 🚀
chunk-2QAo7Gmg.js (New) 2.08kB 2.08kB 100.0% 🚀
chunk-DqPTuRcw.js (New) 2.02kB 2.02kB 100.0% 🚀
chunk-Bx5U7bKu.js (New) 1.81kB 1.81kB 100.0% 🚀
chunk-2jPJUxco.js (New) 1.8kB 1.8kB 100.0% 🚀
chunk-CZQC-ilJ.js (New) 1.73kB 1.73kB 100.0% 🚀
chunk-COTr4_aw.js (New) 1.71kB 1.71kB 100.0% 🚀
chunk-DwMFPMyw.js (New) 1.68kB 1.68kB 100.0% 🚀
chunk-IslXl1Uu.js (New) 1.68kB 1.68kB 100.0% 🚀
chunk-Dsy1Zr8-.js (New) 1.67kB 1.67kB 100.0% 🚀
chunk-BKpS7mRr.js (New) 1.67kB 1.67kB 100.0% 🚀
chunk-DzqreXAa.js (New) 1.54kB 1.54kB 100.0% 🚀
chunk-uNPfxcfv.js (New) 1.51kB 1.51kB 100.0% 🚀
chunk-mjh_Az4j.js (New) 1.51kB 1.51kB 100.0% 🚀
chunk-DK82IQpb.js (New) 1.5kB 1.5kB 100.0% 🚀
chunk-BTrEyBDg.js (New) 1.44kB 1.44kB 100.0% 🚀
chunk-CutVMZe_.js (New) 1.43kB 1.43kB 100.0% 🚀
chunk-5jYt-QDs.js (New) 1.37kB 1.37kB 100.0% 🚀
chunk-CTWrzmMo.js (New) 759 bytes 759 bytes 100.0% 🚀
chunk-CYQmyXpS.js (New) 759 bytes 759 bytes 100.0% 🚀
chunk-BSyYXiyo.js (New) 637 bytes 637 bytes 100.0% 🚀
chunk-DXXnMKsE.js (New) 588 bytes 588 bytes 100.0% 🚀
chunk-CG8jqwTj.js (New) 449 bytes 449 bytes 100.0% 🚀
chunk-BYkBch4e.js (New) 444 bytes 444 bytes 100.0% 🚀
chunk-C1ndm4SF.js (New) 443 bytes 443 bytes 100.0% 🚀
chunk-Cma13itd.js (New) 437 bytes 437 bytes 100.0% 🚀
chunk-D7T3hgi8.js (New) 437 bytes 437 bytes 100.0% 🚀
chunk-DCmNgqfv.js (New) 383 bytes 383 bytes 100.0% 🚀
chunk-1tg83C0d.js (New) 331 bytes 331 bytes 100.0% 🚀
chunk-DkbDRyS3.js (New) 284 bytes 284 bytes 100.0% 🚀
chunk-BFoPowRg.js (New) 242 bytes 242 bytes 100.0% 🚀
chunk-19hfrdbx.js (New) 239 bytes 239 bytes 100.0% 🚀
chunk-DkfJr6il.js (New) 230 bytes 230 bytes 100.0% 🚀
chunk-DpmI7UQn.js (New) 106 bytes 106 bytes 100.0% 🚀
chunk-CbqP4f3U.js (Deleted) -2.65MB 0 bytes -100.0% 🗑️
chunk-DQNbZ5Ij.js (Deleted) -872.1kB 0 bytes -100.0% 🗑️
chunk-DBGixX9j.js (Deleted) -350.69kB 0 bytes -100.0% 🗑️
chunk-qgmRCEUF.js (Deleted) -325.68kB 0 bytes -100.0% 🗑️
styles-CR3C5PBT.css (Deleted) -284.58kB 0 bytes -100.0% 🗑️
main-5HPKLNTW.js (Deleted) -276.12kB 0 bytes -100.0% 🗑️
chunk-glwGOv_P.js (Deleted) -221.9kB 0 bytes -100.0% 🗑️
chunk-Dr-LzrDi.js (Deleted) -209.44kB 0 bytes -100.0% 🗑️
chunk-DCdDv5wJ.js (Deleted) -187.3kB 0 bytes -100.0% 🗑️
chunk-Bvht38DB.js (Deleted) -169.82kB 0 bytes -100.0% 🗑️
chunk-BFKom-gc.js (Deleted) -166.59kB 0 bytes -100.0% 🗑️
chunk-DND0FVm4.js (Deleted) -159.95kB 0 bytes -100.0% 🗑️
chunk-CpqZqhag.js (Deleted) -149.78kB 0 bytes -100.0% 🗑️
chunk-B-i5zoN_.js (Deleted) -145.1kB 0 bytes -100.0% 🗑️
chunk-D-XoCCEC.js (Deleted) -124.14kB 0 bytes -100.0% 🗑️
chunk-CiRIKJ-l.js (Deleted) -90.55kB 0 bytes -100.0% 🗑️
chunk-ts_k-1z0.js (Deleted) -70.14kB 0 bytes -100.0% 🗑️
chunk-BQpp0t7i.js (Deleted) -65.44kB 0 bytes -100.0% 🗑️
chunk-5ziceBSd.js (Deleted) -59.83kB 0 bytes -100.0% 🗑️
chunk-DZDBpX4j.js (Deleted) -55.97kB 0 bytes -100.0% 🗑️
chunk-D2ivy5wj.js (Deleted) -54.17kB 0 bytes -100.0% 🗑️
chunk-eKojEG0R.js (Deleted) -52.45kB 0 bytes -100.0% 🗑️
chunk-DtgyDf_u.js (Deleted) -49.69kB 0 bytes -100.0% 🗑️
chunk-DAVxf2gv.js (Deleted) -46.26kB 0 bytes -100.0% 🗑️
chunk-LYW9PzBL.js (Deleted) -43.12kB 0 bytes -100.0% 🗑️
chunk-Q_gds0uF.js (Deleted) -40.17kB 0 bytes -100.0% 🗑️
chunk-DRnez2xd.js (Deleted) -35.22kB 0 bytes -100.0% 🗑️
chunk-CRuyqwxU.js (Deleted) -34.73kB 0 bytes -100.0% 🗑️
chunk-CC2o1xhe.js (Deleted) -30.2kB 0 bytes -100.0% 🗑️
chunk-Yd3J0JXX.js (Deleted) -30.11kB 0 bytes -100.0% 🗑️
chunk-BdlDB52U.js (Deleted) -26.8kB 0 bytes -100.0% 🗑️
chunk-0CO8cxK7.js (Deleted) -22.32kB 0 bytes -100.0% 🗑️
chunk-BKglwMBJ.js (Deleted) -21.5kB 0 bytes -100.0% 🗑️
chunk-DvZQS3Cp.js (Deleted) -19.91kB 0 bytes -100.0% 🗑️
chunk-B4Ur0-Qh.js (Deleted) -19.84kB 0 bytes -100.0% 🗑️
chunk-Bmiqms6c.js (Deleted) -18.05kB 0 bytes -100.0% 🗑️
chunk-CDOpOiXf.js (Deleted) -17.91kB 0 bytes -100.0% 🗑️
chunk-CaW7pv7f.js (Deleted) -16.86kB 0 bytes -100.0% 🗑️
chunk-aA9K46Is.js (Deleted) -15.62kB 0 bytes -100.0% 🗑️
chunk-BcuSnlpT.js (Deleted) -15.4kB 0 bytes -100.0% 🗑️
chunk-73Tpqg0d.js (Deleted) -13.29kB 0 bytes -100.0% 🗑️
chunk-CaX7ebbC.js (Deleted) -12.54kB 0 bytes -100.0% 🗑️
chunk-BQYTmkim.js (Deleted) -12.11kB 0 bytes -100.0% 🗑️
chunk--lW5kTe4.js (Deleted) -11.04kB 0 bytes -100.0% 🗑️
chunk-CoB9Tt-U.js (Deleted) -10.63kB 0 bytes -100.0% 🗑️
chunk-CchWNvnq.js (Deleted) -10.16kB 0 bytes -100.0% 🗑️
chunk-CVo4HHfT.js (Deleted) -9.49kB 0 bytes -100.0% 🗑️
chunk-CZfJ68V3.js (Deleted) -8.85kB 0 bytes -100.0% 🗑️
chunk-BHwVim9B.js (Deleted) -8.25kB 0 bytes -100.0% 🗑️
chunk-WCOoULeo.js (Deleted) -7.34kB 0 bytes -100.0% 🗑️
chunk-CyFhJrkD.js (Deleted) -5.67kB 0 bytes -100.0% 🗑️
chunk-lnn8OeNO.js (Deleted) -5.47kB 0 bytes -100.0% 🗑️
chunk-BFlF0Moq.js (Deleted) -5.15kB 0 bytes -100.0% 🗑️
chunk-D0t0Foie.js (Deleted) -4.9kB 0 bytes -100.0% 🗑️
chunk-BGYvhmJU.js (Deleted) -4.72kB 0 bytes -100.0% 🗑️
chunk-frDFPg5s.js (Deleted) -4.45kB 0 bytes -100.0% 🗑️
chunk-s8TOvq6_.js (Deleted) -4.44kB 0 bytes -100.0% 🗑️
chunk-C2gPqArV.js (Deleted) -3.61kB 0 bytes -100.0% 🗑️
chunk-CSRfRjXV.js (Deleted) -2.86kB 0 bytes -100.0% 🗑️
chunk-D3yQ9CGJ.js (Deleted) -2.83kB 0 bytes -100.0% 🗑️
chunk-C9YIlXeD.js (Deleted) -2.8kB 0 bytes -100.0% 🗑️
chunk-2uBv1yqu.js (Deleted) -2.28kB 0 bytes -100.0% 🗑️
chunk-BiQwU_5o.js (Deleted) -2.24kB 0 bytes -100.0% 🗑️
chunk-Dmaf1Yqf.js (Deleted) -2.08kB 0 bytes -100.0% 🗑️
chunk-ymn7ZZhJ.js (Deleted) -2.02kB 0 bytes -100.0% 🗑️
chunk-DDbCPVx7.js (Deleted) -1.81kB 0 bytes -100.0% 🗑️
chunk-DuB6QQZ6.js (Deleted) -1.8kB 0 bytes -100.0% 🗑️
chunk-C4ZMmDlk.js (Deleted) -1.73kB 0 bytes -100.0% 🗑️
chunk-GSjqdrXm.js (Deleted) -1.71kB 0 bytes -100.0% 🗑️
chunk-YGQmAxD6.js (Deleted) -1.68kB 0 bytes -100.0% 🗑️
chunk-Cs71969y.js (Deleted) -1.68kB 0 bytes -100.0% 🗑️
chunk-WieUUuP8.js (Deleted) -1.67kB 0 bytes -100.0% 🗑️
chunk-CYAdVj2V.js (Deleted) -1.67kB 0 bytes -100.0% 🗑️
chunk-DHMzjfDj.js (Deleted) -1.54kB 0 bytes -100.0% 🗑️
chunk-sA2N33-6.js (Deleted) -1.51kB 0 bytes -100.0% 🗑️
chunk-aMCLkTTB.js (Deleted) -1.51kB 0 bytes -100.0% 🗑️
chunk-BQSCX6e9.js (Deleted) -1.5kB 0 bytes -100.0% 🗑️
chunk-C1ck-5LO.js (Deleted) -1.44kB 0 bytes -100.0% 🗑️
chunk-CCUrhQTb.js (Deleted) -1.43kB 0 bytes -100.0% 🗑️
chunk-rEeyH3GR.js (Deleted) -1.37kB 0 bytes -100.0% 🗑️
chunk-BYjoy8YU.js (Deleted) -759 bytes 0 bytes -100.0% 🗑️
chunk-TiCdNCXM.js (Deleted) -759 bytes 0 bytes -100.0% 🗑️
chunk-B6g2ZdNR.js (Deleted) -637 bytes 0 bytes -100.0% 🗑️
chunk-Ckws6xtL.js (Deleted) -588 bytes 0 bytes -100.0% 🗑️
chunk-BafOST82.js (Deleted) -449 bytes 0 bytes -100.0% 🗑️
chunk-CZEfoyzh.js (Deleted) -444 bytes 0 bytes -100.0% 🗑️
chunk-CvlxP0A-.js (Deleted) -443 bytes 0 bytes -100.0% 🗑️
chunk-By4U4Ota.js (Deleted) -437 bytes 0 bytes -100.0% 🗑️
chunk-D5xzkEwu.js (Deleted) -437 bytes 0 bytes -100.0% 🗑️
chunk-Ca0VagtT.js (Deleted) -383 bytes 0 bytes -100.0% 🗑️
chunk-D0nzRWVh.js (Deleted) -331 bytes 0 bytes -100.0% 🗑️
chunk-DfsBPSIU.js (Deleted) -284 bytes 0 bytes -100.0% 🗑️
chunk-czhf8oba.js (Deleted) -242 bytes 0 bytes -100.0% 🗑️
chunk-CraSGbOI.js (Deleted) -239 bytes 0 bytes -100.0% 🗑️
chunk-i4S1UMeQ.js (Deleted) -230 bytes 0 bytes -100.0% 🗑️
chunk-BwWmp409.js (Deleted) -106 bytes 0 bytes -100.0% 🗑️

@greptile-apps

greptile-apps Bot commented Nov 14, 2026 •

Copy link
Copy Markdown
Contributor

RetriggerView in GreptileConfidence Score: 5/5

[Medium impact] This PR appears safe to merge.

Summary

This PR extends vertical overscroll prevention to standalone PWAs and the Android TV app.

  • Installed app pages stop bouncing when people drag past their edges.

No actionable issues were found. Tests were not run during this review.

Reviews (1) · Last reviewed commit: "fix(ui): stop vertical overscroll in sta..." · Reviewed by Greptile

@codecov

codecov Bot commented Nov 14, 2026 •

Copy link
Copy Markdown

Codecov Report

✅ All modified and coverable lines are covered by tests.
✅ Project coverage is 81.88%. Comparing base (06cb3fa) to head (0978c74).
⚠️ Report is 1 commits behind head on master.
✅ All tests successful. No failed tests found.

Additional details and impacted files
@@           Coverage Diff           @@
##           master    #2248   +/-   ##
=======================================
  Coverage   81.88%   81.88%           
=======================================
  Files        1904     1904           
  Lines      101617   101617           
  Branches    24850    24850           
=======================================
  Hits        83204    83204           
  Misses      11128    11128           
  Partials     7285     7285           
Flag Coverage Δ
unit 81.88% <ø> (ø)

Flags with carried forward coverage won't be shown. Click here to find out more.

☔ View full report in Codecov by Harness.
📢 Have feedback on the report? Share it here.

@4gray
4gray merged commit dd89c00 into master Nov 14, 2026
37 checks passed
@4gray
4gray deleted the codex/standalone-workspace-overscroll branch November 14, 2026 17:18
Sign up for free to 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