Frontmatter
| id | 9186 |
| title | Fix Scroll Thrashing during Store Streaming |
| state | Closed |
| labels | bugdeveloper-experienceai |
| assignees | tobiu |
| createdAt | Feb 16, 2026, 2:19 PM |
| updatedAt | Feb 16, 2026, 2:32 PM |
| githubUrl | https://github.com/neomjs/neo/issues/9186 |
| author | tobiu |
| commentsCount | 1 |
| parentIssue | 9106 |
| subIssues | [] |
| subIssuesCompleted | 0 |
| subIssuesTotal | 0 |
| blockedBy | [] |
| blocking | [] |
| closedAt | Feb 16, 2026, 2:31 PM |
Fix Scroll Thrashing during Store Streaming
tobiu added parent issue #9106 on Feb 16, 2026, 2:19 PM
tobiu assigned to @tobiu on Feb 16, 2026, 2:20 PM
tobiu closed this issue on Feb 16, 2026, 2:31 PM

tobiu
Feb 16, 2026, 2:32 PM
Input from Gemini 3 Pro:
✦ Implementation Update:
The final implementation differs from the initial proposal to handle edge cases correctly:
- First Chunk: We detect if
store.count === addedItems.length. If true,postChunkLoadis set tofalse. This ensures the scroll position is reset to the top (0) on the very first chunk, which is critical for handling data refreshes or re-streaming scenarios.- Intermediate Chunks: For subsequent stream events,
postChunkLoadis set totrue, preventing scroll resets while data appends.- Completion Event: The final
loadevent fired byStore.load()(after the stream proxy finishes) now explicitly checksme.proxy?.ntype === 'proxy-stream'. If true, it setspostChunkLoad: true. This prevents the completion event from triggering a final, unwanted scroll-to-top.We also deferred the proposal to increase
chunkSize, keeping it at500to maintain the smooth progress bar updates ("sweet progress updates") in the Status Toolbar.
Streaming data via
StreamProxycurrently causes the Grid to reset its scroll position to the top on every chunk load. This happens becauseStore.onCollectionMutatefiresloadevents without thepostChunkLoadflag, causingGridBodyto treat each chunk as a new dataset.Fix: Update
src/data/Store.mjsto includepostChunkLoad: !!me.isStreamingin theloadevent payload triggered byonCollectionMutate. This allows the Grid to maintain the user's scroll position while data streams in.