{"version":3,"file":"acorex-components-tree-view.mjs","sources":["../../../../packages/components/tree-view/src/lib/tree-view.service.ts","../../../../packages/components/tree-view/src/lib/tree-view.component.ts","../../../../packages/components/tree-view/src/lib/tree-view.component.html","../../../../packages/components/tree-view/src/lib/tree-view.module.ts","../../../../packages/components/tree-view/src/acorex-components-tree-view.ts"],"sourcesContent":["import { Injectable } from '@angular/core';\nimport { AXTreeViewChildrenSelectionState, AXTreeViewFlatNode, AXTreeViewNode } from './tree-view.types';\n\n/**\n * Service for tree node operations\n * Handles all business logic for tree node manipulation\n */\n@Injectable()\nexport class AXTreeViewService {\n  // ==================== Constants ====================\n  private static readonly ROOT_LIST_ID = 'ax-tree-view-root-list';\n  private static readonly NODE_DROP_PREFIX = 'ax-tree-view-node-drop-';\n  private static readonly LIST_PREFIX = 'ax-tree-view-list-';\n\n  // ==================== Node Finding & Traversal ====================\n  /**\n   * Find a node by ID in the tree\n   */\n  findNodeById(nodes: AXTreeViewNode[], id: string, idField = 'id', childrenField = 'children'): AXTreeViewNode | null {\n    for (const node of nodes) {\n      if ((node[idField] as string) === id) return node;\n      const children = node[childrenField] as AXTreeViewNode[] | undefined;\n      if (children) {\n        const found = this.findNodeById(children, id, idField, childrenField);\n        if (found) return found;\n      }\n    }\n    return null;\n  }\n\n  /**\n   * Find parent node of a given node\n   */\n  findParentNode(\n    nodes: AXTreeViewNode[],\n    targetNode: AXTreeViewNode,\n    idField = 'id',\n    childrenField = 'children',\n  ): AXTreeViewNode | undefined {\n    const targetId = targetNode[idField] as string;\n    for (const node of nodes) {\n      const children = node[childrenField] as AXTreeViewNode[] | undefined;\n      if (children?.some((child) => (child[idField] as string) === targetId)) {\n        return node;\n      }\n      if (children) {\n        const found = this.findParentNode(children, targetNode, idField, childrenField);\n        if (found) return found;\n      }\n    }\n    return undefined;\n  }\n\n  /**\n   * Check if targetNode is a descendant of ancestorNode (or the same node)\n   * Prevents circular references by checking if target exists in ancestor's children tree\n   */\n  isValidDropTarget(\n    movedNode: AXTreeViewNode,\n    targetNode: AXTreeViewNode,\n    idField = 'id',\n    childrenField = 'children',\n  ): boolean {\n    const movedId = movedNode[idField] as string;\n    const targetId = targetNode[idField] as string;\n    if (movedId === targetId || this.isNodeDescendantOf(targetNode, movedNode, idField, childrenField)) {\n      return false;\n    }\n    return true;\n  }\n\n  /**\n   * Check if targetNode is a descendant of ancestorNode\n   */\n  private isNodeDescendantOf(\n    targetNode: AXTreeViewNode,\n    ancestorNode: AXTreeViewNode,\n    idField = 'id',\n    childrenField = 'children',\n  ): boolean {\n    const targetId = targetNode[idField] as string;\n    const ancestorId = ancestorNode[idField] as string;\n    if (targetId === ancestorId) {\n      return true;\n    }\n\n    const children = ancestorNode[childrenField] as AXTreeViewNode[] | undefined;\n    if (!children || children.length === 0) {\n      return false;\n    }\n\n    for (const child of children) {\n      const childId = child[idField] as string;\n      if (childId === targetId) {\n        return true;\n      }\n      if (this.isNodeDescendantOf(targetNode, child, idField, childrenField)) {\n        return true;\n      }\n    }\n\n    return false;\n  }\n\n  /**\n   * Build a flat list of all visible focusable nodes\n   */\n  buildFlatNodeList(\n    nodes: AXTreeViewNode[],\n    hiddenField = 'hidden',\n    disabledField = 'disabled',\n    expandedField = 'expanded',\n    childrenField = 'children',\n  ): AXTreeViewFlatNode[] {\n    const flatList: AXTreeViewFlatNode[] = [];\n    const traverse = (nodeList: AXTreeViewNode[], level: number, parent?: AXTreeViewNode): void => {\n      for (const node of nodeList) {\n        const hidden = node[hiddenField] as boolean | undefined;\n        const disabled = node[disabledField] as boolean | undefined;\n        if (hidden !== true && !disabled) {\n          flatList.push({ node, level, parent });\n          const expanded = node[expandedField] as boolean | undefined;\n          const children = node[childrenField] as AXTreeViewNode[] | undefined;\n          if (expanded && children) {\n            traverse(children, level + 1, node);\n          }\n        }\n      }\n    };\n    traverse(nodes, 0);\n    return flatList;\n  }\n\n  // ==================== Node State Checks ====================\n  /**\n   * Check if node has children\n   */\n  hasChildren(node: AXTreeViewNode, childrenField = 'children'): boolean {\n    const children = node[childrenField] as AXTreeViewNode[] | undefined;\n    return Boolean(children?.length);\n  }\n\n  /**\n   * Check if node can be lazy loaded\n   */\n  canLazyLoad(\n    node: AXTreeViewNode,\n    isLazyDataSource: boolean,\n    childrenCountField = 'childrenCount',\n    childrenField = 'children',\n  ): boolean {\n    const childrenCount = node[childrenCountField] as number | undefined;\n    return isLazyDataSource && Boolean(childrenCount && childrenCount > 0 && !this.hasChildren(node, childrenField));\n  }\n\n  // ==================== Selection Management ====================\n  /**\n   * Recursively select/deselect all children\n   */\n  selectAllChildren(\n    children: AXTreeViewNode[],\n    selected: boolean,\n    selectedField = 'selected',\n    indeterminateField = 'indeterminate',\n    childrenField = 'children',\n  ): void {\n    for (const child of children) {\n      child[selectedField] = selected;\n      child[indeterminateField] = false;\n      const childChildren = child[childrenField] as AXTreeViewNode[] | undefined;\n      if (childChildren) {\n        this.selectAllChildren(childChildren, selected, selectedField, indeterminateField, childrenField);\n      }\n    }\n  }\n\n  /**\n   * Get selection state of children\n   */\n  getChildrenSelectionState(\n    children: AXTreeViewNode[],\n    selectedField = 'selected',\n    indeterminateField = 'indeterminate',\n  ): AXTreeViewChildrenSelectionState {\n    let selectedCount = 0;\n    let indeterminateCount = 0;\n\n    for (const child of children) {\n      const selected = child[selectedField] as boolean | undefined;\n      const indeterminate = child[indeterminateField] as boolean | undefined;\n      if (selected && !indeterminate) {\n        selectedCount++;\n      }\n      if (indeterminate) {\n        indeterminateCount++;\n      }\n    }\n\n    return {\n      allSelected: selectedCount === children.length,\n      someSelected: selectedCount > 0 || indeterminateCount > 0,\n    };\n  }\n\n  /**\n   * Update parent node states based on children selection (with intermediate state support)\n   */\n  updateParentStates(\n    nodes: AXTreeViewNode[],\n    changedNode: AXTreeViewNode,\n    intermediateState: boolean,\n    idField = 'id',\n    childrenField = 'children',\n    selectedField = 'selected',\n    indeterminateField = 'indeterminate',\n  ): void {\n    const parent = this.findParentNode(nodes, changedNode, idField, childrenField);\n    const parentChildren = parent?.[childrenField] as AXTreeViewNode[] | undefined;\n    if (!parent || !parentChildren) return;\n\n    const { allSelected, someSelected } = this.getChildrenSelectionState(\n      parentChildren,\n      selectedField,\n      indeterminateField,\n    );\n\n    if (allSelected) {\n      parent[selectedField] = true;\n      parent[indeterminateField] = false;\n    } else if (someSelected) {\n      if (intermediateState) {\n        parent[selectedField] = true;\n        parent[indeterminateField] = true;\n      } else {\n        parent[selectedField] = false;\n        parent[indeterminateField] = false;\n      }\n    } else {\n      parent[selectedField] = false;\n      parent[indeterminateField] = false;\n    }\n\n    this.updateParentStates(\n      nodes,\n      parent,\n      intermediateState,\n      idField,\n      childrenField,\n      selectedField,\n      indeterminateField,\n    );\n  }\n\n  /**\n   * Recursively deselect all nodes\n   */\n  deselectAllNodes(\n    nodes: AXTreeViewNode[],\n    selectedField = 'selected',\n    indeterminateField = 'indeterminate',\n    childrenField = 'children',\n  ): void {\n    for (const node of nodes) {\n      node[selectedField] = false;\n      node[indeterminateField] = false;\n      const children = node[childrenField] as AXTreeViewNode[] | undefined;\n      if (children) {\n        this.deselectAllNodes(children, selectedField, indeterminateField, childrenField);\n      }\n    }\n  }\n\n  /**\n   * Recursively set selection state for all nodes\n   */\n  setAllSelection(\n    nodes: AXTreeViewNode[],\n    selected: boolean,\n    selectedField = 'selected',\n    indeterminateField = 'indeterminate',\n    childrenField = 'children',\n  ): void {\n    for (const node of nodes) {\n      node[selectedField] = selected;\n      node[indeterminateField] = false;\n      const children = node[childrenField] as AXTreeViewNode[] | undefined;\n      if (children) {\n        this.setAllSelection(children, selected, selectedField, indeterminateField, childrenField);\n      }\n    }\n  }\n\n  /**\n   * Recursively count selected nodes\n   */\n  countSelected(nodes: AXTreeViewNode[], selectedField = 'selected', childrenField = 'children'): number {\n    let count = 0;\n    for (const node of nodes) {\n      if (node[selectedField] as boolean) count++;\n      const children = node[childrenField] as AXTreeViewNode[] | undefined;\n      if (children) {\n        count += this.countSelected(children, selectedField, childrenField);\n      }\n    }\n    return count;\n  }\n\n  /**\n   * Recursively collect selected nodes\n   */\n  collectSelected(\n    nodes: AXTreeViewNode[],\n    result: AXTreeViewNode[],\n    selectedField = 'selected',\n    childrenField = 'children',\n  ): void {\n    for (const node of nodes) {\n      if (node[selectedField] as boolean) result.push(node);\n      const children = node[childrenField] as AXTreeViewNode[] | undefined;\n      if (children) {\n        this.collectSelected(children, result, selectedField, childrenField);\n      }\n    }\n  }\n\n  /**\n   * Recursively remove selected nodes\n   */\n  removeSelected(\n    nodes: AXTreeViewNode[],\n    selectedField = 'selected',\n    indeterminateField = 'indeterminate',\n    childrenField = 'children',\n  ): void {\n    for (let i = nodes.length - 1; i >= 0; i--) {\n      const node = nodes[i];\n      const selected = node[selectedField] as boolean | undefined;\n      const indeterminate = node[indeterminateField] as boolean | undefined;\n      if (selected && !indeterminate) {\n        nodes.splice(i, 1);\n      } else {\n        const children = node[childrenField] as AXTreeViewNode[] | undefined;\n        if (children) {\n          this.removeSelected(children, selectedField, indeterminateField, childrenField);\n        }\n      }\n    }\n  }\n\n  /**\n   * Recursively update all parent states in the tree (used after deletion)\n   */\n  updateAllParentStates(\n    nodes: AXTreeViewNode[],\n    intermediateState: boolean,\n    childrenField = 'children',\n    selectedField = 'selected',\n    indeterminateField = 'indeterminate',\n  ): void {\n    for (const node of nodes) {\n      const children = node[childrenField] as AXTreeViewNode[] | undefined;\n      if (children && children.length > 0) {\n        this.updateAllParentStates(children, intermediateState, childrenField, selectedField, indeterminateField);\n\n        const { allSelected, someSelected } = this.getChildrenSelectionState(\n          children,\n          selectedField,\n          indeterminateField,\n        );\n\n        if (allSelected) {\n          node[selectedField] = true;\n          node[indeterminateField] = false;\n        } else if (someSelected) {\n          if (intermediateState) {\n            node[selectedField] = true;\n            node[indeterminateField] = true;\n          } else {\n            node[selectedField] = false;\n            node[indeterminateField] = false;\n          }\n        } else {\n          node[selectedField] = false;\n          node[indeterminateField] = false;\n        }\n      }\n    }\n  }\n\n  // ==================== Expansion Management ====================\n  /**\n   * Recursively set expanded state (with lazy loading)\n   */\n  async setExpandedState(\n    nodes: AXTreeViewNode[],\n    expanded: boolean,\n    isLazyDataSource: boolean,\n    loadNodeChildren: (node: AXTreeViewNode) => Promise<void>,\n    expandedField = 'expanded',\n    childrenField = 'children',\n    childrenCountField = 'childrenCount',\n  ): Promise<void> {\n    for (const node of nodes) {\n      const hasChildren = this.hasChildren(node, childrenField);\n      const canLazyLoad = this.canLazyLoad(node, isLazyDataSource, childrenCountField, childrenField);\n\n      if (hasChildren || canLazyLoad) {\n        if (expanded && canLazyLoad) {\n          await loadNodeChildren(node);\n        }\n        node[expandedField] = expanded;\n        const children = node[childrenField] as AXTreeViewNode[] | undefined;\n        if (children) {\n          await this.setExpandedState(\n            children,\n            expanded,\n            isLazyDataSource,\n            loadNodeChildren,\n            expandedField,\n            childrenField,\n            childrenCountField,\n          );\n        }\n      }\n    }\n  }\n\n  // ==================== Drag & Drop Helpers ====================\n  /**\n   * Get array reference by drop list ID\n   */\n  getArrayByListId(\n    nodes: AXTreeViewNode[],\n    listId: string,\n    idField = 'id',\n    childrenField = 'children',\n  ): AXTreeViewNode[] | null {\n    if (listId === AXTreeViewService.ROOT_LIST_ID) {\n      return nodes;\n    }\n\n    if (listId.startsWith(AXTreeViewService.NODE_DROP_PREFIX)) {\n      const nodeId = listId.replace(AXTreeViewService.NODE_DROP_PREFIX, '');\n      const node = this.findNodeById(nodes, nodeId, idField, childrenField);\n      return node ? [node] : null;\n    }\n\n    const nodeId = listId.replace(AXTreeViewService.LIST_PREFIX, '');\n    const node = this.findNodeById(nodes, nodeId, idField, childrenField);\n    const children = node?.[childrenField] as AXTreeViewNode[] | undefined;\n    return children ?? null;\n  }\n\n  /**\n   * Find parent node by list ID\n   */\n  findParentByListId(\n    nodes: AXTreeViewNode[],\n    listId: string,\n    idField = 'id',\n    childrenField = 'children',\n  ): AXTreeViewNode | undefined {\n    if (listId === AXTreeViewService.ROOT_LIST_ID) {\n      return undefined;\n    }\n\n    const prefix = listId.startsWith(AXTreeViewService.NODE_DROP_PREFIX)\n      ? AXTreeViewService.NODE_DROP_PREFIX\n      : AXTreeViewService.LIST_PREFIX;\n    const nodeId = listId.replace(prefix, '');\n    return this.findNodeById(nodes, nodeId, idField, childrenField) ?? undefined;\n  }\n\n  /**\n   * Generate unique list ID for each node\n   */\n  getListId(node: AXTreeViewNode | undefined, idField = 'id'): string {\n    if (!node) return AXTreeViewService.ROOT_LIST_ID;\n    const nodeId = node[idField] as string;\n    return `${AXTreeViewService.LIST_PREFIX}${nodeId}`;\n  }\n\n  /**\n   * Get root list ID constant\n   */\n  getRootListId(): string {\n    return AXTreeViewService.ROOT_LIST_ID;\n  }\n\n  /**\n   * Get node drop prefix constant\n   */\n  getNodeDropPrefix(): string {\n    return AXTreeViewService.NODE_DROP_PREFIX;\n  }\n\n  /**\n   * Get list prefix constant\n   */\n  getListPrefix(): string {\n    return AXTreeViewService.LIST_PREFIX;\n  }\n\n  // ==================== Node Utilities ====================\n  /**\n   * Get all nodes in a flat array\n   */\n  getAllNodes(nodes: AXTreeViewNode[], childrenField = 'children'): AXTreeViewNode[] {\n    const allNodes: AXTreeViewNode[] = [];\n    const traverse = (nodeList: AXTreeViewNode[]): void => {\n      for (const node of nodeList) {\n        allNodes.push(node);\n        const children = node[childrenField] as AXTreeViewNode[] | undefined;\n        if (children) {\n          traverse(children);\n        }\n      }\n    };\n    traverse(nodes);\n    return allNodes;\n  }\n\n  /**\n   * Get the path to a node (array of parent nodes from root to node)\n   */\n  getNodePath(nodes: AXTreeViewNode[], nodeId: string, idField = 'id', childrenField = 'children'): AXTreeViewNode[] {\n    const path: AXTreeViewNode[] = [];\n    const node = this.findNodeById(nodes, nodeId, idField, childrenField);\n    if (!node) {\n      return path;\n    }\n\n    let current: AXTreeViewNode | null = node;\n    while (current) {\n      path.unshift(current);\n      const parent = this.findParentNode(nodes, current, idField, childrenField);\n      current = parent ?? null;\n    }\n\n    return path;\n  }\n\n  /**\n   * Get the level/depth of a node (0 = root level)\n   */\n  getNodeLevel(nodes: AXTreeViewNode[], nodeId: string, idField = 'id', childrenField = 'children'): number {\n    const path = this.getNodePath(nodes, nodeId, idField, childrenField);\n    return path.length > 0 ? path.length - 1 : -1;\n  }\n\n  /**\n   * Get sibling nodes of a given node\n   */\n  getSiblings(nodes: AXTreeViewNode[], nodeId: string, idField = 'id', childrenField = 'children'): AXTreeViewNode[] {\n    const node = this.findNodeById(nodes, nodeId, idField, childrenField);\n    if (!node) {\n      return [];\n    }\n\n    const parent = this.findParentNode(nodes, node, idField, childrenField);\n    const siblingsArray = (parent?.[childrenField] as AXTreeViewNode[] | undefined) ?? nodes;\n\n    return siblingsArray.filter((n) => (n[idField] as string) !== nodeId);\n  }\n\n  /**\n   * Clone a node (creates a deep copy)\n   */\n  cloneNode(\n    node: AXTreeViewNode,\n    idField = 'id',\n    titleField = 'title',\n    tooltipField = 'tooltip',\n    iconField = 'icon',\n    expandedField = 'expanded',\n    selectedField = 'selected',\n    indeterminateField = 'indeterminate',\n    disabledField = 'disabled',\n    hiddenField = 'hidden',\n    childrenCountField = 'childrenCount',\n    dataField = 'data',\n    childrenField = 'children',\n  ): AXTreeViewNode {\n    const cloned: AXTreeViewNode = {\n      [idField]: `${node[idField] as string}-clone-${Date.now()}`,\n      [titleField]: node[titleField],\n      [tooltipField]: node[tooltipField],\n      [iconField]: node[iconField],\n      [expandedField]: node[expandedField],\n      [selectedField]: false, // Cloned nodes are not selected by default\n      [indeterminateField]: false,\n      [disabledField]: node[disabledField],\n      [hiddenField]: node[hiddenField],\n      [childrenCountField]: node[childrenCountField],\n      [dataField]: node[dataField] ? JSON.parse(JSON.stringify(node[dataField])) : undefined,\n    };\n\n    const children = node[childrenField] as AXTreeViewNode[] | undefined;\n    if (children && children.length > 0) {\n      cloned[childrenField] = children.map((child) =>\n        this.cloneNode(\n          child,\n          idField,\n          titleField,\n          tooltipField,\n          iconField,\n          expandedField,\n          selectedField,\n          indeterminateField,\n          disabledField,\n          hiddenField,\n          childrenCountField,\n          dataField,\n          childrenField,\n        ),\n      );\n      cloned[childrenCountField] = (cloned[childrenField] as AXTreeViewNode[]).length;\n    }\n\n    return cloned;\n  }\n\n  // ==================== Node Manipulation ====================\n  /**\n   * Move a node to a new parent in the tree\n   * @param nodes - Root nodes array\n   * @param nodeId - The ID of the node to move\n   * @param newParentId - The ID of the new parent (undefined for root level)\n   * @param index - Optional index to insert at (default: append to end)\n   * @param idField - Field name for node ID\n   * @param childrenField - Field name for children array\n   * @param childrenCountField - Field name for children count\n   * @param expandedField - Field name for expanded state\n   * @returns Object with success status, moved node, previous parent, new parent, and indices\n   */\n  moveNode(\n    nodes: AXTreeViewNode[],\n    nodeId: string,\n    newParentId: string | undefined,\n    index: number | undefined,\n    idField = 'id',\n    childrenField = 'children',\n    childrenCountField = 'childrenCount',\n    expandedField = 'expanded',\n  ): {\n    success: boolean;\n    movedNode?: AXTreeViewNode;\n    previousParent?: AXTreeViewNode;\n    newParent?: AXTreeViewNode;\n    previousIndex: number;\n    currentIndex: number;\n  } {\n    const node = this.findNodeById(nodes, nodeId, idField, childrenField);\n    if (!node) {\n      return { success: false, previousIndex: -1, currentIndex: -1 };\n    }\n\n    // Find current parent\n    const currentParent = this.findParentNode(nodes, node, idField, childrenField);\n    const currentParentChildren = currentParent\n      ? (currentParent[childrenField] as AXTreeViewNode[] | undefined)\n      : undefined;\n    const currentArray = currentParentChildren ?? nodes;\n\n    // Find and remove from current location\n    const currentIndex = currentArray.findIndex((n) => (n[idField] as string) === nodeId);\n    if (currentIndex === -1) {\n      return { success: false, previousIndex: -1, currentIndex: -1 };\n    }\n\n    const movedNode = currentArray.splice(currentIndex, 1)[0];\n\n    // Find new parent\n    let targetArray: AXTreeViewNode[];\n    let newParent: AXTreeViewNode | undefined;\n\n    if (newParentId) {\n      newParent = this.findNodeById(nodes, newParentId, idField, childrenField);\n      if (!newParent) {\n        // Restore node if new parent not found\n        currentArray.splice(currentIndex, 0, movedNode);\n        return { success: false, previousIndex: currentIndex, currentIndex: -1 };\n      }\n\n      // Validate drop target\n      if (!this.isValidDropTarget(movedNode, newParent, idField, childrenField)) {\n        // Restore node if invalid drop target\n        currentArray.splice(currentIndex, 0, movedNode);\n        return { success: false, previousIndex: currentIndex, currentIndex: -1 };\n      }\n\n      let newParentChildren = newParent[childrenField] as AXTreeViewNode[] | undefined;\n      if (!newParentChildren) {\n        newParentChildren = [];\n        newParent[childrenField] = newParentChildren;\n      }\n      targetArray = newParentChildren;\n    } else {\n      targetArray = nodes;\n    }\n\n    // Calculate new index before inserting\n    const newIndex = index !== undefined && index >= 0 && index <= targetArray.length ? index : targetArray.length;\n\n    // Insert at new location\n    if (index !== undefined && index >= 0 && index <= targetArray.length) {\n      targetArray.splice(index, 0, movedNode);\n    } else {\n      targetArray.push(movedNode);\n    }\n\n    // Update childrenCount\n    if (currentParent) {\n      const updatedChildren = currentParent[childrenField] as AXTreeViewNode[] | undefined;\n      currentParent[childrenCountField] = updatedChildren?.length ?? 0;\n    }\n    if (newParent) {\n      const updatedChildren = newParent[childrenField] as AXTreeViewNode[] | undefined;\n      newParent[childrenCountField] = updatedChildren?.length ?? 0;\n      newParent[expandedField] = true; // Auto-expand new parent\n    }\n\n    return {\n      success: true,\n      movedNode,\n      previousParent: currentParent,\n      newParent,\n      previousIndex: currentIndex,\n      currentIndex: newIndex,\n    };\n  }\n\n  /**\n   * Edit/update a node's properties\n   * @param nodes - Root nodes array\n   * @param nodeId - The ID of the node to edit\n   * @param updates - Partial node object with properties to update\n   * @param idField - Field name for node ID\n   * @param childrenField - Field name for children array\n   * @param childrenCountField - Field name for children count\n   * @returns The updated node if found, null otherwise\n   */\n  editNode(\n    nodes: AXTreeViewNode[],\n    nodeId: string,\n    updates: Partial<AXTreeViewNode>,\n    idField = 'id',\n    childrenField = 'children',\n    childrenCountField = 'childrenCount',\n  ): AXTreeViewNode | null {\n    const node = this.findNodeById(nodes, nodeId, idField, childrenField);\n    if (!node) {\n      return null;\n    }\n\n    // Update node properties\n    Object.assign(node, updates);\n\n    // If children array is provided, ensure it exists and update childrenCount\n    if (updates[childrenField] !== undefined) {\n      const children = updates[childrenField] as AXTreeViewNode[] | undefined;\n      node[childrenField] = children;\n      node[childrenCountField] = children?.length;\n    }\n\n    return node;\n  }\n\n  /**\n   * Add a child node to a parent node\n   * @param nodes - Root nodes array\n   * @param parentId - The ID of the parent node\n   * @param childNode - The child node to add\n   * @param index - Optional index to insert at (default: append to end)\n   * @param idField - Field name for node ID\n   * @param childrenField - Field name for children array\n   * @param childrenCountField - Field name for children count\n   * @param expandedField - Field name for expanded state\n   * @returns The parent node if found and child was added, null otherwise\n   */\n  addChild(\n    nodes: AXTreeViewNode[],\n    parentId: string,\n    childNode: AXTreeViewNode,\n    index: number | undefined,\n    idField = 'id',\n    childrenField = 'children',\n    childrenCountField = 'childrenCount',\n    expandedField = 'expanded',\n  ): AXTreeViewNode | null {\n    const parent = this.findNodeById(nodes, parentId, idField, childrenField);\n    if (!parent) {\n      return null;\n    }\n\n    // Ensure children array exists\n    let children = parent[childrenField] as AXTreeViewNode[] | undefined;\n    if (!children) {\n      children = [];\n      parent[childrenField] = children;\n    }\n\n    // Insert or append child\n    if (index !== undefined && index >= 0 && index <= children.length) {\n      children.splice(index, 0, childNode);\n    } else {\n      children.push(childNode);\n    }\n\n    // Update childrenCount\n    parent[childrenCountField] = children.length;\n\n    // Auto-expand parent if it was collapsed\n    if (!(parent[expandedField] as boolean | undefined)) {\n      parent[expandedField] = true;\n    }\n\n    return parent;\n  }\n\n  /**\n   * Remove a node from the tree\n   * @param nodes - Root nodes array\n   * @param nodeId - The ID of the node to remove\n   * @param idField - Field name for node ID\n   * @param childrenField - Field name for children array\n   * @param childrenCountField - Field name for children count\n   * @returns The removed node if found, null otherwise\n   */\n  removeNode(\n    nodes: AXTreeViewNode[],\n    nodeId: string,\n    idField = 'id',\n    childrenField = 'children',\n    childrenCountField = 'childrenCount',\n  ): AXTreeViewNode | null {\n    const node = this.findNodeById(nodes, nodeId, idField, childrenField);\n    if (!node) {\n      return null;\n    }\n\n    // Find parent to remove from its children array\n    const parent = this.findParentNode(nodes, node, idField, childrenField);\n    const parentChildren = parent ? (parent[childrenField] as AXTreeViewNode[] | undefined) : undefined;\n    const targetArray = parentChildren ?? nodes;\n\n    // Find and remove the node\n    const index = targetArray.findIndex((n) => (n[idField] as string) === nodeId);\n    if (index !== -1) {\n      const removed = targetArray.splice(index, 1)[0];\n\n      // Update parent's childrenCount if it exists\n      if (parent) {\n        const updatedChildren = parent[childrenField] as AXTreeViewNode[] | undefined;\n        parent[childrenCountField] = updatedChildren?.length ?? 0;\n      }\n\n      return removed;\n    }\n\n    return null;\n  }\n\n  /**\n   * Validate node structure (check for required fields and circular references)\n   */\n  validateNode(\n    node: AXTreeViewNode,\n    visitedIds: Set<string> = new Set(),\n    idField = 'id',\n    titleField = 'title',\n    childrenField = 'children',\n    childrenCountField = 'childrenCount',\n  ): { valid: boolean; errors: string[] } {\n    const errors: string[] = [];\n    const nodeId = node[idField] as string | undefined;\n    const nodeTitle = node[titleField] as string | undefined;\n\n    if (!nodeId) {\n      errors.push(`Node must have an ${idField}`);\n    }\n\n    if (!nodeTitle) {\n      errors.push(`Node must have a ${titleField}`);\n    }\n\n    if (nodeId && visitedIds.has(nodeId)) {\n      errors.push(`Circular reference detected: node ${nodeId} appears multiple times in the tree`);\n    }\n\n    const children = node[childrenField] as AXTreeViewNode[] | undefined;\n    if (children) {\n      const newVisited = new Set(visitedIds);\n      if (nodeId) {\n        newVisited.add(nodeId);\n      }\n\n      for (const child of children) {\n        const childValidation = this.validateNode(\n          child,\n          newVisited,\n          idField,\n          titleField,\n          childrenField,\n          childrenCountField,\n        );\n        if (!childValidation.valid) {\n          errors.push(...childValidation.errors.map((e) => `Child of ${nodeId}: ${e}`));\n        }\n      }\n\n      const childrenCount = node[childrenCountField] as number | undefined;\n      if (childrenCount !== undefined && childrenCount !== children.length) {\n        errors.push(\n          `Node ${nodeId}: ${childrenCountField} (${childrenCount}) does not match ${childrenField} array length (${children.length})`,\n        );\n      }\n    }\n\n    return {\n      valid: errors.length === 0,\n      errors,\n    };\n  }\n}\n","import { AXValueChangedEvent } from '@acorex/cdk/common';\nimport { AXDoubleClickDirective } from '@acorex/cdk/double-click';\nimport {\n  AXDragDirective,\n  AXDragHandleDirective,\n  AXDropListDirective,\n  AXDropListDroppedEvent,\n  moveItemInArray,\n  transferArrayItem,\n} from '@acorex/cdk/drag-drop';\nimport { AXFocusTrapDirective } from '@acorex/cdk/focus-trap';\nimport { AXBadgeComponent } from '@acorex/components/badge';\nimport { AXButtonComponent } from '@acorex/components/button';\nimport { AXCheckBoxComponent } from '@acorex/components/check-box';\nimport { AXDecoratorIconComponent } from '@acorex/components/decorators';\nimport { AXSkeletonComponent } from '@acorex/components/skeleton';\nimport { AXTooltipDirective } from '@acorex/components/tooltip';\nimport { AXPlatform } from '@acorex/core/platform';\nimport { CommonModule, NgTemplateOutlet } from '@angular/common';\nimport {\n  afterNextRender,\n  Component,\n  computed,\n  DestroyRef,\n  effect,\n  EventEmitter,\n  inject,\n  input,\n  model,\n  Output,\n  output,\n  signal,\n  TemplateRef,\n  ViewEncapsulation,\n} from '@angular/core';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { FormsModule } from '@angular/forms';\nimport { map } from 'rxjs/operators';\nimport { AXTreeViewService } from './tree-view.service';\nimport {\n  AXTreeViewBeforeDropEvent,\n  AXTreeViewCallback,\n  AXTreeViewDataSource,\n  AXTreeViewDragArea,\n  AXTreeViewDragBehavior,\n  AXTreeViewDropEvent,\n  AXTreeViewFlatNode,\n  AXTreeViewNode,\n  AXTreeViewNodeClickEvent,\n  AXTreeViewNodeDoubleClickEvent,\n  AXTreeViewNodeSelectEvent,\n  AXTreeViewItemTemplateContext as AXTreeViewNodeTemplateContext,\n  AXTreeViewNodeToggleEvent,\n  AXTreeViewSelectAndRevealOptions,\n  AXTreeViewSelectionBehavior,\n  AXTreeViewSelectionChangeEvent,\n  AXTreeViewSelectionSource,\n  AXTreeViewSelectMode,\n  AXTreeViewViewLook,\n} from './tree-view.types';\n\n@Component({\n  selector: 'ax-tree-view',\n  templateUrl: './tree-view.component.html',\n  styleUrls: ['./tree-view.component.css'],\n\n  encapsulation: ViewEncapsulation.None,\n  providers: [AXTreeViewService],\n  imports: [\n    CommonModule,\n    FormsModule,\n    AXDragDirective,\n    AXDragHandleDirective,\n    AXDropListDirective,\n    AXDoubleClickDirective,\n    AXFocusTrapDirective,\n    NgTemplateOutlet,\n    AXButtonComponent,\n    AXCheckBoxComponent,\n    AXBadgeComponent,\n    AXDecoratorIconComponent,\n    AXSkeletonComponent,\n    AXTooltipDirective,\n  ],\n  host: {\n    class: 'ax-tree-view',\n    role: 'tree',\n    tabindex: '0',\n    '[class.ax-tree-view-default]': \"look() === 'default'\",\n    '[class.ax-tree-view-card]': \"look() === 'card'\",\n    '[class.ax-tree-view-with-line]': \"look() === 'with-line'\",\n    '[class.ax-tree-view-rtl]': 'isRtl',\n    '[style.--ax-tree-view-indent-size]': \"indentSize() + 'px'\",\n    '[style.--ax-tree-view-line-offset]': \"(indentSize() / 2) + 'px'\",\n    '[attr.aria-label]': '\"Tree navigation\"',\n    '(keydown)': 'handleKeyDown($event)',\n    '(focus)': 'onTreeFocus($event)',\n    '(blur)': 'onTreeBlur($event)',\n  },\n})\nexport class AXTreeViewComponent {\n  // ==================== Dependencies ====================\n  private readonly treeService = inject(AXTreeViewService);\n  private readonly platformService = inject(AXPlatform);\n  private readonly destroyRef = inject(DestroyRef);\n\n  // ==================== Inputs ====================\n  /** Tree data source - can be static array or lazy loading function */\n  readonly datasource = model.required<AXTreeViewDataSource>();\n\n  /** Selection mode: 'single' (click to select) or 'multiple' (checkbox selection). Default: `'single'`. In multiple mode, checkboxes are automatically shown. */\n  readonly selectMode = input<AXTreeViewSelectMode>('single');\n\n  /** Selection behavior: 'all' (select anything, no special behavior), 'intermediate' (parent indeterminate state when children selected), 'leaf' (only leaf nodes selectable), 'nested' (selecting parent selects all children). Default: `'intermediate'` */\n  readonly selectionBehavior = input<AXTreeViewSelectionBehavior>('intermediate');\n\n  /** Drag area: 'handler' (drag handle), 'item' (entire item). Default: `'handler'` */\n  readonly dragArea = input<AXTreeViewDragArea>('handler');\n\n  /** Drag behavior: 'none' (disabled), 'order-only' (reorder only), 'move' (move between parents), 'both' (allow both). Default: `'none'` */\n  readonly dragBehavior = input<AXTreeViewDragBehavior>('none');\n\n  /** Whether to show icons. Default: `true` */\n  readonly showIcons = input(true);\n\n  /** Whether to show children count badge. Default: `true` */\n  readonly showChildrenBadge = input(true);\n\n  /** Custom icon for expanded nodes. Default: `'fa-solid fa-chevron-down'` */\n  readonly expandedIcon = input('fa-solid fa-chevron-down');\n\n  /** Custom icon for collapsed nodes. Default: `'fa-solid fa-chevron-right'` */\n  readonly collapsedIcon = input('fa-solid fa-chevron-right');\n\n  /** Indent size in pixels for each level. Default: `16` */\n  readonly indentSize = input(16);\n\n  /** Visual style variant. Default: `'default'` */\n  readonly look = input<AXTreeViewViewLook>('default');\n\n  /**\n   * When `true`, visible nodes use alternating background colors (flattened visual order,\n   * including expanded children). Default: `false`.\n   */\n  readonly alternate = input(false);\n\n  /** Custom template for tree items. Default: `undefined` */\n  readonly nodeTemplate = input<TemplateRef<AXTreeViewNodeTemplateContext>>();\n\n  /** Field name for node ID. Default: `'id'` */\n  readonly idField = input('id');\n\n  /** Field name for node title. Default: `'title'` */\n  readonly titleField = input('title');\n\n  /** Field name for node tooltip. Default: `'tooltip'` */\n  readonly tooltipField = input('tooltip');\n\n  /** Field name for node icon. Default: `'icon'` */\n  readonly iconField = input('icon');\n\n  /** Field name for expanded state. Default: `'expanded'` */\n  readonly expandedField = input('expanded');\n\n  /** Field name for selected state. Default: `'selected'` */\n  readonly selectedField = input('selected');\n\n  /** Field name for indeterminate state. Default: `'indeterminate'` */\n  readonly indeterminateField = input('indeterminate');\n\n  /** Field name for disabled state. Default: `'disabled'` */\n  readonly disabledField = input('disabled');\n\n  /** Field name for hidden state. Default: `'hidden'` */\n  readonly hiddenField = input('hidden');\n\n  /** Field name for children array. Default: `'children'` */\n  readonly childrenField = input('children');\n\n  /** Field name for children count. Default: `'childrenCount'` */\n  readonly childrenCountField = input('childrenCount');\n\n  /** Field name for custom data. Default: `'data'` */\n  readonly dataField = input('data');\n\n  /** Whether disabled state is inherited from parent nodes. Default: `true`. */\n  readonly inheritDisabled = input(true);\n\n  /** Whether double-click on node content toggles expand/collapse. Default: `true`. */\n  readonly expandOnDoubleClick = input(true);\n\n  /** Duration in milliseconds for detecting double-clicks. Default: `50`. */\n  readonly doubleClickDuration = input(200);\n\n  /** Duration in milliseconds for detecting double-clicks. Default: `50`. */\n  readonly tooltipDelay = input(500);\n\n  /**\n   * When true, {@link selectedIds} is the source of truth: the tree applies it on load/reload\n   * and emits updates on user interaction. Default: `false` (existing imperative API unchanged).\n   */\n  readonly controlledSelection = input(false);\n\n  /** Selected node ids (two-way). Used when {@link controlledSelection} is true. */\n  readonly selectedIds = model<string[]>([]);\n\n  // ==================== Outputs ====================\n  /** Emitted before a drop operation - set canceled to true to prevent drop */\n  readonly onBeforeDrop = output<AXTreeViewBeforeDropEvent>();\n\n  /** Emitted when a node is toggled (expanded/collapsed) */\n  readonly onNodeToggle = output<AXTreeViewNodeToggleEvent>();\n\n  /** Emitted when a node is selected/deselected */\n  readonly onNodeSelect = output<AXTreeViewNodeSelectEvent>();\n\n  /** Emitted when a node is double-clicked */\n  // readonly onNodeDoubleClick = output<AXTreeViewNodeDoubleClickEvent>();\n  @Output() onNodeDoubleClick = new EventEmitter<AXTreeViewNodeDoubleClickEvent>();\n\n  /** Emitted when a node is double-clicked */\n  readonly onNodeClick = output<AXTreeViewNodeClickEvent>();\n\n  /** Emitted when selection changes - returns all currently selected nodes */\n  readonly onSelectionChange = output<AXTreeViewSelectionChangeEvent>();\n\n  /** Emitted when nodes are reordered within the same parent */\n  readonly onOrderChange = output<AXTreeViewDropEvent>();\n\n  /** Emitted when a node is moved to a different parent */\n  readonly onMoveChange = output<AXTreeViewDropEvent>();\n\n  /** Emitted for any item change (order or move) */\n  readonly onItemsChange = output<AXTreeViewDropEvent>();\n\n  // ==================== Internal State ====================\n  /** Internal signal for tree nodes */\n  protected readonly nodes = signal<AXTreeViewNode[]>([]);\n\n  /** Internal signal for tracking loading state of individual nodes */\n  protected readonly loadingNodes = signal<Set<string>>(new Set());\n\n  /** Signal for tracking root/tree-level loading state (used by reloadData) */\n  private readonly _isLoading = signal(false);\n\n  /** Public readonly signal for tree loading state - can be used in templates */\n  readonly isLoading = this._isLoading.asReadonly();\n\n  /** Currently focused node ID for keyboard navigation */\n  protected readonly focusedNodeId = signal<string | null>(null);\n\n  /** RTL detection signal */\n  protected readonly isRtl = signal(this.platformService.isRtl());\n\n  /** active node id */\n  protected readonly activeNodeId = signal<string | null>(null);\n\n  /** Computed chevron icons that flip for RTL */\n  protected readonly directionExpandedIcon = computed(() => this.expandedIcon());\n\n  protected readonly directionCollapsedIcon = computed(() => {\n    const isRtlDirection = this.isRtl();\n    const defaultIcon = this.collapsedIcon();\n\n    if (isRtlDirection && defaultIcon === 'fa-solid fa-chevron-right') {\n      return 'fa-solid fa-chevron-left';\n    }\n    if (!isRtlDirection && defaultIcon === 'fa-solid fa-chevron-left') {\n      return 'fa-solid fa-chevron-right';\n    }\n    return defaultIcon;\n  });\n\n  /** Visible-row index (DFS of expanded, non-hidden nodes) used for alternate striping. */\n  protected readonly alternateRowIndexById = computed(() => {\n    const map = new Map<string, number>();\n    if (!this.alternate()) {\n      return map;\n    }\n    const hiddenField = this.hiddenField();\n    const expandedField = this.expandedField();\n    const childrenField = this.childrenField();\n    const idField = this.idField();\n    let index = 0;\n    const visit = (list: AXTreeViewNode[]) => {\n      for (const node of list) {\n        if (node[hiddenField] === true) {\n          continue;\n        }\n        map.set(String(node[idField] ?? ''), index++);\n        const children = node[childrenField] as AXTreeViewNode[] | undefined;\n        if (node[expandedField] && children?.length) {\n          visit(children);\n        }\n      }\n    };\n    visit(this.nodes());\n    return map;\n  });\n\n  protected isAlternateNode(node: AXTreeViewNode): boolean {\n    const index = this.alternateRowIndexById().get(String(this.getNodeId(node)));\n    return index != null && index % 2 === 1;\n  }\n\n  /** Flag to prevent infinite loops when syncing datasource */\n  private isUpdatingFromDatasource = false;\n\n  /** Bumped when controlled selection changes so stale async sync is ignored. */\n  private selectionSyncRevision = 0;\n\n  private pendingApplySelectedIdsTimeout?: ReturnType<typeof setTimeout>;\n\n  /** Prevents selectedIds effect from re-applying when the model was updated from the tree. */\n  private isUpdatingSelectedIdsModel = false;\n\n  /** Computed to check if datasource is a function */\n  private readonly isLazyDataSource = computed(() => typeof this.datasource() === 'function');\n\n  /** Computed: Returns true when selection is restricted to leaf nodes only */\n  protected readonly isLeafOnlyMode = computed(() => this.selectionBehavior() === 'leaf');\n\n  /** Computed: Returns true when selecting a parent automatically selects all its children */\n  protected readonly cascadesToChildren = computed(() => {\n    const behavior = this.selectionBehavior();\n    return behavior === 'nested' || behavior === 'intermediate-nested';\n  });\n\n  /** Computed: Returns true when parent nodes show indeterminate state based on children selection */\n  protected readonly hasIntermediateState = computed(() => {\n    const behavior = this.selectionBehavior();\n    return behavior === 'intermediate' || behavior === 'intermediate-nested';\n  });\n\n  /** Computed: Returns true when drag handle should be shown */\n  protected readonly shouldShowDragHandle = computed(() => {\n    return this.dragArea() === 'handler' && this.dragBehavior() !== 'none';\n  });\n\n  /** Signal to track if double-click output has subscribers */\n  private readonly hasDoubleClickSubscribers = signal(false);\n\n  /**\n   * Returns true if double-click output has no subscribers (should disable directive)\n   * Uses a computed signal that checks if EventEmitter has observers\n   * If no subscribers AND expandOnDoubleClick is false, disable the directive (return true)\n   * If has subscribers OR expandOnDoubleClick is true, enable the directive (return false)\n   */\n  protected readonly isDoubleClickDisabled = computed(() => {\n    // If expandOnDoubleClick is enabled, we need the directive to work, so don't disable it\n    if (this.expandOnDoubleClick()) {\n      return false;\n    }\n    // Otherwise, disable if no subscribers\n    return !this.hasDoubleClickSubscribers();\n  });\n\n  /** Check EventEmitter observers and update signal */\n  private checkDoubleClickSubscribers(): void {\n    // Access the EventEmitter's observers property\n    // EventEmitter extends Subject which has observers array\n    const emitter = this.onNodeDoubleClick as any;\n    const observers = emitter?.observers || [];\n    const hasSubscribers = observers.length > 0;\n    this.hasDoubleClickSubscribers.set(hasSubscribers);\n  }\n\n  // ==================== Node Property Helpers ====================\n  /**\n   * Get a property value from a node using the configured field name\n   */\n  protected getNodeProp<T = unknown>(node: AXTreeViewNode, fieldName: string, defaultValue?: T): T {\n    return (node[fieldName] as T) ?? (defaultValue as T);\n  }\n\n  /**\n   * Set a property value on a node using the configured field name\n   */\n  protected setNodeProp(node: AXTreeViewNode, fieldName: string, value: unknown): void {\n    node[fieldName] = value;\n  }\n\n  /**\n   * Get node ID\n   */\n  protected getNodeId(node: AXTreeViewNode): string {\n    return this.getNodeProp<string>(node, this.idField(), '');\n  }\n\n  /**\n   * Get node title\n   */\n  protected getNodeTitle(node: AXTreeViewNode): string {\n    return this.getNodeProp<string>(node, this.titleField(), '');\n  }\n\n  /**\n   * Get node tooltip\n   */\n  protected getNodeTooltip(node: AXTreeViewNode): string | undefined {\n    return this.getNodeProp<string | undefined>(node, this.tooltipField(), undefined);\n  }\n\n  /**\n   * Get node icon\n   */\n  protected getNodeIcon(node: AXTreeViewNode): string | undefined {\n    return this.getNodeProp<string | undefined>(node, this.iconField(), undefined);\n  }\n\n  /**\n   * Get node expanded state\n   */\n  protected getNodeExpanded(node: AXTreeViewNode): boolean {\n    return this.getNodeProp<boolean>(node, this.expandedField(), false);\n  }\n\n  /**\n   * Set node expanded state\n   */\n  protected setNodeExpanded(node: AXTreeViewNode, value: boolean): void {\n    this.setNodeProp(node, this.expandedField(), value);\n  }\n\n  /**\n   * Get node selected state\n   */\n  protected getNodeSelected(node: AXTreeViewNode): boolean {\n    return this.getNodeProp<boolean>(node, this.selectedField(), false);\n  }\n\n  /**\n   * Set node selected state\n   */\n  protected setNodeSelected(node: AXTreeViewNode, value: boolean): void {\n    this.setNodeProp(node, this.selectedField(), value);\n  }\n\n  /**\n   * Get node indeterminate state\n   */\n  protected getNodeIndeterminate(node: AXTreeViewNode): boolean {\n    return this.getNodeProp<boolean>(node, this.indeterminateField(), false);\n  }\n\n  /**\n   * Set node indeterminate state\n   */\n  protected setNodeIndeterminate(node: AXTreeViewNode, value: boolean): void {\n    this.setNodeProp(node, this.indeterminateField(), value);\n  }\n\n  /**\n   * Get node's own disabled state (without inheritance)\n   */\n  protected getNodeDisabled(node: AXTreeViewNode): boolean {\n    return this.getNodeProp<boolean>(node, this.disabledField(), false);\n  }\n\n  /**\n   * Check if node is effectively disabled (considering inheritance from parents)\n   * When inheritDisabled is true:\n   * - Returns true if node itself is disabled\n   * - Returns true if any ancestor is disabled AND node doesn't have explicit `disabled: false`\n   * When inheritDisabled is false:\n   * - Only returns node's own disabled state\n   */\n  protected isNodeEffectivelyDisabled(node: AXTreeViewNode): boolean {\n    // Check if node itself is disabled\n    if (this.getNodeDisabled(node)) {\n      return true;\n    }\n\n    // If not inheriting disabled state, just return false (node is not disabled)\n    if (!this.inheritDisabled()) {\n      return false;\n    }\n\n    // Check if node explicitly has disabled: false (override inheritance)\n    const nodeDisabledValue = node[this.disabledField()];\n    if (nodeDisabledValue === false) {\n      return false;\n    }\n\n    // Check ancestors for disabled state\n    return this.isAnyAncestorDisabled(node);\n  }\n\n  /**\n   * Check if any ancestor of the node is disabled\n   */\n  private isAnyAncestorDisabled(node: AXTreeViewNode): boolean {\n    const parent = this.treeService.findParentNode(this.nodes(), node, this.idField(), this.childrenField());\n\n    if (!parent) {\n      return false;\n    }\n\n    if (this.getNodeDisabled(parent)) {\n      return true;\n    }\n\n    return this.isAnyAncestorDisabled(parent);\n  }\n\n  /**\n   * Get node hidden state\n   */\n  protected getNodeHidden(node: AXTreeViewNode): boolean {\n    return this.getNodeProp<boolean>(node, this.hiddenField(), false);\n  }\n\n  /**\n   * Get node children array\n   */\n  protected getNodeChildren(node: AXTreeViewNode): AXTreeViewNode[] | undefined {\n    return this.getNodeProp<AXTreeViewNode[] | undefined>(node, this.childrenField(), undefined);\n  }\n\n  /**\n   * Set node children array\n   */\n  protected setNodeChildren(node: AXTreeViewNode, value: AXTreeViewNode[] | undefined): void {\n    this.setNodeProp(node, this.childrenField(), value);\n  }\n\n  /**\n   * Get node children count\n   */\n  protected getNodeChildrenCount(node: AXTreeViewNode): number | undefined {\n    return this.getNodeProp<number | undefined>(node, this.childrenCountField(), undefined);\n  }\n\n  /**\n   * Set node children count\n   */\n  protected setNodeChildrenCount(node: AXTreeViewNode, value: number | undefined): void {\n    this.setNodeProp(node, this.childrenCountField(), value);\n  }\n\n  // ==================== Effects ====================\n  /** Effect to handle datasource changes */\n  readonly #datasourceEffect = effect(async () => {\n    if (this.isUpdatingFromDatasource) {\n      return;\n    }\n\n    const ds = this.datasource();\n    if (Array.isArray(ds)) {\n      this.nodes.set([...ds]);\n      if (this.controlledSelection()) {\n        this.scheduleApplySelectedIdsToTree(0);\n      }\n    } else if (typeof ds === 'function') {\n      try {\n        await this.loadRootItems(ds);\n      } catch (error: unknown) {\n        this.handleError('Failed to load root items', error);\n      }\n    }\n  });\n\n  /** Applies external selectedIds changes to the tree when controlledSelection is enabled. */\n  readonly #selectedIdsEffect = effect(() => {\n    if (!this.controlledSelection()) {\n      return;\n    }\n\n    const ids = this.selectedIds();\n    if (this.isUpdatingSelectedIdsModel) {\n      return;\n    }\n\n    void ids;\n    this.bumpSelectionSyncRevision();\n    this.scheduleApplySelectedIdsToTree(0);\n  });\n\n  /** Initialize direction change listener */\n  readonly #initDirectionListener = afterNextRender(() => {\n    this.platformService.directionChange\n      .pipe(\n        map((event) => event.data === 'rtl'),\n        takeUntilDestroyed(this.destroyRef),\n      )\n      .subscribe((isRtl) => this.isRtl.set(isRtl));\n\n    // Check double-click subscribers after view initialization\n    this.checkDoubleClickSubscribers();\n\n    // Set up periodic check to detect when subscribers are added/removed\n    // This ensures we catch template bindings that happen after initial render\n    const intervalId = setInterval(() => {\n      this.checkDoubleClickSubscribers();\n    }, 100);\n\n    // Clean up interval on destroy\n    this.destroyRef.onDestroy(() => {\n      clearInterval(intervalId);\n    });\n  });\n\n  // ==================== Public API ====================\n  /**\n   * Expand all nodes in the tree (with lazy loading support)\n   */\n  async expandAll(): Promise<void> {\n    await this.treeService.setExpandedState(\n      this.nodes(),\n      true,\n      this.isLazyDataSource(),\n      (node) => this.loadNodeChildren(node),\n      this.expandedField(),\n      this.childrenField(),\n      this.childrenCountField(),\n    );\n    this.refreshNodes();\n  }\n\n  /**\n   * Collapse all nodes in the tree\n   */\n  collapseAll(): void {\n    this.treeService.setExpandedState(\n      this.nodes(),\n      false,\n      this.isLazyDataSource(),\n      (node) => this.loadNodeChildren(node),\n      this.expandedField(),\n      this.childrenField(),\n      this.childrenCountField(),\n    );\n    this.refreshNodes();\n  }\n\n  /**\n   * Get count of selected nodes\n   */\n  getSelectedCount(): number {\n    return this.treeService.countSelected(this.nodes(), this.selectedField(), this.childrenField());\n  }\n\n  /**\n   * Check if any nodes are selected\n   */\n  hasSelection(): boolean {\n    return this.getSelectedCount() > 0;\n  }\n\n  /**\n   * Get all selected nodes\n   */\n  getSelectedNodes(): AXTreeViewNode[] {\n    const selected: AXTreeViewNode[] = [];\n    this.treeService.collectSelected(this.nodes(), selected, this.selectedField(), this.childrenField());\n    return selected;\n  }\n\n  /**\n   * Returns selected node ids (from {@link selectedIds} when controlled, otherwise from tree state).\n   */\n  getSelectedIds(): string[] {\n    if (this.controlledSelection()) {\n      return this.normalizeSelectedIdsForMode(this.selectedIds());\n    }\n    return this.normalizeSelectedIdsForMode(\n      this.getSelectedNodes()\n        .map((node) => this.getNodeId(node))\n        .filter(Boolean),\n    );\n  }\n\n  /**\n   * Expands ancestor paths (when provided) and applies selection.\n   * Intended for lazy trees with {@link controlledSelection}.\n   */\n  async selectAndReveal(nodeIds: string[], options?: AXTreeViewSelectAndRevealOptions): Promise<void> {\n    this.bumpSelectionSyncRevision();\n    const revision = this.selectionSyncRevision;\n    const normalized = this.normalizeSelectedIdsForMode(nodeIds);\n\n    const paths =\n      options?.ancestorPaths ??\n      normalized.map((id) => {\n        const path = this.getNodePath(id);\n        return path.slice(0, -1);\n      });\n\n    await this.expandAncestorPaths(paths, revision);\n\n    if (!this.isSelectionSyncCurrent(revision)) {\n      return;\n    }\n\n    this.setSelectedIdsModel(normalized);\n    await this.applySelectedIdsToTreeWithRetry(revision);\n  }\n\n  /**\n   * Delete selected nodes from the tree\n   */\n  deleteSelected(): void {\n    this.treeService.removeSelected(\n      this.nodes(),\n      this.selectedField(),\n      this.indeterminateField(),\n      this.childrenField(),\n    );\n    if (!this.isLeafOnlyMode()) {\n      this.treeService.updateAllParentStates(\n        this.nodes(),\n        this.hasIntermediateState(),\n        this.childrenField(),\n        this.selectedField(),\n        this.indeterminateField(),\n      );\n    }\n    this.refreshNodes();\n    if (this.controlledSelection()) {\n      this.syncSelectedIdsModelFromTree('programmatic');\n    } else {\n      this.emitSelectionChange('programmatic');\n    }\n  }\n\n  /**\n   * Select all nodes in the tree (respects disabled state)\n   */\n  selectAll(): void {\n    if (this.selectMode() === 'none') {\n      return;\n    }\n    if (this.isLeafOnlyMode()) {\n      // Only select leaf nodes that are not disabled\n      const selectLeafs = (nodes: AXTreeViewNode[]): void => {\n        for (const node of nodes) {\n          if (this.isLeafNode(node) && !this.isNodeEffectivelyDisabled(node)) {\n            this.setNodeSelected(node, true);\n            this.setNodeIndeterminate(node, false);\n          }\n          const children = this.getNodeChildren(node);\n          if (children) {\n            selectLeafs(children);\n          }\n        }\n      };\n      selectLeafs(this.nodes());\n    } else {\n      // Select all nodes that are not disabled\n      const selectAllNonDisabled = (nodes: AXTreeViewNode[]): void => {\n        for (const node of nodes) {\n          if (!this.isNodeEffectivelyDisabled(node)) {\n            this.setNodeSelected(node, true);\n            this.setNodeIndeterminate(node, false);\n          }\n          const children = this.getNodeChildren(node);\n          if (children) {\n            selectAllNonDisabled(children);\n          }\n        }\n      };\n      selectAllNonDisabled(this.nodes());\n    }\n    this.refreshNodes();\n    if (this.controlledSelection()) {\n      this.syncSelectedIdsModelFromTree('programmatic');\n    } else {\n      this.emitSelectionChange('programmatic');\n    }\n  }\n\n  /**\n   * Deselect all nodes in the tree\n   */\n  deselectAll(): void {\n    this.treeService.setAllSelection(\n      this.nodes(),\n      false,\n      this.selectedField(),\n      this.indeterminateField(),\n      this.childrenField(),\n    );\n    this.refreshNodes();\n    if (this.controlledSelection()) {\n      this.syncSelectedIdsModelFromTree('programmatic');\n    } else {\n      this.emitSelectionChange('programmatic');\n    }\n  }\n\n  /**\n   * Find a node by ID in the tree\n   */\n  findNode(id: string): AXTreeViewNode | null {\n    return this.treeService.findNodeById(this.nodes(), id, this.idField(), this.childrenField());\n  }\n\n  /**\n   * Refresh the tree to trigger change detection\n   */\n  refresh(): void {\n    this.refreshNodes();\n  }\n\n  /**\n   * Reload the entire tree data from the datasource\n   * For callback datasource: clears all nodes and reloads from root\n   * For array datasource: refreshes the current data\n   * @returns Promise that resolves when reload is complete\n   */\n  async reloadData(): Promise<void> {\n    // Prevent concurrent reloads\n    if (this._isLoading()) {\n      return;\n    }\n\n    const ds = this.datasource();\n\n    if (typeof ds === 'function') {\n      this._isLoading.set(true);\n\n      // Clear states in batch for better performance\n      this.loadingNodes.set(new Set());\n      this.nodes.set([]);\n      this.focusedNodeId.set(null);\n      this.activeNodeId.set(null);\n\n      try {\n        const result = ds();\n        const rootNodes = result instanceof Promise ? await result : result;\n        this.nodes.set(rootNodes);\n      } catch (error: unknown) {\n        this.handleError('Failed to reload data', error);\n        this.nodes.set([]);\n      } finally {\n        this._isLoading.set(false);\n        if (this.controlledSelection()) {\n          this.scheduleApplySelectedIdsToTree(50);\n        }\n      }\n    } else if (Array.isArray(ds)) {\n      // For array datasource, just refresh from the current data\n      this.nodes.set([...ds]);\n      if (this.controlledSelection()) {\n        this.scheduleApplySelectedIdsToTree(0);\n      }\n    }\n  }\n\n  /**\n   * Check if the tree is currently loading data (root level)\n   * @returns true if the tree is loading root data\n   */\n  getIsLoading(): boolean {\n    return this._isLoading();\n  }\n\n  /**\n   * Check if a node is currently loading\n   */\n  isNodeLoading(nodeId: string): boolean {\n    return this.loadingNodes().has(nodeId);\n  }\n\n  /**\n   * Get loading state for a node (internal state)\n   */\n  getNodeLoading(node: AXTreeViewNode): boolean {\n    return this.loadingNodes().has(this.getNodeId(node));\n  }\n\n  /**\n   * Edit/update a node's properties\n   * @param nodeId - The ID of the node to edit\n   * @param updates - Partial node object with properties to update\n   * @returns true if node was found and updated, false otherwise\n   */\n  editNode(nodeId: string, updates: Partial<AXTreeViewNode>): boolean {\n    const updated = this.treeService.editNode(\n      this.nodes(),\n      nodeId,\n      updates,\n      this.idField(),\n      this.childrenField(),\n      this.childrenCountField(),\n    );\n    if (updated) {\n      this.refreshNodes();\n      return true;\n    }\n    return false;\n  }\n\n  /**\n   * Add a child node to a parent node\n   * @param parentId - The ID of the parent node\n   * @param childNode - The child node to add\n   * @param index - Optional index to insert at (default: append to end)\n   * @returns true if parent was found and child was added, false otherwise\n   */\n  addChild(parentId: string, childNode: AXTreeViewNode, index?: number): boolean {\n    const parent = this.treeService.addChild(\n      this.nodes(),\n      parentId,\n      childNode,\n      index,\n      this.idField(),\n      this.childrenField(),\n      this.childrenCountField(),\n      this.expandedField(),\n    );\n    if (parent) {\n      this.refreshNodes();\n      return true;\n    }\n    return false;\n  }\n\n  /**\n   * Remove a node from the tree\n   * @param nodeId - The ID of the node to remove\n   * @returns The removed node if found, null otherwise\n   */\n  removeNode(nodeId: string): AXTreeViewNode | null {\n    const removed = this.treeService.removeNode(\n      this.nodes(),\n      nodeId,\n      this.idField(),\n      this.childrenField(),\n      this.childrenCountField(),\n    );\n    if (removed) {\n      // Update parent states if needed\n      if (this.hasIntermediateState()) {\n        this.treeService.updateAllParentStates(\n          this.nodes(),\n          this.hasIntermediateState(),\n          this.childrenField(),\n          this.selectedField(),\n          this.indeterminateField(),\n        );\n      }\n      this.refreshNodes();\n    }\n    return removed;\n  }\n\n  /**\n   * Expand a specific node\n   * @param nodeId - The ID of the node to expand\n   * @returns Promise that resolves when expansion is complete (if lazy loading)\n   */\n  async expandNode(nodeId: string): Promise<void> {\n    const node = this.findNode(nodeId);\n    if (!node) {\n      return;\n    }\n\n    const hasChildren = this.treeService.hasChildren(node, this.childrenField());\n    const canLazyLoad = this.treeService.canLazyLoad(\n      node,\n      this.isLazyDataSource(),\n      this.childrenCountField(),\n      this.childrenField(),\n    );\n\n    if (hasChildren || canLazyLoad) {\n      if (canLazyLoad) {\n        await this.loadNodeChildren(node);\n      }\n      this.setNodeExpanded(node, true);\n      this.refreshNodes();\n      this.onNodeToggle.emit({ component: this, node, nativeEvent: new Event('expand') });\n    }\n  }\n\n  /**\n   * Collapse a specific node\n   * @param nodeId - The ID of the node to collapse\n   */\n  collapseNode(nodeId: string): void {\n    const node = this.findNode(nodeId);\n    if (!node) {\n      return;\n    }\n\n    if (this.getNodeExpanded(node)) {\n      this.setNodeExpanded(node, false);\n      this.refreshNodes();\n      this.onNodeToggle.emit({ component: this, node, nativeEvent: new Event('collapse') });\n    }\n  }\n\n  /**\n   * Toggle expansion state of a specific node\n   * @param nodeId - The ID of the node to toggle\n   * @returns Promise that resolves when toggle is complete (if lazy loading)\n   */\n  async toggleNodeExpansion(nodeId: string): Promise<void> {\n    const node = this.findNode(nodeId);\n    if (!node) {\n      return;\n    }\n\n    if (this.getNodeExpanded(node)) {\n      this.collapseNode(nodeId);\n    } else {\n      await this.expandNode(nodeId);\n    }\n  }\n\n  /**\n   * Programmatically select a node\n   * @param nodeId - The ID of the node to select\n   * @returns true if node was found and selected, false otherwise\n   */\n  selectNode(nodeId: string): boolean {\n    if (this.selectMode() === 'none') {\n      return false;\n    }\n    const node = this.findNode(nodeId);\n    if (!node || this.isNodeEffectivelyDisabled(node) || !this.canSelectNode(node)) {\n      return false;\n    }\n\n    const mode = this.selectMode();\n    if (mode === 'single') {\n      this.treeService.deselectAllNodes(\n        this.nodes(),\n        this.selectedField(),\n        this.indeterminateField(),\n        this.childrenField(),\n      );\n      this.setNodeSelected(node, true);\n      this.setNodeIndeterminate(node, false);\n    } else {\n      this.setNodeSelected(node, true);\n      this.setNodeIndeterminate(node, false);\n\n      const children = this.getNodeChildren(node);\n      if (this.cascadesToChildren() && children && !this.isLeafOnlyMode()) {\n        this.treeService.selectAllChildren(\n          children,\n          true,\n          this.selectedField(),\n          this.indeterminateField(),\n          this.childrenField(),\n        );\n      }\n\n      if (this.hasIntermediateState() && !this.isLeafOnlyMode()) {\n        this.treeService.updateParentStates(\n          this.nodes(),\n          node,\n          this.hasIntermediateState(),\n          this.idField(),\n          this.childrenField(),\n          this.selectedField(),\n          this.indeterminateField(),\n        );\n      }\n    }\n\n    this.refreshNodes();\n    this.onNodeSelect.emit({\n      component: this,\n      node,\n      isUserInteraction: false,\n    });\n    if (this.controlledSelection()) {\n      this.syncSelectedIdsModelFromTree('programmatic');\n    } else {\n      this.emitSelectionChange('programmatic');\n    }\n    return true;\n  }\n\n  /**\n   * Programmatically deselect a node\n   * @param nodeId - The ID of the node to deselect\n   * @returns true if node was found and deselected, false otherwise\n   */\n  deselectNode(nodeId: string): boolean {\n    const node = this.findNode(nodeId);\n    if (!node) {\n      return false;\n    }\n\n    this.setNodeSelected(node, false);\n    this.setNodeIndeterminate(node, false);\n\n    const children = this.getNodeChildren(node);\n    if (this.cascadesToChildren() && children && !this.isLeafOnlyMode()) {\n      this.treeService.selectAllChildren(\n        children,\n        false,\n        this.selectedField(),\n        this.indeterminateField(),\n        this.childrenField(),\n      );\n    }\n\n    if (this.hasIntermediateState() && !this.isLeafOnlyMode()) {\n      this.treeService.updateParentStates(\n        this.nodes(),\n        node,\n        this.hasIntermediateState(),\n        this.idField(),\n        this.childrenField(),\n        this.selectedField(),\n        this.indeterminateField(),\n      );\n    }\n\n    this.refreshNodes();\n    this.onNodeSelect.emit({\n      component: this,\n      node,\n      isUserInteraction: false,\n    });\n    if (this.controlledSelection()) {\n      this.syncSelectedIdsModelFromTree('programmatic');\n    } else {\n      this.emitSelectionChange('programmatic');\n    }\n    return true;\n  }\n\n  /**\n   * Get parent node of a given node\n   * @param nodeId - The ID of the node\n   * @returns The parent node if found, null otherwise\n   */\n  getParent(nodeId: string): AXTreeViewNode | null {\n    const node = this.findNode(nodeId);\n    if (!node) {\n      return null;\n    }\n    return this.treeService.findParentNode(this.nodes(), node, this.idField(), this.childrenField()) ?? null;\n  }\n\n  /**\n   * Get children of a node\n   * @param nodeId - The ID of the parent node\n   * @returns Array of child nodes, or null if node not found\n   */\n  getChildren(nodeId: string): AXTreeViewNode[] | null {\n    const node = this.findNode(nodeId);\n    if (!node) {\n      return null;\n    }\n    return this.getNodeChildren(node) ?? [];\n  }\n\n  /**\n   * Get all root nodes\n   * @returns Array of root nodes\n   */\n  getRootNodes(): AXTreeViewNode[] {\n    return [...this.nodes()];\n  }\n\n  /**\n   * Get all nodes in a flat array\n   * @returns Array of all nodes in the tree\n   */\n  getAllNodes(): AXTreeViewNode[] {\n    return this.treeService.getAllNodes(this.nodes(), this.childrenField());\n  }\n\n  /**\n   * Get the path to a node (array of parent IDs from root to node)\n   * @param nodeId - The ID of the node\n   * @returns Array of node IDs representing the path, or empty array if node not found\n   */\n  getNodePath(nodeId: string): string[] {\n    const nodePath = this.treeService.getNodePath(this.nodes(), nodeId, this.idField(), this.childrenField());\n    return nodePath.map((node) => this.getNodeId(node));\n  }\n\n  /**\n   * Get the level/depth of a node (0 = root level)\n   * @param nodeId - The ID of the node\n   * @returns The level of the node, or -1 if node not found\n   */\n  getNodeLevel(nodeId: string): number {\n    return this.treeService.getNodeLevel(this.nodes(), nodeId, this.idField(), this.childrenField());\n  }\n\n  /**\n   * Programmatically move a node to a new parent\n   * @param nodeId - The ID of the node to move\n   * @param newParentId - The ID of the new parent (undefined for root level)\n   * @param index - Optional index to insert at (default: append to end)\n   * @returns true if move was successful, false otherwise\n   */\n  moveNode(nodeId: string, newParentId?: string, index?: number): boolean {\n    const result = this.treeService.moveNode(\n      this.nodes(),\n      nodeId,\n      newParentId,\n      index,\n      this.idField(),\n      this.childrenField(),\n      this.childrenCountField(),\n      this.expandedField(),\n    );\n\n    if (result.success && result.movedNode) {\n      // Emit drop events\n      this.emitDropEvents(\n        result.movedNode,\n        result.previousParent,\n        result.newParent,\n        result.previousIndex,\n        result.currentIndex,\n        false,\n      );\n      this.refreshNodes();\n      return true;\n    }\n\n    return false;\n  }\n\n  /**\n   * Clone a node (creates a deep copy)\n   * @param nodeId - The ID of the node to clone\n   * @returns The cloned node, or null if node not found\n   */\n  cloneNode(nodeId: string): AXTreeViewNode | null {\n    const node = this.findNode(nodeId);\n    if (!node) {\n      return null;\n    }\n\n    return this.treeService.cloneNode(\n      node,\n      this.idField(),\n      this.titleField(),\n      this.tooltipField(),\n      this.iconField(),\n      this.expandedField(),\n      this.selectedField(),\n      this.indeterminateField(),\n      this.disabledField(),\n      this.hiddenField(),\n      this.childrenCountField(),\n      this.dataField(),\n      this.childrenField(),\n    );\n  }\n\n  /**\n   * Focus a specific node by ID\n   * @param nodeId - The ID of the node to focus\n   * @returns true if node was found and focused, false otherwise\n   */\n  focusNode(nodeId: string): boolean {\n    const node = this.findNode(nodeId);\n    if (!node || this.getNodeHidden(node) === true || this.isNodeEffectivelyDisabled(node)) {\n      return false;\n    }\n    this.focusNodeById(nodeId);\n    return true;\n  }\n\n  /**\n   * Get all expanded nodes\n   * @returns Array of expanded nodes\n   */\n  getExpandedNodes(): AXTreeViewNode[] {\n    const expanded: AXTreeViewNode[] = [];\n    const traverse = (nodes: AXTreeViewNode[]): void => {\n      for (const node of nodes) {\n        if (this.getNodeExpanded(node)) {\n          expanded.push(node);\n        }\n        const children = this.getNodeChildren(node);\n        if (children) {\n          traverse(children);\n        }\n      }\n    };\n    traverse(this.nodes());\n    return expanded;\n  }\n\n  /**\n   * Get all collapsed nodes that have children\n   * @returns Array of collapsed nodes with children\n   */\n  getCollapsedNodes(): AXTreeViewNode[] {\n    const collapsed: AXTreeViewNode[] = [];\n    const traverse = (nodes: AXTreeViewNode[]): void => {\n      for (const node of nodes) {\n        const children = this.getNodeChildren(node);\n        const childrenCount = this.getNodeChildrenCount(node);\n        if (!this.getNodeExpanded(node) && (children?.length || childrenCount)) {\n          collapsed.push(node);\n        }\n        if (children) {\n          traverse(children);\n        }\n      }\n    };\n    traverse(this.nodes());\n    return collapsed;\n  }\n\n  /**\n   * Check if a node is expanded\n   * @param nodeId - The ID of the node\n   * @returns true if node is expanded, false otherwise\n   */\n  isNodeExpanded(nodeId: string): boolean {\n    const node = this.findNode(nodeId);\n    return node ? this.getNodeExpanded(node) : false;\n  }\n\n  /**\n   * Check if a node is selected\n   * @param nodeId - The ID of the node\n   * @returns true if node is selected, false otherwise\n   */\n  isNodeSelected(nodeId: string): boolean {\n    const node = this.findNode(nodeId);\n    return node ? this.getNodeSelected(node) : false;\n  }\n\n  /**\n   * Check if a node has children\n   * @param nodeId - The ID of the node\n   * @returns true if node has children, false otherwise\n   */\n  hasChildren(nodeId: string): boolean {\n    const node = this.findNode(nodeId);\n    return this.treeService.hasChildren(node ?? {}, this.childrenField());\n  }\n\n  /**\n   * Check if a node is disabled (considering inheritance from parent nodes)\n   * @param nodeId - The ID of the node\n   * @returns true if node is disabled (directly or inherited), false otherwise\n   */\n  isDisabled(nodeId: string): boolean {\n    const node = this.findNode(nodeId);\n    return node ? this.isNodeEffectivelyDisabled(node) : false;\n  }\n\n  /**\n   * Get template context for a node\n   */\n  getTemplateContext(node: AXTreeViewNode, level = 0): AXTreeViewNodeTemplateContext {\n    const children = this.getNodeChildren(node);\n    const childrenCount = this.getNodeChildrenCount(node);\n    const showCheckbox = this.shouldShowCheckboxForNode(node);\n    const indeterminate = this.getNodeIndeterminate(node);\n    const selected = this.getNodeSelected(node);\n    const dragEnabled = this.dragBehavior() !== 'none';\n    const dragAreaValue = this.dragArea();\n    const showDragHandle = this.shouldShowDragHandle();\n\n    return {\n      $implicit: node,\n      node,\n      level,\n      expanded: this.getNodeExpanded(node),\n      childrenCount: childrenCount ?? children?.length ?? 0,\n      loading: this.getNodeLoading(node),\n      disabled: this.isNodeEffectivelyDisabled(node),\n      showCheckbox,\n      checkboxValue: indeterminate ? null : selected || false,\n      checkboxIndeterminate: indeterminate || false,\n      onCheckboxChange: (event: { value: boolean | null; isUserInteraction: boolean }) => {\n        // Create a proper AXValueChangedEvent for toggleSelection\n        const mockEvent: AXValueChangedEvent = {\n          component: this,\n          value: event.value,\n          isUserInteraction: event.isUserInteraction ?? true,\n        };\n        this.toggleSelection(node, mockEvent);\n      },\n      dragEnabled,\n      dragArea: dragAreaValue,\n      showDragHandle,\n    };\n  }\n\n  /**\n   * Calculate padding-inline for a node based on its level\n   */\n  getNodePaddingInline(level: number): number {\n    const indent = this.indentSize();\n    const currentLook = this.look();\n    const multiplier = currentLook === 'with-line' ? 1 / 3 : 1;\n    return level * indent * multiplier;\n  }\n\n  /**\n   * Check if node should show expand toggle\n   */\n  shouldShowExpandToggle(node: AXTreeViewNode): boolean {\n    return (\n      this.treeService.hasChildren(node, this.childrenField()) ||\n      this.treeService.canLazyLoad(node, this.isLazyDataSource(), this.childrenCountField(), this.childrenField())\n    );\n  }\n\n  /**\n   * Check if checkboxes should be shown (only for multiple mode)\n   */\n  shouldShowCheckbox(): boolean {\n    return this.selectMode() === 'multiple';\n  }\n\n  /**\n   * Check if double-click directive should be disabled for a node\n   * Disabled for leaf nodes (immediate clicks) or when isDoubleClickDisabled is true\n   */\n  protected isDoubleClickDisabledForNode(node: AXTreeViewNode): boolean {\n    return this.isDoubleClickDisabled() || this.isLeafNode(node);\n  }\n\n  /**\n   * Check if a node is a leaf (has no children)\n   * A node is a leaf if it has no loaded children AND no childrenCount (or childrenCount is 0)\n   */\n  isLeafNode(node: AXTreeViewNode): boolean {\n    const hasChildren = this.treeService.hasChildren(node, this.childrenField());\n    const childrenCount = this.getNodeChildrenCount(node);\n    const hasChildrenCount = childrenCount && childrenCount > 0;\n    const canLazyLoad = this.treeService.canLazyLoad(\n      node,\n      this.isLazyDataSource(),\n      this.childrenCountField(),\n      this.childrenField(),\n    );\n\n    // A node is a leaf if:\n    // 1. It has no loaded children\n    // 2. AND it has no childrenCount (or childrenCount is 0)\n    // 3. AND it cannot be lazy loaded\n    return !hasChildren && !hasChildrenCount && !canLazyLoad;\n  }\n\n  /**\n   * Check if a node can be selected (considering selectMode and isLeafOnlyMode)\n   */\n  canSelectNode(node: AXTreeViewNode): boolean {\n    if (this.selectMode() === 'none') {\n      return false;\n    }\n    if (this.isLeafOnlyMode()) {\n      return this.isLeafNode(node);\n    }\n    return true;\n  }\n\n  /**\n   * Check if checkbox should be shown for a specific node\n   */\n  shouldShowCheckboxForNode(node: AXTreeViewNode): boolean {\n    if (!this.shouldShowCheckbox()) {\n      return false;\n    }\n    if (this.isLeafOnlyMode()) {\n      return this.isLeafNode(node);\n    }\n    return true;\n  }\n\n  /**\n   * Generate unique list ID for each node\n   */\n  getListId(node?: AXTreeViewNode): string {\n    return this.treeService.getListId(node, this.idField());\n  }\n\n  /**\n   * Check if a node is currently focused\n   */\n  isNodeFocused(nodeId: string): boolean {\n    return this.focusedNodeId() === nodeId;\n  }\n\n  /**\n   * Get ARIA level for a node\n   */\n  getNodeAriaLevel(level: number): number {\n    return level + 1;\n  }\n\n  /**\n   * Get ARIA expanded state for a node\n   */\n  getNodeAriaExpanded(node: AXTreeViewNode): string | null {\n    if (!this.shouldShowExpandToggle(node)) {\n      return null;\n    }\n    return this.getNodeExpanded(node) ? 'true' : 'false';\n  }\n\n  /**\n   * Get ARIA selected state for a node\n   */\n  getNodeAriaSelected(node: AXTreeViewNode): string | null {\n    if (this.selectMode() === 'none') {\n      return null;\n    }\n    const selected = this.getNodeSelected(node);\n    if (this.selectMode() === 'single') {\n      return selected ? 'true' : 'false';\n    }\n    if (this.selectMode() === 'multiple') {\n      return selected ? 'true' : 'false';\n    }\n    return null;\n  }\n\n  /**\n   * Emit selection change event with all selected nodes\n   */\n  private emitSelectionChange(source: AXTreeViewSelectionSource = 'programmatic'): void {\n    const selectedNodes = this.getSelectedNodes();\n    const selectedIds = this.normalizeSelectedIdsForMode(\n      selectedNodes.map((node) => this.getNodeId(node)).filter(Boolean),\n    );\n    this.onSelectionChange.emit({\n      component: this,\n      selectedNodes,\n      selectedIds,\n      source,\n    });\n  }\n\n  //#region ---- Controlled selection ----\n\n  private bumpSelectionSyncRevision(): void {\n    this.selectionSyncRevision++;\n    if (this.pendingApplySelectedIdsTimeout !== undefined) {\n      clearTimeout(this.pendingApplySelectedIdsTimeout);\n      this.pendingApplySelectedIdsTimeout = undefined;\n    }\n  }\n\n  private isSelectionSyncCurrent(revision: number): boolean {\n    return revision === this.selectionSyncRevision;\n  }\n\n  private normalizeSelectedIdsForMode(ids: readonly string[]): string[] {\n    const filtered = ids.filter((id) => Boolean(id));\n    if (this.selectMode() === 'single') {\n      return filtered.length > 0 ? [filtered[filtered.length - 1]] : [];\n    }\n    return [...filtered];\n  }\n\n  private areSelectedIdsEqual(a: readonly string[], b: readonly string[]): boolean {\n    if (a.length !== b.length) {\n      return false;\n    }\n    return a.every((id, index) => id === b[index]);\n  }\n\n  private setSelectedIdsModel(ids: string[]): void {\n    const normalized = this.normalizeSelectedIdsForMode(ids);\n    if (this.areSelectedIdsEqual(normalized, this.selectedIds())) {\n      return;\n    }\n    this.isUpdatingSelectedIdsModel = true;\n    try {\n      this.selectedIds.set(normalized);\n    } finally {\n      this.isUpdatingSelectedIdsModel = false;\n    }\n  }\n\n  private syncSelectedIdsModelFromTree(source: AXTreeViewSelectionSource): void {\n    if (this.controlledSelection()) {\n      const normalized = this.normalizeSelectedIdsForMode(\n        this.getSelectedNodes()\n          .map((node) => this.getNodeId(node))\n          .filter(Boolean),\n      );\n      this.setSelectedIdsModel(normalized);\n    }\n    this.emitSelectionChange(source);\n  }\n\n  private scheduleApplySelectedIdsToTree(delayMs = 0): void {\n    if (!this.controlledSelection()) {\n      return;\n    }\n    if (this.pendingApplySelectedIdsTimeout !== undefined) {\n      clearTimeout(this.pendingApplySelectedIdsTimeout);\n    }\n    const revision = this.selectionSyncRevision;\n    this.pendingApplySelectedIdsTimeout = setTimeout(() => {\n      this.pendingApplySelectedIdsTimeout = undefined;\n      if (!this.isSelectionSyncCurrent(revision)) {\n        return;\n      }\n      this.applySelectedIdsToTree(revision);\n      const ids = this.normalizeSelectedIdsForMode(this.selectedIds());\n      const allSynced =\n        ids.length === 0 ||\n        ids.every((id) => {\n          const node = this.findNode(id);\n          return node !== null && this.getNodeSelected(node);\n        });\n      if (!allSynced && ids.length > 0) {\n        this.scheduleApplySelectedIdsToTree(50);\n      }\n    }, delayMs);\n  }\n\n  private applySelectedIdsToTree(revision: number): void {\n    if (!this.isSelectionSyncCurrent(revision) || !this.controlledSelection()) {\n      return;\n    }\n\n    const ids = this.normalizeSelectedIdsForMode(this.selectedIds());\n    const mode = this.selectMode();\n\n    if (ids.length === 0 || mode === 'none') {\n      this.treeService.deselectAllNodes(\n        this.nodes(),\n        this.selectedField(),\n        this.indeterminateField(),\n        this.childrenField(),\n      );\n      this.refreshNodes();\n      return;\n    }\n\n    if (mode === 'single') {\n      const id = ids[0];\n      const node = this.findNode(id);\n      if (!node) {\n        return;\n      }\n      if (this.getNodeSelected(node)) {\n        return;\n      }\n      this.treeService.deselectAllNodes(\n        this.nodes(),\n        this.selectedField(),\n        this.indeterminateField(),\n        this.childrenField(),\n      );\n      this.setNodeSelected(node, true);\n      this.setNodeIndeterminate(node, false);\n      this.refreshNodes();\n      return;\n    }\n\n    this.treeService.deselectAllNodes(\n      this.nodes(),\n      this.selectedField(),\n      this.indeterminateField(),\n      this.childrenField(),\n    );\n\n    for (const id of ids) {\n      const node = this.findNode(id);\n      if (!node || !this.canSelectNode(node) || this.isNodeEffectivelyDisabled(node)) {\n        continue;\n      }\n      this.setNodeSelected(node, true);\n      this.setNodeIndeterminate(node, false);\n      const children = this.getNodeChildren(node);\n      if (this.cascadesToChildren() && children && !this.isLeafOnlyMode()) {\n        this.treeService.selectAllChildren(\n          children,\n          true,\n          this.selectedField(),\n          this.indeterminateField(),\n          this.childrenField(),\n        );\n      }\n    }\n\n    if (this.hasIntermediateState() && !this.isLeafOnlyMode()) {\n      this.treeService.updateAllParentStates(\n        this.nodes(),\n        this.hasIntermediateState(),\n        this.childrenField(),\n        this.selectedField(),\n        this.indeterminateField(),\n      );\n    }\n\n    this.refreshNodes();\n  }\n\n  private async applySelectedIdsToTreeWithRetry(revision: number): Promise<void> {\n    for (let attempt = 0; attempt < 8; attempt++) {\n      if (!this.isSelectionSyncCurrent(revision)) {\n        return;\n      }\n      this.applySelectedIdsToTree(revision);\n      const ids = this.normalizeSelectedIdsForMode(this.selectedIds());\n      const allSynced =\n        ids.length === 0 ||\n        ids.every((id) => {\n          const node = this.findNode(id);\n          return node !== null && this.getNodeSelected(node);\n        });\n      if (allSynced) {\n        return;\n      }\n      await new Promise((resolve) => setTimeout(resolve, 50));\n    }\n  }\n\n  private async expandAncestorPaths(paths: string[][], revision: number): Promise<void> {\n    const ancestorDepths = new Map<string, number>();\n    for (const path of paths) {\n      path.forEach((ancestorId, depth) => {\n        const existing = ancestorDepths.get(ancestorId);\n        if (existing === undefined || depth < existing) {\n          ancestorDepths.set(ancestorId, depth);\n        }\n      });\n    }\n\n    const sortedAncestors = Array.from(ancestorDepths.entries())\n      .sort((a, b) => a[1] - b[1])\n      .map(([id]) => id);\n\n    for (const ancestorId of sortedAncestors) {\n      if (!this.isSelectionSyncCurrent(revision)) {\n        return;\n      }\n      if (!this.isNodeExpanded(ancestorId)) {\n        await this.expandNode(ancestorId);\n      }\n    }\n  }\n\n  //#endregion\n\n  // ==================== Event Handlers ====================\n\n  /**\n   * Handle node double click\n   */\n  async onNodeDoubleClickHandle(node: AXTreeViewNode, event: Event): Promise<void> {\n    if (this.isNodeEffectivelyDisabled(node)) return;\n\n    // If expandOnDoubleClick is enabled and node has children, toggle expansion\n    if (this.expandOnDoubleClick() && this.shouldShowExpandToggle(node)) {\n      await this.toggleNodeExpansion(node[this.idField()] as string);\n    }\n\n    this.onNodeDoubleClick.emit({\n      component: this,\n      node,\n      nativeEvent: event,\n    });\n  }\n  /**\n   * Handle node click handle\n   */\n  onNodeClickHandle(node: AXTreeViewNode, event: Event): void {\n    if (this.isNodeEffectivelyDisabled(node)) return;\n\n    const mode = this.selectMode();\n\n    this.activeNodeId.set(this.getNodeId(node));\n    if (mode === 'single' && this.canSelectNode(node)) {\n      this.handleSingleSelection(node, event);\n    } else if (mode === 'multiple' && this.canSelectNode(node)) {\n      this.handleMultipleSelection(node, event);\n    }\n\n    this.onNodeClick.emit({ component: this, node, nativeEvent: event });\n  }\n\n  /**\n   * Toggle node expansion state with lazy loading support\n   * Note: Disabled nodes can still be toggled (expanded/collapsed) for better UX\n   */\n  async toggleNode(node: AXTreeViewNode, event: Event): Promise<void> {\n    if (this.isEvent(event) && typeof event.stopPropagation === 'function') {\n      event.stopPropagation();\n    }\n\n    const hasChildren = this.treeService.hasChildren(node, this.childrenField());\n    const canLazyLoad = this.treeService.canLazyLoad(\n      node,\n      this.isLazyDataSource(),\n      this.childrenCountField(),\n      this.childrenField(),\n    );\n\n    if (hasChildren || canLazyLoad) {\n      const willExpand = !this.getNodeExpanded(node);\n\n      if (willExpand && canLazyLoad) {\n        await this.loadNodeChildren(node);\n      }\n\n      this.setNodeExpanded(node, willExpand);\n      this.refreshNodes();\n      this.onNodeToggle.emit({ component: this, node, nativeEvent: event });\n    }\n  }\n\n  /**\n   * Toggle node selection state with indeterminate support (for multiple mode)\n   */\n  toggleSelection(node: AXTreeViewNode, event: AXValueChangedEvent): void {\n    if (!event.isUserInteraction) return;\n    if (this.selectMode() === 'none') return;\n    if (!this.canSelectNode(node)) return;\n\n    const mode = this.selectMode();\n    if (mode !== 'multiple') return;\n\n    const newValue = event.value === null ? true : event.value;\n    this.setNodeSelected(node, newValue);\n    this.setNodeIndeterminate(node, false);\n\n    const children = this.getNodeChildren(node);\n    if (this.cascadesToChildren() && children && !this.isLeafOnlyMode()) {\n      this.treeService.selectAllChildren(\n        children,\n        newValue,\n        this.selectedField(),\n        this.indeterminateField(),\n        this.childrenField(),\n      );\n    }\n\n    if (this.hasIntermediateState() && !this.isLeafOnlyMode()) {\n      this.treeService.updateParentStates(\n        this.nodes(),\n        node,\n        this.hasIntermediateState(),\n        this.idField(),\n        this.childrenField(),\n        this.selectedField(),\n        this.indeterminateField(),\n      );\n    }\n\n    this.refreshNodes();\n    this.onNodeSelect.emit({\n      component: this,\n      node,\n      isUserInteraction: event.isUserInteraction,\n    });\n    this.syncSelectedIdsModelFromTree(event.isUserInteraction ? 'user' : 'programmatic');\n  }\n\n  /**\n   * Handle drop events for tree nodes\n   */\n  onDrop(event: AXDropListDroppedEvent, parentNode?: AXTreeViewNode): void {\n    const targetArray = parentNode ? (this.getNodeChildren(parentNode) ?? []) : this.nodes();\n    const isReordering = event.previousContainer === event.container;\n\n    if (isReordering) {\n      this.handleReorder(event, targetArray, parentNode);\n    } else {\n      this.handleMove(event, targetArray, parentNode);\n    }\n\n    this.refreshNodes();\n  }\n\n  /**\n   * Handle drop events when dropping directly onto a node (to make it a child)\n   */\n  onDropOntoNode(event: AXDropListDroppedEvent, targetNode: AXTreeViewNode): void {\n    if (!this.canMoveToParent()) return;\n\n    const sourceListId = event.previousContainer.element.id;\n    const sourceArray = this.getArrayByListId(sourceListId);\n    if (!sourceArray) return;\n\n    const movedNode = sourceArray[event.previousIndex];\n\n    if (!this.treeService.isValidDropTarget(movedNode, targetNode, this.idField(), this.childrenField())) return;\n    if (!this.emitBeforeDropEvent(movedNode, sourceListId, targetNode, event.previousIndex, 0)) return;\n\n    let targetChildren = this.getNodeChildren(targetNode);\n    if (!targetChildren) {\n      targetChildren = [];\n      this.setNodeChildren(targetNode, targetChildren);\n    }\n    sourceArray.splice(event.previousIndex, 1);\n    targetChildren.unshift(movedNode);\n    this.setNodeExpanded(targetNode, true);\n\n    this.emitDropEvents(movedNode, this.findParentByListId(sourceListId), targetNode, event.previousIndex, 0, false);\n\n    this.refreshNodes();\n  }\n\n  /**\n   * Handle node focus event\n   */\n  onNodeFocus(nodeId: string): void {\n    this.focusedNodeId.set(nodeId);\n  }\n\n  /**\n   * Handle tree container focus - focus first node if none is focused\n   */\n  onTreeFocus(event: FocusEvent): void {\n    if (event.target === event.currentTarget) {\n      const flatList = this.treeService.buildFlatNodeList(\n        this.nodes(),\n        this.hiddenField(),\n        this.disabledField(),\n        this.expandedField(),\n        this.childrenField(),\n      );\n      if (flatList.length > 0) {\n        const focusedId = this.focusedNodeId();\n        if (focusedId) {\n          // Check if the focused node still exists and is not hidden\n          const focusedNode = this.treeService.findNodeById(\n            this.nodes(),\n            focusedId,\n            this.idField(),\n            this.childrenField(),\n          );\n          if (focusedNode && this.getNodeHidden(focusedNode) !== true) {\n            this.focusNodeById(focusedId);\n          } else {\n            // Focused node no longer exists, focus first node\n            this.focusNodeById(this.getNodeId(flatList[0].node));\n          }\n        } else {\n          // No node is focused, focus first node\n          this.focusNodeById(this.getNodeId(flatList[0].node));\n        }\n      }\n    }\n  }\n\n  /**\n   * Handle tree container blur\n   */\n  onTreeBlur(event: FocusEvent): void {\n    if (event.relatedTarget && !(event.currentTarget as HTMLElement).contains(event.relatedTarget as Node)) {\n      this.focusedNodeId.set(null);\n    }\n  }\n\n  /**\n   * Handle keyboard navigation\n   */\n  handleKeyDown(event: KeyboardEvent): void {\n    const flatList = this.treeService.buildFlatNodeList(\n      this.nodes(),\n      this.hiddenField(),\n      this.disabledField(),\n      this.expandedField(),\n      this.childrenField(),\n    );\n    if (flatList.length === 0) return;\n\n    const currentFocused = this.getFocusedNode();\n    let currentIndex = currentFocused\n      ? flatList.findIndex((item) => this.getNodeId(item.node) === this.getNodeId(currentFocused))\n      : -1;\n\n    if (currentIndex === -1 && event.target === event.currentTarget) {\n      currentIndex = 0;\n    }\n\n    const navigationResult = this.handleNavigationKey(event, flatList, currentIndex, currentFocused);\n    if (navigationResult.handled) {\n      if (navigationResult.shouldPreventDefault) {\n        event.preventDefault();\n        event.stopPropagation();\n      }\n      if (\n        navigationResult.targetIndex !== null &&\n        navigationResult.targetIndex >= 0 &&\n        navigationResult.targetIndex < flatList.length\n      ) {\n        this.focusNodeById(this.getNodeId(flatList[navigationResult.targetIndex].node));\n      }\n    }\n  }\n\n  // ==================== Private Methods ====================\n  /**\n   * Load root items when datasource is a function\n   */\n  private async loadRootItems(loadFn: AXTreeViewCallback): Promise<void> {\n    try {\n      const result = loadFn();\n      const rootNodes = result instanceof Promise ? await result : result;\n      this.nodes.set(rootNodes);\n      if (this.controlledSelection()) {\n        this.scheduleApplySelectedIdsToTree(0);\n      }\n    } catch (error: unknown) {\n      this.handleError('Failed to load root items', error);\n      this.nodes.set([]);\n    }\n  }\n\n  /**\n   * Load children for a node using lazy loading\n   * Only calls callback if:\n   * - children field is undefined or empty\n   * - AND childrenCount > 0\n   */\n  private async loadNodeChildren(node: AXTreeViewNode): Promise<void> {\n    const nodeId = this.getNodeId(node);\n    if (!this.isLazyDataSource() || this.loadingNodes().has(nodeId)) return;\n\n    // If children are already loaded, don't call callback\n    const existingChildren = this.getNodeChildren(node);\n    if (existingChildren && existingChildren.length > 0) {\n      return;\n    }\n\n    // Only call callback if childrenCount > 0\n    const childrenCount = this.getNodeChildrenCount(node);\n    if (!childrenCount || childrenCount <= 0) {\n      return;\n    }\n\n    const ds = this.datasource();\n    if (typeof ds !== 'function') return;\n\n    try {\n      this.loadingNodes.update((set) => new Set(set).add(nodeId));\n      this.refreshNodes();\n\n      const result = ds(nodeId);\n      const children = result instanceof Promise ? await result : result;\n      this.setNodeChildren(node, children);\n      this.setNodeChildrenCount(node, children.length);\n    } catch (error: unknown) {\n      this.handleError('Failed to load children', error);\n      this.setNodeChildrenCount(node, 0);\n    } finally {\n      this.loadingNodes.update((set) => {\n        const newSet = new Set(set);\n        newSet.delete(nodeId);\n        return newSet;\n      });\n      this.refreshNodes();\n      if (this.controlledSelection()) {\n        this.scheduleApplySelectedIdsToTree(0);\n      }\n    }\n  }\n\n  /**\n   * Internal method to refresh nodes signal and sync back to datasource if it's an array\n   * Creates new array references for all nested children to ensure reactivity\n   */\n  private refreshNodes(): void {\n    const currentNodes = this.nodes();\n    // Create new array references for all nested children to ensure reactivity\n    // This ensures Angular's change detection picks up changes even with callback datasource\n    this.ensureNewArrayReferences(currentNodes);\n    this.nodes.set([...currentNodes]);\n\n    if (!this.isLazyDataSource() && !this.isUpdatingFromDatasource) {\n      this.isUpdatingFromDatasource = true;\n      this.datasource.set([...currentNodes]);\n      setTimeout(() => {\n        this.isUpdatingFromDatasource = false;\n      }, 0);\n    }\n  }\n\n  /**\n   * Recursively ensure all children arrays have new references to trigger change detection\n   * Mutates the tree structure by replacing children arrays with new array references\n   */\n  private ensureNewArrayReferences(nodes: AXTreeViewNode[]): void {\n    for (const node of nodes) {\n      const children = this.getNodeChildren(node);\n      if (children && children.length > 0) {\n        // Create new array reference for children\n        this.setNodeChildren(node, [...children]);\n        // Recursively process nested children\n        this.ensureNewArrayReferences(children);\n      }\n    }\n  }\n\n  /**\n   * Handle single selection mode\n   */\n  private handleSingleSelection(node: AXTreeViewNode, event: Event): void {\n    if (this.controlledSelection()) {\n      this.bumpSelectionSyncRevision();\n    }\n\n    this.treeService.deselectAllNodes(\n      this.nodes(),\n      this.selectedField(),\n      this.indeterminateField(),\n      this.childrenField(),\n    );\n    this.setNodeSelected(node, true);\n    this.setNodeIndeterminate(node, false);\n    this.refreshNodes();\n    this.onNodeSelect.emit({\n      component: this,\n      node,\n      nativeEvent: event,\n      isUserInteraction: true,\n    });\n    this.syncSelectedIdsModelFromTree('user');\n  }\n\n  /**\n   * Handle multiple selection mode (used internally, but in multiple mode selection is primarily handled by checkboxes)\n   */\n  private handleMultipleSelection(node: AXTreeViewNode, event: Event): void {\n    const newValue = !this.getNodeSelected(node);\n    this.setNodeSelected(node, newValue);\n    this.setNodeIndeterminate(node, false);\n\n    const children = this.getNodeChildren(node);\n    if (this.cascadesToChildren() && children && !this.isLeafOnlyMode()) {\n      this.treeService.selectAllChildren(\n        children,\n        newValue,\n        this.selectedField(),\n        this.indeterminateField(),\n        this.childrenField(),\n      );\n    }\n\n    if (this.hasIntermediateState() && !this.isLeafOnlyMode()) {\n      this.treeService.updateParentStates(\n        this.nodes(),\n        node,\n        this.hasIntermediateState(),\n        this.idField(),\n        this.childrenField(),\n        this.selectedField(),\n        this.indeterminateField(),\n      );\n    }\n\n    this.refreshNodes();\n    this.onNodeSelect.emit({\n      component: this,\n      node,\n      nativeEvent: event,\n      isUserInteraction: true,\n    });\n    this.syncSelectedIdsModelFromTree('user');\n  }\n\n  /**\n   * Get array reference by drop list ID\n   */\n  private getArrayByListId(listId: string): AXTreeViewNode[] | null {\n    return this.treeService.getArrayByListId(this.nodes(), listId, this.idField(), this.childrenField());\n  }\n\n  /**\n   * Find parent node by list ID\n   */\n  private findParentByListId(listId: string): AXTreeViewNode | undefined {\n    return this.treeService.findParentByListId(this.nodes(), listId, this.idField(), this.childrenField());\n  }\n\n  /**\n   * Check if move operation is allowed based on dragBehavior\n   */\n  private canMoveToParent(): boolean {\n    const behavior = this.dragBehavior();\n    return behavior !== 'none' && behavior !== 'order-only';\n  }\n\n  /**\n   * Check if reorder operation is allowed based on dragBehavior\n   */\n  private canReorder(): boolean {\n    const behavior = this.dragBehavior();\n    return behavior !== 'none' && behavior !== 'move';\n  }\n\n  /**\n   * Handle reordering within the same list   */\n  private handleReorder(\n    event: AXDropListDroppedEvent,\n    targetArray: AXTreeViewNode[],\n    parentNode?: AXTreeViewNode,\n  ): void {\n    if (!this.canReorder()) return;\n\n    const movedNode = targetArray[event.previousIndex];\n    moveItemInArray(targetArray, event.previousIndex, event.currentIndex);\n\n    this.emitDropEvents(movedNode, parentNode, parentNode, event.previousIndex, event.currentIndex, true);\n  }\n\n  /**\n   * Handle moving between different lists\n   */\n  private handleMove(event: AXDropListDroppedEvent, targetArray: AXTreeViewNode[], parentNode?: AXTreeViewNode): void {\n    if (!this.canMoveToParent()) return;\n\n    const sourceListId = event.previousContainer.element.id;\n    const sourceArray = this.getArrayByListId(sourceListId);\n    if (!sourceArray) return;\n\n    const movedNode = sourceArray[event.previousIndex];\n\n    if (parentNode && !this.treeService.isValidDropTarget(movedNode, parentNode)) return;\n\n    if (!this.emitBeforeDropEvent(movedNode, sourceListId, parentNode, event.previousIndex, event.currentIndex)) {\n      return;\n    }\n\n    transferArrayItem(sourceArray, targetArray, event.previousIndex, event.currentIndex);\n\n    this.emitDropEvents(\n      movedNode,\n      this.findParentByListId(sourceListId),\n      parentNode,\n      event.previousIndex,\n      event.currentIndex,\n      false,\n    );\n  }\n\n  /**\n   * Emit beforeDrop event and return whether to continue\n   */\n  private emitBeforeDropEvent(\n    movedNode: AXTreeViewNode,\n    sourceListId: string,\n    currentParent: AXTreeViewNode | undefined,\n    previousIndex: number,\n    currentIndex: number,\n  ): boolean {\n    const beforeDropEvent: AXTreeViewBeforeDropEvent = {\n      component: this,\n      movedNode,\n      previousParent: this.findParentByListId(sourceListId),\n      currentParent,\n      previousIndex,\n      currentIndex,\n      canceled: false,\n    };\n    this.onBeforeDrop.emit(beforeDropEvent);\n\n    return !beforeDropEvent.canceled;\n  }\n\n  /**\n   * Emit drop events based on operation type\n   */\n  private emitDropEvents(\n    node: AXTreeViewNode,\n    previousParent: AXTreeViewNode | undefined,\n    currentParent: AXTreeViewNode | undefined,\n    previousIndex: number,\n    currentIndex: number,\n    isReorder: boolean,\n  ): void {\n    const dropEvent: AXTreeViewDropEvent = {\n      component: this,\n      node,\n      previousParent,\n      currentParent,\n      previousIndex,\n      currentIndex,\n    };\n\n    if (isReorder) {\n      this.onOrderChange.emit(dropEvent);\n    } else {\n      this.onMoveChange.emit(dropEvent);\n    }\n    this.onItemsChange.emit(dropEvent);\n  }\n\n  /**\n   * Get the currently focused node\n   */\n  private getFocusedNode(): AXTreeViewNode | null {\n    const focusedId = this.focusedNodeId();\n    if (!focusedId) return null;\n    return this.treeService.findNodeById(this.nodes(), focusedId, this.idField(), this.childrenField());\n  }\n\n  /**\n   * Set focus to a node by ID\n   */\n  private focusNodeById(nodeId: string): void {\n    this.focusedNodeId.set(nodeId);\n    setTimeout(() => {\n      const element = document.querySelector<HTMLElement>(`[data-tree-node-id=\"${nodeId}\"]`);\n      if (element) {\n        element.focus();\n        element.scrollIntoView({ block: 'nearest', behavior: 'smooth' });\n      }\n    }, 0);\n  }\n\n  /**\n   * Handle keyboard navigation keys\n   */\n  private handleNavigationKey(\n    event: KeyboardEvent,\n    flatList: AXTreeViewFlatNode[],\n    currentIndex: number,\n    currentFocused: AXTreeViewNode | null,\n  ): { handled: boolean; shouldPreventDefault: boolean; targetIndex: number | null } {\n    let targetIndex: number | null = currentIndex;\n    let shouldPreventDefault = true;\n    let handled = true;\n\n    switch (event.key) {\n      case 'ArrowUp':\n        if (currentIndex > 0) {\n          targetIndex = currentIndex - 1;\n        } else {\n          shouldPreventDefault = false;\n        }\n        break;\n\n      case 'ArrowDown':\n        if (currentIndex < flatList.length - 1) {\n          targetIndex = currentIndex + 1;\n        } else if (currentIndex === -1) {\n          targetIndex = 0;\n        } else {\n          shouldPreventDefault = false;\n        }\n        break;\n\n      case 'ArrowLeft':\n        if (currentFocused) {\n          if (this.getNodeExpanded(currentFocused) && this.shouldShowExpandToggle(currentFocused)) {\n            this.toggleNode(currentFocused, event);\n            return { handled: true, shouldPreventDefault: true, targetIndex: null };\n          } else {\n            const currentItem = flatList[currentIndex];\n            if (currentItem?.parent) {\n              targetIndex = flatList.findIndex(\n                (item) => this.getNodeId(item.node) === this.getNodeId(currentItem.parent),\n              );\n            } else {\n              shouldPreventDefault = false;\n            }\n          }\n        } else {\n          shouldPreventDefault = false;\n        }\n        break;\n\n      case 'ArrowRight':\n        if (currentFocused) {\n          if (!this.getNodeExpanded(currentFocused) && this.shouldShowExpandToggle(currentFocused)) {\n            this.toggleNode(currentFocused, event);\n            return { handled: true, shouldPreventDefault: true, targetIndex: null };\n          } else if (\n            this.getNodeExpanded(currentFocused) &&\n            this.treeService.hasChildren(currentFocused, this.childrenField())\n          ) {\n            const children = this.getNodeChildren(currentFocused);\n            if (children && children.length > 0) {\n              const firstChild = children[0];\n              targetIndex = flatList.findIndex((item) => this.getNodeId(item.node) === this.getNodeId(firstChild));\n              if (targetIndex === -1) {\n                const updatedFlatList = this.treeService.buildFlatNodeList(\n                  this.nodes(),\n                  this.hiddenField(),\n                  this.disabledField(),\n                  this.expandedField(),\n                  this.childrenField(),\n                );\n                targetIndex = updatedFlatList.findIndex(\n                  (item) => this.getNodeId(item.node) === this.getNodeId(firstChild),\n                );\n                if (targetIndex >= 0 && targetIndex < updatedFlatList.length) {\n                  this.focusNodeById(this.getNodeId(updatedFlatList[targetIndex].node));\n                  return { handled: true, shouldPreventDefault: true, targetIndex: null };\n                }\n              }\n            } else {\n              shouldPreventDefault = false;\n            }\n          } else {\n            shouldPreventDefault = false;\n          }\n        } else {\n          shouldPreventDefault = false;\n        }\n        break;\n\n      case 'Home':\n        targetIndex = 0;\n        break;\n\n      case 'End':\n        targetIndex = flatList.length - 1;\n        break;\n\n      case ' ':\n      case 'Space':\n        if (currentFocused && this.selectMode() !== 'none' && this.canSelectNode(currentFocused)) {\n          event.preventDefault();\n          this.handleSpaceKeySelection(currentFocused, event);\n          return { handled: true, shouldPreventDefault: true, targetIndex: null };\n        }\n        shouldPreventDefault = false;\n        break;\n\n      case 'Enter':\n        if (currentFocused && this.canSelectNode(currentFocused)) {\n          event.preventDefault();\n          this.handleEnterKeySelection(currentFocused, event);\n          return { handled: true, shouldPreventDefault: true, targetIndex: null };\n        }\n        shouldPreventDefault = false;\n        break;\n\n      default:\n        if ((event.ctrlKey || event.metaKey) && event.key === 'Enter') {\n          if (currentFocused && this.selectMode() === 'multiple' && this.canSelectNode(currentFocused)) {\n            event.preventDefault();\n            this.handleCtrlEnterSelection(currentFocused, event);\n            return { handled: true, shouldPreventDefault: true, targetIndex: null };\n          }\n        }\n        handled = false;\n        shouldPreventDefault = false;\n        break;\n    }\n\n    return { handled, shouldPreventDefault, targetIndex };\n  }\n\n  /**\n   * Handle Space key selection\n   * In single mode: replaces selection (deselects all, selects this node)\n   * In multiple mode: toggles selection\n   */\n  private handleSpaceKeySelection(node: AXTreeViewNode, event: KeyboardEvent): void {\n    if (!this.canSelectNode(node)) return;\n\n    const mode = this.selectMode();\n\n    if (mode === 'single') {\n      // Single mode: replace selection\n      this.treeService.deselectAllNodes(\n        this.nodes(),\n        this.selectedField(),\n        this.indeterminateField(),\n        this.childrenField(),\n      );\n      this.setNodeSelected(node, true);\n      this.setNodeIndeterminate(node, false);\n    } else {\n      // Multiple mode: toggle selection\n      const newValue = !this.getNodeSelected(node);\n      this.setNodeSelected(node, newValue);\n      this.setNodeIndeterminate(node, false);\n\n      const children = this.getNodeChildren(node);\n      if (this.cascadesToChildren() && children && !this.isLeafOnlyMode()) {\n        this.treeService.selectAllChildren(\n          children,\n          newValue,\n          this.selectedField(),\n          this.indeterminateField(),\n          this.childrenField(),\n        );\n      }\n\n      if (this.hasIntermediateState() && !this.isLeafOnlyMode()) {\n        this.treeService.updateParentStates(\n          this.nodes(),\n          node,\n          this.hasIntermediateState(),\n          this.idField(),\n          this.childrenField(),\n          this.selectedField(),\n          this.indeterminateField(),\n        );\n      }\n    }\n\n    this.refreshNodes();\n    this.onNodeSelect.emit({\n      component: this,\n      node,\n      nativeEvent: event,\n      isUserInteraction: true,\n    });\n    this.syncSelectedIdsModelFromTree('user');\n  }\n\n  /**\n   * Handle Enter key selection\n   * In single mode: replaces selection (deselects all, selects this node)\n   * In multiple mode: replaces selection (deselects all, selects this node and respects selectionBehavior)\n   */\n  private handleEnterKeySelection(node: AXTreeViewNode, event: KeyboardEvent): void {\n    if (!this.canSelectNode(node)) return;\n\n    const mode = this.selectMode();\n\n    // Enter key always replaces selection (deselects all first)\n    this.treeService.deselectAllNodes(\n      this.nodes(),\n      this.selectedField(),\n      this.indeterminateField(),\n      this.childrenField(),\n    );\n    this.setNodeSelected(node, true);\n    this.setNodeIndeterminate(node, false);\n\n    if (mode === 'multiple') {\n      const children = this.getNodeChildren(node);\n      // Respect selectionBehavior: cascade to children if enabled\n      if (this.cascadesToChildren() && children && !this.isLeafOnlyMode()) {\n        this.treeService.selectAllChildren(\n          children,\n          true,\n          this.selectedField(),\n          this.indeterminateField(),\n          this.childrenField(),\n        );\n      }\n      // Respect selectionBehavior: update parent states if intermediate mode\n      if (this.hasIntermediateState() && !this.isLeafOnlyMode()) {\n        this.treeService.updateParentStates(\n          this.nodes(),\n          node,\n          this.hasIntermediateState(),\n          this.idField(),\n          this.childrenField(),\n          this.selectedField(),\n          this.indeterminateField(),\n        );\n      }\n    }\n\n    this.refreshNodes();\n    this.onNodeSelect.emit({\n      component: this,\n      node,\n      nativeEvent: event,\n      isUserInteraction: true,\n    });\n    this.syncSelectedIdsModelFromTree('user');\n  }\n\n  /**\n   * Handle Ctrl/Cmd + Enter key selection\n   */\n  private handleCtrlEnterSelection(node: AXTreeViewNode, event: KeyboardEvent): void {\n    if (!this.canSelectNode(node)) return;\n\n    const newValue = !this.getNodeSelected(node);\n    this.setNodeSelected(node, newValue);\n    this.setNodeIndeterminate(node, false);\n\n    const children = this.getNodeChildren(node);\n    if (this.cascadesToChildren() && children && !this.isLeafOnlyMode()) {\n      this.treeService.selectAllChildren(\n        children,\n        newValue,\n        this.selectedField(),\n        this.indeterminateField(),\n        this.childrenField(),\n      );\n    }\n\n    if (this.hasIntermediateState() && !this.isLeafOnlyMode()) {\n      this.treeService.updateParentStates(\n        this.nodes(),\n        node,\n        this.hasIntermediateState(),\n        this.idField(),\n        this.childrenField(),\n        this.selectedField(),\n        this.indeterminateField(),\n      );\n    }\n\n    this.refreshNodes();\n    this.onNodeSelect.emit({\n      component: this,\n      node,\n      nativeEvent: event,\n      isUserInteraction: true,\n    });\n    this.syncSelectedIdsModelFromTree('user');\n  }\n\n  /**\n   * Type guard to check if value is an Event\n   */\n  private isEvent(value: unknown): value is Event {\n    return value instanceof Event;\n  }\n\n  /**\n   * Handle errors consistently\n   */\n  private handleError(message: string, error: unknown): void {\n    if (error instanceof Error) {\n      console.error(`${message}:`, error.message);\n    } else {\n      console.error(`${message}:`, error);\n    }\n  }\n}\n","<!-- Root loading skeleton -->\n@if (isLoading()) {\n  <div class=\"ax-tree-view-drop-list\">\n    @for (item of [1, 2, 3, 4, 5, 6, 7]; track item) {\n      <div class=\"ax-tree-view-node\">\n        <div class=\"ax-tree-view-node-content\">\n          <ax-skeleton class=\"ax-tree-view-skeleton-toggle\"></ax-skeleton>\n          <ax-skeleton class=\"ax-tree-view-skeleton-label\"></ax-skeleton>\n        </div>\n      </div>\n    }\n  </div>\n}\n\n<!-- Root drop list -->\n<div\n  axFocusTrap\n  [axDropList]=\"dragBehavior() !== 'none'\"\n  [sortingDisabled]=\"false\"\n  [id]=\"getListId()\"\n  [attr.data-node-id]=\"null\"\n  dropListGroup=\"ax-tree-view-nodes\"\n  (dropListDropped)=\"onDrop($event)\"\n  class=\"ax-tree-view-drop-list\"\n  [class.ax-tree-view-card]=\"look() === 'card'\"\n  [class.ax-tree-view-with-lines]=\"look() === 'with-line'\"\n  [class.ax-tree-view-loading]=\"isLoading()\"\n  role=\"group\"\n>\n  @for (node of nodes(); track getNodeId(node)) {\n    @if (getNodeHidden(node) !== true) {\n      <div\n        [axDrag]=\"dragBehavior() !== 'none'\"\n        [dragDisabled]=\"isNodeEffectivelyDisabled(node)\"\n        [dragData]=\"node\"\n        class=\"ax-tree-view-node\"\n        [class.ax-tree-view-node-active]=\"activeNodeId() === getNodeId(node)\"\n        [class.ax-tree-view-node-selected]=\"getNodeSelected(node)\"\n        [class.ax-tree-view-node-disabled]=\"isNodeEffectivelyDisabled(node)\"\n        [class.ax-tree-view-node-loading]=\"getNodeLoading(node)\"\n        [class.ax-tree-view-node-focused]=\"isNodeFocused(getNodeId(node))\"\n        [class.ax-state-alternate]=\"isAlternateNode(node)\"\n        role=\"treeitem\"\n        [attr.aria-level]=\"getNodeAriaLevel(0)\"\n        [attr.aria-expanded]=\"getNodeAriaExpanded(node)\"\n        [attr.aria-selected]=\"getNodeAriaSelected(node)\"\n        [attr.aria-disabled]=\"\n          isNodeEffectivelyDisabled(node) || (isLeafOnlyMode() && !isLeafNode(node)) ? 'true' : null\n        \"\n      >\n        <div\n          class=\"ax-tree-view-node-content\"\n          [axDropList]=\"dragBehavior() !== 'none'\"\n          [id]=\"'ax-tree-view-node-drop-' + getNodeId(node)\"\n          [attr.data-node-id]=\"getNodeId(node)\"\n          [attr.data-tree-node-id]=\"getNodeId(node)\"\n          [attr.data-drop-type]=\"'onto-node'\"\n          dropListGroup=\"ax-tree-view-nodes\"\n          (dropListDropped)=\"onDropOntoNode($event, node)\"\n          axDoubleClick\n          [duration]=\"doubleClickDuration()\"\n          [disabled]=\"isDoubleClickDisabledForNode(node)\"\n          (onClick)=\"onNodeClickHandle(node, $event)\"\n          (onDblClick)=\"onNodeDoubleClickHandle(node, $event)\"\n          (focus)=\"onNodeFocus(getNodeId(node))\"\n          (blur)=\"focusedNodeId.set(null)\"\n          [tabindex]=\"isNodeFocused(getNodeId(node)) ? 0 : -1\"\n        >\n          @if (shouldShowDragHandle()) {\n            <span\n              class=\"ax-tree-view-drag-handle\"\n              axDragHandle\n              title=\"Drag to reorder\"\n              (click)=\"$event.stopPropagation()\"\n            >\n              ⋮⋮\n            </span>\n          }\n          <ax-button\n            look=\"link\"\n            class=\"ax-tree-view-expand-toggle ax-sm\"\n            (onClick)=\"toggleNode(node, $any($event))\"\n            (click)=\"$event.stopPropagation()\"\n            [class.ax-tree-view-has-children]=\"shouldShowExpandToggle(node)\"\n            [class.ax-tree-view-expanded]=\"getNodeExpanded(node)\"\n            [disabled]=\"getNodeLoading(node)\"\n            [style.visibility]=\"shouldShowExpandToggle(node) ? 'visible' : 'hidden'\"\n          >\n            @if (getNodeLoading(node)) {\n              <ax-icon>\n                <i class=\"fa-solid fa-spinner fa-spin ax-tree-view-loading-spinner\"></i>\n              </ax-icon>\n            } @else {\n              <ax-icon>\n                <i\n                  [class]=\"getNodeExpanded(node) ? directionExpandedIcon() : directionCollapsedIcon()\"\n                  class=\"ax-tree-view-toggle-icon\"\n                ></i>\n              </ax-icon>\n            }\n          </ax-button>\n          @if (nodeTemplate()) {\n            @if (shouldShowCheckboxForNode(node)) {\n              <ax-check-box\n                class=\"ax-tree-view-checkbox\"\n                [ngModel]=\"getNodeIndeterminate(node) ? null : getNodeSelected(node) || false\"\n                [indeterminate]=\"getNodeIndeterminate(node) || false\"\n                (onValueChanged)=\"toggleSelection(node, $event)\"\n                (click)=\"$event.stopPropagation()\"\n                (pointerdown)=\"$event.stopPropagation()\"\n              ></ax-check-box>\n            }\n            <ng-container\n              [ngTemplateOutlet]=\"nodeTemplate()!\"\n              [ngTemplateOutletContext]=\"getTemplateContext(node, 0)\"\n            ></ng-container>\n          } @else {\n            @if (shouldShowCheckboxForNode(node)) {\n              <ax-check-box\n                class=\"ax-tree-view-checkbox\"\n                [ngModel]=\"getNodeIndeterminate(node) ? null : getNodeSelected(node) || false\"\n                [indeterminate]=\"getNodeIndeterminate(node) || false\"\n                (onValueChanged)=\"toggleSelection(node, $event)\"\n              ></ax-check-box>\n            }\n            @if (showIcons() && getNodeIcon(node)) {\n              <i [class]=\"getNodeIcon(node)\" class=\"ax-tree-view-node-icon\"></i>\n            }\n            <span\n              class=\"ax-tree-view-node-label\"\n              [axTooltip]=\"getNodeTooltip(node) || ''\"\n              [axTooltipOpenAfter]=\"tooltipDelay()\"\n              [axTooltipDisabled]=\"!getNodeTooltip(node)\"\n              [axTooltipPlacement]=\"'top-start'\"\n            >\n              {{ getNodeTitle(node) }}\n            </span>\n            @if (showChildrenBadge() && (getNodeChildrenCount(node) || getNodeChildren(node)?.length)) {\n              <span class=\"ax-tree-view-node-badge\">\n                <ax-badge\n                  class=\"ax-tree-view-children-badge\"\n                  [text]=\"(getNodeChildrenCount(node) ?? getNodeChildren(node)?.length ?? 0).toString()\"\n                ></ax-badge>\n              </span>\n            }\n          }\n        </div>\n      </div>\n      @if (getNodeExpanded(node) && getNodeChildren(node)?.length) {\n        <div class=\"ax-tree-view-children\" role=\"group\">\n          <ng-container\n            [ngTemplateOutlet]=\"childrenList\"\n            [ngTemplateOutletContext]=\"{ children: getNodeChildren(node), parent: node, level: 1 }\"\n          ></ng-container>\n        </div>\n      }\n    }\n  }\n</div>\n\n<!-- Recursive children template -->\n<ng-template #childrenList let-children=\"children\" let-parent=\"parent\" let-level=\"level\">\n  <div\n    [axDropList]=\"dragBehavior() !== 'none'\"\n    [id]=\"getListId(parent)\"\n    [attr.data-node-id]=\"getNodeId(parent)\"\n    dropListGroup=\"ax-tree-view-nodes\"\n    (dropListDropped)=\"onDrop($event, parent)\"\n    class=\"ax-tree-view-drop-list\"\n    role=\"group\"\n  >\n    @for (node of children; track getNodeId(node)) {\n      @if (getNodeHidden(node) !== true) {\n        <div\n          [axDrag]=\"dragBehavior() !== 'none'\"\n          [dragDisabled]=\"isNodeEffectivelyDisabled(node)\"\n          [dragData]=\"node\"\n          class=\"ax-tree-view-node\"\n          [class.ax-tree-view-node-active]=\"activeNodeId() === getNodeId(node)\"\n          [class.ax-tree-view-node-selected]=\"getNodeSelected(node)\"\n          [class.ax-tree-view-node-disabled]=\"isNodeEffectivelyDisabled(node)\"\n          [class.ax-tree-view-node-loading]=\"getNodeLoading(node)\"\n          [class.ax-tree-view-node-focused]=\"isNodeFocused(getNodeId(node))\"\n          [class.ax-state-alternate]=\"isAlternateNode(node)\"\n          role=\"treeitem\"\n          [attr.aria-level]=\"getNodeAriaLevel(level)\"\n          [attr.aria-expanded]=\"getNodeAriaExpanded(node)\"\n          [attr.aria-selected]=\"getNodeAriaSelected(node)\"\n          [attr.aria-disabled]=\"\n            isNodeEffectivelyDisabled(node) || (isLeafOnlyMode() && !isLeafNode(node)) ? 'true' : null\n          \"\n        >\n          <div\n            class=\"ax-tree-view-node-content\"\n            [axDropList]=\"dragBehavior() !== 'none'\"\n            [id]=\"'ax-tree-view-node-drop-' + getNodeId(node)\"\n            [attr.data-node-id]=\"getNodeId(node)\"\n            [attr.data-tree-node-id]=\"getNodeId(node)\"\n            [attr.data-drop-type]=\"'onto-node'\"\n            dropListGroup=\"ax-tree-view-nodes\"\n            (dropListDropped)=\"onDropOntoNode($event, node)\"\n            axDoubleClick\n            [duration]=\"doubleClickDuration()\"\n            [disabled]=\"isDoubleClickDisabledForNode(node)\"\n            (onClick)=\"onNodeClickHandle(node, $event)\"\n            (onDblClick)=\"onNodeDoubleClickHandle(node, $event)\"\n            (focus)=\"onNodeFocus(getNodeId(node))\"\n            (blur)=\"focusedNodeId.set(null)\"\n            [tabindex]=\"isNodeFocused(getNodeId(node)) ? 0 : -1\"\n          >\n            @if (shouldShowDragHandle()) {\n              <span\n                class=\"ax-tree-view-drag-handle\"\n                axDragHandle\n                title=\"Drag to reorder\"\n                (click)=\"$event.stopPropagation()\"\n              >\n                ⋮⋮\n              </span>\n            }\n            <ax-button\n              look=\"link\"\n              class=\"ax-tree-view-expand-toggle ax-sm\"\n              (onClick)=\"toggleNode(node, $any($event))\"\n              (click)=\"$event.stopPropagation()\"\n              [class.ax-tree-view-has-children]=\"shouldShowExpandToggle(node)\"\n              [class.ax-tree-view-expanded]=\"getNodeExpanded(node)\"\n              [disabled]=\"getNodeLoading(node)\"\n              [style.visibility]=\"shouldShowExpandToggle(node) ? 'visible' : 'hidden'\"\n            >\n              @if (getNodeLoading(node)) {\n                <ax-icon>\n                  <i class=\"fa-solid fa-spinner fa-spin ax-tree-view-loading-spinner\"></i>\n                </ax-icon>\n              } @else {\n                <ax-icon>\n                  <i\n                    [class]=\"getNodeExpanded(node) ? directionExpandedIcon() : directionCollapsedIcon()\"\n                    class=\"ax-tree-view-toggle-icon\"\n                  ></i>\n                </ax-icon>\n              }\n            </ax-button>\n\n            @if (nodeTemplate()) {\n              @if (shouldShowCheckboxForNode(node)) {\n                <ax-check-box\n                  class=\"ax-tree-view-checkbox\"\n                  [ngModel]=\"getNodeIndeterminate(node) ? null : getNodeSelected(node) || false\"\n                  [indeterminate]=\"getNodeIndeterminate(node) || false\"\n                  (onValueChanged)=\"toggleSelection(node, $event)\"\n                  (click)=\"$event.stopPropagation()\"\n                  (pointerdown)=\"$event.stopPropagation()\"\n                ></ax-check-box>\n              }\n              <ng-container\n                [ngTemplateOutlet]=\"nodeTemplate()!\"\n                [ngTemplateOutletContext]=\"getTemplateContext(node, level)\"\n              ></ng-container>\n            } @else {\n              @if (shouldShowCheckboxForNode(node)) {\n                <ax-check-box\n                  class=\"ax-tree-view-checkbox\"\n                  [ngModel]=\"getNodeIndeterminate(node) ? null : getNodeSelected(node) || false\"\n                  [indeterminate]=\"getNodeIndeterminate(node) || false\"\n                  (onValueChanged)=\"toggleSelection(node, $event)\"\n                ></ax-check-box>\n              }\n              @if (showIcons() && getNodeIcon(node)) {\n                <i [class]=\"getNodeIcon(node)\" class=\"ax-tree-view-node-icon\"></i>\n              }\n              <span\n                class=\"ax-tree-view-node-label\"\n                [axTooltip]=\"getNodeTooltip(node) || ''\"\n                [axTooltipOpenAfter]=\"tooltipDelay()\"\n                [axTooltipDisabled]=\"!getNodeTooltip(node)\"\n                [axTooltipPlacement]=\"'top-start'\"\n              >\n                {{ getNodeTitle(node) }}\n              </span>\n              @if (showChildrenBadge() && (getNodeChildrenCount(node) || getNodeChildren(node)?.length)) {\n                <span class=\"ax-tree-view-node-badge\">\n                  <ax-badge\n                    class=\"ax-tree-view-children-badge\"\n                    [text]=\"(getNodeChildrenCount(node) ?? getNodeChildren(node)?.length ?? 0).toString()\"\n                  ></ax-badge>\n                </span>\n              }\n            }\n          </div>\n        </div>\n        @if (getNodeExpanded(node) && getNodeChildren(node)?.length) {\n          <div class=\"ax-tree-view-children\" role=\"group\">\n            <ng-container\n              [ngTemplateOutlet]=\"childrenList\"\n              [ngTemplateOutletContext]=\"{ children: getNodeChildren(node), parent: node, level: level + 1 }\"\n            ></ng-container>\n          </div>\n        }\n      }\n    }\n  </div>\n</ng-template>\n","import { NgModule } from '@angular/core';\nimport { AXTreeViewComponent } from './tree-view.component';\n\n@NgModule({\n  imports: [AXTreeViewComponent],\n})\nexport class AXTreeViewModule {}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}