{"version":3,"file":"index.umd.cjs","sources":["../src/layout/depthUtils.ts","../src/layout/forceUtils.ts","../src/layout/layoutUtils.ts","../src/layout/forceInABox.ts","../src/layout/forceDirected.ts","../src/layout/circular2d.ts","../src/layout/hierarchical.ts","../src/layout/nooverlap.ts","../src/layout/forceatlas2.ts","../src/layout/custom.ts","../src/layout/layoutProvider.ts","../src/layout/recommender.ts","../src/utils/visibility.ts","../src/sizing/pageRank.ts","../src/sizing/centrality.ts","../src/sizing/attribute.ts","../src/sizing/nodeSizeProvider.ts","../src/utils/graph.ts","../src/utils/animation.ts","../src/utils/arrow.ts","../src/utils/position.ts","../src/utils/layout.ts","../src/utils/cluster.ts","../src/utils/useHoverIntent.ts","../src/utils/useDrag.ts","../src/utils/paths.ts","../src/store.ts","../src/collapse/utils.ts","../src/collapse/useCollapse.ts","../src/useGraph.ts","../src/symbols/Label.tsx","../src/symbols/Ring.tsx","../src/symbols/nodes/Sphere.tsx","../src/CameraControls/useCameraControls.ts","../src/CameraControls/CameraControls.tsx","../src/CameraControls/utils.ts","../src/CameraControls/useCenterGraph.ts","../src/symbols/nodes/Icon.tsx","../src/symbols/nodes/SphereWithIcon.tsx","../src/symbols/nodes/Svg.tsx","../src/symbols/nodes/SphereWithSvg.tsx","../src/symbols/HTMLLabel.tsx","../src/symbols/Node.tsx","../src/symbols/Arrow.tsx","../src/symbols/Line.tsx","../src/symbols/Edge.tsx","../src/symbols/edges/useEdgeGeometry.ts","../src/symbols/edges/useEdgeEvents.ts","../src/symbols/edges/useEdgeAnimations.ts","../src/symbols/edges/Edge.tsx","../src/symbols/edges/Edges.tsx","../src/symbols/Cluster.tsx","../src/GraphScene.tsx","../src/themes/darkTheme.ts","../src/themes/lightTheme.ts","../src/selection/utils.ts","../src/selection/Lasso.tsx","../src/selection/useSelection.ts","../src/GraphCanvas.tsx","../src/RadialMenu/RadialSlice.tsx","../src/RadialMenu/utils.ts","../src/RadialMenu/RadialMenu.tsx"],"sourcesContent":["import { InternalGraphEdge, InternalGraphNode } from '../types';\n\nexport interface DepthNode {\n  data: InternalGraphNode;\n  ins: DepthNode[];\n  out: DepthNode[];\n  depth: number;\n}\n\n/**\n * Traverse the graph and get the depth of each node.\n */\nfunction traverseGraph(nodes: DepthNode[], nodeStack: DepthNode[] = []) {\n  const currentDepth = nodeStack.length;\n\n  for (const node of nodes) {\n    const idx = nodeStack.indexOf(node);\n    if (idx > -1) {\n      const loop = [...nodeStack.slice(idx), node].map(d => d.data.id);\n      throw new Error(\n        `Invalid Graph: Circular node path detected: ${loop.join(' -> ')}.`\n      );\n    }\n\n    if (currentDepth > node.depth) {\n      node.depth = currentDepth;\n      traverseGraph(node.out, [...nodeStack, node]);\n    }\n  }\n}\n\n/**\n * Gets the depth of the graph's nodes. Used in the radial layout.\n */\nexport function getNodeDepth(\n  nodes: InternalGraphNode[],\n  links: InternalGraphEdge[]\n) {\n  let invalid = false;\n\n  const graph: { [key: string]: DepthNode } = nodes.reduce(\n    (acc, cur) => ({\n      ...acc,\n      [cur.id]: {\n        data: cur,\n        out: [],\n        depth: -1,\n        ins: []\n      }\n    }),\n    {}\n  );\n\n  try {\n    for (const link of links) {\n      const from = link.source;\n      const to = link.target;\n\n      if (!graph.hasOwnProperty(from)) {\n        throw new Error(`Missing source Node ${from}`);\n      }\n\n      if (!graph.hasOwnProperty(to)) {\n        throw new Error(`Missing target Node ${to}`);\n      }\n\n      const sourceNode = graph[from];\n      const targetNode = graph[to];\n      targetNode.ins.push(sourceNode);\n      sourceNode.out.push(targetNode);\n    }\n\n    traverseGraph(Object.values(graph));\n  } catch (e) {\n    invalid = true;\n  }\n\n  const allDepths = Object.keys(graph).map(id => graph[id].depth);\n  const maxDepth = Math.max(...allDepths);\n\n  return {\n    invalid,\n    depths: graph,\n    maxDepth: maxDepth || 1\n  };\n}\n","import { forceRadial as d3ForceRadial } from 'd3-force-3d';\nimport { InternalGraphEdge, InternalGraphNode } from 'types';\nimport { getNodeDepth } from './depthUtils';\n\nconst RADIALS: DagMode[] = ['radialin', 'radialout'];\n\nexport type DagMode =\n  | 'lr'\n  | 'rl'\n  | 'td'\n  | 'but'\n  | 'zout'\n  | 'zin'\n  | 'radialin'\n  | 'radialout';\n\nexport interface ForceRadialInputs {\n  nodes: InternalGraphNode[];\n  edges: InternalGraphEdge[];\n  mode: DagMode;\n  nodeLevelRatio: number;\n}\n\n/**\n * Radial graph layout using D3 Force 3d.\n * Inspired by: https://github.com/vasturiano/three-forcegraph/blob/master/src/forcegraph-kapsule.js#L970-L1018\n */\nexport function forceRadial({\n  nodes,\n  edges,\n  mode = 'lr',\n  nodeLevelRatio = 2\n}: ForceRadialInputs) {\n  const { depths, maxDepth, invalid } = getNodeDepth(nodes, edges);\n\n  if (invalid) {\n    return null;\n  }\n\n  const modeDistance = RADIALS.includes(mode) ? 1 : 5;\n  const dagLevelDistance =\n    (nodes.length / maxDepth) * nodeLevelRatio * modeDistance;\n\n  if (mode) {\n    const getFFn =\n      (fix: boolean, invert: boolean) => (node: InternalGraphNode) =>\n        !fix\n          ? undefined\n          : (depths[node.id].depth - maxDepth / 2) *\n            dagLevelDistance *\n            (invert ? -1 : 1);\n\n    const fxFn = getFFn(['lr', 'rl'].includes(mode), mode === 'rl');\n    const fyFn = getFFn(['td', 'bu'].includes(mode), mode === 'td');\n    const fzFn = getFFn(['zin', 'zout'].includes(mode), mode === 'zout');\n\n    nodes.forEach(node => {\n      node.fx = fxFn(node);\n      node.fy = fyFn(node);\n      node.fz = fzFn(node);\n    });\n  }\n\n  return RADIALS.includes(mode)\n    ? d3ForceRadial(node => {\n      const nodeDepth = depths[node.id];\n      const depth =\n          mode === 'radialin' ? maxDepth - nodeDepth.depth : nodeDepth.depth;\n      return depth * dagLevelDistance;\n    }).strength(1)\n    : null;\n}\n","import Graph from 'graphology';\nimport { LayoutStrategy } from './types';\nimport { InternalGraphEdge, InternalGraphNode } from '../types';\n\n/**\n * Promise based tick helper.\n */\nexport function tick(layout: LayoutStrategy) {\n  return new Promise((resolve, _reject) => {\n    let stable: boolean | undefined;\n\n    function run() {\n      if (!stable) {\n        stable = layout.step();\n        run();\n      } else {\n        resolve(stable);\n      }\n    }\n\n    run();\n  });\n}\n\n/**\n * Helper function to turn the graph nodes/edges into an array for\n * easier manipulation.\n */\nexport function buildNodeEdges(graph: Graph) {\n  const nodes: InternalGraphNode[] = [];\n  const edges: InternalGraphEdge[] = [];\n\n  graph.forEachNode((id, n: any) => {\n    nodes.push({\n      ...n,\n      id,\n      // This is for the clustering\n      radius: n.size || 1\n    });\n  });\n\n  graph.forEachEdge((id, l: any) => {\n    edges.push({ ...l, id });\n  });\n\n  return { nodes, edges };\n}\n","import {\n  forceSimulation,\n  forceX,\n  forceY,\n  forceLink,\n  forceManyBody,\n  forceCollide\n} from 'd3-force-3d';\nimport { treemap, hierarchy } from 'd3-hierarchy';\n\n/**\n * Used for calculating clusterings of nodes.\n *\n * Modified version of: https://github.com/john-guerra/forceInABox\n *\n * Changes:\n *  - Improved d3 import for tree shaking\n *  - Fixed node lookup for edges using array\n *  - Updated d3-force to use d3-force-3d\n *  - Removed template logic\n */\nexport function forceInABox() {\n  // d3 style\n  const constant = (_: any) => () => _;\n  const index = (d: any) => d.index;\n\n  // Default values\n  let id = index;\n  let nodes = [];\n  let links = []; // needed for the force version\n  let tree;\n  let size = [100, 100];\n  let forceNodeSize = constant(1); // The expected node size used for computing the cluster node\n  let forceCharge = constant(-1);\n  let forceLinkDistance = constant(100);\n  let forceLinkStrength = constant(0.1);\n  let foci = {};\n  let linkStrengthIntraCluster = 0.1;\n  let linkStrengthInterCluster = 0.001;\n  let templateNodes = [];\n  let offset = [0, 0];\n  let templateForce;\n  let groupBy = d => d.cluster;\n  let template = 'treemap';\n  let enableGrouping = true;\n  let strength = 0.1;\n\n  function force(alpha) {\n    if (!enableGrouping) {\n      return force;\n    }\n\n    if (template === 'force') {\n      // Do the tick of the template force and get the new focis\n      templateForce.tick();\n      getFocisFromTemplate();\n    }\n\n    for (let i = 0, n = nodes.length, node, k = alpha * strength; i < n; ++i) {\n      node = nodes[i];\n      node.vx += (foci[groupBy(node)].x - node.x) * k;\n      node.vy += (foci[groupBy(node)].y - node.y) * k;\n    }\n  }\n\n  function initialize() {\n    if (!nodes) {\n      return;\n    }\n\n    if (template === 'treemap') {\n      initializeWithTreemap();\n    } else {\n      initializeWithForce();\n    }\n  }\n\n  force.initialize = function (_) {\n    nodes = _;\n    initialize();\n  };\n\n  function getLinkKey(l) {\n    let sourceID = groupBy(l.source),\n      targetID = groupBy(l.target);\n\n    return sourceID <= targetID\n      ? sourceID + '~' + targetID\n      : targetID + '~' + sourceID;\n  }\n\n  function computeClustersNodeCounts(nodes) {\n    let clustersCounts = new Map(),\n      tmpCount: any = {};\n\n    nodes.forEach(function (d) {\n      if (!clustersCounts.has(groupBy(d))) {\n        clustersCounts.set(groupBy(d), { count: 0, sumforceNodeSize: 0 });\n      }\n    });\n\n    nodes.forEach(function (d) {\n      tmpCount = clustersCounts.get(groupBy(d));\n      tmpCount.count = tmpCount.count + 1;\n      tmpCount.sumforceNodeSize =\n        tmpCount.sumforceNodeSize +\n        // @ts-ignore\n        Math.PI * (forceNodeSize(d) * forceNodeSize(d)) * 1.3;\n      clustersCounts.set(groupBy(d), tmpCount);\n    });\n\n    return clustersCounts;\n  }\n\n  //Returns\n  function computeClustersLinkCounts(links) {\n    let dClusterLinks = new Map(),\n      clusterLinks = [];\n\n    links.forEach(function (l) {\n      let key = getLinkKey(l),\n        count;\n      if (dClusterLinks.has(key)) {\n        count = dClusterLinks.get(key);\n      } else {\n        count = 0;\n      }\n      count += 1;\n      dClusterLinks.set(key, count);\n    });\n\n    dClusterLinks.forEach(function (value, key) {\n      let source, target;\n      source = key.split('~')[0];\n      target = key.split('~')[1];\n      if (source !== undefined && target !== undefined) {\n        clusterLinks.push({\n          source: source,\n          target: target,\n          count: value\n        });\n      }\n    });\n\n    return clusterLinks;\n  }\n\n  //Returns the metagraph of the clusters\n  function getGroupsGraph() {\n    let gnodes = [];\n    let glinks = [];\n    let dNodes = new Map();\n    let c;\n    let i;\n    let cc;\n    let clustersCounts;\n    let clustersLinks;\n\n    clustersCounts = computeClustersNodeCounts(nodes);\n    clustersLinks = computeClustersLinkCounts(links);\n\n    for (c of clustersCounts.keys()) {\n      cc = clustersCounts.get(c);\n      gnodes.push({\n        id: c,\n        size: cc.count,\n        r: Math.sqrt(cc.sumforceNodeSize / Math.PI)\n      }); // Uses approx meta-node size\n      dNodes.set(c, i);\n    }\n\n    clustersLinks.forEach(function (l) {\n      let source = dNodes.get(l.source),\n        target = dNodes.get(l.target);\n      if (source !== undefined && target !== undefined) {\n        glinks.push({\n          source: source,\n          target: target,\n          count: l.count\n        });\n      }\n    });\n\n    return { nodes: gnodes, links: glinks };\n  }\n\n  function getGroupsTree() {\n    let children = [];\n    let c;\n    let cc;\n    let clustersCounts;\n\n    // @ts-ignore\n    clustersCounts = computeClustersNodeCounts(force.nodes());\n\n    for (c of clustersCounts.keys()) {\n      cc = clustersCounts.get(c);\n      children.push({ id: c, size: cc.count });\n    }\n    return { id: 'clustersTree', children: children };\n  }\n\n  function getFocisFromTemplate() {\n    //compute foci\n    // @ts-ignore\n    foci.none = { x: 0, y: 0 };\n    templateNodes.forEach(function (d) {\n      if (template === 'treemap') {\n        foci[d.data.id] = {\n          x: d.x0 + (d.x1 - d.x0) / 2 - offset[0],\n          y: d.y0 + (d.y1 - d.y0) / 2 - offset[1]\n        };\n      } else {\n        foci[d.id] = {\n          x: d.x - offset[0],\n          y: d.y - offset[1]\n        };\n      }\n    });\n    return foci;\n  }\n\n  function initializeWithTreemap() {\n    // @ts-ignore\n    let sim = treemap().size(force.size());\n\n    tree = hierarchy(getGroupsTree())\n      .sum((d: any) => d.radius)\n      .sort(function (a, b) {\n        return b.height - a.height || b.value - a.value;\n      });\n\n    templateNodes = sim(tree).leaves();\n    getFocisFromTemplate();\n  }\n\n  function checkLinksAsObjects() {\n    // Check if links come in the format of indexes instead of objects\n    let linkCount = 0;\n    if (nodes.length === 0) return;\n\n    links.forEach(function (link) {\n      let source, target;\n      if (!nodes) {\n        return;\n      }\n\n      source = link.source;\n      target = link.target;\n\n      if (typeof link.source !== 'object') {\n        source = nodes.find(n => n.id === link.source);\n      }\n\n      if (typeof link.target !== 'object') {\n        target = nodes.find(n => n.id === link.target);\n      }\n\n      if (source === undefined || target === undefined) {\n        throw Error(\n          'Error setting links, couldnt find nodes for a link (see it on the console)'\n        );\n      }\n      link.source = source;\n      link.target = target;\n      link.index = linkCount++;\n    });\n  }\n\n  function initializeWithForce() {\n    let net;\n\n    if (!nodes || !nodes.length) {\n      return;\n    }\n\n    checkLinksAsObjects();\n\n    net = getGroupsGraph();\n    templateForce = forceSimulation(net.nodes)\n      .force('x', forceX(size[0] / 2).strength(0.1))\n      .force('y', forceY(size[1] / 2).strength(0.1))\n      .force('collide', forceCollide(d => d.r).iterations(4))\n      .force('charge', forceManyBody().strength(forceCharge))\n      .force(\n        'links',\n        forceLink(net.nodes.length ? net.links : [])\n          .distance(forceLinkDistance)\n          .strength(forceLinkStrength)\n      );\n\n    templateNodes = templateForce.nodes();\n\n    getFocisFromTemplate();\n  }\n\n  force.template = function (x) {\n    if (!arguments.length) {\n      return template;\n    }\n\n    template = x;\n    initialize();\n    return force;\n  };\n\n  force.groupBy = function (x) {\n    if (!arguments.length) {\n      return groupBy;\n    }\n\n    if (typeof x === 'string') {\n      groupBy = function (d) {\n        return d[x];\n      };\n\n      return force;\n    }\n\n    groupBy = x;\n\n    return force;\n  };\n\n  force.enableGrouping = function (x) {\n    if (!arguments.length) {\n      return enableGrouping;\n    }\n\n    enableGrouping = x;\n\n    return force;\n  };\n\n  force.strength = function (x) {\n    if (!arguments.length) {\n      return strength;\n    }\n\n    strength = x;\n\n    return force as any;\n  };\n\n  force.getLinkStrength = function (e) {\n    if (enableGrouping) {\n      if (groupBy(e.source) === groupBy(e.target)) {\n        if (typeof linkStrengthIntraCluster === 'function') {\n          // @ts-ignore\n          return linkStrengthIntraCluster(e);\n        } else {\n          return linkStrengthIntraCluster;\n        }\n      } else {\n        if (typeof linkStrengthInterCluster === 'function') {\n          // @ts-ignore\n          return linkStrengthInterCluster(e);\n        } else {\n          return linkStrengthInterCluster;\n        }\n      }\n    } else {\n      // Not grouping return the intracluster\n      if (typeof linkStrengthIntraCluster === 'function') {\n        // @ts-ignore\n        return linkStrengthIntraCluster(e);\n      } else {\n        return linkStrengthIntraCluster;\n      }\n    }\n  };\n\n  force.id = function (_) {\n    return arguments.length ? ((id = _), force) : id;\n  };\n\n  force.size = function (_) {\n    return arguments.length ? ((size = _), force) : size;\n  };\n\n  force.linkStrengthInterCluster = function (_) {\n    return arguments.length\n      ? ((linkStrengthInterCluster = _), force)\n      : linkStrengthInterCluster;\n  };\n\n  force.linkStrengthIntraCluster = function (_) {\n    return arguments.length\n      ? ((linkStrengthIntraCluster = _), force)\n      : linkStrengthIntraCluster;\n  };\n\n  force.nodes = function (_) {\n    return arguments.length ? ((nodes = _), force) : nodes;\n  };\n\n  force.links = function (_) {\n    if (!arguments.length) {\n      return links;\n    }\n\n    if (_ === null) {\n      links = [];\n    } else {\n      links = _;\n    }\n\n    initialize();\n\n    return force;\n  };\n\n  force.template = function (x) {\n    if (!arguments.length) {\n      return template;\n    }\n\n    template = x;\n    initialize();\n    return force;\n  };\n\n  force.forceNodeSize = function (_) {\n    return arguments.length\n      ? ((forceNodeSize = typeof _ === 'function' ? _ : constant(+_)),\n      initialize(),\n      force)\n      : forceNodeSize;\n  };\n\n  // Legacy support\n  force.nodeSize = force.forceNodeSize;\n\n  force.forceCharge = function (_) {\n    return arguments.length\n      ? ((forceCharge = typeof _ === 'function' ? _ : constant(+_)),\n      initialize(),\n      force)\n      : forceCharge;\n  };\n\n  force.forceLinkDistance = function (_) {\n    return arguments.length\n      ? ((forceLinkDistance = typeof _ === 'function' ? _ : constant(+_)),\n      initialize(),\n      force)\n      : forceLinkDistance;\n  };\n\n  force.forceLinkStrength = function (_) {\n    return arguments.length\n      ? ((forceLinkStrength = typeof _ === 'function' ? _ : constant(+_)),\n      initialize(),\n      force)\n      : forceLinkStrength;\n  };\n\n  force.offset = function (_) {\n    return arguments.length\n      ? ((offset = typeof _ === 'function' ? _ : constant(+_)), force)\n      : offset;\n  };\n\n  force.getFocis = getFocisFromTemplate;\n\n  return force;\n}\n","import {\n  forceSimulation as d3ForceSimulation,\n  forceLink as d3ForceLink,\n  forceCollide,\n  forceManyBody as d3ForceManyBody,\n  forceX as d3ForceX,\n  forceY as d3ForceY,\n  forceZ as d3ForceZ,\n  forceCenter as d3ForceCenter\n} from 'd3-force-3d';\nimport { forceRadial, DagMode } from './forceUtils';\nimport { LayoutFactoryProps, LayoutStrategy } from './types';\nimport { buildNodeEdges } from './layoutUtils';\nimport { forceInABox } from './forceInABox';\nimport { FORCE_LAYOUTS } from './layoutProvider';\n\nexport interface ForceDirectedLayoutInputs extends LayoutFactoryProps {\n  /**\n   * Center inertia for the layout. Default: 1.\n   */\n  centerInertia?: number;\n\n  /**\n   * Number of dimensions for the layout. 2d or 3d.\n   */\n  dimensions?: number;\n\n  /**\n   * Mode for the dag layout. Only applicable for dag layouts.\n   */\n  mode?: DagMode;\n\n  /**\n   * Distance between links.\n   */\n  linkDistance?: number;\n\n  /**\n   * Strength of the node repulsion.\n   */\n  nodeStrength?: number;\n\n  /**\n   * Strength of the cluster repulsion.\n   */\n  clusterStrength?: number;\n\n  /**\n   * The type of clustering.\n   */\n  clusterType?: 'force' | 'treemap';\n\n  /**\n   * Ratio of the distance between nodes on the same level.\n   */\n  nodeLevelRatio?: number;\n\n  /**\n   * LinkStrength between nodes of different clusters\n   */\n  linkStrengthInterCluster?: number | ((d: any) => number);\n\n  /**\n   * LinkStrength between nodes of the same cluster\n   */\n  linkStrengthIntraCluster?: number | ((d: any) => number);\n\n  /**\n   * Charge between the meta-nodes (Force template only)\n   */\n  forceLinkDistance?: number;\n\n  /**\n   * Used to compute the template force nodes size (Force template only)\n   */\n  forceLinkStrength?: number;\n\n  /**\n   * Used to compute the template force nodes size (Force template only)\n   */\n  forceCharge?: number;\n\n  /**\n   * Used to determine the simulation forceX and forceY values\n   */\n  forceLayout: (typeof FORCE_LAYOUTS)[number];\n}\n\nexport function forceDirected({\n  graph,\n  nodeLevelRatio = 2,\n  mode = null,\n  dimensions = 2,\n  nodeStrength = -250,\n  linkDistance = 50,\n  clusterStrength = 0.5,\n  linkStrengthInterCluster = 0.01,\n  linkStrengthIntraCluster = 0.5,\n  forceLinkDistance = 100,\n  forceLinkStrength = 0.1,\n  clusterType = 'force',\n  forceCharge = -700,\n  getNodePosition,\n  drags,\n  clusterAttribute,\n  forceLayout\n}: ForceDirectedLayoutInputs): LayoutStrategy {\n  const { nodes, edges } = buildNodeEdges(graph);\n\n  // Dynamically adjust node strength based on the number of edges\n  const is2d = dimensions === 2;\n  const nodeStrengthAdjustment =\n    is2d && edges.length > 25 ? nodeStrength * 2 : nodeStrength;\n\n  let forceX;\n  let forceY;\n  if (forceLayout === 'forceDirected2d') {\n    forceX = d3ForceX();\n    forceY = d3ForceY();\n  } else {\n    forceX = d3ForceX(600).strength(0.05);\n    forceY = d3ForceY(600).strength(0.05);\n  }\n\n  // Create the simulation\n  const sim = d3ForceSimulation()\n    .force('center', d3ForceCenter(0, 0))\n    .force('link', d3ForceLink())\n    .force('charge', d3ForceManyBody().strength(nodeStrengthAdjustment))\n    .force('x', forceX)\n    .force('y', forceY)\n    .force('z', d3ForceZ())\n    // Handles nodes not overlapping each other ( most relevant in clustering )\n    .force(\n      'collide',\n      forceCollide(d => d.radius + 10)\n    )\n    .force(\n      'dagRadial',\n      forceRadial({\n        nodes,\n        edges,\n        mode,\n        nodeLevelRatio\n      })\n    )\n    .stop();\n\n  let groupingForce;\n  if (clusterAttribute) {\n    // Dynamically adjust cluster force charge based on the number of nodes\n    let forceChargeAdjustment = forceCharge;\n    if (nodes?.length) {\n      const adjustmentFactor = Math.ceil(nodes.length / 200);\n      forceChargeAdjustment = forceCharge * adjustmentFactor;\n    }\n\n    groupingForce = forceInABox()\n      // Strength to foci\n      .strength(clusterStrength)\n      // Either treemap or force\n      .template(clusterType)\n      // Node attribute to group\n      .groupBy(d => d.data[clusterAttribute])\n      // The graph links. Must be called after setting the grouping attribute\n      .links(edges)\n      // Size of the chart\n      .size([100, 100])\n      // linkStrength between nodes of different clusters\n      .linkStrengthInterCluster(linkStrengthInterCluster)\n      // linkStrength between nodes of the same cluster\n      .linkStrengthIntraCluster(linkStrengthIntraCluster)\n      // linkDistance between meta-nodes on the template (Force template only)\n      .forceLinkDistance(forceLinkDistance)\n      // linkStrength between meta-nodes of the template (Force template only)\n      .forceLinkStrength(forceLinkStrength)\n      // Charge between the meta-nodes (Force template only)\n      .forceCharge(forceChargeAdjustment)\n      // Used to compute the template force nodes size (Force template only)\n      .forceNodeSize(d => d.radius);\n  }\n\n  // Initialize the simulation\n  let layout = sim.numDimensions(dimensions).nodes(nodes);\n\n  if (groupingForce) {\n    layout = layout.force('group', groupingForce);\n  }\n\n  // Run the force on the links\n  if (linkDistance) {\n    let linkForce = layout.force('link');\n    if (linkForce) {\n      linkForce\n        .id(d => d.id)\n        .links(edges)\n        // When no mode passed, its a tree layout\n        // so let's use a larger distance\n        .distance(linkDistance);\n\n      if (groupingForce) {\n        linkForce = linkForce.strength(groupingForce?.getLinkStrength ?? 0.1);\n      }\n    }\n  }\n\n  const nodeMap = new Map(nodes.map(n => [n.id, n]));\n\n  return {\n    step() {\n      // Run the simulation til we get a stable result\n      while (sim.alpha() > 0.01) {\n        sim.tick();\n      }\n      return true;\n    },\n    getNodePosition(id: string) {\n      if (getNodePosition) {\n        const pos = getNodePosition(id, { graph, drags, nodes, edges });\n        if (pos) {\n          return pos;\n        }\n      }\n\n      if (drags?.[id]?.position) {\n        // If we dragged, we need to use that position\n        return drags?.[id]?.position as any;\n      }\n\n      return nodeMap.get(id);\n    }\n  };\n}\n","import circular from 'graphology-layout/circular.js';\nimport { LayoutFactoryProps } from './types';\nimport { buildNodeEdges } from './layoutUtils';\n\nexport interface CircularLayoutInputs extends LayoutFactoryProps {\n  /**\n   * Radius of the circle.\n   */\n  radius: 300;\n}\n\nexport function circular2d({\n  graph,\n  radius,\n  drags,\n  getNodePosition\n}: CircularLayoutInputs) {\n  const layout = circular(graph, {\n    scale: radius\n  });\n\n  const { nodes, edges } = buildNodeEdges(graph);\n\n  return {\n    step() {\n      return true;\n    },\n    getNodePosition(id: string) {\n      if (getNodePosition) {\n        const pos = getNodePosition(id, { graph, drags, nodes, edges });\n        if (pos) {\n          return pos;\n        }\n      }\n\n      if (drags?.[id]?.position) {\n        // If we dragged, we need to use that position\n        return drags?.[id]?.position as any;\n      }\n\n      return layout?.[id];\n    }\n  };\n}\n","import { InternalGraphEdge, InternalGraphNode } from 'types';\nimport { DepthNode, getNodeDepth } from './depthUtils';\nimport { LayoutFactoryProps, LayoutStrategy } from './types';\nimport { hierarchy, stratify, tree } from 'd3-hierarchy';\nimport { buildNodeEdges } from './layoutUtils';\n\nexport interface HierarchicalLayoutInputs extends LayoutFactoryProps {\n  /**\n   * Direction of the layout. Default 'td'.\n   */\n  mode?: 'td' | 'lr';\n  /**\n   * Factor of distance between nodes. Default 1.\n   */\n  nodeSeparation?: number;\n  /**\n   * Size of each node. Default [50,50]\n   */\n  nodeSize?: [number, number];\n}\n\nconst DIRECTION_MAP = {\n  td: {\n    x: 'x',\n    y: 'y',\n    factor: -1\n  },\n  lr: {\n    x: 'y',\n    y: 'x',\n    factor: 1\n  }\n};\n\nexport function hierarchical({\n  graph,\n  drags,\n  mode = 'td',\n  nodeSeparation = 1,\n  nodeSize = [50, 50],\n  getNodePosition\n}: HierarchicalLayoutInputs): LayoutStrategy {\n  const { nodes, edges } = buildNodeEdges(graph);\n\n  const { depths } = getNodeDepth(nodes, edges);\n  const rootNodes = Object.keys(depths).map(d => depths[d]);\n\n  const root = stratify<DepthNode>()\n    .id(d => d.data.id)\n    .parentId(d => d.ins?.[0]?.data?.id)(rootNodes);\n\n  const treeRoot = tree()\n    .separation(() => nodeSeparation)\n    .nodeSize(nodeSize)(hierarchy(root));\n\n  const treeNodes = treeRoot.descendants();\n  const path = DIRECTION_MAP[mode];\n\n  const mappedNodes = new Map<string, InternalGraphNode>(\n    nodes.map(n => {\n      const { x, y } = treeNodes.find((t: any) => t.data.id === n.id);\n      return [\n        n.id,\n        {\n          ...n,\n          [path.x]: x * path.factor,\n          [path.y]: y * path.factor,\n          z: 0\n        }\n      ];\n    })\n  );\n\n  return {\n    step() {\n      return true;\n    },\n    getNodePosition(id: string) {\n      if (getNodePosition) {\n        const pos = getNodePosition(id, { graph, drags, nodes, edges });\n        if (pos) {\n          return pos;\n        }\n      }\n\n      if (drags?.[id]?.position) {\n        // If we dragged, we need to use that position\n        return drags?.[id]?.position as any;\n      }\n\n      return mappedNodes.get(id);\n    }\n  };\n}\n","import noverlapLayout from 'graphology-layout-noverlap';\nimport { LayoutFactoryProps } from './types';\nimport { buildNodeEdges } from './layoutUtils';\n\nexport interface NoOverlapLayoutInputs extends LayoutFactoryProps {\n  /**\n   * Grid size. Default 20.\n   */\n  gridSize?: number;\n\n  /**\n   * Ratio of the layout. Default 10.\n   */\n  ratio?: number;\n\n  /**\n   * Maximum number of iterations. Default 50.\n   */\n  maxIterations?: number;\n\n  /**\n   * Margin between nodes. Default 10.\n   */\n  margin?: number;\n}\n\nexport function nooverlap({\n  graph,\n  margin,\n  drags,\n  getNodePosition,\n  ratio,\n  gridSize,\n  maxIterations\n}: NoOverlapLayoutInputs) {\n  const { nodes, edges } = buildNodeEdges(graph);\n\n  const layout = noverlapLayout(graph, {\n    maxIterations,\n    inputReducer: (_key, attr) => ({\n      ...attr,\n      // Have to specify defaults for the engine\n      x: attr.x || 0,\n      y: attr.y || 0\n    }),\n    settings: {\n      ratio,\n      margin,\n      gridSize\n    }\n  });\n\n  return {\n    step() {\n      return true;\n    },\n    getNodePosition(id: string) {\n      if (getNodePosition) {\n        const pos = getNodePosition(id, { graph, drags, nodes, edges });\n        if (pos) {\n          return pos;\n        }\n      }\n\n      if (drags?.[id]?.position) {\n        // If we dragged, we need to use that position\n        return drags?.[id]?.position as any;\n      }\n\n      return layout?.[id];\n    }\n  };\n}\n","import forceAtlas2Layout from 'graphology-layout-forceatlas2';\nimport { LayoutFactoryProps } from './types';\nimport random from 'graphology-layout/random.js';\n\nexport interface ForceAtlas2LayoutInputs extends LayoutFactoryProps {\n  /**\n   * Should the node’s sizes be taken into account. Default: false.\n   */\n  adjustSizes?: boolean;\n\n  /**\n   * whether to use the Barnes-Hut approximation to compute\n   * repulsion in O(n*log(n)) rather than default O(n^2),\n   * n being the number of nodes. Default: false.\n   */\n  barnesHutOptimize?: boolean;\n\n  /**\n   * Barnes-Hut approximation theta parameter. Default: 0.5.\n   */\n  barnesHutTheta?: number;\n\n  /**\n   * Influence of the edge’s weights on the layout. To consider edge weight, don’t\n   *  forget to pass weighted as true. Default: 1.\n   */\n  edgeWeightInfluence?: number;\n\n  /**\n   * Strength of the layout’s gravity. Default: 10.\n   */\n  gravity?: number;\n\n  /**\n   * Whether to use Noack’s LinLog model. Default: false.\n   */\n  linLogMode?: boolean;\n\n  /**\n   * Whether to consider edge weights when calculating repulsion. Default: false.\n   */\n  outboundAttractionDistribution?: boolean;\n\n  /**\n   * Scaling ratio for repulsion. Default: 100.\n   */\n  scalingRatio?: number;\n\n  /**\n   * Speed of the slowdown. Default: 1.\n   */\n  slowDown?: number;\n\n  /**\n   * Whether to use the strong gravity mode. Default: false.\n   */\n  strongGravityMode?: boolean;\n\n  /**\n   * Number of iterations to perform. Default: 50.\n   */\n  iterations?: number;\n}\n\nexport function forceAtlas2({\n  graph,\n  drags,\n  iterations,\n  ...rest\n}: ForceAtlas2LayoutInputs) {\n  // Note: We need to assign a random position to each node\n  // in order for the force atlas to work.\n  // Reference: https://graphology.github.io/standard-library/layout-forceatlas2.html#pre-requisites\n  random.assign(graph);\n\n  const layout = forceAtlas2Layout(graph, {\n    iterations,\n    settings: rest\n  });\n\n  return {\n    step() {\n      return true;\n    },\n    getNodePosition(id: string) {\n      // If we dragged, we need to use that position\n      return (drags?.[id]?.position as any) || layout?.[id];\n    }\n  };\n}\n","import { LayoutFactoryProps } from './types';\nimport { buildNodeEdges } from './layoutUtils';\n\nexport function custom({ graph, drags, getNodePosition }: LayoutFactoryProps) {\n  const { nodes, edges } = buildNodeEdges(graph);\n\n  return {\n    step() {\n      return true;\n    },\n    getNodePosition(id: string) {\n      return getNodePosition(id, { graph, drags, nodes, edges });\n    }\n  };\n}\n","import { LayoutFactoryProps, LayoutStrategy } from './types';\nimport { forceDirected, ForceDirectedLayoutInputs } from './forceDirected';\nimport { circular2d, CircularLayoutInputs } from './circular2d';\nimport { hierarchical, HierarchicalLayoutInputs } from './hierarchical';\nimport { NoOverlapLayoutInputs, nooverlap } from './nooverlap';\nimport { ForceAtlas2LayoutInputs, forceAtlas2 } from './forceatlas2';\nimport { custom } from './custom';\n\nexport type LayoutOverrides = Partial<\n  | Omit<ForceDirectedLayoutInputs, 'dimensions' | 'mode'>\n  | CircularLayoutInputs\n  | HierarchicalLayoutInputs\n>;\n\nexport const FORCE_LAYOUTS = [\n  'forceDirected2d',\n  'treeTd2d',\n  'treeLr2d',\n  'radialOut2d',\n  'treeTd3d',\n  'treeLr3d',\n  'radialOut3d',\n  'forceDirected3d'\n];\n\nexport function layoutProvider({\n  type,\n  ...rest\n}: LayoutFactoryProps | LayoutOverrides): LayoutStrategy {\n  if (FORCE_LAYOUTS.includes(type)) {\n    const { nodeStrength, linkDistance, nodeLevelRatio } =\n      rest as ForceDirectedLayoutInputs;\n\n    if (type === 'forceDirected2d') {\n      return forceDirected({\n        ...rest,\n        dimensions: 2,\n        nodeLevelRatio: nodeLevelRatio || 2,\n        nodeStrength: nodeStrength || -250,\n        linkDistance,\n        forceLayout: type\n      } as ForceDirectedLayoutInputs);\n    } else if (type === 'treeTd2d') {\n      return forceDirected({\n        ...rest,\n        mode: 'td',\n        dimensions: 2,\n        nodeLevelRatio: nodeLevelRatio || 5,\n        nodeStrength: nodeStrength || -250,\n        linkDistance: linkDistance || 50,\n        forceLayout: type\n      } as ForceDirectedLayoutInputs);\n    } else if (type === 'treeLr2d') {\n      return forceDirected({\n        ...rest,\n        mode: 'lr',\n        dimensions: 2,\n        nodeLevelRatio: nodeLevelRatio || 5,\n        nodeStrength: nodeStrength || -250,\n        linkDistance: linkDistance || 50,\n        forceLayout: type\n      } as ForceDirectedLayoutInputs);\n    } else if (type === 'radialOut2d') {\n      return forceDirected({\n        ...rest,\n        mode: 'radialout',\n        dimensions: 2,\n        nodeLevelRatio: nodeLevelRatio || 5,\n        nodeStrength: nodeStrength || -500,\n        linkDistance: linkDistance || 100,\n        forceLayout: type\n      } as ForceDirectedLayoutInputs);\n    } else if (type === 'treeTd3d') {\n      return forceDirected({\n        ...rest,\n        mode: 'td',\n        dimensions: 3,\n        nodeLevelRatio: nodeLevelRatio || 2,\n        nodeStrength: nodeStrength || -500,\n        linkDistance: linkDistance || 50\n      } as ForceDirectedLayoutInputs);\n    } else if (type === 'treeLr3d') {\n      return forceDirected({\n        ...rest,\n        mode: 'lr',\n        dimensions: 3,\n        nodeLevelRatio: nodeLevelRatio || 2,\n        nodeStrength: nodeStrength || -500,\n        linkDistance: linkDistance || 50,\n        forceLayout: type\n      } as ForceDirectedLayoutInputs);\n    } else if (type === 'radialOut3d') {\n      return forceDirected({\n        ...rest,\n        mode: 'radialout',\n        dimensions: 3,\n        nodeLevelRatio: nodeLevelRatio || 2,\n        nodeStrength: nodeStrength || -500,\n        linkDistance: linkDistance || 100,\n        forceLayout: type\n      } as ForceDirectedLayoutInputs);\n    } else if (type === 'forceDirected3d') {\n      return forceDirected({\n        ...rest,\n        dimensions: 3,\n        nodeLevelRatio: nodeLevelRatio || 2,\n        nodeStrength: nodeStrength || -250,\n        linkDistance,\n        forceLayout: type\n      } as ForceDirectedLayoutInputs);\n    }\n  } else if (type === 'circular2d') {\n    const { radius } = rest as CircularLayoutInputs;\n    return circular2d({\n      ...rest,\n      radius: radius || 300\n    } as CircularLayoutInputs);\n  } else if (type === 'hierarchicalTd') {\n    return hierarchical({ ...rest, mode: 'td' } as HierarchicalLayoutInputs);\n  } else if (type === 'hierarchicalLr') {\n    return hierarchical({ ...rest, mode: 'lr' } as HierarchicalLayoutInputs);\n  } else if (type === 'nooverlap') {\n    const { graph, maxIterations, ratio, margin, gridSize, ...settings } =\n      rest as NoOverlapLayoutInputs;\n\n    return nooverlap({\n      type: 'nooverlap',\n      graph,\n      margin: margin || 10,\n      maxIterations: maxIterations || 50,\n      ratio: ratio || 10,\n      gridSize: gridSize || 20,\n      ...settings\n    });\n  } else if (type === 'forceatlas2') {\n    const { graph, iterations, gravity, scalingRatio, ...settings } =\n      rest as ForceAtlas2LayoutInputs;\n\n    return forceAtlas2({\n      type: 'forceatlas2',\n      graph,\n      ...settings,\n      scalingRatio: scalingRatio || 100,\n      gravity: gravity || 10,\n      iterations: iterations || 50\n    });\n  } else if (type === 'custom') {\n    return custom({\n      type: 'custom',\n      ...rest\n    } as LayoutFactoryProps);\n  }\n\n  throw new Error(`Layout ${type} not found.`);\n}\n","import { GraphEdge, GraphNode } from '../types';\nimport { getNodeDepth } from './depthUtils';\nimport { LayoutTypes } from './types';\n\n/**\n * Given a set of nodes and edges, determine the type of layout that\n * is most ideal. This is very beta.\n */\nexport function recommendLayout(\n  nodes: GraphNode[],\n  edges: GraphEdge[]\n): LayoutTypes {\n  const { invalid } = getNodeDepth(nodes as any[], edges as any[]);\n  const nodeCount = nodes.length;\n\n  if (!invalid) {\n    // Large tree layouts\n    if (nodeCount > 100) {\n      return 'radialOut2d';\n    } else {\n      // Smaller tree layouts\n      return 'treeTd2d';\n    }\n  }\n\n  // Circular layouts\n  return 'forceDirected2d';\n}\n","import { PerspectiveCamera } from 'three';\nimport { EdgeLabelPosition } from '../symbols';\n\nexport type LabelVisibilityType = 'all' | 'auto' | 'none' | 'nodes' | 'edges';\n\ninterface CalcLabelVisibilityArgs {\n  nodeCount: number;\n  nodePosition?: { x: number; y: number; z: number };\n  labelType: LabelVisibilityType;\n  camera?: PerspectiveCamera;\n}\n\nexport function calcLabelVisibility({\n  nodeCount,\n  nodePosition,\n  labelType,\n  camera\n}: CalcLabelVisibilityArgs) {\n  return (shape: 'node' | 'edge', size: number) => {\n    if (\n      camera &&\n      nodePosition &&\n      camera?.position?.z / camera?.zoom - nodePosition?.z > 6000\n    ) {\n      return false;\n    }\n\n    if (labelType === 'all') {\n      return true;\n    } else if (labelType === 'nodes' && shape === 'node') {\n      return true;\n    } else if (labelType === 'edges' && shape === 'edge') {\n      return true;\n    } else if (labelType === 'auto' && shape === 'node') {\n      if (size > 7) {\n        return true;\n      } else if (\n        camera &&\n        nodePosition &&\n        camera.position.z / camera.zoom - nodePosition.z < 3000\n      ) {\n        return true;\n      }\n    }\n\n    return false;\n  };\n}\n\nexport function getLabelOffsetByType(\n  offset: number,\n  position: EdgeLabelPosition\n): number {\n  switch (position) {\n  case 'above':\n    return offset;\n  case 'below':\n    return -offset;\n  case 'inline':\n  case 'natural':\n  default:\n    return 0;\n  }\n}\n","import pagerank from 'graphology-metrics/centrality/pagerank.js';\nimport { SizingStrategy, SizingStrategyInputs } from './types';\n\nexport function pageRankSizing({\n  graph\n}: SizingStrategyInputs): SizingStrategy {\n  const ranks = pagerank(graph);\n\n  return {\n    ranks,\n    getSizeForNode: (nodeID: string) => ranks[nodeID] * 80\n  };\n}\n","import { SizingStrategy, SizingStrategyInputs } from './types';\nimport { degreeCentrality } from 'graphology-metrics/centrality/degree.js';\n\nexport function centralitySizing({\n  graph\n}: SizingStrategyInputs): SizingStrategy {\n  const ranks = degreeCentrality(graph);\n\n  return {\n    ranks,\n    getSizeForNode: (nodeID: string) => ranks[nodeID] * 20\n  };\n}\n","import { SizingStrategy, SizingStrategyInputs } from './types';\n\nexport function attributeSizing({\n  graph,\n  attribute,\n  defaultSize\n}: SizingStrategyInputs): SizingStrategy {\n  const map = new Map();\n\n  if (attribute) {\n    graph.forEachNode((id, node) => {\n      const size = node.data?.[attribute];\n      if (isNaN(size)) {\n        console.warn(`Attribute ${size} is not a number for node ${node.id}`);\n      }\n\n      map.set(id, size || 0);\n    });\n  } else {\n    console.warn('Attribute sizing configured but no attribute provided');\n  }\n\n  return {\n    getSizeForNode: (nodeId: string) => {\n      if (!attribute || !map) {\n        return defaultSize;\n      }\n\n      return map.get(nodeId);\n    }\n  };\n}\n","import { pageRankSizing } from './pageRank';\nimport { centralitySizing } from './centrality';\nimport { attributeSizing } from './attribute';\nimport { SizingStrategyInputs } from './types';\nimport { scaleLinear } from 'd3-scale';\n\nexport type SizingType =\n  | 'none'\n  | 'pagerank'\n  | 'centrality'\n  | 'attribute'\n  | 'default';\n\nexport interface NodeSizeProviderInputs extends SizingStrategyInputs {\n  /**\n   * The sizing strategy to use.\n   */\n  type: SizingType;\n}\n\nconst providers = {\n  pagerank: pageRankSizing,\n  centrality: centralitySizing,\n  attribute: attributeSizing,\n  none: ({ defaultSize }: SizingStrategyInputs) => ({\n    getSizeForNode: (_id: string) => defaultSize\n  })\n};\n\nexport function nodeSizeProvider({ type, ...rest }: NodeSizeProviderInputs) {\n  const provider = providers[type]?.(rest);\n  if (!provider && type !== 'default') {\n    throw new Error(`Unknown sizing strategy: ${type}`);\n  }\n\n  const { graph, minSize, maxSize } = rest;\n  const sizes = new Map();\n  let min;\n  let max;\n\n  graph.forEachNode((id, node) => {\n    let size;\n    if (type === 'default') {\n      size = node.size || rest.defaultSize;\n    } else {\n      size = provider.getSizeForNode(id);\n    }\n\n    if (min === undefined || size < min) {\n      min = size;\n    }\n\n    if (max === undefined || size > max) {\n      max = size;\n    }\n\n    sizes.set(id, size);\n  });\n\n  // Relatively scale the sizes\n  if (type !== 'none') {\n    const scale = scaleLinear()\n      .domain([min, max])\n      .rangeRound([minSize, maxSize]);\n\n    for (const [nodeId, size] of sizes) {\n      sizes.set(nodeId, scale(size));\n    }\n  }\n\n  return sizes;\n}\n","import Graph from 'graphology';\nimport { nodeSizeProvider, SizingType } from '../sizing';\nimport {\n  GraphEdge,\n  GraphNode,\n  InternalGraphEdge,\n  InternalGraphNode\n} from '../types';\nimport { calcLabelVisibility, LabelVisibilityType } from './visibility';\nimport { LayoutStrategy } from '../layout';\n\n/**\n * Initialize the graph with the nodes/edges.\n */\nexport function buildGraph(\n  graph: Graph,\n  nodes: GraphNode[],\n  edges: GraphEdge[]\n) {\n  // TODO: We probably want to make this\n  // smarter and only add/remove nodes\n  graph.clear();\n\n  for (const node of nodes) {\n    try {\n      graph.addNode(node.id, node);\n    } catch ({ message }) {\n      console.error(`[Graph] ${message}`);\n    }\n  }\n\n  for (const edge of edges) {\n    try {\n      graph.addEdge(edge.source, edge.target, edge);\n    } catch ({ message }) {\n      console.error(`[Graph] ${message}`);\n    }\n  }\n\n  return graph;\n}\n\ninterface TransformGraphInput {\n  graph: Graph;\n  layout: LayoutStrategy;\n  sizingType?: SizingType;\n  labelType?: LabelVisibilityType;\n  sizingAttribute?: string;\n  minNodeSize?: number;\n  maxNodeSize?: number;\n  defaultNodeSize?: number;\n}\n\n/**\n * Transform the graph into a format that is easier to work with.\n */\nexport function transformGraph({\n  graph,\n  layout,\n  sizingType,\n  labelType,\n  sizingAttribute,\n  defaultNodeSize,\n  minNodeSize,\n  maxNodeSize\n}: TransformGraphInput) {\n  const nodes: InternalGraphNode[] = [];\n  const edges: InternalGraphEdge[] = [];\n  const map = new Map<string, InternalGraphNode>();\n\n  const sizes = nodeSizeProvider({\n    graph,\n    type: sizingType,\n    attribute: sizingAttribute,\n    minSize: minNodeSize,\n    maxSize: maxNodeSize,\n    defaultSize: defaultNodeSize\n  });\n\n  const nodeCount = graph.nodes().length;\n  const checkVisibility = calcLabelVisibility({ nodeCount, labelType });\n\n  graph.forEachNode((id, node) => {\n    const position = layout.getNodePosition(id);\n    const { data, fill, icon, label, size, ...rest } = node;\n    const nodeSize = sizes.get(node.id);\n    const labelVisible = checkVisibility('node', nodeSize);\n\n    const nodeLinks = graph.inboundNeighbors(node.id) || [];\n    const parents = nodeLinks.map(n => graph.getNodeAttributes(n));\n\n    const n: InternalGraphNode = {\n      ...(node as any),\n      size: nodeSize,\n      labelVisible,\n      label,\n      icon,\n      fill,\n      parents,\n      data: {\n        ...rest,\n        ...(data ?? {})\n      },\n      position: {\n        ...position,\n        x: position.x || 0,\n        y: position.y || 0,\n        z: position.z || 1\n      }\n    };\n\n    map.set(node.id, n);\n    nodes.push(n);\n  });\n\n  graph.forEachEdge((_id, link) => {\n    const from = map.get(link.source);\n    const to = map.get(link.target);\n\n    if (from && to) {\n      const { data, id, label, size, fill, ...rest } = link;\n      const labelVisible = checkVisibility('edge', size);\n\n      // TODO: Fix type\n      edges.push({\n        ...link,\n        id,\n        label,\n        labelVisible,\n        size,\n        fill,\n        data: {\n          ...rest,\n          id,\n          ...(data || {})\n        }\n      } as any);\n    }\n  });\n\n  return {\n    nodes,\n    edges\n  };\n}\n","export const animationConfig = {\n  mass: 10,\n  tension: 1000,\n  friction: 300,\n  // Decreasing precision to improve performance from 0.00001\n  precision: 0.1\n};\n","import { Curve, Vector3 } from 'three';\n\nimport { EdgeArrowPosition } from '../symbols/Arrow';\n\n// Calculate the correct position for an arrow along a curve,\n// as well as the tangent to the curve at that point.\nexport function getArrowVectors(\n  placement: EdgeArrowPosition,\n  curve: Curve<Vector3>,\n  arrowLength: number\n): [Vector3, Vector3] {\n  const curveLength = curve.getLength();\n  const absSize = placement === 'end' ? curveLength : curveLength / 2;\n  const offset = placement === 'end' ? arrowLength / 2 : 0;\n  const u = (absSize - offset) / curveLength;\n\n  const position = curve.getPointAt(u);\n  const rotation = curve.getTangentAt(u);\n\n  return [position, rotation];\n}\n\nexport function getArrowSize(size: number): [number, number] {\n  return [size + 6, 2 + size / 1.5];\n}\n","import { Curve, LineCurve3, QuadraticBezierCurve3, Vector3 } from 'three';\nimport { InternalGraphNode, InternalVector3 } from '../types';\n\nconst MULTI_EDGE_OFFSET_FACTOR = 0.7;\n\n/**\n * Get the midpoint given two points.\n */\nexport function getMidPoint(\n  from: InternalVector3,\n  to: InternalVector3,\n  offset = 0\n) {\n  const fromVector = new Vector3(from.x, from.y || 0, from.z || 0);\n  const toVector = new Vector3(to.x, to.y || 0, to.z || 0);\n  const midVector = new Vector3()\n    .addVectors(fromVector, toVector)\n    .divideScalar(2);\n\n  return midVector.setLength(midVector.length() + offset);\n}\n\n/**\n * Calculate the center for a quadratic bezier curve.\n *\n * 1) Find the point halfway between the start and end points of the desired curve\n * 2) Find the vector pependicular to that point\n * 3) Find the point 1/4 the distance between start and end along that vector.\n */\nexport function getCurvePoints(\n  from: Vector3,\n  to: Vector3,\n  offset = -1\n): [Vector3, Vector3, Vector3] {\n  const fromVector = from.clone();\n  const toVector = to.clone();\n  const v = new Vector3().subVectors(toVector, fromVector);\n  const vlen = v.length();\n  const vn = v.clone().normalize();\n  const vv = new Vector3().subVectors(toVector, fromVector).divideScalar(2);\n  const k = Math.abs(vn.x) % 1;\n  const b = new Vector3(-vn.y, vn.x - k * vn.z, k * vn.y).normalize();\n  const vm = new Vector3()\n    .add(fromVector)\n    .add(vv)\n    .add(b.multiplyScalar(vlen / 4).multiplyScalar(offset));\n\n  return [from, vm, to];\n}\n\n/**\n * Get the curve given two points.\n */\nexport function getCurve(\n  from: Vector3,\n  fromOffset: number,\n  to: Vector3,\n  toOffset: number,\n  curved: boolean,\n  curveOffset?: number\n): Curve<Vector3> {\n  const offsetFrom = getPointBetween(from, to, fromOffset);\n  const offsetTo = getPointBetween(to, from, toOffset);\n  return curved\n    ? new QuadraticBezierCurve3(\n      ...getCurvePoints(offsetFrom, offsetTo, curveOffset)\n    )\n    : new LineCurve3(offsetFrom, offsetTo);\n}\n\n/**\n * Create a threejs vector for a node.\n */\nexport function getVector(node: InternalGraphNode): Vector3 {\n  return new Vector3(node.position.x, node.position.y, node.position.z || 0);\n}\n\n/**\n * Get the point between two vectors.\n */\nfunction getPointBetween(from: Vector3, to: Vector3, offset: number): Vector3 {\n  const distance = from.distanceTo(to);\n  return from.clone().add(\n    to\n      .clone()\n      .sub(from)\n      .multiplyScalar(offset / distance)\n  );\n}\n\n/**\n * Given a node and a new vector set, update the node model.\n */\nexport function updateNodePosition(node: InternalGraphNode, offset: Vector3) {\n  return {\n    ...node,\n    position: {\n      ...node.position,\n      x: node.position.x + offset.x,\n      y: node.position.y + offset.y,\n      z: node.position.z + offset.z\n    }\n  };\n}\n\n/**\n * Calculate the curve offset for an edge.\n * This is used to offset edges that are parallel to each other (same source and same target).\n * This will return a curveOffset of null if the edge is not parallel to any other edges.\n */\nexport function calculateEdgeCurveOffset({ edge, edges, curved }) {\n  let updatedCurved = curved;\n  let curveOffset: number;\n\n  const parallelEdges = edges\n    .filter(e => e.target === edge.target && e.source === edge.source)\n    .map(e => e.id);\n\n  if (parallelEdges.length > 1) {\n    updatedCurved = true;\n    const edgeIndex = parallelEdges.indexOf(edge.id);\n\n    if (parallelEdges.length === 2) {\n      curveOffset =\n        edgeIndex === 0 ? MULTI_EDGE_OFFSET_FACTOR : -MULTI_EDGE_OFFSET_FACTOR;\n    } else {\n      curveOffset =\n        (edgeIndex - Math.floor(parallelEdges.length / 2)) *\n        MULTI_EDGE_OFFSET_FACTOR;\n    }\n  }\n\n  return { curved: updatedCurved, curveOffset };\n}\n","import { InternalGraphNode } from '../types';\n\nexport interface CenterPositionVector {\n  x: number;\n  y: number;\n  z: number;\n  minX: number;\n  maxX: number;\n  minY: number;\n  maxY: number;\n  minZ: number;\n  maxZ: number;\n  height: number;\n  width: number;\n}\n\n/**\n * Given a collection of nodes, get the center point.\n */\nexport function getLayoutCenter(\n  nodes: InternalGraphNode[]\n): CenterPositionVector {\n  let minX = Number.POSITIVE_INFINITY;\n  let maxX = Number.NEGATIVE_INFINITY;\n  let minY = Number.POSITIVE_INFINITY;\n  let maxY = Number.NEGATIVE_INFINITY;\n  let minZ = Number.POSITIVE_INFINITY;\n  let maxZ = Number.NEGATIVE_INFINITY;\n\n  for (let node of nodes) {\n    minX = Math.min(minX, node.position.x);\n    maxX = Math.max(maxX, node.position.x);\n    minY = Math.min(minY, node.position.y);\n    maxY = Math.max(maxY, node.position.y);\n    minZ = Math.min(minZ, node.position.z);\n    maxZ = Math.max(maxZ, node.position.z);\n  }\n\n  return {\n    height: maxY - minY,\n    width: maxX - minX,\n    minX,\n    maxX,\n    minY,\n    maxY,\n    minZ,\n    maxZ,\n    x: (maxX + minX) / 2,\n    y: (maxY + minY) / 2,\n    z: (maxZ + minZ) / 2\n  };\n}\n","import { InternalGraphNode } from '../types';\nimport { CenterPositionVector, getLayoutCenter } from './layout';\n\n/**\n * Given nodes and a attribute, find all the cluster groups.\n */\nexport function buildClusterGroups(\n  nodes: InternalGraphNode[],\n  clusterAttribute?: string\n) {\n  if (!clusterAttribute) {\n    return new Map();\n  }\n\n  return nodes.reduce((entryMap, e) => {\n    const val = e.data[clusterAttribute];\n    if (val) {\n      entryMap.set(val, [...(entryMap.get(val) || []), e]);\n    }\n    return entryMap;\n  }, new Map());\n}\n\nexport interface CalculateClustersInput {\n  nodes: InternalGraphNode[];\n  clusterAttribute?: string;\n}\n\nexport interface ClusterGroup {\n  nodes: InternalGraphNode[];\n  position: CenterPositionVector;\n  label: string;\n}\n\n/**\n * Builds the cluster map.\n */\nexport function calculateClusters({\n  nodes,\n  clusterAttribute\n}: CalculateClustersInput) {\n  const result = new Map<string, ClusterGroup>();\n\n  if (clusterAttribute) {\n    const groups = buildClusterGroups(nodes, clusterAttribute);\n    for (const [key, nodes] of groups) {\n      const position = getLayoutCenter(nodes);\n      result.set(key, {\n        label: key,\n        nodes,\n        position\n      });\n    }\n  }\n\n  return result;\n}\n","import { useCallback, useRef } from 'react';\nimport { ThreeEvent } from '@react-three/fiber';\n\nexport interface HoverIntentOptions {\n  interval?: number;\n  sensitivity?: number;\n  timeout?: number;\n  disabled?: boolean;\n  onPointerOver: (event: ThreeEvent<PointerEvent>) => void;\n  onPointerOut: (event: ThreeEvent<PointerEvent>) => void;\n}\n\nexport interface HoverIntentResult {\n  pointerOut: (event: ThreeEvent<PointerEvent>) => void;\n  pointerOver: (event: ThreeEvent<PointerEvent>) => void;\n}\n\n/**\n * Hover intent identifies if the user actually is\n * intending to over by measuring the position of the mouse\n * once a pointer enters and determining if in a duration if\n * the mouse moved inside a certain threshold and fires the events.\n */\nexport const useHoverIntent = ({\n  sensitivity = 7,\n  interval = 50,\n  timeout = 0,\n  disabled,\n  onPointerOver,\n  onPointerOut\n}: HoverIntentOptions | undefined): HoverIntentResult => {\n  const mouseOver = useRef<boolean>(false);\n  const timer = useRef<any | null>(null);\n  const state = useRef<number>(0);\n  const coords = useRef({\n    x: null,\n    y: null,\n    px: null,\n    py: null\n  });\n\n  const onMouseMove = useCallback((event: MouseEvent) => {\n    coords.current.x = event.clientX;\n    coords.current.y = event.clientY;\n  }, []);\n\n  const comparePosition = useCallback(\n    (event: ThreeEvent<PointerEvent>) => {\n      timer.current = clearTimeout(timer.current);\n      const { px, x, py, y } = coords.current;\n\n      if (Math.abs(px - x) + Math.abs(py - y) < sensitivity) {\n        state.current = 1;\n        onPointerOver(event);\n      } else {\n        coords.current.px = x;\n        coords.current.py = y;\n        timer.current = setTimeout(() => comparePosition(event), interval);\n      }\n    },\n    [interval, onPointerOver, sensitivity]\n  );\n\n  const cleanup = useCallback(() => {\n    clearTimeout(timer.current);\n    if (typeof window !== 'undefined') {\n      document.removeEventListener('mousemove', onMouseMove, false);\n    }\n  }, [onMouseMove]);\n\n  const pointerOver = useCallback(\n    (event: ThreeEvent<PointerEvent>) => {\n      if (!disabled) {\n        mouseOver.current = true;\n        cleanup();\n\n        if (state.current !== 1) {\n          coords.current.px = event.pointer.x;\n          coords.current.py = event.pointer.y;\n\n          if (typeof window !== 'undefined') {\n            document.addEventListener('mousemove', onMouseMove, false);\n          }\n\n          timer.current = setTimeout(() => comparePosition(event), timeout);\n        }\n      }\n    },\n    [cleanup, comparePosition, disabled, onMouseMove, timeout]\n  );\n\n  const delay = useCallback(\n    (event: ThreeEvent<PointerEvent>) => {\n      timer.current = clearTimeout(timer.current);\n      state.current = 0;\n      onPointerOut(event);\n    },\n    [onPointerOut]\n  );\n\n  const pointerOut = useCallback(\n    (event: ThreeEvent<PointerEvent>) => {\n      mouseOver.current = false;\n      cleanup();\n\n      if (state.current === 1) {\n        timer.current = setTimeout(() => delay(event), timeout);\n      }\n    },\n    [cleanup, delay, timeout]\n  );\n\n  return {\n    pointerOver,\n    pointerOut\n  };\n};\n","import { useThree } from '@react-three/fiber';\nimport { useMemo } from 'react';\nimport { useGesture } from 'react-use-gesture';\nimport { Vector2, Vector3, Plane } from 'three';\nimport { InternalGraphPosition } from '../types';\n\ninterface DragParams {\n  draggable: boolean;\n  position: InternalGraphPosition;\n  set: (position: Vector3) => void;\n  onDragStart: () => void;\n  onDragEnd: () => void;\n}\n\nexport const useDrag = ({\n  draggable,\n  set,\n  position,\n  onDragStart,\n  onDragEnd\n}: DragParams) => {\n  const camera = useThree(state => state.camera);\n  const raycaster = useThree(state => state.raycaster);\n  const size = useThree(state => state.size);\n  const gl = useThree(state => state.gl);\n\n  // Reference: https://codesandbox.io/s/react-three-draggable-cxu37\n  const { mouse2D, mouse3D, offset, normal, plane } = useMemo(\n    () => ({\n      // Normalized 2D screen space mouse coords\n      mouse2D: new Vector2(),\n      // 3D world space mouse coords\n      mouse3D: new Vector3(),\n      // Drag point offset from object origin\n      offset: new Vector3(),\n      // Normal of the drag plane\n      normal: new Vector3(),\n      // Drag plane\n      plane: new Plane()\n    }),\n    []\n  );\n\n  const clientRect = useMemo(\n    () => gl.domElement.getBoundingClientRect(),\n    [gl.domElement]\n  );\n\n  return useGesture(\n    {\n      onDragStart: ({ event }) => {\n        // @ts-ignore\n        const { eventObject, point } = event;\n\n        // Save the offset of click point from object origin\n        eventObject.getWorldPosition(offset).sub(point);\n\n        // Set initial 3D cursor position (needed for onDrag plane calculation)\n        mouse3D.copy(point);\n\n        // Run user callback\n        onDragStart();\n      },\n      onDrag: ({ event }) => {\n        // Compute normalized mouse coordinates (screen space)\n        const nx =\n          ((event.clientX - (clientRect?.left ?? 0)) / size.width) * 2 - 1;\n        const ny =\n          -((event.clientY - (clientRect?.top ?? 0)) / size.height) * 2 + 1;\n\n        // Unlike the mouse from useThree, this works offscreen\n        mouse2D.set(nx, ny);\n\n        // Update raycaster (otherwise it doesn't track offscreen)\n        raycaster.setFromCamera(mouse2D, camera);\n\n        // The drag plane is normal to the camera view\n        camera.getWorldDirection(normal).negate();\n\n        // Find the plane that's normal to the camera and contains our drag point\n        plane.setFromNormalAndCoplanarPoint(normal, mouse3D);\n\n        // Find the point of intersection\n        raycaster.ray.intersectPlane(plane, mouse3D);\n\n        // Update the object position with the original offset\n        const updated = new Vector3(position.x, position.y, position.z)\n          .copy(mouse3D)\n          .add(offset);\n\n        return set(updated);\n      },\n      onDragEnd\n    },\n    { drag: { enabled: draggable, threshold: 10 } }\n  );\n};\n","import Graph from 'graphology';\nimport { bidirectional } from 'graphology-shortest-path';\n\nexport function findPath(graph: Graph, source: string, target: string) {\n  return bidirectional(graph, source, target);\n}\n","import { StoreApi, create } from 'zustand';\nimport createContext from 'zustand/context';\nimport {\n  InternalGraphEdge,\n  InternalGraphNode,\n  InternalGraphPosition\n} from './types';\nimport { BufferGeometry, Mesh, Vector3 } from 'three';\nimport {\n  CenterPositionVector,\n  ClusterGroup,\n  getLayoutCenter,\n  getVector,\n  updateNodePosition\n} from './utils';\nimport Graph from 'graphology';\nimport { Theme } from './themes';\n\nexport type DragReferences = {\n  [key: string]: InternalGraphNode;\n};\n\nexport interface GraphState {\n  nodes: InternalGraphNode[];\n  edges: InternalGraphEdge[];\n  graph: Graph;\n  clusters: Map<string, ClusterGroup>;\n  collapsedNodeIds?: string[];\n  centerPosition?: CenterPositionVector;\n  actives?: string[];\n  selections?: string[];\n  edgeContextMenus?: Set<string>;\n  setEdgeContextMenus: (edges: Set<string>) => void;\n  edgeMeshes: Array<Mesh<BufferGeometry>>;\n  setEdgeMeshes: (edgeMeshes: Array<Mesh<BufferGeometry>>) => void;\n  draggingId?: string | null;\n  drags?: DragReferences;\n  panning?: boolean;\n  theme: Theme;\n  setTheme: (theme: Theme) => void;\n  setClusters: (clusters: Map<string, ClusterGroup>) => void;\n  setPanning: (panning: boolean) => void;\n  setDrags: (drags: DragReferences) => void;\n  setDraggingId: (id: string | null) => void;\n  setActives: (actives: string[]) => void;\n  setSelections: (selections: string[]) => void;\n  setNodes: (nodes: InternalGraphNode[]) => void;\n  setEdges: (edges: InternalGraphEdge[]) => void;\n  setNodePosition: (id: string, position: InternalGraphPosition) => void;\n  setCollapsedNodeIds: (nodeIds: string[]) => void;\n}\n\nexport const { Provider, useStore } = createContext<StoreApi<GraphState>>();\n\nexport const createStore = ({\n  actives = [],\n  selections = [],\n  collapsedNodeIds = [],\n  theme\n}: Partial<GraphState>) =>\n  create<GraphState>(set => ({\n    theme: {\n      ...theme,\n      edge: {\n        ...theme.edge,\n        label: {\n          ...theme.edge.label,\n          fontSize: theme.edge.label.fontSize ?? 6\n        }\n      }\n    },\n    edges: [],\n    nodes: [],\n    collapsedNodeIds,\n    clusters: new Map(),\n    panning: false,\n    draggingId: null,\n    actives,\n    edgeContextMenus: new Set(),\n    edgeMeshes: [],\n    selections,\n    drags: {},\n    graph: new Graph({ multi: true }),\n    setTheme: theme => set(state => ({ ...state, theme })),\n    setClusters: clusters => set(state => ({ ...state, clusters })),\n    setEdgeContextMenus: edgeContextMenus =>\n      set(state => ({\n        ...state,\n        edgeContextMenus\n      })),\n    setEdgeMeshes: edgeMeshes => set(state => ({ ...state, edgeMeshes })),\n    setPanning: panning => set(state => ({ ...state, panning })),\n    setDrags: drags => set(state => ({ ...state, drags })),\n    setDraggingId: draggingId => set(state => ({ ...state, draggingId })),\n    setActives: actives => set(state => ({ ...state, actives })),\n    setSelections: selections => set(state => ({ ...state, selections })),\n    setNodes: nodes =>\n      set(state => ({\n        ...state,\n        nodes,\n        centerPosition: getLayoutCenter(nodes)\n      })),\n    setEdges: edges => set(state => ({ ...state, edges })),\n    setNodePosition: (id, position) =>\n      set(state => {\n        const node = state.nodes.find(n => n.id === id);\n        const originalVector = getVector(node);\n        const newVector = new Vector3(position.x, position.y, position.z);\n        const offset = newVector.sub(originalVector);\n        const nodes = [...state.nodes];\n\n        if (state.selections?.includes(id)) {\n          state.selections?.forEach(id => {\n            const node = state.nodes.find(n => n.id === id);\n            // Selections can contain edges:\n            if (node) {\n              const nodeIndex = state.nodes.indexOf(node);\n              nodes[nodeIndex] = updateNodePosition(node, offset);\n            }\n          });\n        } else {\n          const nodeIndex = state.nodes.indexOf(node);\n          nodes[nodeIndex] = updateNodePosition(node, offset);\n        }\n\n        return {\n          ...state,\n          drags: {\n            ...state.drags,\n            [id]: node\n          },\n          nodes\n        };\n      }),\n    setCollapsedNodeIds: (nodeIds = []) =>\n      set(state => ({ ...state, collapsedNodeIds: nodeIds }))\n  }));\n","import { GraphEdge, GraphNode } from '../types';\n\ninterface GetHiddenChildrenInput {\n  nodeId: string;\n  nodes: GraphNode[];\n  edges: GraphEdge[];\n  currentHiddenNodes: GraphNode[];\n  currentHiddenEdges: GraphEdge[];\n}\n\ninterface GetVisibleIdsInput {\n  collapsedIds: string[];\n  nodes: GraphNode[];\n  edges: GraphEdge[];\n}\n\ninterface GetExpandPathInput {\n  nodeId: string;\n  edges: GraphEdge[];\n  visibleEdgeIds: string[];\n}\n\n/**\n * Get the children of a node id that is hidden.\n */\nfunction getHiddenChildren({\n  nodeId,\n  nodes,\n  edges,\n  currentHiddenNodes,\n  currentHiddenEdges\n}: GetHiddenChildrenInput) {\n  const hiddenNodes: GraphNode[] = [];\n  const hiddenEdges: GraphEdge[] = [];\n  const curHiddenNodeIds = currentHiddenNodes.map(n => n.id);\n  const curHiddenEdgeIds = currentHiddenEdges.map(e => e.id);\n\n  const nodeQueue: string[] = [];\n  let currNodeId = '';\n  let iteration = 1;\n\n  nodeQueue.push(nodeId);\n  while (nodeQueue.length > 0) {\n    console.log('getHiddenChildren iteration', iteration, 'nodeId', nodeId);\n    currNodeId = nodeQueue.shift();\n    const outboundEdges = edges.filter(l => l.source === currNodeId);\n    const outboundEdgeNodeIds = outboundEdges.map(l => l.target);\n    hiddenEdges.push(...outboundEdges);\n    for (const outboundEdgeNodeId of outboundEdgeNodeIds) {\n      const incomingEdges = edges.filter(\n        l => l.target === outboundEdgeNodeId && l.source !== nodeId\n      );\n      let hideNode = false;\n      // Check to see if any other edge is coming into this node\n      if (incomingEdges.length === 0) {\n        hideNode = true;\n      } else if (\n        incomingEdges.length > 0 &&\n        !curHiddenNodeIds.includes(outboundEdgeNodeId)\n      ) {\n        // If all inbound links are hidden, hide this node as well\n        const inboundNodeLinkIds = incomingEdges.map(l => l.id);\n        if (inboundNodeLinkIds.every(i => curHiddenEdgeIds.includes(i))) {\n          hideNode = true;\n        }\n      }\n      if (hideNode) {\n        // Need to hide this node and any children of this node\n        const node = nodes.find(n => n.id === outboundEdgeNodeId);\n        if (node) {\n          hiddenNodes.push(node);\n          nodeQueue.push(outboundEdgeNodeId);\n        }\n      }\n    }\n    iteration += 1;\n    if (iteration > 200) {\n      console.error('Taking forever', nodeQueue);\n    }\n  }\n\n  const uniqueEdges: GraphEdge[] = Object.values(\n    hiddenEdges.reduce(\n      (acc, next) => ({\n        ...acc,\n        [next.id]: next\n      }),\n      {}\n    )\n  );\n\n  const uniqueNodes: GraphNode[] = Object.values(\n    hiddenNodes.reduce(\n      (acc, next) => ({\n        ...acc,\n        [next.id]: next\n      }),\n      {}\n    )\n  );\n\n  return {\n    hiddenEdges: uniqueEdges,\n    hiddenNodes: uniqueNodes\n  };\n}\n\n/**\n * Get the visible nodes and edges given a collapsed set of ids.\n */\nexport const getVisibleEntities = ({\n  collapsedIds,\n  nodes,\n  edges\n}: GetVisibleIdsInput) => {\n  const curHiddenNodes = [];\n  const curHiddenEdges = [];\n\n  for (const collapsedId of collapsedIds) {\n    const { hiddenEdges, hiddenNodes } = getHiddenChildren({\n      nodeId: collapsedId,\n      nodes,\n      edges,\n      currentHiddenEdges: curHiddenEdges,\n      currentHiddenNodes: curHiddenNodes\n    });\n\n    curHiddenNodes.push(...hiddenNodes);\n    curHiddenEdges.push(...hiddenEdges);\n  }\n\n  const hiddenNodeIds = curHiddenNodes.map(n => n.id);\n  const hiddenEdgeIds = curHiddenEdges.map(e => e.id);\n  const visibleEdges = edges.filter(e => !hiddenEdgeIds.includes(e.id));\n  const visibleNodes = nodes.filter(n => !hiddenNodeIds.includes(n.id));\n\n  return {\n    visibleNodes,\n    visibleEdges\n  };\n};\n\n/**\n * Get the path to expand a node.\n */\nexport const getExpandPath = ({\n  nodeId,\n  edges,\n  visibleEdgeIds\n}: GetExpandPathInput) => {\n  const parentIds = [];\n  const inboundEdges = edges.filter(l => l.target === nodeId);\n  const inboundEdgeIds = inboundEdges.map(e => e.id);\n  const hasVisibleInboundEdge = inboundEdgeIds.some(id =>\n    visibleEdgeIds.includes(id)\n  );\n\n  if (hasVisibleInboundEdge) {\n    // If there is a visible edge to this node, that means the node is\n    // visible so no parents need to be expanded\n    return parentIds;\n  }\n\n  const inboundEdgeNodeIds = inboundEdges.map(l => l.source);\n  let addedParent = false;\n\n  for (const inboundNodeId of inboundEdgeNodeIds) {\n    if (!addedParent) {\n      // Only want to expand a single path to the node, so if there\n      // are multiple hidden incoming edges, only expand the first\n      // to reduce how many nodes are expanded to get to the node\n      parentIds.push(\n        ...[\n          inboundNodeId,\n          ...getExpandPath({ nodeId: inboundNodeId, edges, visibleEdgeIds })\n        ]\n      );\n      addedParent = true;\n    }\n  }\n\n  return parentIds;\n};\n","import React, { useCallback } from 'react';\nimport { GraphEdge, GraphNode } from 'types';\nimport { getExpandPath, getVisibleEntities } from './utils';\n\nexport interface UseCollapseProps {\n  /**\n   * Current collapsed node ids.\n   */\n  collapsedNodeIds?: string[];\n\n  /**\n   * Node data.\n   */\n  nodes?: GraphNode[];\n\n  /**\n   * Edge data.\n   */\n  edges?: GraphEdge[];\n}\n\nexport interface CollpaseResult {\n  /**\n   * Determine if a node is currently collapsed\n   */\n  getIsCollapsed: (nodeId: string) => boolean;\n\n  /**\n   * Return a list of ids required to expand in order to view the provided node\n   */\n  getExpandPathIds: (nodeId: string) => string[];\n}\n\nexport const useCollapse = ({\n  collapsedNodeIds = [],\n  nodes = [],\n  edges = []\n}: UseCollapseProps): CollpaseResult => {\n  const getIsCollapsed = useCallback(\n    (nodeId: string) => {\n      const { visibleNodes } = getVisibleEntities({\n        nodes,\n        edges,\n        collapsedIds: collapsedNodeIds\n      });\n      const visibleNodeIds = visibleNodes.map(n => n.id);\n\n      return !visibleNodeIds.includes(nodeId);\n    },\n    [collapsedNodeIds, edges, nodes]\n  );\n\n  const getExpandPathIds = useCallback(\n    (nodeId: string) => {\n      const { visibleEdges } = getVisibleEntities({\n        nodes,\n        edges,\n        collapsedIds: collapsedNodeIds\n      });\n      const visibleEdgeIds = visibleEdges.map(e => e.id);\n\n      return getExpandPath({ nodeId, edges, visibleEdgeIds });\n    },\n    [collapsedNodeIds, edges, nodes]\n  );\n\n  return {\n    getIsCollapsed,\n    getExpandPathIds\n  };\n};\n","import { useRef, useCallback, useEffect, useMemo } from 'react';\nimport { useThree } from '@react-three/fiber';\nimport { PerspectiveCamera } from 'three';\nimport { SizingType } from './sizing';\nimport {\n  LayoutTypes,\n  layoutProvider,\n  LayoutStrategy,\n  LayoutOverrides\n} from './layout';\nimport { LabelVisibilityType, calcLabelVisibility } from './utils/visibility';\nimport { tick } from './layout/layoutUtils';\nimport { GraphEdge, GraphNode } from './types';\nimport { buildGraph, transformGraph } from './utils/graph';\nimport { DragReferences, useStore } from './store';\nimport { getVisibleEntities } from './collapse';\nimport { calculateClusters } from './utils/cluster';\n\nexport interface GraphInputs {\n  nodes: GraphNode[];\n  edges: GraphEdge[];\n  collapsedNodeIds?: string[];\n  layoutType?: LayoutTypes;\n  sizingType?: SizingType;\n  labelType?: LabelVisibilityType;\n  sizingAttribute?: string;\n  selections?: string[];\n  actives?: string[];\n  clusterAttribute?: string;\n  defaultNodeSize?: number;\n  minNodeSize?: number;\n  maxNodeSize?: number;\n  layoutOverrides?: LayoutOverrides;\n}\n\nexport const useGraph = ({\n  layoutType,\n  sizingType,\n  labelType,\n  sizingAttribute,\n  clusterAttribute,\n  selections,\n  nodes,\n  edges,\n  actives,\n  collapsedNodeIds,\n  defaultNodeSize,\n  maxNodeSize,\n  minNodeSize,\n  layoutOverrides\n}: GraphInputs) => {\n  const graph = useStore(state => state.graph);\n  const setClusters = useStore(state => state.setClusters);\n  const stateCollapsedNodeIds = useStore(state => state.collapsedNodeIds);\n  const setEdges = useStore(state => state.setEdges);\n  const stateNodes = useStore(state => state.nodes);\n  const setNodes = useStore(state => state.setNodes);\n  const setSelections = useStore(state => state.setSelections);\n  const setActives = useStore(state => state.setActives);\n  const drags = useStore(state => state.drags);\n  const setDrags = useStore(state => state.setDrags);\n  const setCollapsedNodeIds = useStore(state => state.setCollapsedNodeIds);\n  const layoutMounted = useRef<boolean>(false);\n  const layout = useRef<LayoutStrategy | null>(null);\n  const camera = useThree(state => state.camera) as PerspectiveCamera;\n\n  const { visibleEdges, visibleNodes } = useMemo(\n    () =>\n      getVisibleEntities({\n        collapsedIds: stateCollapsedNodeIds,\n        nodes,\n        edges\n      }),\n    [stateCollapsedNodeIds, nodes, edges]\n  );\n\n  // Transient updates\n  const dragRef = useRef<DragReferences>(drags);\n  useEffect(() => {\n    dragRef.current = drags;\n  }, [drags]);\n\n  const updateLayout = useCallback(\n    async (curLayout?: any) => {\n      // Cache the layout provider\n      layout.current =\n        curLayout ||\n        layoutProvider({\n          ...layoutOverrides,\n          type: layoutType,\n          graph,\n          drags: dragRef.current,\n          clusterAttribute\n        });\n\n      // Run the layout\n      await tick(layout.current);\n\n      // Transform the graph\n      const result = transformGraph({\n        graph,\n        layout: layout.current,\n        sizingType,\n        labelType,\n        sizingAttribute,\n        maxNodeSize,\n        minNodeSize,\n        defaultNodeSize\n      });\n\n      // Calculate clusters\n      const clusters = calculateClusters({\n        nodes: result.nodes,\n        clusterAttribute\n      });\n\n      // Set our store outputs\n      setEdges(result.edges);\n      setNodes(result.nodes);\n      setClusters(clusters);\n    },\n    // eslint-disable-next-line react-hooks/exhaustive-deps\n    [\n      layoutOverrides,\n      layoutType,\n      clusterAttribute,\n      sizingType,\n      labelType,\n      sizingAttribute,\n      maxNodeSize,\n      minNodeSize,\n      defaultNodeSize,\n      setEdges,\n      setNodes,\n      setClusters\n    ]\n  );\n\n  useEffect(() => {\n    const nodes = stateNodes.map(node => ({\n      ...node,\n      labelVisible: calcLabelVisibility({\n        nodeCount: stateNodes?.length,\n        labelType,\n        camera,\n        nodePosition: node?.position\n      })('node', node?.size)\n    }));\n\n    const isVisibilityUpdated = nodes.some(\n      (node, i) => node.labelVisible !== stateNodes[i].labelVisible\n    );\n\n    if (isVisibilityUpdated) {\n      setNodes(nodes);\n    }\n  }, [camera, camera.zoom, camera.position.z, setNodes, stateNodes, labelType]);\n\n  useEffect(() => {\n    // Let's set the store selections so its easier to access\n    if (layoutMounted.current) {\n      setSelections(selections);\n    }\n  }, [selections, setSelections]);\n\n  useEffect(() => {\n    // Let's set the store actives so its easier to access\n    if (layoutMounted.current) {\n      setActives(actives);\n    }\n  }, [actives, setActives]);\n\n  // Create the nggraph graph object\n  useEffect(() => {\n    async function update() {\n      layoutMounted.current = false;\n      buildGraph(graph, visibleNodes, visibleEdges);\n      await updateLayout();\n      layoutMounted.current = true;\n    }\n\n    update();\n    // eslint-disable-next-line\n  }, [visibleNodes, visibleEdges]);\n\n  useEffect(() => {\n    // Let's set the store collapsedNodeIds so its easier to access\n    if (layoutMounted.current) {\n      setCollapsedNodeIds(collapsedNodeIds);\n    }\n  }, [collapsedNodeIds, setCollapsedNodeIds]);\n\n  // Update layout on type changes\n  useEffect(() => {\n    if (layoutMounted.current) {\n      // When a update is changed, discard all the previous drag positions\n      // NOTE: This sets the transient and the state\n      dragRef.current = {};\n      setDrags({});\n\n      // Recalculate the layout\n      updateLayout();\n    }\n  }, [layoutType, updateLayout, setDrags]);\n\n  // Update layout on size, label changes\n  useEffect(() => {\n    if (layoutMounted.current) {\n      updateLayout(layout.current);\n    }\n  }, [sizingType, sizingAttribute, labelType, updateLayout]);\n};\n","import React, { FC, useMemo } from 'react';\nimport { Billboard, Text } from 'glodrei';\nimport { Color, ColorRepresentation, Euler } from 'three';\nimport ellipsize from 'ellipsize';\n\nexport interface LabelProps {\n  /**\n   * Text to render.\n   */\n  text: string;\n\n  /**\n   * Font URL.\n   * Reference: https://github.com/reaviz/reagraph/issues/23\n   */\n  fontUrl?: string;\n\n  /**\n   * Size of the font.\n   */\n  fontSize?: number;\n\n  /**\n   * Color of the text.\n   */\n  color?: ColorRepresentation;\n\n  /**\n   * Stroke of the text.\n   */\n  stroke?: ColorRepresentation;\n\n  /**\n   * Opacity for the label.\n   */\n  opacity?: number;\n\n  /**\n   * The lenth of which to start the ellipsis.\n   */\n  ellipsis?: number;\n\n  /**\n   * Whether the label is active ( dragging, hover, focus ).\n   */\n  active?: boolean;\n\n  /**\n   * Rotation of the label.\n   */\n  rotation?: Euler | [number, number, number];\n}\n\nexport const Label: FC<LabelProps> = ({\n  text,\n  fontSize,\n  fontUrl,\n  color,\n  opacity,\n  stroke,\n  active,\n  ellipsis,\n  rotation\n}) => {\n  const shortText = ellipsis && !active ? ellipsize(text, ellipsis) : text;\n  const normalizedColor = useMemo(() => new Color(color), [color]);\n  const normalizedStroke = useMemo(\n    () => (stroke ? new Color(stroke) : undefined),\n    [stroke]\n  );\n\n  return (\n    <Billboard position={[0, 0, 1]}>\n      <Text\n        font={fontUrl}\n        fontSize={fontSize}\n        color={normalizedColor}\n        fillOpacity={opacity}\n        textAlign=\"center\"\n        outlineWidth={stroke ? 1 : 0}\n        outlineColor={normalizedStroke}\n        depthOffset={0}\n        maxWidth={100}\n        overflowWrap=\"break-word\"\n        rotation={rotation}\n      >\n        {shortText}\n      </Text>\n    </Billboard>\n  );\n};\n\nLabel.defaultProps = {\n  opacity: 1,\n  fontSize: 7,\n  color: '#2A6475',\n  ellipsis: 75\n};\n","import React, { FC, useMemo } from 'react';\nimport { Color, ColorRepresentation, DoubleSide } from 'three';\nimport { animationConfig } from '../utils/animation';\nimport { useSpring, a } from '@react-spring/three';\nimport { Billboard } from 'glodrei';\n\nexport interface RingProps {\n  /**\n   * The color of the ring.\n   */\n  color?: ColorRepresentation;\n\n  /**\n   * Whether the ring should be animated.\n   */\n  animated?: boolean;\n\n  /**\n   * The size of the ring.\n   */\n  size?: number;\n\n  /**\n   * The opacity of the ring.\n   */\n  opacity?: number;\n\n  /**\n   * The stroke width of the ring.\n   */\n  strokeWidth?: number;\n\n  /**\n   * The inner radius of the ring.\n   * Default value: 4\n   */\n  innerRadius?: number;\n\n  /**\n   * The number of segments in the ring geometry.\n   * Default value: 25\n   */\n  segments?: number;\n}\n\nexport const Ring: FC<RingProps> = ({\n  color,\n  size,\n  opacity,\n  animated,\n  strokeWidth,\n  innerRadius = 4,\n  segments = 25\n}) => {\n  const normalizedColor = useMemo(() => new Color(color), [color]);\n\n  const { ringSize, ringOpacity } = useSpring({\n    from: {\n      ringOpacity: 0,\n      ringSize: [0.00001, 0.00001, 0.00001]\n    },\n    to: {\n      ringOpacity: opacity,\n      ringSize: [size / 2, size / 2, 1]\n    },\n    config: {\n      ...animationConfig,\n      duration: animated ? undefined : 0\n    }\n  });\n\n  const strokeWidthFraction = strokeWidth / 10;\n  const outerRadius = innerRadius + strokeWidthFraction;\n\n  return (\n    <Billboard position={[0, 0, 1]}>\n      <a.mesh scale={ringSize as any}>\n        <ringGeometry\n          attach=\"geometry\"\n          args={[innerRadius, outerRadius, segments]}\n        />\n        <a.meshBasicMaterial\n          attach=\"material\"\n          color={normalizedColor}\n          transparent={true}\n          depthTest={false}\n          opacity={ringOpacity}\n          side={DoubleSide}\n          fog={true}\n        />\n      </a.mesh>\n    </Billboard>\n  );\n};\n\nRing.defaultProps = {\n  color: '#D8E6EA',\n  size: 1,\n  opacity: 0.5,\n  strokeWidth: 5\n};\n","import React, { FC, useMemo } from 'react';\nimport { useSpring, a } from '@react-spring/three';\nimport { animationConfig } from '../../utils/animation';\nimport { Color, DoubleSide } from 'three';\nimport { NodeRendererProps } from '../../types';\nimport { Ring } from '../Ring';\nimport { useStore } from '../../store';\n\nexport const Sphere: FC<NodeRendererProps> = ({\n  color,\n  id,\n  size,\n  active,\n  selected,\n  opacity,\n  animated\n}) => {\n  const { scale, nodeOpacity } = useSpring({\n    from: {\n      // Note: This prevents incorrect scaling w/ 0\n      scale: [0.00001, 0.00001, 0.00001],\n      nodeOpacity: 0\n    },\n    to: {\n      scale: [size, size, size],\n      nodeOpacity: opacity\n    },\n    config: {\n      ...animationConfig,\n      duration: animated ? undefined : 0\n    }\n  });\n  const normalizedColor = useMemo(() => new Color(color), [color]);\n  const theme = useStore(state => state.theme);\n\n  return (\n    <>\n      <a.mesh userData={{ id, type: 'node' }} scale={scale as any}>\n        <sphereGeometry attach=\"geometry\" args={[1, 25, 25]} />\n        <a.meshPhongMaterial\n          attach=\"material\"\n          side={DoubleSide}\n          transparent={true}\n          fog={true}\n          opacity={nodeOpacity}\n          color={normalizedColor}\n        />\n      </a.mesh>\n      <Ring\n        opacity={selected ? 0.5 : 0}\n        size={size}\n        animated={animated}\n        color={selected ? theme.ring.activeFill : theme.ring.fill}\n      />\n    </>\n  );\n};\n\nSphere.defaultProps = {\n  opacity: 1,\n  active: false\n};\n","import CameraControls from 'camera-controls';\nimport { createContext, useContext } from 'react';\n\nexport interface CameraControlsContextProps {\n  /**\n   * The camera controls object.\n   */\n  controls: CameraControls | null;\n\n  /**\n   * A function that resets the camera controls.\n   * If the optional `animated` argument is true, the reset is animated.\n   */\n  resetControls: (animated?: boolean) => void;\n\n  /**\n   * A function that zooms in the camera.\n   */\n  zoomIn: () => void;\n\n  /**\n   * A function that zooms out the camera.\n   */\n  zoomOut: () => void;\n\n  /**\n   * A function that dollies in the camera.\n   */\n  dollyIn: (distance?: number) => void;\n\n  /**\n   * A function that dollies out the camera.\n   */\n  dollyOut: (distance?: number) => void;\n\n  /**\n   * A function that pans the camera to the left.\n   */\n  panLeft: () => void;\n\n  /**\n   * A function that pans the camera to the right.\n   */\n  panRight: () => void;\n\n  /**\n   * A function that pans the camera upwards.\n   */\n  panUp: () => void;\n\n  /**\n   * A function that pans the camera downwards.\n   */\n  panDown: () => void;\n}\n\nexport const CameraControlsContext = createContext<CameraControlsContextProps>({\n  controls: null,\n  resetControls: () => undefined,\n  zoomIn: () => undefined,\n  zoomOut: () => undefined,\n  dollyIn: () => undefined,\n  dollyOut: () => undefined,\n  panLeft: () => undefined,\n  panRight: () => undefined,\n  panUp: () => undefined,\n  panDown: () => undefined\n});\n\nexport const useCameraControls = () => {\n  const context = useContext(CameraControlsContext);\n\n  if (context === undefined) {\n    throw new Error(\n      '`useCameraControls` hook must be used within a `ControlsProvider` component'\n    );\n  }\n\n  return context;\n};\n","import React, {\n  FC,\n  useRef,\n  useEffect,\n  useCallback,\n  forwardRef,\n  Ref,\n  useImperativeHandle,\n  useMemo,\n  ReactNode\n} from 'react';\nimport { useThree, useFrame, extend } from '@react-three/fiber';\nimport {\n  MOUSE,\n  Vector2,\n  Vector3,\n  Vector4,\n  Quaternion,\n  Matrix4,\n  Spherical,\n  Box3,\n  Sphere,\n  Raycaster,\n  MathUtils\n} from 'three';\nimport ThreeCameraControls from 'camera-controls';\nimport {\n  CameraControlsContext,\n  CameraControlsContextProps\n} from './useCameraControls';\nimport { useHotkeys } from 'reakeys';\nimport * as holdEvent from 'hold-event';\nimport { useStore } from '../store';\n\n// Install the camera controls\n// Use a subset for better three shaking\nThreeCameraControls.install({\n  THREE: {\n    MOUSE: MOUSE,\n    Vector2: Vector2,\n    Vector3: Vector3,\n    Vector4: Vector4,\n    Quaternion: Quaternion,\n    Matrix4: Matrix4,\n    Spherical: Spherical,\n    Box3: Box3,\n    Sphere: Sphere,\n    Raycaster: Raycaster,\n    MathUtils: {\n      DEG2RAD: MathUtils?.DEG2RAD,\n      clamp: MathUtils?.clamp\n    }\n  }\n});\n\n// Extend r3f with the new controls\nextend({ ThreeCameraControls });\n\nconst KEY_CODES = {\n  ARROW_LEFT: 37,\n  ARROW_UP: 38,\n  ARROW_RIGHT: 39,\n  ARROW_DOWN: 40\n};\n\nconst leftKey = new holdEvent.KeyboardKeyHold(KEY_CODES.ARROW_LEFT, 100);\nconst rightKey = new holdEvent.KeyboardKeyHold(KEY_CODES.ARROW_RIGHT, 100);\nconst upKey = new holdEvent.KeyboardKeyHold(KEY_CODES.ARROW_UP, 100);\nconst downKey = new holdEvent.KeyboardKeyHold(KEY_CODES.ARROW_DOWN, 100);\n\nexport type CameraMode = 'pan' | 'rotate' | 'orbit';\n\nexport interface CameraControlsProps {\n  /**\n   * Mode of the camera.\n   */\n  mode?: CameraMode;\n\n  /**\n   * Children symbols.\n   */\n  children?: ReactNode;\n\n  /**\n   * Animate transitions to centering.\n   */\n  animated?: boolean;\n\n  /**\n   * Whether the controls are enabled.\n   */\n  disabled?: boolean;\n\n  /**\n   * The maximum distance for the camera.\n   */\n  maxDistance?: number;\n\n  /**\n   * The minimum distance for the camera.\n   */\n  minDistance?: number;\n}\n\nexport type CameraControlsRef = CameraControlsContextProps;\n\nexport const CameraControls: FC<\n  CameraControlsProps & { ref?: Ref<CameraControlsRef> }\n> = forwardRef(\n  (\n    { mode, children, animated, disabled, minDistance, maxDistance },\n    ref: Ref<CameraControlsRef>\n  ) => {\n    const cameraRef = useRef<ThreeCameraControls | null>(null);\n    const camera = useThree(state => state.camera);\n    const gl = useThree(state => state.gl);\n    const isOrbiting = mode === 'orbit';\n    const setPanning = useStore(state => state.setPanning);\n    const draggingId = useStore(state => state.draggingId);\n\n    useFrame((_state, delta) => {\n      if (cameraRef.current?.enabled) {\n        cameraRef.current?.update(delta);\n      }\n\n      if (isOrbiting) {\n        cameraRef.current.azimuthAngle += 20 * delta * MathUtils.DEG2RAD;\n      }\n    }, -1);\n\n    useEffect(() => () => cameraRef.current?.dispose(), []);\n\n    const zoomIn = useCallback(() => {\n      cameraRef.current?.zoom(camera.zoom / 2, animated);\n    }, [animated, camera.zoom]);\n\n    const zoomOut = useCallback(() => {\n      cameraRef.current?.zoom(-camera.zoom / 2, animated);\n    }, [animated, camera.zoom]);\n\n    const dollyIn = useCallback(\n      distance => {\n        cameraRef.current?.dolly(distance, animated);\n      },\n      [animated]\n    );\n\n    const dollyOut = useCallback(\n      distance => {\n        cameraRef.current?.dolly(distance, animated);\n      },\n      [animated]\n    );\n\n    const panRight = useCallback(\n      event => {\n        if (!isOrbiting) {\n          cameraRef.current?.truck(-0.03 * event.deltaTime, 0, animated);\n        }\n      },\n      [animated, isOrbiting]\n    );\n\n    const panLeft = useCallback(\n      event => {\n        if (!isOrbiting) {\n          cameraRef.current?.truck(0.03 * event.deltaTime, 0, animated);\n        }\n      },\n      [animated, isOrbiting]\n    );\n\n    const panUp = useCallback(\n      event => {\n        if (!isOrbiting) {\n          cameraRef.current?.truck(0, 0.03 * event.deltaTime, animated);\n        }\n      },\n      [animated, isOrbiting]\n    );\n\n    const panDown = useCallback(\n      event => {\n        if (!isOrbiting) {\n          cameraRef.current?.truck(0, -0.03 * event.deltaTime, animated);\n        }\n      },\n      [animated, isOrbiting]\n    );\n\n    const onKeyDown = useCallback(\n      event => {\n        if (event.code === 'Space') {\n          if (mode === 'rotate') {\n            cameraRef.current.mouseButtons.left =\n              ThreeCameraControls.ACTION.TRUCK;\n          } else {\n            cameraRef.current.mouseButtons.left =\n              ThreeCameraControls.ACTION.ROTATE;\n          }\n        }\n      },\n      [mode]\n    );\n\n    const onKeyUp = useCallback(\n      event => {\n        if (event.code === 'Space') {\n          if (mode === 'rotate') {\n            cameraRef.current.mouseButtons.left =\n              ThreeCameraControls.ACTION.ROTATE;\n          } else {\n            cameraRef.current.mouseButtons.left =\n              ThreeCameraControls.ACTION.TRUCK;\n          }\n        }\n      },\n      [mode]\n    );\n\n    useEffect(() => {\n      if (!disabled) {\n        leftKey.addEventListener('holding', panLeft);\n        rightKey.addEventListener('holding', panRight);\n        upKey.addEventListener('holding', panUp);\n        downKey.addEventListener('holding', panDown);\n\n        if (typeof window !== 'undefined') {\n          window.addEventListener('keydown', onKeyDown);\n          window.addEventListener('keyup', onKeyUp);\n        }\n      }\n\n      return () => {\n        leftKey.removeEventListener('holding', panLeft);\n        rightKey.removeEventListener('holding', panRight);\n        upKey.removeEventListener('holding', panUp);\n        downKey.removeEventListener('holding', panDown);\n\n        if (typeof window !== 'undefined') {\n          window.removeEventListener('keydown', onKeyDown);\n          window.removeEventListener('keyup', onKeyUp);\n        }\n      };\n    }, [disabled, onKeyDown, onKeyUp, panDown, panLeft, panRight, panUp]);\n\n    useEffect(() => {\n      if (disabled) {\n        cameraRef.current.mouseButtons.left = ThreeCameraControls.ACTION.NONE;\n        cameraRef.current.mouseButtons.middle = ThreeCameraControls.ACTION.NONE;\n        cameraRef.current.mouseButtons.wheel = ThreeCameraControls.ACTION.NONE;\n      } else {\n        cameraRef.current.mouseButtons.left = ThreeCameraControls.ACTION.TRUCK;\n        cameraRef.current.mouseButtons.middle =\n          ThreeCameraControls.ACTION.TRUCK;\n        cameraRef.current.mouseButtons.wheel = ThreeCameraControls.ACTION.DOLLY;\n      }\n    }, [disabled]);\n\n    useEffect(() => {\n      const onControl = () => setPanning(true);\n      const onControlEnd = () => setPanning(false);\n\n      const ref = cameraRef.current;\n      if (ref) {\n        ref.addEventListener('control', onControl);\n        ref.addEventListener('controlend', onControlEnd);\n      }\n\n      return () => {\n        if (ref) {\n          ref.removeEventListener('control', onControl);\n          ref.removeEventListener('controlend', onControlEnd);\n        }\n      };\n    }, [cameraRef, setPanning]);\n\n    useEffect(() => {\n      // If a node is being dragged, disable the camera controls\n      if (draggingId) {\n        cameraRef.current.mouseButtons.left = ThreeCameraControls.ACTION.NONE;\n      } else {\n        if (mode === 'rotate') {\n          cameraRef.current.mouseButtons.left =\n            ThreeCameraControls.ACTION.ROTATE;\n        } else {\n          cameraRef.current.mouseButtons.left =\n            ThreeCameraControls.ACTION.TRUCK;\n        }\n      }\n    }, [draggingId, mode]);\n\n    useHotkeys([\n      {\n        name: 'Zoom In',\n        disabled,\n        category: 'Graph',\n        keys: 'command+shift+i',\n        callback: event => {\n          event.preventDefault();\n          zoomIn();\n        }\n      },\n      {\n        name: 'Zoom Out',\n        category: 'Graph',\n        disabled,\n        keys: 'command+shift+o',\n        callback: event => {\n          event.preventDefault();\n          zoomOut();\n        }\n      }\n    ]);\n\n    const values = useMemo(\n      () => ({\n        controls: cameraRef.current,\n        zoomIn: () => zoomIn(),\n        zoomOut: () => zoomOut(),\n        dollyIn: (distance = 1000) => dollyIn(distance),\n        dollyOut: (distance = -1000) => dollyOut(distance),\n        panLeft: (deltaTime = 100) => panLeft({ deltaTime }),\n        panRight: (deltaTime = 100) => panRight({ deltaTime }),\n        panDown: (deltaTime = 100) => panDown({ deltaTime }),\n        panUp: (deltaTime = 100) => panUp({ deltaTime }),\n        resetControls: (animated?: boolean) =>\n          cameraRef.current?.reset(animated)\n      }),\n      // eslint-disable-next-line\n      [zoomIn, zoomOut, panLeft, panRight, panDown, panUp, cameraRef.current]\n    );\n\n    useImperativeHandle(ref, () => values);\n\n    return (\n      <CameraControlsContext.Provider value={values}>\n        <threeCameraControls\n          ref={cameraRef}\n          args={[camera, gl.domElement]}\n          smoothTime={0.1}\n          minDistance={minDistance}\n          dollyToCursor\n          maxDistance={maxDistance}\n        />\n        {children}\n      </CameraControlsContext.Provider>\n    );\n  }\n);\n\nCameraControls.defaultProps = {\n  mode: 'rotate',\n  minDistance: 1000,\n  maxDistance: 50000\n};\n","import { PerspectiveCamera } from 'three';\nimport { InternalGraphPosition } from '../types';\n\n/**\n * Get the visible height at the z depth.\n * Ref: https://discourse.threejs.org/t/functions-to-calculate-the-visible-width-height-at-a-given-z-depth-from-a-perspective-camera/269\n */\nfunction visibleHeightAtZDepth(depth: number, camera: PerspectiveCamera) {\n  // compensate for cameras not positioned at z=0\n  const cameraOffset = camera.position.z;\n  if (depth < cameraOffset) depth -= cameraOffset;\n  else depth += cameraOffset;\n\n  // vertical fov in radians\n  const vFOV = ((camera.fov / camera.zoom) * Math.PI) / 180;\n\n  // Math.abs to ensure the result is always positive\n  return 2 * Math.tan(vFOV / 2) * Math.abs(depth);\n}\n\n/**\n * Get the visible width at the z depth.\n */\nfunction visibleWidthAtZDepth(depth: number, camera: PerspectiveCamera) {\n  const height = visibleHeightAtZDepth(depth, camera);\n  return height * camera.aspect;\n}\n\n/**\n * Returns whether the node is in view of the camera.\n */\nexport function isNodeInView(\n  camera: PerspectiveCamera,\n  nodePosition: InternalGraphPosition\n): boolean {\n  const visibleWidth = visibleWidthAtZDepth(1, camera);\n  const visibleHeight = visibleHeightAtZDepth(1, camera);\n\n  // The boundary coordinates of the area visible to the camera relative to the scene\n  const visibleArea = {\n    x0: camera?.position?.x - visibleWidth / 2,\n    x1: camera?.position?.x + visibleWidth / 2,\n    y0: camera?.position?.y - visibleHeight / 2,\n    y1: camera?.position?.y + visibleHeight / 2\n  };\n\n  return (\n    nodePosition?.x > visibleArea.x0 &&\n    nodePosition?.x < visibleArea.x1 &&\n    nodePosition?.y > visibleArea.y0 &&\n    nodePosition?.y < visibleArea.y1\n  );\n}\n\n/**\n * Get the closest axis to a given angle.\n */\nexport function getClosestAxis(angle: number, axes: number[]) {\n  return axes.reduce((prev, curr) =>\n    Math.abs(curr - (angle % Math.PI)) < Math.abs(prev - (angle % Math.PI))\n      ? curr\n      : prev\n  );\n}\n\n/**\n * Get how far an angle is from the closest 2D axis in radians.\n */\nexport function getDegreesToClosest2dAxis(\n  horizontalAngle: number,\n  verticalAngle: number\n) {\n  const closestHorizontalAxis = getClosestAxis(horizontalAngle, [0, Math.PI]);\n  const closestVerticalAxis = getClosestAxis(verticalAngle, [\n    Math.PI / 2,\n    (3 * Math.PI) / 2\n  ]);\n\n  return {\n    horizontalRotation: closestHorizontalAxis - (horizontalAngle % Math.PI),\n    verticalRotation: closestVerticalAxis - (verticalAngle % Math.PI)\n  };\n}\n","import { useThree } from '@react-three/fiber';\nimport { useCameraControls } from './useCameraControls';\nimport { useCallback, useLayoutEffect, useRef, useState } from 'react';\nimport { Vector3, Box3, PerspectiveCamera } from 'three';\nimport { useHotkeys } from 'reakeys';\nimport { getLayoutCenter } from '../utils/layout';\nimport { InternalGraphNode } from '../types';\nimport { useStore } from '../store';\nimport { isNodeInView, getDegreesToClosest2dAxis } from './utils';\nimport { LayoutTypes } from 'layout/types';\n\nconst PADDING = 50;\n\nexport interface CenterNodesParams {\n  animated?: boolean;\n  centerOnlyIfNodesNotInView?: boolean;\n}\n\nexport interface FitNodesParams {\n  animated?: boolean;\n  fitOnlyIfNodesNotInView?: boolean;\n}\n\nexport interface CenterGraphInput {\n  /**\n   * Whether the animate the transition or not.\n   */\n  animated?: boolean;\n\n  /**\n   * Whether the center graph function is disabled or not.\n   */\n  disabled?: boolean;\n\n  /**\n   * The layout type of the graph used to determine rotation logic.\n   */\n  layoutType: LayoutTypes;\n}\n\nexport interface CenterGraphOutput {\n  /**\n   * Centers the graph on a specific node or list of nodes.\n   *\n   * @param nodes - An array of `InternalGraphNode` objects to center the graph on. If this parameter is omitted,\n   * the graph will be centered on all nodes.\n   *\n   * @param animated - A boolean flag that determines whether the centering action should be animated.\n   *\n   * @param centerOnlyIfNodesNotInView - A boolean flag that determines whether the graph should\n   * only be centered if the nodes specified by `nodes` are not currently in view. If this\n   * parameter is `true`, the graph will only be re-centered if one or more of the nodes\n   * specified by `nodes` are not currently visible in the viewport. If this parameter is\n   * `false` or omitted, the graph will be re-centered regardless of whether the nodes\n   * are currently in view.\n   */\n  centerNodes: (nodes: InternalGraphNode[], opts: CenterNodesParams) => void;\n\n  /**\n   * Centers the graph on a specific node or list of nodes.\n   *\n   * @param nodeIds - An array of node IDs to center the graph on. If this parameter is omitted,\n   * the graph will be centered on all nodes.\n   *\n   * @param opts.centerOnlyIfNodesNotInView - A boolean flag that determines whether the graph should\n   * only be centered if the nodes specified by `ids` are not currently in view. If this\n   * parameter is `true`, the graph will only be re-centered if one or more of the nodes\n   * specified by `ids` are not currently in view. If this parameter is\n   * `false` or omitted, the graph will be re-centered regardless of whether the nodes\n   * are currently in view.\n   */\n  centerNodesById: (nodeIds: string[], opts?: CenterNodesParams) => void;\n\n  /**\n   * Fit all the given nodes into view of the camera.\n   *\n   * @param nodeIds - An array of node IDs to fit the view on. If this parameter is omitted,\n   * the view will fit to all nodes.\n   *\n   * @param opts.fitOnlyIfNodesNotInView - A boolean flag that determines whether the view should\n   * only be fit if the nodes specified by `ids` are not currently in view. If this\n   * parameter is `true`, the view will only be fit if one or more of the nodes\n   * specified by `ids` are not currently visible in the viewport. If this parameter is\n   * `false` or omitted, the view will be fit regardless of whether the nodes\n   * are currently in view.\n   */\n  fitNodesInViewById: (nodeIds: string[], opts?: FitNodesParams) => void;\n\n  /**\n   * Whether the graph is centered or not.\n   */\n  isCentered?: boolean;\n}\n\nexport const useCenterGraph = ({\n  animated,\n  disabled,\n  layoutType\n}: CenterGraphInput): CenterGraphOutput => {\n  const nodes = useStore(state => state.nodes);\n  const [isCentered, setIsCentered] = useState<boolean>(false);\n  const invalidate = useThree(state => state.invalidate);\n  const { controls } = useCameraControls();\n  const camera = useThree(state => state.camera) as PerspectiveCamera;\n  const mounted = useRef<boolean>(false);\n\n  const centerNodes = useCallback(\n    async (nodes, opts?: CenterNodesParams) => {\n      const animated = opts?.animated !== undefined ? opts?.animated : true;\n      const centerOnlyIfNodesNotInView =\n        opts?.centerOnlyIfNodesNotInView !== undefined\n          ? opts?.centerOnlyIfNodesNotInView\n          : false;\n\n      if (\n        !mounted.current ||\n        !centerOnlyIfNodesNotInView ||\n        (centerOnlyIfNodesNotInView &&\n          nodes?.some(node => !isNodeInView(camera, node.position)))\n      ) {\n        // Centers the graph based on the central most node\n        const { x, y, z } = getLayoutCenter(nodes);\n\n        await controls.setTarget(x, y, z, animated);\n\n        if (!isCentered) {\n          setIsCentered(true);\n        }\n\n        invalidate();\n      }\n    },\n    // eslint-disable-next-line react-hooks/exhaustive-deps\n    [invalidate, controls, nodes]\n  );\n\n  const fitNodesInView = useCallback(\n    async (\n      nodes,\n      opts: FitNodesParams = { animated: true, fitOnlyIfNodesNotInView: false }\n    ) => {\n      const { fitOnlyIfNodesNotInView } = opts;\n\n      if (\n        !fitOnlyIfNodesNotInView ||\n        (fitOnlyIfNodesNotInView &&\n          nodes?.some(node => !isNodeInView(camera, node.position)))\n      ) {\n        const { minX, maxX, minY, maxY, minZ, maxZ } = getLayoutCenter(nodes);\n\n        if (!layoutType.includes('3d')) {\n          // fitToBox will auto rotate to the closest axis including the z axis,\n          // which is not desired for 2D graphs\n          // So get the rotation to the closest flat axis for 2D graphs\n          const { horizontalRotation, verticalRotation } =\n            getDegreesToClosest2dAxis(\n              controls?.azimuthAngle,\n              controls?.polarAngle\n            );\n\n          void controls?.rotate(horizontalRotation, verticalRotation, true);\n        }\n\n        await controls?.zoomTo(1, opts?.animated);\n\n        await controls?.fitToBox(\n          new Box3(\n            new Vector3(minX, minY, minZ),\n            new Vector3(maxX, maxY, maxZ)\n          ),\n          opts?.animated,\n          {\n            cover: false,\n            paddingLeft: PADDING,\n            paddingRight: PADDING,\n            paddingBottom: PADDING,\n            paddingTop: PADDING\n          }\n        );\n      }\n    },\n    [camera, controls, layoutType]\n  );\n\n  const getNodesById = useCallback(\n    (nodeIds: string[]) => {\n      let mappedNodes: InternalGraphNode[] | null = null;\n\n      if (nodeIds?.length) {\n        // Map the node ids to the actual nodes\n        mappedNodes = nodeIds.reduce((acc, id) => {\n          const node = nodes.find(n => n.id === id);\n          if (node) {\n            acc.push(node);\n          } else {\n            throw new Error(\n              `Attempted to center ${id} but it was not found in the nodes`\n            );\n          }\n\n          return acc;\n        }, []);\n      }\n\n      return mappedNodes;\n    },\n    [nodes]\n  );\n\n  const centerNodesById = useCallback(\n    (nodeIds: string[], opts: CenterNodesParams) => {\n      const mappedNodes = getNodesById(nodeIds);\n\n      centerNodes(mappedNodes || nodes, {\n        animated,\n        centerOnlyIfNodesNotInView: opts?.centerOnlyIfNodesNotInView\n      });\n    },\n    [animated, centerNodes, getNodesById, nodes]\n  );\n\n  const fitNodesInViewById = useCallback(\n    async (nodeIds: string[], opts: FitNodesParams) => {\n      const mappedNodes = getNodesById(nodeIds);\n\n      await fitNodesInView(mappedNodes || nodes, { animated, ...opts });\n    },\n    [animated, fitNodesInView, getNodesById, nodes]\n  );\n\n  useLayoutEffect(() => {\n    async function load() {\n      // Once we've loaded controls and we have nodes, let's recenter\n      if (controls && nodes?.length) {\n        if (!mounted.current) {\n          // Center the graph once nodes are loaded on mount\n          await centerNodes(nodes, { animated: false });\n          await fitNodesInView(nodes, { animated: false });\n          mounted.current = true;\n        }\n      }\n    }\n\n    load();\n  }, [controls, centerNodes, nodes, animated, camera, fitNodesInView]);\n\n  useHotkeys([\n    {\n      name: 'Center',\n      disabled,\n      category: 'Graph',\n      keys: ['command+shift+c'],\n      callback: () => centerNodes(nodes)\n    }\n  ]);\n\n  return { centerNodes, centerNodesById, fitNodesInViewById, isCentered };\n};\n","import React, { FC, useMemo } from 'react';\nimport { a, useSpring } from '@react-spring/three';\nimport { TextureLoader, LinearFilter, DoubleSide } from 'three';\nimport { animationConfig } from '../../utils';\nimport { NodeRendererProps } from '../../types';\n\nexport interface IconProps extends NodeRendererProps {\n  /**\n   * The image to display on the icon.\n   */\n  image: string;\n}\n\nexport const Icon: FC<IconProps> = ({ image, id, size, opacity, animated }) => {\n  const texture = useMemo(() => new TextureLoader().load(image), [image]);\n\n  const { scale, spriteOpacity } = useSpring({\n    from: {\n      scale: [0.00001, 0.00001, 0.00001],\n      spriteOpacity: 0\n    },\n    to: {\n      scale: [size, size, size],\n      spriteOpacity: opacity\n    },\n    config: {\n      ...animationConfig,\n      duration: animated ? undefined : 0\n    }\n  });\n\n  return (\n    <a.sprite userData={{ id, type: 'node' }} scale={scale as any}>\n      <a.spriteMaterial\n        attach=\"material\"\n        opacity={spriteOpacity}\n        fog={true}\n        depthTest={false}\n        transparent={true}\n        side={DoubleSide}\n      >\n        <primitive attach=\"map\" object={texture} minFilter={LinearFilter} />\n      </a.spriteMaterial>\n    </a.sprite>\n  );\n};\n\nIcon.defaultProps = {\n  opacity: 1\n};\n","import React, { FC } from 'react';\nimport { NodeRendererProps } from '../../types';\nimport { Sphere } from './Sphere';\nimport { Icon } from './Icon';\n\nexport interface SphereWithIconProps extends NodeRendererProps {\n  /**\n   * The image to display on the icon.\n   */\n  image: string;\n}\n\nexport const SphereWithIcon: FC<SphereWithIconProps> = ({\n  color,\n  id,\n  size,\n  opacity,\n  node,\n  active,\n  animated,\n  image,\n  selected\n}) => (\n  <>\n    <Sphere\n      id={id}\n      selected={selected}\n      size={size}\n      opacity={opacity}\n      animated={animated}\n      color={color}\n      node={node}\n      active={active}\n    />\n    <Icon\n      id={id}\n      image={image}\n      selected={selected}\n      size={size + 8}\n      opacity={opacity}\n      animated={animated}\n      color={color}\n      node={node}\n      active={active}\n    />\n  </>\n);\n\nSphereWithIcon.defaultProps = {\n  opacity: 1,\n  active: false\n};\n","import React, { FC, useMemo } from 'react';\nimport { a, useSpring } from '@react-spring/three';\nimport { animationConfig } from '../../utils';\nimport { NodeRendererProps } from '../../types';\nimport { Billboard, Svg as DreiSvg, SvgProps as DreiSvgProps } from 'glodrei';\nimport { Color, DoubleSide } from 'three';\n\nexport type SvgProps = NodeRendererProps &\n  Omit<DreiSvgProps, 'src' | 'id'> & {\n    /**\n     * The image to display on the icon.\n     */\n    image: string;\n  };\n\nexport const Svg: FC<SvgProps> = ({\n  id,\n  image,\n  color,\n  size,\n  opacity,\n  animated,\n  ...rest\n}) => {\n  const normalizedSize = size / 25;\n\n  const { scale } = useSpring({\n    from: {\n      scale: [0.00001, 0.00001, 0.00001]\n    },\n    to: {\n      scale: [normalizedSize, normalizedSize, normalizedSize]\n    },\n    config: {\n      ...animationConfig,\n      duration: animated ? undefined : 0\n    }\n  });\n\n  const normalizedColor = useMemo(() => new Color(color), [color]);\n\n  return (\n    <a.group userData={{ id, type: 'node' }} scale={scale as any}>\n      <Billboard position={[0, 0, 1]}>\n        <DreiSvg\n          {...rest}\n          src={image}\n          fillMaterial={{\n            fog: true,\n            depthTest: false,\n            transparent: true,\n            color: normalizedColor,\n            opacity,\n            side: DoubleSide,\n            ...(rest.fillMaterial || {})\n          }}\n          fillMeshProps={{\n            // Note: This is a hack to get the svg to\n            // render in the correct position.\n            position: [-25, -25, 1],\n            ...(rest.fillMeshProps || {})\n          }}\n        />\n      </Billboard>\n    </a.group>\n  );\n};\n\nSvg.defaultProps = {\n  opacity: 1\n};\n","import React, { FC } from 'react';\nimport { Sphere } from './Sphere';\nimport { Svg, SvgProps } from './Svg';\nimport { ColorRepresentation } from 'three';\n\nexport interface SphereWithSvgProps extends SvgProps {\n  /**\n   * The image to display on the icon.\n   */\n  image: string;\n\n  /**\n   * The color of the svg fill.\n   */\n  svgFill?: ColorRepresentation;\n}\n\nexport const SphereWithSvg: FC<SphereWithSvgProps> = ({\n  color,\n  id,\n  size,\n  opacity,\n  node,\n  svgFill,\n  active,\n  animated,\n  image,\n  selected,\n  ...rest\n}) => (\n  <>\n    <Sphere\n      id={id}\n      selected={selected}\n      size={size}\n      opacity={opacity}\n      animated={animated}\n      color={color}\n      node={node}\n      active={active}\n    />\n    <Svg\n      {...rest}\n      id={id}\n      selected={selected}\n      image={image}\n      size={size}\n      opacity={opacity}\n      animated={animated}\n      color={svgFill}\n      node={node}\n      active={active}\n    />\n  </>\n);\n\nSphereWithSvg.defaultProps = {\n  opacity: 1,\n  active: false\n};\n","import React, { FC, useMemo, useRef, useState } from 'react';\nimport { Billboard, Html, Text } from 'glodrei';\nimport { Color, ColorRepresentation, Box3, Vector3 } from 'three';\nimport ellipsize from 'ellipsize';\n\nexport interface HTMLLabelProps {\n  /**\n   * Text to render.\n   */\n  text: string;\n\n  /**\n   * Color of the text.\n   */\n  color?: ColorRepresentation;\n}\n\nexport const HTMLLabel: FC<HTMLLabelProps> = ({ text, color }) => {\n  const ellipsisLimit = 138;\n  const shortText =\n    text.length > ellipsisLimit\n      ? text.substring(0, ellipsisLimit) + '...'\n      : text;\n  return (\n    <Html transform center position={[0, 0, 2]}>\n      <div\n        style={{\n          border: 'solid 1px black',\n          background: 'lightgray',\n          maxWidth: '2000px',\n          position: 'absolute',\n          transform: 'translate(-50%, -180px)'\n        }}\n      >\n        <p\n          style={{\n            fontSize: '10rem',\n            overflowWrap: 'break-word',\n            textAlign: 'center',\n            margin: '40px',\n            color: color.toString()\n          }}\n        >\n          {shortText}\n        </p>\n      </div>\n    </Html>\n  );\n};\n\nHTMLLabel.defaultProps = {\n  color: '#2A6475'\n};\n","/* eslint-disable indent */\nimport React, {\n  FC,\n  ReactNode,\n  useCallback,\n  useMemo,\n  useRef,\n  useState\n} from 'react';\nimport { Group } from 'three';\nimport { animationConfig } from '../utils';\nimport { useSpring, a } from '@react-spring/three';\nimport { Sphere } from './nodes/Sphere';\nimport { Label } from './Label';\nimport {\n  NodeContextMenuProps,\n  ContextMenuEvent,\n  InternalGraphNode,\n  NodeRenderer,\n  CollapseProps\n} from '../types';\nimport { Html, useCursor } from 'glodrei';\nimport { useCameraControls } from '../CameraControls';\nimport { useStore } from '../store';\nimport { useDrag } from '../utils/useDrag';\nimport { Icon } from './nodes';\nimport { useHoverIntent } from '../utils/useHoverIntent';\nimport { HTMLLabel } from './HTMLLabel';\nimport { ThreeEvent } from '@react-three/fiber';\n\nexport interface NodeProps {\n  /**\n   * The unique identifier for the node.\n   */\n  id: string;\n\n  /**\n   * The parent nodes of the node.\n   */\n  parents?: string[];\n\n  /**\n   * Whether the node is disabled.\n   */\n  disabled?: boolean;\n\n  /**\n   * Whether the node is animated.\n   */\n  animated?: boolean;\n\n  /**\n   * Whether the node is draggable.\n   */\n  draggable?: boolean;\n\n  /**\n   * The url for the label font.\n   */\n  labelFontUrl?: string;\n\n  /**\n   * The function to use to render the node.\n   */\n  renderNode?: NodeRenderer;\n\n  /**\n   * The context menu for the node.\n   */\n  contextMenu?: (event: ContextMenuEvent) => ReactNode;\n\n  /**\n   * The function to call when the pointer is over the node.\n   */\n  onPointerOver?: (\n    node: InternalGraphNode,\n    event: ThreeEvent<PointerEvent>\n  ) => void;\n\n  /**\n   * The function to call when the pointer is out of the node.\n   */\n  onPointerOut?: (\n    node: InternalGraphNode,\n    event: ThreeEvent<PointerEvent>\n  ) => void;\n\n  /**\n   * The function to call when the node is clicked.\n   */\n  onClick?: (\n    node: InternalGraphNode,\n    props?: CollapseProps,\n    event?: ThreeEvent<MouseEvent>\n  ) => void;\n\n  /**\n   * The function to call when the node is double clicked.\n   */\n  onDoubleClick?: (\n    node: InternalGraphNode,\n    event: ThreeEvent<MouseEvent>\n  ) => void;\n\n  /**\n   * The function to call when the node is right clicked.\n   */\n  onContextMenu?: (\n    node?: InternalGraphNode,\n    props?: NodeContextMenuProps\n  ) => void;\n\n  /**\n   * Triggered after a node was dragged.\n   */\n  onDragged?: (node: InternalGraphNode) => void;\n}\n\nexport const Node: FC<NodeProps> = ({\n  animated,\n  disabled,\n  id,\n  draggable,\n  labelFontUrl,\n  contextMenu,\n  onClick,\n  onDoubleClick,\n  onPointerOver,\n  onDragged,\n  onPointerOut,\n  onContextMenu,\n  renderNode\n}) => {\n  const cameraControls = useCameraControls();\n  const theme = useStore(state => state.theme);\n  const node = useStore(state => state.nodes.find(n => n.id === id));\n  const edges = useStore(state => state.edges);\n  const draggingId = useStore(state => state.draggingId);\n  const collapsedNodeIds = useStore(state => state.collapsedNodeIds);\n  const setDraggingId = useStore(state => state.setDraggingId);\n  const setNodePosition = useStore(state => state.setNodePosition);\n  const setCollapsedNodeIds = useStore(state => state.setCollapsedNodeIds);\n  const isCollapsed = useStore(state => state.collapsedNodeIds.includes(id));\n  const isActive = useStore(state => state.actives?.includes(id));\n  const isSelected = useStore(state => state.selections?.includes(id));\n  const hasSelections = useStore(state => state.selections?.length > 0);\n  const center = useStore(state => state.centerPosition);\n\n  const isDragging = draggingId === id;\n  const {\n    position,\n    label,\n    subLabel,\n    size: nodeSize = 7,\n    labelVisible = true\n  } = node;\n\n  const group = useRef<Group | null>(null);\n  const [active, setActive] = useState<boolean>(false);\n  const [menuVisible, setMenuVisible] = useState<boolean>(false);\n\n  const shouldHighlight = active || isSelected || isActive;\n\n  const selectionOpacity = hasSelections\n    ? shouldHighlight\n      ? theme.node.selectedOpacity\n      : theme.node.inactiveOpacity\n    : theme.node.opacity;\n\n  const canCollapse = useMemo(() => {\n    // If the node has outgoing edges, it can collapse via context menu\n    const outboundLinks = edges.filter(l => l.source === id);\n\n    return outboundLinks.length > 0 || isCollapsed;\n  }, [edges, id, isCollapsed]);\n\n  const onCollapse = useCallback(() => {\n    if (canCollapse) {\n      if (isCollapsed) {\n        setCollapsedNodeIds(collapsedNodeIds.filter(p => p !== id));\n      } else {\n        setCollapsedNodeIds([...collapsedNodeIds, id]);\n      }\n    }\n  }, [canCollapse, collapsedNodeIds, id, isCollapsed, setCollapsedNodeIds]);\n\n  const [{ nodePosition, labelPosition, subLabelPosition }] = useSpring(\n    () => ({\n      from: {\n        nodePosition: center ? [center.x, center.y, 0] : [0, 0, 0],\n        labelPosition: [0, -(nodeSize + 7), 2],\n        subLabelPosition: [0, -(nodeSize + 14), 2]\n      },\n      to: {\n        nodePosition: position\n          ? [\n              position.x,\n              position.y,\n              shouldHighlight ? position.z + 1 : position.z\n            ]\n          : [0, 0, 0],\n        labelPosition: [0, -(nodeSize + 7), 2],\n        subLabelPosition: [0, -(nodeSize + 14), 2]\n      },\n      config: {\n        ...animationConfig,\n        duration: animated && !draggingId ? undefined : 0\n      }\n    }),\n    [isDragging, position, animated, nodeSize, shouldHighlight]\n  );\n\n  const bind = useDrag({\n    draggable,\n    position,\n    // @ts-ignore\n    set: pos => setNodePosition(id, pos),\n    onDragStart: () => {\n      setDraggingId(id);\n      setActive(true);\n    },\n    onDragEnd: () => {\n      setDraggingId(null);\n      setActive(false);\n      onDragged?.(node);\n    }\n  });\n\n  useCursor(active && !draggingId && onClick !== undefined, 'pointer');\n  useCursor(\n    active && draggable && !isDragging && onClick === undefined,\n    'grab'\n  );\n  useCursor(isDragging, 'grabbing');\n\n  const combinedActiveState = shouldHighlight || isDragging;\n  const color = combinedActiveState\n    ? theme.node.activeFill\n    : node.fill || theme.node.fill;\n\n  const { pointerOver, pointerOut } = useHoverIntent({\n    disabled: disabled || isDragging,\n    onPointerOver: (event: ThreeEvent<PointerEvent>) => {\n      cameraControls.controls.truckSpeed = 0;\n      setActive(true);\n      onPointerOver?.(node, event);\n    },\n    onPointerOut: (event: ThreeEvent<PointerEvent>) => {\n      cameraControls.controls.truckSpeed = 2.0;\n      setActive(false);\n      onPointerOut?.(node, event);\n    }\n  });\n\n  const nodeComponent = useMemo(\n    () =>\n      renderNode ? (\n        renderNode({\n          id,\n          color,\n          size: nodeSize,\n          active: combinedActiveState,\n          opacity: selectionOpacity,\n          animated,\n          selected: isSelected,\n          node\n        })\n      ) : (\n        <>\n          {node.icon ? (\n            <Icon\n              id={id}\n              image={node.icon || ''}\n              size={nodeSize + 8}\n              opacity={selectionOpacity}\n              animated={animated}\n              color={color}\n              node={node}\n              active={combinedActiveState}\n              selected={isSelected}\n            />\n          ) : (\n            <Sphere\n              id={id}\n              size={nodeSize}\n              opacity={selectionOpacity}\n              animated={animated}\n              color={color}\n              node={node}\n              active={combinedActiveState}\n              selected={isSelected}\n            />\n          )}\n        </>\n      ),\n    [\n      renderNode,\n      id,\n      color,\n      nodeSize,\n      combinedActiveState,\n      selectionOpacity,\n      animated,\n      isSelected,\n      node\n    ]\n  );\n\n  const labelComponent = useMemo(\n    () =>\n      (labelVisible || isSelected || active) &&\n      label && (\n        <>\n          <a.group position={labelPosition as any}>\n            <HTMLLabel\n              text={label}\n              color={\n                isSelected || active || isDragging || isActive\n                  ? theme.node.label.activeColor\n                  : theme.node.label.color\n              }\n            />\n          </a.group>\n          {subLabel && (\n            <a.group position={subLabelPosition as any}>\n              <Label\n                text={subLabel}\n                fontUrl={labelFontUrl}\n                fontSize={5}\n                opacity={selectionOpacity}\n                stroke={theme.node.subLabel?.stroke}\n                active={isSelected || active || isDragging || isActive}\n                color={\n                  isSelected || active || isDragging || isActive\n                    ? theme.node.subLabel?.activeColor\n                    : theme.node.subLabel?.color\n                }\n              />\n            </a.group>\n          )}\n        </>\n      ),\n    [\n      active,\n      isActive,\n      isDragging,\n      isSelected,\n      label,\n      labelFontUrl,\n      labelPosition,\n      labelVisible,\n      selectionOpacity,\n      subLabel,\n      subLabelPosition,\n      theme.node.label.activeColor,\n      theme.node.label.color,\n      theme.node.subLabel?.activeColor,\n      theme.node.subLabel?.color,\n      theme.node.subLabel?.stroke\n    ]\n  );\n\n  const menuComponent = useMemo(\n    () =>\n      menuVisible &&\n      contextMenu && (\n        <Html prepend={true} center={true}>\n          {contextMenu({\n            data: node,\n            canCollapse,\n            isCollapsed,\n            onCollapse,\n            onClose: () => setMenuVisible(false)\n          })}\n        </Html>\n      ),\n    [menuVisible, contextMenu, node, canCollapse, isCollapsed, onCollapse]\n  );\n\n  return (\n    <a.group\n      userData={{ id, type: 'node' }}\n      ref={group}\n      position={nodePosition as any}\n      onPointerOver={pointerOver}\n      onPointerOut={pointerOut}\n      onClick={(event: ThreeEvent<MouseEvent>) => {\n        if (!disabled && !isDragging) {\n          onClick?.(\n            node,\n            {\n              canCollapse,\n              isCollapsed\n            },\n            event\n          );\n        }\n      }}\n      onDoubleClick={(event: ThreeEvent<MouseEvent>) => {\n        if (!disabled && !isDragging) {\n          onDoubleClick?.(node, event);\n        }\n      }}\n      onContextMenu={() => {\n        if (!disabled) {\n          setMenuVisible(true);\n          onContextMenu?.(node, {\n            canCollapse,\n            isCollapsed,\n            onCollapse\n          });\n        }\n      }}\n      {...(bind() as any)}\n    >\n      {nodeComponent}\n      {menuComponent}\n      {labelComponent}\n    </a.group>\n  );\n};\n\nNode.defaultProps = {\n  draggable: false\n};\n","import React, { FC, useMemo, useRef, useEffect, useCallback } from 'react';\nimport { useSpring, a } from '@react-spring/three';\nimport { Color, ColorRepresentation, Mesh, DoubleSide, Vector3 } from 'three';\nimport { animationConfig } from '../utils';\nimport { useStore } from '../store';\n\nexport type EdgeArrowPosition = 'none' | 'mid' | 'end';\n\nexport interface ArrowProps {\n  /**\n   * Whether the arrow should be animated.\n   */\n  animated?: boolean;\n\n  /**\n   * The color of the arrow.\n   */\n  color?: ColorRepresentation;\n\n  /**\n   * The length of the arrow.\n   */\n  length: number;\n\n  /**\n   * The opacity of the arrow.\n   */\n  opacity?: number;\n\n  /**\n   * The position of the arrow in 3D space.\n   */\n  position: Vector3;\n\n  /**\n   * The rotation of the arrow in 3D space.\n   */\n  rotation: Vector3;\n\n  /**\n   * The size of the arrow.\n   */\n  size: number;\n\n  /**\n   * A function that is called when the arrow is right-clicked.\n   */\n  onContextMenu?: () => void;\n\n  /**\n   * A function that is called when the arrow is selected or deselected.\n   */\n  onActive?: (state: boolean) => void;\n}\n\nexport const Arrow: FC<ArrowProps> = ({\n  animated,\n  color,\n  length,\n  opacity,\n  position,\n  rotation,\n  size,\n  onActive,\n  onContextMenu\n}) => {\n  const normalizedColor = useMemo(() => new Color(color), [color]);\n  const meshRef = useRef<Mesh | null>(null);\n  const draggingId = useStore(state => state.draggingId);\n  const center = useStore(state => state.centerPosition);\n\n  const [{ pos, arrowOpacity }] = useSpring(\n    () => ({\n      from: {\n        pos: center ? [center.x, center.y, center.z] : [0, 0, 0],\n        arrowOpacity: 0\n      },\n      to: {\n        pos: [position.x, position.y, position.z],\n        arrowOpacity: opacity\n      },\n      config: {\n        ...animationConfig,\n        duration: animated && !draggingId ? undefined : 0\n      }\n    }),\n    [animated, draggingId, opacity, position]\n  );\n\n  const setQuaternion = useCallback(() => {\n    const axis = new Vector3(0, 1, 0);\n    meshRef.current?.quaternion.setFromUnitVectors(axis, rotation);\n  }, [rotation, meshRef]);\n\n  useEffect(() => setQuaternion(), [setQuaternion]);\n\n  return (\n    <a.mesh\n      position={pos as any}\n      ref={meshRef}\n      scale={[1, 1, 1]}\n      onPointerOver={() => onActive(true)}\n      onPointerOut={() => onActive(false)}\n      onPointerDown={event => {\n        // context menu controls\n        if (event.nativeEvent.buttons === 2) {\n          event.stopPropagation();\n          onContextMenu();\n        }\n      }}\n    >\n      <cylinderGeometry\n        args={[0, size, length, 20, 1, true]}\n        attach=\"geometry\"\n      />\n      <a.meshBasicMaterial\n        attach=\"material\"\n        color={normalizedColor}\n        depthTest={false}\n        opacity={arrowOpacity}\n        transparent={true}\n        side={DoubleSide}\n        fog={true}\n      />\n    </a.mesh>\n  );\n};\n\nArrow.defaultProps = {\n  size: 1,\n  opacity: 0.5,\n  color: '#D8E6EA'\n};\n","import React, { FC, useEffect, useMemo, useRef } from 'react';\nimport { useSpring, a } from '@react-spring/three';\nimport { animationConfig, getCurve } from '../utils';\nimport {\n  Vector3,\n  TubeGeometry,\n  ColorRepresentation,\n  Color,\n  Curve\n} from 'three';\nimport { useStore } from '../store';\nimport { ThreeEvent } from '@react-three/fiber';\n\nexport interface LineProps {\n  /**\n   * Whether the line should be animated.\n   */\n  animated?: boolean;\n\n  /**\n   * The color of the line.\n   */\n  color?: ColorRepresentation;\n\n  /**\n   * Whether the line should be curved.\n   */\n  curved: boolean;\n\n  /**\n   * The curve of the line in 3D space.\n   */\n  curve: Curve<Vector3>;\n\n  /**\n   * The unique identifier of the line.\n   */\n  id: string;\n\n  /**\n   * The opacity of the line.\n   */\n  opacity?: number;\n\n  /**\n   * The size of the line.\n   */\n  size?: number;\n\n  /**\n   * A function that is called when the line is clicked.\n   */\n  onClick?: (event: ThreeEvent<MouseEvent>) => void;\n\n  /**\n   * A function that is called when the line is right-clicked.\n   */\n  onContextMenu?: () => void;\n\n  /**\n   * A function that is called when the mouse pointer is moved over the line.\n   */\n  onPointerOver?: (event: ThreeEvent<PointerEvent>) => void;\n\n  /**\n   * A function that is called when the mouse pointer is moved out of the line.\n   */\n  onPointerOut?: (event: ThreeEvent<PointerEvent>) => void;\n\n  /**\n   * The offset of the curve.\n   */\n  curveOffset?: number;\n}\n\nexport const Line: FC<LineProps> = ({\n  curveOffset,\n  animated,\n  color,\n  curve,\n  curved = false,\n  id,\n  opacity,\n  size,\n  onContextMenu,\n  onClick,\n  onPointerOver,\n  onPointerOut\n}) => {\n  const tubeRef = useRef<TubeGeometry | null>(null);\n  const draggingId = useStore(state => state.draggingId);\n  const normalizedColor = useMemo(() => new Color(color), [color]);\n  const center = useStore(state => state.centerPosition);\n  const mounted = useRef<boolean>(false);\n\n  // Do opacity seperate from vertices for perf\n  const { lineOpacity } = useSpring({\n    from: {\n      lineOpacity: 0\n    },\n    to: {\n      lineOpacity: opacity\n    },\n    config: {\n      ...animationConfig,\n      duration: animated ? undefined : 0\n    }\n  });\n\n  useSpring(() => {\n    const from = curve.getPoint(0);\n    const to = curve.getPoint(1);\n\n    const fromObj = {\n      // Animate from center first time, then from the actual from point\n      fromVertices: !mounted.current\n        ? [center?.x || 0, center?.y || 0, center?.z || 0]\n        : [to?.x || 0, to?.y || 0, to?.z || 0],\n      toVertices: [from?.x || 0, from?.y || 0, from?.z || 0]\n    };\n\n    const toObj = {\n      fromVertices: [from?.x || 0, from?.y || 0, from?.z || 0],\n      toVertices: [to?.x || 0, to?.y || 0, to?.z || 0]\n    };\n\n    return {\n      from: fromObj,\n      to: toObj,\n      onChange: event => {\n        const { fromVertices, toVertices } = event.value;\n        const fromVector = new Vector3(...fromVertices);\n        const toVector = new Vector3(...toVertices);\n\n        const curve = getCurve(fromVector, 0, toVector, 0, curved, curveOffset);\n        tubeRef.current.copy(new TubeGeometry(curve, 20, size / 2, 5, false));\n      },\n      config: {\n        ...animationConfig,\n        duration: animated && !draggingId ? undefined : 0\n      }\n    };\n  }, [animated, draggingId, curve, size]);\n\n  useEffect(() => {\n    // Handle mount operation for initial render\n    mounted.current = true;\n  }, []);\n\n  return (\n    <mesh\n      userData={{ id, type: 'edge' }}\n      onPointerOver={onPointerOver}\n      onPointerOut={onPointerOut}\n      onClick={onClick}\n      onPointerDown={event => {\n        // context menu controls\n        if (event.nativeEvent.buttons === 2) {\n          event.stopPropagation();\n          onContextMenu();\n        }\n      }}\n    >\n      <tubeGeometry attach=\"geometry\" ref={tubeRef} />\n      <a.meshBasicMaterial\n        attach=\"material\"\n        opacity={lineOpacity}\n        fog={true}\n        transparent={true}\n        depthTest={false}\n        color={normalizedColor}\n      />\n    </mesh>\n  );\n};\n\nLine.defaultProps = {\n  color: '#000',\n  size: 1,\n  opacity: 1\n};\n","import React, { FC, useMemo, useState } from 'react';\nimport { useSpring, a } from '@react-spring/three';\nimport { Arrow, EdgeArrowPosition } from './Arrow';\nimport { Label } from './Label';\nimport {\n  animationConfig,\n  calculateEdgeCurveOffset,\n  getArrowSize,\n  getArrowVectors,\n  getCurve,\n  getLabelOffsetByType,\n  getMidPoint,\n  getVector\n} from '../utils';\nimport { Line } from './Line';\nimport { useStore } from '../store';\nimport { ContextMenuEvent, InternalGraphEdge } from '../types';\nimport { Html, useCursor } from 'glodrei';\nimport { useHoverIntent } from '../utils/useHoverIntent';\nimport { Euler, Vector3 } from 'three';\nimport { ThreeEvent } from '@react-three/fiber';\n\n/**\n * Label positions relatively edge.\n *\n * - below: show label under the edge line\n * - above: show label above the edge line\n * - inline: show label along the edge line\n * - natural: normal text positions\n */\nexport type EdgeLabelPosition = 'below' | 'above' | 'inline' | 'natural';\n\n/**\n * Type of edge interpolation.\n *\n * - Linear is straight\n * - Curved is curved\n */\nexport type EdgeInterpolation = 'linear' | 'curved';\n\nexport interface EdgeProps {\n  /**\n   * The url for the label font.\n   */\n  labelFontUrl?: string;\n\n  /**\n   * The unique identifier of the edge.\n   */\n  id: string;\n\n  /**\n   * Whether the edge should be animated.\n   */\n  animated?: boolean;\n\n  /**\n   * Whether the edge should be disabled.\n   */\n  disabled?: boolean;\n\n  /**\n   * The placement of the edge label.\n   */\n  labelPlacement?: EdgeLabelPosition;\n\n  /**\n   * The placement of the edge arrow.\n   */\n  arrowPlacement?: EdgeArrowPosition;\n\n  /**\n   * The type of interpolation used to draw the edge.\n   */\n  interpolation: EdgeInterpolation;\n\n  /**\n   * A function that returns the context menu for the edge.\n   */\n  contextMenu?: (event: Partial<ContextMenuEvent>) => React.ReactNode;\n\n  /**\n   * A function that is called when the edge is clicked.\n   */\n  onClick?: (edge: InternalGraphEdge, event: ThreeEvent<MouseEvent>) => void;\n\n  /**\n   * A function that is called when the edge is right-clicked.\n   */\n  onContextMenu?: (edge?: InternalGraphEdge) => void;\n\n  /**\n   * A function that is called when the mouse pointer is moved over the edge.\n   */\n  onPointerOver?: (\n    edge: InternalGraphEdge,\n    event: ThreeEvent<PointerEvent>\n  ) => void;\n\n  /**\n   * A function that is called when the mouse pointer is moved out of the edge.\n   */\n  onPointerOut?: (\n    edge: InternalGraphEdge,\n    event: ThreeEvent<PointerEvent>\n  ) => void;\n}\n\nconst LABEL_PLACEMENT_OFFSET = 3;\n\nexport const Edge: FC<EdgeProps> = ({\n  animated,\n  arrowPlacement,\n  contextMenu,\n  disabled,\n  labelPlacement,\n  id,\n  interpolation,\n  labelFontUrl,\n  onContextMenu,\n  onClick,\n  onPointerOver,\n  onPointerOut\n}) => {\n  const theme = useStore(state => state.theme);\n  const draggingId = useStore(state => state.draggingId);\n\n  // UI states\n  const [active, setActive] = useState<boolean>(false);\n  const [menuVisible, setMenuVisible] = useState<boolean>(false);\n\n  // Edge data\n  const edges = useStore(state => state.edges);\n  const edge = edges.find(e => e.id === id);\n  const { target, source, label, labelVisible = false, size = 1 } = edge;\n  const from = useStore(store => store.nodes.find(node => node.id === source));\n  const to = useStore(store => store.nodes.find(node => node.id === target));\n  const oppositeLinkExists = edges.find(\n    edge => edge.target == from.id && edge.source == to.id\n  );\n\n  const color = edge.fill || theme.edge.fill;\n\n  // Edge properties\n  const labelOffset = (size + theme.edge.label.fontSize) / 2;\n  const [arrowLength, arrowSize] = useMemo(() => getArrowSize(size), [size]);\n  const { curveOffset, curved } = useMemo(\n    () =>\n      calculateEdgeCurveOffset({\n        edge,\n        edges,\n        curved: interpolation === 'curved'\n      }),\n    [edge, edges, interpolation]\n  );\n\n  const [curve, arrowPosition, arrowRotation] = useMemo(() => {\n    const fromVector = getVector(from);\n    const fromOffset = from.size;\n    const toVector = getVector(to);\n    const toOffset = to.size;\n\n    let curve = getCurve(\n      fromVector,\n      fromOffset,\n      toVector,\n      toOffset,\n      curved,\n      curveOffset\n    );\n\n    const [arrowPosition, arrowRotation] = getArrowVectors(\n      arrowPlacement,\n      curve,\n      arrowLength\n    );\n\n    if (arrowPlacement === 'end') {\n      curve = getCurve(\n        fromVector,\n        fromOffset,\n        arrowPosition,\n        0,\n        curved,\n        curveOffset\n      );\n    }\n\n    return [curve, arrowPosition, arrowRotation];\n  }, [from, to, curved, curveOffset, arrowPlacement, arrowLength]);\n\n  const midPoint = useMemo(() => {\n    let newMidPoint = getMidPoint(\n      from.position,\n      to.position,\n      getLabelOffsetByType(labelOffset, labelPlacement)\n    );\n\n    if (curved) {\n      // Offset the label to the mid point of the curve\n      const offset = new Vector3().subVectors(newMidPoint, curve.getPoint(0.5));\n      switch (labelPlacement) {\n      case 'above':\n        offset.y = offset.y - LABEL_PLACEMENT_OFFSET;\n        break;\n      case 'below':\n        offset.y = offset.y + LABEL_PLACEMENT_OFFSET;\n        break;\n      }\n      newMidPoint = newMidPoint.sub(offset);\n    }\n\n    return newMidPoint;\n  }, [from.position, to.position, labelOffset, labelPlacement, curved, curve]);\n\n  const isSelected = useStore(state => state.selections?.includes(id));\n  const hasSelections = useStore(state => state.selections?.length);\n  const isActive = useStore(state => state.actives?.includes(id));\n  const center = useStore(state => state.centerPosition);\n\n  const selectionOpacity = hasSelections\n    ? isSelected || isActive\n      ? theme.edge.selectedOpacity\n      : theme.edge.inactiveOpacity\n    : theme.edge.opacity;\n\n  const [{ labelPosition }] = useSpring(\n    () => ({\n      from: {\n        labelPosition: center ? [center.x, center.y, center.z] : [0, 0, 0]\n      },\n      to: {\n        labelPosition: [midPoint.x, midPoint.y, midPoint.z]\n      },\n      config: {\n        ...animationConfig,\n        duration: animated && !draggingId ? undefined : 0\n      }\n    }),\n    [midPoint, animated, draggingId]\n  );\n\n  const labelRotation = useMemo(\n    () =>\n      new Euler(\n        0,\n        0,\n        labelPlacement === 'natural'\n          ? 0\n          : Math.atan(\n            (to.position.y - from.position.y) /\n                (to.position.x - from.position.x)\n          )\n      ),\n    [\n      to.position.x,\n      to.position.y,\n      from.position.x,\n      from.position.y,\n      labelPlacement\n    ]\n  );\n\n  useCursor(active && !draggingId && onClick !== undefined, 'pointer');\n\n  const { pointerOver, pointerOut } = useHoverIntent({\n    disabled,\n    onPointerOver: (event: ThreeEvent<PointerEvent>) => {\n      setActive(true);\n      onPointerOver?.(edge, event);\n    },\n    onPointerOut: (event: ThreeEvent<PointerEvent>) => {\n      setActive(false);\n      onPointerOut?.(edge, event);\n    }\n  });\n\n  const arrowComponent = useMemo(\n    () =>\n      arrowPlacement !== 'none' && (\n        <Arrow\n          animated={animated}\n          color={\n            isSelected || active || isActive\n              ? theme.arrow.activeFill\n              : theme.arrow.fill\n          }\n          length={arrowLength}\n          opacity={selectionOpacity}\n          position={arrowPosition}\n          rotation={arrowRotation}\n          size={arrowSize}\n          onActive={setActive}\n          onContextMenu={() => {\n            if (!disabled) {\n              setMenuVisible(true);\n              onContextMenu?.(edge);\n            }\n          }}\n        />\n      ),\n    [\n      active,\n      animated,\n      arrowLength,\n      arrowPlacement,\n      arrowPosition,\n      arrowRotation,\n      arrowSize,\n      disabled,\n      edge,\n      isActive,\n      isSelected,\n      onContextMenu,\n      selectionOpacity,\n      theme.arrow.activeFill,\n      theme.arrow.fill\n    ]\n  );\n\n  const labelComponent = useMemo(\n    () =>\n      labelVisible &&\n      label && (\n        <a.group position={labelPosition as any}>\n          <Label\n            text={label}\n            ellipsis={15}\n            fontUrl={labelFontUrl}\n            stroke={theme.edge.label.stroke}\n            color={\n              isSelected || active || isActive\n                ? theme.edge.label.activeColor\n                : theme.edge.label.color\n            }\n            opacity={selectionOpacity}\n            fontSize={theme.edge.label.fontSize}\n            rotation={labelRotation}\n          />\n        </a.group>\n      ),\n    [\n      active,\n      isActive,\n      isSelected,\n      label,\n      labelFontUrl,\n      labelPosition,\n      labelRotation,\n      labelVisible,\n      selectionOpacity,\n      theme.edge.label.activeColor,\n      theme.edge.label.color,\n      theme.edge.label.fontSize,\n      theme.edge.label.stroke\n    ]\n  );\n\n  const menuComponent = useMemo(\n    () =>\n      menuVisible &&\n      contextMenu && (\n        <Html prepend={true} center={true} position={midPoint}>\n          {contextMenu({ data: edge, onClose: () => setMenuVisible(false) })}\n        </Html>\n      ),\n    [menuVisible, contextMenu, midPoint, edge]\n  );\n\n  return (\n    <group>\n      <Line\n        curveOffset={curveOffset}\n        animated={animated && !oppositeLinkExists}\n        color={color}\n        curve={curve}\n        curved={curved}\n        id={id}\n        opacity={selectionOpacity}\n        size={size}\n        onClick={event => {\n          if (!disabled) {\n            onClick?.(edge, event);\n          }\n        }}\n        onPointerOver={pointerOver}\n        onPointerOut={pointerOut}\n        onContextMenu={() => {\n          if (!disabled) {\n            setMenuVisible(true);\n            onContextMenu?.(edge);\n          }\n        }}\n      />\n      {arrowComponent}\n      {labelComponent}\n      {menuComponent}\n    </group>\n  );\n};\n\nEdge.defaultProps = {\n  labelPlacement: 'inline',\n  arrowPlacement: 'end'\n};\n","import { useCallback, useRef } from 'react';\nimport {\n  BoxGeometry,\n  BufferGeometry,\n  CylinderGeometry,\n  Quaternion,\n  TubeGeometry,\n  Vector3\n} from 'three';\nimport { mergeBufferGeometries } from 'three-stdlib';\n\nimport { GraphState, useStore } from '../../store';\nimport { InternalGraphEdge } from '../../types';\nimport {\n  getArrowSize,\n  getArrowVectors,\n  getVector,\n  getCurve\n} from '../../utils';\nimport { EdgeArrowPosition } from '../Arrow';\nimport { EdgeInterpolation } from '../Edge';\n\nexport type UseEdgeGeometry = {\n  getGeometries(edges: Array<InternalGraphEdge>): Array<BufferGeometry>;\n  getGeometry(\n    active: Array<InternalGraphEdge>,\n    inactive: Array<InternalGraphEdge>\n  ): BufferGeometry;\n};\n\nconst NULL_GEOMETRY = new BoxGeometry(0, 0, 0);\n\nexport function useEdgeGeometry(\n  arrowPlacement: EdgeArrowPosition,\n  interpolation: EdgeInterpolation\n): UseEdgeGeometry {\n  // We don't want to rerun everything when the state changes,\n  // but we do want to use the most recent nodes whenever `getGeometries`\n  // or `getGeometry` is run, so we store it in a ref:\n  const stateRef = useRef<GraphState>();\n  const theme = useStore(state => state.theme);\n  useStore(state => {\n    stateRef.current = state;\n  });\n\n  const geometryCacheRef = useRef(new Map<string, BufferGeometry>());\n\n  const curved = interpolation === 'curved';\n  const getGeometries = useCallback(\n    (edges: Array<InternalGraphEdge>): Array<BufferGeometry> => {\n      const geometries: Array<BufferGeometry> = [];\n      const cache = geometryCacheRef.current;\n\n      const { nodes } = stateRef.current;\n\n      edges.forEach(edge => {\n        const { target, source, size = 1 } = edge;\n\n        const from = nodes.find(node => node.id === source);\n        const to = nodes.find(node => node.id === target);\n\n        if (!from || !to) {\n          return;\n        }\n\n        // Create hash so geometry can be reused if edge doesn't move:\n        const hash = `fromX:${from.position.x},fromY:${from.position.y},toX:${to.position.x}},toY:${to.position.y}`;\n        if (cache.has(hash)) {\n          const geometry = cache.get(hash);\n          geometries.push(geometry);\n          return;\n        }\n\n        const fromVector = getVector(from);\n        const fromOffset = from.size + theme.edge.label.fontSize;\n        const toVector = getVector(to);\n        const toOffset = to.size + theme.edge.label.fontSize;\n        let curve = getCurve(\n          fromVector,\n          fromOffset,\n          toVector,\n          toOffset,\n          curved\n        );\n\n        let edgeGeometry = new TubeGeometry(curve, 20, size / 2, 5, false);\n\n        if (arrowPlacement === 'none') {\n          geometries.push(edgeGeometry);\n          cache.set(hash, edgeGeometry);\n          return;\n        }\n\n        const [arrowLength, arrowSize] = getArrowSize(size);\n\n        const [arrowPosition, arrowRotation] = getArrowVectors(\n          arrowPlacement,\n          curve,\n          arrowLength\n        );\n        const quaternion = new Quaternion();\n        quaternion.setFromUnitVectors(new Vector3(0, 1, 0), arrowRotation);\n\n        const arrowGeometry = new CylinderGeometry(\n          0,\n          arrowSize,\n          arrowLength,\n          20,\n          1,\n          true\n        );\n        arrowGeometry.applyQuaternion(quaternion);\n        arrowGeometry.translate(\n          arrowPosition.x,\n          arrowPosition.y,\n          arrowPosition.z\n        );\n\n        // Move edge so it doesn't stick through the arrow:\n        if (arrowPlacement && arrowPlacement === 'end') {\n          const curve = getCurve(\n            fromVector,\n            fromOffset,\n            arrowPosition,\n            0,\n            curved\n          );\n          edgeGeometry = new TubeGeometry(curve, 20, size / 2, 5, false);\n        }\n\n        const merged = mergeBufferGeometries([edgeGeometry, arrowGeometry]);\n        geometries.push(merged);\n        cache.set(hash, merged);\n      });\n      return geometries;\n    },\n    [arrowPlacement, curved, theme.edge.label.fontSize]\n  );\n\n  const getGeometry = useCallback(\n    (\n      active: Array<InternalGraphEdge>,\n      inactive: Array<InternalGraphEdge>\n    ): BufferGeometry => {\n      const activeGeometries = getGeometries(active);\n      const inactiveGeometries = getGeometries(inactive);\n\n      return mergeBufferGeometries(\n        [\n          inactiveGeometries.length\n            ? mergeBufferGeometries(inactiveGeometries)\n            : NULL_GEOMETRY,\n          activeGeometries.length\n            ? mergeBufferGeometries(activeGeometries)\n            : NULL_GEOMETRY\n        ],\n        true\n      );\n    },\n    [getGeometries]\n  );\n\n  return {\n    getGeometries,\n    getGeometry\n  };\n}\n","import { useCallback, useRef } from 'react';\n\nimport { useStore } from '../../store';\nimport { InternalGraphEdge } from '../../types';\n\nexport type EdgeEvents = {\n  onClick?: (edge: InternalGraphEdge) => void;\n  onContextMenu?: (edge?: InternalGraphEdge) => void;\n  onPointerOver?: (edge: InternalGraphEdge) => void;\n  onPointerOut?: (edge: InternalGraphEdge) => void;\n};\n\nexport function useEdgeEvents(\n  events: EdgeEvents,\n  contextMenu,\n  disabled: boolean\n) {\n  const { onClick, onContextMenu, onPointerOut, onPointerOver } = events;\n\n  const edgeContextMenus = useStore(state => state.edgeContextMenus);\n  const setEdgeContextMenus = useStore(state => state.setEdgeContextMenus);\n\n  const clickRef = useRef(false);\n  const handleClick = useCallback(() => {\n    clickRef.current = true;\n  }, []);\n\n  const contextMenuEventRef = useRef(false);\n  const handleContextMenu = useCallback(() => {\n    contextMenuEventRef.current = true;\n  }, []);\n\n  const handleIntersections = useCallback(\n    (\n      previous: Array<InternalGraphEdge>,\n      intersected: Array<InternalGraphEdge>\n    ) => {\n      if (onClick && clickRef.current) {\n        clickRef.current = false;\n        if (!disabled) {\n          intersected.forEach(edge => {\n            onClick(edge);\n          });\n        }\n      }\n\n      if ((contextMenu || onContextMenu) && contextMenuEventRef.current) {\n        contextMenuEventRef.current = false;\n        if (!disabled) {\n          intersected.forEach(edge => {\n            if (!edgeContextMenus.has(edge.id)) {\n              setEdgeContextMenus(new Set([...edgeContextMenus, edge.id]));\n              onContextMenu?.(edge);\n            }\n          });\n        }\n      }\n\n      if (onPointerOver) {\n        const over = intersected.filter(index => !previous.includes(index));\n        over.forEach(edge => {\n          onPointerOver(edge);\n        });\n      }\n\n      if (onPointerOut) {\n        const out = previous.filter(index => !intersected.includes(index));\n        out.forEach(edge => {\n          onPointerOut(edge);\n        });\n      }\n    },\n    [\n      contextMenu,\n      disabled,\n      edgeContextMenus,\n      setEdgeContextMenus,\n      onClick,\n      onContextMenu,\n      onPointerOver,\n      onPointerOut\n    ]\n  );\n\n  return {\n    handleClick,\n    handleContextMenu,\n    handleIntersections\n  };\n}\n","import { SpringValue, useSpring } from '@react-spring/three';\nimport { useCallback, useEffect, useRef } from 'react';\nimport { BufferAttribute, BufferGeometry } from 'three';\n\nimport { Theme } from '../../themes';\nimport { animationConfig } from '../../utils';\n\nexport function useEdgePositionAnimation(\n  geometry: BufferGeometry,\n  animated: boolean\n): void {\n  const geometryRef = useRef<BufferGeometry>(geometry);\n\n  useEffect(() => {\n    geometryRef.current = geometry;\n  }, [geometry]);\n\n  const getAnimationPositions = useCallback(() => {\n    const positions = geometryRef.current.getAttribute('position');\n    const from = Array.from({\n      length: positions.array.length\n    }).fill(0) as Array<number>;\n    const to = Array.from(positions.array);\n    return { from, to };\n  }, []);\n\n  const updateGeometryPosition = useCallback((positions: Array<number>) => {\n    const buffer = new Float32Array(positions);\n    const newPosition = new BufferAttribute(buffer, 3, false);\n    geometryRef.current.setAttribute('position', newPosition);\n    newPosition.needsUpdate = true;\n  }, []);\n\n  useSpring(() => {\n    if (!animated) {\n      return null;\n    }\n\n    const animationPositions = getAnimationPositions();\n\n    return {\n      from: {\n        positions: animationPositions.from\n      },\n      to: {\n        positions: animationPositions.to\n      },\n      onChange: event => {\n        updateGeometryPosition(event.value.positions);\n      },\n      config: {\n        ...animationConfig,\n        duration: animated ? undefined : 0\n      }\n    };\n  }, [animated]);\n}\n\nexport type UseEdgeOpacityAnimations = {\n  activeOpacity: SpringValue<number>;\n  inactiveOpacity: SpringValue<number>;\n};\n\nexport function useEdgeOpacityAnimation(\n  animated: boolean,\n  hasSelections: boolean,\n  theme: Theme\n): UseEdgeOpacityAnimations {\n  const [{ activeOpacity, inactiveOpacity }] = useSpring(() => {\n    return {\n      from: {\n        activeOpacity: 0,\n        inactiveOpacity: 0\n      },\n      to: {\n        activeOpacity: hasSelections\n          ? theme.edge.selectedOpacity\n          : theme.edge.opacity,\n        inactiveOpacity: hasSelections\n          ? theme.edge.inactiveOpacity\n          : theme.edge.opacity\n      },\n      config: {\n        ...animationConfig,\n        duration: animated ? undefined : 0\n      }\n    };\n  }, [animated, hasSelections, theme]);\n\n  return { activeOpacity, inactiveOpacity };\n}\n","import React, { FC, useCallback, useMemo } from 'react';\nimport { useSpring, a } from '@react-spring/three';\nimport { Html } from 'glodrei';\nimport { ColorRepresentation, Euler } from 'three';\n\nimport { useStore } from '../../store';\nimport { Theme } from '../../themes';\nimport { ContextMenuEvent, InternalGraphEdge } from '../../types';\nimport {\n  animationConfig,\n  getLabelOffsetByType,\n  getMidPoint\n} from '../../utils';\nimport { Label } from '../Label';\n\n/**\n * Label positions relatively edge\n *\n * below: show label under the edge line\n * above: show label above the edge line\n * inline: show label along the edge line\n * natural: normal text positions\n */\nexport type EdgeLabelPosition = 'below' | 'above' | 'inline' | 'natural';\n\nexport type EdgeArrowPosition = 'none' | 'mid' | 'end';\n\nexport interface EdgeProps {\n  /**\n   * Whether the edge should be animated.\n   */\n  animated?: boolean;\n\n  /**\n   * Whether the edge should be disabled.\n   */\n  disabled?: boolean;\n\n  /**\n   * The color of the edge.\n   */\n  color: ColorRepresentation;\n\n  /**\n   * A function that returns the context menu for the edge.\n   */\n  contextMenu?: (event: Partial<ContextMenuEvent>) => React.ReactNode;\n\n  /**\n   * The edge object.\n   */\n  edge: InternalGraphEdge;\n\n  /**\n   * The URL of the font for the edge label.\n   */\n  labelFontUrl?: string;\n\n  /**\n   * The placement of the edge label.\n   */\n  labelPlacement?: EdgeLabelPosition;\n\n  /**\n   * The opacity of the edge.\n   */\n  opacity?: number;\n}\n\nexport const Edge: FC<EdgeProps> = ({\n  animated,\n  color,\n  contextMenu,\n  edge,\n  labelFontUrl,\n  labelPlacement,\n  opacity\n}) => {\n  const theme = useStore(state => state.theme);\n  const { target, source, label, labelVisible = false, size = 1 } = edge;\n\n  const nodes = useStore(store => store.nodes);\n  const from = nodes.find(node => node.id === source);\n  const to = nodes.find(node => node.id === target);\n  const draggingId = useStore(state => state.draggingId);\n\n  const labelOffset = (size + theme.edge.label.fontSize) / 2;\n\n  const midPoint = useMemo(\n    () =>\n      getMidPoint(\n        from.position,\n        to.position,\n        getLabelOffsetByType(labelOffset, labelPlacement)\n      ),\n    [from.position, to.position, labelOffset, labelPlacement]\n  );\n\n  const edgeContextMenus = useStore(state => state.edgeContextMenus);\n  const setEdgeContextMenus = useStore(state => state.setEdgeContextMenus);\n\n  const [{ labelPosition }] = useSpring(\n    () => ({\n      from: {\n        labelPosition: [0, 0, 0]\n      },\n      to: {\n        labelPosition: [midPoint.x, midPoint.y, midPoint.z]\n      },\n      config: {\n        ...animationConfig,\n        duration: animated && !draggingId ? undefined : 0\n      }\n    }),\n    [midPoint, animated, draggingId]\n  );\n\n  const removeContextMenu = useCallback(\n    (edge: InternalGraphEdge) => {\n      edgeContextMenus.delete(edge.id);\n      setEdgeContextMenus(new Set(edgeContextMenus.values()));\n    },\n    [edgeContextMenus, setEdgeContextMenus]\n  );\n\n  const labelRotation = useMemo(\n    () =>\n      new Euler(\n        0,\n        0,\n        labelPlacement === 'natural'\n          ? 0\n          : Math.atan(\n            (to.position.y - from.position.y) /\n                (to.position.x - from.position.x)\n          )\n      ),\n    [\n      to.position.x,\n      to.position.y,\n      from.position.x,\n      from.position.y,\n      labelPlacement\n    ]\n  );\n\n  return (\n    <group>\n      {labelVisible && label && (\n        <a.group position={labelPosition as any}>\n          <Label\n            text={label}\n            ellipsis={15}\n            fontUrl={labelFontUrl}\n            stroke={theme.edge.label.stroke}\n            color={color}\n            opacity={opacity}\n            fontSize={theme.edge.label.fontSize}\n            rotation={labelRotation}\n          />\n        </a.group>\n      )}\n      {contextMenu && edgeContextMenus.has(edge.id) && (\n        <Html prepend={true} center={true} position={midPoint}>\n          {contextMenu({\n            data: edge,\n            onClose: () => removeContextMenu(edge)\n          })}\n        </Html>\n      )}\n    </group>\n  );\n};\n\nEdge.defaultProps = {\n  labelPlacement: 'inline'\n};\n","import React, { FC, useCallback, useEffect, useMemo, useRef } from 'react';\nimport { a } from '@react-spring/three';\nimport { useFrame } from '@react-three/fiber';\nimport { DoubleSide, Mesh, Raycaster, TubeGeometry } from 'three';\n\nimport { useStore } from '../../store';\nimport { ContextMenuEvent, InternalGraphEdge } from '../../types';\nimport { EdgeArrowPosition } from '../Arrow';\nimport { EdgeLabelPosition, EdgeInterpolation } from '../Edge';\nimport { useEdgeGeometry } from './useEdgeGeometry';\nimport { EdgeEvents, useEdgeEvents } from './useEdgeEvents';\nimport {\n  useEdgePositionAnimation,\n  useEdgeOpacityAnimation\n} from './useEdgeAnimations';\nimport { Edge } from './Edge';\n\nexport type EdgesProps = {\n  /**\n   * Whether the edge should be animated.\n   */\n  animated?: boolean;\n\n  /**\n   * The placement of the edge arrow.\n   */\n  arrowPlacement?: EdgeArrowPosition;\n\n  /**\n   * A function that returns the context menu for the edge.\n   */\n  contextMenu?: (event: Partial<ContextMenuEvent>) => React.ReactNode;\n\n  /**\n   * Whether the edge should be disabled.\n   */\n  disabled?: boolean;\n\n  /**\n   * The array of edge objects.\n   */\n  edges: Array<InternalGraphEdge>;\n\n  /**\n   * The URL of the font for the edge label.\n   */\n  labelFontUrl?: string;\n\n  /**\n   * The placement of the edge label.\n   */\n  labelPlacement?: EdgeLabelPosition;\n\n  /**\n   * The type of interpolation used to draw the edge.\n   */\n  interpolation?: EdgeInterpolation;\n} & EdgeEvents;\n\n/**\n * Three.js rendering starts to get slower if you have an individual mesh for each edge\n * and a high number of edges.\n *\n * Instead, we take the edges and split them into their different render states:\n *\n *  * - Active (any edges that are marked as \"selected\" or \"active\" in the state)\n *  * - Dragging (any edges that are connected to a node that is being dragged)\n *  * - Intersecting (any edges that are currently intersected by the ray from the mouse position)\n *  * - Inactive (any edges that aren't active, dragging, or intersected)\n *\n * We generate the geometry for each edge in each of these groups, and then merge them\n * into a single geometry for each group. This merged mesh is rendered as one object\n * which gives much better performance. This means that we only need to update geometry\n * and positions when edges move between the different states, rather than updating all\n * edges whenever any other edge changes.\n *\n * To get this all working, we have to do a few things outside the @react-three/fiber world,\n * specifically:\n *\n *  * manually create edge/arrow geometries (see `useEdgeGeometry`)\n *  * manually track mouse/edge interactions and fire events (see `useEdgeEvents`)\n *  * manually update edge/arrow positions during aniamations (see `useEdgeAnimations`)\n */\nexport const Edges: FC<EdgesProps> = ({\n  interpolation = 'linear',\n  arrowPlacement = 'end',\n  labelPlacement = 'inline',\n  animated,\n  contextMenu,\n  disabled,\n  edges,\n  labelFontUrl,\n  onClick,\n  onContextMenu,\n  onPointerOut,\n  onPointerOver\n}) => {\n  const theme = useStore(state => state.theme);\n  const { getGeometries, getGeometry } = useEdgeGeometry(\n    arrowPlacement,\n    interpolation\n  );\n\n  const draggingId = useStore(state => state.draggingId);\n  const edgeMeshes = useStore(state => state.edgeMeshes);\n  const setEdgeMeshes = useStore(state => state.setEdgeMeshes);\n  const actives = useStore(state => state.actives || []);\n  const selections = useStore(state => state.selections || []);\n\n  const [active, inactive, draggingActive, draggingInactive] = useMemo(() => {\n    const active: Array<InternalGraphEdge> = [];\n    const inactive: Array<InternalGraphEdge> = [];\n    const draggingActive: Array<InternalGraphEdge> = [];\n    const draggingInactive: Array<InternalGraphEdge> = [];\n    edges.forEach(edge => {\n      if (draggingId === edge.source || draggingId === edge.target) {\n        if (selections.includes(edge.id) || actives.includes(edge.id)) {\n          draggingActive.push(edge);\n        } else {\n          draggingInactive.push(edge);\n        }\n        return;\n      }\n\n      if (selections.includes(edge.id) || actives.includes(edge.id)) {\n        active.push(edge);\n      } else {\n        inactive.push(edge);\n      }\n    });\n    return [active, inactive, draggingActive, draggingInactive];\n  }, [edges, actives, selections, draggingId]);\n\n  const hasSelections = !!selections.length;\n\n  const staticEdgesGeometry = useMemo(\n    () => getGeometry(active, inactive),\n    [getGeometry, active, inactive]\n  );\n\n  const { activeOpacity, inactiveOpacity } = useEdgeOpacityAnimation(\n    animated,\n    hasSelections,\n    theme\n  );\n\n  useEdgePositionAnimation(staticEdgesGeometry, animated);\n\n  useEffect(() => {\n    if (draggingId === null) {\n      const edgeGeometries = getGeometries(edges);\n      const edgeMeshes = edgeGeometries.map(edge => new Mesh(edge));\n      setEdgeMeshes(edgeMeshes);\n    }\n  }, [getGeometries, setEdgeMeshes, edges, draggingId]);\n\n  const staticEdgesRef = useRef(new Mesh());\n  const dynamicEdgesRef = useRef(new Mesh());\n\n  const intersect = useCallback(\n    (raycaster: Raycaster): Array<InternalGraphEdge> => {\n      // Handle initial raycaster state:\n      if (!raycaster.camera) {\n        return [];\n      }\n      const intersections =\n        raycaster.intersectObjects<Mesh<TubeGeometry>>(edgeMeshes);\n      if (!intersections.length) {\n        return [];\n      }\n      return intersections.map(\n        intersection => edges[edgeMeshes.indexOf(intersection.object)]\n      );\n    },\n    [edgeMeshes, edges]\n  );\n\n  const { handleClick, handleContextMenu, handleIntersections } = useEdgeEvents(\n    {\n      onClick,\n      onContextMenu,\n      onPointerOut,\n      onPointerOver\n    },\n    contextMenu,\n    disabled\n  );\n\n  const draggingIdRef = useRef<string | null>(null);\n  const intersectingRef = useRef<Array<InternalGraphEdge>>([]);\n\n  useFrame(state => {\n    staticEdgesRef.current.geometry = staticEdgesGeometry;\n\n    if (disabled) {\n      return;\n    }\n\n    const previousDraggingId = draggingIdRef.current;\n    if (draggingId || (draggingId === null && previousDraggingId !== null)) {\n      dynamicEdgesRef.current.geometry = getGeometry(\n        draggingActive,\n        draggingInactive\n      );\n    }\n\n    draggingIdRef.current = draggingId;\n    if (draggingId) {\n      return;\n    }\n\n    const previousIntersecting = intersectingRef.current;\n    const intersecting = intersect(state.raycaster);\n    handleIntersections(previousIntersecting, intersecting);\n\n    if (intersecting.join() !== previousIntersecting.join()) {\n      dynamicEdgesRef.current.geometry = getGeometry(intersecting, []);\n    }\n\n    intersectingRef.current = intersecting;\n  });\n\n  return (\n    <group onClick={handleClick} onContextMenu={handleContextMenu}>\n      {/* Static edges */}\n      <mesh ref={staticEdgesRef}>\n        <a.meshBasicMaterial\n          attach=\"material-0\"\n          color={theme.edge.fill}\n          depthTest={false}\n          fog={true}\n          opacity={inactiveOpacity}\n          side={DoubleSide}\n          transparent={true}\n        />\n        <a.meshBasicMaterial\n          attach=\"material-1\"\n          color={theme.edge.activeFill}\n          depthTest={false}\n          fog={true}\n          opacity={activeOpacity}\n          side={DoubleSide}\n          transparent={true}\n        />\n      </mesh>\n      {/* Dynamic edges */}\n      <mesh ref={dynamicEdgesRef}>\n        <a.meshBasicMaterial\n          attach=\"material-0\"\n          color={theme.edge.fill}\n          depthTest={false}\n          fog={true}\n          opacity={inactiveOpacity}\n          side={DoubleSide}\n          transparent={true}\n        />\n        <a.meshBasicMaterial\n          attach=\"material-1\"\n          color={theme.edge.activeFill}\n          depthTest={false}\n          fog={true}\n          opacity={activeOpacity}\n          side={DoubleSide}\n          transparent={true}\n        />\n      </mesh>\n      {edges.map(edge => (\n        <Edge\n          animated={animated}\n          contextMenu={contextMenu}\n          color={theme.edge.label.color}\n          disabled={disabled}\n          edge={edge}\n          key={edge.id}\n          labelFontUrl={labelFontUrl}\n          labelPlacement={labelPlacement}\n        />\n      ))}\n    </group>\n  );\n};\n","import React, { FC, useMemo, useState } from 'react';\nimport { ClusterGroup, animationConfig, useHoverIntent } from '../utils';\nimport { useSpring, a } from '@react-spring/three';\nimport { Color, DoubleSide } from 'three';\nimport { useStore } from '../store';\nimport { Label } from './Label';\nimport { useCursor } from 'glodrei';\nimport { ThreeEvent } from '@react-three/fiber';\n\nexport type ClusterEventArgs = Omit<ClusterGroup, 'position'>;\n\nexport interface ClusterProps extends ClusterGroup {\n  /**\n   * Whether the circle should be animated.\n   */\n  animated?: boolean;\n\n  /**\n   * The radius of the circle. Default 1.\n   */\n  radius?: number;\n\n  /**\n   * The padding of the circle. Default 20.\n   */\n  padding?: number;\n\n  /**\n   * The url for the label font.\n   */\n  labelFontUrl?: string;\n\n  /**\n   * Whether the node is disabled.\n   */\n  disabled?: boolean;\n\n  /**\n   * When the cluster was clicked.\n   */\n  onClick?: (cluster: ClusterEventArgs, event: ThreeEvent<MouseEvent>) => void;\n\n  /**\n   * When a cluster receives a pointer over event.\n   */\n  onPointerOver?: (\n    cluster: ClusterEventArgs,\n    event: ThreeEvent<PointerEvent>\n  ) => void;\n\n  /**\n   * When cluster receives a pointer leave event.\n   */\n  onPointerOut?: (\n    cluster: ClusterEventArgs,\n    event: ThreeEvent<PointerEvent>\n  ) => void;\n}\n\nexport const Cluster: FC<ClusterProps> = ({\n  animated,\n  position,\n  padding,\n  labelFontUrl,\n  disabled,\n  radius,\n  nodes,\n  label,\n  onClick,\n  onPointerOver,\n  onPointerOut\n}) => {\n  const theme = useStore(state => state.theme);\n  const rad = Math.max(position.width, position.height) / 2;\n  const offset = rad - radius + padding;\n  const [active, setActive] = useState<boolean>(false);\n  const center = useStore(state => state.centerPosition);\n\n  const isActive = useStore(state =>\n    state.actives?.some(id => nodes.some(n => n.id === id))\n  );\n\n  const isSelected = useStore(state =>\n    state.selections?.some(id => nodes.some(n => n.id === id))\n  );\n\n  const hasSelections = useStore(state => state.selections?.length > 0);\n\n  const opacity = hasSelections\n    ? isSelected || active || isActive\n      ? theme.cluster?.selectedOpacity\n      : theme.cluster?.inactiveOpacity\n    : theme.cluster?.opacity;\n\n  const { circleOpacity, circlePosition, labelPosition } = useSpring({\n    from: {\n      circlePosition: [center.x, center.y, -1],\n      circleOpacity: 0,\n      labelPosition: [0, -offset, 2]\n    },\n    to: {\n      labelPosition: [0, -offset, 2],\n      circlePosition: position ? [position.x, position.y, -1] : [0, 0, -1],\n      circleOpacity: opacity\n    },\n    config: {\n      ...animationConfig,\n      duration: animated ? undefined : 0\n    }\n  });\n\n  const normalizedStroke = useMemo(\n    () => new Color(theme.cluster?.stroke),\n    [theme.cluster?.stroke]\n  );\n\n  const normalizedFill = useMemo(\n    () => new Color(theme.cluster?.fill),\n    [theme.cluster?.fill]\n  );\n\n  useCursor(active && onClick !== undefined, 'pointer');\n\n  const { pointerOver, pointerOut } = useHoverIntent({\n    disabled,\n    onPointerOver: (event: ThreeEvent<PointerEvent>) => {\n      setActive(true);\n      onPointerOver?.(\n        {\n          nodes,\n          label\n        },\n        event\n      );\n    },\n    onPointerOut: (event: ThreeEvent<PointerEvent>) => {\n      setActive(false);\n      onPointerOut?.(\n        {\n          nodes,\n          label\n        },\n        event\n      );\n    }\n  });\n\n  const cluster = useMemo(\n    () =>\n      theme.cluster && (\n        <a.group\n          position={circlePosition as any}\n          onPointerOver={pointerOver}\n          onPointerOut={pointerOut}\n          onClick={(event: ThreeEvent<MouseEvent>) => {\n            if (!disabled) {\n              onClick?.(\n                {\n                  nodes,\n                  label\n                },\n                event\n              );\n            }\n          }}\n        >\n          <mesh>\n            <ringGeometry attach=\"geometry\" args={[offset, 0, 128]} />\n            <a.meshBasicMaterial\n              attach=\"material\"\n              color={normalizedFill}\n              transparent={true}\n              depthTest={false}\n              opacity={theme.cluster?.fill ? circleOpacity : 0}\n              side={DoubleSide}\n              fog={true}\n            />\n          </mesh>\n          <mesh>\n            <ringGeometry\n              attach=\"geometry\"\n              args={[offset, rad + padding, 128]}\n            />\n            <a.meshBasicMaterial\n              attach=\"material\"\n              color={normalizedStroke}\n              transparent={true}\n              depthTest={false}\n              opacity={circleOpacity}\n              side={DoubleSide}\n              fog={true}\n            />\n          </mesh>\n          {theme.cluster?.label && (\n            <a.group position={labelPosition as any}>\n              <Label\n                text={label}\n                opacity={opacity}\n                fontUrl={labelFontUrl}\n                stroke={theme.cluster.label.stroke}\n                active={false}\n                color={theme.cluster?.label.color}\n                fontSize={12}\n              />\n            </a.group>\n          )}\n        </a.group>\n      ),\n    [\n      theme.cluster,\n      circlePosition,\n      pointerOver,\n      pointerOut,\n      offset,\n      normalizedFill,\n      circleOpacity,\n      rad,\n      padding,\n      normalizedStroke,\n      labelPosition,\n      label,\n      opacity,\n      labelFontUrl,\n      disabled,\n      onClick,\n      nodes\n    ]\n  );\n\n  return cluster;\n};\n\nCluster.defaultProps = {\n  radius: 2,\n  padding: 40\n};\n","import React, {\n  FC,\n  forwardRef,\n  Fragment,\n  ReactNode,\n  Ref,\n  useImperativeHandle,\n  useMemo\n} from 'react';\nimport { useGraph } from './useGraph';\nimport { LayoutOverrides, LayoutTypes } from './layout';\nimport {\n  NodeContextMenuProps,\n  ContextMenuEvent,\n  GraphEdge,\n  GraphNode,\n  InternalGraphEdge,\n  InternalGraphNode,\n  NodeRenderer,\n  CollapseProps\n} from './types';\nimport { SizingType } from './sizing';\nimport {\n  Cluster,\n  ClusterEventArgs,\n  Edge,\n  EdgeArrowPosition,\n  EdgeInterpolation,\n  EdgeLabelPosition,\n  Edges,\n  Node\n} from './symbols';\nimport {\n  CenterNodesParams,\n  FitNodesParams,\n  useCenterGraph\n} from './CameraControls';\nimport { LabelVisibilityType } from './utils';\nimport { useStore } from './store';\nimport Graph from 'graphology';\nimport { ThreeEvent, useThree } from '@react-three/fiber';\n\nexport interface GraphSceneProps {\n  /**\n   * Type of layout.\n   */\n  layoutType?: LayoutTypes;\n\n  /**\n   * List of ids that are selected.\n   */\n  selections?: string[];\n\n  /**\n   * List of ids that are active.\n   */\n  actives?: string[];\n\n  /**\n   * List of node ids that are collapsed.\n   */\n  collapsedNodeIds?: string[];\n\n  /**\n   * Animate or not the graph positions.\n   */\n  animated?: boolean;\n\n  /**\n   * Nodes to pass to the graph.\n   */\n  nodes: GraphNode[];\n\n  /**\n   * Edges to pass to the graph.\n   */\n  edges: GraphEdge[];\n\n  /**\n   * Context menu element.\n   */\n  contextMenu?: (event: ContextMenuEvent) => ReactNode;\n\n  /**\n   * Type of sizing for nodes.\n   */\n  sizingType?: SizingType;\n\n  /**\n   * Type of visibility for labels.\n   */\n  labelType?: LabelVisibilityType;\n\n  /**\n   * Place of visibility for edge labels.\n   */\n  edgeLabelPosition?: EdgeLabelPosition;\n\n  /**\n   * Placement of edge arrows.\n   */\n  edgeArrowPosition?: EdgeArrowPosition;\n\n  /**\n   * Shape of edge.\n   */\n  edgeInterpolation?: EdgeInterpolation;\n\n  /**\n   * Font of label, same as troika-three-text\n   * The URL of a custom font file to be used. Supported font formats are: * .ttf * .otf * .woff (.woff2 is not supported)\n   * Default: The Roboto font loaded from Google Fonts CDN\n   */\n  labelFontUrl?: string;\n\n  /**\n   * Attribute based sizing property.\n   */\n  sizingAttribute?: string;\n\n  /**\n   * The default size to size nodes to. Default is 7.\n   */\n  defaultNodeSize?: number;\n\n  /**\n   * When using sizing attributes, the min size a node can be.\n   */\n  minNodeSize?: number;\n\n  /**\n   * When using sizing attributes, the max size a node can be.\n   */\n  maxNodeSize?: number;\n\n  /**\n   * Attribute used for clustering.\n   */\n  clusterAttribute?: string;\n\n  /**\n   * Disable interactions or not.\n   */\n  disabled?: boolean;\n\n  /**\n   * Allow dragging of nodes.\n   */\n  draggable?: boolean;\n\n  /**\n   * Render a custom node\n   */\n  renderNode?: NodeRenderer;\n\n  /**\n   * Advanced overrides for the layout.\n   */\n  layoutOverrides?: LayoutOverrides;\n\n  /**\n   * When a node was clicked.\n   */\n  onNodeClick?: (\n    node: InternalGraphNode,\n    props?: CollapseProps,\n    event?: ThreeEvent<MouseEvent>\n  ) => void;\n\n  /**\n   * When a node was double clicked.\n   */\n  onNodeDoubleClick?: (\n    node: InternalGraphNode,\n    event: ThreeEvent<MouseEvent>\n  ) => void;\n\n  /**\n   * When a node context menu happened.\n   */\n  onNodeContextMenu?: (\n    node: InternalGraphNode,\n    props?: NodeContextMenuProps\n  ) => void;\n\n  /**\n   * When node got a pointer over.\n   */\n  onNodePointerOver?: (\n    node: InternalGraphNode,\n    event: ThreeEvent<PointerEvent>\n  ) => void;\n\n  /**\n   * When node lost pointer over.\n   */\n  onNodePointerOut?: (\n    node: InternalGraphNode,\n    event: ThreeEvent<PointerEvent>\n  ) => void;\n\n  /**\n   * Triggered after a node was dragged.\n   */\n  onNodeDragged?: (node: InternalGraphNode) => void;\n\n  /**\n   * When a edge context menu happened.\n   */\n  onEdgeContextMenu?: (edge?: InternalGraphEdge) => void;\n\n  /**\n   * When an edge was clicked.\n   */\n  onEdgeClick?: (\n    edge: InternalGraphEdge,\n    event?: ThreeEvent<MouseEvent>\n  ) => void;\n\n  /**\n   * When edge got a pointer over.\n   */\n  onEdgePointerOver?: (\n    edge: InternalGraphEdge,\n    event?: ThreeEvent<PointerEvent>\n  ) => void;\n\n  /**\n   * When edge lost pointer over.\n   */\n  onEdgePointerOut?: (\n    edge: InternalGraphEdge,\n    event?: ThreeEvent<PointerEvent>\n  ) => void;\n\n  /**\n   * When a cluster was clicked.\n   */\n  onClusterClick?: (\n    cluster: ClusterEventArgs,\n    event: ThreeEvent<MouseEvent>\n  ) => void;\n\n  /**\n   * When a cluster receives a pointer over event.\n   */\n  onClusterPointerOver?: (\n    cluster: ClusterEventArgs,\n    event: ThreeEvent<PointerEvent>\n  ) => void;\n\n  /**\n   * When cluster receives a pointer leave event.\n   */\n  onClusterPointerOut?: (\n    cluster: ClusterEventArgs,\n    event: ThreeEvent<PointerEvent>\n  ) => void;\n}\n\nexport interface GraphSceneRef {\n  /**\n   * Reference to the graph object.\n   */\n  graph: Graph;\n\n  /**\n   * Centers the graph on a specific node or list of nodes.\n   *\n   * @param nodeIds - An array of node IDs to center the graph on. If this parameter is omitted,\n   * the graph will be centered on all nodes.\n   *\n   * @param opts.centerOnlyIfNodesNotInView - A boolean flag that determines whether the graph should\n   * only be centered if the nodes specified by `ids` are not currently in view. If this\n   * parameter is `true`, the graph will only be re-centered if one or more of the nodes\n   * specified by `ids` are not currently in view. If this parameter is\n   * `false` or omitted, the graph will be re-centered regardless of whether the nodes\n   * are currently in view.\n   */\n  centerGraph: (nodeIds?: string[], opts?: CenterNodesParams) => void;\n\n  /**\n   * Fit all the given nodes into view of the camera.\n   *\n   * @param nodeIds - An array of node IDs to fit the view on. If this parameter is omitted,\n   * the view will fit to all nodes.\n   *\n   * @param opts.fitOnlyIfNodesNotInView - A boolean flag that determines whether the view should\n   * only be fit if the nodes specified by `ids` are not currently in view. If this\n   * parameter is `true`, the view will only be fit if one or more of the nodes\n   * specified by `ids` are not currently visible in the viewport. If this parameter is\n   * `false` or omitted, the view will be fit regardless of whether the nodes\n   * are currently in view.\n   */\n  fitNodesInView: (nodeIds?: string[], opts?: FitNodesParams) => void;\n\n  /**\n   * Calls render scene on the graph. this is useful when you want to manually render the graph\n   * for things like screenshots.\n   */\n  renderScene: () => void;\n}\n\nexport const GraphScene: FC<GraphSceneProps & { ref?: Ref<GraphSceneRef> }> =\n  forwardRef(\n    (\n      {\n        onNodeClick,\n        onNodeDoubleClick,\n        onNodeContextMenu,\n        onEdgeContextMenu,\n        onEdgeClick,\n        onEdgePointerOver,\n        onEdgePointerOut,\n        onNodePointerOver,\n        onNodePointerOut,\n        onClusterClick,\n        onNodeDragged,\n        onClusterPointerOver,\n        onClusterPointerOut,\n        contextMenu,\n        animated,\n        disabled,\n        draggable,\n        edgeLabelPosition,\n        edgeArrowPosition,\n        edgeInterpolation,\n        labelFontUrl,\n        renderNode,\n        ...rest\n      },\n      ref\n    ) => {\n      const { layoutType, clusterAttribute } = rest;\n\n      // Get the gl/scene/camera for render shortcuts\n      const gl = useThree(state => state.gl);\n      const scene = useThree(state => state.scene);\n      const camera = useThree(state => state.camera);\n\n      // Mount and build the graph\n      useGraph(rest);\n\n      if (\n        clusterAttribute &&\n        !(layoutType === 'forceDirected2d' || layoutType === 'forceDirected3d')\n      ) {\n        throw new Error(\n          'Clustering is only supported for the force directed layouts.'\n        );\n      }\n\n      // Get the graph and nodes via the store for memo\n      const graph = useStore(state => state.graph);\n      const nodes = useStore(state => state.nodes);\n      const edges = useStore(state => state.edges);\n      const clusters = useStore(state => [...state.clusters.values()]);\n\n      // Center the graph on the nodes\n      const { centerNodesById, fitNodesInViewById, isCentered } =\n        useCenterGraph({\n          animated,\n          disabled,\n          layoutType\n        });\n\n      // Let's expose some helper methods\n      useImperativeHandle(\n        ref,\n        () => ({\n          centerGraph: centerNodesById,\n          fitNodesInView: fitNodesInViewById,\n          graph,\n          renderScene: () => gl.render(scene, camera)\n        }),\n        [centerNodesById, fitNodesInViewById, graph, gl, scene, camera]\n      );\n\n      const nodeComponents = useMemo(\n        () =>\n          nodes.map(n => (\n            <Node\n              key={n?.id}\n              id={n?.id}\n              labelFontUrl={labelFontUrl}\n              draggable={draggable}\n              disabled={disabled}\n              animated={animated}\n              contextMenu={contextMenu}\n              renderNode={renderNode}\n              onClick={onNodeClick}\n              onDoubleClick={onNodeDoubleClick}\n              onContextMenu={onNodeContextMenu}\n              onPointerOver={onNodePointerOver}\n              onPointerOut={onNodePointerOut}\n              onDragged={onNodeDragged}\n            />\n          )),\n        [\n          animated,\n          contextMenu,\n          disabled,\n          draggable,\n          labelFontUrl,\n          nodes,\n          onNodeClick,\n          onNodeContextMenu,\n          onNodeDoubleClick,\n          onNodeDragged,\n          onNodePointerOut,\n          onNodePointerOver,\n          renderNode\n        ]\n      );\n\n      const edgeComponents = useMemo(\n        () =>\n          animated ? (\n            edges.map(e => (\n              <Edge\n                key={e.id}\n                id={e.id}\n                disabled={disabled}\n                animated={animated}\n                labelFontUrl={labelFontUrl}\n                labelPlacement={edgeLabelPosition}\n                arrowPlacement={edgeArrowPosition}\n                interpolation={edgeInterpolation}\n                contextMenu={contextMenu}\n                onClick={onEdgeClick}\n                onContextMenu={onEdgeContextMenu}\n                onPointerOver={onEdgePointerOver}\n                onPointerOut={onEdgePointerOut}\n              />\n            ))\n          ) : (\n            <Edges\n              edges={edges}\n              disabled={disabled}\n              animated={animated}\n              labelFontUrl={labelFontUrl}\n              labelPlacement={edgeLabelPosition}\n              arrowPlacement={edgeArrowPosition}\n              interpolation={edgeInterpolation}\n              contextMenu={contextMenu}\n              onClick={onEdgeClick}\n              onContextMenu={onEdgeContextMenu}\n              onPointerOver={onEdgePointerOver}\n              onPointerOut={onEdgePointerOut}\n            />\n          ),\n        [\n          animated,\n          contextMenu,\n          disabled,\n          edgeArrowPosition,\n          edgeInterpolation,\n          edgeLabelPosition,\n          edges,\n          labelFontUrl,\n          onEdgeClick,\n          onEdgeContextMenu,\n          onEdgePointerOut,\n          onEdgePointerOver\n        ]\n      );\n\n      const clusterComponents = useMemo(\n        () =>\n          clusters.map(c => (\n            <Cluster\n              key={c.label}\n              animated={animated}\n              disabled={disabled}\n              labelFontUrl={labelFontUrl}\n              onClick={onClusterClick}\n              onPointerOver={onClusterPointerOver}\n              onPointerOut={onClusterPointerOut}\n              {...c}\n            />\n          )),\n        [\n          animated,\n          clusters,\n          disabled,\n          labelFontUrl,\n          onClusterClick,\n          onClusterPointerOut,\n          onClusterPointerOver\n        ]\n      );\n\n      return (\n        isCentered && (\n          <Fragment>\n            {edgeComponents}\n            {nodeComponents}\n            {clusterComponents}\n          </Fragment>\n        )\n      );\n    }\n  );\n\nGraphScene.defaultProps = {\n  edgeInterpolation: 'linear'\n};\n","import { Theme } from './theme';\n\nexport const darkTheme: Theme = {\n  canvas: {\n    background: '#1E2026'\n  },\n  node: {\n    fill: '#7A8C9E',\n    activeFill: '#1DE9AC',\n    opacity: 1,\n    selectedOpacity: 1,\n    inactiveOpacity: 0.2,\n    label: {\n      stroke: '#1E2026',\n      color: '#ACBAC7',\n      activeColor: '#1DE9AC'\n    },\n    subLabel: {\n      stroke: '#1E2026',\n      color: '#ACBAC7',\n      activeColor: '#1DE9AC'\n    }\n  },\n  lasso: {\n    border: '1px solid #55aaff',\n    background: 'rgba(75, 160, 255, 0.1)'\n  },\n  ring: {\n    fill: '#54616D',\n    activeFill: '#1DE9AC'\n  },\n  edge: {\n    fill: '#474B56',\n    activeFill: '#1DE9AC',\n    opacity: 1,\n    selectedOpacity: 1,\n    inactiveOpacity: 0.1,\n    label: {\n      stroke: '#1E2026',\n      color: '#ACBAC7',\n      activeColor: '#1DE9AC',\n      fontSize: 6\n    }\n  },\n  arrow: {\n    fill: '#474B56',\n    activeFill: '#1DE9AC'\n  },\n  cluster: {\n    stroke: '#474B56',\n    opacity: 1,\n    selectedOpacity: 1,\n    inactiveOpacity: 0.1,\n    label: {\n      stroke: '#1E2026',\n      color: '#ACBAC7'\n    }\n  }\n};\n","import { Theme } from './theme';\n\nexport const lightTheme: Theme = {\n  canvas: {\n    background: '#fff'\n  },\n  node: {\n    fill: '#7CA0AB',\n    activeFill: '#1DE9AC',\n    opacity: 1,\n    selectedOpacity: 1,\n    inactiveOpacity: 0.2,\n    label: {\n      color: '#2A6475',\n      stroke: '#fff',\n      activeColor: '#1DE9AC'\n    },\n    subLabel: {\n      color: '#ddd',\n      stroke: 'transparent',\n      activeColor: '#1DE9AC'\n    }\n  },\n  lasso: {\n    border: '1px solid #55aaff',\n    background: 'rgba(75, 160, 255, 0.1)'\n  },\n  ring: {\n    fill: '#D8E6EA',\n    activeFill: '#1DE9AC'\n  },\n  edge: {\n    fill: '#D8E6EA',\n    activeFill: '#1DE9AC',\n    opacity: 1,\n    selectedOpacity: 1,\n    inactiveOpacity: 0.1,\n    label: {\n      stroke: '#fff',\n      color: '#2A6475',\n      activeColor: '#1DE9AC',\n      fontSize: 6\n    }\n  },\n  arrow: {\n    fill: '#D8E6EA',\n    activeFill: '#1DE9AC'\n  },\n  cluster: {\n    stroke: '#D8E6EA',\n    opacity: 1,\n    selectedOpacity: 1,\n    inactiveOpacity: 0.1,\n    label: {\n      stroke: '#fff',\n      color: '#2A6475'\n    }\n  }\n};\n","import { Theme } from '../themes';\nimport Graph from 'graphology';\n\nexport type PathSelectionTypes = 'direct' | 'out' | 'in' | 'all';\n\n/**\n * Given a graph and a list of node ids, return the adjacent nodes and edges.\n *\n * TODO: This method could be improved with the introduction of graphology\n */\nexport function getAdjacents(\n  graph: Graph,\n  nodeIds: string | string[],\n  type: PathSelectionTypes\n) {\n  nodeIds = Array.isArray(nodeIds) ? nodeIds : [nodeIds];\n\n  const nodes: string[] = [];\n  const edges: string[] = [];\n\n  for (const nodeId of nodeIds) {\n    const graphLinks = [\n      ...(graph.inEdgeEntries(nodeId) ?? []),\n      ...(graph.outEdgeEntries(nodeId) ?? [])\n    ];\n\n    if (!graphLinks) {\n      continue;\n    }\n\n    for (const link of graphLinks) {\n      const linkId = link.attributes.id;\n\n      if (type === 'in') {\n        if (link.target === nodeId && !edges.includes(linkId)) {\n          edges.push(linkId);\n        }\n      } else if (type === 'out') {\n        if (link.source === nodeId && !edges.includes(linkId)) {\n          edges.push(linkId);\n        }\n      } else {\n        if (!edges.includes(linkId)) {\n          edges.push(linkId);\n        }\n      }\n\n      if (type === 'out' || type === 'all') {\n        const toId = link.target;\n        if (!nodes.includes(toId as string)) {\n          nodes.push(toId as string);\n        }\n      }\n\n      if (type === 'in' || type === 'all') {\n        if (!nodes.includes(link.source)) {\n          nodes.push(link.source as string);\n        }\n      }\n    }\n  }\n\n  return {\n    nodes,\n    edges\n  };\n}\n\n/**\n * Set the vectors.\n */\nexport function prepareRay(event, vec, size) {\n  const { offsetX, offsetY } = event;\n  const { width, height } = size;\n  vec.set((offsetX / width) * 2 - 1, -(offsetY / height) * 2 + 1);\n}\n\n/**\n * Create a lasso element.\n */\nexport function createElement(theme: Theme) {\n  const element = document.createElement('div');\n  element.style.pointerEvents = 'none';\n  element.style.border = theme.lasso.border;\n  element.style.backgroundColor = theme.lasso.background;\n  element.style.position = 'fixed';\n  return element;\n}\n","import React, {\n  FC,\n  PropsWithChildren,\n  useCallback,\n  useEffect,\n  useRef\n} from 'react';\nimport { useThree } from '@react-three/fiber';\nimport { SelectionBox } from 'three-stdlib';\nimport { Mesh, Scene, TubeGeometry, Vector2 } from 'three';\nimport { useCameraControls } from '../CameraControls';\nimport { useStore } from '../store';\nimport { createElement, prepareRay } from './utils';\n\nexport type LassoType = 'none' | 'all' | 'node' | 'edge';\n\nexport type LassoProps = PropsWithChildren<{\n  /**\n   * Whether the lasso tool is disabled.\n   */\n  disabled?: boolean;\n\n  /**\n   * The type of the lasso tool.\n   */\n  type?: LassoType;\n\n  /**\n   * A function that is called when the lasso tool is used to select nodes.\n   * The function receives an array of the ids of the selected nodes.\n   */\n  onLasso?: (selections: string[]) => void;\n\n  /**\n   * A function that is called when the lasso tool is released, ending the selection.\n   * The function receives an array of the ids of the selected nodes.\n   */\n  onLassoEnd?: (selections: string[]) => void;\n}>;\n\nexport const Lasso: FC<LassoProps> = ({\n  children,\n  type = 'none',\n  onLasso,\n  onLassoEnd,\n  disabled\n}) => {\n  const theme = useStore(state => state.theme);\n  const camera = useThree(state => state.camera);\n  const gl = useThree(state => state.gl);\n  const setEvents = useThree(state => state.setEvents);\n  const size = useThree(state => state.size);\n  const get = useThree(state => state.get);\n  const scene = useThree(state => state.scene);\n\n  const cameraControls = useCameraControls();\n\n  const actives = useStore(state => state.actives);\n  const setActives = useStore(state => state.setActives);\n  const edges = useStore(state => state.edges);\n  const edgeMeshes = useStore(state => state.edgeMeshes);\n\n  const mountedRef = useRef<boolean>(false);\n  const selectionBoxRef = useRef<SelectionBox | null>(null);\n  const edgeMeshSelectionBoxRef = useRef<SelectionBox | null>(null);\n  const elementRef = useRef<HTMLDivElement>(createElement(theme));\n  const vectorsRef = useRef<[Vector2, Vector2, Vector2] | null>(null);\n  const isDownRef = useRef(false);\n  const oldRaycasterEnabledRef = useRef<boolean>(get().events.enabled);\n  const oldControlsEnabledRef = useRef<boolean>(\n    cameraControls.controls?.enabled\n  );\n\n  useEffect(() => {\n    if (mountedRef.current) {\n      onLasso?.(actives);\n    }\n\n    mountedRef.current = true;\n  }, [actives, onLasso]);\n\n  const onPointerMove = useCallback(\n    event => {\n      if (isDownRef.current) {\n        const [startPoint, pointTopLeft, pointBottomRight] = vectorsRef.current;\n\n        pointBottomRight.x = Math.max(startPoint.x, event.clientX);\n        pointBottomRight.y = Math.max(startPoint.y, event.clientY);\n        pointTopLeft.x = Math.min(startPoint.x, event.clientX);\n        pointTopLeft.y = Math.min(startPoint.y, event.clientY);\n        elementRef.current.style.left = `${pointTopLeft.x}px`;\n        elementRef.current.style.top = `${pointTopLeft.y}px`;\n        elementRef.current.style.width = `${\n          pointBottomRight.x - pointTopLeft.x\n        }px`;\n        elementRef.current.style.height = `${\n          pointBottomRight.y - pointTopLeft.y\n        }px`;\n\n        prepareRay(event, selectionBoxRef.current.endPoint, size);\n        prepareRay(event, edgeMeshSelectionBoxRef.current.endPoint, size);\n\n        const allSelected = [];\n        const edgesSelected = edgeMeshSelectionBoxRef.current\n          .select()\n          .sort(o => (o as any).uuid)\n          .map(\n            edge => edges[edgeMeshes.indexOf(edge as Mesh<TubeGeometry>)].id\n          );\n        allSelected.push(...edgesSelected);\n\n        const selected = selectionBoxRef.current\n          .select()\n          .sort(o => (o as any).uuid)\n          .filter(\n            o =>\n              o.isMesh &&\n              o.userData?.id &&\n              (o.userData?.type === type || type === 'all')\n          )\n          .map(o => o.userData.id);\n        allSelected.push(...selected);\n\n        // Note: This probably isn't the best solution but\n        // it prevents the render thrashing and causing flickering\n        requestAnimationFrame(() => {\n          setActives(allSelected);\n        });\n\n        document.addEventListener('pointermove', onPointerMove, {\n          passive: true,\n          capture: true,\n          once: true\n        });\n      }\n    },\n    [edges, edgeMeshes, setActives, size, type]\n  );\n\n  const onPointerUp = useCallback(() => {\n    if (isDownRef.current) {\n      setEvents({ enabled: oldRaycasterEnabledRef.current });\n      isDownRef.current = false;\n      elementRef.current.parentElement?.removeChild(elementRef.current);\n      cameraControls.controls.enabled = oldControlsEnabledRef.current;\n      onLassoEnd?.(actives);\n\n      document.removeEventListener('pointermove', onPointerMove);\n      document.removeEventListener('pointerup', onPointerUp);\n    }\n  }, [setEvents, cameraControls.controls, onLassoEnd, actives, onPointerMove]);\n\n  const onPointerDown = useCallback(\n    event => {\n      if (event.shiftKey) {\n        // Let's capture the old props to restore them later\n        oldRaycasterEnabledRef.current = get().events.enabled;\n        oldControlsEnabledRef.current = cameraControls.controls?.enabled;\n\n        // SelectionBox for all meshes\n        selectionBoxRef.current = new SelectionBox(camera, scene);\n\n        // SelectionBox for all Edge meshes (since they are combined into one geometry for rendering)\n        const edgeScene = new Scene();\n        if (edgeMeshes.length) {\n          edgeScene.add(...edgeMeshes);\n        }\n        edgeMeshSelectionBoxRef.current = new SelectionBox(camera, edgeScene);\n\n        vectorsRef.current = [\n          // start point\n          new Vector2(),\n          // point top left\n          new Vector2(),\n          // point bottom right\n          new Vector2()\n        ];\n\n        const [startPoint] = vectorsRef.current;\n\n        cameraControls.controls.enabled = false;\n        setEvents({ enabled: false });\n        isDownRef.current = true;\n        gl.domElement.parentElement?.appendChild(elementRef.current);\n        elementRef.current.style.left = `${event.clientX}px`;\n        elementRef.current.style.top = `${event.clientY}px`;\n        elementRef.current.style.width = '0px';\n        elementRef.current.style.height = '0px';\n        startPoint.x = event.clientX;\n        startPoint.y = event.clientY;\n\n        prepareRay(event, selectionBoxRef.current.startPoint, size);\n        prepareRay(event, edgeMeshSelectionBoxRef.current.startPoint, size);\n\n        document.addEventListener('pointermove', onPointerMove, {\n          passive: true,\n          capture: true,\n          once: true\n        });\n        document.addEventListener('pointerup', onPointerUp, { passive: true });\n      }\n    },\n    [\n      camera,\n      cameraControls.controls,\n      edgeMeshes,\n      get,\n      gl.domElement.parentElement,\n      onPointerMove,\n      onPointerUp,\n      scene,\n      setEvents,\n      size\n    ]\n  );\n\n  useEffect(() => {\n    if (disabled || type === 'none') {\n      return;\n    }\n\n    if (typeof window !== 'undefined') {\n      document.addEventListener('pointerdown', onPointerDown, {\n        passive: true\n      });\n      document.addEventListener('pointermove', onPointerMove, {\n        passive: true\n      });\n      document.addEventListener('pointerup', onPointerUp, { passive: true });\n    }\n\n    return () => {\n      if (typeof window !== 'undefined') {\n        document.removeEventListener('pointerdown', onPointerDown);\n        document.removeEventListener('pointermove', onPointerMove);\n        document.removeEventListener('pointerup', onPointerUp);\n      }\n    };\n  }, [type, disabled, onPointerDown, onPointerMove, onPointerUp]);\n\n  return <group>{children}</group>;\n};\n","import React, {\n  RefObject,\n  useCallback,\n  useEffect,\n  useMemo,\n  useState\n} from 'react';\nimport { GraphCanvasRef } from '../GraphCanvas';\nimport { useHotkeys } from 'reakeys';\nimport { GraphEdge, GraphNode } from '../types';\nimport { findPath } from '../utils/paths';\nimport { getAdjacents, PathSelectionTypes } from './utils';\n\nexport type HotkeyTypes = 'selectAll' | 'deselect' | 'delete';\n\nexport type SelectionTypes = 'single' | 'multi' | 'multiModifier';\n\nexport interface SelectionProps {\n  /**\n   * Required ref for the graph.\n   */\n  ref: RefObject<GraphCanvasRef | null>;\n\n  /**\n   * Current selections.\n   *\n   * Contains both nodes and edges ids.\n   */\n  selections?: string[];\n\n  /**\n   * Default active selections.\n   */\n  actives?: string[];\n\n  /**\n   * Node datas.\n   */\n  nodes?: GraphNode[];\n\n  /**\n   * Edge datas.\n   */\n  edges?: GraphEdge[];\n\n  /**\n   * Disabled or not.\n   */\n  disabled?: boolean;\n\n  /**\n   * Hotkey types\n   */\n  hotkeys?: HotkeyTypes[];\n\n  /**\n   * Whether to focus on select or not.\n   */\n  focusOnSelect?: boolean | 'singleOnly';\n\n  /**\n   * Type of selection.\n   */\n  type?: SelectionTypes;\n\n  /**\n   * Type of selection.\n   */\n  pathSelectionType?: PathSelectionTypes;\n\n  /**\n   * Whether it should active on hover or not.\n   */\n  pathHoverType?: PathSelectionTypes;\n\n  /**\n   * On selection change.\n   */\n  onSelection?: (selectionIds: string[]) => void;\n}\n\nexport interface SelectionResult {\n  /**\n   * Selections id array (of nodes and edges).\n   */\n  selections: string[];\n\n  /**\n   * The nodes/edges around the selections to highlight.\n   */\n  actives: string[];\n\n  /**\n   * Clear selections method.\n   */\n  clearSelections: (value?: string[]) => void;\n\n  /**\n   * A selection method.\n   */\n  addSelection: (value: string) => void;\n\n  /**\n   * Get the paths between two nodes.\n   */\n  selectNodePaths: (source: string, target: string) => void;\n\n  /**\n   * Remove selection method.\n   */\n  removeSelection: (value: string) => void;\n\n  /**\n   * Toggle existing selection on/off method.\n   */\n  toggleSelection: (value: string) => void;\n\n  /**\n   * Set internal selections.\n   */\n  setSelections: (value: string[]) => void;\n\n  /**\n   * On click event pass through.\n   */\n  onNodeClick?: (data: GraphNode) => void;\n\n  /**\n   * On canvas click event pass through.\n   */\n  onCanvasClick?: (event: MouseEvent) => void;\n\n  /**\n   * When the lasso happened.\n   */\n  onLasso?: (selections: string[]) => void;\n\n  /**\n   * When the lasso ended.\n   */\n  onLassoEnd?: (selections: string[]) => void;\n\n  /**\n   * When node got a pointer over.\n   */\n  onNodePointerOver?: (node: GraphNode) => void;\n\n  /**\n   * When node lost pointer over.\n   */\n  onNodePointerOut?: (node: GraphNode) => void;\n}\n\nexport const useSelection = ({\n  selections = [],\n  nodes = [],\n  actives = [],\n  focusOnSelect = true,\n  type = 'single',\n  pathHoverType = 'out',\n  pathSelectionType = 'direct',\n  ref,\n  hotkeys = ['selectAll', 'deselect', 'delete'],\n  disabled,\n  onSelection\n}: SelectionProps): SelectionResult => {\n  const [internalHovers, setInternalHovers] = useState<string[]>([]);\n  const [internalActives, setInternalActives] = useState<string[]>(actives);\n  const [internalSelections, setInternalSelections] =\n    useState<string[]>(selections);\n  const [metaKeyDown, setMetaKeyDown] = useState<boolean>(false);\n  const isMulti = type === 'multi' || type === 'multiModifier';\n\n  const addSelection = useCallback(\n    (items: string | string[]) => {\n      if (!disabled && items) {\n        items = Array.isArray(items) ? items : [items];\n\n        const filtered = items.filter(\n          item => !internalSelections.includes(item)\n        );\n        if (filtered.length) {\n          const next = [...internalSelections, ...filtered];\n          onSelection?.(next);\n          setInternalSelections(next);\n        }\n      }\n    },\n    [disabled, internalSelections, onSelection]\n  );\n\n  const removeSelection = useCallback(\n    (items: string | string[]) => {\n      if (!disabled && items) {\n        items = Array.isArray(items) ? items : [items];\n\n        const next = internalSelections.filter(i => !items.includes(i));\n        onSelection?.(next);\n        setInternalSelections(next);\n      }\n    },\n    [disabled, internalSelections, onSelection]\n  );\n\n  const clearSelections = useCallback(\n    (next: string | string[] = []) => {\n      if (!disabled) {\n        next = Array.isArray(next) ? next : [next];\n        setInternalActives([]);\n        setInternalSelections(next);\n        onSelection?.(next);\n      }\n    },\n    [disabled, onSelection]\n  );\n\n  const toggleSelection = useCallback(\n    (item: string) => {\n      const has = internalSelections.includes(item);\n      if (has) {\n        removeSelection(item);\n      } else {\n        if (!isMulti) {\n          clearSelections(item);\n        } else {\n          addSelection(item);\n        }\n      }\n    },\n    [\n      addSelection,\n      clearSelections,\n      internalSelections,\n      isMulti,\n      removeSelection\n    ]\n  );\n\n  const onNodeClick = useCallback(\n    (data: GraphNode) => {\n      if (isMulti) {\n        if (type === 'multiModifier') {\n          if (metaKeyDown) {\n            addSelection(data.id);\n          } else {\n            clearSelections(data.id);\n          }\n        } else {\n          addSelection(data.id);\n        }\n      } else {\n        clearSelections(data.id);\n      }\n\n      if (\n        focusOnSelect === true ||\n        (focusOnSelect === 'singleOnly' && !metaKeyDown)\n      ) {\n        if (!ref.current) {\n          throw new Error('No ref found for the graph canvas.');\n        }\n\n        const graph = ref.current.getGraph();\n        const { nodes: adjacents } = getAdjacents(\n          graph,\n          [data.id],\n          pathSelectionType\n        );\n\n        ref.current.fitNodesInView([data.id, ...adjacents], {\n          fitOnlyIfNodesNotInView: true\n        });\n      }\n    },\n    [\n      addSelection,\n      clearSelections,\n      focusOnSelect,\n      isMulti,\n      metaKeyDown,\n      pathSelectionType,\n      ref,\n      type\n    ]\n  );\n\n  const selectNodePaths = useCallback(\n    (source: string, target: string) => {\n      const graph = ref.current.getGraph();\n      if (!graph) {\n        throw new Error('Graph is not initialized');\n      }\n\n      const path = findPath(graph, source, target);\n      clearSelections([source, target]);\n\n      const result = [];\n      for (let i = 0; i < path.length - 1; i++) {\n        const from = path[i];\n        const to = path[i + 1];\n        const edge = graph.getEdgeAttributes(from, to);\n        if (edge) {\n          result.push(edge.id);\n        }\n      }\n\n      setInternalActives([...path.map(p => p as string), ...result]);\n    },\n    [clearSelections, ref]\n  );\n\n  const onKeyDown = useCallback((event: KeyboardEvent) => {\n    const element = event.target as any;\n    const isSafe =\n      element.tagName !== 'INPUT' &&\n      element.tagName !== 'SELECT' &&\n      element.tagName !== 'TEXTAREA' &&\n      !element.isContentEditable;\n\n    const isMeta = event.metaKey || event.ctrlKey;\n\n    if (isSafe && isMeta) {\n      event.preventDefault();\n      setMetaKeyDown(true);\n    }\n  }, []);\n\n  useEffect(() => {\n    if (typeof window !== 'undefined') {\n      window.addEventListener('keydown', onKeyDown);\n    }\n\n    return () => {\n      if (typeof window !== 'undefined') {\n        window.removeEventListener('keydown', onKeyDown);\n      }\n    };\n  }, [onKeyDown]);\n\n  const onCanvasClick = useCallback(\n    (event: MouseEvent) => {\n      if (\n        event.button !== 2 &&\n        (internalSelections.length || internalActives.length)\n      ) {\n        clearSelections();\n        setMetaKeyDown(false);\n\n        // Only re-center if we have a single selection\n        if (focusOnSelect && internalSelections.length === 1) {\n          if (!ref.current) {\n            throw new Error('No ref found for the graph canvas.');\n          }\n\n          ref.current.fitNodesInView([], { fitOnlyIfNodesNotInView: true });\n        }\n      }\n    },\n    [\n      clearSelections,\n      focusOnSelect,\n      internalActives.length,\n      internalSelections.length,\n      ref\n    ]\n  );\n\n  const onLasso = useCallback((selections: string[]) => {\n    setInternalActives(selections);\n  }, []);\n\n  const onLassoEnd = useCallback(\n    (selections: string[]) => {\n      clearSelections(selections);\n    },\n    [clearSelections]\n  );\n\n  const onNodePointerOver = useCallback(\n    (data: GraphNode) => {\n      if (pathHoverType) {\n        const graph = ref.current.getGraph();\n        if (!graph) {\n          throw new Error('No ref found for the graph canvas.');\n        }\n\n        const { nodes, edges } = getAdjacents(graph, [data.id], pathHoverType);\n        setInternalHovers([...nodes, ...edges]);\n      }\n    },\n    [pathHoverType, ref]\n  );\n\n  const onNodePointerOut = useCallback(() => {\n    if (pathHoverType) {\n      setInternalHovers([]);\n    }\n  }, [pathHoverType]);\n\n  useEffect(() => {\n    if (pathSelectionType !== 'direct' && internalSelections.length > 0) {\n      const graph = ref.current?.getGraph();\n      if (graph) {\n        const { nodes, edges } = getAdjacents(\n          graph,\n          internalSelections,\n          pathSelectionType\n        );\n        setInternalActives([...nodes, ...edges]);\n      }\n    }\n  }, [internalSelections, pathSelectionType, ref]);\n\n  useHotkeys([\n    {\n      name: 'Select All',\n      keys: 'mod+a',\n      disabled: !hotkeys.includes('selectAll'),\n      category: 'Graph',\n      description: 'Select all nodes and edges',\n      callback: event => {\n        event.preventDefault();\n\n        if (!disabled && type !== 'single') {\n          const next = nodes.map(n => n.id);\n          onSelection?.(next);\n          setInternalSelections(next);\n        }\n      }\n    },\n    {\n      name: 'Deselect Selections',\n      category: 'Graph',\n      disabled: !hotkeys.includes('deselect'),\n      description: 'Deselect selected nodes and edges',\n      keys: 'escape',\n      callback: event => {\n        if (!disabled) {\n          event.preventDefault();\n          onSelection?.([]);\n          setInternalSelections([]);\n        }\n      }\n    }\n  ]);\n\n  const joinedActives = useMemo(\n    () => [...internalActives, ...internalHovers],\n    [internalActives, internalHovers]\n  );\n\n  return {\n    actives: joinedActives,\n    onNodeClick,\n    onNodePointerOver,\n    onNodePointerOut,\n    onLasso,\n    onLassoEnd,\n    selectNodePaths,\n    onCanvasClick,\n    selections: internalSelections,\n    clearSelections,\n    addSelection,\n    removeSelection,\n    toggleSelection,\n    setSelections: setInternalSelections\n  };\n};\n","import React, {\n  FC,\n  forwardRef,\n  ReactNode,\n  Ref,\n  Suspense,\n  useImperativeHandle,\n  useRef,\n  useMemo\n} from 'react';\nimport { Canvas } from '@react-three/fiber';\nimport { GraphScene, GraphSceneProps, GraphSceneRef } from './GraphScene';\nimport {\n  CameraMode,\n  CameraControls,\n  CameraControlsRef\n} from './CameraControls';\nimport { Theme, lightTheme } from './themes';\nimport { createStore, Provider } from './store';\nimport Graph from 'graphology';\nimport { Lasso, LassoType } from './selection';\nimport ThreeCameraControls from 'camera-controls';\nimport css from './GraphCanvas.module.css';\n\nexport interface GraphCanvasProps extends Omit<GraphSceneProps, 'theme'> {\n  /**\n   * Theme to use for the graph.\n   */\n  theme?: Theme;\n\n  /**\n   * Type of camera interaction.\n   */\n  cameraMode?: CameraMode;\n\n  /**\n   * The maximum distance for the camera. Default is 50000.\n   */\n  maxDistance?: number;\n\n  /**\n   * The minimum distance for the camera. Default is 1000.\n   */\n  minDistance?: number;\n\n  /**\n   * The type of lasso selection.\n   */\n  lassoType?: LassoType;\n\n  /**\n   * Children to render in the canvas. Useful for things like lights.\n   */\n  children?: ReactNode;\n\n  /**\n   * Ability to extend Cavas gl options. For example { preserveDrawingBuffer: true }\n   */\n  glOptions?: Object;\n\n  /**\n   * When the canvas had a lasso selection.\n   */\n  onLasso?: (selections: string[]) => void;\n\n  /**\n   * When the canvas had a lasso selection end.\n   */\n  onLassoEnd?: (selections: string[]) => void;\n\n  /**\n   * When the canvas was clicked but didn't hit a node/edge.\n   */\n  onCanvasClick?: (event: MouseEvent) => void;\n}\n\nexport type GraphCanvasRef = Omit<GraphSceneRef, 'graph' | 'renderScene'> &\n  Omit<CameraControlsRef, 'controls'> & {\n    /**\n     * Get the graph object.\n     */\n    getGraph: () => Graph;\n\n    /**\n     * Get the camera controls.\n     */\n    getControls: () => ThreeCameraControls;\n\n    /**\n     * Export the canvas as a data URL.\n     */\n    exportCanvas: () => string;\n  };\n\nconst GL_DEFAULTS = {\n  alpha: true,\n  antialias: true\n};\n\n// TODO: Fix type\nconst CAMERA_DEFAULTS: any = {\n  position: [0, 0, 1000],\n  near: 5,\n  far: 50000,\n  fov: 10\n};\n\nexport const GraphCanvas: FC<GraphCanvasProps & { ref?: Ref<GraphCanvasRef> }> =\n  forwardRef(\n    (\n      {\n        cameraMode,\n        edges,\n        children,\n        nodes,\n        theme,\n        minDistance,\n        maxDistance,\n        onCanvasClick,\n        animated,\n        disabled,\n        lassoType,\n        onLasso,\n        onLassoEnd,\n        glOptions,\n        ...rest\n      },\n      ref: Ref<GraphCanvasRef>\n    ) => {\n      const rendererRef = useRef<GraphSceneRef | null>(null);\n      const controlsRef = useRef<CameraControlsRef | null>(null);\n      const canvasRef = useRef<HTMLCanvasElement | null>(null);\n\n      useImperativeHandle(ref, () => ({\n        centerGraph: (nodeIds, opts) =>\n          rendererRef.current?.centerGraph(nodeIds, opts),\n        fitNodesInView: (nodeIds, opts) =>\n          rendererRef.current?.fitNodesInView(nodeIds, opts),\n        zoomIn: () => controlsRef.current?.zoomIn(),\n        zoomOut: () => controlsRef.current?.zoomOut(),\n        dollyIn: distance => controlsRef.current?.dollyIn(distance),\n        dollyOut: distance => controlsRef.current?.dollyOut(distance),\n        panLeft: () => controlsRef.current?.panLeft(),\n        panRight: () => controlsRef.current?.panRight(),\n        panDown: () => controlsRef.current?.panDown(),\n        panUp: () => controlsRef.current?.panUp(),\n        resetControls: (animated?: boolean) =>\n          controlsRef.current?.resetControls(animated),\n        getControls: () => controlsRef.current?.controls,\n        getGraph: () => rendererRef.current?.graph,\n        exportCanvas: () => {\n          rendererRef.current.renderScene();\n          return canvasRef.current.toDataURL();\n        }\n      }));\n\n      // Defaults to pass to the store\n      const { selections, actives, collapsedNodeIds } = rest;\n\n      // It's pretty hard to get good animation performance with large n of edges/nodes\n      const finalAnimated =\n        edges.length + nodes.length > 400 ? false : animated;\n\n      const gl = useMemo(() => ({ ...glOptions, ...GL_DEFAULTS }), [glOptions]);\n\n      // NOTE: The legacy/linear/flat flags are for color issues\n      // Reference: https://github.com/protectwise/troika/discussions/213#discussioncomment-3086666\n      return (\n        <div className={css.canvas}>\n          <Canvas\n            legacy\n            linear\n            ref={canvasRef}\n            flat\n            gl={gl}\n            camera={CAMERA_DEFAULTS}\n            onPointerMissed={onCanvasClick}\n          >\n            <Provider\n              createStore={() =>\n                createStore({\n                  selections,\n                  actives,\n                  theme,\n                  collapsedNodeIds\n                })\n              }\n            >\n              {theme.canvas?.background && (\n                <color attach=\"background\" args={[theme.canvas.background]} />\n              )}\n              <ambientLight intensity={1} />\n              {children}\n              {theme.canvas?.fog && (\n                <fog attach=\"fog\" args={[theme.canvas.fog, 4000, 9000]} />\n              )}\n              <CameraControls\n                mode={cameraMode}\n                ref={controlsRef}\n                disabled={disabled}\n                minDistance={minDistance}\n                maxDistance={maxDistance}\n                animated={animated}\n              >\n                <Lasso\n                  disabled={disabled}\n                  type={lassoType}\n                  onLasso={onLasso}\n                  onLassoEnd={onLassoEnd}\n                >\n                  <Suspense>\n                    <GraphScene\n                      ref={rendererRef as any}\n                      disabled={disabled}\n                      animated={finalAnimated}\n                      edges={edges}\n                      nodes={nodes}\n                      {...rest}\n                    />\n                  </Suspense>\n                </Lasso>\n              </CameraControls>\n            </Provider>\n          </Canvas>\n        </div>\n      );\n    }\n  );\n\nGraphCanvas.defaultProps = {\n  cameraMode: 'pan',\n  layoutType: 'forceDirected2d',\n  sizingType: 'default',\n  labelType: 'auto',\n  theme: lightTheme,\n  animated: true,\n  defaultNodeSize: 7,\n  minNodeSize: 5,\n  maxNodeSize: 15,\n  lassoType: 'none',\n  glOptions: {}\n};\n","import classNames from 'classnames';\nimport React, { FC, ReactNode } from 'react';\nimport css from './RadialSlice.module.css';\n\nexport interface MenuItem {\n  /**\n   * Label to display on the menu item.\n   */\n  label: string;\n\n  /**\n   * CSS Classname to apply to the slice.\n   */\n  className?: string;\n\n  /**\n   * Optional icon to display on the menu item.\n   */\n  icon?: ReactNode;\n\n  /**\n   * Optional callback to detemine if the menu item is active.\n   */\n  disabled?: boolean;\n\n  /**\n   * Optional callback to handle when the menu item is clicked.\n   */\n  onClick?: (event: React.MouseEvent<HTMLDivElement>) => void;\n}\n\ninterface RadialSliceProps extends MenuItem {\n  /**\n   * The starting angle of the radial slice, in degrees.\n   */\n  startAngle: number;\n\n  /**\n   * The ending angle of the radial slice, in degrees.\n   */\n  endAngle: number;\n\n  /**\n   * The skew of the radial slice.\n   */\n  skew: number;\n\n  /**\n   * Whether the radial slice is polar (true) or not (false).\n   */\n  polar: boolean;\n\n  /**\n   * The central angle of the radial slice, in degrees.\n   */\n  centralAngle: number;\n\n  /**\n   * The radius of the radial slice.\n   */\n  radius: number;\n\n  /**\n   * The inner radius of the radial slice.\n   */\n  innerRadius: number;\n}\n\nexport const RadialSlice: FC<RadialSliceProps> = ({\n  label,\n  centralAngle,\n  startAngle,\n  endAngle,\n  polar,\n  radius,\n  className,\n  icon,\n  innerRadius,\n  skew,\n  disabled,\n  onClick\n}) => (\n  <div\n    role=\"menuitem\"\n    className={classNames(css.container, className, {\n      [css.disabled]: disabled\n    })}\n    style={{\n      width: centralAngle > 90 ? '100%' : '50%',\n      height: centralAngle > 90 ? '100%' : '50%',\n      bottom: centralAngle > 90 ? '50%' : 'initial',\n      right: centralAngle > 90 ? '50%' : 'initial',\n      transform: `rotate(${startAngle + endAngle}deg) skew(${skew}deg)`\n    }}\n    onClick={event => {\n      if (!disabled) {\n        onClick(event);\n      }\n    }}\n  >\n    <div\n      className={css.contentContainer}\n      style={{\n        transform: `skew(${-skew}deg) rotate(${\n          (polar ? 90 : centralAngle) / 2 - 90\n        }deg)`\n      }}\n    >\n      <div\n        className={css.contentInner}\n        style={{\n          top: `calc((((${\n            centralAngle > 90 ? '50% + ' : ''\n          }${radius}px) - ${innerRadius}px) / 2) - 4em)`\n        }}\n      >\n        <div\n          className={css.content}\n          style={{\n            transform: `rotate(${-endAngle}deg)`\n          }}\n          title={label}\n        >\n          {icon}\n          {label}\n        </div>\n      </div>\n    </div>\n  </div>\n);\n","import { MenuItem } from './RadialSlice';\n\nexport function calculateRadius(items: MenuItem[], startOffsetAngle: number) {\n  const centralAngle = 360 / items.length || 360;\n  const polar = centralAngle % 180 === 0;\n  const deltaAngle = 90 - centralAngle;\n  const startAngle = polar\n    ? 45\n    : startOffsetAngle + deltaAngle + centralAngle / 2;\n\n  return { centralAngle, polar, startAngle, deltaAngle };\n}\n","import React, { FC, useLayoutEffect, useMemo, useRef } from 'react';\nimport { RadialSlice, MenuItem } from './RadialSlice';\nimport { calculateRadius } from './utils';\nimport css from './RadialMenu.module.css';\nimport classNames from 'classnames';\n\ninterface RadialMenuProps {\n  /**\n   * An array of menu items to be displayed in the radial menu.\n   */\n  items: MenuItem[];\n\n  /**\n   * The radius of the radial menu.\n   */\n  radius?: number;\n\n  /**\n   * The inner radius of the radial menu.\n   */\n  innerRadius?: number;\n\n  /**\n   * The starting offset angle for the first menu item.\n   */\n  startOffsetAngle?: number;\n\n  /**\n   * The CSS class name for the radial menu.\n   */\n  className?: string;\n\n  /**\n   * A function that is called when the radial menu is closed.\n   * The function receives the mouse event that triggered the closure.\n   */\n  onClose?: (event: React.MouseEvent<HTMLDivElement>) => void;\n}\n\nexport const RadialMenu: FC<RadialMenuProps> = ({\n  items,\n  radius,\n  className,\n  innerRadius,\n  startOffsetAngle,\n  onClose\n}) => {\n  const { centralAngle, polar, startAngle, deltaAngle } = useMemo(\n    () => calculateRadius(items, startOffsetAngle),\n    [items, startOffsetAngle]\n  );\n  const timeout = useRef<any | null>(null);\n\n  useLayoutEffect(() => {\n    const timer = timeout.current;\n    return () => clearTimeout(timer);\n  }, []);\n\n  if (items.length === 0) {\n    return null;\n  }\n\n  return (\n    <div\n      role=\"menu\"\n      className={classNames(css.container, className)}\n      onPointerEnter={() => clearTimeout(timeout.current)}\n      onPointerLeave={event => {\n        clearTimeout(timeout.current);\n        timeout.current = setTimeout(() => onClose?.(event), 500);\n      }}\n    >\n      {items.map((slice, index) => (\n        <RadialSlice\n          key={index}\n          {...slice}\n          radius={radius}\n          innerRadius={innerRadius}\n          startAngle={startAngle}\n          endAngle={centralAngle * index}\n          skew={polar ? 0 : deltaAngle}\n          polar={polar}\n          centralAngle={centralAngle}\n          onClick={event => {\n            slice?.onClick(event);\n            onClose?.(event);\n          }}\n        />\n      ))}\n    </div>\n  );\n};\n\nRadialMenu.defaultProps = {\n  radius: 175,\n  innerRadius: 25,\n  startOffsetAngle: 0\n};\n"],"names":["d3ForceRadial","nodes","links","treemap","hierarchy","forceSimulation","forceX","forceY","forceCollide","forceManyBody","forceLink","d3ForceX","d3ForceY","d3ForceSimulation","d3ForceCenter","d3ForceLink","d3ForceManyBody","d3ForceZ","_a","_b","stratify","tree","degreeCentrality","scaleLinear","n","Vector3","QuadraticBezierCurve3","LineCurve3","disabled","useRef","useCallback","useThree","useMemo","Vector2","Plane","useGesture","bidirectional","create","theme","actives","selections","id","node","useEffect","Color","Billboard","jsx","Text","useSpring","jsxs","a","DoubleSide","Fragment","createContext","useContext","MOUSE","Vector4","Quaternion","Matrix4","Spherical","Box3","Sphere","Raycaster","MathUtils","extend","holdEvent","forwardRef","useFrame","ref","useHotkeys","animated","useImperativeHandle","useState","useLayoutEffect","TextureLoader","LinearFilter","DreiSvg","Html","useCursor","_c","curve","TubeGeometry","Edge","edge","arrowPosition","arrowRotation","Euler","BoxGeometry","CylinderGeometry","mergeBufferGeometries","BufferAttribute","active","inactive","draggingActive","draggingInactive","edgeMeshes","Mesh","SelectionBox","Scene","css","Canvas","Suspense"],"mappings":"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"}