stage batch #4584+#4583 (rodboev): scroll re-pin read-position fix + mobile horizontal-pan fix (#4668)

#4584 (fixes #4295): scroll re-pin requires deliberate downward intent (deltaY<-30 unpin
threshold, re-pin only if not user-unpinned OR bottomDistance<=80, reset counter) so reading
mid-stream isn't hijacked back to bottom. ui.js only + 5 scroll-regression tests (4 existing
assertions adjusted, all green; new test_issue4295_scroll_pin_reentry).
#4583 (fixes #4553): mobile transcript overflow-x:hidden + max-width:100% + word-break so wide
content can't pan sideways. style.css only + own test. Disjoint files. 32 scroll-family tests pass.

Co-authored-by: nesquena-hermes <agent@nesquena-hermes>
Co-authored-by: rodboev <rodboev@users.noreply.github.com>
This commit is contained in:
authored and GitHub committed 2026-06-21 23:15:47 -07:00
1 parent 74d7732778
commit fc3d6b68e6
9 files changed
+234 -14

No files matched your search

+2 -2
View File
@@ -106,7 +106,7 @@ def test_wheel_touch_upward_intent_unpins_immediately_inside_messages():
fn_end = UI_JS.index("function _recentNonMessageScrollIntent", fn_start)
fn = UI_JS[fn_start:fn_end]
assert "_messageUserUnpinned=true" in fn.replace(" ", "")
assert "e.deltaY<0" in fn and "e.type==='touchmove'" in fn
assert "e.deltaY< -30" in fn and "e.type==='touchmove'" in fn
def test_downward_path_preserves_macos_momentum_hysteresis():
@@ -126,7 +126,7 @@ def test_repin_threshold_is_still_250px():
stay. Direction detection is the new lever, not threshold relaxation.
"""
block = _scroll_listener_block()
assert "clientHeight<250" in block, (
assert "clientHeight<250" in block or "bottomDistance<250" in block, (
"The 250px re-pin dead zone must remain — #1360 / #677 require it "
"for macOS small-window + trackpad momentum cases. The #1731 fix "
"uses direction detection, not threshold changes."