Frontmatter
| id | 8983 |
| title | Fix Grid Scrollbar Position and DragScroll ID Mismatch |
| state | Closed |
| labels | bug |
| assignees | tobiu |
| createdAt | Feb 4, 2026, 1:20 PM |
| updatedAt | Feb 4, 2026, 1:54 PM |
| githubUrl | https://github.com/neomjs/neo/issues/8983 |
| author | tobiu |
| commentsCount | 2 |
| parentIssue | null |
| subIssues | [] |
| subIssuesCompleted | 0 |
| subIssuesTotal | 0 |
| blockedBy | [] |
| blocking | [] |
| closedAt | Feb 4, 2026, 1:54 PM |
Fix Grid Scrollbar Position and DragScroll ID Mismatch

tobiu
Feb 4, 2026, 1:53 PM
Input from Gemini 3 Pro:
✦ I have resolved this issue.
Changes:
- Reverted SCSS: Changed
resources/scss/src/grid/Container.scssback tooverflow-y: hidden. This restores the correct scrolling behavior where the inner container scrolls while the wrapper (and the pinned scrollbar) remains static.- Fixed Focus Logic: Updated
src/grid/Body.mjsto usethis.focus(this.vdom.id, false, true)inonRowClick. Thetrueargument enablespreventScroll, ensuring that focusing a row doesn't trigger unwanted browser scrolling behavior, which was the original reason for tryingoverflow-y: clip.- Note on DragScroll: No changes were made to
ScrollManager.mjsorGridDragScroll.mjs. The regression in drag scrolling was a side effect of the broken overflow behavior. Restoring the correct CSS fixed both issues.I have pushed the changes to the feature branch.
tobiu assigned to @tobiu on Feb 4, 2026, 1:53 PM
tobiu closed this issue on Feb 4, 2026, 1:54 PM

tobiu
Feb 4, 2026, 1:54 PM
relates to #8981
Problem:
ScrollManagerpasses the Component ID (id) instead of the rendered DOM ID (id__wrapper) to theGridDragScrolladdon.Fix:
overflow-y: hidden: We changedresources/scss/src/grid/Container.scssfromoverflow-y: clipback tooverflow-y: hiddenon the inner.neo-grid-container.clipforces the parent wrapper (which hasoverflow-x: auto) to handle the scrolling. Since the vertical scrollbar is an absolute child of that wrapper, it scrolls away with the content.hiddencreates a new Block Formatting Context (BFC) / Scroll Container on the inner element, trapping the wide content inside. This means the inner element scrolls, while the wrapper (and the scrollbar pinned to it) stays static.clipwas to prevent the browser from scrolling the grid body into view when focused (which sometimes pushed headers out). We solved this properly insrc/grid/Body.mjsby passing{preventScroll: true}to thefocus()method inonRowClick.