{"version":3,"file":"ngx-json-visualizer.mjs","sources":["../../../projects/ngx-json-visualizer/src/lib/providers/custom-renderers.ts","../../../projects/ngx-json-visualizer/src/lib/providers/default-providers.ts","../../../projects/ngx-json-visualizer/src/lib/providers/preset-configs.ts","../../../projects/ngx-json-visualizer/src/lib/ngx-json-visualizer.component.ts","../../../projects/ngx-json-visualizer/src/lib/types/visualizer.types.ts","../../../projects/ngx-json-visualizer/src/public-api.ts","../../../projects/ngx-json-visualizer/src/ngx-json-visualizer.ts"],"sourcesContent":["import type {\n  DataTransformer,\n  NodeRenderer,\n  NodeStyle,\n  TransformContext,\n  VisualizerNode,\n} from '../types/visualizer.types'\n\n/**\n * Custom renderer for entity nodes with special types and icons\n */\nexport class EntityNodeRenderer implements NodeRenderer {\n  canHandle = (node: VisualizerNode): boolean => {\n    const data = node.originalData\n    return !!(data && (data.type || data.category || data.kind || this.hasEntityProperties(data)))\n  }\n\n  renderContent = (node: VisualizerNode, container: SVGGElement): void => {\n    const rect = container.querySelector('.node-rect')\n    const nodeWidth = rect?.getAttribute('width') ? Number.parseFloat(rect.getAttribute('width')!) : 160\n    const nodeHeight = rect?.getAttribute('height') ? Number.parseFloat(rect.getAttribute('height')!) : 40\n    const x = rect?.getAttribute('x') ? Number.parseFloat(rect.getAttribute('x')!) : 0\n    const y = rect?.getAttribute('y') ? Number.parseFloat(rect.getAttribute('y')!) : 0\n\n    const data = node.originalData\n    const entityType = this.getEntityType(data)\n\n    // Entity icon (simple circle)\n    const icon = document.createElementNS('http://www.w3.org/2000/svg', 'circle')\n    icon.setAttribute('cx', String(x + 15))\n    icon.setAttribute('cy', String(y + nodeHeight / 2))\n    icon.setAttribute('r', '6')\n    icon.setAttribute('fill', this.getEntityIconColor(entityType))\n    icon.setAttribute('stroke', 'white')\n    icon.setAttribute('stroke-width', '1')\n    container.appendChild(icon)\n\n    // Entity name\n    const nameText = document.createElementNS('http://www.w3.org/2000/svg', 'text')\n    nameText.classList.add('node-text', 'entity-name')\n    nameText.setAttribute('x', String(x + 30))\n    nameText.setAttribute('y', String(y + nodeHeight / 2 - 8))\n    nameText.setAttribute('text-anchor', 'start')\n    nameText.setAttribute('dominant-baseline', 'middle')\n    nameText.textContent = this.truncateText(node.name, 15)\n    container.appendChild(nameText)\n\n    // Entity type\n    const typeText = document.createElementNS('http://www.w3.org/2000/svg', 'text')\n    typeText.classList.add('node-text', 'entity-type')\n    typeText.setAttribute('x', String(x + 30))\n    typeText.setAttribute('y', String(y + nodeHeight / 2 + 8))\n    typeText.setAttribute('text-anchor', 'start')\n    typeText.setAttribute('dominant-baseline', 'middle')\n    typeText.setAttribute('font-size', '10')\n    typeText.setAttribute('fill', '#a0aec0')\n    typeText.textContent = entityType\n    container.appendChild(typeText)\n\n    // Value display\n    if (node.value !== undefined) {\n      const valueText = document.createElementNS('http://www.w3.org/2000/svg', 'text')\n      valueText.classList.add('node-text', 'entity-value')\n      valueText.setAttribute('x', String(x + nodeWidth - 10))\n      valueText.setAttribute('y', String(y + nodeHeight / 2))\n      valueText.setAttribute('text-anchor', 'end')\n      valueText.setAttribute('dominant-baseline', 'middle')\n      valueText.setAttribute('font-weight', 'bold')\n      valueText.setAttribute('fill', '#48bb78')\n      valueText.textContent = String(node.value)\n      container.appendChild(valueText)\n    }\n  }\n\n  getNodeStyle = (node: VisualizerNode): NodeStyle => {\n    const data = node.originalData\n    const entityType = this.getEntityType(data)\n\n    return {\n      fill: '#1a202c',\n      stroke: this.getEntityStrokeColor(entityType),\n      strokeWidth: 2,\n      rx: 12,\n      width: 180, // Wider for entity info\n      height: 50,\n    }\n  }\n\n  private hasEntityProperties(data: any): boolean {\n    const entityKeys = ['id', 'name', 'status', 'properties', 'attributes', 'metadata']\n    return entityKeys.some(key => key in data)\n  }\n\n  private getEntityType(data: any): string {\n    return data?.type || data?.category || data?.kind || 'entity'\n  }\n\n  private getEntityIconColor(entityType: string): string {\n    const colorMap: { [key: string]: string } = {\n      primary: '#e53e3e',\n      secondary: '#3182ce',\n      info: '#38a169',\n      warning: '#d69e2e',\n      success: '#38a169',\n      error: '#e53e3e',\n    }\n    return colorMap[entityType] || '#718096'\n  }\n\n  private getEntityStrokeColor(entityType: string): string {\n    const colorMap: { [key: string]: string } = {\n      primary: '#fc8181',\n      secondary: '#63b3ed',\n      info: '#68d391',\n      warning: '#f6e05e',\n      success: '#68d391',\n      error: '#fc8181',\n    }\n    return colorMap[entityType] || '#cbd5e0'\n  }\n\n  private truncateText(text: string, maxLength: number): string {\n    return text.length > maxLength ? `${text.substring(0, maxLength)}...` : text\n  }\n}\n\n/**\n * Custom renderer for container/group nodes\n */\nexport class ContainerNodeRenderer implements NodeRenderer {\n  canHandle = (node: VisualizerNode): boolean => {\n    const data = node.originalData\n    return !!(data && (\n      data.children\n      || data.items\n      || data.members\n      || node.children?.length\n      || this.hasContainerProperties(data)\n    ))\n  }\n\n  renderContent = (node: VisualizerNode, container: SVGGElement): void => {\n    const rect = container.querySelector('.node-rect')\n    const nodeHeight = rect?.getAttribute('height') ? Number.parseFloat(rect.getAttribute('height')!) : 40\n    const x = rect?.getAttribute('x') ? Number.parseFloat(rect.getAttribute('x')!) : 0\n    const y = rect?.getAttribute('y') ? Number.parseFloat(rect.getAttribute('y')!) : 0\n\n    // Container icon (folder-like shape)\n    const iconGroup = document.createElementNS('http://www.w3.org/2000/svg', 'g')\n    const folder = document.createElementNS('http://www.w3.org/2000/svg', 'rect')\n    folder.setAttribute('x', String(x + 10))\n    folder.setAttribute('y', String(y + nodeHeight / 2 - 8))\n    folder.setAttribute('width', '12')\n    folder.setAttribute('height', '16')\n    folder.setAttribute('fill', '#4299e1')\n    folder.setAttribute('stroke', 'white')\n    folder.setAttribute('stroke-width', '1')\n    folder.setAttribute('rx', '2')\n    iconGroup.appendChild(folder)\n\n    // Small indicator dots\n    for (let i = 0; i < 2; i++) {\n      for (let j = 0; j < 2; j++) {\n        const dot = document.createElementNS('http://www.w3.org/2000/svg', 'circle')\n        dot.setAttribute('cx', String(x + 13 + j * 3))\n        dot.setAttribute('cy', String(y + nodeHeight / 2 - 4 + i * 4))\n        dot.setAttribute('r', '1')\n        dot.setAttribute('fill', 'white')\n        iconGroup.appendChild(dot)\n      }\n    }\n\n    container.appendChild(iconGroup)\n\n    // Container name\n    const nameText = document.createElementNS('http://www.w3.org/2000/svg', 'text')\n    nameText.classList.add('node-text', 'container-name')\n    nameText.setAttribute('x', String(x + 30))\n    nameText.setAttribute('y', String(y + nodeHeight / 2 - 5))\n    nameText.setAttribute('text-anchor', 'start')\n    nameText.setAttribute('dominant-baseline', 'middle')\n    nameText.setAttribute('font-weight', 'bold')\n    nameText.textContent = this.truncateText(node.name, 15)\n    container.appendChild(nameText)\n\n    // Child count\n    const childCount = node.children?.length || this.getItemCount(node.originalData)\n    if (childCount > 0) {\n      const countText = document.createElementNS('http://www.w3.org/2000/svg', 'text')\n      countText.classList.add('node-text', 'child-count')\n      countText.setAttribute('x', String(x + 30))\n      countText.setAttribute('y', String(y + nodeHeight / 2 + 8))\n      countText.setAttribute('text-anchor', 'start')\n      countText.setAttribute('dominant-baseline', 'middle')\n      countText.setAttribute('font-size', '10')\n      countText.setAttribute('fill', '#a0aec0')\n      countText.textContent = `${childCount} items`\n      container.appendChild(countText)\n    }\n  }\n\n  getNodeStyle = (_node: VisualizerNode): NodeStyle => ({\n    fill: '#2d3748',\n    stroke: '#4299e1',\n    strokeWidth: 3,\n    rx: 12,\n    width: 200, // Wider for container info\n    height: 60,\n  })\n\n  private hasContainerProperties(data: any): boolean {\n    const containerKeys = ['children', 'items', 'members', 'elements', 'collection']\n    return containerKeys.some(key => key in data && Array.isArray(data[key]))\n  }\n\n  private getItemCount(data: any): number {\n    const containerKeys = ['children', 'items', 'members', 'elements', 'collection']\n    for (const key of containerKeys) {\n      if (data[key] && Array.isArray(data[key])) {\n        return data[key].length\n      }\n    }\n    return 0\n  }\n\n  private truncateText(text: string, maxLength: number): string {\n    return text.length > maxLength ? `${text.substring(0, maxLength)}...` : text\n  }\n}\n\n/**\n * Data transformer for hierarchical data structures with nested collections\n */\nexport class HierarchicalDataTransformer implements DataTransformer {\n  canHandle = (data: any, _context: TransformContext): boolean => {\n    return Array.isArray(data) && data.length > 0\n      && data.some(item => item && typeof item === 'object' && this.hasNestedStructure(item))\n  }\n\n  transform = (data: any, level: number, parentKey: string, context: TransformContext): VisualizerNode[] => {\n    if (!Array.isArray(data))\n      return []\n\n    return data.map((item, index) => {\n      const containerNode: VisualizerNode = {\n        id: `container_${item.id || index}`,\n        name: item.name || item.title || item.label || `Container ${index + 1}`,\n        type: level === 0 ? 'root' : 'object',\n        level,\n        children: [],\n        originalData: item,\n        metadata: {\n          isContainer: true,\n          hasNestedData: this.hasNestedStructure(item),\n        },\n      }\n\n      // Transform nested collections\n      const nestedCollections = this.findNestedCollections(item)\n      nestedCollections.forEach(({ collection, key }) => {\n        collection.forEach((nestedItem: any, nestedIndex: number) => {\n          const nestedNode = this.transformNestedItem(nestedItem, level + 1, nestedIndex, context, containerNode, key)\n          if (nestedNode) {\n            containerNode.children!.push(nestedNode)\n          }\n        })\n      })\n\n      return containerNode\n    })\n  }\n\n  private hasNestedStructure(item: any): boolean {\n    const nestedKeys = ['children', 'items', 'members', 'elements', 'collection', 'data']\n    return nestedKeys.some(key => item[key] && Array.isArray(item[key]) && item[key].length > 0)\n  }\n\n  private findNestedCollections(item: any): Array<{ collection: any[], key: string }> {\n    const nestedKeys = ['children', 'items', 'members', 'elements', 'collection', 'data']\n    const collections: Array<{ collection: any[], key: string }> = []\n\n    nestedKeys.forEach((key) => {\n      if (item[key] && Array.isArray(item[key])) {\n        collections.push({ collection: item[key], key })\n      }\n    })\n\n    return collections\n  }\n\n  private transformNestedItem(item: any, level: number, index: number, context: TransformContext, parent: VisualizerNode, collectionKey: string): VisualizerNode {\n    const itemNode: VisualizerNode = {\n      id: `${collectionKey}_${item.id || index}`,\n      name: item.name || item.title || item.label || `${collectionKey} ${index + 1}`,\n      type: 'object',\n      level,\n      children: [],\n      originalData: item,\n      metadata: {\n        isNestedItem: true,\n        collectionType: collectionKey,\n        parentContainer: parent.originalData,\n      },\n    }\n\n    // Transform nested children if they exist\n    if (this.hasNestedStructure(item)) {\n      const nestedCollections = this.findNestedCollections(item)\n      nestedCollections.forEach(({ collection, key }) => {\n        collection.forEach((child: any, childIndex: number) => {\n          let childNode: VisualizerNode\n\n          if (this.isLeafItem(child)) {\n            // This is a leaf item\n            childNode = {\n              id: `leaf_${child.id || childIndex}`,\n              name: child.name || child.title || child.label || `Item ${childIndex + 1}`,\n              type: 'leaf',\n              level: level + 1,\n              originalData: child,\n              metadata: {\n                isLeafItem: true,\n                itemType: child.type || child.category || 'item',\n              },\n            }\n\n            // Add value using valueProvider\n            if (context.valueProvider) {\n              try {\n                const value = context.valueProvider(child)\n                if (value !== undefined) {\n                  childNode.value = value\n                }\n              }\n              catch (error) {\n                console.warn('Error in valueProvider:', error)\n              }\n            }\n          }\n          else {\n            // This might be another nested container\n            childNode = this.transformNestedItem(child, level + 1, childIndex, context, itemNode, key)\n          }\n\n          itemNode.children!.push(childNode)\n        })\n      })\n    }\n\n    return itemNode\n  }\n\n  private isLeafItem(item: any): boolean {\n    // Consider it a leaf if it doesn't have nested collections or has specific leaf indicators\n    return !this.hasNestedStructure(item)\n      || item.type === 'leaf'\n      || item.isLeaf\n      || item.terminal\n  }\n}\n","import type {\n  DataTransformer,\n  LayoutConfig,\n  LayoutProvider,\n  NodeRenderer,\n  NodeStyle,\n  TransformContext,\n  VisualizerNode,\n} from '../types/visualizer.types'\n\n/**\n * Default node renderer for standard JSON nodes\n */\nexport class DefaultNodeRenderer implements NodeRenderer {\n  canHandle = (_node: VisualizerNode): boolean => true\n\n  renderContent = (node: VisualizerNode, container: SVGGElement): void => {\n    const rect = container.querySelector('.node-rect')\n    const nodeWidth = rect?.getAttribute('width') ? Number.parseFloat(rect.getAttribute('width')!) : 160\n    const nodeHeight = rect?.getAttribute('height') ? Number.parseFloat(rect.getAttribute('height')!) : 40\n\n    // Renderer uses local coordinates inside group (0,0). Use auto-layout markers so\n    // the parent component can opt-in to reposition only certain elements.\n\n    // Name text (auto-layout)\n    const nameText = document.createElementNS('http://www.w3.org/2000/svg', 'text')\n    nameText.classList.add('node-text', 'node-name', 'auto-layout')\n    nameText.setAttribute('x', String(nodeWidth / 2))\n    nameText.setAttribute('y', String(nodeHeight / 2 - (node.value !== undefined ? 5 : 0)))\n    nameText.setAttribute('text-anchor', 'middle')\n    nameText.setAttribute('dominant-baseline', 'middle')\n    nameText.textContent = this.truncateText(node.name, 20)\n    container.appendChild(nameText)\n\n    // Value text (auto-layout)\n    if (node.value !== undefined) {\n      const valueText = document.createElementNS('http://www.w3.org/2000/svg', 'text')\n      valueText.classList.add('node-text', 'node-value', 'auto-layout')\n      valueText.setAttribute('x', String(nodeWidth / 2))\n      valueText.setAttribute('y', String(nodeHeight / 2 + 12))\n      valueText.setAttribute('text-anchor', 'middle')\n      valueText.setAttribute('dominant-baseline', 'middle')\n      valueText.textContent = this.truncateText(String(node.value), 15)\n      container.appendChild(valueText)\n    }\n  }\n\n  getNodeStyle = (node: VisualizerNode): NodeStyle => {\n    const colors = {\n      root: '#4a5568',\n      object: '#2d3748',\n      array: '#2c5282',\n      leaf: '#2f855a',\n    }\n\n    const strokeColors = {\n      root: '#718096',\n      object: '#4299e1',\n      array: '#3182ce',\n      leaf: '#38a169',\n    }\n\n    return {\n      fill: colors[node.type] || '#2d3748',\n      stroke: strokeColors[node.type] || '#4299e1',\n      strokeWidth: 2,\n      rx: 8,\n      textColor: 'white',\n      fontSize: 12,\n    }\n  }\n\n  private truncateText(text: string, maxLength: number): string {\n    return text.length > maxLength ? `${text.substring(0, maxLength)}...` : text\n  }\n}\n\n/**\n * Default data transformer for generic JSON data\n */\nexport class DefaultDataTransformer implements DataTransformer {\n  private processedObjects = new WeakSet()\n\n  canHandle = (_data: any, _context: TransformContext): boolean => true\n\n  transform = (data: any, level: number, parentKey: string, context: TransformContext): VisualizerNode[] => {\n    const nodes: VisualizerNode[] = []\n\n    // Check depth limit\n    if (context.maxDepth && level >= context.maxDepth) {\n      return [{\n        id: `${parentKey}_truncated`,\n        name: `${parentKey} (truncated)`,\n        type: 'leaf',\n        level,\n        originalData: data,\n      }]\n    }\n\n    // Circular reference detection for objects\n    if (data && typeof data === 'object' && !Array.isArray(data)) {\n      if (this.processedObjects.has(data)) {\n        return [{\n          id: `${parentKey}_circular`,\n          name: `${parentKey} (circular)`,\n          type: 'leaf',\n          level,\n          originalData: data,\n        }]\n      }\n      this.processedObjects.add(data)\n    }\n\n    if (Array.isArray(data)) {\n      // Handle arrays\n      const arrayNode: VisualizerNode = {\n        id: `${parentKey}_array`,\n        name: `${parentKey} [${data.length}]`,\n        type: 'array',\n        level,\n        children: [],\n        originalData: data,\n      }\n\n      data.forEach((item, index) => {\n        const childContext: TransformContext = { ...context, currentDepth: level + 1, parentNode: arrayNode }\n        const childNodes = this.transform(item, level + 1, `[${index}]`, childContext)\n        arrayNode.children!.push(...childNodes)\n      })\n\n      nodes.push(arrayNode)\n    }\n    else if (data && typeof data === 'object') {\n      // Handle objects\n      const objectNode: VisualizerNode = {\n        id: `${parentKey}_object`,\n        name: data.name || data.id || parentKey,\n        type: level === 0 ? 'root' : 'object',\n        level,\n        children: [],\n        originalData: data,\n      }\n\n      Object.entries(data).forEach(([key, value]) => {\n        if (key === 'name' || key === 'id')\n          return // Skip name/id as they're used for the node title\n\n        const childContext: TransformContext = { ...context, currentDepth: level + 1, parentNode: objectNode }\n        const childNodes = this.transform(value, level + 1, key, childContext)\n        objectNode.children!.push(...childNodes)\n      })\n\n      nodes.push(objectNode)\n    }\n    else {\n      // Handle primitive values\n      let displayValue = String(data)\n\n      // Try to get value from valueProvider if available\n      if (context.valueProvider) {\n        try {\n          const providerValue = context.valueProvider(data)\n          if (providerValue !== undefined) {\n            displayValue = String(providerValue)\n          }\n        }\n        catch (error) {\n          console.warn('Error in valueProvider:', error)\n        }\n      }\n\n      const leafNode: VisualizerNode = {\n        id: `${parentKey}_leaf`,\n        name: parentKey,\n        value: displayValue,\n        type: 'leaf',\n        level,\n        originalData: data,\n      }\n\n      nodes.push(leafNode)\n    }\n\n    return nodes\n  }\n}\n\n/**\n * Default hierarchical layout provider\n */\nexport class DefaultLayoutProvider implements LayoutProvider {\n  calculateLayout(\n    nodes: VisualizerNode[],\n    _links: Array<{ source: string, target: string }>,\n    config: LayoutConfig,\n  ): Array<{ nodeId: string, x: number, y: number }> {\n    const spacing = config.nodeSpacing || { x: 200, y: 80 }\n    const padding = config.padding || { top: 40, right: 40, bottom: 40, left: 40 }\n\n    // Group nodes by level\n    const nodesByLevel: { [level: number]: VisualizerNode[] } = {}\n\n    const processNode = (node: VisualizerNode) => {\n      if (!nodesByLevel[node.level]) {\n        nodesByLevel[node.level] = []\n      }\n      nodesByLevel[node.level].push(node)\n\n      if (node.children) {\n        node.children.forEach(processNode)\n      }\n    }\n\n    nodes.forEach(processNode)\n\n    const positions: Array<{ nodeId: string, x: number, y: number }> = []\n\n    // Calculate positions level by level\n    Object.keys(nodesByLevel).forEach((levelStr) => {\n      const level = Number.parseInt(levelStr)\n      const nodesAtLevel = nodesByLevel[level]\n\n      nodesAtLevel.forEach((node, index) => {\n        positions.push({\n          nodeId: node.id,\n          x: padding.left + level * spacing.x,\n          y: padding.top + index * spacing.y,\n        })\n      })\n    })\n\n    return positions\n  }\n}\n\n/**\n * Tree-like layout provider that positions children under their parents\n */\nexport class TreeLayoutProvider implements LayoutProvider {\n  private nodeHeight = 40\n  private nodeSpacing = 20\n\n  calculateLayout(\n    nodes: VisualizerNode[],\n    _links: Array<{ source: string, target: string }>,\n    config: LayoutConfig,\n  ): Array<{ nodeId: string, x: number, y: number }> {\n    const spacing = config.nodeSpacing || { x: 200, y: 40 }\n    const padding = config.padding || { top: 50, right: 50, bottom: 50, left: 50 }\n\n    // Start with root nodes at the top level\n    const rootNodes = nodes.filter(n => n.level === 0)\n\n    const positions: Array<{ nodeId: string, x: number, y: number }> = []\n    let currentY = padding.top\n\n    rootNodes.forEach((rootNode) => {\n      const subtreeHeight = this.calculateSubtreePositions(rootNode, padding.left, currentY, positions, spacing)\n      currentY += subtreeHeight + this.nodeSpacing\n    })\n\n    return positions\n  }\n\n  private calculateSubtreePositions(\n    node: VisualizerNode,\n    x: number,\n    startY: number,\n    positions: Array<{ nodeId: string, x: number, y: number }>,\n    spacing: { x: number, y: number },\n  ): number {\n    // Position this node\n    positions.push({ nodeId: node.id, x, y: startY })\n\n    if (!node.children || node.children.length === 0) {\n      return this.nodeHeight\n    }\n\n    // Calculate positions for children\n    let childY = startY + this.nodeHeight + this.nodeSpacing\n    let totalHeight = this.nodeHeight + this.nodeSpacing\n\n    node.children.forEach((child) => {\n      const subtreeHeight = this.calculateSubtreePositions(\n        child,\n        x + spacing.x,\n        childY,\n        positions,\n        spacing,\n      )\n      childY += subtreeHeight + this.nodeSpacing\n      totalHeight += subtreeHeight + this.nodeSpacing\n    })\n\n    // Adjust this node's Y position to center it among its children\n    if (node.children.length > 1) {\n      const firstChildPos = positions.find(p => p.nodeId === node.children![0].id)\n      const lastChildPos = positions.find(p => p.nodeId === node.children![node.children!.length - 1].id)\n      if (firstChildPos && lastChildPos) {\n        const centerY = firstChildPos.y + (lastChildPos.y - firstChildPos.y) / 2\n        const nodePos = positions.find(p => p.nodeId === node.id)\n        if (nodePos) {\n          nodePos.y = centerY\n        }\n      }\n    }\n\n    return totalHeight - this.nodeSpacing // Remove the last spacing\n  }\n}\n","import type {\n  VisualizerConfig,\n} from '../types/visualizer.types'\nimport {\n  ContainerNodeRenderer,\n  EntityNodeRenderer,\n  HierarchicalDataTransformer,\n} from './custom-renderers'\nimport {\n  DefaultDataTransformer,\n  DefaultLayoutProvider,\n  DefaultNodeRenderer,\n  TreeLayoutProvider,\n} from './default-providers'\n\n/**\n * Pre-configured setups for common visualization scenarios\n */\n\nexport function createDefaultConfig(): VisualizerConfig {\n  return {\n    nodeRenderers: [new DefaultNodeRenderer()],\n    dataTransformer: new DefaultDataTransformer(),\n    layoutProvider: new DefaultLayoutProvider(),\n    enableZooming: true,\n    zoomSpeedMultiplier: 1.0,\n    theme: {\n      node: {\n        fontSize: '12px',\n        fontFamily: 'monospace',\n      },\n      link: {\n        stroke: '#a0aec0',\n        strokeWidth: 1,\n      },\n    },\n    layout: {\n      nodeSpacing: { x: 220, y: 80 },\n      padding: { top: 20, right: 20, bottom: 20, left: 20 },\n    },\n  }\n}\n\nexport function createHierarchicalConfig(): VisualizerConfig {\n  return {\n    nodeRenderers: [\n      new EntityNodeRenderer(),\n      new ContainerNodeRenderer(),\n      new DefaultNodeRenderer(), // Fallback\n    ],\n    dataTransformer: new HierarchicalDataTransformer(),\n    layoutProvider: new DefaultLayoutProvider(),\n    enableZooming: true,\n    zoomSpeedMultiplier: 1.0,\n    theme: {\n      node: {\n        fontSize: '12px',\n        fontFamily: '-apple-system, BlinkMacSystemFont, Segoe UI, sans-serif',\n      },\n      link: {\n        stroke: '#4299e1',\n        strokeWidth: 2,\n      },\n    },\n    layout: {\n      nodeSpacing: { x: 250, y: 100 },\n      padding: { top: 30, right: 30, bottom: 30, left: 30 },\n    },\n  }\n}\n\n/**\n * Custom theme configurations\n */\nexport const DARK_THEME = {\n  node: {\n    fontSize: '12px',\n    fontFamily: 'monospace',\n    fill: '#2d3748',\n    stroke: '#4a5568',\n    textFill: '#e2e8f0',\n  },\n  link: {\n    stroke: '#718096',\n    strokeWidth: 1,\n  },\n  background: '#1a202c',\n}\n\nexport const LIGHT_THEME = {\n  node: {\n    fontSize: '12px',\n    fontFamily: 'monospace',\n    fill: '#ffffff',\n    stroke: '#e2e8f0',\n    textFill: '#2d3748',\n  },\n  link: {\n    stroke: '#cbd5e0',\n    strokeWidth: 1,\n  },\n  background: '#ffffff',\n}\n\nexport const HIERARCHICAL_CONFIG: VisualizerConfig = {\n  nodeRenderers: [\n    new ContainerNodeRenderer(),\n    new EntityNodeRenderer(),\n    new DefaultNodeRenderer(),\n  ],\n  dataTransformer: new HierarchicalDataTransformer(),\n  layoutProvider: new TreeLayoutProvider(),\n  enableZooming: true,\n  zoomSpeedMultiplier: 1.0,\n  theme: DARK_THEME,\n  layout: {\n    nodeSpacing: { x: 280, y: 120 },\n    padding: { top: 40, right: 40, bottom: 40, left: 40 },\n  },\n  valueProvider: (data: any) => {\n    // Custom value extraction for entities\n    if (data.measurements && Array.isArray(data.measurements)) {\n      const latest = data.measurements[0]\n      return latest?.value || latest?.data\n    }\n    return data.lastValue || data.currentValue || data.value\n  },\n}\n","import type { ElementRef, OnChanges, OnDestroy, OnInit } from '@angular/core'\nimport type { VisualizerConfig, VisualizerNode } from './types/visualizer.types'\nimport { CommonModule } from '@angular/common'\nimport { Component, Input, ViewChild } from '@angular/core'\nimport { createDefaultConfig } from './providers/preset-configs'\n\n@Component({\n  selector: 'ngx-json-visualizer',\n  imports: [CommonModule],\n  template: `\n    <div class=\"json-visualizer\">\n      <svg #svgContainer\n           class=\"visualization-svg\"\n           (wheel)=\"onWheel($event)\"\n           (mousedown)=\"onMouseDown($event)\"\n           (mousemove)=\"onMouseMove($event)\"\n           (mouseup)=\"onMouseUp()\"\n           (mouseleave)=\"onMouseLeave()\">\n        <g #contentGroup class=\"content-group\"></g>\n      </svg>\n\n      <!-- Zoom Controls (optional) -->\n      <div class=\"zoom-controls\" *ngIf=\"currentConfig?.enableZooming\">\n        <button class=\"zoom-btn\" (click)=\"zoomIn()\" title=\"Zoom In\">+</button>\n        <span class=\"zoom-level\">{{ (zoomLevel) | number:'1.0-0' }}%</span>\n        <button class=\"zoom-btn\" (click)=\"zoomOut()\" title=\"Zoom Out\">-</button>\n        <button class=\"zoom-btn\" (click)=\"resetZoom()\" title=\"Reset Zoom\">⌂</button>\n      </div>\n\n      <!-- Smooth Zoom Indicator -->\n      <div #zoomIndicator class=\"zoom-indicator\">\n        {{ (zoomLevel) | number:'1.0-0' }}%\n      </div>\n    </div>\n  `,\n  styles: [`\n    .json-visualizer {\n      background: linear-gradient(135deg, #f7fafc 0%, #edf2f7 100%);\n      overflow: hidden;\n      position: relative;\n      width: 100%;\n      height: 100%;\n      border-radius: 8px;\n      box-shadow: inset 0 1px 3px rgba(0, 0, 0, 0.1);\n    }\n\n    .visualization-svg {\n      background: transparent;\n      cursor: grab;\n      width: 100%;\n      height: 100%;\n      transition: cursor 0.15s ease;\n    }\n\n    .visualization-svg.panning {\n      cursor: grabbing;\n    }\n\n    .content-group {\n      transition: transform 0.15s cubic-bezier(0.4, 0, 0.2, 1);\n    }\n\n    .content-group.smooth-pan {\n      transition: transform 0.3s cubic-bezier(0.25, 0.46, 0.45, 0.94);\n    }\n\n    .zoom-controls {\n      position: absolute;\n      top: 12px;\n      right: 12px;\n      display: flex;\n      align-items: center;\n      gap: 6px;\n      background: rgba(255, 255, 255, 0.95);\n      border: 1px solid rgba(0, 0, 0, 0.06);\n      border-radius: 12px;\n      padding: 10px 12px;\n      box-shadow: 0 8px 25px rgba(0, 0, 0, 0.1), 0 3px 10px rgba(0, 0, 0, 0.08);\n      backdrop-filter: blur(16px);\n      transform: translateY(0);\n      transition: all 0.2s cubic-bezier(0.4, 0, 0.2, 1);\n    }\n\n    .zoom-controls:hover {\n      transform: translateY(-1px);\n      box-shadow: 0 10px 30px rgba(0, 0, 0, 0.12), 0 4px 12px rgba(0, 0, 0, 0.1);\n    }\n\n    .zoom-btn {\n      background: transparent;\n      border: none;\n      border-radius: 8px;\n      width: 36px;\n      height: 36px;\n      display: flex;\n      align-items: center;\n      justify-content: center;\n      cursor: pointer;\n      font-weight: 600;\n      color: #4a5568;\n      transition: all 0.2s cubic-bezier(0.4, 0, 0.2, 1);\n      font-size: 16px;\n      position: relative;\n      overflow: hidden;\n    }\n\n    .zoom-btn::before {\n      content: '';\n      position: absolute;\n      top: 0;\n      left: 0;\n      width: 100%;\n      height: 100%;\n      background: radial-gradient(circle, rgba(74, 85, 104, 0.1) 0%, transparent 70%);\n      transform: scale(0);\n      transition: transform 0.2s ease;\n    }\n\n    .zoom-btn:hover {\n      background: rgba(74, 85, 104, 0.08);\n      color: #2d3748;\n      transform: scale(1.05);\n    }\n\n    .zoom-btn:hover::before {\n      transform: scale(1);\n    }\n\n    .zoom-btn:active {\n      background: rgba(74, 85, 104, 0.15);\n      transform: scale(0.95);\n    }\n\n    .zoom-level {\n      font-size: 13px;\n      color: #4a5568;\n      font-weight: 600;\n      min-width: 40px;\n      text-align: center;\n      padding: 0 4px;\n      background: rgba(74, 85, 104, 0.05);\n      border-radius: 6px;\n      line-height: 1.4;\n    }\n\n    /* Node styles with animations */\n    .node-rect {\n      transition: all 0.2s cubic-bezier(0.4, 0, 0.2, 1);\n      filter: drop-shadow(0 2px 4px rgba(0, 0, 0, 0.1));\n    }\n\n    .node-rect:hover {\n      filter: drop-shadow(0 4px 8px rgba(0, 0, 0, 0.15));\n      transform: translateY(-1px);\n    }\n\n    .node-text {\n      transition: all 0.2s ease;\n      font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Roboto', 'Oxygen', 'Ubuntu', 'Cantarell', 'Open Sans', 'Helvetica Neue', sans-serif;\n    }\n\n    .node-name {\n      font-weight: 600;\n      letter-spacing: 0.025em;\n    }\n\n    .node-value {\n      font-weight: 500;\n      opacity: 0.9;\n    }\n\n    .entity-name {\n      font-weight: 600;\n      font-size: 13px;\n    }\n\n    .entity-type {\n      font-weight: 400;\n      font-size: 10px;\n      opacity: 0.8;\n    }\n\n    .entity-value {\n      font-weight: 700;\n      font-size: 12px;\n    }\n\n    .container-name {\n      font-weight: 700;\n      font-size: 14px;\n    }\n\n    .child-count {\n      font-weight: 500;\n      font-size: 10px;\n      opacity: 0.7;\n    }\n\n    /* Link styles */\n    .visualization-link {\n      transition: all 0.2s ease;\n      stroke-width: 1.5;\n      opacity: 0.6;\n    }\n\n    .visualization-link:hover {\n      opacity: 1;\n      stroke-width: 2;\n    }\n\n    /* Smooth zoom indicator */\n    .zoom-indicator {\n      position: absolute;\n      top: 50%;\n      left: 50%;\n      transform: translate(-50%, -50%);\n      background: rgba(0, 0, 0, 0.8);\n      color: white;\n      padding: 8px 16px;\n      border-radius: 20px;\n      font-size: 14px;\n      font-weight: 600;\n      pointer-events: none;\n      opacity: 0;\n      transition: opacity 0.2s ease;\n    }\n\n    .zoom-indicator.show {\n      opacity: 1;\n    }\n\n    :global(.node-rect) {\n      cursor: move;\n      transition: all 0.2s ease;\n    }\n\n    :global(.node-rect:hover) {\n      fill-opacity: 0.8;\n      stroke-width: 2;\n      filter: drop-shadow(0 2px 4px rgba(0, 0, 0, 0.2));\n    }\n\n    :global(.node-rect:active) {\n      cursor: grabbing;\n      filter: drop-shadow(0 4px 8px rgba(0, 0, 0, 0.3));\n    }\n\n    :global(.node-rect.collision-highlight) {\n      stroke: #e53e3e !important;\n      stroke-width: 3 !important;\n      animation: pulse 0.5s infinite alternate;\n    }\n\n    @keyframes pulse {\n      from {\n        stroke-opacity: 0.7;\n      }\n      to {\n        stroke-opacity: 1;\n      }\n    }\n\n    :global(.node-text) {\n      font-size: 12px;\n      font-family: monospace;\n      fill: #2d3748;\n      pointer-events: none;\n      user-select: none;\n    }\n\n    :global(.link-line) {\n      stroke: #a0aec0;\n      stroke-width: 1;\n      fill: none;\n    }\n\n    :global(.device-name) {\n      font-weight: bold;\n    }\n\n    :global(.device-type) {\n      font-size: 10px;\n      fill: #a0aec0;\n    }\n\n    :global(.device-value) {\n      font-weight: bold;\n      fill: #48bb78;\n    }\n\n    :global(.tenant-name) {\n      font-weight: bold;\n    }\n\n    :global(.child-count) {\n      font-size: 10px;\n      fill: #a0aec0;\n    }\n  `],\n})\nexport class JsonVisualizerComponent implements OnInit, OnChanges, OnDestroy {\n  @ViewChild('svgContainer', { static: true }) svgRef!: ElementRef<SVGSVGElement>\n  @ViewChild('contentGroup', { static: true }) contentGroupRef!: ElementRef<SVGGElement>\n  @ViewChild('zoomIndicator', { static: true }) zoomIndicatorRef!: ElementRef<HTMLDivElement>\n  @Input() data: any = null\n  @Input() config: VisualizerConfig | null = null\n  @Input() width = 800\n  @Input() height = 600\n\n  private nodes: VisualizerNode[] = []\n  private links: Array<{ source: string, target: string }> = []\n  currentConfig!: VisualizerConfig\n\n  // Zoom and pan state\n  zoomLevel = 100\n  private minZoom = 10\n  private maxZoom = 1000\n  private panX = 0\n  private panY = 0\n  private isPanning = false\n  private lastPanPoint = { x: 0, y: 0 }\n\n  // Smooth panning state\n  private panVelocity = { x: 0, y: 0 }\n  private lastPanTime = 0\n  private panHistory: Array<{ x: number, y: number, time: number }> = []\n  private momentumAnimationId: number | null = null\n  private readonly velocityDecay = 0.92\n  private readonly minVelocity = 0.1\n  private zoomIndicatorTimeout: number | null = null\n\n  // Node dragging state\n  private isDraggingNode = false\n  private draggedNode: VisualizerNode | null = null\n  private dragOffset = { x: 0, y: 0 }\n  private nodeElements = new Map<string, SVGGElement>()\n\n  ngOnInit(): void {\n    this.currentConfig = this.config || createDefaultConfig()\n    this.render()\n  }\n\n  ngOnChanges(): void {\n    this.currentConfig = this.config || createDefaultConfig()\n    this.render()\n  }\n\n  ngOnDestroy(): void {\n    // Clean up any active drag listeners\n    // Always remove listeners in case they were added earlier\n    document.removeEventListener('mousemove', this.onNodeDrag)\n    document.removeEventListener('mouseup', this.onNodeDragEnd)\n\n    // Clean up momentum animation\n    if (this.momentumAnimationId) {\n      cancelAnimationFrame(this.momentumAnimationId)\n      this.momentumAnimationId = null\n    }\n\n    // Clean up zoom indicator timeout\n    if (this.zoomIndicatorTimeout) {\n      clearTimeout(this.zoomIndicatorTimeout)\n      this.zoomIndicatorTimeout = null\n    }\n  }\n\n  private render(): void {\n    if (!this.data)\n      return\n\n    // Clear previous content\n    const svg = this.svgRef.nativeElement\n    svg.innerHTML = ''\n\n    try {\n      // Transform data using configured transformer\n      this.transformData()\n\n      // Calculate layout using configured layout provider\n      this.calculateLayout()\n\n      // Render visualization\n      this.renderVisualization()\n    }\n    catch (error) {\n      console.error('Error rendering visualization:', error)\n      this.renderError(svg, 'Failed to render visualization')\n    }\n  }\n\n  private transformData(): void {\n    this.nodes = []\n    this.links = []\n\n    const context = {\n      // Remove maxDepth to enable infinite depth traversal\n      maxDepth: undefined,\n      valueProvider: this.currentConfig.valueProvider,\n    }\n\n    // Clear any circular reference tracking from previous transforms\n    if ('processedObjects' in this.currentConfig.dataTransformer) {\n      (this.currentConfig.dataTransformer as any).processedObjects = new WeakSet()\n    }\n\n    // Use the configured data transformer\n    const transformedNodes = this.currentConfig.dataTransformer.transform(\n      this.data,\n      0,\n      'root',\n      context,\n    )\n\n    this.nodes = transformedNodes\n    this.generateLinks(this.nodes)\n  }\n\n  private generateLinks(nodes: VisualizerNode[]): void {\n    nodes.forEach((node) => {\n      if (node.children) {\n        node.children.forEach((child) => {\n          this.links.push({\n            source: node.id,\n            target: child.id,\n          })\n        })\n        // Recursively process children\n        this.generateLinks(node.children)\n      }\n    })\n  }\n\n  private calculateLayout(): void {\n    const allNodes = this.flattenNodes(this.nodes)\n\n    // Use configured layout provider\n    const positions = this.currentConfig.layoutProvider.calculateLayout(\n      allNodes,\n      this.links,\n      this.currentConfig.layout || {\n        nodeSpacing: { x: 200, y: 80 },\n        padding: { top: 40, right: 40, bottom: 40, left: 40 },\n      },\n    )\n\n    // Apply positions to nodes\n    positions.forEach((pos) => {\n      const node = allNodes.find(n => n.id === pos.nodeId)\n      if (node) {\n        node.x = pos.x\n        node.y = pos.y\n      }\n    })\n\n    // Apply collision detection to initial layout\n    this.resolveInitialCollisions(allNodes)\n  }\n\n  private flattenNodes(nodes: VisualizerNode[]): VisualizerNode[] {\n    const result: VisualizerNode[] = []\n\n    const flatten = (nodeList: VisualizerNode[]) => {\n      nodeList.forEach((node) => {\n        result.push(node)\n        if (node.children) {\n          flatten(node.children)\n        }\n      })\n    }\n\n    flatten(nodes)\n    return result\n  }\n\n  private renderVisualization(): void {\n    const svg = this.svgRef.nativeElement\n    const contentGroup = this.contentGroupRef.nativeElement\n    const allNodes = this.flattenNodes(this.nodes)\n\n    // Clear previous content\n    svg.innerHTML = ''\n\n    // Re-add content group\n    svg.appendChild(contentGroup)\n    contentGroup.innerHTML = ''\n\n    // Create defs for arrowheads and styles\n    this.setupSvgDefs(svg)\n\n    // Render links first (so they appear behind nodes)\n    this.renderLinks(contentGroup, allNodes)\n\n    // Render nodes using configured renderers\n    this.renderNodes(contentGroup, allNodes)\n\n    // Update SVG dimensions\n    this.updateSvgDimensions(svg, allNodes)\n\n    // Apply current zoom and pan transformation\n    this.updateTransform()\n  }\n\n  private setupSvgDefs(svg: SVGSVGElement): void {\n    const defs = document.createElementNS('http://www.w3.org/2000/svg', 'defs')\n\n    // Arrowhead marker\n    const marker = document.createElementNS('http://www.w3.org/2000/svg', 'marker')\n    marker.setAttribute('id', 'arrowhead')\n    marker.setAttribute('markerWidth', '10')\n    marker.setAttribute('markerHeight', '7')\n    marker.setAttribute('refX', '9')\n    marker.setAttribute('refY', '3.5')\n    marker.setAttribute('orient', 'auto')\n\n    const polygon = document.createElementNS('http://www.w3.org/2000/svg', 'polygon')\n    polygon.setAttribute('points', '0 0, 10 3.5, 0 7')\n    polygon.setAttribute('fill', this.currentConfig.theme?.link?.stroke || '#a0aec0')\n\n    marker.appendChild(polygon)\n    defs.appendChild(marker)\n    svg.appendChild(defs)\n  }\n\n  private renderLinks(container: SVGElement, allNodes: VisualizerNode[]): void {\n    this.links.forEach((link) => {\n      const sourceNode = allNodes.find(n => n.id === link.source)\n      const targetNode = allNodes.find(n => n.id === link.target)\n\n      if (sourceNode && targetNode && sourceNode.x !== undefined && targetNode.x !== undefined) {\n        const line = document.createElementNS('http://www.w3.org/2000/svg', 'line')\n        line.classList.add('link-line')\n\n        // Calculate connection points based on node style\n        const sourceStyle = this.getNodeRenderer(sourceNode)?.getNodeStyle?.(sourceNode)\n        const targetStyle = this.getNodeRenderer(targetNode)?.getNodeStyle?.(targetNode)\n\n        const sourceWidth = sourceStyle?.width || 160\n        const sourceHeight = sourceStyle?.height || 40\n        const targetHeight = targetStyle?.height || 40\n\n        line.setAttribute('x1', String((sourceNode.x ?? 0) + sourceWidth))\n        line.setAttribute('y1', String((sourceNode.y ?? 0) + sourceHeight / 2))\n        line.setAttribute('x2', String(targetNode.x ?? 0))\n        line.setAttribute('y2', String((targetNode.y ?? 0) + targetHeight / 2))\n        line.setAttribute('marker-end', 'url(#arrowhead)')\n\n        // Apply theme styles\n        const linkTheme = this.currentConfig.theme?.link\n        if (linkTheme?.stroke)\n          line.setAttribute('stroke', linkTheme.stroke)\n        if (linkTheme?.strokeWidth)\n          line.setAttribute('stroke-width', String(linkTheme.strokeWidth))\n\n        container.appendChild(line)\n      }\n    })\n  }\n\n  private renderNodes(container: SVGElement, allNodes: VisualizerNode[]): void {\n    // Clear node elements map\n    this.nodeElements.clear()\n\n    allNodes.forEach((node) => {\n      if (node.x === undefined || node.y === undefined)\n        return\n\n      const group = document.createElementNS('http://www.w3.org/2000/svg', 'g')\n      group.setAttribute('data-node-id', node.id)\n      group.style.cursor = 'move'\n      // Position group using transform so renderer-internal coordinates remain relative\n      group.setAttribute('transform', `translate(${node.x}, ${node.y})`)\n\n      // Store reference to node element\n      this.nodeElements.set(node.id, group)\n\n      const renderer = this.getNodeRenderer(node)\n\n      if (renderer) {\n        // Get node style from renderer\n        const nodeStyle = renderer.getNodeStyle?.(node) || {\n          fill: '#f7fafc',\n          stroke: '#cbd5e0',\n          strokeWidth: 1,\n          rx: 6,\n          width: 160,\n          height: 40,\n        }\n\n        // Create base rectangle with hitbox\n        const rect = document.createElementNS('http://www.w3.org/2000/svg', 'rect')\n        rect.classList.add('node-rect')\n        // Use local coordinates inside the group\n        rect.setAttribute('x', '0')\n        rect.setAttribute('y', '0')\n        rect.setAttribute('width', String(nodeStyle.width || 160))\n        rect.setAttribute('height', String(nodeStyle.height || 40))\n        rect.setAttribute('rx', String(nodeStyle.rx || 6))\n        rect.setAttribute('fill', nodeStyle.fill || '#f7fafc')\n        rect.setAttribute('stroke', nodeStyle.stroke || '#cbd5e0')\n        rect.setAttribute('stroke-width', String(nodeStyle.strokeWidth || 1))\n\n        // Add drag event listeners to the rectangle\n        this.addNodeDragListeners(rect, node)\n\n        group.appendChild(rect)\n\n        // Let renderer handle content\n        renderer.renderContent(node, group)\n      }\n      else {\n        // Fallback rendering if no renderer found\n        this.renderDefaultNode(node, group)\n      }\n\n      container.appendChild(group)\n    })\n  }\n\n  private getNodeRenderer(node: VisualizerNode) {\n    return this.currentConfig.nodeRenderers.find(renderer => renderer.canHandle(node))\n  }\n\n  private renderDefaultNode(node: VisualizerNode, container: SVGGElement): void {\n    // Render relative to the group's origin (0,0). The group is positioned via transform.\n    const rect = document.createElementNS('http://www.w3.org/2000/svg', 'rect')\n    rect.classList.add('node-rect')\n    rect.setAttribute('x', '0')\n    rect.setAttribute('y', '0')\n    rect.setAttribute('width', '160')\n    rect.setAttribute('height', '40')\n    rect.setAttribute('rx', '6')\n    rect.setAttribute('fill', '#f7fafc')\n    rect.setAttribute('stroke', '#cbd5e0')\n    rect.setAttribute('stroke-width', '1')\n\n    const text = document.createElementNS('http://www.w3.org/2000/svg', 'text')\n    text.classList.add('node-text')\n    text.setAttribute('x', String(160 / 2))\n    text.setAttribute('y', String(40 / 2 + 5))\n    text.setAttribute('text-anchor', 'middle')\n    text.setAttribute('dominant-baseline', 'middle')\n    text.textContent = this.truncateText(node.name, 15)\n\n    container.appendChild(rect)\n    container.appendChild(text)\n  }\n\n  private updateSvgDimensions(svg: SVGSVGElement, allNodes: VisualizerNode[]): void {\n    // Create a large infinite canvas\n    const canvasSize = 10000 // Large canvas for infinite feel\n    const centerOffset = canvasSize / 2\n\n    // Set a large viewBox for infinite canvas feeling\n    svg.setAttribute('viewBox', `${-centerOffset} ${-centerOffset} ${canvasSize} ${canvasSize}`)\n    svg.setAttribute('width', '100%')\n    svg.setAttribute('height', '100%')\n\n    // If we have nodes, center the content initially\n    if (allNodes.length > 0) {\n      const validNodes = allNodes.filter(n => n.x !== undefined && n.y !== undefined)\n      if (validNodes.length > 0) {\n        const minX = Math.min(...validNodes.map(n => n.x || 0))\n        const maxX = Math.max(...validNodes.map((n) => {\n          const renderer = this.getNodeRenderer(n)\n          const style = renderer?.getNodeStyle?.(n)\n          return (n.x || 0) + (style?.width || 160)\n        }))\n        const minY = Math.min(...validNodes.map(n => n.y || 0))\n        const maxY = Math.max(...validNodes.map((n) => {\n          const renderer = this.getNodeRenderer(n)\n          const style = renderer?.getNodeStyle?.(n)\n          return (n.y || 0) + (style?.height || 40)\n        }))\n\n        // Calculate content center\n        const contentCenterX = (minX + maxX) / 2\n        const contentCenterY = (minY + maxY) / 2\n\n        // Center the content on first render if zoom hasn't been modified\n        if (this.zoomLevel === 100 && this.panX === 0 && this.panY === 0) {\n          this.panX = -contentCenterX\n          this.panY = -contentCenterY\n        }\n      }\n    }\n  }\n\n  private renderError(svg: SVGSVGElement, message: string): void {\n    const text = document.createElementNS('http://www.w3.org/2000/svg', 'text')\n    text.setAttribute('x', '20')\n    text.setAttribute('y', '40')\n    text.setAttribute('fill', '#e53e3e')\n    text.setAttribute('font-family', 'monospace')\n    text.setAttribute('font-size', '14')\n    text.textContent = message\n    svg.appendChild(text)\n  }\n\n  private truncateText(text: string, maxLength: number): string {\n    return text.length > maxLength ? `${text.substring(0, maxLength)}...` : text\n  }\n\n  // Node dragging methods\n  private addNodeDragListeners(rect: SVGRectElement, node: VisualizerNode): void {\n    rect.addEventListener('mousedown', (event) => {\n      event.stopPropagation() // Prevent panning\n      this.startNodeDrag(event, node)\n    })\n  }\n\n  private startNodeDrag(event: MouseEvent, node: VisualizerNode): void {\n    this.isDraggingNode = true\n    this.draggedNode = node\n    this.isPanning = false // Disable panning while dragging node\n\n    const svg = this.svgRef.nativeElement\n    const rect = svg.getBoundingClientRect()\n\n    // Calculate mouse position in SVG coordinates\n    const mouseX = (event.clientX - rect.left - this.panX) / this.zoomLevel\n    const mouseY = (event.clientY - rect.top - this.panY) / this.zoomLevel\n\n    this.dragOffset = {\n      x: mouseX - (node.x || 0),\n      y: mouseY - (node.y || 0),\n    }\n\n    // Add visual feedback for dragging\n    const nodeGroup = this.nodeElements.get(node.id)\n    if (nodeGroup) {\n      nodeGroup.style.filter = 'drop-shadow(0 4px 12px rgba(0, 0, 0, 0.4))'\n      nodeGroup.style.opacity = '0.9'\n    }\n\n    // Add global listeners for mouse move and up\n    document.addEventListener('mousemove', this.onNodeDrag)\n    document.addEventListener('mouseup', this.onNodeDragEnd)\n\n    event.preventDefault()\n  }\n\n  private onNodeDrag = (event: MouseEvent): void => {\n    if (!this.isDraggingNode || !this.draggedNode)\n      return\n\n    const svg = this.svgRef.nativeElement\n    const rect = svg.getBoundingClientRect()\n\n    // Calculate new position in SVG coordinates\n    const mouseX = (event.clientX - rect.left - this.panX) / this.zoomLevel\n    const mouseY = (event.clientY - rect.top - this.panY) / this.zoomLevel\n\n    const newX = mouseX - this.dragOffset.x\n    const newY = mouseY - this.dragOffset.y\n\n    // Check for collisions with other nodes and highlight them\n    this.highlightCollisions(this.draggedNode, newX, newY)\n\n    // Check for collisions with other nodes\n    const validPosition = this.findValidPosition(this.draggedNode, newX, newY)\n\n    // Update node position\n    this.draggedNode.x = validPosition.x\n    this.draggedNode.y = validPosition.y\n\n    // Update visual representation\n    this.updateNodePosition(this.draggedNode)\n\n    // Update connected links\n    this.updateLinks()\n  }\n\n  private onNodeDragEnd = (): void => {\n    if (this.draggedNode) {\n      // Remove visual feedback\n      const nodeGroup = this.nodeElements.get(this.draggedNode.id)\n      if (nodeGroup) {\n        nodeGroup.style.filter = ''\n        nodeGroup.style.opacity = '1'\n      }\n    }\n\n    // Clear collision highlights\n    this.clearCollisionHighlights()\n\n    this.isDraggingNode = false\n    this.draggedNode = null\n\n    // Remove global listeners\n    document.removeEventListener('mousemove', this.onNodeDrag)\n    document.removeEventListener('mouseup', this.onNodeDragEnd)\n  }\n\n  private highlightCollisions(draggedNode: VisualizerNode, targetX: number, targetY: number): void {\n    const allNodes = this.flattenNodes(this.nodes)\n    const draggedRenderer = this.getNodeRenderer(draggedNode)\n    const draggedStyle = draggedRenderer?.getNodeStyle?.(draggedNode) || { width: 160, height: 40 }\n    const draggedWidth = draggedStyle.width || 160\n    const draggedHeight = draggedStyle.height || 40\n    const margin = 15\n\n    // Clear previous highlights\n    this.clearCollisionHighlights()\n\n    for (const otherNode of allNodes) {\n      if (otherNode.id === draggedNode.id || otherNode.x === undefined || otherNode.y === undefined)\n        continue\n\n      const otherRenderer = this.getNodeRenderer(otherNode)\n      const otherStyle = otherRenderer?.getNodeStyle?.(otherNode) || { width: 160, height: 40 }\n      const otherWidth = otherStyle.width || 160\n      const otherHeight = otherStyle.height || 40\n\n      // Check if rectangles would overlap\n      if (this.rectanglesOverlap(\n        targetX,\n        targetY,\n        draggedWidth,\n        draggedHeight,\n        otherNode.x,\n        otherNode.y,\n        otherWidth,\n        otherHeight,\n        margin,\n      )) {\n        // Highlight the conflicting node\n        const nodeGroup = this.nodeElements.get(otherNode.id)\n        if (nodeGroup) {\n          const rect = nodeGroup.querySelector('.node-rect') as SVGRectElement\n          if (rect) {\n            rect.style.stroke = '#e53e3e'\n            rect.style.strokeWidth = '3'\n            rect.classList.add('collision-highlight')\n          }\n        }\n      }\n    }\n  }\n\n  private clearCollisionHighlights(): void {\n    this.nodeElements.forEach((group) => {\n      const rect = group.querySelector('.node-rect.collision-highlight') as SVGRectElement\n      if (rect) {\n        rect.style.stroke = ''\n        rect.style.strokeWidth = ''\n        rect.classList.remove('collision-highlight')\n      }\n    })\n  }\n\n  // Resolve collisions in the initial layout\n  private resolveInitialCollisions(allNodes: VisualizerNode[]): void {\n    const margin = 15\n    let hasCollisions = true\n    const maxIterations = 100 // Prevent infinite loops\n    let iteration = 0\n\n    while (hasCollisions && iteration < maxIterations) {\n      hasCollisions = false\n      iteration++\n\n      for (let i = 0; i < allNodes.length; i++) {\n        const nodeA = allNodes[i]\n        if (!nodeA.x || !nodeA.y)\n          continue\n\n        const rendererA = this.getNodeRenderer(nodeA)\n        const styleA = rendererA?.getNodeStyle?.(nodeA) || { width: 160, height: 40 }\n        const widthA = styleA.width || 160\n        const heightA = styleA.height || 40\n\n        for (let j = i + 1; j < allNodes.length; j++) {\n          const nodeB = allNodes[j]\n          if (!nodeB.x || !nodeB.y)\n            continue\n\n          const rendererB = this.getNodeRenderer(nodeB)\n          const styleB = rendererB?.getNodeStyle?.(nodeB) || { width: 160, height: 40 }\n          const widthB = styleB.width || 160\n          const heightB = styleB.height || 40\n\n          if (this.rectanglesOverlap(\n            nodeA.x,\n            nodeA.y,\n            widthA,\n            heightA,\n            nodeB.x,\n            nodeB.y,\n            widthB,\n            heightB,\n            margin,\n          )) {\n            hasCollisions = true\n            // Move nodeB to resolve collision\n            const validPosition = this.findClosestValidPosition(\n              nodeB,\n              nodeB.x,\n              nodeB.y,\n              nodeA.x,\n              nodeA.y,\n              widthA,\n              heightA,\n              margin,\n            )\n\n            // Check if the new position is actually different and valid\n            if (this.isPositionValid(nodeB, validPosition.x, validPosition.y, margin)) {\n              nodeB.x = validPosition.x\n              nodeB.y = validPosition.y\n            }\n            else {\n              // If we can't find a valid position nearby, move it further away\n              nodeB.x = nodeA.x + widthA + margin + 20\n              nodeB.y = nodeA.y + Math.random() * 100 - 50 // Add some randomness\n            }\n          }\n        }\n      }\n    }\n\n    if (iteration >= maxIterations) {\n      console.warn('Maximum collision resolution iterations reached')\n    }\n  }\n\n  // Collision detection and prevention\n  private findValidPosition(draggedNode: VisualizerNode, targetX: number, targetY: number): { x: number, y: number } {\n    const allNodes = this.flattenNodes(this.nodes)\n    const draggedRenderer = this.getNodeRenderer(draggedNode)\n    const draggedStyle = draggedRenderer?.getNodeStyle?.(draggedNode) || { width: 160, height: 40 }\n    const draggedWidth = draggedStyle.width || 160\n    const draggedHeight = draggedStyle.height || 40\n    const margin = 15 // Minimum distance between nodes\n\n    // Snap to grid (optional - can be enabled/disabled)\n    const gridSize = 10\n    const snappedX = Math.round(targetX / gridSize) * gridSize\n    const snappedY = Math.round(targetY / gridSize) * gridSize\n\n    // Check collision with each other node\n    for (const otherNode of allNodes) {\n      if (otherNode.id === draggedNode.id || otherNode.x === undefined || otherNode.y === undefined)\n        continue\n\n      const otherRenderer = this.getNodeRenderer(otherNode)\n      const otherStyle = otherRenderer?.getNodeStyle?.(otherNode) || { width: 160, height: 40 }\n      const otherWidth = otherStyle.width || 160\n      const otherHeight = otherStyle.height || 40\n\n      // Check if rectangles would overlap\n      if (this.rectanglesOverlap(\n        snappedX,\n        snappedY,\n        draggedWidth,\n        draggedHeight,\n        otherNode.x,\n        otherNode.y,\n        otherWidth,\n        otherHeight,\n        margin,\n      )) {\n        // Find the closest valid position\n        return this.findClosestValidPosition(\n          draggedNode,\n          snappedX,\n          snappedY,\n          otherNode.x,\n          otherNode.y,\n          otherWidth,\n          otherHeight,\n          margin,\n        )\n      }\n    }\n\n    return { x: snappedX, y: snappedY }\n  }\n\n  private rectanglesOverlap(\n    x1: number,\n    y1: number,\n    w1: number,\n    h1: number,\n    x2: number,\n    y2: number,\n    w2: number,\n    h2: number,\n    margin: number = 0,\n  ): boolean {\n    return !(\n      x1 + w1 + margin <= x2\n      || x2 + w2 + margin <= x1\n      || y1 + h1 + margin <= y2\n      || y2 + h2 + margin <= y1\n    )\n  }\n\n  private findClosestValidPosition(\n    draggedNode: VisualizerNode,\n    targetX: number,\n    targetY: number,\n    obstacleX: number,\n    obstacleY: number,\n    obstacleWidth: number,\n    obstacleHeight: number,\n    margin: number,\n  ): { x: number, y: number } {\n    const draggedRenderer = this.getNodeRenderer(draggedNode)\n    const draggedStyle = draggedRenderer?.getNodeStyle?.(draggedNode) || { width: 160, height: 40 }\n    const draggedWidth = draggedStyle.width || 160\n    const draggedHeight = draggedStyle.height || 40\n\n    // Calculate possible positions around the obstacle\n    const positions = [\n      // Right of obstacle\n      { x: obstacleX + obstacleWidth + margin, y: targetY },\n      // Left of obstacle\n      { x: obstacleX - draggedWidth - margin, y: targetY },\n      // Below obstacle\n      { x: targetX, y: obstacleY + obstacleHeight + margin },\n      // Above obstacle\n      { x: targetX, y: obstacleY - draggedHeight - margin },\n      // Diagonal positions\n      { x: obstacleX + obstacleWidth + margin, y: obstacleY + obstacleHeight + margin },\n      { x: obstacleX - draggedWidth - margin, y: obstacleY - draggedHeight - margin },\n      { x: obstacleX + obstacleWidth + margin, y: obstacleY - draggedHeight - margin },\n      { x: obstacleX - draggedWidth - margin, y: obstacleY + obstacleHeight + margin },\n    ]\n\n    // Find the closest valid position\n    let closestPosition = { x: targetX, y: targetY }\n    let closestDistance = Number.POSITIVE_INFINITY\n\n    for (const pos of positions) {\n      const distance = Math.sqrt(\n        (pos.x - targetX) ** 2 + (pos.y - targetY) ** 2,\n      )\n\n      if (distance < closestDistance && this.isPositionValid(draggedNode, pos.x, pos.y, margin)) {\n        closestDistance = distance\n        closestPosition = pos\n      }\n    }\n\n    return closestPosition\n  }\n\n  private isPositionValid(node: VisualizerNode, x: number, y: number, margin: number): boolean {\n    const allNodes = this.flattenNodes(this.nodes)\n    const renderer = this.getNodeRenderer(node)\n    const style = renderer?.getNodeStyle?.(node) || { width: 160, height: 40 }\n    const width = style.width || 160\n    const height = style.height || 40\n\n    for (const otherNode of allNodes) {\n      if (otherNode.id === node.id || otherNode.x === undefined || otherNode.y === undefined)\n        continue\n\n      const otherRenderer = this.getNodeRenderer(otherNode)\n      const otherStyle = otherRenderer?.getNodeStyle?.(otherNode) || { width: 160, height: 40 }\n      const otherWidth = otherStyle.width || 160\n      const otherHeight = otherStyle.height || 40\n\n      if (this.rectanglesOverlap(x, y, width, height, otherNode.x, otherNode.y, otherWidth, otherHeight, margin)) {\n        return false\n      }\n    }\n\n    return true\n  }\n\n  private updateNodePosition(node: VisualizerNode): void {\n    const group = this.nodeElements.get(node.id)\n    if (!group)\n      return\n    // Move the whole group using transform so renderer-managed element coordinates remain local\n    if (node.x !== undefined && node.y !== undefined) {\n      group.setAttribute('transform', `translate(${node.x}, ${node.y})`)\n\n      // Update only auto-layout elements (renderers should mark elements they want auto-positioned with `auto-layout` class)\n      const rect = group.querySelector('.node-rect') as SVGRectElement\n      const autoElems = group.querySelectorAll('.auto-layout')\n\n      const width = rect ? Number.parseFloat(rect.getAttribute('width') || '160') : 160\n      const height = rect ? Number.parseFloat(rect.getAttribute('height') || '40') : 40\n\n      autoElems.forEach((el, index) => {\n        const elText = el as SVGTextElement\n        // center x by default\n        elText.setAttribute('x', String(width / 2))\n        const yOffset = autoElems.length > 1 ? (index === 0 ? -5 : 12) : 0\n        elText.setAttribute('y', String(height / 2 + yOffset))\n      })\n    }\n  }\n\n  private updateLinks(): void {\n    const contentGroup = this.contentGroupRef.nativeElement\n    const allNodes = this.flattenNodes(this.nodes)\n\n    // Remove existing links\n    const existingLinks = contentGroup.querySelectorAll('.link-line')\n    existingLinks.forEach(link => link.remove())\n\n    // Re-render links with updated positions\n    this.renderLinks(contentGroup, allNodes)\n  }\n\n  // Zoom and Pan Event Handlers\n  onWheel(event: WheelEvent): void {\n    if (!this.currentConfig.enableZooming)\n      return\n\n    event.preventDefault()\n\n    const baseSpeed = 1.0\n    const zoomSpeed = (this.currentConfig?.zoomSpeedMultiplier ?? 1.0) * baseSpeed\n    const delta = event.deltaY > 0 ? -zoomSpeed : zoomSpeed\n\n    // Convert client coordinates to SVG user coordinates and zoom there\n    const p = this.clientToSvg(event.clientX, event.clientY)\n    this.zoomToPoint(p.svgX, p.svgY, delta)\n    this.showZoomIndicator()\n  }\n\n  onMouseDown(event: MouseEvent): void {\n    if (!this.currentConfig.enablePanning)\n      return\n\n    // Don't start panning if we're about to drag a node\n    if ((event.target as Element)?.closest('.node-rect')) {\n      return\n    }\n\n    if (event.button === 0) { // Left mouse button\n      this.isPanning = true\n      this.lastPanPoint = { x: event.clientX, y: event.clientY }\n      this.lastPanTime = performance.now()\n      this.panHistory = []\n      this.panVelocity = { x: 0, y: 0 }\n\n      // Stop any momentum animation\n      if (this.momentumAnimationId) {\n        cancelAnimationFrame(this.momentumAnimationId)\n        this.momentumAnimationId = null\n      }\n\n      // Remove smooth transition during active panning\n      if (this.contentGroupRef?.nativeElement) {\n        this.contentGroupRef.nativeElement.classList.remove('smooth-pan')\n      }\n\n      this.svgRef.nativeElement.classList.add('panning')\n      event.preventDefault()\n    }\n  }\n\n  onMouseMove(event: MouseEvent): void {\n    if (!this.currentConfig.enablePanning)\n      return\n\n    // Node dragging is handled by onNodeDrag\n    if (this.isDraggingNode) {\n      return\n    }\n\n    if (this.isPanning) {\n      const currentTime = performance.now()\n      const deltaX = event.clientX - this.lastPanPoint.x\n      const deltaY = event.clientY - this.lastPanPoint.y\n\n      // Apply speed multiplier for faster panning\n      const speedMultiplier = this.currentConfig.panSpeedMultiplier || 1.0\n      const adjustedDeltaX = deltaX * speedMultiplier\n      const adjustedDeltaY = deltaY * speedMultiplier\n\n      this.panX += adjustedDeltaX\n      this.panY += adjustedDeltaY\n\n      // Track pan history for momentum calculation\n      this.panHistory.push({\n        x: adjustedDeltaX,\n        y: adjustedDeltaY,\n        time: currentTime,\n      })\n\n      // Keep only recent history (last 100ms)\n      const cutoffTime = currentTime - 100\n      this.panHistory = this.panHistory.filter(point => point.time > cutoffTime)\n\n      this.lastPanPoint = { x: event.clientX, y: event.clientY }\n      this.lastPanTime = currentTime\n      this.updateTransform()\n      event.preventDefault()\n    }\n  }\n\n  onMouseUp(): void {\n    if (!this.currentConfig.enablePanning)\n      return\n\n    if (this.isPanning) {\n      this.isPanning = false\n      this.svgRef.nativeElement.classList.remove('panning')\n\n      // Calculate momentum from recent movement\n      this.calculateMomentum()\n\n      // Start momentum animation if there's enough velocity\n      if (Math.abs(this.panVelocity.x) > this.minVelocity || Math.abs(this.panVelocity.y) > this.minVelocity) {\n        this.startMomentumAnimation()\n      }\n    }\n  }\n\n  onMouseLeave(): void {\n    if (!this.currentConfig.enablePanning)\n      return\n\n    if (this.isPanning) {\n      this.isPanning = false\n      this.svgRef.nativeElement.classList.remove('panning')\n\n      // Don't apply momentum when mouse leaves the area\n      this.panVelocity = { x: 0, y: 0 }\n    }\n  }\n\n  // Zoom Control Methods\n  zoomIn(): void {\n    const svg = this.svgRef.nativeElement\n    const rect = svg.getBoundingClientRect()\n    const centerX = rect.width / 2\n    const centerY = rect.height / 2\n    const zoomSpeed = (this.currentConfig?.zoomSpeedMultiplier ?? 1.0) * 10 // percent\n    this.zoomToPoint(centerX, centerY, zoomSpeed)\n    this.showZoomIndicator()\n  }\n\n  zoomOut(): void {\n    const svg = this.svgRef.nativeElement\n    const rect = svg.getBoundingClientRect()\n    const centerX = rect.width / 2\n    const centerY = rect.height / 2\n    const zoomSpeed = (this.currentConfig?.zoomSpeedMultiplier ?? 1.0) * 10 // percent\n    this.zoomToPoint(centerX, centerY, -zoomSpeed)\n    this.showZoomIndicator()\n  }\n\n  resetZoom(): void {\n    this.zoomLevel = 100\n    this.panX = 0\n    this.panY = 0\n    this.updateTransform()\n    this.showZoomIndicator()\n  }\n\n  private zoomToPoint(mouseX: number, mouseY: number, delta: number): void {\n    // Treat zoomLevel as percent (100 => scale 1.0)\n    const oldScale = this.zoomLevel / 100\n    const deltaScale = delta / 100\n    const newScale = Math.max(this.minZoom / 100, Math.min(this.maxZoom / 100, oldScale + deltaScale))\n\n    if (newScale === oldScale)\n      return\n\n    // World coordinates using old scale\n    const worldX = (mouseX - this.panX) / oldScale\n    const worldY = (mouseY - this.panY) / oldScale\n\n    // Update zoom level (keep percent representation)\n    this.zoomLevel = newScale * 100\n\n    // Adjust pan to keep the zoom point stationary under new scale\n    this.panX = mouseX - worldX * newScale\n    this.panY = mouseY - worldY * newScale\n\n    this.updateTransform()\n  }\n\n  private updateTransform(): void {\n    if (this.contentGroupRef?.nativeElement) {\n      const transform = `translate(${this.panX}, ${this.panY}) scale(${this.zoomLevel / 100})`\n      this.contentGroupRef.nativeElement.setAttribute('transform', transform)\n    }\n  }\n\n  // Convert client coordinates to SVG local coordinates (relative to the SVG element)\n  private clientToSvg(clientX: number, clientY: number): { svgX: number, svgY: number } {\n    const svg = this.svgRef.nativeElement\n    const pt = svg.createSVGPoint()\n    pt.x = clientX\n    pt.y = clientY\n    const screenCTM = svg.getScreenCTM()\n    if (!screenCTM) {\n      return { svgX: clientX, svgY: clientY }\n    }\n    const inverse = screenCTM.inverse()\n    const local = pt.matrixTransform(inverse)\n    return { svgX: local.x, svgY: local.y }\n  }\n\n  // Convert client coordinates to world coordinates (taking into account pan/zoom transform applied to content group)\n  private clientToWorld(clientX: number, clientY: number): { x: number, y: number } {\n    const svgCoords = this.clientToSvg(clientX, clientY)\n    const scale = this.zoomLevel / 100\n    // The content group transform is translate(panX, panY) scale(scale)\n    // World position = (svgCoord - pan) / scale\n    return {\n      x: (svgCoords.svgX - this.panX) / scale,\n      y: (svgCoords.svgY - this.panY) / scale,\n    }\n  }\n\n  private calculateMomentum(): void {\n    if (this.panHistory.length < 2) {\n      this.panVelocity = { x: 0, y: 0 }\n      return\n    }\n\n    // Calculate average velocity from recent movements\n    let totalDeltaX = 0\n    let totalDeltaY = 0\n    let totalTime = 0\n\n    for (let i = 1; i < this.panHistory.length; i++) {\n      const current = this.panHistory[i]\n      const previous = this.panHistory[i - 1]\n      const timeDelta = current.time - previous.time\n\n      if (timeDelta > 0) {\n        totalDeltaX += current.x\n        totalDeltaY += current.y\n        totalTime += timeDelta\n      }\n    }\n\n    if (totalTime > 0) {\n      // Scale velocity based on time\n      const velocityScale = Math.min(100 / totalTime, 2.0)\n      this.panVelocity.x = (totalDeltaX / this.panHistory.length) * velocityScale\n      this.panVelocity.y = (totalDeltaY / this.panHistory.length) * velocityScale\n    }\n    else {\n      this.panVelocity = { x: 0, y: 0 }\n    }\n  }\n\n  private startMomentumAnimation(): void {\n    if (this.momentumAnimationId) {\n      cancelAnimationFrame(this.momentumAnimationId)\n    }\n\n    // Add smooth transition for momentum\n    if (this.contentGroupRef?.nativeElement) {\n      this.contentGroupRef.nativeElement.classList.add('smooth-pan')\n    }\n\n    const animate = () => {\n      // Apply velocity decay\n      this.panVelocity.x *= this.velocityDecay\n      this.panVelocity.y *= this.velocityDecay\n\n      // Update pan position\n      this.panX += this.panVelocity.x\n      this.panY += this.panVelocity.y\n\n      this.updateTransform()\n\n      // Continue animation if velocity is still significant\n      if (Math.abs(this.panVelocity.x) > this.minVelocity || Math.abs(this.panVelocity.y) > this.minVelocity) {\n        this.momentumAnimationId = requestAnimationFrame(animate)\n      }\n      else {\n        // Remove smooth transition class when momentum ends\n        if (this.contentGroupRef?.nativeElement) {\n          this.contentGroupRef.nativeElement.classList.remove('smooth-pan')\n        }\n        this.momentumAnimationId = null\n      }\n    }\n\n    this.momentumAnimationId = requestAnimationFrame(animate)\n  }\n\n  private showZoomIndicator(): void {\n    if (!this.zoomIndicatorRef?.nativeElement)\n      return\n\n    const indicator = this.zoomIndicatorRef.nativeElement\n    indicator.classList.add('show')\n\n    // Clear any existing timeout\n    if (this.zoomIndicatorTimeout) {\n      clearTimeout(this.zoomIndicatorTimeout)\n    }\n\n    // Hide after a short delay\n    this.zoomIndicatorTimeout = window.setTimeout(() => {\n      indicator.classList.remove('show')\n      this.zoomIndicatorTimeout = null\n    }, 800)\n  }\n}\n","// Types and interfaces for the extensible JSON visualizer\n\nexport interface VisualizerNode {\n  id: string\n  name: string\n  value?: string | number\n  children?: VisualizerNode[]\n  type: 'root' | 'object' | 'array' | 'leaf'\n  level: number\n  x?: number\n  y?: number\n  originalData?: any\n  metadata?: Record<string, any>\n}\n\nexport interface NodeStyle {\n  fill?: string\n  stroke?: string\n  strokeWidth?: number\n  rx?: number\n  ry?: number\n  width?: number\n  height?: number\n  textColor?: string\n  fontSize?: number\n  fontWeight?: string\n}\n\nexport interface LinkStyle {\n  stroke?: string\n  strokeWidth?: number\n  strokeDasharray?: string\n  opacity?: number\n}\n\nexport interface NodeRenderer {\n  /**\n   * Determines if this renderer should handle the given node\n   */\n  canHandle: (node: VisualizerNode) => boolean\n\n  /**\n   * Renders the node content (text, additional elements)\n   */\n  renderContent: (node: VisualizerNode, container: SVGGElement) => void\n\n  /**\n   * Returns custom styles for the node\n   */\n  getNodeStyle: (node: VisualizerNode) => NodeStyle\n\n  /**\n   * Returns custom styles for links from this node\n   */\n  getLinkStyle?: (fromNode: VisualizerNode, toNode: VisualizerNode) => LinkStyle\n}\n\nexport interface DataTransformer {\n  /**\n   * Transforms raw data into VisualizerNodes\n   */\n  transform: (data: any, level: number, parentKey: string, context: TransformContext) => VisualizerNode[]\n\n  /**\n   * Determines if this transformer should handle the given data\n   */\n  canHandle: (data: any, context: TransformContext) => boolean\n}\n\nexport interface TransformContext {\n  valueProvider?: (item: any) => string | number | undefined\n  maxDepth?: number\n  currentDepth?: number\n  parentNode?: VisualizerNode\n}\n\nexport interface ThemeConfig {\n  node?: {\n    fontSize?: string\n    fontFamily?: string\n    fill?: string\n    stroke?: string\n    textFill?: string\n  }\n  link?: {\n    stroke?: string\n    strokeWidth?: number\n  }\n  background?: string\n}\n\nexport interface LayoutConfig {\n  nodeSpacing?: {\n    x: number\n    y: number\n  }\n  padding?: {\n    top: number\n    right: number\n    bottom: number\n    left: number\n  }\n}\n\nexport interface LayoutProvider {\n  /**\n   * Calculates positions for all nodes\n   */\n  calculateLayout: (nodes: VisualizerNode[], links: Array<{ source: string, target: string }>, config: LayoutConfig) => Array<{ nodeId: string, x: number, y: number }>\n}\n\nexport interface VisualizerConfig {\n  // Layout configuration\n  layout?: LayoutConfig\n\n  // Theme configuration\n  theme?: ThemeConfig\n\n  // Custom value extraction\n  valueProvider?: (data: any) => any\n\n  // Default styles\n  defaultNodeStyle?: NodeStyle\n  defaultLinkStyle?: LinkStyle\n\n  // Behavior\n  enablePanning?: boolean\n  enableZooming?: boolean\n  enableHover?: boolean\n  panSpeedMultiplier?: number\n  zoomSpeedMultiplier?: number\n  maxDepth?: number\n\n  // Custom renderers and transformers\n  nodeRenderers: NodeRenderer[]\n  dataTransformer: DataTransformer\n  layoutProvider: LayoutProvider\n\n  // Callbacks\n  onNodeClick?: (node: VisualizerNode, event: MouseEvent) => void\n  onNodeHover?: (node: VisualizerNode, event: MouseEvent) => void\n  onNodeLeave?: (node: VisualizerNode, event: MouseEvent) => void\n}\n","/*\n * Public API Surface of ngx-json-visualizer\n */\n\nexport * from './lib/ngx-json-visualizer.component'\nexport * from './lib/providers/custom-renderers'\nexport * from './lib/providers/default-providers'\nexport * from './lib/providers/preset-configs'\nexport * from './lib/types/visualizer.types'\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}