Frontmatter
| id | 9459 |
| title | Grid: Implement Reactive locked Config and Cell Pooling Bypass |
| state | Closed |
| labels | enhancementaigrid |
| assignees | tobiu |
| createdAt | Mar 13, 2026, 11:27 AM |
| updatedAt | Mar 16, 2026, 1:07 PM |
| githubUrl | https://github.com/neomjs/neo/issues/9459 |
| author | tobiu |
| commentsCount | 1 |
| parentIssue | 9456 |
| subIssues | [] |
| subIssuesCompleted | 0 |
| subIssuesTotal | 0 |
| blockedBy | [] |
| blocking | [] |
| closedAt | Mar 16, 2026, 1:07 PM |
Grid: Implement Reactive locked Config and Cell Pooling Bypass
tobiu added parent issue #9456 on Mar 13, 2026, 11:28 AM
tobiu assigned to @tobiu on Mar 13, 2026, 11:28 AM

tobiu
Mar 16, 2026, 1:02 PM
Input from Gemini 3.1 Pro:
✦ I have completed the implementation for this sub-task (#9459).
Implementation Details:
Cell Pooling Bypass (
src/grid/Row.mjs):
- Pass 1 (Pooled Cells): Updated to explicitly exclude columns where
lockedis truthy (!column.locked).- Pass 2 (Permanent Cells): Updated to include all
column.lockedcolumns regardless of theirhideMode. This physically guarantees the DOM nodes for locked columns are never destroyed or recycled when scrolling horizontally, enabling stable CSS transforms.- Removed the legacy
column.dockfallback logic sinceapplyRendererOutputnow dynamically adds the correct.neo-locked-startand.neo-locked-endclasses.Hardware-Accelerated Pinning SCSS:
- Added
.neo-locked-startand.neo-locked-endclasses toresources/scss/src/grid/Body.scssandresources/scss/src/grid/header/Button.scss.- Used
transform: translateX(var(...))tied to the CSS variables updated by the Main Thread Addon. This cleanly separates mathematical logical coordinates (left) managed by the VDOM from visual composite shifting (transform) managed by the browser compositor, completely avoiding layer explosions or hot main-thread layouts.- Applied
z-index: 5to the locked columns.Scrollbar Adjustment:
- Modified
resources/scss/src/grid/VerticalScrollbar.scssto usez-index: 10, ensuring the scrollbar always floats correctly above pinned columns at the end of the grid.
tobiu closed this issue on Mar 16, 2026, 1:07 PM
tobiu cross-referenced by #9456 on Mar 16, 2026, 1:25 PM
This is a sub-task of Epic #9456 (Buffered Grid - High-Performance Locked Columns).
Context: Locked columns must be excluded from standard virtualized Cell Pooling (
hideMode: 'removeDom'). If a locked column scrolls out of themountedColumnsviewport range, its pooled DOM node would typically be hijacked for a new incoming column, causing the locked column to disappear.Task:
dockconfig with a reactivelocked_: null('start' | 'end') configuration insrc/grid/column/Base.mjs.src/grid/Row.mjsrendering passes:lockedis truthy.lockedis truthy to render here. This guarantees the column remains in the DOM regardless of horizontal scroll state..neo-locked-startand.neo-locked-endto these cells..neo-locked-start { z-index: 5; transform: translateX(var(--grid-locked-start-offset, 0px)); } .neo-locked-end { z-index: 5; transform: translateX(var(--grid-locked-end-offset, 0px)); }VerticalScrollbar.scsstoz-index: 10so it floats aboveneo-locked-endcolumns.