LearnNewsExamplesServices
Frontmatter
id9369
title[Epic] Upgrade ScrollSync for Loop-Free Two-Way Binding (Mobile & Desktop)
stateClosed
labels
enhancementepicaiarchitecture
assigneestobiu
createdAtMar 7, 2026, 5:37 PM
updatedAtMar 7, 2026, 6:15 PM
githubUrlhttps://github.com/neomjs/neo/issues/9369
authortobiu
commentsCount0
parentIssuenull
subIssues
9370 Upgrade ScrollSync Locking Mechanism
9371 API for Programmatic Scrolling in ScrollSync
9372 Refactor GridDragScroll to use ScrollSync API
9373 Enable Mobile Two-Way ScrollSync for Grid VerticalScrollbar
9374 Mobile UX Enhancements for Grid VerticalScrollbar (SCSS)
9375 Improve ScrollSync Lock Release Mechanism (rAF vs setTimeout)
9376 Add .neo-has-touch capability class and enhance Mobile Grid Scrollbar
9377 Define `--grid-scrollbar-touch-width` variable across all themes
9378 Extract desktop grid scrollbar width into a CSS variable
9379 Mobile Scrollbar UX: Increase touch width to 40px and theme thumb colors
subIssuesCompleted10
subIssuesTotal10
blockedBy[]
blocking[]
closedAtMar 7, 2026, 6:15 PM

[Epic] Upgrade ScrollSync for Loop-Free Two-Way Binding (Mobile & Desktop)

Closed v12.1.0 enhancementepicaiarchitecture
tobiu
tobiu commented on Mar 7, 2026, 5:37 PM

The current ScrollSync.mjs architecture relies on blind native scroll event listeners. To prevent infinite "ping-pong" feedback loops, it explicitly disables two-way synchronization on touch devices (twoWay: Neo.config.hasMouseEvents). This breaks the UX on mobile for virtualized components (like Grids with custom scrollbars), preventing users from grabbing and scrubbing the scrollbar. Furthermore, it conflicts with programmatic scrolling addons like GridDragScroll which continuously mutate the DOM during momentum animations.

This epic proposes upgrading ScrollSync to act as a stateful coordinator. By implementing an internal locking mechanism (isCoordinating), it can safely apply bidirectional scroll updates across multiple nodes and programmatic sources without triggering native event feedback loops.

tobiu added the enhancement label on Mar 7, 2026, 5:37 PM
tobiu added the epic label on Mar 7, 2026, 5:37 PM
tobiu added the ai label on Mar 7, 2026, 5:37 PM
tobiu added the architecture label on Mar 7, 2026, 5:37 PM
tobiu cross-referenced by #9370 on Mar 7, 2026, 5:38 PM
tobiu added sub-issue #9370 on Mar 7, 2026, 5:38 PM
tobiu cross-referenced by #9371 on Mar 7, 2026, 5:39 PM
tobiu added sub-issue #9371 on Mar 7, 2026, 5:39 PM
tobiu cross-referenced by #9372 on Mar 7, 2026, 5:39 PM
tobiu added sub-issue #9372 on Mar 7, 2026, 5:39 PM
tobiu cross-referenced by #9373 on Mar 7, 2026, 5:39 PM
tobiu added sub-issue #9373 on Mar 7, 2026, 5:39 PM
tobiu cross-referenced by #9374 on Mar 7, 2026, 5:39 PM
tobiu added sub-issue #9374 on Mar 7, 2026, 5:39 PM
tobiu cross-referenced by #9375 on Mar 7, 2026, 5:54 PM
tobiu added sub-issue #9375 on Mar 7, 2026, 5:54 PM
tobiu assigned to @tobiu on Mar 7, 2026, 5:54 PM
tobiu cross-referenced by #9376 on Mar 7, 2026, 6:10 PM
tobiu added sub-issue #9376 on Mar 7, 2026, 6:10 PM
tobiu closed this issue on Mar 7, 2026, 6:15 PM
tobiu cross-referenced by #9377 on Mar 7, 2026, 6:19 PM
tobiu added sub-issue #9377 on Mar 7, 2026, 6:19 PM
tobiu cross-referenced by #9378 on Mar 7, 2026, 6:26 PM
tobiu added sub-issue #9378 on Mar 7, 2026, 6:26 PM
tobiu cross-referenced by #9379 on Mar 7, 2026, 6:56 PM
tobiu added sub-issue #9379 on Mar 7, 2026, 6:57 PM
tobiu cross-referenced by #9380 on Mar 7, 2026, 7:25 PM