Frontmatter
| id | 9407 |
| title | Create `Neo.grid.column.Tree` & Cell Component |
| state | Closed |
| labels | enhancementdesignaigrid |
| assignees | tobiu |
| createdAt | Mar 9, 2026, 11:52 AM |
| updatedAt | Mar 9, 2026, 5:20 PM |
| githubUrl | https://github.com/neomjs/neo/issues/9407 |
| author | tobiu |
| commentsCount | 2 |
| parentIssue | 9404 |
| subIssues | [] |
| subIssuesCompleted | 0 |
| subIssuesTotal | 0 |
| blockedBy | [] |
| blocking | [] |
| closedAt | Mar 9, 2026, 5:20 PM |
Create Neo.grid.column.Tree & Cell Component

Input from Gemini 3.1 Pro:
✦ Implementation Guidance for Agents:
When implementing the styling for this component, you MUST adhere to the Neo.mjs split styling architecture:
Structural Layout (
resources/scss/src/grid/column/tree/Component.scss):
- This file should ONLY contain layout rules (Flexbox alignment, margins).
- Use a CSS
calc()with a variable for indentation:width: calc(var(--tree-depth, 0) * var(--tree-indent, 16px));Theme Variables (
resources/scss/theme-*/grid/column/tree/Component.scss):
- You must create this file for ALL 5 themes (
theme-neo-dark,theme-neo-light,theme-neo-light-rich,theme-neo-dark-rich,theme-epona).- Define the actual CSS variables (e.g.,
--tree-indent) here.- Define the visual icons using
::beforepseudo-elements and thecontentproperty mapped to FontAwesome unicode values (e.g.,content: '\f054'for collapsed,\f078for expanded).Important Files to Reference:
- Look at
src/grid/column/Component.mjsto understand how the cell recycling works viaafterSetRecord.- Look at
resources/scss/theme-neo-dark/grid/column/IconLink.scssfor an example of how to scope theme-specific column styling.

Input from Gemini 3.1 Pro:
✦ I have implemented
Neo.grid.column.TreeandNeo.grid.column.component.Tree. The cell component handles visual state updating (indents viadepth_, CSS icons viaisLeaf_&expanded_). Click events on the toggle delegate back to the gridContainer, which subsequently triggersstore.expand()andstore.collapse(), as well as explicitexpand/collapseevents emitted on the grid itself.I've also used
NeoArray.remove(cls, ['is-expanded', 'is-collapsed', 'is-leaf'])as suggested! Closing this issue as complete.
Goal
Implement the specialized column renderer for Tree Grids, using a nested component architecture to handle indentation, toggle states, and event emission without breaking Row Pooling.
Details
src/grid/column/Tree.mjs:Neo.grid.column.Component.Neo.grid.column.tree.Component.expand(record)andcollapse(record)proxy methods to forward the interaction to theTreeStore.src/grid/column/tree/Component.mjs:Neo.component.Base.recordchanges (during scroll recycling) to update its internaldepth,expanded, andisLeafstates.SCSS Implementation (src + 5 themes):
src/.../Component.scss: Structural flex layout and CSS calc() for indentation.theme-*/.../Component.scss: Define FontAwesome icons for expanded/collapsed states using::beforepseudo-elements.Interaction & Events:
TreeStore.TreeStore(or the column itself) must fireexpandandcollapseevents.grid.Containerso developers can easily listen to them in their View Controllers (e.g.,onNodeExpand,onNodeCollapse).