\n {loading ? (\n
\n Computing layout \n \n
\n ) : null}\n\n {dataFrames.length && processed.nodes.length ? (\n
\n ) : (\n
No data
\n )}\n\n
\n {nodes.length ? (\n
\n
\n ) : null}\n\n
\n \n config={config}\n onConfigChange={(cfg) => {\n if (cfg.gridLayout !== config.gridLayout) {\n setFocusedNodeId(undefined);\n }\n setConfig(cfg);\n }}\n onMinus={onStepDown}\n onPlus={onStepUp}\n scale={scale}\n disableZoomIn={isMaxZoom}\n disableZoomOut={isMinZoom}\n />\n
\n
\n\n {hiddenNodesCount > 0 && (\n
\n {hiddenNodesCount} nodes are hidden for performance reasons.\n
\n )}\n\n {MenuComponent}\n
\n );\n}\n\n// Active -> emphasized, inactive -> de-emphasized, and default -> normal styling\nexport type HoverState = 'active' | 'inactive' | 'default';\n\n// These components are here as a perf optimisation to prevent going through all nodes and edges on every pan/zoom.\ninterface NodesProps {\n nodes: NodeDatum[];\n onMouseEnter: (id: string) => void;\n onMouseLeave: (id: string) => void;\n onClick: (event: MouseEvent