Frontmatter
| id | 9179 |
| title | DevIndex: Introduce StateProvider for animateVisuals |
| state | Closed |
| labels | bugairefactoring |
| assignees | [] |
| createdAt | Feb 16, 2026, 2:07 AM |
| updatedAt | Feb 16, 2026, 3:14 AM |
| githubUrl | https://github.com/neomjs/neo/issues/9179 |
| author | tobiu |
| commentsCount | 1 |
| parentIssue | null |
| subIssues | [] |
| subIssuesCompleted | 0 |
| subIssuesTotal | 0 |
| blockedBy | [] |
| blocking | [] |
| closedAt | Feb 16, 2026, 3:14 AM |
DevIndex: Introduce StateProvider for animateVisuals

tobiu
Feb 16, 2026, 3:13 AM
Input from Gemini 3 Pro:
✦ Refactoring complete.
Summary of Changes:
- State Provider: Introduced
DevIndex.view.ViewportStateProviderto manageanimateVisualsandisScrollingstate globally for the Viewport.- Decoupling: Removed imperative event listeners from
ViewportController, solving the regression where lazy-loaded components (Grid) were missed during initialization.- Bridge Pattern:
DevIndex.view.HeaderToolbarnow acts as a bridge, binding to the State Provider and declaratively updating theHeaderCanvasrenderer viaafterSethooks.- Grid Integration:
GridContainernow binds toanimateVisualsand pushesisScrollingstate to the provider, ensuring the header animation reacts to grid interactions regardless of component lifecycle.- State Logic: State mutations (
onShowAnimationsChangeandonGridIsScrollingChange) are centralized inMainContainerController.The architecture is now more robust, leveraging Neo.mjs State Providers for clean, persistent state management across lazy-loaded views.
tobiu closed this issue on Feb 16, 2026, 3:14 AM
To fix a regression where
animateVisualsstate is lost or listeners are not attached due to lazy loading of the Grid, we will introduce aNeo.state.Provider.apps/devindex/view/ViewportStateProvider.mjswithanimateVisuals: true.DevIndex.view.Viewport.GridContainer'sanimateVisualsconfig to the state provider:bind: {animateVisuals: data => data.animateVisuals}.MainContainerController(checkbox) to write to the state provider instead of the grid directly.ViewportControllerto listen to the state provider changes to update theHeaderCanvaspulse effect, removing the direct dependency on the Grid component.