@deck.gl-community/graph-layers 9.0.1 → 9.0.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (125) hide show
  1. package/dist/core/base-layout.d.ts +1 -0
  2. package/dist/core/base-layout.d.ts.map +1 -0
  3. package/dist/core/base-layout.js +1 -1
  4. package/dist/core/cache.d.ts +1 -0
  5. package/dist/core/cache.d.ts.map +1 -0
  6. package/dist/core/constants.d.ts +1 -0
  7. package/dist/core/constants.d.ts.map +1 -0
  8. package/dist/core/constants.js +1 -1
  9. package/dist/core/edge.d.ts +2 -1
  10. package/dist/core/edge.d.ts.map +1 -0
  11. package/dist/core/edge.js +1 -1
  12. package/dist/core/graph-engine.d.ts +4 -3
  13. package/dist/core/graph-engine.d.ts.map +1 -0
  14. package/dist/core/graph-engine.js +1 -1
  15. package/dist/core/graph.d.ts +3 -2
  16. package/dist/core/graph.d.ts.map +1 -0
  17. package/dist/core/graph.js +2 -2
  18. package/dist/core/interaction-manager.d.ts +3 -2
  19. package/dist/core/interaction-manager.d.ts.map +1 -0
  20. package/dist/core/interaction-manager.js +1 -1
  21. package/dist/core/node.d.ts +3 -2
  22. package/dist/core/node.d.ts.map +1 -0
  23. package/dist/core/node.js +1 -1
  24. package/dist/index.cjs.map +1 -1
  25. package/dist/index.d.ts +19 -18
  26. package/dist/index.d.ts.map +1 -0
  27. package/dist/index.js +18 -18
  28. package/dist/layers/common-layers/flow-path-layer/flow-path-layer-fragment.glsl.d.ts +1 -0
  29. package/dist/layers/common-layers/flow-path-layer/flow-path-layer-fragment.glsl.d.ts.map +1 -0
  30. package/dist/layers/common-layers/flow-path-layer/flow-path-layer-vertex-tf.glsl.d.ts +1 -0
  31. package/dist/layers/common-layers/flow-path-layer/flow-path-layer-vertex-tf.glsl.d.ts.map +1 -0
  32. package/dist/layers/common-layers/flow-path-layer/flow-path-layer-vertex.glsl.d.ts +1 -0
  33. package/dist/layers/common-layers/flow-path-layer/flow-path-layer-vertex.glsl.d.ts.map +1 -0
  34. package/dist/layers/common-layers/flow-path-layer/flow-path-layer.d.ts +1 -0
  35. package/dist/layers/common-layers/flow-path-layer/flow-path-layer.d.ts.map +1 -0
  36. package/dist/layers/common-layers/marker-layer/atlas-data-url.d.ts +1 -0
  37. package/dist/layers/common-layers/marker-layer/atlas-data-url.d.ts.map +1 -0
  38. package/dist/layers/common-layers/marker-layer/marker-layer.d.ts +1 -0
  39. package/dist/layers/common-layers/marker-layer/marker-layer.d.ts.map +1 -0
  40. package/dist/layers/common-layers/marker-layer/marker-layer.js +2 -2
  41. package/dist/layers/common-layers/marker-layer/marker-list.d.ts +1 -0
  42. package/dist/layers/common-layers/marker-layer/marker-list.d.ts.map +1 -0
  43. package/dist/layers/common-layers/marker-layer/marker-mapping.d.ts +1 -0
  44. package/dist/layers/common-layers/marker-layer/marker-mapping.d.ts.map +1 -0
  45. package/dist/layers/common-layers/spline-layer/spline-layer.d.ts +1 -0
  46. package/dist/layers/common-layers/spline-layer/spline-layer.d.ts.map +1 -0
  47. package/dist/layers/common-layers/zoomable-text-layer/zoomable-text-layer.d.ts +1 -0
  48. package/dist/layers/common-layers/zoomable-text-layer/zoomable-text-layer.d.ts.map +1 -0
  49. package/dist/layers/edge-layer.d.ts +4 -3
  50. package/dist/layers/edge-layer.d.ts.map +1 -0
  51. package/dist/layers/edge-layer.js +4 -4
  52. package/dist/layers/edge-layers/curved-edge-layer.d.ts +2 -1
  53. package/dist/layers/edge-layers/curved-edge-layer.d.ts.map +1 -0
  54. package/dist/layers/edge-layers/curved-edge-layer.js +1 -1
  55. package/dist/layers/edge-layers/edge-label-layer.d.ts +2 -1
  56. package/dist/layers/edge-layers/edge-label-layer.d.ts.map +1 -0
  57. package/dist/layers/edge-layers/edge-label-layer.js +1 -1
  58. package/dist/layers/edge-layers/flow-layer.d.ts +2 -1
  59. package/dist/layers/edge-layers/flow-layer.d.ts.map +1 -0
  60. package/dist/layers/edge-layers/flow-layer.js +1 -1
  61. package/dist/layers/edge-layers/path-edge-layer.d.ts +1 -0
  62. package/dist/layers/edge-layers/path-edge-layer.d.ts.map +1 -0
  63. package/dist/layers/edge-layers/straight-line-edge-layer.d.ts +1 -0
  64. package/dist/layers/edge-layers/straight-line-edge-layer.d.ts.map +1 -0
  65. package/dist/layers/graph-layer.d.ts +9 -8
  66. package/dist/layers/graph-layer.d.ts.map +1 -0
  67. package/dist/layers/graph-layer.js +15 -15
  68. package/dist/layers/node-layers/circle-layer.d.ts +1 -0
  69. package/dist/layers/node-layers/circle-layer.d.ts.map +1 -0
  70. package/dist/layers/node-layers/image-layer.d.ts +1 -0
  71. package/dist/layers/node-layers/image-layer.d.ts.map +1 -0
  72. package/dist/layers/node-layers/label-layer.d.ts +2 -1
  73. package/dist/layers/node-layers/label-layer.d.ts.map +1 -0
  74. package/dist/layers/node-layers/label-layer.js +1 -1
  75. package/dist/layers/node-layers/path-rounded-rectange-layer.d.ts +1 -0
  76. package/dist/layers/node-layers/path-rounded-rectange-layer.d.ts.map +1 -0
  77. package/dist/layers/node-layers/path-rounded-rectange-layer.js +1 -1
  78. package/dist/layers/node-layers/rectangle-layer.d.ts +1 -0
  79. package/dist/layers/node-layers/rectangle-layer.d.ts.map +1 -0
  80. package/dist/layers/node-layers/rounded-rectangle-layer-fragment.d.ts +1 -0
  81. package/dist/layers/node-layers/rounded-rectangle-layer-fragment.d.ts.map +1 -0
  82. package/dist/layers/node-layers/rounded-rectangle-layer.d.ts +2 -1
  83. package/dist/layers/node-layers/rounded-rectangle-layer.d.ts.map +1 -0
  84. package/dist/layers/node-layers/rounded-rectangle-layer.js +2 -2
  85. package/dist/layers/node-layers/zoomable-marker-layer.d.ts +2 -1
  86. package/dist/layers/node-layers/zoomable-marker-layer.d.ts.map +1 -0
  87. package/dist/layers/node-layers/zoomable-marker-layer.js +1 -1
  88. package/dist/layouts/d3-force/d3-force-layout.d.ts +2 -1
  89. package/dist/layouts/d3-force/d3-force-layout.d.ts.map +1 -0
  90. package/dist/layouts/d3-force/d3-force-layout.js +2 -2
  91. package/dist/layouts/d3-force/worker.d.ts +1 -0
  92. package/dist/layouts/d3-force/worker.d.ts.map +1 -0
  93. package/dist/layouts/gpu-force/gpu-force-layout.d.ts +2 -1
  94. package/dist/layouts/gpu-force/gpu-force-layout.d.ts.map +1 -0
  95. package/dist/layouts/gpu-force/gpu-force-layout.js +2 -2
  96. package/dist/layouts/gpu-force/worker.d.ts +1 -0
  97. package/dist/layouts/gpu-force/worker.d.ts.map +1 -0
  98. package/dist/layouts/simple-layout/simple-layout.d.ts +4 -3
  99. package/dist/layouts/simple-layout/simple-layout.d.ts.map +1 -0
  100. package/dist/layouts/simple-layout/simple-layout.js +2 -2
  101. package/dist/loaders/edge-parsers.d.ts +1 -0
  102. package/dist/loaders/edge-parsers.d.ts.map +1 -0
  103. package/dist/loaders/edge-parsers.js +1 -1
  104. package/dist/loaders/json-loader.d.ts +3 -2
  105. package/dist/loaders/json-loader.d.ts.map +1 -0
  106. package/dist/loaders/json-loader.js +4 -4
  107. package/dist/loaders/node-parsers.d.ts +1 -0
  108. package/dist/loaders/node-parsers.d.ts.map +1 -0
  109. package/dist/loaders/node-parsers.js +1 -1
  110. package/dist/style/style-property.d.ts +1 -0
  111. package/dist/style/style-property.d.ts.map +1 -0
  112. package/dist/style/style-property.js +1 -1
  113. package/dist/style/style-sheet.d.ts +1 -0
  114. package/dist/style/style-sheet.d.ts.map +1 -0
  115. package/dist/style/style-sheet.js +3 -3
  116. package/dist/utils/create-graph.d.ts +2 -1
  117. package/dist/utils/create-graph.d.ts.map +1 -0
  118. package/dist/utils/create-graph.js +3 -3
  119. package/dist/utils/layer-utils.d.ts +1 -0
  120. package/dist/utils/layer-utils.d.ts.map +1 -0
  121. package/dist/utils/log.d.ts +1 -0
  122. package/dist/utils/log.d.ts.map +1 -0
  123. package/dist/utils/polygon-calculations.d.ts +1 -0
  124. package/dist/utils/polygon-calculations.d.ts.map +1 -0
  125. package/package.json +2 -3
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["index.js", "core/cache.js", "core/graph-engine.js", "utils/log.js", "core/graph.js", "layers/common-layers/marker-layer/marker-list.js", "core/constants.js", "core/node.js", "core/edge.js", "core/base-layout.js", "layouts/d3-force/d3-force-layout.js", "layouts/gpu-force/gpu-force-layout.js", "layouts/simple-layout/simple-layout.js", "utils/create-graph.js", "loaders/node-parsers.js", "loaders/edge-parsers.js", "loaders/json-loader.js", "utils/layer-utils.js", "layers/graph-layer.js", "style/style-property.js", "style/style-sheet.js", "core/interaction-manager.js", "layers/node-layers/circle-layer.js", "layers/node-layers/image-layer.js", "layers/node-layers/label-layer.js", "layers/common-layers/zoomable-text-layer/zoomable-text-layer.js", "layers/node-layers/rectangle-layer.js", "layers/node-layers/rounded-rectangle-layer-fragment.js", "layers/node-layers/rounded-rectangle-layer.js", "layers/node-layers/path-rounded-rectange-layer.js", "utils/polygon-calculations.js", "layers/node-layers/zoomable-marker-layer.js", "layers/common-layers/marker-layer/marker-layer.js", "layers/common-layers/marker-layer/marker-mapping.js", "layers/common-layers/marker-layer/atlas-data-url.js", "layers/edge-layer.js", "layers/edge-layers/straight-line-edge-layer.js", "layers/edge-layers/path-edge-layer.js", "layers/edge-layers/curved-edge-layer.js", "layers/common-layers/spline-layer/spline-layer.js", "layers/edge-layers/edge-label-layer.js", "layers/edge-layers/flow-layer.js", "layers/common-layers/flow-path-layer/flow-path-layer.js", "layers/common-layers/flow-path-layer/flow-path-layer-vertex.glsl.js", "layers/common-layers/flow-path-layer/flow-path-layer-fragment.glsl.js"],
4
- "sourcesContent": ["// deck.gl-community\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n// react-graph-layers core\nexport { GraphEngine } from './core/graph-engine';\nexport { Graph } from './core/graph';\nexport { Node } from './core/node';\nexport { Edge } from './core/edge';\nexport { NODE_STATE, NODE_TYPE, EDGE_TYPE, EDGE_DECORATOR_TYPE, LAYOUT_STATE, MARKER_TYPE } from './core/constants';\n// react-graph-layers layouts\nexport { BaseLayout } from './core/base-layout';\nexport { D3ForceLayout } from './layouts/d3-force/d3-force-layout';\nexport { GPUForceLayout } from './layouts/gpu-force/gpu-force-layout';\nexport { SimpleLayout } from './layouts/simple-layout/simple-layout';\n// react-graph-layers loaders\nexport { JSONLoader } from './loaders/json-loader';\nexport { basicNodeParser } from './loaders/node-parsers';\nexport { basicEdgeParser } from './loaders/edge-parsers';\n// react-graph-layers utils\nexport { createGraph } from './utils/create-graph';\nexport * from './utils/layer-utils';\nexport * from './utils/log';\n// deck.gl components\nexport { GraphLayer } from './layers/graph-layer';\nexport { EdgeLayer } from './layers/edge-layer';\n// DEPRECATED\n/** @deprecated Use EdgeLayer */\nexport { EdgeLayer as CompositeEdgeLayer } from './layers/edge-layer';\n", "// deck.gl-community\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\nexport class Cache {\n _keys = new Map();\n /**\n * @param key The key of the cache\n * @returns {*} The value of the cache as set by the `set` method.\n */\n get(key) {\n return this._keys.get(key)?.value;\n }\n /**\n * @param key The key of the cache\n * @param createValue A callback to create the value of the cache if it is needed.\n * @param version The version of the cache. If the version is smaller than the current version, the cache will not be updated.\n */\n set(key, createValue, version) {\n const cached = this._keys.get(key);\n const keyUpdated = cached === undefined || version > cached.version;\n if (!keyUpdated) {\n return;\n }\n this._keys.set(key, { version, value: createValue() });\n }\n}\n", "// deck.gl-community\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\nimport { Cache } from './cache';\n// Graph engine controls the graph data and layout calculation\nexport class GraphEngine extends EventTarget {\n _graph;\n _layout;\n _cache = new Cache();\n _layoutDirty = false;\n _transactionInProgress = false;\n constructor(graph, layout) {\n super();\n this._graph = graph;\n this._layout = layout;\n }\n /** Getters */\n getNodes = () => {\n this._updateCache('nodes', () => this._graph.getNodes().filter((node) => this.getNodePosition(node)));\n return this._cache.get('nodes');\n };\n getEdges = () => {\n this._updateCache('edges', () => this._graph.getEdges().filter((edge) => this.getEdgePosition(edge)));\n return this._cache.get('edges');\n };\n getNodePosition = (node) => this._layout.getNodePosition(node);\n getEdgePosition = (edge) => this._layout.getEdgePosition(edge);\n getGraphVersion = () => this._graph.version;\n getLayoutLastUpdate = () => this._layout.version;\n getLayoutState = () => this._layout.state;\n /** Operations on the graph */\n lockNodePosition = (node, x, y) => this._layout.lockNodePosition(node, x, y);\n unlockNodePosition = (node) => this._layout.unlockNodePosition(node);\n /**\n * @fires GraphEngine#onLayoutStart\n */\n _onLayoutStart = () => {\n /**\n * @event GraphEngine#onLayoutStart\n * @type {CustomEvent}\n */\n this.dispatchEvent(new CustomEvent('onLayoutStart'));\n };\n /**\n * @fires GraphEngine#onLayoutChange\n */\n _onLayoutChange = () => {\n /**\n * @event GraphEngine#onLayoutChange\n * @type {CustomEvent}\n */\n this.dispatchEvent(new CustomEvent('onLayoutChange'));\n };\n /**\n * @fires GraphEngine#onLayoutDone\n */\n _onLayoutDone = () => {\n /**\n * @event GraphEngine#onLayoutDone\n * @type {CustomEvent}\n */\n this.dispatchEvent(new CustomEvent('onLayoutDone'));\n };\n /**\n * @fires GraphEngine#onLayoutError\n */\n _onLayoutError = () => {\n /**\n * @event GraphEngine#onLayoutError\n * @type {CustomEvent}\n */\n this.dispatchEvent(new CustomEvent('onLayoutError'));\n };\n _onGraphStructureChanged = (entity) => {\n this._layoutDirty = true;\n this._graphChanged();\n };\n _onTransactionStart = () => {\n this._transactionInProgress = true;\n };\n _onTransactionEnd = () => {\n this._transactionInProgress = false;\n this._graphChanged();\n };\n /** Layout calculations */\n run = () => {\n // TODO: throw if running on a cleared engine\n this._graph.addEventListener('transactionStart', this._onTransactionStart);\n this._graph.addEventListener('transactionEnd', this._onTransactionEnd);\n this._graph.addEventListener('onNodeAdded', this._onGraphStructureChanged);\n this._graph.addEventListener('onNodeRemoved', this._onGraphStructureChanged);\n this._graph.addEventListener('onEdgeAdded', this._onGraphStructureChanged);\n this._graph.addEventListener('onEdgeRemoved', this._onGraphStructureChanged);\n this._layout.addEventListener('onLayoutStart', this._onLayoutStart);\n this._layout.addEventListener('onLayoutChange', this._onLayoutChange);\n this._layout.addEventListener('onLayoutDone', this._onLayoutDone);\n this._layout.addEventListener('onLayoutError', this._onLayoutError);\n this._layout.initializeGraph(this._graph);\n this._layout.start();\n };\n clear = () => {\n this._graph.removeEventListener('transactionStart', this._onTransactionStart);\n this._graph.removeEventListener('transactionEnd', this._onTransactionEnd);\n this._graph.removeEventListener('onNodeAdded', this._onGraphStructureChanged);\n this._graph.removeEventListener('onNodeRemoved', this._onGraphStructureChanged);\n this._graph.removeEventListener('onEdgeAdded', this._onGraphStructureChanged);\n this._graph.removeEventListener('onEdgeRemoved', this._onGraphStructureChanged);\n this._layout.removeEventListener('onLayoutStart', this._onLayoutStart);\n this._layout.removeEventListener('onLayoutChange', this._onLayoutChange);\n this._layout.removeEventListener('onLayoutDone', this._onLayoutDone);\n this._layout.removeEventListener('onLayoutError', this._onLayoutError);\n };\n resume = () => this._layout.resume();\n stop = () => this._layout.stop();\n _graphChanged = () => {\n if (this._layoutDirty && !this._transactionInProgress) {\n this._updateLayout();\n }\n };\n _updateLayout = () => {\n this._layout.updateGraph(this._graph);\n this._layout.update();\n this._layoutDirty = false;\n };\n _updateCache(key, updateValue) {\n this._cache.set(key, updateValue, this._graph.version + this._layout.version);\n }\n}\n", "// deck.gl-community\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\nimport { Log, COLOR } from 'probe.gl';\nexport const log = new Log({ id: 'react-graph-layers' }).enable();\nlog.log({ color: COLOR.CYAN }, 'Initialize react-graph-layers logger.')();\n", "// deck.gl-community\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\nimport { log } from '../utils/log';\nimport { Cache } from './cache';\n// Basic graph data structure\nexport class Graph extends EventTarget {\n /** List object of nodes. */\n _nodeMap = {};\n /** List of object edges. */\n _edgeMap = {};\n /**\n * Identifies whether performing dirty check when streaming new data. If\n * the name of the graph is not specified, will fall back to current time stamp.\n */\n _name = Date.now().toString();\n /** Version the graph. A version is a number that is incremented every time the graph is updated. */\n version = 0;\n /** Cached data: create array data from maps. */\n _cache = new Cache();\n /**\n * The constructor of the Graph class.\n * @param {Object} graph - copy the graph if this exists.\n */\n constructor(graph = null) {\n super();\n // copy the graph if it exists in the parameter\n if (graph) {\n // start copying the graph\n this._nodeMap = graph._nodeMap;\n this._edgeMap = graph._edgeMap;\n this._name = graph && graph._name;\n }\n }\n /**\n * Set graph name\n * @param {string} name\n */\n setGraphName(name) {\n this._name = name;\n }\n /** Get the name of the graph. Default value is the time stamp when creating this graph.\n * @return {string} graph name.\n */\n getGraphName() {\n return this._name.toString();\n }\n /**\n * Perform a batch of operations defined by cb before indicating graph is updated\n * @param {function} cb - a callback fuction containing the operations to perform\n */\n transaction(cb) {\n try {\n this.dispatchEvent(new CustomEvent('transactionStart'));\n return cb();\n }\n finally {\n this.dispatchEvent(new CustomEvent('transactionEnd'));\n }\n }\n /**\n * Add a new node to the graph.\n * @param {Node} node - expect a Node object to be added to the graph.\n */\n addNode(node) {\n // add it to the list and map\n this._nodeMap[node.getId()] = node;\n // update last update time stamp\n this._bumpVersion();\n this.dispatchEvent(new CustomEvent('onNodeAdded', { node }));\n }\n /**\n * Batch add nodes to the graph.\n * @param {Node[]} nodes - a list of nodes to be added.\n */\n batchAddNodes(nodes) {\n // convert an array of objects to an object\n this._nodeMap = nodes.reduce((res, node) => {\n res[node.getId()] = node;\n this.dispatchEvent(new CustomEvent('onNodeAdded', { node }));\n return res;\n }, { ...this._nodeMap });\n this._bumpVersion();\n }\n /**\n * Get all the nodes of the graph.\n * @return {Node[]} - get all the nodes in the graph.\n */\n getNodes() {\n this._updateCache('nodes', () => Object.values(this._nodeMap));\n return this._cache.get('nodes');\n }\n /**\n * Get the node map of the graph. The key of the map is the ID of the nodes.\n * @return {Object} - a map of nodes keyed by node IDs.\n */\n getNodeMap() {\n return this._nodeMap;\n }\n /**\n * Find a node by id\n * @param {String} nodeId The id of the node\n * @return {Object} Node\n */\n findNode(nodeId) {\n return this._nodeMap[nodeId];\n }\n /**\n * Update the indicated node to the provided value\n * @param {Node} node\n */\n updateNode(node) {\n this._nodeMap[node.getId()] = node;\n this._bumpVersion();\n this.dispatchEvent(new CustomEvent('onNodeUpdated', { node }));\n }\n /**\n * Add a new edge to the graph.\n * @param {Edge} edge - expect a Edge object to be added to the graph.\n */\n addEdge(edge) {\n const sourceNode = this.findNode(edge.getSourceNodeId());\n const targetNode = this.findNode(edge.getTargetNodeId());\n if (!sourceNode || !targetNode) {\n log.warn(`Unable to add edge ${edge.id}, source or target node is missing.`)();\n return;\n }\n this._edgeMap[edge.getId()] = edge;\n sourceNode.addConnectedEdges(edge);\n targetNode.addConnectedEdges(edge);\n this._bumpVersion();\n this.dispatchEvent(new CustomEvent('onEdgeAdded', { edge }));\n }\n /**\n * Batch add edges to the graph\n * @param {Edge[]} edges - a list of edges to be added.\n */\n batchAddEdges(edges) {\n edges.forEach((edge) => this.addEdge(edge));\n this._bumpVersion();\n }\n /**\n * Update the indicated edge to the provided value\n * @param {Edge} edge\n */\n updateEdge(edge) {\n this._edgeMap[edge.getId()] = edge;\n this._bumpVersion();\n this.dispatchEvent(new CustomEvent('onEdgeUpdated', { edge }));\n }\n /**\n * Remove a node from the graph by node ID\n * @param {String|Number} nodeId - the ID of the target node.\n */\n removeNode(nodeId) {\n const node = this.findNode(nodeId);\n if (!node) {\n log.warn(`Unable to remove node ${nodeId} - doesn't exist`)();\n return;\n }\n // remove all edges connect to this node from map\n node.getConnectedEdges().forEach((e) => {\n delete this._edgeMap[e.getId()];\n });\n // remove the node from map\n delete this._nodeMap[nodeId];\n this._bumpVersion();\n this.dispatchEvent(new CustomEvent('onNodeRemoved', { node }));\n }\n /**\n * Get all the edges of the graph.\n * @return {Edge[]} get all the edges in the graph.\n */\n getEdges() {\n this._updateCache('edges', () => Object.values(this._edgeMap));\n return this._cache.get('edges');\n }\n /**\n * Get the edge map of the graph. The key of the map is the ID of the edges.\n * @return {Object} - a map of edges keyed by edge IDs.\n */\n getEdgeMap() {\n return this._edgeMap;\n }\n /**\n * Remove an edge from the graph by the edge ID\n * @param {String|Number} edgeId - the target edge ID.\n */\n removeEdge(edgeId) {\n const edge = this.findEdge(edgeId);\n if (!edge) {\n log.warn(`Unable to remove edge ${edgeId} - doesn't exist`)();\n return;\n }\n const sourceNode = this.findNode(edge.getSourceNodeId());\n const targetNode = this.findNode(edge.getTargetNodeId());\n delete this._edgeMap[edgeId];\n sourceNode.removeConnectedEdges(edge);\n targetNode.removeConnectedEdges(edge);\n this._bumpVersion();\n }\n /**\n * Find the edge by edge ID.\n * @param {String|Number} id - the target edge ID\n * @return {Edge} - the target edge.\n */\n findEdge(edgeId) {\n return this._edgeMap[edgeId];\n }\n /**\n * Return all the connected edges of a node by nodeID.\n * @param {String|Number} nodeId - the target node ID\n * @return {Edge[]} - an array of the connected edges.\n */\n getConnectedEdges(nodeId) {\n const node = this.findNode(nodeId);\n if (!node) {\n log.warn(`Unable to find node ${nodeId} - doesn't exist`)();\n return [];\n }\n return node.getConnectedEdges();\n }\n /**\n * Return all the sibling nodes of a node by nodeID.\n * @param {String|Number} nodeId - the target node ID\n * @return {Node[]} - an array of the sibling nodes.\n */\n getNodeSiblings(nodeId) {\n const node = this.findNode(nodeId);\n if (!node) {\n log.warn(`Unable to find node ${nodeId} - doesn't exist`)();\n return [];\n }\n return node.getSiblingIds().map((siblingNodeId) => this.findNode(siblingNodeId));\n }\n /**\n * Get the degree of a node.\n * @param {String|Number} nodeId - the target node ID.\n * @return {Number} - the degree of the node.\n */\n getDegree(nodeId) {\n const node = this.findNode(nodeId);\n if (!node) {\n log.warn(`Unable to find node ${nodeId} - doesn't exist`)();\n return 0;\n }\n return node.getDegree();\n }\n /**\n * Clean up all the nodes in the graph.\n */\n resetNodes() {\n this._nodeMap = {};\n this._bumpVersion();\n }\n /**\n * Clean up all the edges in the graph.\n */\n resetEdges() {\n this._edgeMap = {};\n this._bumpVersion();\n }\n /**\n * Clean up everything in the graph.\n */\n reset() {\n this.resetNodes();\n this.resetEdges();\n this._bumpVersion();\n }\n /**\n * Trigger an update to the graph.\n */\n triggerUpdate() {\n this._bumpVersion();\n }\n /**\n * Return true if the graph is empty.\n * @return {Boolean} Return true if the graph is empty.\n */\n isEmpty() {\n return Object.keys(this._nodeMap).length === 0;\n }\n /**\n * Check the equality of two graphs data by checking last update time stamp\n * @param {Object} g Another graph to be compared against itself\n * @return {Bool} True if the graph is the same as itself.\n */\n equals(g) {\n if (!g || !(g instanceof Graph)) {\n return false;\n }\n return this.version === g.version;\n }\n _bumpVersion() {\n this.version += 1;\n }\n _updateCache(key, updateValue) {\n this._cache.set(key, updateValue, this.version);\n }\n}\n", "// deck.gl-community\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n/* eslint-disable */\nexport const MarkerList = {\n 'bell-filled': 'bell-filled',\n bell: 'bell',\n 'bookmark-filled': 'bookmark-filled',\n bookmark: 'bookmark',\n 'cd-filled': 'cd-filled',\n cd: 'cd',\n checkmark: 'checkmark',\n 'circle-check-filled': 'circle-check-filled',\n 'circle-check': 'circle-check',\n 'circle-filled': 'circle-filled',\n 'circle-i-filled': 'circle-i-filled',\n 'circle-i': 'circle-i',\n 'circle-minus-filled': 'circle-minus-filled',\n 'circle-minus': 'circle-minus',\n 'circle-plus-filled': 'circle-plus-filled',\n 'circle-plus': 'circle-plus',\n 'circle-questionmark-filled': 'circle-questionmark-filled',\n 'circle-questionmark': 'circle-questionmark',\n 'circle-slash-filled': 'circle-slash-filled',\n 'circle-slash': 'circle-slash',\n 'circle-x-filled': 'circle-x-filled',\n 'circle-x': 'circle-x',\n circle: 'circle',\n 'diamond-filled': 'diamond-filled',\n diamond: 'diamond',\n 'flag-filled': 'flag-filled',\n flag: 'flag',\n gear: 'gear',\n 'heart-filled': 'heart-filled',\n heart: 'heart',\n 'location-marker-filled': 'location-marker-filled',\n 'location-marker': 'location-marker',\n 'octagonal-star-filled': 'octagonal-star-filled',\n 'octagonal-star': 'octagonal-star',\n 'person-filled': 'person-filled',\n person: 'person',\n 'pin-filled': 'pin-filled',\n pin: 'pin',\n 'plus-small': 'plus-small',\n plus: 'plus',\n 'rectangle-filled': 'rectangle-filled',\n rectangle: 'rectangle',\n 'star-filled': 'star-filled',\n star: 'star',\n 'tag-filled': 'tag-filled',\n tag: 'tag',\n 'thumb-down-filled': 'thumb-down-filled',\n 'thumb-down': 'thumb-down',\n 'thumb-up': 'thumb-up',\n 'thumb_up-filled': 'thumb_up-filled',\n 'triangle-down-filled': 'triangle-down-filled',\n 'triangle-down': 'triangle-down',\n 'triangle-left-filled': 'triangle-left-filled',\n 'triangle-left': 'triangle-left',\n 'triangle-right-filled': 'triangle-right-filled',\n 'triangle-right': 'triangle-right',\n 'triangle-up-filled': 'triangle-up-filled',\n 'triangle-up': 'triangle-up',\n 'x-small': 'x-small',\n x: 'x'\n};\n/* eslint-enable */\n", "// deck.gl-community\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\nimport { MarkerList } from '../layers/common-layers/marker-layer/marker-list';\n/** All the markers supported by node type MARKER */\nexport const MARKER_TYPE = MarkerList;\n// the interaction state of a node.\nexport const NODE_STATE = {\n DEFAULT: 'default',\n HOVER: 'hover',\n DRAGGING: 'dragging',\n SELECTED: 'selected'\n};\nexport const EDGE_STATE = {\n DEFAULT: 'default',\n HOVER: 'hover',\n DRAGGING: 'dragging',\n SELECTED: 'selected'\n};\n// node visual marker type\nexport const NODE_TYPE = {\n CIRCLE: 'CIRCLE',\n RECTANGLE: 'RECTANGLE',\n ROUNDED_RECTANGLE: 'ROUNDED_RECTANGLE',\n PATH_ROUNDED_RECTANGLE: 'PATH_ROUNDED_RECTANGLE',\n ICON: 'ICON',\n LABEL: 'LABEL',\n MARKER: 'MARKER'\n};\n// edge shape\nexport const EDGE_TYPE = {\n SPLINE_CURVE: 'SPLINE_CURVE',\n LINE: 'LINE',\n PATH: 'PATH'\n};\n// decorators on edges\nexport const EDGE_DECORATOR_TYPE = {\n LABEL: 'EDGE_LABEL',\n FLOW: 'FLOW'\n};\n// the status of the layout\nexport const LAYOUT_STATE = {\n INIT: 'INIT',\n START: 'START',\n CALCULATING: 'CALCULATING',\n DONE: 'DONE',\n ERROR: 'ERROR'\n};\n", "// deck.gl-community\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\nimport { NODE_STATE } from './constants';\n// Basic data structure of a node\nexport class Node {\n id;\n /** Keep a reference to origin data. */\n _data;\n /** List edges. */\n _connectedEdges = {};\n /** Interaction state of the node. */\n state = NODE_STATE.DEFAULT;\n /** Can the node be selected? */\n _selectable;\n /** Should the state of this node affect the state of the connected edges? */\n _highlightConnectedEdges;\n /** Check the type of the object when picking engine gets it. */\n isNode = true;\n /**\n * The constructor of a node\n * @param {String|Number} options.id - the unique ID of the node\n * @param {Record<string, unknown>} options.data - origin data reference\n */\n constructor({ id, selectable = false, highlightConnectedEdges = false, data = {} }) {\n this.id = id;\n this._data = data;\n this._selectable = selectable;\n this._highlightConnectedEdges = highlightConnectedEdges;\n }\n /**\n * Return the ID of the node\n * @return {String|Number} - the ID of the node.\n */\n getId() {\n return this.id;\n }\n /**\n * Return the degree of the node -- includes in-degree and out-degree\n * @return {Number} - the degree of the node.\n */\n getDegree() {\n return Object.keys(this._connectedEdges).length;\n }\n /**\n * Return the in-degree of the node.\n * @return {Number} - the in-degree of the node.\n */\n getInDegree() {\n const nodeId = this.getId();\n return this.getConnectedEdges().reduce((count, e) => {\n const isDirected = e.isDirected();\n if (isDirected && e.getTargetNodeId() === nodeId) {\n count += 1;\n }\n return count;\n }, 0);\n }\n /**\n * Return the out-degree of the node.\n * @return {Number} - the out-degree of the node.\n */\n getOutDegree() {\n const nodeId = this.getId();\n return this.getConnectedEdges().reduce((count, e) => {\n const isDirected = e.isDirected();\n if (isDirected && e.getSourceNodeId() === nodeId) {\n count += 1;\n }\n return count;\n }, 0);\n }\n /**\n * Return all the IDs of the sibling nodes.\n * @return {String[]} [description]\n */\n getSiblingIds() {\n const nodeId = this.getId();\n return this.getConnectedEdges().reduce((siblings, e) => {\n if (e.getTargetNodeId() === nodeId) {\n siblings.push(e.getSourceNodeId());\n }\n else {\n siblings.push(e.getTargetNodeId());\n }\n return siblings;\n }, []);\n }\n /**\n * Return all the connected edges.\n * @return {Object[]} - an array of the connected edges.\n */\n getConnectedEdges() {\n return Object.values(this._connectedEdges);\n }\n /**\n * Return of the value of the selected property key.\n * @param {String} key - property key.\n * @return {Any} - the value of the property or undefined (not found).\n */\n getPropertyValue(key) {\n // try to search the key within this object\n if (this.hasOwnProperty(key)) {\n return this[key];\n }\n // try to search the key in the original data reference\n else if (this._data.hasOwnProperty(key)) {\n return this._data[key];\n }\n // otherwise, not found\n return undefined;\n }\n /**\n * Set the new node data.\n * @param {Record<string, unknown>} data - the new data of the node\n */\n setData(data) {\n this._data = data;\n }\n /**\n * Update a data property.\n * @param {String} key - the key of the property\n * @param {Any} value - the value of the property.\n */\n setDataProperty(key, value) {\n this._data[key] = value;\n }\n /**\n * Set node state\n * @param {String} state - one of NODE_STATE\n */\n setState(state) {\n this.state = state;\n }\n /**\n * Get node state\n * @returns {string} state - one of NODE_STATE\n */\n getState() {\n return this.state;\n }\n /**\n * Add connected edges to the node\n * @param {Edge || Edge[]} edge an edge or an array of edges to be added to this._connectedEdges\n */\n addConnectedEdges(edge) {\n const iterableEdges = Array.isArray(edge) ? edge : [edge];\n iterableEdges.forEach((e) => {\n this._connectedEdges[e.id] = e;\n e.addNode(this);\n });\n }\n /**\n * Remove edges from this._connectedEdges\n * @param {Edge | Edge[]} edge an edge or an array of edges to be removed from this._connectedEdges\n */\n removeConnectedEdges(edge) {\n const iterableEdges = Array.isArray(edge) ? edge : [edge];\n iterableEdges.forEach((e) => {\n e.removeNode(this);\n delete this._connectedEdges[e.id];\n });\n }\n /**\n * Clear this._connectedEdges\n */\n clearConnectedEdges() {\n Object.values(this._connectedEdges).forEach((e) => e.removeNode(this));\n this._connectedEdges = {};\n }\n isSelectable() {\n return this._selectable;\n }\n shouldHighlightConnectedEdges() {\n return this._highlightConnectedEdges;\n }\n}\n", "// deck.gl-community\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n// Basic data structure of an edge\nimport { EDGE_STATE } from './constants';\nexport class Edge {\n /** Unique uuid of the edge. */\n id;\n /** ID of the source node. */\n _sourceId;\n /** ID of the target node. */\n _targetId;\n /** Whether the edge is directed or not. */\n _directed;\n /** Origin data reference of the edge. */\n _data;\n /** Check the type of the object when picking engine gets it. */\n isEdge = true;\n /** Nodes at either end of this edge. */\n _connectedNodes = {};\n /** Edge state. */\n state = EDGE_STATE.DEFAULT;\n /**\n * The constructor\n * @param {String|Number} options.id - the unique ID of the edge\n * @param {String|Number} options.sourceId - the ID of the source node\n * @param {String|Number} options.targetId - the ID of the target node\n * @param {Boolean} options.directed - whether the edge is directed or not\n * @param {Record<string, unknown>} options.data - origin data reference\n */\n constructor({ id, sourceId, targetId, data, directed = false }) {\n this.id = id;\n this._sourceId = sourceId;\n this._targetId = targetId;\n this._directed = directed;\n this._data = data;\n }\n /**\n * Return the ID of the edge\n * @return {String|Number} - the ID of the edge.\n */\n getId() {\n return this.id;\n }\n /**\n * Return whether the edge is directed or not.\n * @return {Boolean} true if the edge is directed.\n */\n isDirected() {\n return this._directed;\n }\n /**\n * Get the ID of the source node.\n * @return {String|Number} the ID of the source node.\n */\n getSourceNodeId() {\n return this._sourceId;\n }\n /**\n * Get the ID of the target node.\n * @return {String|Number} the ID of the target node.\n */\n getTargetNodeId() {\n return this._targetId;\n }\n /**\n * Return of the value of the selected property key.\n * @param {String} key - property key.\n * @return {Any} - the value of the property.\n */\n getPropertyValue(key) {\n // try to search the key within this object\n if (this.hasOwnProperty(key)) {\n return this[key];\n }\n // try to search the key in the original data reference\n else if (this._data.hasOwnProperty(key)) {\n return this._data[key];\n }\n // otherwise, not found\n return undefined;\n }\n /**\n * Set the origin data as a reference.\n * @param {Object} data - the origin data.\n */\n setData(data) {\n this._data = data;\n }\n /**\n * Update a data property.\n * @param {String} key - the key of the property\n * @param {Any} value - the value of the property.\n */\n setDataProperty(key, value) {\n this._data[key] = value;\n }\n /**\n * Set edge state\n * @param {String} state - one of EDGE_STATE\n */\n setState(state) {\n this.state = state;\n }\n /**\n * Get edge state\n * @returns {string} state - one of EDGE_STATE\n */\n getState() {\n return this.state;\n }\n addNode(node) {\n this._connectedNodes[node.getId()] = node;\n }\n removeNode(node) {\n delete this._connectedNodes[node.getId()];\n }\n getConnectedNodes() {\n return Object.values(this._connectedNodes);\n }\n}\n", "// deck.gl-community\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\nimport isEqual from 'lodash.isequal';\nimport { EDGE_TYPE, LAYOUT_STATE } from './constants';\n/**\n * All the layout classes are extended from this base layout class.\n */\nexport class BaseLayout extends EventTarget {\n /** Name of the layout. */\n _name = 'BaseLayout';\n /** Extra configuration options of the layout. */\n _options;\n version = 0;\n state = LAYOUT_STATE.INIT;\n /**\n * Constructor of BaseLayout\n * @param {Object} options extra configuration options of the layout\n */\n constructor(options = {}) {\n super();\n this._options = options;\n }\n /**\n * @fires BaseLayout#onLayoutStart\n * @protected\n */\n _onLayoutStart() {\n this._updateState(LAYOUT_STATE.CALCULATING);\n /**\n * Layout calculation start.\n *\n * @event BaseLayout#onLayoutChange\n * @type {CustomEvent}\n */\n this.dispatchEvent(new CustomEvent('onLayoutStart'));\n }\n /**\n * @fires BaseLayout#onLayoutChange\n * @protected\n */\n _onLayoutChange() {\n this._updateState(LAYOUT_STATE.CALCULATING);\n /**\n * Layout calculation iteration.\n *\n * @event BaseLayout#onLayoutChange\n * @type {CustomEvent}\n */\n this.dispatchEvent(new CustomEvent('onLayoutChange'));\n }\n /**\n * @fires BaseLayout#onLayoutDone\n * @protected\n */\n _onLayoutDone() {\n this._updateState(LAYOUT_STATE.DONE);\n /**\n * Layout calculation is done.\n *\n * @event BaseLayout#onLayoutDone\n * @type {CustomEvent}\n */\n this.dispatchEvent(new CustomEvent('onLayoutDone'));\n }\n /**\n * @fires BaseLayout#onLayoutError\n * @protected\n */\n _onLayoutError() {\n this._updateState(LAYOUT_STATE.ERROR);\n /**\n * Layout calculation went wrong.\n *\n * @event BaseLayout#onLayoutError\n * @type {CustomEvent}\n */\n this.dispatchEvent(new CustomEvent('onLayoutError'));\n }\n /**\n * Check the equality of two layouts\n * @param {Object} layout The layout to be compared.\n * @return {Bool} True if the layout is the same as itself.\n */\n equals(layout) {\n if (!layout || !(layout instanceof BaseLayout)) {\n return false;\n }\n return this._name === layout._name && isEqual(this._options, layout._options);\n }\n /** virtual functions: will be implemented in the child class */\n // first time to pass the graph data into this layout\n initializeGraph(graph) { }\n // update the existing graph\n updateGraph(graph) { }\n // start the layout calculation\n start() { }\n // update the layout calculation\n update() { }\n // resume the layout calculation\n resume() { }\n // stop the layout calculation\n stop() { }\n // access the position of the node in the layout\n getNodePosition(node) {\n return [0, 0];\n }\n // access the layout information of the edge\n getEdgePosition(edge) {\n return {\n type: EDGE_TYPE.LINE,\n sourcePosition: [0, 0],\n targetPosition: [0, 0],\n controlPoints: []\n };\n }\n /**\n * Pin the node to a designated position, and the node won't move anymore\n * @param {Object} node Node to be locked\n * @param {Number} x x coordinate\n * @param {Number} y y coordinate\n */\n lockNodePosition(node, x, y) { }\n /**\n * Unlock the node, the node will be able to move freely.\n * @param {Object} node Node to be unlocked\n */\n unlockNodePosition(node) { }\n _updateState(state) {\n this.state = state;\n this.version += 1;\n }\n}\n", "// deck.gl-community\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\nimport { BaseLayout } from '../../core/base-layout';\nimport { EDGE_TYPE } from '../../core/constants';\nconst defaultOptions = {\n alpha: 0.3,\n resumeAlpha: 0.1,\n nBodyStrength: -900,\n nBodyDistanceMin: 100,\n nBodyDistanceMax: 400,\n getCollisionRadius: 0\n};\nexport class D3ForceLayout extends BaseLayout {\n _name = 'D3';\n _positionsByNodeId = new Map();\n _graph;\n _worker;\n constructor(options) {\n super(options);\n this._options = {\n ...defaultOptions,\n ...options\n };\n }\n initializeGraph(graph) {\n this._graph = graph;\n }\n // for streaming new data on the same graph\n updateGraph(graph) {\n this._graph = graph;\n this._positionsByNodeId = new Map(this._graph.getNodes().map((node) => [node.id, this._positionsByNodeId.get(node.id)]));\n }\n start() {\n this._engageWorker();\n this._onLayoutStart();\n }\n update() {\n this._engageWorker();\n }\n _engageWorker() {\n // prevent multiple start\n if (this._worker) {\n this._worker.terminate();\n }\n this._worker = new Worker(new URL('./worker.js', import.meta.url).href);\n this._worker.postMessage({\n nodes: this._graph.getNodes().map((node) => ({\n id: node.id,\n ...this._positionsByNodeId.get(node.id)\n })),\n edges: this._graph.getEdges().map((edge) => ({\n id: edge.id,\n source: edge.getSourceNodeId(),\n target: edge.getTargetNodeId()\n })),\n options: this._options\n });\n this._worker.onmessage = (event) => {\n if (event.data.type !== 'end') {\n return;\n }\n event.data.nodes.forEach(({ id, ...d3 }) => this._positionsByNodeId.set(id, {\n ...d3,\n // precompute so that when we return the node position we do not need to do the conversion\n coordinates: [d3.x, d3.y]\n }));\n this._onLayoutChange();\n this._onLayoutDone();\n };\n }\n resume() {\n throw new Error('Resume unavailable');\n }\n stop() {\n this._worker.terminate();\n }\n getEdgePosition = (edge) => {\n const sourceNode = this._graph.findNode(edge.getSourceNodeId());\n const targetNode = this._graph.findNode(edge.getTargetNodeId());\n if (!this.getNodePosition(sourceNode) || !this.getNodePosition(targetNode)) {\n return null;\n }\n return {\n type: EDGE_TYPE.LINE,\n sourcePosition: this.getNodePosition(sourceNode),\n targetPosition: this.getNodePosition(targetNode),\n controlPoints: []\n };\n };\n getNodePosition = (node) => {\n const d3Node = this._positionsByNodeId.get(node.id);\n if (d3Node) {\n return d3Node.coordinates;\n }\n return null;\n };\n lockNodePosition = (node, x, y) => {\n const d3Node = this._positionsByNodeId.get(node.id);\n this._positionsByNodeId.set(node.id, {\n ...d3Node,\n x,\n y,\n fx: x,\n fy: y,\n coordinates: [x, y]\n });\n this._onLayoutChange();\n this._onLayoutDone();\n };\n unlockNodePosition = (node) => {\n const d3Node = this._positionsByNodeId.get(node.id);\n d3Node.fx = null;\n d3Node.fy = null;\n };\n}\n", "// deck.gl-community\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\nimport { BaseLayout } from '../../core/base-layout';\nimport { EDGE_TYPE } from '../../core/constants';\nconst defaultOptions = {\n alpha: 0.3,\n resumeAlpha: 0.1,\n nBodyStrength: -900,\n nBodyDistanceMin: 100,\n nBodyDistanceMax: 400,\n getCollisionRadius: 0\n};\n// TODO: this layout should be updated with the organizational and logic improvements made in d3-force\nexport class GPUForceLayout extends BaseLayout {\n _name = 'GPU';\n _d3Graph;\n _nodeMap;\n _edgeMap;\n _graph;\n _worker;\n _callbacks;\n constructor(options) {\n super(options);\n this._name = 'GPU';\n this._options = {\n ...defaultOptions,\n ...options\n };\n // store graph and prepare internal data\n this._d3Graph = { nodes: [], edges: [] };\n this._nodeMap = {};\n this._edgeMap = {};\n }\n initializeGraph(graph) {\n this._graph = graph;\n this._nodeMap = {};\n this._edgeMap = {};\n // nodes\n const d3Nodes = graph.getNodes().map((node) => {\n const id = node.id;\n const locked = node.getPropertyValue('locked') || false;\n const x = node.getPropertyValue('x') || 0;\n const y = node.getPropertyValue('y') || 0;\n const collisionRadius = node.getPropertyValue('collisionRadius') || 0;\n const d3Node = {\n id,\n x,\n y,\n fx: locked ? x : null,\n fy: locked ? y : null,\n collisionRadius,\n locked\n };\n this._nodeMap[node.id] = d3Node;\n return d3Node;\n });\n // edges\n const d3Edges = graph.getEdges().map((edge) => {\n const d3Edge = {\n id: edge.id,\n source: this._nodeMap[edge.getSourceNodeId()],\n target: this._nodeMap[edge.getTargetNodeId()]\n };\n this._edgeMap[edge.id] = d3Edge;\n return d3Edge;\n });\n this._d3Graph = {\n nodes: d3Nodes,\n edges: d3Edges\n };\n }\n start() {\n this._engageWorker();\n }\n update() {\n this._engageWorker();\n }\n _engageWorker() {\n // prevent multiple start\n if (this._worker) {\n this._worker.terminate();\n }\n this._worker = new Worker(new URL('./worker.js', import.meta.url).href);\n const { alpha, nBodyStrength, nBodyDistanceMin, nBodyDistanceMax, getCollisionRadius } = this\n ._options;\n this._worker.postMessage({\n nodes: this._d3Graph.nodes,\n edges: this._d3Graph.edges,\n options: {\n alpha,\n nBodyStrength,\n nBodyDistanceMin,\n nBodyDistanceMax,\n getCollisionRadius\n }\n });\n this._worker.onmessage = (event) => {\n switch (event.data.type) {\n case 'tick':\n this.ticked(event.data);\n break;\n case 'end':\n this.ended(event.data);\n break;\n default:\n break;\n }\n };\n }\n ticked(data) { }\n ended(data) {\n const { nodes, edges } = data;\n this.updateD3Graph({ nodes, edges });\n this._onLayoutChange();\n this._onLayoutDone();\n }\n resume() {\n throw new Error('Resume unavailable');\n }\n stop() {\n this._worker.terminate();\n }\n // for steaming new data on the same graph\n updateGraph(graph) {\n if (this._graph.getGraphName() !== graph.getGraphName()) {\n // reset the maps\n this._nodeMap = {};\n this._edgeMap = {};\n }\n this._graph = graph;\n // update internal layout data\n // nodes\n const newNodeMap = {};\n const newD3Nodes = graph.getNodes().map((node) => {\n const id = node.id;\n const locked = node.getPropertyValue('locked') || false;\n const x = node.getPropertyValue('x') || 0;\n const y = node.getPropertyValue('y') || 0;\n const fx = locked ? x : null;\n const fy = locked ? y : null;\n const collisionRadius = node.getPropertyValue('collisionRadius') || 0;\n const oldD3Node = this._nodeMap[node.id];\n const newD3Node = oldD3Node ? oldD3Node : { id, x, y, fx, fy, collisionRadius };\n newNodeMap[node.id] = newD3Node;\n return newD3Node;\n });\n this._nodeMap = newNodeMap;\n this._d3Graph.nodes = newD3Nodes;\n // edges\n const newEdgeMap = {};\n const newD3Edges = graph.getEdges().map((edge) => {\n const oldD3Edge = this._edgeMap[edge.id];\n const newD3Edge = oldD3Edge || {\n id: edge.id,\n source: newNodeMap[edge.getSourceNodeId()],\n target: newNodeMap[edge.getTargetNodeId()]\n };\n newEdgeMap[edge.id] = newD3Edge;\n return newD3Edge;\n });\n this._edgeMap = newEdgeMap;\n this._d3Graph.edges = newD3Edges;\n }\n updateD3Graph(graph) {\n const existingNodes = this._graph.getNodes();\n // update internal layout data\n // nodes\n const newNodeMap = {};\n const newD3Nodes = graph.nodes.map((node) => {\n // Update existing _graph with the new values\n const existingNode = existingNodes.find((n) => n.getId() === node.id);\n existingNode.setDataProperty('locked', node.locked);\n existingNode.setDataProperty('x', node.x);\n existingNode.setDataProperty('y', node.y);\n existingNode.setDataProperty('collisionRadius', node.collisionRadius);\n newNodeMap[node.id] = node;\n return node;\n });\n this._nodeMap = newNodeMap;\n this._d3Graph.nodes = newD3Nodes;\n // edges\n const newEdgeMap = {};\n const newD3Edges = graph.edges.map((edge) => {\n newEdgeMap[edge.id] = edge;\n return edge;\n });\n this._graph.triggerUpdate();\n this._edgeMap = newEdgeMap;\n this._d3Graph.edges = newD3Edges;\n }\n getNodePosition = (node) => {\n const d3Node = this._nodeMap[node.id];\n if (d3Node) {\n return [d3Node.x, d3Node.y];\n }\n return [0, 0];\n };\n getEdgePosition = (edge) => {\n const d3Edge = this._edgeMap[edge.id];\n const sourcePosition = d3Edge && d3Edge.source;\n const targetPosition = d3Edge && d3Edge.target;\n if (d3Edge && sourcePosition && targetPosition) {\n return {\n type: EDGE_TYPE.LINE,\n sourcePosition: [sourcePosition.x, sourcePosition.y],\n targetPosition: [targetPosition.x, targetPosition.y],\n controlPoints: []\n };\n }\n return {\n type: EDGE_TYPE.LINE,\n sourcePosition: [0, 0],\n targetPosition: [0, 0],\n controlPoints: []\n };\n };\n lockNodePosition = (node, x, y) => {\n const d3Node = this._nodeMap[node.id];\n d3Node.x = x;\n d3Node.y = y;\n d3Node.fx = x;\n d3Node.fy = y;\n this._callbacks.onLayoutChange();\n this._callbacks.onLayoutDone();\n };\n unlockNodePosition = (node) => {\n const d3Node = this._nodeMap[node.id];\n d3Node.fx = null;\n d3Node.fy = null;\n };\n}\n", "// deck.gl-community\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\nimport { BaseLayout } from '../../core/base-layout';\nimport { EDGE_TYPE } from '../../core/constants';\nconst defaultOptions = {\n nodePositionAccessor: (node) => [node.getPropertyValue('x'), node.getPropertyValue('y')]\n};\nexport class SimpleLayout extends BaseLayout {\n _name = 'SimpleLayout';\n _graph = null;\n _nodeMap = {};\n _nodePositionMap = {};\n constructor(options = {}) {\n super({ ...defaultOptions, ...options });\n }\n initializeGraph(graph) {\n this.updateGraph(graph);\n }\n _notifyLayoutComplete() {\n this._onLayoutStart();\n this._onLayoutChange();\n this._onLayoutDone();\n }\n start() {\n this._notifyLayoutComplete();\n }\n update() {\n this._notifyLayoutComplete();\n }\n resume() {\n this._notifyLayoutComplete();\n }\n updateGraph(graph) {\n this._graph = graph;\n this._nodeMap = graph.getNodes().reduce((res, node) => {\n res[node.getId()] = node;\n return res;\n }, {});\n this._nodePositionMap = graph.getNodes().reduce((res, node) => {\n res[node.getId()] = this._options.nodePositionAccessor(node);\n return res;\n }, {});\n }\n setNodePositionAccessor = (accessor) => {\n this._options.nodePositionAccessor = accessor;\n };\n getNodePosition = (node) => this._nodePositionMap[node.getId()];\n getEdgePosition = (edge) => {\n const sourcePos = this._nodePositionMap[edge.getSourceNodeId()];\n const targetPos = this._nodePositionMap[edge.getTargetNodeId()];\n return {\n type: EDGE_TYPE.LINE,\n sourcePosition: sourcePos,\n targetPosition: targetPos,\n controlPoints: []\n };\n };\n lockNodePosition = (node, x, y) => {\n this._nodePositionMap[node.getId()] = [x, y];\n this._onLayoutChange();\n this._onLayoutDone();\n };\n}\n", "// deck.gl-community\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\nimport { Edge } from '../core/edge';\nimport { Node } from '../core/node';\nimport { Graph } from '../core/graph';\nexport function createGraph({ name, nodes, edges, nodeParser, edgeParser }) {\n // create a new empty graph\n const graph = new Graph();\n const graphName = name || Date.now();\n graph.setGraphName(graphName);\n // add nodes\n const glNodes = nodes.map((node) => {\n const { id } = nodeParser(node);\n return new Node({\n id,\n data: node\n });\n });\n graph.batchAddNodes(glNodes);\n const glEdges = edges.map((edge) => {\n const { id, sourceId, targetId, directed } = edgeParser(edge);\n return new Edge({\n id,\n sourceId,\n targetId,\n directed,\n data: edge\n });\n });\n graph.batchAddEdges(glEdges);\n return graph;\n}\n", "// deck.gl-community\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\nimport { log } from '../utils/log';\nexport function basicNodeParser(node) {\n if (node.id === undefined) {\n log.error('Invalid node: id is missing.')();\n return null;\n }\n return { id: node.id };\n}\n", "// deck.gl-community\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\nimport { log } from '../utils/log';\nexport function basicEdgeParser(edge) {\n const { id, directed, sourceId, targetId } = edge;\n if (sourceId === undefined || targetId === undefined) {\n log.error('Invalid edge: sourceId or targetId is missing.')();\n return null;\n }\n return {\n id,\n directed: directed || false,\n sourceId,\n targetId\n };\n}\n", "// deck.gl-community\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\nimport { createGraph } from '../utils/create-graph';\nimport { basicNodeParser } from './node-parsers';\nimport { basicEdgeParser } from './edge-parsers';\nimport { log } from '../utils/log';\nexport const JSONLoader = ({ json, nodeParser = basicNodeParser, edgeParser = basicEdgeParser }) => {\n const { name = 'default', nodes, edges } = json;\n if (!nodes) {\n log.error('Invalid graph: nodes is missing.')();\n return null;\n }\n const graph = createGraph({ name, nodes, edges, nodeParser, edgeParser });\n return graph;\n};\n", "// deck.gl-community\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\nexport const mixedGetPosition = (getPosition, getOffset) => {\n if (!getOffset) {\n return getPosition;\n }\n if (typeof getOffset === 'function') {\n return (d) => {\n const [x, y] = getPosition(d);\n const [offX, offY] = getOffset(d);\n return [x + offX, y + offY];\n };\n }\n const [offX, offY] = getOffset;\n return (d) => {\n const [x, y] = getPosition(d);\n return [x + offX, y + offY];\n };\n};\n", "// deck.gl-community\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\nimport { COORDINATE_SYSTEM, CompositeLayer } from '@deck.gl/core';\nimport { Stylesheet } from '../style/style-sheet';\nimport { NODE_TYPE, EDGE_DECORATOR_TYPE } from '../core/constants';\nimport { mixedGetPosition } from '../utils/layer-utils';\nimport { InteractionManager } from '../core/interaction-manager';\nimport { log } from '../utils/log';\n// node layers\nimport { CircleLayer } from './node-layers/circle-layer';\nimport { ImageLayer } from './node-layers/image-layer';\nimport { LabelLayer } from './node-layers/label-layer';\nimport { RectangleLayer } from './node-layers/rectangle-layer';\nimport { RoundedRectangleLayer } from './node-layers/rounded-rectangle-layer';\nimport { PathBasedRoundedRectangleLayer } from './node-layers/path-rounded-rectange-layer';\nimport { ZoomableMarkerLayer } from './node-layers/zoomable-marker-layer';\n// edge layers\nimport { EdgeLayer } from './edge-layer';\nimport { EdgeLabelLayer } from './edge-layers/edge-label-layer';\nimport { FlowLayer } from './edge-layers/flow-layer';\nconst NODE_LAYER_MAP = {\n [NODE_TYPE.RECTANGLE]: RectangleLayer,\n [NODE_TYPE.ROUNDED_RECTANGLE]: RoundedRectangleLayer,\n [NODE_TYPE.PATH_ROUNDED_RECTANGLE]: PathBasedRoundedRectangleLayer,\n [NODE_TYPE.ICON]: ImageLayer,\n [NODE_TYPE.CIRCLE]: CircleLayer,\n [NODE_TYPE.LABEL]: LabelLayer,\n [NODE_TYPE.MARKER]: ZoomableMarkerLayer\n};\nconst EDGE_DECORATOR_LAYER_MAP = {\n [EDGE_DECORATOR_TYPE.LABEL]: EdgeLabelLayer,\n [EDGE_DECORATOR_TYPE.FLOW]: FlowLayer\n};\nconst SHARED_LAYER_PROPS = {\n coordinateSystem: COORDINATE_SYSTEM.CARTESIAN,\n parameters: {\n depthTest: false\n }\n};\nconst defaultProps = {\n // an array of styles for layers\n nodeStyle: [],\n nodeEvents: {\n onMouseLeave: () => { },\n onHover: () => { },\n onMouseEnter: () => { },\n onClick: () => { },\n onDrag: () => { }\n },\n edgeStyle: {\n color: 'black',\n strokeWidth: 1,\n // an array of styles for layers\n decorators: []\n },\n edgeEvents: {\n onClick: () => { },\n onHover: () => { }\n },\n enableDragging: false\n};\nexport class GraphLayer extends CompositeLayer {\n static defaultProps = {\n pickable: true\n };\n forceUpdate = () => {\n if (this.context && this.context.layerManager) {\n this.setNeedsUpdate();\n this.setChangeFlags({ dataChanged: true }); // TODO\n }\n };\n constructor(props) {\n super(props);\n // added or removed a node, or in general something layout related changed\n props.engine.addEventListener('onLayoutChange', this.forceUpdate);\n }\n initializeState() {\n const interactionManager = new InteractionManager(this.props, () => this.forceUpdate());\n this.state = { interactionManager };\n }\n shouldUpdateState({ changeFlags }) {\n return changeFlags.dataChanged || changeFlags.propsChanged;\n }\n updateState({ props }) {\n this.state.interactionManager.updateProps(props);\n }\n finalize() {\n this.props.engine.removeEventListener('onLayoutChange', this.forceUpdate);\n }\n createNodeLayers() {\n const { engine, nodeStyle } = this.props;\n if (!nodeStyle || !Array.isArray(nodeStyle) || nodeStyle.length === 0) {\n return [];\n }\n return nodeStyle.filter(Boolean).map((style, idx) => {\n const { pickable = true, visible = true, data = (nodes) => nodes, ...restStyle } = style;\n const LayerType = NODE_LAYER_MAP[style.type];\n if (!LayerType) {\n log.error(`Invalid node type: ${style.type}`)();\n throw new Error(`Invalid node type: ${style.type}`);\n }\n const stylesheet = new Stylesheet(restStyle, {\n stateUpdateTrigger: this.state.interactionManager.getLastInteraction()\n });\n const getOffset = stylesheet.getDeckGLAccessor('getOffset');\n return new LayerType({\n ...SHARED_LAYER_PROPS,\n id: `node-rule-${idx}`,\n data: data(engine.getNodes()),\n getPosition: mixedGetPosition(engine.getNodePosition, getOffset),\n pickable,\n positionUpdateTrigger: [\n engine.getLayoutLastUpdate(),\n engine.getLayoutState(),\n stylesheet.getDeckGLAccessorUpdateTrigger('getOffset')\n ].join(),\n stylesheet,\n visible\n });\n });\n }\n createEdgeLayers() {\n const { edgeStyle, engine } = this.props;\n if (!edgeStyle) {\n return [];\n }\n return (Array.isArray(edgeStyle) ? edgeStyle : [edgeStyle])\n .filter(Boolean)\n .flatMap((style, idx) => {\n const { decorators, data = (edges) => edges, visible = true, ...restEdgeStyle } = style;\n const stylesheet = new Stylesheet({\n type: 'Edge',\n ...restEdgeStyle\n }, {\n stateUpdateTrigger: this.state.interactionManager.getLastInteraction()\n });\n const edgeLayer = new EdgeLayer({\n ...SHARED_LAYER_PROPS,\n id: `edge-layer-${idx}`,\n data: data(engine.getEdges()),\n getLayoutInfo: engine.getEdgePosition,\n pickable: true,\n positionUpdateTrigger: [engine.getLayoutLastUpdate(), engine.getLayoutState()].join(),\n stylesheet,\n visible\n });\n if (!decorators || !Array.isArray(decorators) || decorators.length === 0) {\n return edgeLayer;\n }\n const decoratorLayers = decorators.filter(Boolean).flatMap((decoratorStyle, idx2) => {\n const DecoratorLayer = EDGE_DECORATOR_LAYER_MAP[decoratorStyle.type];\n if (!DecoratorLayer) {\n log.error(`Invalid edge decorator type: ${decoratorStyle.type}`)();\n throw new Error(`Invalid edge decorator type: ${decoratorStyle.type}`);\n }\n const decoratorStylesheet = new Stylesheet(decoratorStyle, {\n stateUpdateTrigger: this.state.interactionManager.getLastInteraction()\n });\n return new DecoratorLayer({\n ...SHARED_LAYER_PROPS,\n id: `edge-decorator-${idx2}`,\n data: data(engine.getEdges()),\n getLayoutInfo: engine.getEdgePosition,\n pickable: true,\n positionUpdateTrigger: [engine.getLayoutLastUpdate(), engine.getLayoutState()].join(),\n stylesheet: decoratorStylesheet\n });\n });\n return [edgeLayer, decoratorLayers];\n });\n }\n onClick(info, event) {\n return this.state.interactionManager.onClick(info, event) || false;\n }\n onHover(info, event) {\n return this.state.interactionManager.onHover(info, event) || false;\n }\n onDragStart(info, event) {\n this.state.interactionManager.onDragStart(info, event);\n }\n onDrag(info, event) {\n this.state.interactionManager.onDrag(info, event);\n }\n onDragEnd(info, event) {\n this.state.interactionManager.onDragEnd(info, event);\n }\n renderLayers() {\n return [this.createEdgeLayers(), this.createNodeLayers()];\n }\n}\nGraphLayer.layerName = 'GraphLayer';\nGraphLayer.defaultProps = defaultProps;\n", "// deck.gl-community\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\nimport Color from 'color';\nimport { log } from '../utils/log';\n/* Utils for type check */\nfunction getColor(value) {\n if (typeof value === 'string') {\n try {\n const color = Color.rgb(value).array();\n if (Number.isFinite(color[3])) {\n color[3] *= 255;\n }\n return color;\n }\n catch (error) {\n return [0, 0, 0];\n }\n }\n if (Array.isArray(value) && Number.isFinite(value[0])) {\n return value;\n }\n return [0, 0, 0];\n}\nfunction getNumber(value) {\n switch (typeof value) {\n case 'string':\n value = Number(value);\n return isNaN(value) ? null : value;\n case 'number':\n return value;\n default:\n return null;\n }\n}\nfunction getBool(value) {\n switch (typeof value) {\n case 'boolean':\n return value;\n case 'string':\n return value.toLowerCase() !== 'false';\n case 'number':\n return Boolean(value);\n default:\n return null;\n }\n}\nfunction getOffset(value) {\n if (typeof value === 'function') {\n return value;\n }\n if (!Array.isArray(value) || value.length !== 2) {\n return null;\n }\n return value.map(getNumber);\n}\nconst IDENTITY = (x) => x;\nconst PROPERTY_FORMATTERS = {\n opacity: getNumber,\n zIndex: getNumber,\n width: getNumber,\n height: getNumber,\n radius: getNumber,\n fill: getColor,\n stroke: getColor,\n strokeWidth: getNumber,\n // for marker\n marker: String,\n size: getNumber,\n // text\n color: getColor,\n text: String,\n fontSize: getNumber,\n textAnchor: String,\n alignmentBaseline: String,\n angle: getNumber,\n textMaxWidth: getNumber,\n textWordBreak: String,\n textSizeMinPixels: getNumber,\n // edges\n speed: getNumber,\n tailLength: getNumber,\n offset: getOffset,\n scaleWithZoom: getBool\n};\nconst DEFAULT_STYLES = {\n opacity: 1,\n zIndex: 0,\n width: 0,\n height: 0,\n radius: 1,\n fill: [0, 0, 0],\n stroke: [0, 0, 0],\n strokeWidth: 0,\n marker: 'circle',\n size: 12,\n color: [0, 0, 0],\n text: '',\n fontSize: 12,\n textAnchor: 'middle',\n alignmentBaseline: 'center',\n angle: 0,\n textMaxWidth: -1,\n textWordBreak: 'break-all',\n textSizeMinPixels: 9,\n speed: 0,\n tailLength: 1,\n offset: null,\n scaleWithZoom: true\n};\n// code generation: generate a function as a layer accessor\nfunction generateAccessor(key, value) {\n const formatter = PROPERTY_FORMATTERS[key] || IDENTITY;\n // ex: key = 'fill', value = {defaut: 'red', hover: 'blue'}\n // valueMap => {defaut: [255, 0, 0], hover: [0, 0, 255]}\n const valueMap = Object.keys(value).reduce((res, key0) => {\n res[key0] = value[key0];\n return res;\n }, {});\n return (node) => {\n const statefulValue = valueMap[node.state];\n if (!node.state || typeof statefulValue === 'undefined') {\n return valueMap.default || DEFAULT_STYLES[key];\n }\n // else has stateful value\n // check if the value is a function\n if (typeof statefulValue === 'function') {\n return formatter(statefulValue(node));\n }\n // or just a plain value\n return formatter(statefulValue);\n };\n}\nconst VALUE_TYPE = {\n ACCESSOR: 'ACCESSOR',\n PLAIN_VALUE: 'PLAIN_VALUE'\n};\nexport class StyleProperty {\n key;\n _updateTrigger;\n _value;\n _valueType;\n // for getting default style\n static getDefault(key) {\n return DEFAULT_STYLES[key];\n }\n // pass the key and value of the property\n // and format the value properly.\n constructor({ key, value, updateTrigger }) {\n this.key = key;\n this._updateTrigger = false;\n // statefule property, ex:\n // fill: {default: 'red', hover: 'blue'}\n // note that offset: [0, 1], the type of array is object, too.\n if (typeof value === 'object' && !Array.isArray(value)) {\n // generate accessor function\n this._value = generateAccessor(key, value);\n this._valueType = VALUE_TYPE.ACCESSOR;\n this._updateTrigger = updateTrigger;\n }\n // default state property, but value = accessor\n // fill: () => 'red'\n else if (typeof value === 'function') {\n const formatter = PROPERTY_FORMATTERS[key] || IDENTITY;\n // the output of the function should be formated by\n // the corresponding formatter again.\n // Ex: colorAccessor might return '#f00', which needs to\n // be formated as [255, 0, 0];\n this._value = (d) => formatter(value(d));\n this._valueType = VALUE_TYPE.ACCESSOR;\n this._updateTrigger = value;\n }\n // default state property with plain value:\n // fill: 'red'\n else {\n // format the value properly\n const formatter = PROPERTY_FORMATTERS[key] || IDENTITY;\n this._value = formatter(value);\n this._valueType = VALUE_TYPE.PLAIN_VALUE;\n this._updateTrigger = false;\n }\n // sanity check\n if (this._value === null) {\n log.warn(`Invalid ${key} value: ${value}`)();\n throw new Error(`Invalid ${key} value: ${value}`);\n }\n }\n // get the formatted value\n getValue() {\n return this._value;\n }\n getUpdateTrigger() {\n return this._updateTrigger;\n }\n}\n", "// deck.gl-community\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\nimport { StyleProperty } from './style-property';\nimport { NODE_TYPE, EDGE_DECORATOR_TYPE } from '../core/constants';\nimport { log } from '../utils/log';\nconst COMMON_DECKGL_PROPS = {\n getOffset: 'offset',\n opacity: 'opacity'\n};\nconst DECKGL_ACCESSOR_MAP = {\n [NODE_TYPE.CIRCLE]: {\n ...COMMON_DECKGL_PROPS,\n getFillColor: 'fill',\n getLineColor: 'stroke',\n getLineWidth: 'strokeWidth',\n getRadius: 'radius'\n },\n [NODE_TYPE.RECTANGLE]: {\n ...COMMON_DECKGL_PROPS,\n getWidth: 'width',\n getHeight: 'height',\n getFillColor: 'fill',\n getLineColor: 'stroke',\n getLineWidth: 'strokeWidth'\n },\n [NODE_TYPE.ROUNDED_RECTANGLE]: {\n ...COMMON_DECKGL_PROPS,\n getCornerRadius: 'cornerRadius',\n getRadius: 'radius',\n getWidth: 'width',\n getHeight: 'height',\n getFillColor: 'fill',\n getLineColor: 'stroke',\n getLineWidth: 'strokeWidth'\n },\n [NODE_TYPE.PATH_ROUNDED_RECTANGLE]: {\n ...COMMON_DECKGL_PROPS,\n getWidth: 'width',\n getHeight: 'height',\n getFillColor: 'fill',\n getLineColor: 'stroke',\n getLineWidth: 'strokeWidth',\n getCornerRadius: 'cornerRadius'\n },\n [NODE_TYPE.LABEL]: {\n ...COMMON_DECKGL_PROPS,\n getColor: 'color',\n getText: 'text',\n getSize: 'fontSize',\n getTextAnchor: 'textAnchor',\n getAlignmentBaseline: 'alignmentBaseline',\n getAngle: 'angle',\n scaleWithZoom: 'scaleWithZoom',\n textMaxWidth: 'textMaxWidth',\n textWordBreak: 'textWordBreak',\n textSizeMinPixels: 'textSizeMinPixels'\n },\n [NODE_TYPE.MARKER]: {\n ...COMMON_DECKGL_PROPS,\n getColor: 'fill',\n getSize: 'size',\n getMarker: 'marker',\n scaleWithZoom: 'scaleWithZoom'\n },\n // --------- Edge related ---------\n Edge: {\n getColor: 'stroke',\n getWidth: 'strokeWidth'\n },\n [EDGE_DECORATOR_TYPE.LABEL]: {\n getColor: 'color',\n getText: 'text',\n getSize: 'fontSize',\n getTextAnchor: 'textAnchor',\n getAlignmentBaseline: 'alignmentBaseline',\n scaleWithZoom: 'scaleWithZoom',\n textMaxWidth: 'textMaxWidth',\n textWordBreak: 'textWordBreak',\n textSizeMinPixels: 'textSizeMinPixels'\n },\n [EDGE_DECORATOR_TYPE.FLOW]: {\n getColor: 'color',\n getWidth: 'width',\n getSpeed: 'speed',\n getTailLength: 'tailLength'\n }\n};\nconst DECKGL_UPDATE_TRIGGERS = {\n [NODE_TYPE.CIRCLE]: ['getFillColor', 'getRadius', 'getLineColor', 'getLineWidth'],\n [NODE_TYPE.RECTANGLE]: ['getFillColor', 'getLineColor', 'getLineWidth'],\n [NODE_TYPE.ROUNDED_RECTANGLE]: [\n 'getFillColor',\n 'getLineColor',\n 'getLineWidth',\n 'getCornerRadius'\n ],\n [NODE_TYPE.PATH_ROUNDED_RECTANGLE]: [\n 'getFillColor',\n 'getLineColor',\n 'getLineWidth',\n 'getCornerRadius'\n ],\n [NODE_TYPE.LABEL]: [\n 'getColor',\n 'getText',\n 'getSize',\n 'getTextAnchor',\n 'getAlignmentBaseline',\n 'getAngle'\n ],\n [NODE_TYPE.MARKER]: ['getColor', 'getSize', 'getMarker'],\n Edge: ['getColor', 'getWidth'],\n [EDGE_DECORATOR_TYPE.LABEL]: [\n 'getColor',\n 'getText',\n 'getSize',\n 'getTextAnchor',\n 'getAlignmentBaseline'\n ],\n [EDGE_DECORATOR_TYPE.FLOW]: ['getColor', 'getWidth', 'getSpeed', 'getTailLength']\n};\nexport class Stylesheet {\n type;\n properties;\n constructor(style, updateTriggers) {\n const { type: layerType, ...restStyle } = style;\n if (!layerType || !(layerType in DECKGL_ACCESSOR_MAP)) {\n throw new Error(`illegal type: ${layerType}`);\n }\n this.type = layerType;\n // style = {\n // type: 'circle',\n // fill: 'red'\n // radius: 5,\n //\n // ':hover': {\n // fill: 'blue',\n // stroke: 'red'\n // }\n // };\n // step 1: extract 'rules': default, hover\n // default: {fill: 'red', radius: 5};\n // hover: {fill: 'blue', stroke: 'red'};\n const rules = Object.keys(restStyle).reduce((res, key) => {\n const isSelector = key.startsWith(':');\n if (isSelector) {\n const state = key.substring(1);\n res[state] = restStyle[key];\n return res;\n }\n res.default[key] = restStyle[key];\n return res;\n }, {\n default: {}\n });\n // step 2: extract all unique attributes from rules\n // attributes: ['fill', 'radius', 'stroke']\n const attributes = Object.values(rules).reduce((res, rule) => {\n const attrs = Object.keys(rule);\n const set = new Set([...res, ...attrs]);\n return Array.from(set);\n }, []);\n // step 3: create a attribute map as:\n // attrMap = {\n // fill: {default: 'red', hover: 'blue'},\n // radius: {default: 5},\n // stroke: {hover: 'red'},\n // }\n const attrMap = attributes.reduce((res, attr) => {\n res[attr] = Object.entries(rules).reduce((acc, entry) => {\n const [state, rule] = entry;\n if (typeof rule[attr] !== 'undefined') {\n acc[state] = rule[attr];\n }\n return acc;\n }, {});\n return res;\n }, {});\n // step 4: simplify the attribute map if only default exists for the attribute\n // simplifiedStyleMap = {\n // fill: {default: 'red', hover: 'blue'},\n // radius: 5,\n // stroke: {hover: 'red'},\n // }\n const simplifiedStyleMap = Object.entries(attrMap).reduce((res, entry) => {\n const [attr, valueMap] = entry;\n const onlyDefault = Object.keys(valueMap).length === 1 && valueMap.default !== undefined;\n if (onlyDefault) {\n res[attr] = valueMap.default;\n return res;\n }\n res[attr] = valueMap;\n return res;\n }, {});\n // step 5: create style property\n // if the propety only maps to default state => return value only\n // if the property maps to other states => return accessor function\n // start to parse properties\n this.properties = {};\n for (const key in simplifiedStyleMap) {\n this.properties[key] = new StyleProperty({\n key,\n value: simplifiedStyleMap[key],\n updateTrigger: updateTriggers.stateUpdateTrigger\n });\n }\n }\n _getProperty(deckglAccessor) {\n const map = DECKGL_ACCESSOR_MAP[this.type];\n if (!map) {\n throw new Error(`illegal type: ${this.type}`);\n }\n const styleProp = map[deckglAccessor];\n if (!styleProp) {\n log.error(`Invalid DeckGL accessor: ${deckglAccessor}`)();\n throw new Error(`Invalid DeckGL accessor: ${deckglAccessor}`);\n }\n return this.properties[styleProp];\n }\n getDeckGLAccessor(deckglAccessor) {\n const property = this._getProperty(deckglAccessor);\n // get the value\n if (property) {\n return property.getValue();\n }\n // return default value\n const styleProp = DECKGL_ACCESSOR_MAP[this.type][deckglAccessor];\n return StyleProperty.getDefault(styleProp);\n }\n getDeckGLAccessorUpdateTrigger(deckglAccessor) {\n const property = this._getProperty(deckglAccessor);\n // get the value\n if (property) {\n return property.getUpdateTrigger();\n }\n return false;\n }\n getDeckGLAccessors() {\n const accessorMap = DECKGL_ACCESSOR_MAP[this.type];\n return Object.keys(accessorMap).reduce((res, accessor) => {\n res[accessor] = this.getDeckGLAccessor(accessor);\n return res;\n }, {});\n }\n getDeckGLUpdateTriggers() {\n return DECKGL_UPDATE_TRIGGERS[this.type].reduce((res, accessor) => {\n res[accessor] = this.getDeckGLAccessorUpdateTrigger(accessor);\n return res;\n }, {});\n }\n}\n", "// deck.gl-community\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\nimport { EDGE_STATE, NODE_STATE } from './constants';\nconst NODE_TO_EDGE_STATE_MAP = {\n [NODE_STATE.DEFAULT]: EDGE_STATE.DEFAULT,\n [NODE_STATE.HOVER]: EDGE_STATE.HOVER,\n [NODE_STATE.DRAGGING]: EDGE_STATE.DRAGGING,\n [NODE_STATE.SELECTED]: EDGE_STATE.SELECTED\n};\nfunction shouldEdgeBeSelected(edge) {\n return edge\n .getConnectedNodes()\n .some((node) => node.getState() === NODE_STATE.SELECTED && node.shouldHighlightConnectedEdges());\n}\nfunction setNodeState(node, state) {\n node.setState(state);\n if (node.shouldHighlightConnectedEdges()) {\n node.getConnectedEdges().forEach((edge) => {\n let newEdgeState = NODE_TO_EDGE_STATE_MAP[state];\n if (shouldEdgeBeSelected(edge)) {\n newEdgeState = EDGE_STATE.SELECTED;\n }\n edge.setState(newEdgeState);\n });\n }\n}\nexport class InteractionManager {\n notifyCallback;\n _lastInteraction = 0;\n _lastHoveredNode = null;\n _lastSelectedNode = null;\n nodeEvents = undefined;\n edgeEvents = undefined;\n engine = undefined;\n enableDragging = undefined;\n resumeLayoutAfterDragging = undefined;\n constructor(props, notifyCallback) {\n this.updateProps(props);\n this.notifyCallback = notifyCallback;\n // internal state\n this._lastInteraction = 0;\n this._lastHoveredNode = null;\n this._lastSelectedNode = null;\n }\n updateProps({ nodeEvents = {}, edgeEvents = {}, engine, enableDragging, resumeLayoutAfterDragging }) {\n this.nodeEvents = nodeEvents;\n this.edgeEvents = edgeEvents;\n this.engine = engine;\n this.enableDragging = enableDragging;\n this.resumeLayoutAfterDragging = resumeLayoutAfterDragging;\n }\n getLastInteraction() {\n return this._lastInteraction;\n }\n onClick(info, event) {\n const { object } = info;\n if (!object) {\n return;\n }\n if (object.isNode) {\n if (object.isSelectable()) {\n if (this._lastSelectedNode) {\n setNodeState(this._lastSelectedNode, NODE_STATE.DEFAULT);\n }\n setNodeState(object, NODE_STATE.SELECTED);\n this._lastSelectedNode = object;\n this._lastInteraction = Date.now();\n this.notifyCallback();\n }\n if (this.nodeEvents.onClick) {\n this.nodeEvents.onClick(info, event);\n }\n }\n if (object.isEdge && this.edgeEvents.onClick) {\n this.edgeEvents.onClick(info, event);\n }\n }\n _mouseLeaveNode() {\n const lastHoveredNode = this._lastHoveredNode;\n if (!(lastHoveredNode.isSelectable() && lastHoveredNode.getState() === NODE_STATE.SELECTED)) {\n // reset the last hovered node's state\n const newState = this._lastSelectedNode !== null && this._lastSelectedNode.id === this._lastHoveredNode?.id\n ? NODE_STATE.SELECTED\n : NODE_STATE.DEFAULT;\n setNodeState(lastHoveredNode, newState);\n }\n // trigger the callback if exists\n if (this.nodeEvents.onMouseLeave) {\n this.nodeEvents.onMouseLeave(lastHoveredNode);\n }\n }\n _mouseEnterNode(info) {\n // set the node's state to hover\n setNodeState(info.object, NODE_STATE.HOVER);\n // trigger the callback if exists\n if (this.nodeEvents.onMouseEnter) {\n this.nodeEvents.onMouseEnter(info);\n }\n if (this.nodeEvents.onHover) {\n this.nodeEvents.onHover(info);\n }\n }\n onHover(info, event) {\n if (!info.object) {\n if (this._lastHoveredNode) {\n this._mouseLeaveNode();\n this._lastInteraction = Date.now();\n this._lastHoveredNode = null;\n this.notifyCallback();\n }\n return;\n }\n // hover over on a node\n if (info.object.isNode) {\n const isSameNode = this._lastHoveredNode && this._lastHoveredNode.id === info.object.id;\n // stay in the same node\n if (isSameNode) {\n return;\n }\n if (this._lastHoveredNode) {\n // reset the previous hovered node's state if not the same node\n this._mouseLeaveNode();\n }\n // enter new node\n this._mouseEnterNode(info);\n this._lastInteraction = Date.now();\n this._lastHoveredNode = info.object;\n this.notifyCallback();\n }\n if (info.object.isEdge && this.edgeEvents.onHover) {\n this.edgeEvents.onHover(info);\n }\n }\n onDragStart(info, event) {\n if (this.nodeEvents.onDragStart) {\n this.nodeEvents.onDragStart(info);\n }\n }\n onDrag(info, event) {\n if (!info.object.isNode || !this.enableDragging) {\n return;\n }\n event.stopImmediatePropagation();\n // info.viewport is undefined when the object is offscreen, so we use viewport from onDragStart\n const coordinates = info.layer.context.viewport.unproject([info.x, info.y]);\n // limit the node position to be within bounds of the viewport\n const bounds = info.layer.context.viewport.getBounds(); // [minX, minY, maxX, maxY]\n const x = Math.min(Math.max(coordinates[0], bounds[0]), bounds[2]);\n const y = Math.min(Math.max(coordinates[1], bounds[1]), bounds[3]);\n this.engine.lockNodePosition(info.object, x, y);\n setNodeState(info.object, NODE_STATE.DRAGGING);\n this._lastInteraction = Date.now();\n this.notifyCallback();\n if (this.nodeEvents.onDrag) {\n this.nodeEvents.onDrag(info);\n }\n }\n onDragEnd(info, event) {\n if (!info.object.isNode || !this.enableDragging) {\n return;\n }\n if (this.resumeLayoutAfterDragging) {\n this.engine.resume();\n }\n setNodeState(info.object, NODE_STATE.DEFAULT);\n this.engine.unlockNodePosition(info.object);\n }\n}\n", "// deck.gl-community\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\nimport { CompositeLayer } from '@deck.gl/core';\nimport { ScatterplotLayer } from '@deck.gl/layers';\nexport class CircleLayer extends CompositeLayer {\n static layerName = 'CircleLayer';\n renderLayers() {\n const { data, getPosition, stylesheet, positionUpdateTrigger = 0 } = this.props;\n return [\n new ScatterplotLayer(this.getSubLayerProps({\n id: '__scatterplot-layer',\n data,\n getPosition,\n ...stylesheet.getDeckGLAccessors(),\n updateTriggers: {\n getPosition: positionUpdateTrigger,\n ...stylesheet.getDeckGLUpdateTriggers()\n }\n }))\n ];\n }\n}\n", "// deck.gl-community\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\nimport { CompositeLayer } from '@deck.gl/core';\nimport { IconLayer } from '@deck.gl/layers';\nexport class ImageLayer extends CompositeLayer {\n static layerName = 'ImageLayer';\n renderLayers() {\n const { data, getPosition, stylesheet, positionUpdateTrigger = 0 } = this.props;\n return [\n new IconLayer(this.getSubLayerProps({\n id: '__icon-layer',\n data,\n getPosition,\n ...stylesheet.getDeckGLAccessors(),\n updateTriggers: {\n getPosition: positionUpdateTrigger,\n ...stylesheet.getDeckGLUpdateTriggers()\n }\n }))\n ];\n }\n}\n", "// deck.gl-community\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\nimport { CompositeLayer } from '@deck.gl/core';\nimport { ZoomableTextLayer } from '../common-layers/zoomable-text-layer/zoomable-text-layer';\nexport class LabelLayer extends CompositeLayer {\n static layerName = 'LabelLayer';\n renderLayers() {\n const { data, getPosition, stylesheet, positionUpdateTrigger = 0 } = this.props;\n return [\n new ZoomableTextLayer(this.getSubLayerProps({\n id: '__text-layer',\n data,\n getPosition,\n ...stylesheet.getDeckGLAccessors(),\n updateTriggers: {\n ...stylesheet.getDeckGLUpdateTriggers(),\n getPosition: positionUpdateTrigger\n }\n }))\n ];\n }\n}\n", "// deck.gl-community\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\nimport { CompositeLayer } from '@deck.gl/core';\nimport { TextLayer } from '@deck.gl/layers';\nexport class ZoomableTextLayer extends CompositeLayer {\n static layerName = 'ZoomableTextLayer';\n initializeState() {\n this.state = { characterSet: [] };\n }\n shouldUpdateState({ props, changeFlags }) {\n const { scaleWithZoom } = this.props;\n if (!scaleWithZoom) {\n return changeFlags.dataChanged || changeFlags.propsChanged;\n }\n return changeFlags.dataChanged || changeFlags.propsChanged || changeFlags.viewportChanged;\n }\n updateState({ props, oldProps, changeFlags }) {\n super.updateState({ props, oldProps, changeFlags });\n if (changeFlags.propsOrDataChanged) {\n const { getText } = props;\n let textLabels = [];\n if (typeof getText === 'function') {\n textLabels = props.data.map(getText);\n }\n else {\n textLabels = [getText];\n }\n const characterSet = new Set(textLabels.join(''));\n const uniqueCharacters = Array.from(characterSet);\n this.setState({ characterSet: uniqueCharacters });\n }\n }\n renderLayers() {\n const { data, getPosition, getColor, getText, getSize, getTextAnchor, getAlignmentBaseline, getAngle, scaleWithZoom, updateTriggers, fontFamily, textWordUnits, textWordBreak, textMaxWidth, textSizeMinPixels } = this.props;\n const sizeUpdateTrigger = scaleWithZoom ? [getSize, this.context.viewport.zoom] : false;\n // getText only expects function not plain value (string)\n const newGetText = typeof getText === 'function' ? getText : () => getText;\n return [\n new TextLayer(this.getSubLayerProps({\n id: '__text-layer',\n data,\n sizeScale: scaleWithZoom ? Math.pow(2, this.context.viewport.zoom - 1) : 1,\n characterSet: this.state.characterSet,\n getPosition,\n getColor,\n getSize,\n getTextAnchor,\n getAlignmentBaseline,\n getAngle,\n getText: newGetText,\n maxWidth: textMaxWidth ?? 12,\n wordBreak: textWordBreak ?? 'break-all',\n fontFamily: fontFamily ?? 'Red Hat Text',\n wordUnits: textWordUnits ?? 'pixels',\n sizeMinPixels: textSizeMinPixels ?? 9,\n updateTriggers: {\n getSize: sizeUpdateTrigger,\n getAngle: [sizeUpdateTrigger, updateTriggers.getPosition],\n ...updateTriggers\n }\n }))\n ];\n }\n}\n", "// deck.gl-community\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\nimport { CompositeLayer } from '@deck.gl/core';\nimport { PolygonLayer } from '@deck.gl/layers';\nconst generateRectangle = (node, { getWidth, getHeight, getPosition }) => {\n const pos = getPosition(node);\n const width = typeof getWidth === 'function' ? getWidth(node._data.label.length * 12) : getWidth;\n const height = typeof getWidth === 'function' ? getHeight(node) : getHeight;\n const halfWidth = width / 2;\n const halfHeight = height / 2;\n return [\n [pos[0] - halfWidth, pos[1] - halfHeight],\n [pos[0] - halfWidth, pos[1] + halfHeight],\n [pos[0] + halfWidth, pos[1] + halfHeight],\n [pos[0] + halfWidth, pos[1] - halfHeight]\n ];\n};\nexport class RectangleLayer extends CompositeLayer {\n static layerName = 'RectangleLayer';\n renderLayers() {\n const { data, getPosition, stylesheet, positionUpdateTrigger = 0 } = this.props;\n const getFillColor = stylesheet.getDeckGLAccessor('getFillColor');\n const getLineWidth = stylesheet.getDeckGLAccessor('getLineWidth');\n return [\n new PolygonLayer(this.getSubLayerProps({\n id: '__polygon-layer',\n data,\n getPolygon: (node) => generateRectangle(node, {\n getPosition,\n getWidth: stylesheet.getDeckGLAccessor('getWidth'),\n getHeight: stylesheet.getDeckGLAccessor('getHeight')\n }),\n filled: Boolean(getFillColor),\n jointRounded: true,\n stroked: Boolean(getLineWidth),\n ...stylesheet.getDeckGLAccessors(),\n updateTriggers: {\n getPolygon: [\n positionUpdateTrigger,\n stylesheet.getDeckGLAccessorUpdateTrigger('getWidth'),\n stylesheet.getDeckGLAccessorUpdateTrigger('getHeight')\n ],\n ...stylesheet.getDeckGLUpdateTriggers()\n }\n }))\n ];\n }\n}\n", "// deck.gl-community\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\nexport const fs = /* glsl */ `\\\n#define SHADER_NAME rounded-rectangle-layer-fragment-shader\n\nprecision highp float;\n\nuniform float cornerRadius;\n\nvarying vec4 vFillColor;\nvarying vec2 unitPosition;\n\nvoid main(void) {\n\n float distToCenter = length(unitPosition);\n\n /* Calculate the cutoff radius for the rounded corners */\n float threshold = sqrt(2.0) * (1.0 - cornerRadius) + 1.0 * cornerRadius;\n if (distToCenter <= threshold) {\n gl_FragColor = vFillColor;\n } else {\n discard;\n }\n\n gl_FragColor = picking_filterHighlightColor(gl_FragColor);\n\n gl_FragColor = picking_filterPickingColor(gl_FragColor);\n}\n`;\n", "// deck.gl-community\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n// import {ScatterplotLayer} from '@deck.gl/layers';\nimport { fs } from './rounded-rectangle-layer-fragment';\nimport { RectangleLayer } from './rectangle-layer';\nexport class RoundedRectangleLayer extends RectangleLayer {\n static layerName = 'RoundedRectangleLayer';\n draw({ uniforms }) {\n super.draw({\n uniforms: {\n ...uniforms,\n cornerRadius: this.props.cornerRadius\n }\n });\n }\n getShaders() {\n // use object.assign to make sure we don't overwrite existing fields like `vs`, `modules`...\n return Object.assign({}, super.getShaders(undefined), {\n fs\n });\n }\n}\nRoundedRectangleLayer.defaultProps = {\n // cornerRadius: the amount of rounding at the rectangle corners\n // 0 - rectangle. 1 - circle.\n cornerRadius: 0.1\n};\n", "// deck.gl-community\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\nimport { CompositeLayer } from '@deck.gl/core';\nimport { PolygonLayer } from '@deck.gl/layers';\nimport { generateRoundedCorners } from '../../utils/polygon-calculations';\nconst generateRoundedRectangle = (node, { getWidth, getHeight, getPosition, getCornerRadius }) => {\n const pos = getPosition(node);\n const width = typeof getWidth === 'function' ? getWidth(node) : getWidth;\n const height = typeof getWidth === 'function' ? getHeight(node) : getHeight;\n const cornerRadius = typeof getCornerRadius === 'function' ? getCornerRadius(node) : getCornerRadius;\n const factor = 20;\n return generateRoundedCorners(pos, width, height, cornerRadius, factor);\n};\nexport class PathBasedRoundedRectangleLayer extends CompositeLayer {\n static layerName = 'PathBasedRoundedRectangleLayer';\n renderLayers() {\n const { data, getPosition, stylesheet, positionUpdateTrigger = 0 } = this.props;\n const getFillColor = stylesheet.getDeckGLAccessor('getFillColor');\n const getLineWidth = stylesheet.getDeckGLAccessor('getLineWidth');\n return [\n new PolygonLayer(this.getSubLayerProps({\n id: '__polygon-layer',\n data,\n getPolygon: (node) => generateRoundedRectangle(node, {\n getPosition,\n getWidth: stylesheet.getDeckGLAccessor('getWidth'),\n getHeight: stylesheet.getDeckGLAccessor('getHeight'),\n getCornerRadius: stylesheet.getDeckGLAccessor('getCornerRadius')\n }),\n filled: Boolean(getFillColor),\n stroked: Boolean(getLineWidth),\n ...stylesheet.getDeckGLAccessors(),\n updateTriggers: {\n getPolygon: [\n positionUpdateTrigger,\n stylesheet.getDeckGLAccessorUpdateTrigger('getWidth'),\n stylesheet.getDeckGLAccessorUpdateTrigger('getHeight'),\n stylesheet.getDeckGLAccessorUpdateTrigger('getCornerRadius')\n ],\n ...stylesheet.getDeckGLUpdateTriggers()\n }\n }))\n ];\n }\n}\n", "// deck.gl-community\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\nexport function generateRoundedCorners(pos, width, height, radius, factor = 20) {\n const halfWidth = width / 2;\n const halfHeight = height / 2;\n const bottomLeft = { X: pos[0] - halfWidth, Y: pos[1] - halfHeight };\n const topLeft = { X: pos[0] - halfWidth, Y: pos[1] + halfHeight };\n const bottomRight = { X: pos[0] + halfWidth, Y: pos[1] - halfHeight };\n const topRight = { X: pos[0] + halfWidth, Y: pos[1] + halfHeight };\n const roundedPointsForBottomLeft = getRoundedCorner(bottomLeft, topLeft, bottomRight, radius, factor);\n const roundedPointsForTopLeft = getRoundedCorner(topLeft, topRight, bottomLeft, radius, factor).reverse();\n const roundedPointsForTopRight = getRoundedCorner(topRight, bottomRight, topLeft, radius, factor).reverse();\n const roundedPointsForBottomRight = getRoundedCorner(bottomRight, bottomLeft, topRight, radius, factor).reverse();\n const result = [\n ...roundedPointsForBottomLeft,\n ...roundedPointsForTopLeft,\n ...roundedPointsForTopRight,\n ...roundedPointsForBottomRight\n ];\n return result;\n}\n/**\n *\n * @param {*} angularPoint = corner point\n * @param {*} p1 = edge one\n * @param {*} p2 = edge two\n * @param {*} radius = corner radius\n * @param {*} factor = affects the points used for curve\n * reference: https://stackoverflow.com/questions/24771828/how-to-calculate-rounded-corners-for-a-polygon\n */\n// eslint-disable-next-line max-statements\nfunction getRoundedCorner(angularPoint, p1, p2, radius, factor) {\n // Vector 1\n const dx1 = angularPoint.X - p1.X;\n const dy1 = angularPoint.Y - p1.Y;\n // Vector 2\n const dx2 = angularPoint.X - p2.X;\n const dy2 = angularPoint.Y - p2.Y;\n // Angle between vector 1 and vector 2 divided by 2\n const angle = (Math.atan2(dy1, dx1) - Math.atan2(dy2, dx2)) / 2;\n // The length of segment between angular point and the\n // points of intersection with the circle of a given radius\n const tan = Math.abs(Math.tan(angle));\n let segment = radius / tan;\n // var segment = 2;\n // Check the segment\n const length1 = getLength(dx1, dy1);\n const length2 = getLength(dx2, dy2);\n const length = Math.min(length1, length2);\n if (segment > length) {\n segment = length;\n radius = length * tan;\n }\n // Points of intersection are calculated by the proportion between\n // the coordinates of the vector, length of vector and the length of the segment.\n const p1Cross = getProportionPoint(angularPoint, segment, length1, dx1, dy1);\n const p2Cross = getProportionPoint(angularPoint, segment, length2, dx2, dy2);\n // Calculation of the coordinates of the circle\n // center by the addition of angular vectors.\n const dx = angularPoint.X * 2 - p1Cross.X - p2Cross.X;\n const dy = angularPoint.Y * 2 - p1Cross.Y - p2Cross.Y;\n const L = getLength(dx, dy);\n const d = getLength(segment, radius);\n const circlePoint = getProportionPoint(angularPoint, d, L, dx, dy);\n // StartAngle and EndAngle of arc\n let startAngle = Math.atan2(p1Cross.Y - circlePoint.Y, p1Cross.X - circlePoint.X);\n const endAngle = Math.atan2(p2Cross.Y - circlePoint.Y, p2Cross.X - circlePoint.X);\n // Sweep angle\n let sweepAngle = endAngle - startAngle;\n // Some additional checks\n if (sweepAngle < 0) {\n startAngle = endAngle;\n sweepAngle = -sweepAngle;\n }\n if (sweepAngle > Math.PI)\n sweepAngle = Math.PI - sweepAngle;\n const degreeFactor = factor / Math.PI;\n return getPointsForArc(sweepAngle, degreeFactor, startAngle, circlePoint, radius);\n}\nfunction getLength(dx, dy) {\n return Math.sqrt(dx * dx + dy * dy);\n}\nfunction getProportionPoint(point, segment, length, dx, dy) {\n const factor = segment / length;\n return {\n X: point.X - dx * factor,\n Y: point.Y - dy * factor\n };\n}\nfunction getPointsForArc(sweepAngle, degreeFactor, startAngle, circlePoint, radius) {\n const pointsCount = Math.abs(sweepAngle * degreeFactor);\n const sign = Math.sign(sweepAngle);\n const points = [];\n for (let i = 0; i < pointsCount; ++i) {\n const pointX = circlePoint.X + Math.cos(startAngle + (sign * i) / degreeFactor) * radius;\n const pointY = circlePoint.Y + Math.sin(startAngle + (sign * i) / degreeFactor) * radius;\n const point = [pointX, pointY];\n points.push(point);\n }\n return points;\n}\n", "// deck.gl-community\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\nimport { CompositeLayer } from '@deck.gl/core';\nimport { MarkerLayer } from '../common-layers/marker-layer/marker-layer';\nexport class ZoomableMarkerLayer extends CompositeLayer {\n static layerName = 'ZoomableMarkerLayer';\n shouldUpdateState({ props, changeFlags }) {\n const { stylesheet } = this.props;\n const scaleWithZoom = stylesheet.getDeckGLAccessor('scaleWithZoom');\n if (!scaleWithZoom) {\n return changeFlags.somethingChanged;\n }\n return changeFlags.somethingChanged || changeFlags.viewportChanged;\n }\n renderLayers() {\n const { data, getPosition, stylesheet, positionUpdateTrigger = 0 } = this.props;\n const getSize = stylesheet.getDeckGLAccessor('getSize');\n const scaleWithZoom = stylesheet.getDeckGLAccessor('scaleWithZoom');\n const sizeUpdateTrigger = scaleWithZoom ? [getSize, this.context.viewport.zoom] : false;\n const oiginalGetMarker = stylesheet.getDeckGLAccessor('getMarker');\n // getMarker only expects function not plain value (string)\n const getMarker = typeof oiginalGetMarker === 'function' ? oiginalGetMarker : () => oiginalGetMarker;\n return [\n new MarkerLayer(this.getSubLayerProps({\n id: 'zoomable-marker-layer',\n data,\n getPosition,\n sizeScale: scaleWithZoom ? Math.max(0, this.context.viewport.zoom) : 1,\n ...stylesheet.getDeckGLAccessors(),\n getMarker,\n updateTriggers: {\n ...stylesheet.getDeckGLUpdateTriggers(),\n getPosition: positionUpdateTrigger,\n getSize: sizeUpdateTrigger\n }\n }))\n ];\n }\n}\n", "// deck.gl-community\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\nimport { CompositeLayer } from '@deck.gl/core';\nimport { IconLayer } from '@deck.gl/layers';\nimport { MarkerMapping } from './marker-mapping';\nimport { AtlasDataURL } from './atlas-data-url';\nexport class MarkerLayer extends CompositeLayer {\n static layerName = 'MarkerLayer';\n static defaultProps = {\n id: 'MarkerLayer',\n data: [],\n getMarker: (d) => d.marker,\n getColor: (d) => [0, 0, 0],\n getSize: (d) => 10\n };\n renderLayers() {\n const { getMarker, ...otherProps } = this.props;\n return [\n new IconLayer(this.getSubLayerProps({\n id: 'marker-layer',\n iconAtlas: AtlasDataURL.dataURL,\n iconMapping: MarkerMapping,\n getIcon: getMarker,\n ...otherProps\n }))\n ];\n }\n}\n", "// deck.gl-community\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n/* eslint-disable */\nexport const MarkerMapping = {\n 'bell-filled': {\n x: 0,\n y: 0,\n width: 32,\n height: 32,\n mask: true\n },\n bell: {\n x: 32,\n y: 0,\n width: 32,\n height: 32,\n mask: true\n },\n 'bookmark-filled': {\n x: 0,\n y: 32,\n width: 32,\n height: 32,\n mask: true\n },\n bookmark: {\n x: 32,\n y: 32,\n width: 32,\n height: 32,\n mask: true\n },\n 'cd-filled': {\n x: 64,\n y: 0,\n width: 32,\n height: 32,\n mask: true\n },\n cd: {\n x: 64,\n y: 32,\n width: 32,\n height: 32,\n mask: true\n },\n checkmark: {\n x: 0,\n y: 64,\n width: 32,\n height: 32,\n mask: true\n },\n 'circle-check-filled': {\n x: 32,\n y: 64,\n width: 32,\n height: 32,\n mask: true\n },\n 'circle-check': {\n x: 64,\n y: 64,\n width: 32,\n height: 32,\n mask: true\n },\n 'circle-filled': {\n x: 96,\n y: 0,\n width: 32,\n height: 32,\n mask: true\n },\n 'circle-i-filled': {\n x: 96,\n y: 32,\n width: 32,\n height: 32,\n mask: true\n },\n 'circle-i': {\n x: 96,\n y: 64,\n width: 32,\n height: 32,\n mask: true\n },\n 'circle-minus-filled': {\n x: 0,\n y: 96,\n width: 32,\n height: 32,\n mask: true\n },\n 'circle-minus': {\n x: 32,\n y: 96,\n width: 32,\n height: 32,\n mask: true\n },\n 'circle-plus-filled': {\n x: 64,\n y: 96,\n width: 32,\n height: 32,\n mask: true\n },\n 'circle-plus': {\n x: 96,\n y: 96,\n width: 32,\n height: 32,\n mask: true\n },\n 'circle-questionmark-filled': {\n x: 128,\n y: 0,\n width: 32,\n height: 32,\n mask: true\n },\n 'circle-questionmark': {\n x: 128,\n y: 32,\n width: 32,\n height: 32,\n mask: true\n },\n 'circle-slash-filled': {\n x: 128,\n y: 64,\n width: 32,\n height: 32,\n mask: true\n },\n 'circle-slash': {\n x: 128,\n y: 96,\n width: 32,\n height: 32,\n mask: true\n },\n 'circle-x-filled': {\n x: 0,\n y: 128,\n width: 32,\n height: 32,\n mask: true\n },\n 'circle-x': {\n x: 32,\n y: 128,\n width: 32,\n height: 32,\n mask: true\n },\n circle: {\n x: 64,\n y: 128,\n width: 32,\n height: 32,\n mask: true\n },\n 'diamond-filled': {\n x: 96,\n y: 128,\n width: 32,\n height: 32,\n mask: true\n },\n diamond: {\n x: 128,\n y: 128,\n width: 32,\n height: 32,\n mask: true\n },\n 'flag-filled': {\n x: 160,\n y: 0,\n width: 32,\n height: 32,\n mask: true\n },\n flag: {\n x: 160,\n y: 32,\n width: 32,\n height: 32,\n mask: true\n },\n gear: {\n x: 160,\n y: 64,\n width: 32,\n height: 32,\n mask: true\n },\n 'heart-filled': {\n x: 160,\n y: 96,\n width: 32,\n height: 32,\n mask: true\n },\n heart: {\n x: 160,\n y: 128,\n width: 32,\n height: 32,\n mask: true\n },\n 'location-marker-filled': {\n x: 0,\n y: 160,\n width: 32,\n height: 32,\n mask: true\n },\n 'location-marker': {\n x: 32,\n y: 160,\n width: 32,\n height: 32,\n mask: true\n },\n 'octagonal-star-filled': {\n x: 64,\n y: 160,\n width: 32,\n height: 32,\n mask: true\n },\n 'octagonal-star': {\n x: 96,\n y: 160,\n width: 32,\n height: 32,\n mask: true\n },\n 'person-filled': {\n x: 128,\n y: 160,\n width: 32,\n height: 32,\n mask: true\n },\n person: {\n x: 160,\n y: 160,\n width: 32,\n height: 32,\n mask: true\n },\n 'pin-filled': {\n x: 192,\n y: 0,\n width: 32,\n height: 32,\n mask: true\n },\n pin: {\n x: 192,\n y: 32,\n width: 32,\n height: 32,\n mask: true\n },\n 'plus-small': {\n x: 192,\n y: 64,\n width: 32,\n height: 32,\n mask: true\n },\n plus: {\n x: 192,\n y: 96,\n width: 32,\n height: 32,\n mask: true\n },\n 'rectangle-filled': {\n x: 192,\n y: 128,\n width: 32,\n height: 32,\n mask: true\n },\n rectangle: {\n x: 192,\n y: 160,\n width: 32,\n height: 32,\n mask: true\n },\n 'star-filled': {\n x: 0,\n y: 192,\n width: 32,\n height: 32,\n mask: true\n },\n star: {\n x: 32,\n y: 192,\n width: 32,\n height: 32,\n mask: true\n },\n 'tag-filled': {\n x: 64,\n y: 192,\n width: 32,\n height: 32,\n mask: true\n },\n tag: {\n x: 96,\n y: 192,\n width: 32,\n height: 32,\n mask: true\n },\n 'thumb-down-filled': {\n x: 128,\n y: 192,\n width: 32,\n height: 32,\n mask: true\n },\n 'thumb-down': {\n x: 160,\n y: 192,\n width: 32,\n height: 32,\n mask: true\n },\n 'thumb-up': {\n x: 192,\n y: 192,\n width: 32,\n height: 32,\n mask: true\n },\n 'thumb_up-filled': {\n x: 224,\n y: 0,\n width: 32,\n height: 32,\n mask: true\n },\n 'triangle-down-filled': {\n x: 224,\n y: 32,\n width: 32,\n height: 32,\n mask: true\n },\n 'triangle-down': {\n x: 224,\n y: 64,\n width: 32,\n height: 32,\n mask: true\n },\n 'triangle-left-filled': {\n x: 224,\n y: 96,\n width: 32,\n height: 32,\n mask: true\n },\n 'triangle-left': {\n x: 224,\n y: 128,\n width: 32,\n height: 32,\n mask: true\n },\n 'triangle-right-filled': {\n x: 224,\n y: 160,\n width: 32,\n height: 32,\n mask: true\n },\n 'triangle-right': {\n x: 224,\n y: 192,\n width: 32,\n height: 32,\n mask: true\n },\n 'triangle-up-filled': {\n x: 0,\n y: 224,\n width: 32,\n height: 32,\n mask: true\n },\n 'triangle-up': {\n x: 32,\n y: 224,\n width: 32,\n height: 32,\n mask: true\n },\n 'x-small': {\n x: 64,\n y: 224,\n width: 32,\n height: 32,\n mask: true\n },\n x: {\n x: 96,\n y: 224,\n width: 32,\n height: 32,\n mask: true\n }\n};\n/* eslint-enable */\n", "// deck.gl-community\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n/* eslint-disable */\nexport const AtlasDataURL = {\n dataURL: 'data:image/png;base64,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'\n};\n/* eslint-enable */\n", "// deck.gl-community\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\nimport { COORDINATE_SYSTEM, CompositeLayer } from '@deck.gl/core';\nimport { EDGE_TYPE } from '../core/constants';\nimport { StraightLineEdgeLayer } from '../layers/edge-layers/straight-line-edge-layer';\nimport { PathEdgeLayer } from './edge-layers/path-edge-layer';\nimport { CurvedEdgeLayer } from './edge-layers/curved-edge-layer';\nconst EDGE_LAYER_MAP = {\n [EDGE_TYPE.LINE]: StraightLineEdgeLayer,\n [EDGE_TYPE.PATH]: PathEdgeLayer,\n [EDGE_TYPE.SPLINE_CURVE]: CurvedEdgeLayer\n};\nexport class EdgeLayer extends CompositeLayer {\n static layerName = 'EdgeLayer';\n static defaultProps = {\n data: [],\n pickable: true,\n getLayoutInfo: (d) => ({\n type: d.type,\n sourcePosition: d.sourcePosition,\n targetPosition: d.targetPosition,\n controlPoints: []\n }),\n positionUpdateTrigger: 0\n };\n updateState({ props, oldProps, changeFlags }) {\n super.updateState({ props, oldProps, changeFlags });\n if (changeFlags.dataChanged) {\n this.updateStateData();\n }\n }\n updateStateData() {\n const { data, getLayoutInfo } = this.props;\n // bucket edges by types\n const typedEdgeData = data.reduce((res, d) => {\n const { type } = getLayoutInfo(d);\n res[type].push(d);\n return res;\n }, {\n [EDGE_TYPE.LINE]: [],\n [EDGE_TYPE.PATH]: [],\n [EDGE_TYPE.SPLINE_CURVE]: []\n });\n this.setState({ typedEdgeData });\n }\n renderLayers() {\n const { getLayoutInfo, pickable, positionUpdateTrigger, stylesheet, id } = this.props;\n const { typedEdgeData } = this.state;\n // render lines by types (straight line, path, curves)\n return Object.entries(typedEdgeData).map((e, idx) => {\n const [type, edgeData] = e;\n const Layer = EDGE_LAYER_MAP[type];\n // invalid edge layer type\n if (!Layer) {\n return null;\n }\n return new Layer({\n id: `${id}-${idx}`,\n data: edgeData,\n getLayoutInfo,\n getColor: stylesheet.getDeckGLAccessor('getColor'),\n getWidth: stylesheet.getDeckGLAccessor('getWidth'),\n colorUpdateTrigger: stylesheet.getDeckGLAccessorUpdateTrigger('getColor'),\n widthUpdateTrigger: stylesheet.getDeckGLAccessorUpdateTrigger('getWidth'),\n positionUpdateTrigger,\n pickable,\n coordinateSystem: COORDINATE_SYSTEM.CARTESIAN,\n parameters: {\n depthCompare: 'always'\n }\n });\n });\n }\n}\n", "// deck.gl-community\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\nimport { CompositeLayer } from '@deck.gl/core';\nimport { LineLayer } from '@deck.gl/layers';\nexport class StraightLineEdgeLayer extends CompositeLayer {\n static layerName = 'StraightLineEdgeLayer';\n renderLayers() {\n const { data, getLayoutInfo, positionUpdateTrigger = 0, colorUpdateTrigger = 0, widthUpdateTrigger = 0, ...otherProps } = this.props;\n return [\n new LineLayer(this.getSubLayerProps({\n id: '__line-layer',\n data,\n getSourcePosition: (e) => getLayoutInfo(e).sourcePosition,\n getTargetPosition: (e) => getLayoutInfo(e).targetPosition,\n updateTriggers: {\n getColor: colorUpdateTrigger,\n getSourcePosition: positionUpdateTrigger,\n getTargetPosition: positionUpdateTrigger,\n getWidth: widthUpdateTrigger\n },\n ...otherProps\n }))\n ];\n }\n}\n", "// deck.gl-community\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\nimport { CompositeLayer } from '@deck.gl/core';\nimport { PathLayer } from '@deck.gl/layers';\nexport class PathEdgeLayer extends CompositeLayer {\n static layerName = 'PathEdgeLayer';\n renderLayers() {\n const { data, getLayoutInfo, positionUpdateTrigger = 0, colorUpdateTrigger = 0, widthUpdateTrigger = 0, ...otherProps } = this.props;\n return [\n new PathLayer(this.getSubLayerProps({\n id: '__line-layer',\n data,\n getPath: (e) => {\n const { sourcePosition, targetPosition, controlPoints } = getLayoutInfo(e);\n return [sourcePosition, ...controlPoints, targetPosition];\n },\n updateTriggers: {\n getColor: colorUpdateTrigger,\n getPath: positionUpdateTrigger,\n getWidth: widthUpdateTrigger\n },\n ...otherProps\n }))\n ];\n }\n}\n", "// deck.gl-community\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\nimport { CompositeLayer } from '@deck.gl/core';\nimport { ScatterplotLayer, LineLayer } from '@deck.gl/layers';\nimport { SplineLayer } from '../common-layers/spline-layer/spline-layer';\nconst DEBUG = false;\nexport class CurvedEdgeLayer extends CompositeLayer {\n static layerName = 'CurvedEdgeLayer';\n // @ts-expect-error TODO\n renderLayers() {\n const { data, getLayoutInfo, positionUpdateTrigger = 0, colorUpdateTrigger = 0, widthUpdateTrigger = 0, ...otherProps } = this.props;\n return [\n DEBUG &&\n new ScatterplotLayer(this.getSubLayerProps({\n id: '__control-points',\n data,\n getPosition: (e) => getLayoutInfo(e).controlPoints[0],\n getColor: (d) => [190, 190, 190, 150],\n getRadius: (d) => 5,\n updateTriggers: {\n getPosition: positionUpdateTrigger\n },\n ...otherProps\n })),\n DEBUG &&\n new LineLayer(this.getSubLayerProps({\n id: '__first_segment',\n data,\n getSourcePosition: (e) => getLayoutInfo(e).sourcePosition,\n getTargetPosition: (e) => getLayoutInfo(e).controlPoints[0],\n getColor: (e) => [210, 210, 210, 150],\n updateTriggers: {\n getSourcePosition: positionUpdateTrigger,\n getTargetPosition: positionUpdateTrigger\n },\n ...otherProps\n })),\n DEBUG &&\n new LineLayer(this.getSubLayerProps({\n id: '__last_segment',\n data,\n getSourcePosition: (e) => getLayoutInfo(e).controlPoints[0],\n getTargetPosition: (e) => getLayoutInfo(e).targetPosition,\n getColor: (e) => [210, 210, 210, 150],\n updateTriggers: {\n getSourcePosition: positionUpdateTrigger,\n getTargetPosition: positionUpdateTrigger\n },\n ...otherProps\n })),\n new SplineLayer(this.getSubLayerProps({\n id: '__spline_layer',\n data,\n getSourcePosition: (e) => getLayoutInfo(e).sourcePosition,\n getTargetPosition: (e) => getLayoutInfo(e).targetPosition,\n getControlPoints: (e) => getLayoutInfo(e).controlPoints,\n updateTriggers: {\n getSourcePosition: positionUpdateTrigger,\n getTargetPosition: positionUpdateTrigger,\n getControlPoints: positionUpdateTrigger,\n getColor: colorUpdateTrigger,\n getWidth: widthUpdateTrigger\n },\n ...otherProps\n }))\n ];\n }\n}\n", "// deck.gl-community\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\nimport { COORDINATE_SYSTEM, CompositeLayer } from '@deck.gl/core';\nimport { PathLayer } from '@deck.gl/layers';\nimport { getCurvePoints } from 'cardinal-spline-js';\n// const getCurvePoints = () => {};\n/* Constants */\nconst defaultProps = {\n id: 'spline-layer',\n getData: (d) => d.points,\n getAngle: (x) => 0,\n fontSize: 24,\n coordinateSystem: COORDINATE_SYSTEM.CARTESIAN,\n fp64: false\n};\nexport class SplineLayer extends CompositeLayer {\n static layerName = 'SplineLayer';\n initializeState() {\n this.state = { typedEdgeData: [] };\n }\n shouldUpdateState({ changeFlags }) {\n return changeFlags.dataChanged || changeFlags.propsChanged;\n }\n updateState({ props, oldProps, changeFlags }) {\n super.updateState({ props, oldProps, changeFlags });\n if (changeFlags.dataChanged || changeFlags.propsChanged) {\n this.updateSplineData();\n }\n }\n updateSplineData() {\n const { data } = this.props;\n const paths = data.reduce((res, d) => {\n const sourcePosition = this.props.getSourcePosition(d);\n const targetPosition = this.props.getTargetPosition(d);\n const controlPoints = this.props.getControlPoints(d);\n // Catmull-Rom curve\n const serializedControlPoints = controlPoints.toString().split(',');\n // NOTE: we might change the number of points according to the length.\n // so we can render less segements.\n // points = [x1, y1, x2, y2, ...];\n const points = getCurvePoints([...sourcePosition, ...serializedControlPoints, ...targetPosition], 0.5, 10);\n // convert points to [[x1, y1], [x2, y2], ...]\n const path = [];\n for (let idx = 0; idx < points.length; idx += 2) {\n path.push([points[idx], points[idx + 1]]);\n }\n res.push(path);\n return res;\n }, []);\n this.setState({ paths });\n }\n renderLayers() {\n const { coordinateSystem, getColor, getWidth, id, updateTriggers } = this.props;\n const { paths } = this.state;\n return new PathLayer({\n id: `${id}-splines`,\n data: paths,\n getPath: (d) => d,\n getColor,\n getWidth,\n coordinateSystem,\n updateTriggers\n });\n }\n}\nSplineLayer.layerName = 'SplineLayer';\nSplineLayer.defaultProps = defaultProps;\n", "// deck.gl-community\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\nimport { CompositeLayer } from '@deck.gl/core';\nimport { ZoomableTextLayer } from '../common-layers/zoomable-text-layer/zoomable-text-layer';\nexport class EdgeLabelLayer extends CompositeLayer {\n static layerName = 'EdgeLabelLayer';\n renderLayers() {\n const { data, getLayoutInfo, positionUpdateTrigger = 0, stylesheet } = this.props;\n return [\n new ZoomableTextLayer(this.getSubLayerProps({\n id: 'edge-label-layer',\n data,\n getPosition: (e) => {\n const { sourcePosition, targetPosition, controlPoints = [] } = getLayoutInfo(e);\n // consider all the points on this edge\n const allPoints = [sourcePosition, targetPosition, ...controlPoints];\n const sumX = allPoints.reduce((res, p) => res + p[0], 0);\n const sumY = allPoints.reduce((res, p) => res + p[1], 0);\n // find the centroid of those points\n return [sumX / allPoints.length, sumY / allPoints.length];\n },\n getAngle: (e) => {\n const { sourcePosition, targetPosition } = getLayoutInfo(e);\n // sort the nodes from left to right\n const [newSourcePosition, newTargetPosition] = sourcePosition[0] < targetPosition[0]\n ? [sourcePosition, targetPosition]\n : [targetPosition, sourcePosition];\n // angle in degrees\n const deltaX = newTargetPosition[0] - newSourcePosition[0];\n const deltaY = newTargetPosition[1] - newSourcePosition[1];\n return (Math.atan2(deltaY, deltaX) * -180) / Math.PI;\n },\n ...stylesheet.getDeckGLAccessors(),\n updateTriggers: {\n ...stylesheet.getDeckGLUpdateTriggers(),\n getPosition: positionUpdateTrigger\n }\n }))\n ];\n }\n}\n", "// deck.gl-community\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\nimport { CompositeLayer } from '@deck.gl/core';\nimport { FlowPathLayer } from '../common-layers/flow-path-layer/flow-path-layer';\nexport class FlowLayer extends CompositeLayer {\n static layerName = 'FlowLayer';\n renderLayers() {\n const { data, getLayoutInfo, positionUpdateTrigger = 0, stylesheet } = this.props;\n return [\n new FlowPathLayer(this.getSubLayerProps({\n id: '__flow-layer',\n data,\n ...stylesheet.getDeckGLAccessors(),\n getSourcePosition: (e) => getLayoutInfo(e).sourcePosition,\n getTargetPosition: (e) => getLayoutInfo(e).targetPosition,\n parameters: {\n depthTest: false\n },\n updateTriggers: {\n ...stylesheet.getDeckGLUpdateTriggers(),\n getSourcePosition: positionUpdateTrigger,\n getTargetPosition: positionUpdateTrigger\n }\n }))\n ];\n }\n}\n", "// deck.gl-community\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n// import {Buffer, Transform} from '@luma.gl/core';\nimport { LineLayer } from '@deck.gl/layers';\nimport { window } from 'global';\nimport { vs } from './flow-path-layer-vertex.glsl';\nimport { fs } from './flow-path-layer-fragment.glsl';\n// import {tfvs} from './flow-path-layer-vertex-tf.glsl';\nconst defaultProps = {\n ...LineLayer.defaultProps,\n getWidth: { type: 'accessor', value: 1 },\n getSpeed: { type: 'accessor', value: 0 }\n};\n/* eslint-disable camelcase */\nexport class FlowPathLayer extends LineLayer {\n getShaders() {\n const projectModule = this.use64bitPositions() ? 'project64' : 'project32';\n return { vs, fs, modules: [projectModule, 'picking'] };\n }\n initializeState() {\n super.initializeState();\n this.getAttributeManager().addInstanced({\n instanceSpeeds: {\n size: 1,\n transition: true,\n accessor: 'getSpeed',\n defaultValue: 0\n },\n instanceTailLengths: {\n size: 1,\n transition: true,\n accessor: 'getTailLength',\n defaultValue: 1\n }\n });\n this.setupTransformFeedback();\n this.setState({\n ...this.state,\n animation: window.requestAnimationFrame(this.animate.bind(this))\n });\n }\n animate() {\n const { transform } = this.state;\n if (transform) {\n transform.run();\n transform.swap();\n }\n this.setState({\n animation: window.requestAnimationFrame(this.animate.bind(this))\n });\n }\n updateState({ props, oldProps, changeFlags }) {\n super.updateState({ props, oldProps, changeFlags });\n const { speedsBuffer } = this.state;\n const speedChanged = changeFlags.dataChanged ||\n props.fp64 !== oldProps.fp64 ||\n (changeFlags.updateTriggersChanged &&\n (changeFlags.updateTriggersChanged.all || changeFlags.updateTriggersChanged.getSpeed));\n if (speedChanged) {\n const speeds = new Float32Array(props.data.length);\n for (let i = 0; i < props.data.length; i++) {\n speeds[i] =\n typeof props.getSpeed === 'function' ? props.getSpeed(props.data[i]) : props.getSpeed;\n }\n speedsBuffer.subData({ data: speeds });\n }\n if (props.fp64 !== oldProps.fp64) {\n if (this.state.model) {\n this.state.model.delete();\n }\n this.setState({ model: this._getModel() });\n this.getAttributeManager().invalidateAll();\n }\n }\n finalizeState() {\n super.finalizeState(this.context);\n window.cancelAnimationFrame(this.state.animation);\n }\n setupTransformFeedback() {\n throw new Error('Not implemented');\n // const {gl} = this.context;\n // const elementCount = this.props.data && this.props.data.length;\n // if (elementCount) {\n // const instanceOffsets = new Float32Array(elementCount);\n // const instanceSpeeds = new Float32Array(elementCount);\n // const offsetBuffer = new Buffer(gl, instanceOffsets);\n // const speedsBuffer = new Buffer(gl, instanceSpeeds);\n // this.setState({\n // speedsBuffer,\n // transform: new Transform(gl, {\n // id: 'transform-offset',\n // vs: tfvs,\n // elementCount,\n // sourceBuffers: {\n // a_offset: offsetBuffer,\n // a_speed: speedsBuffer\n // },\n // feedbackMap: {\n // a_offset: 'v_offset'\n // }\n // })\n // });\n // }\n }\n draw({ uniforms }) {\n throw new Error('Not implemented');\n // const {transform} = this.state;\n // if (!transform) {\n // return;\n // }\n // const {viewport} = this.context;\n // const {widthUnits, widthScale, widthMinPixels, widthMaxPixels} = this.props;\n // const widthMultiplier = widthUnits === 'pixels' ? viewport.distanceScales.metersPerPixel[2] : 1;\n // const offsetBuffer = transform.getBuffer('v_offset');\n // offsetBuffer.setAccessor({divisor: 1});\n // this.state.model\n // .setAttributes({\n // instanceOffsets: offsetBuffer\n // })\n // .setUniforms(\n // Object.assign({}, uniforms, {\n // widthScale: widthScale * widthMultiplier,\n // widthMinPixels,\n // widthMaxPixels\n // })\n // )\n // .draw();\n // offsetBuffer.setAccessor({divisor: 0});\n }\n}\nFlowPathLayer.layerName = 'FlowPathLayer';\nFlowPathLayer.defaultProps = defaultProps;\n", "// deck.gl-community\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\nexport const vs = /* glsl */ `\\\n#define SHADER_NAME flow-path-layer-vertex-shader\n\nattribute vec3 positions;\nattribute vec3 instanceSourcePositions;\nattribute vec3 instanceTargetPositions;\nattribute vec4 instanceSourceTargetPositions64xyLow;\nattribute vec4 instanceColors;\nattribute vec3 instancePickingColors;\nattribute float instanceWidths;\nattribute float instanceSpeeds;\nattribute float instanceOffsets;\nattribute float instanceTailLengths;\n\nuniform float opacity;\nuniform float widthScale;\nuniform float widthMinPixels;\nuniform float widthMaxPixels;\n\nvarying vec4 vColor;\nvarying float segmentIndex;\nvarying float speed;\nvarying float pathLength;\nvarying float tailLength;\nvarying float offset;\n\n// offset vector by strokeWidth pixels\n// offset_direction is -1 (left) or 1 (right)\nvec2 getExtrusionOffset(vec2 line_clipspace, float offset_direction, float width) {\n // normalized direction of the line\n vec2 dir_screenspace = normalize(line_clipspace * project_uViewportSize);\n // rotate by 90 degrees\n dir_screenspace = vec2(-dir_screenspace.y, dir_screenspace.x);\n\n vec2 offset_screenspace = dir_screenspace * offset_direction * width / 2.0;\n vec2 offset_clipspace = project_pixel_size_to_clipspace(offset_screenspace);\n\n return offset_clipspace;\n}\n\nvoid main(void) {\n // Position\n vec4 source = project_position_to_clipspace(instanceSourcePositions, instanceSourceTargetPositions64xyLow.xy, vec3(0.));\n vec4 target = project_position_to_clipspace(instanceTargetPositions, instanceSourceTargetPositions64xyLow.zw, vec3(0.));\n\n // Multiply out width and clamp to limits\n float widthPixels = clamp(\n project_size_to_pixel(instanceWidths * widthScale),\n widthMinPixels, widthMaxPixels\n );\n\n // linear interpolation of source & target to pick right coord\n segmentIndex = positions.x;\n speed = instanceSpeeds;\n tailLength = project_size_to_pixel(instanceTailLengths * widthScale);\n offset = instanceOffsets;\n pathLength = distance(instanceSourcePositions, instanceTargetPositions);\n vec4 p = mix(source, target, segmentIndex);\n\n // extrude\n vec2 offset = getExtrusionOffset(target.xy - source.xy, positions.y, widthPixels);\n gl_Position = p + vec4(offset, 0.0, 0.0);\n\n // Color\n vColor = vec4(instanceColors.rgb, instanceColors.a * opacity) / 255.;\n\n // Set color to be rendered to picking fbo (also used to check for selection highlight).\n picking_setPickingColor(instancePickingColors);\n}\n`;\n", "// deck.gl-community\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\nexport const fs = /* glsl */ `\\\n#define SHADER_NAME flow-path-layer-fragment-shader\n\nprecision highp float;\n\nvarying vec4 vColor;\nvarying float segmentIndex;\nvarying float speed;\nvarying float offset;\nvarying float pathLength;\nvarying float tailLength;\n\nvoid main(void) {\n gl_FragColor = vColor;\n\n // use highlight color if this fragment belongs to the selected object.\n gl_FragColor = picking_filterHighlightColor(gl_FragColor);\n\n // use picking color if rendering to picking FBO.\n gl_FragColor = picking_filterPickingColor(gl_FragColor);\n\n if (speed == 0.0) {\n gl_FragColor = vec4(0.0, 0.0, 0.0, 0.0);\n } else {\n // the portion of the visible segment (0 to 1) , ex: 0.3\n // edge cases: pathLength = 0 or tailLength > pathLength\n float segFragment = 0.0;\n if (pathLength != 0.0) {\n segFragment = tailLength / pathLength;\n }\n if (tailLength > pathLength) {\n segFragment = 1.0;\n }\n float startSegmentIndex = mod(offset, 60.0) / 60.0;\n // the end offset, cap to 1.0 (end of the line)\n float endSegmentIndex = min(startSegmentIndex + segFragment, 1.0);\n if (segmentIndex < startSegmentIndex || segmentIndex > endSegmentIndex) {\n gl_FragColor = vec4(0.0, 0.0, 0.0, 0.0);\n } else {\n // fading tail\n float portion = (segmentIndex - startSegmentIndex) / segFragment;\n gl_FragColor[3] = portion;\n }\n }\n}\n`;\n"],
4
+ "sourcesContent": ["// deck.gl-community\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n// react-graph-layers core\nexport { GraphEngine } from \"./core/graph-engine.js\";\nexport { Graph } from \"./core/graph.js\";\nexport { Node } from \"./core/node.js\";\nexport { Edge } from \"./core/edge.js\";\nexport { NODE_STATE, NODE_TYPE, EDGE_TYPE, EDGE_DECORATOR_TYPE, LAYOUT_STATE, MARKER_TYPE } from \"./core/constants.js\";\n// react-graph-layers layouts\nexport { BaseLayout } from \"./core/base-layout.js\";\nexport { D3ForceLayout } from \"./layouts/d3-force/d3-force-layout.js\";\nexport { GPUForceLayout } from \"./layouts/gpu-force/gpu-force-layout.js\";\nexport { SimpleLayout } from \"./layouts/simple-layout/simple-layout.js\";\n// react-graph-layers loaders\nexport { JSONLoader } from \"./loaders/json-loader.js\";\nexport { basicNodeParser } from \"./loaders/node-parsers.js\";\nexport { basicEdgeParser } from \"./loaders/edge-parsers.js\";\n// react-graph-layers utils\nexport { createGraph } from \"./utils/create-graph.js\";\nexport * from \"./utils/layer-utils.js\";\nexport * from \"./utils/log.js\";\n// deck.gl components\nexport { GraphLayer } from \"./layers/graph-layer.js\";\nexport { EdgeLayer } from \"./layers/edge-layer.js\";\n// DEPRECATED\n/** @deprecated Use EdgeLayer */\nexport { EdgeLayer as CompositeEdgeLayer } from \"./layers/edge-layer.js\";\n", "// deck.gl-community\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\nexport class Cache {\n _keys = new Map();\n /**\n * @param key The key of the cache\n * @returns {*} The value of the cache as set by the `set` method.\n */\n get(key) {\n return this._keys.get(key)?.value;\n }\n /**\n * @param key The key of the cache\n * @param createValue A callback to create the value of the cache if it is needed.\n * @param version The version of the cache. If the version is smaller than the current version, the cache will not be updated.\n */\n set(key, createValue, version) {\n const cached = this._keys.get(key);\n const keyUpdated = cached === undefined || version > cached.version;\n if (!keyUpdated) {\n return;\n }\n this._keys.set(key, { version, value: createValue() });\n }\n}\n", "// deck.gl-community\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\nimport { Cache } from \"./cache.js\";\n// Graph engine controls the graph data and layout calculation\nexport class GraphEngine extends EventTarget {\n _graph;\n _layout;\n _cache = new Cache();\n _layoutDirty = false;\n _transactionInProgress = false;\n constructor(graph, layout) {\n super();\n this._graph = graph;\n this._layout = layout;\n }\n /** Getters */\n getNodes = () => {\n this._updateCache('nodes', () => this._graph.getNodes().filter((node) => this.getNodePosition(node)));\n return this._cache.get('nodes');\n };\n getEdges = () => {\n this._updateCache('edges', () => this._graph.getEdges().filter((edge) => this.getEdgePosition(edge)));\n return this._cache.get('edges');\n };\n getNodePosition = (node) => this._layout.getNodePosition(node);\n getEdgePosition = (edge) => this._layout.getEdgePosition(edge);\n getGraphVersion = () => this._graph.version;\n getLayoutLastUpdate = () => this._layout.version;\n getLayoutState = () => this._layout.state;\n /** Operations on the graph */\n lockNodePosition = (node, x, y) => this._layout.lockNodePosition(node, x, y);\n unlockNodePosition = (node) => this._layout.unlockNodePosition(node);\n /**\n * @fires GraphEngine#onLayoutStart\n */\n _onLayoutStart = () => {\n /**\n * @event GraphEngine#onLayoutStart\n * @type {CustomEvent}\n */\n this.dispatchEvent(new CustomEvent('onLayoutStart'));\n };\n /**\n * @fires GraphEngine#onLayoutChange\n */\n _onLayoutChange = () => {\n /**\n * @event GraphEngine#onLayoutChange\n * @type {CustomEvent}\n */\n this.dispatchEvent(new CustomEvent('onLayoutChange'));\n };\n /**\n * @fires GraphEngine#onLayoutDone\n */\n _onLayoutDone = () => {\n /**\n * @event GraphEngine#onLayoutDone\n * @type {CustomEvent}\n */\n this.dispatchEvent(new CustomEvent('onLayoutDone'));\n };\n /**\n * @fires GraphEngine#onLayoutError\n */\n _onLayoutError = () => {\n /**\n * @event GraphEngine#onLayoutError\n * @type {CustomEvent}\n */\n this.dispatchEvent(new CustomEvent('onLayoutError'));\n };\n _onGraphStructureChanged = (entity) => {\n this._layoutDirty = true;\n this._graphChanged();\n };\n _onTransactionStart = () => {\n this._transactionInProgress = true;\n };\n _onTransactionEnd = () => {\n this._transactionInProgress = false;\n this._graphChanged();\n };\n /** Layout calculations */\n run = () => {\n // TODO: throw if running on a cleared engine\n this._graph.addEventListener('transactionStart', this._onTransactionStart);\n this._graph.addEventListener('transactionEnd', this._onTransactionEnd);\n this._graph.addEventListener('onNodeAdded', this._onGraphStructureChanged);\n this._graph.addEventListener('onNodeRemoved', this._onGraphStructureChanged);\n this._graph.addEventListener('onEdgeAdded', this._onGraphStructureChanged);\n this._graph.addEventListener('onEdgeRemoved', this._onGraphStructureChanged);\n this._layout.addEventListener('onLayoutStart', this._onLayoutStart);\n this._layout.addEventListener('onLayoutChange', this._onLayoutChange);\n this._layout.addEventListener('onLayoutDone', this._onLayoutDone);\n this._layout.addEventListener('onLayoutError', this._onLayoutError);\n this._layout.initializeGraph(this._graph);\n this._layout.start();\n };\n clear = () => {\n this._graph.removeEventListener('transactionStart', this._onTransactionStart);\n this._graph.removeEventListener('transactionEnd', this._onTransactionEnd);\n this._graph.removeEventListener('onNodeAdded', this._onGraphStructureChanged);\n this._graph.removeEventListener('onNodeRemoved', this._onGraphStructureChanged);\n this._graph.removeEventListener('onEdgeAdded', this._onGraphStructureChanged);\n this._graph.removeEventListener('onEdgeRemoved', this._onGraphStructureChanged);\n this._layout.removeEventListener('onLayoutStart', this._onLayoutStart);\n this._layout.removeEventListener('onLayoutChange', this._onLayoutChange);\n this._layout.removeEventListener('onLayoutDone', this._onLayoutDone);\n this._layout.removeEventListener('onLayoutError', this._onLayoutError);\n };\n resume = () => this._layout.resume();\n stop = () => this._layout.stop();\n _graphChanged = () => {\n if (this._layoutDirty && !this._transactionInProgress) {\n this._updateLayout();\n }\n };\n _updateLayout = () => {\n this._layout.updateGraph(this._graph);\n this._layout.update();\n this._layoutDirty = false;\n };\n _updateCache(key, updateValue) {\n this._cache.set(key, updateValue, this._graph.version + this._layout.version);\n }\n}\n", "// deck.gl-community\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\nimport { Log, COLOR } from 'probe.gl';\nexport const log = new Log({ id: 'react-graph-layers' }).enable();\nlog.log({ color: COLOR.CYAN }, 'Initialize react-graph-layers logger.')();\n", "// deck.gl-community\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\nimport { log } from \"../utils/log.js\";\nimport { Cache } from \"./cache.js\";\n// Basic graph data structure\nexport class Graph extends EventTarget {\n /** List object of nodes. */\n _nodeMap = {};\n /** List of object edges. */\n _edgeMap = {};\n /**\n * Identifies whether performing dirty check when streaming new data. If\n * the name of the graph is not specified, will fall back to current time stamp.\n */\n _name = Date.now().toString();\n /** Version the graph. A version is a number that is incremented every time the graph is updated. */\n version = 0;\n /** Cached data: create array data from maps. */\n _cache = new Cache();\n /**\n * The constructor of the Graph class.\n * @param {Object} graph - copy the graph if this exists.\n */\n constructor(graph = null) {\n super();\n // copy the graph if it exists in the parameter\n if (graph) {\n // start copying the graph\n this._nodeMap = graph._nodeMap;\n this._edgeMap = graph._edgeMap;\n this._name = graph && graph._name;\n }\n }\n /**\n * Set graph name\n * @param {string} name\n */\n setGraphName(name) {\n this._name = name;\n }\n /** Get the name of the graph. Default value is the time stamp when creating this graph.\n * @return {string} graph name.\n */\n getGraphName() {\n return this._name.toString();\n }\n /**\n * Perform a batch of operations defined by cb before indicating graph is updated\n * @param {function} cb - a callback fuction containing the operations to perform\n */\n transaction(cb) {\n try {\n this.dispatchEvent(new CustomEvent('transactionStart'));\n return cb();\n }\n finally {\n this.dispatchEvent(new CustomEvent('transactionEnd'));\n }\n }\n /**\n * Add a new node to the graph.\n * @param {Node} node - expect a Node object to be added to the graph.\n */\n addNode(node) {\n // add it to the list and map\n this._nodeMap[node.getId()] = node;\n // update last update time stamp\n this._bumpVersion();\n this.dispatchEvent(new CustomEvent('onNodeAdded', { node }));\n }\n /**\n * Batch add nodes to the graph.\n * @param {Node[]} nodes - a list of nodes to be added.\n */\n batchAddNodes(nodes) {\n // convert an array of objects to an object\n this._nodeMap = nodes.reduce((res, node) => {\n res[node.getId()] = node;\n this.dispatchEvent(new CustomEvent('onNodeAdded', { node }));\n return res;\n }, { ...this._nodeMap });\n this._bumpVersion();\n }\n /**\n * Get all the nodes of the graph.\n * @return {Node[]} - get all the nodes in the graph.\n */\n getNodes() {\n this._updateCache('nodes', () => Object.values(this._nodeMap));\n return this._cache.get('nodes');\n }\n /**\n * Get the node map of the graph. The key of the map is the ID of the nodes.\n * @return {Object} - a map of nodes keyed by node IDs.\n */\n getNodeMap() {\n return this._nodeMap;\n }\n /**\n * Find a node by id\n * @param {String} nodeId The id of the node\n * @return {Object} Node\n */\n findNode(nodeId) {\n return this._nodeMap[nodeId];\n }\n /**\n * Update the indicated node to the provided value\n * @param {Node} node\n */\n updateNode(node) {\n this._nodeMap[node.getId()] = node;\n this._bumpVersion();\n this.dispatchEvent(new CustomEvent('onNodeUpdated', { node }));\n }\n /**\n * Add a new edge to the graph.\n * @param {Edge} edge - expect a Edge object to be added to the graph.\n */\n addEdge(edge) {\n const sourceNode = this.findNode(edge.getSourceNodeId());\n const targetNode = this.findNode(edge.getTargetNodeId());\n if (!sourceNode || !targetNode) {\n log.warn(`Unable to add edge ${edge.id}, source or target node is missing.`)();\n return;\n }\n this._edgeMap[edge.getId()] = edge;\n sourceNode.addConnectedEdges(edge);\n targetNode.addConnectedEdges(edge);\n this._bumpVersion();\n this.dispatchEvent(new CustomEvent('onEdgeAdded', { edge }));\n }\n /**\n * Batch add edges to the graph\n * @param {Edge[]} edges - a list of edges to be added.\n */\n batchAddEdges(edges) {\n edges.forEach((edge) => this.addEdge(edge));\n this._bumpVersion();\n }\n /**\n * Update the indicated edge to the provided value\n * @param {Edge} edge\n */\n updateEdge(edge) {\n this._edgeMap[edge.getId()] = edge;\n this._bumpVersion();\n this.dispatchEvent(new CustomEvent('onEdgeUpdated', { edge }));\n }\n /**\n * Remove a node from the graph by node ID\n * @param {String|Number} nodeId - the ID of the target node.\n */\n removeNode(nodeId) {\n const node = this.findNode(nodeId);\n if (!node) {\n log.warn(`Unable to remove node ${nodeId} - doesn't exist`)();\n return;\n }\n // remove all edges connect to this node from map\n node.getConnectedEdges().forEach((e) => {\n delete this._edgeMap[e.getId()];\n });\n // remove the node from map\n delete this._nodeMap[nodeId];\n this._bumpVersion();\n this.dispatchEvent(new CustomEvent('onNodeRemoved', { node }));\n }\n /**\n * Get all the edges of the graph.\n * @return {Edge[]} get all the edges in the graph.\n */\n getEdges() {\n this._updateCache('edges', () => Object.values(this._edgeMap));\n return this._cache.get('edges');\n }\n /**\n * Get the edge map of the graph. The key of the map is the ID of the edges.\n * @return {Object} - a map of edges keyed by edge IDs.\n */\n getEdgeMap() {\n return this._edgeMap;\n }\n /**\n * Remove an edge from the graph by the edge ID\n * @param {String|Number} edgeId - the target edge ID.\n */\n removeEdge(edgeId) {\n const edge = this.findEdge(edgeId);\n if (!edge) {\n log.warn(`Unable to remove edge ${edgeId} - doesn't exist`)();\n return;\n }\n const sourceNode = this.findNode(edge.getSourceNodeId());\n const targetNode = this.findNode(edge.getTargetNodeId());\n delete this._edgeMap[edgeId];\n sourceNode.removeConnectedEdges(edge);\n targetNode.removeConnectedEdges(edge);\n this._bumpVersion();\n }\n /**\n * Find the edge by edge ID.\n * @param {String|Number} id - the target edge ID\n * @return {Edge} - the target edge.\n */\n findEdge(edgeId) {\n return this._edgeMap[edgeId];\n }\n /**\n * Return all the connected edges of a node by nodeID.\n * @param {String|Number} nodeId - the target node ID\n * @return {Edge[]} - an array of the connected edges.\n */\n getConnectedEdges(nodeId) {\n const node = this.findNode(nodeId);\n if (!node) {\n log.warn(`Unable to find node ${nodeId} - doesn't exist`)();\n return [];\n }\n return node.getConnectedEdges();\n }\n /**\n * Return all the sibling nodes of a node by nodeID.\n * @param {String|Number} nodeId - the target node ID\n * @return {Node[]} - an array of the sibling nodes.\n */\n getNodeSiblings(nodeId) {\n const node = this.findNode(nodeId);\n if (!node) {\n log.warn(`Unable to find node ${nodeId} - doesn't exist`)();\n return [];\n }\n return node.getSiblingIds().map((siblingNodeId) => this.findNode(siblingNodeId));\n }\n /**\n * Get the degree of a node.\n * @param {String|Number} nodeId - the target node ID.\n * @return {Number} - the degree of the node.\n */\n getDegree(nodeId) {\n const node = this.findNode(nodeId);\n if (!node) {\n log.warn(`Unable to find node ${nodeId} - doesn't exist`)();\n return 0;\n }\n return node.getDegree();\n }\n /**\n * Clean up all the nodes in the graph.\n */\n resetNodes() {\n this._nodeMap = {};\n this._bumpVersion();\n }\n /**\n * Clean up all the edges in the graph.\n */\n resetEdges() {\n this._edgeMap = {};\n this._bumpVersion();\n }\n /**\n * Clean up everything in the graph.\n */\n reset() {\n this.resetNodes();\n this.resetEdges();\n this._bumpVersion();\n }\n /**\n * Trigger an update to the graph.\n */\n triggerUpdate() {\n this._bumpVersion();\n }\n /**\n * Return true if the graph is empty.\n * @return {Boolean} Return true if the graph is empty.\n */\n isEmpty() {\n return Object.keys(this._nodeMap).length === 0;\n }\n /**\n * Check the equality of two graphs data by checking last update time stamp\n * @param {Object} g Another graph to be compared against itself\n * @return {Bool} True if the graph is the same as itself.\n */\n equals(g) {\n if (!g || !(g instanceof Graph)) {\n return false;\n }\n return this.version === g.version;\n }\n _bumpVersion() {\n this.version += 1;\n }\n _updateCache(key, updateValue) {\n this._cache.set(key, updateValue, this.version);\n }\n}\n", "// deck.gl-community\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n/* eslint-disable */\nexport const MarkerList = {\n 'bell-filled': 'bell-filled',\n bell: 'bell',\n 'bookmark-filled': 'bookmark-filled',\n bookmark: 'bookmark',\n 'cd-filled': 'cd-filled',\n cd: 'cd',\n checkmark: 'checkmark',\n 'circle-check-filled': 'circle-check-filled',\n 'circle-check': 'circle-check',\n 'circle-filled': 'circle-filled',\n 'circle-i-filled': 'circle-i-filled',\n 'circle-i': 'circle-i',\n 'circle-minus-filled': 'circle-minus-filled',\n 'circle-minus': 'circle-minus',\n 'circle-plus-filled': 'circle-plus-filled',\n 'circle-plus': 'circle-plus',\n 'circle-questionmark-filled': 'circle-questionmark-filled',\n 'circle-questionmark': 'circle-questionmark',\n 'circle-slash-filled': 'circle-slash-filled',\n 'circle-slash': 'circle-slash',\n 'circle-x-filled': 'circle-x-filled',\n 'circle-x': 'circle-x',\n circle: 'circle',\n 'diamond-filled': 'diamond-filled',\n diamond: 'diamond',\n 'flag-filled': 'flag-filled',\n flag: 'flag',\n gear: 'gear',\n 'heart-filled': 'heart-filled',\n heart: 'heart',\n 'location-marker-filled': 'location-marker-filled',\n 'location-marker': 'location-marker',\n 'octagonal-star-filled': 'octagonal-star-filled',\n 'octagonal-star': 'octagonal-star',\n 'person-filled': 'person-filled',\n person: 'person',\n 'pin-filled': 'pin-filled',\n pin: 'pin',\n 'plus-small': 'plus-small',\n plus: 'plus',\n 'rectangle-filled': 'rectangle-filled',\n rectangle: 'rectangle',\n 'star-filled': 'star-filled',\n star: 'star',\n 'tag-filled': 'tag-filled',\n tag: 'tag',\n 'thumb-down-filled': 'thumb-down-filled',\n 'thumb-down': 'thumb-down',\n 'thumb-up': 'thumb-up',\n 'thumb_up-filled': 'thumb_up-filled',\n 'triangle-down-filled': 'triangle-down-filled',\n 'triangle-down': 'triangle-down',\n 'triangle-left-filled': 'triangle-left-filled',\n 'triangle-left': 'triangle-left',\n 'triangle-right-filled': 'triangle-right-filled',\n 'triangle-right': 'triangle-right',\n 'triangle-up-filled': 'triangle-up-filled',\n 'triangle-up': 'triangle-up',\n 'x-small': 'x-small',\n x: 'x'\n};\n/* eslint-enable */\n", "// deck.gl-community\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\nimport { MarkerList } from \"../layers/common-layers/marker-layer/marker-list.js\";\n/** All the markers supported by node type MARKER */\nexport const MARKER_TYPE = MarkerList;\n// the interaction state of a node.\nexport const NODE_STATE = {\n DEFAULT: 'default',\n HOVER: 'hover',\n DRAGGING: 'dragging',\n SELECTED: 'selected'\n};\nexport const EDGE_STATE = {\n DEFAULT: 'default',\n HOVER: 'hover',\n DRAGGING: 'dragging',\n SELECTED: 'selected'\n};\n// node visual marker type\nexport const NODE_TYPE = {\n CIRCLE: 'CIRCLE',\n RECTANGLE: 'RECTANGLE',\n ROUNDED_RECTANGLE: 'ROUNDED_RECTANGLE',\n PATH_ROUNDED_RECTANGLE: 'PATH_ROUNDED_RECTANGLE',\n ICON: 'ICON',\n LABEL: 'LABEL',\n MARKER: 'MARKER'\n};\n// edge shape\nexport const EDGE_TYPE = {\n SPLINE_CURVE: 'SPLINE_CURVE',\n LINE: 'LINE',\n PATH: 'PATH'\n};\n// decorators on edges\nexport const EDGE_DECORATOR_TYPE = {\n LABEL: 'EDGE_LABEL',\n FLOW: 'FLOW'\n};\n// the status of the layout\nexport const LAYOUT_STATE = {\n INIT: 'INIT',\n START: 'START',\n CALCULATING: 'CALCULATING',\n DONE: 'DONE',\n ERROR: 'ERROR'\n};\n", "// deck.gl-community\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\nimport { NODE_STATE } from \"./constants.js\";\n// Basic data structure of a node\nexport class Node {\n id;\n /** Keep a reference to origin data. */\n _data;\n /** List edges. */\n _connectedEdges = {};\n /** Interaction state of the node. */\n state = NODE_STATE.DEFAULT;\n /** Can the node be selected? */\n _selectable;\n /** Should the state of this node affect the state of the connected edges? */\n _highlightConnectedEdges;\n /** Check the type of the object when picking engine gets it. */\n isNode = true;\n /**\n * The constructor of a node\n * @param {String|Number} options.id - the unique ID of the node\n * @param {Record<string, unknown>} options.data - origin data reference\n */\n constructor({ id, selectable = false, highlightConnectedEdges = false, data = {} }) {\n this.id = id;\n this._data = data;\n this._selectable = selectable;\n this._highlightConnectedEdges = highlightConnectedEdges;\n }\n /**\n * Return the ID of the node\n * @return {String|Number} - the ID of the node.\n */\n getId() {\n return this.id;\n }\n /**\n * Return the degree of the node -- includes in-degree and out-degree\n * @return {Number} - the degree of the node.\n */\n getDegree() {\n return Object.keys(this._connectedEdges).length;\n }\n /**\n * Return the in-degree of the node.\n * @return {Number} - the in-degree of the node.\n */\n getInDegree() {\n const nodeId = this.getId();\n return this.getConnectedEdges().reduce((count, e) => {\n const isDirected = e.isDirected();\n if (isDirected && e.getTargetNodeId() === nodeId) {\n count += 1;\n }\n return count;\n }, 0);\n }\n /**\n * Return the out-degree of the node.\n * @return {Number} - the out-degree of the node.\n */\n getOutDegree() {\n const nodeId = this.getId();\n return this.getConnectedEdges().reduce((count, e) => {\n const isDirected = e.isDirected();\n if (isDirected && e.getSourceNodeId() === nodeId) {\n count += 1;\n }\n return count;\n }, 0);\n }\n /**\n * Return all the IDs of the sibling nodes.\n * @return {String[]} [description]\n */\n getSiblingIds() {\n const nodeId = this.getId();\n return this.getConnectedEdges().reduce((siblings, e) => {\n if (e.getTargetNodeId() === nodeId) {\n siblings.push(e.getSourceNodeId());\n }\n else {\n siblings.push(e.getTargetNodeId());\n }\n return siblings;\n }, []);\n }\n /**\n * Return all the connected edges.\n * @return {Object[]} - an array of the connected edges.\n */\n getConnectedEdges() {\n return Object.values(this._connectedEdges);\n }\n /**\n * Return of the value of the selected property key.\n * @param {String} key - property key.\n * @return {Any} - the value of the property or undefined (not found).\n */\n getPropertyValue(key) {\n // try to search the key within this object\n if (this.hasOwnProperty(key)) {\n return this[key];\n }\n // try to search the key in the original data reference\n else if (this._data.hasOwnProperty(key)) {\n return this._data[key];\n }\n // otherwise, not found\n return undefined;\n }\n /**\n * Set the new node data.\n * @param {Record<string, unknown>} data - the new data of the node\n */\n setData(data) {\n this._data = data;\n }\n /**\n * Update a data property.\n * @param {String} key - the key of the property\n * @param {Any} value - the value of the property.\n */\n setDataProperty(key, value) {\n this._data[key] = value;\n }\n /**\n * Set node state\n * @param {String} state - one of NODE_STATE\n */\n setState(state) {\n this.state = state;\n }\n /**\n * Get node state\n * @returns {string} state - one of NODE_STATE\n */\n getState() {\n return this.state;\n }\n /**\n * Add connected edges to the node\n * @param {Edge || Edge[]} edge an edge or an array of edges to be added to this._connectedEdges\n */\n addConnectedEdges(edge) {\n const iterableEdges = Array.isArray(edge) ? edge : [edge];\n iterableEdges.forEach((e) => {\n this._connectedEdges[e.id] = e;\n e.addNode(this);\n });\n }\n /**\n * Remove edges from this._connectedEdges\n * @param {Edge | Edge[]} edge an edge or an array of edges to be removed from this._connectedEdges\n */\n removeConnectedEdges(edge) {\n const iterableEdges = Array.isArray(edge) ? edge : [edge];\n iterableEdges.forEach((e) => {\n e.removeNode(this);\n delete this._connectedEdges[e.id];\n });\n }\n /**\n * Clear this._connectedEdges\n */\n clearConnectedEdges() {\n Object.values(this._connectedEdges).forEach((e) => e.removeNode(this));\n this._connectedEdges = {};\n }\n isSelectable() {\n return this._selectable;\n }\n shouldHighlightConnectedEdges() {\n return this._highlightConnectedEdges;\n }\n}\n", "// deck.gl-community\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n// Basic data structure of an edge\nimport { EDGE_STATE } from \"./constants.js\";\nexport class Edge {\n /** Unique uuid of the edge. */\n id;\n /** ID of the source node. */\n _sourceId;\n /** ID of the target node. */\n _targetId;\n /** Whether the edge is directed or not. */\n _directed;\n /** Origin data reference of the edge. */\n _data;\n /** Check the type of the object when picking engine gets it. */\n isEdge = true;\n /** Nodes at either end of this edge. */\n _connectedNodes = {};\n /** Edge state. */\n state = EDGE_STATE.DEFAULT;\n /**\n * The constructor\n * @param {String|Number} options.id - the unique ID of the edge\n * @param {String|Number} options.sourceId - the ID of the source node\n * @param {String|Number} options.targetId - the ID of the target node\n * @param {Boolean} options.directed - whether the edge is directed or not\n * @param {Record<string, unknown>} options.data - origin data reference\n */\n constructor({ id, sourceId, targetId, data, directed = false }) {\n this.id = id;\n this._sourceId = sourceId;\n this._targetId = targetId;\n this._directed = directed;\n this._data = data;\n }\n /**\n * Return the ID of the edge\n * @return {String|Number} - the ID of the edge.\n */\n getId() {\n return this.id;\n }\n /**\n * Return whether the edge is directed or not.\n * @return {Boolean} true if the edge is directed.\n */\n isDirected() {\n return this._directed;\n }\n /**\n * Get the ID of the source node.\n * @return {String|Number} the ID of the source node.\n */\n getSourceNodeId() {\n return this._sourceId;\n }\n /**\n * Get the ID of the target node.\n * @return {String|Number} the ID of the target node.\n */\n getTargetNodeId() {\n return this._targetId;\n }\n /**\n * Return of the value of the selected property key.\n * @param {String} key - property key.\n * @return {Any} - the value of the property.\n */\n getPropertyValue(key) {\n // try to search the key within this object\n if (this.hasOwnProperty(key)) {\n return this[key];\n }\n // try to search the key in the original data reference\n else if (this._data.hasOwnProperty(key)) {\n return this._data[key];\n }\n // otherwise, not found\n return undefined;\n }\n /**\n * Set the origin data as a reference.\n * @param {Object} data - the origin data.\n */\n setData(data) {\n this._data = data;\n }\n /**\n * Update a data property.\n * @param {String} key - the key of the property\n * @param {Any} value - the value of the property.\n */\n setDataProperty(key, value) {\n this._data[key] = value;\n }\n /**\n * Set edge state\n * @param {String} state - one of EDGE_STATE\n */\n setState(state) {\n this.state = state;\n }\n /**\n * Get edge state\n * @returns {string} state - one of EDGE_STATE\n */\n getState() {\n return this.state;\n }\n addNode(node) {\n this._connectedNodes[node.getId()] = node;\n }\n removeNode(node) {\n delete this._connectedNodes[node.getId()];\n }\n getConnectedNodes() {\n return Object.values(this._connectedNodes);\n }\n}\n", "// deck.gl-community\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\nimport isEqual from 'lodash.isequal';\nimport { EDGE_TYPE, LAYOUT_STATE } from \"./constants.js\";\n/**\n * All the layout classes are extended from this base layout class.\n */\nexport class BaseLayout extends EventTarget {\n /** Name of the layout. */\n _name = 'BaseLayout';\n /** Extra configuration options of the layout. */\n _options;\n version = 0;\n state = LAYOUT_STATE.INIT;\n /**\n * Constructor of BaseLayout\n * @param {Object} options extra configuration options of the layout\n */\n constructor(options = {}) {\n super();\n this._options = options;\n }\n /**\n * @fires BaseLayout#onLayoutStart\n * @protected\n */\n _onLayoutStart() {\n this._updateState(LAYOUT_STATE.CALCULATING);\n /**\n * Layout calculation start.\n *\n * @event BaseLayout#onLayoutChange\n * @type {CustomEvent}\n */\n this.dispatchEvent(new CustomEvent('onLayoutStart'));\n }\n /**\n * @fires BaseLayout#onLayoutChange\n * @protected\n */\n _onLayoutChange() {\n this._updateState(LAYOUT_STATE.CALCULATING);\n /**\n * Layout calculation iteration.\n *\n * @event BaseLayout#onLayoutChange\n * @type {CustomEvent}\n */\n this.dispatchEvent(new CustomEvent('onLayoutChange'));\n }\n /**\n * @fires BaseLayout#onLayoutDone\n * @protected\n */\n _onLayoutDone() {\n this._updateState(LAYOUT_STATE.DONE);\n /**\n * Layout calculation is done.\n *\n * @event BaseLayout#onLayoutDone\n * @type {CustomEvent}\n */\n this.dispatchEvent(new CustomEvent('onLayoutDone'));\n }\n /**\n * @fires BaseLayout#onLayoutError\n * @protected\n */\n _onLayoutError() {\n this._updateState(LAYOUT_STATE.ERROR);\n /**\n * Layout calculation went wrong.\n *\n * @event BaseLayout#onLayoutError\n * @type {CustomEvent}\n */\n this.dispatchEvent(new CustomEvent('onLayoutError'));\n }\n /**\n * Check the equality of two layouts\n * @param {Object} layout The layout to be compared.\n * @return {Bool} True if the layout is the same as itself.\n */\n equals(layout) {\n if (!layout || !(layout instanceof BaseLayout)) {\n return false;\n }\n return this._name === layout._name && isEqual(this._options, layout._options);\n }\n /** virtual functions: will be implemented in the child class */\n // first time to pass the graph data into this layout\n initializeGraph(graph) { }\n // update the existing graph\n updateGraph(graph) { }\n // start the layout calculation\n start() { }\n // update the layout calculation\n update() { }\n // resume the layout calculation\n resume() { }\n // stop the layout calculation\n stop() { }\n // access the position of the node in the layout\n getNodePosition(node) {\n return [0, 0];\n }\n // access the layout information of the edge\n getEdgePosition(edge) {\n return {\n type: EDGE_TYPE.LINE,\n sourcePosition: [0, 0],\n targetPosition: [0, 0],\n controlPoints: []\n };\n }\n /**\n * Pin the node to a designated position, and the node won't move anymore\n * @param {Object} node Node to be locked\n * @param {Number} x x coordinate\n * @param {Number} y y coordinate\n */\n lockNodePosition(node, x, y) { }\n /**\n * Unlock the node, the node will be able to move freely.\n * @param {Object} node Node to be unlocked\n */\n unlockNodePosition(node) { }\n _updateState(state) {\n this.state = state;\n this.version += 1;\n }\n}\n", "// deck.gl-community\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\nimport { BaseLayout } from \"../../core/base-layout.js\";\nimport { EDGE_TYPE } from \"../../core/constants.js\";\nconst defaultOptions = {\n alpha: 0.3,\n resumeAlpha: 0.1,\n nBodyStrength: -900,\n nBodyDistanceMin: 100,\n nBodyDistanceMax: 400,\n getCollisionRadius: 0\n};\nexport class D3ForceLayout extends BaseLayout {\n _name = 'D3';\n _positionsByNodeId = new Map();\n _graph;\n _worker;\n constructor(options) {\n super(options);\n this._options = {\n ...defaultOptions,\n ...options\n };\n }\n initializeGraph(graph) {\n this._graph = graph;\n }\n // for streaming new data on the same graph\n updateGraph(graph) {\n this._graph = graph;\n this._positionsByNodeId = new Map(this._graph.getNodes().map((node) => [node.id, this._positionsByNodeId.get(node.id)]));\n }\n start() {\n this._engageWorker();\n this._onLayoutStart();\n }\n update() {\n this._engageWorker();\n }\n _engageWorker() {\n // prevent multiple start\n if (this._worker) {\n this._worker.terminate();\n }\n this._worker = new Worker(new URL('./worker.js', import.meta.url).href);\n this._worker.postMessage({\n nodes: this._graph.getNodes().map((node) => ({\n id: node.id,\n ...this._positionsByNodeId.get(node.id)\n })),\n edges: this._graph.getEdges().map((edge) => ({\n id: edge.id,\n source: edge.getSourceNodeId(),\n target: edge.getTargetNodeId()\n })),\n options: this._options\n });\n this._worker.onmessage = (event) => {\n if (event.data.type !== 'end') {\n return;\n }\n event.data.nodes.forEach(({ id, ...d3 }) => this._positionsByNodeId.set(id, {\n ...d3,\n // precompute so that when we return the node position we do not need to do the conversion\n coordinates: [d3.x, d3.y]\n }));\n this._onLayoutChange();\n this._onLayoutDone();\n };\n }\n resume() {\n throw new Error('Resume unavailable');\n }\n stop() {\n this._worker.terminate();\n }\n getEdgePosition = (edge) => {\n const sourceNode = this._graph.findNode(edge.getSourceNodeId());\n const targetNode = this._graph.findNode(edge.getTargetNodeId());\n if (!this.getNodePosition(sourceNode) || !this.getNodePosition(targetNode)) {\n return null;\n }\n return {\n type: EDGE_TYPE.LINE,\n sourcePosition: this.getNodePosition(sourceNode),\n targetPosition: this.getNodePosition(targetNode),\n controlPoints: []\n };\n };\n getNodePosition = (node) => {\n const d3Node = this._positionsByNodeId.get(node.id);\n if (d3Node) {\n return d3Node.coordinates;\n }\n return null;\n };\n lockNodePosition = (node, x, y) => {\n const d3Node = this._positionsByNodeId.get(node.id);\n this._positionsByNodeId.set(node.id, {\n ...d3Node,\n x,\n y,\n fx: x,\n fy: y,\n coordinates: [x, y]\n });\n this._onLayoutChange();\n this._onLayoutDone();\n };\n unlockNodePosition = (node) => {\n const d3Node = this._positionsByNodeId.get(node.id);\n d3Node.fx = null;\n d3Node.fy = null;\n };\n}\n", "// deck.gl-community\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\nimport { BaseLayout } from \"../../core/base-layout.js\";\nimport { EDGE_TYPE } from \"../../core/constants.js\";\nconst defaultOptions = {\n alpha: 0.3,\n resumeAlpha: 0.1,\n nBodyStrength: -900,\n nBodyDistanceMin: 100,\n nBodyDistanceMax: 400,\n getCollisionRadius: 0\n};\n// TODO: this layout should be updated with the organizational and logic improvements made in d3-force\nexport class GPUForceLayout extends BaseLayout {\n _name = 'GPU';\n _d3Graph;\n _nodeMap;\n _edgeMap;\n _graph;\n _worker;\n _callbacks;\n constructor(options) {\n super(options);\n this._name = 'GPU';\n this._options = {\n ...defaultOptions,\n ...options\n };\n // store graph and prepare internal data\n this._d3Graph = { nodes: [], edges: [] };\n this._nodeMap = {};\n this._edgeMap = {};\n }\n initializeGraph(graph) {\n this._graph = graph;\n this._nodeMap = {};\n this._edgeMap = {};\n // nodes\n const d3Nodes = graph.getNodes().map((node) => {\n const id = node.id;\n const locked = node.getPropertyValue('locked') || false;\n const x = node.getPropertyValue('x') || 0;\n const y = node.getPropertyValue('y') || 0;\n const collisionRadius = node.getPropertyValue('collisionRadius') || 0;\n const d3Node = {\n id,\n x,\n y,\n fx: locked ? x : null,\n fy: locked ? y : null,\n collisionRadius,\n locked\n };\n this._nodeMap[node.id] = d3Node;\n return d3Node;\n });\n // edges\n const d3Edges = graph.getEdges().map((edge) => {\n const d3Edge = {\n id: edge.id,\n source: this._nodeMap[edge.getSourceNodeId()],\n target: this._nodeMap[edge.getTargetNodeId()]\n };\n this._edgeMap[edge.id] = d3Edge;\n return d3Edge;\n });\n this._d3Graph = {\n nodes: d3Nodes,\n edges: d3Edges\n };\n }\n start() {\n this._engageWorker();\n }\n update() {\n this._engageWorker();\n }\n _engageWorker() {\n // prevent multiple start\n if (this._worker) {\n this._worker.terminate();\n }\n this._worker = new Worker(new URL('./worker.js', import.meta.url).href);\n const { alpha, nBodyStrength, nBodyDistanceMin, nBodyDistanceMax, getCollisionRadius } = this\n ._options;\n this._worker.postMessage({\n nodes: this._d3Graph.nodes,\n edges: this._d3Graph.edges,\n options: {\n alpha,\n nBodyStrength,\n nBodyDistanceMin,\n nBodyDistanceMax,\n getCollisionRadius\n }\n });\n this._worker.onmessage = (event) => {\n switch (event.data.type) {\n case 'tick':\n this.ticked(event.data);\n break;\n case 'end':\n this.ended(event.data);\n break;\n default:\n break;\n }\n };\n }\n ticked(data) { }\n ended(data) {\n const { nodes, edges } = data;\n this.updateD3Graph({ nodes, edges });\n this._onLayoutChange();\n this._onLayoutDone();\n }\n resume() {\n throw new Error('Resume unavailable');\n }\n stop() {\n this._worker.terminate();\n }\n // for steaming new data on the same graph\n updateGraph(graph) {\n if (this._graph.getGraphName() !== graph.getGraphName()) {\n // reset the maps\n this._nodeMap = {};\n this._edgeMap = {};\n }\n this._graph = graph;\n // update internal layout data\n // nodes\n const newNodeMap = {};\n const newD3Nodes = graph.getNodes().map((node) => {\n const id = node.id;\n const locked = node.getPropertyValue('locked') || false;\n const x = node.getPropertyValue('x') || 0;\n const y = node.getPropertyValue('y') || 0;\n const fx = locked ? x : null;\n const fy = locked ? y : null;\n const collisionRadius = node.getPropertyValue('collisionRadius') || 0;\n const oldD3Node = this._nodeMap[node.id];\n const newD3Node = oldD3Node ? oldD3Node : { id, x, y, fx, fy, collisionRadius };\n newNodeMap[node.id] = newD3Node;\n return newD3Node;\n });\n this._nodeMap = newNodeMap;\n this._d3Graph.nodes = newD3Nodes;\n // edges\n const newEdgeMap = {};\n const newD3Edges = graph.getEdges().map((edge) => {\n const oldD3Edge = this._edgeMap[edge.id];\n const newD3Edge = oldD3Edge || {\n id: edge.id,\n source: newNodeMap[edge.getSourceNodeId()],\n target: newNodeMap[edge.getTargetNodeId()]\n };\n newEdgeMap[edge.id] = newD3Edge;\n return newD3Edge;\n });\n this._edgeMap = newEdgeMap;\n this._d3Graph.edges = newD3Edges;\n }\n updateD3Graph(graph) {\n const existingNodes = this._graph.getNodes();\n // update internal layout data\n // nodes\n const newNodeMap = {};\n const newD3Nodes = graph.nodes.map((node) => {\n // Update existing _graph with the new values\n const existingNode = existingNodes.find((n) => n.getId() === node.id);\n existingNode.setDataProperty('locked', node.locked);\n existingNode.setDataProperty('x', node.x);\n existingNode.setDataProperty('y', node.y);\n existingNode.setDataProperty('collisionRadius', node.collisionRadius);\n newNodeMap[node.id] = node;\n return node;\n });\n this._nodeMap = newNodeMap;\n this._d3Graph.nodes = newD3Nodes;\n // edges\n const newEdgeMap = {};\n const newD3Edges = graph.edges.map((edge) => {\n newEdgeMap[edge.id] = edge;\n return edge;\n });\n this._graph.triggerUpdate();\n this._edgeMap = newEdgeMap;\n this._d3Graph.edges = newD3Edges;\n }\n getNodePosition = (node) => {\n const d3Node = this._nodeMap[node.id];\n if (d3Node) {\n return [d3Node.x, d3Node.y];\n }\n return [0, 0];\n };\n getEdgePosition = (edge) => {\n const d3Edge = this._edgeMap[edge.id];\n const sourcePosition = d3Edge && d3Edge.source;\n const targetPosition = d3Edge && d3Edge.target;\n if (d3Edge && sourcePosition && targetPosition) {\n return {\n type: EDGE_TYPE.LINE,\n sourcePosition: [sourcePosition.x, sourcePosition.y],\n targetPosition: [targetPosition.x, targetPosition.y],\n controlPoints: []\n };\n }\n return {\n type: EDGE_TYPE.LINE,\n sourcePosition: [0, 0],\n targetPosition: [0, 0],\n controlPoints: []\n };\n };\n lockNodePosition = (node, x, y) => {\n const d3Node = this._nodeMap[node.id];\n d3Node.x = x;\n d3Node.y = y;\n d3Node.fx = x;\n d3Node.fy = y;\n this._callbacks.onLayoutChange();\n this._callbacks.onLayoutDone();\n };\n unlockNodePosition = (node) => {\n const d3Node = this._nodeMap[node.id];\n d3Node.fx = null;\n d3Node.fy = null;\n };\n}\n", "// deck.gl-community\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\nimport { BaseLayout } from \"../../core/base-layout.js\";\nimport { EDGE_TYPE } from \"../../core/constants.js\";\nconst defaultOptions = {\n nodePositionAccessor: (node) => [node.getPropertyValue('x'), node.getPropertyValue('y')]\n};\nexport class SimpleLayout extends BaseLayout {\n _name = 'SimpleLayout';\n _graph = null;\n _nodeMap = {};\n _nodePositionMap = {};\n constructor(options = {}) {\n super({ ...defaultOptions, ...options });\n }\n initializeGraph(graph) {\n this.updateGraph(graph);\n }\n _notifyLayoutComplete() {\n this._onLayoutStart();\n this._onLayoutChange();\n this._onLayoutDone();\n }\n start() {\n this._notifyLayoutComplete();\n }\n update() {\n this._notifyLayoutComplete();\n }\n resume() {\n this._notifyLayoutComplete();\n }\n updateGraph(graph) {\n this._graph = graph;\n this._nodeMap = graph.getNodes().reduce((res, node) => {\n res[node.getId()] = node;\n return res;\n }, {});\n this._nodePositionMap = graph.getNodes().reduce((res, node) => {\n res[node.getId()] = this._options.nodePositionAccessor(node);\n return res;\n }, {});\n }\n setNodePositionAccessor = (accessor) => {\n this._options.nodePositionAccessor = accessor;\n };\n getNodePosition = (node) => this._nodePositionMap[node.getId()];\n getEdgePosition = (edge) => {\n const sourcePos = this._nodePositionMap[edge.getSourceNodeId()];\n const targetPos = this._nodePositionMap[edge.getTargetNodeId()];\n return {\n type: EDGE_TYPE.LINE,\n sourcePosition: sourcePos,\n targetPosition: targetPos,\n controlPoints: []\n };\n };\n lockNodePosition = (node, x, y) => {\n this._nodePositionMap[node.getId()] = [x, y];\n this._onLayoutChange();\n this._onLayoutDone();\n };\n}\n", "// deck.gl-community\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\nimport { Edge } from \"../core/edge.js\";\nimport { Node } from \"../core/node.js\";\nimport { Graph } from \"../core/graph.js\";\nexport function createGraph({ name, nodes, edges, nodeParser, edgeParser }) {\n // create a new empty graph\n const graph = new Graph();\n const graphName = name || Date.now();\n graph.setGraphName(graphName);\n // add nodes\n const glNodes = nodes.map((node) => {\n const { id } = nodeParser(node);\n return new Node({\n id,\n data: node\n });\n });\n graph.batchAddNodes(glNodes);\n const glEdges = edges.map((edge) => {\n const { id, sourceId, targetId, directed } = edgeParser(edge);\n return new Edge({\n id,\n sourceId,\n targetId,\n directed,\n data: edge\n });\n });\n graph.batchAddEdges(glEdges);\n return graph;\n}\n", "// deck.gl-community\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\nimport { log } from \"../utils/log.js\";\nexport function basicNodeParser(node) {\n if (node.id === undefined) {\n log.error('Invalid node: id is missing.')();\n return null;\n }\n return { id: node.id };\n}\n", "// deck.gl-community\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\nimport { log } from \"../utils/log.js\";\nexport function basicEdgeParser(edge) {\n const { id, directed, sourceId, targetId } = edge;\n if (sourceId === undefined || targetId === undefined) {\n log.error('Invalid edge: sourceId or targetId is missing.')();\n return null;\n }\n return {\n id,\n directed: directed || false,\n sourceId,\n targetId\n };\n}\n", "// deck.gl-community\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\nimport { createGraph } from \"../utils/create-graph.js\";\nimport { basicNodeParser } from \"./node-parsers.js\";\nimport { basicEdgeParser } from \"./edge-parsers.js\";\nimport { log } from \"../utils/log.js\";\nexport const JSONLoader = ({ json, nodeParser = basicNodeParser, edgeParser = basicEdgeParser }) => {\n const { name = 'default', nodes, edges } = json;\n if (!nodes) {\n log.error('Invalid graph: nodes is missing.')();\n return null;\n }\n const graph = createGraph({ name, nodes, edges, nodeParser, edgeParser });\n return graph;\n};\n", "// deck.gl-community\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\nexport const mixedGetPosition = (getPosition, getOffset) => {\n if (!getOffset) {\n return getPosition;\n }\n if (typeof getOffset === 'function') {\n return (d) => {\n const [x, y] = getPosition(d);\n const [offX, offY] = getOffset(d);\n return [x + offX, y + offY];\n };\n }\n const [offX, offY] = getOffset;\n return (d) => {\n const [x, y] = getPosition(d);\n return [x + offX, y + offY];\n };\n};\n", "// deck.gl-community\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\nimport { COORDINATE_SYSTEM, CompositeLayer } from '@deck.gl/core';\nimport { Stylesheet } from \"../style/style-sheet.js\";\nimport { NODE_TYPE, EDGE_DECORATOR_TYPE } from \"../core/constants.js\";\nimport { mixedGetPosition } from \"../utils/layer-utils.js\";\nimport { InteractionManager } from \"../core/interaction-manager.js\";\nimport { log } from \"../utils/log.js\";\n// node layers\nimport { CircleLayer } from \"./node-layers/circle-layer.js\";\nimport { ImageLayer } from \"./node-layers/image-layer.js\";\nimport { LabelLayer } from \"./node-layers/label-layer.js\";\nimport { RectangleLayer } from \"./node-layers/rectangle-layer.js\";\nimport { RoundedRectangleLayer } from \"./node-layers/rounded-rectangle-layer.js\";\nimport { PathBasedRoundedRectangleLayer } from \"./node-layers/path-rounded-rectange-layer.js\";\nimport { ZoomableMarkerLayer } from \"./node-layers/zoomable-marker-layer.js\";\n// edge layers\nimport { EdgeLayer } from \"./edge-layer.js\";\nimport { EdgeLabelLayer } from \"./edge-layers/edge-label-layer.js\";\nimport { FlowLayer } from \"./edge-layers/flow-layer.js\";\nconst NODE_LAYER_MAP = {\n [NODE_TYPE.RECTANGLE]: RectangleLayer,\n [NODE_TYPE.ROUNDED_RECTANGLE]: RoundedRectangleLayer,\n [NODE_TYPE.PATH_ROUNDED_RECTANGLE]: PathBasedRoundedRectangleLayer,\n [NODE_TYPE.ICON]: ImageLayer,\n [NODE_TYPE.CIRCLE]: CircleLayer,\n [NODE_TYPE.LABEL]: LabelLayer,\n [NODE_TYPE.MARKER]: ZoomableMarkerLayer\n};\nconst EDGE_DECORATOR_LAYER_MAP = {\n [EDGE_DECORATOR_TYPE.LABEL]: EdgeLabelLayer,\n [EDGE_DECORATOR_TYPE.FLOW]: FlowLayer\n};\nconst SHARED_LAYER_PROPS = {\n coordinateSystem: COORDINATE_SYSTEM.CARTESIAN,\n parameters: {\n depthTest: false\n }\n};\nconst defaultProps = {\n // an array of styles for layers\n nodeStyle: [],\n nodeEvents: {\n onMouseLeave: () => { },\n onHover: () => { },\n onMouseEnter: () => { },\n onClick: () => { },\n onDrag: () => { }\n },\n edgeStyle: {\n color: 'black',\n strokeWidth: 1,\n // an array of styles for layers\n decorators: []\n },\n edgeEvents: {\n onClick: () => { },\n onHover: () => { }\n },\n enableDragging: false\n};\nexport class GraphLayer extends CompositeLayer {\n static defaultProps = {\n pickable: true\n };\n forceUpdate = () => {\n if (this.context && this.context.layerManager) {\n this.setNeedsUpdate();\n this.setChangeFlags({ dataChanged: true }); // TODO\n }\n };\n constructor(props) {\n super(props);\n // added or removed a node, or in general something layout related changed\n props.engine.addEventListener('onLayoutChange', this.forceUpdate);\n }\n initializeState() {\n const interactionManager = new InteractionManager(this.props, () => this.forceUpdate());\n this.state = { interactionManager };\n }\n shouldUpdateState({ changeFlags }) {\n return changeFlags.dataChanged || changeFlags.propsChanged;\n }\n updateState({ props }) {\n this.state.interactionManager.updateProps(props);\n }\n finalize() {\n this.props.engine.removeEventListener('onLayoutChange', this.forceUpdate);\n }\n createNodeLayers() {\n const { engine, nodeStyle } = this.props;\n if (!nodeStyle || !Array.isArray(nodeStyle) || nodeStyle.length === 0) {\n return [];\n }\n return nodeStyle.filter(Boolean).map((style, idx) => {\n const { pickable = true, visible = true, data = (nodes) => nodes, ...restStyle } = style;\n const LayerType = NODE_LAYER_MAP[style.type];\n if (!LayerType) {\n log.error(`Invalid node type: ${style.type}`)();\n throw new Error(`Invalid node type: ${style.type}`);\n }\n const stylesheet = new Stylesheet(restStyle, {\n stateUpdateTrigger: this.state.interactionManager.getLastInteraction()\n });\n const getOffset = stylesheet.getDeckGLAccessor('getOffset');\n return new LayerType({\n ...SHARED_LAYER_PROPS,\n id: `node-rule-${idx}`,\n data: data(engine.getNodes()),\n getPosition: mixedGetPosition(engine.getNodePosition, getOffset),\n pickable,\n positionUpdateTrigger: [\n engine.getLayoutLastUpdate(),\n engine.getLayoutState(),\n stylesheet.getDeckGLAccessorUpdateTrigger('getOffset')\n ].join(),\n stylesheet,\n visible\n });\n });\n }\n createEdgeLayers() {\n const { edgeStyle, engine } = this.props;\n if (!edgeStyle) {\n return [];\n }\n return (Array.isArray(edgeStyle) ? edgeStyle : [edgeStyle])\n .filter(Boolean)\n .flatMap((style, idx) => {\n const { decorators, data = (edges) => edges, visible = true, ...restEdgeStyle } = style;\n const stylesheet = new Stylesheet({\n type: 'Edge',\n ...restEdgeStyle\n }, {\n stateUpdateTrigger: this.state.interactionManager.getLastInteraction()\n });\n const edgeLayer = new EdgeLayer({\n ...SHARED_LAYER_PROPS,\n id: `edge-layer-${idx}`,\n data: data(engine.getEdges()),\n getLayoutInfo: engine.getEdgePosition,\n pickable: true,\n positionUpdateTrigger: [engine.getLayoutLastUpdate(), engine.getLayoutState()].join(),\n stylesheet,\n visible\n });\n if (!decorators || !Array.isArray(decorators) || decorators.length === 0) {\n return edgeLayer;\n }\n const decoratorLayers = decorators.filter(Boolean).flatMap((decoratorStyle, idx2) => {\n const DecoratorLayer = EDGE_DECORATOR_LAYER_MAP[decoratorStyle.type];\n if (!DecoratorLayer) {\n log.error(`Invalid edge decorator type: ${decoratorStyle.type}`)();\n throw new Error(`Invalid edge decorator type: ${decoratorStyle.type}`);\n }\n const decoratorStylesheet = new Stylesheet(decoratorStyle, {\n stateUpdateTrigger: this.state.interactionManager.getLastInteraction()\n });\n return new DecoratorLayer({\n ...SHARED_LAYER_PROPS,\n id: `edge-decorator-${idx2}`,\n data: data(engine.getEdges()),\n getLayoutInfo: engine.getEdgePosition,\n pickable: true,\n positionUpdateTrigger: [engine.getLayoutLastUpdate(), engine.getLayoutState()].join(),\n stylesheet: decoratorStylesheet\n });\n });\n return [edgeLayer, decoratorLayers];\n });\n }\n onClick(info, event) {\n return this.state.interactionManager.onClick(info, event) || false;\n }\n onHover(info, event) {\n return this.state.interactionManager.onHover(info, event) || false;\n }\n onDragStart(info, event) {\n this.state.interactionManager.onDragStart(info, event);\n }\n onDrag(info, event) {\n this.state.interactionManager.onDrag(info, event);\n }\n onDragEnd(info, event) {\n this.state.interactionManager.onDragEnd(info, event);\n }\n renderLayers() {\n return [this.createEdgeLayers(), this.createNodeLayers()];\n }\n}\nGraphLayer.layerName = 'GraphLayer';\nGraphLayer.defaultProps = defaultProps;\n", "// deck.gl-community\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\nimport Color from 'color';\nimport { log } from \"../utils/log.js\";\n/* Utils for type check */\nfunction getColor(value) {\n if (typeof value === 'string') {\n try {\n const color = Color.rgb(value).array();\n if (Number.isFinite(color[3])) {\n color[3] *= 255;\n }\n return color;\n }\n catch (error) {\n return [0, 0, 0];\n }\n }\n if (Array.isArray(value) && Number.isFinite(value[0])) {\n return value;\n }\n return [0, 0, 0];\n}\nfunction getNumber(value) {\n switch (typeof value) {\n case 'string':\n value = Number(value);\n return isNaN(value) ? null : value;\n case 'number':\n return value;\n default:\n return null;\n }\n}\nfunction getBool(value) {\n switch (typeof value) {\n case 'boolean':\n return value;\n case 'string':\n return value.toLowerCase() !== 'false';\n case 'number':\n return Boolean(value);\n default:\n return null;\n }\n}\nfunction getOffset(value) {\n if (typeof value === 'function') {\n return value;\n }\n if (!Array.isArray(value) || value.length !== 2) {\n return null;\n }\n return value.map(getNumber);\n}\nconst IDENTITY = (x) => x;\nconst PROPERTY_FORMATTERS = {\n opacity: getNumber,\n zIndex: getNumber,\n width: getNumber,\n height: getNumber,\n radius: getNumber,\n fill: getColor,\n stroke: getColor,\n strokeWidth: getNumber,\n // for marker\n marker: String,\n size: getNumber,\n // text\n color: getColor,\n text: String,\n fontSize: getNumber,\n textAnchor: String,\n alignmentBaseline: String,\n angle: getNumber,\n textMaxWidth: getNumber,\n textWordBreak: String,\n textSizeMinPixels: getNumber,\n // edges\n speed: getNumber,\n tailLength: getNumber,\n offset: getOffset,\n scaleWithZoom: getBool\n};\nconst DEFAULT_STYLES = {\n opacity: 1,\n zIndex: 0,\n width: 0,\n height: 0,\n radius: 1,\n fill: [0, 0, 0],\n stroke: [0, 0, 0],\n strokeWidth: 0,\n marker: 'circle',\n size: 12,\n color: [0, 0, 0],\n text: '',\n fontSize: 12,\n textAnchor: 'middle',\n alignmentBaseline: 'center',\n angle: 0,\n textMaxWidth: -1,\n textWordBreak: 'break-all',\n textSizeMinPixels: 9,\n speed: 0,\n tailLength: 1,\n offset: null,\n scaleWithZoom: true\n};\n// code generation: generate a function as a layer accessor\nfunction generateAccessor(key, value) {\n const formatter = PROPERTY_FORMATTERS[key] || IDENTITY;\n // ex: key = 'fill', value = {defaut: 'red', hover: 'blue'}\n // valueMap => {defaut: [255, 0, 0], hover: [0, 0, 255]}\n const valueMap = Object.keys(value).reduce((res, key0) => {\n res[key0] = value[key0];\n return res;\n }, {});\n return (node) => {\n const statefulValue = valueMap[node.state];\n if (!node.state || typeof statefulValue === 'undefined') {\n return valueMap.default || DEFAULT_STYLES[key];\n }\n // else has stateful value\n // check if the value is a function\n if (typeof statefulValue === 'function') {\n return formatter(statefulValue(node));\n }\n // or just a plain value\n return formatter(statefulValue);\n };\n}\nconst VALUE_TYPE = {\n ACCESSOR: 'ACCESSOR',\n PLAIN_VALUE: 'PLAIN_VALUE'\n};\nexport class StyleProperty {\n key;\n _updateTrigger;\n _value;\n _valueType;\n // for getting default style\n static getDefault(key) {\n return DEFAULT_STYLES[key];\n }\n // pass the key and value of the property\n // and format the value properly.\n constructor({ key, value, updateTrigger }) {\n this.key = key;\n this._updateTrigger = false;\n // statefule property, ex:\n // fill: {default: 'red', hover: 'blue'}\n // note that offset: [0, 1], the type of array is object, too.\n if (typeof value === 'object' && !Array.isArray(value)) {\n // generate accessor function\n this._value = generateAccessor(key, value);\n this._valueType = VALUE_TYPE.ACCESSOR;\n this._updateTrigger = updateTrigger;\n }\n // default state property, but value = accessor\n // fill: () => 'red'\n else if (typeof value === 'function') {\n const formatter = PROPERTY_FORMATTERS[key] || IDENTITY;\n // the output of the function should be formated by\n // the corresponding formatter again.\n // Ex: colorAccessor might return '#f00', which needs to\n // be formated as [255, 0, 0];\n this._value = (d) => formatter(value(d));\n this._valueType = VALUE_TYPE.ACCESSOR;\n this._updateTrigger = value;\n }\n // default state property with plain value:\n // fill: 'red'\n else {\n // format the value properly\n const formatter = PROPERTY_FORMATTERS[key] || IDENTITY;\n this._value = formatter(value);\n this._valueType = VALUE_TYPE.PLAIN_VALUE;\n this._updateTrigger = false;\n }\n // sanity check\n if (this._value === null) {\n log.warn(`Invalid ${key} value: ${value}`)();\n throw new Error(`Invalid ${key} value: ${value}`);\n }\n }\n // get the formatted value\n getValue() {\n return this._value;\n }\n getUpdateTrigger() {\n return this._updateTrigger;\n }\n}\n", "// deck.gl-community\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\nimport { StyleProperty } from \"./style-property.js\";\nimport { NODE_TYPE, EDGE_DECORATOR_TYPE } from \"../core/constants.js\";\nimport { log } from \"../utils/log.js\";\nconst COMMON_DECKGL_PROPS = {\n getOffset: 'offset',\n opacity: 'opacity'\n};\nconst DECKGL_ACCESSOR_MAP = {\n [NODE_TYPE.CIRCLE]: {\n ...COMMON_DECKGL_PROPS,\n getFillColor: 'fill',\n getLineColor: 'stroke',\n getLineWidth: 'strokeWidth',\n getRadius: 'radius'\n },\n [NODE_TYPE.RECTANGLE]: {\n ...COMMON_DECKGL_PROPS,\n getWidth: 'width',\n getHeight: 'height',\n getFillColor: 'fill',\n getLineColor: 'stroke',\n getLineWidth: 'strokeWidth'\n },\n [NODE_TYPE.ROUNDED_RECTANGLE]: {\n ...COMMON_DECKGL_PROPS,\n getCornerRadius: 'cornerRadius',\n getRadius: 'radius',\n getWidth: 'width',\n getHeight: 'height',\n getFillColor: 'fill',\n getLineColor: 'stroke',\n getLineWidth: 'strokeWidth'\n },\n [NODE_TYPE.PATH_ROUNDED_RECTANGLE]: {\n ...COMMON_DECKGL_PROPS,\n getWidth: 'width',\n getHeight: 'height',\n getFillColor: 'fill',\n getLineColor: 'stroke',\n getLineWidth: 'strokeWidth',\n getCornerRadius: 'cornerRadius'\n },\n [NODE_TYPE.LABEL]: {\n ...COMMON_DECKGL_PROPS,\n getColor: 'color',\n getText: 'text',\n getSize: 'fontSize',\n getTextAnchor: 'textAnchor',\n getAlignmentBaseline: 'alignmentBaseline',\n getAngle: 'angle',\n scaleWithZoom: 'scaleWithZoom',\n textMaxWidth: 'textMaxWidth',\n textWordBreak: 'textWordBreak',\n textSizeMinPixels: 'textSizeMinPixels'\n },\n [NODE_TYPE.MARKER]: {\n ...COMMON_DECKGL_PROPS,\n getColor: 'fill',\n getSize: 'size',\n getMarker: 'marker',\n scaleWithZoom: 'scaleWithZoom'\n },\n // --------- Edge related ---------\n Edge: {\n getColor: 'stroke',\n getWidth: 'strokeWidth'\n },\n [EDGE_DECORATOR_TYPE.LABEL]: {\n getColor: 'color',\n getText: 'text',\n getSize: 'fontSize',\n getTextAnchor: 'textAnchor',\n getAlignmentBaseline: 'alignmentBaseline',\n scaleWithZoom: 'scaleWithZoom',\n textMaxWidth: 'textMaxWidth',\n textWordBreak: 'textWordBreak',\n textSizeMinPixels: 'textSizeMinPixels'\n },\n [EDGE_DECORATOR_TYPE.FLOW]: {\n getColor: 'color',\n getWidth: 'width',\n getSpeed: 'speed',\n getTailLength: 'tailLength'\n }\n};\nconst DECKGL_UPDATE_TRIGGERS = {\n [NODE_TYPE.CIRCLE]: ['getFillColor', 'getRadius', 'getLineColor', 'getLineWidth'],\n [NODE_TYPE.RECTANGLE]: ['getFillColor', 'getLineColor', 'getLineWidth'],\n [NODE_TYPE.ROUNDED_RECTANGLE]: [\n 'getFillColor',\n 'getLineColor',\n 'getLineWidth',\n 'getCornerRadius'\n ],\n [NODE_TYPE.PATH_ROUNDED_RECTANGLE]: [\n 'getFillColor',\n 'getLineColor',\n 'getLineWidth',\n 'getCornerRadius'\n ],\n [NODE_TYPE.LABEL]: [\n 'getColor',\n 'getText',\n 'getSize',\n 'getTextAnchor',\n 'getAlignmentBaseline',\n 'getAngle'\n ],\n [NODE_TYPE.MARKER]: ['getColor', 'getSize', 'getMarker'],\n Edge: ['getColor', 'getWidth'],\n [EDGE_DECORATOR_TYPE.LABEL]: [\n 'getColor',\n 'getText',\n 'getSize',\n 'getTextAnchor',\n 'getAlignmentBaseline'\n ],\n [EDGE_DECORATOR_TYPE.FLOW]: ['getColor', 'getWidth', 'getSpeed', 'getTailLength']\n};\nexport class Stylesheet {\n type;\n properties;\n constructor(style, updateTriggers) {\n const { type: layerType, ...restStyle } = style;\n if (!layerType || !(layerType in DECKGL_ACCESSOR_MAP)) {\n throw new Error(`illegal type: ${layerType}`);\n }\n this.type = layerType;\n // style = {\n // type: 'circle',\n // fill: 'red'\n // radius: 5,\n //\n // ':hover': {\n // fill: 'blue',\n // stroke: 'red'\n // }\n // };\n // step 1: extract 'rules': default, hover\n // default: {fill: 'red', radius: 5};\n // hover: {fill: 'blue', stroke: 'red'};\n const rules = Object.keys(restStyle).reduce((res, key) => {\n const isSelector = key.startsWith(':');\n if (isSelector) {\n const state = key.substring(1);\n res[state] = restStyle[key];\n return res;\n }\n res.default[key] = restStyle[key];\n return res;\n }, {\n default: {}\n });\n // step 2: extract all unique attributes from rules\n // attributes: ['fill', 'radius', 'stroke']\n const attributes = Object.values(rules).reduce((res, rule) => {\n const attrs = Object.keys(rule);\n const set = new Set([...res, ...attrs]);\n return Array.from(set);\n }, []);\n // step 3: create a attribute map as:\n // attrMap = {\n // fill: {default: 'red', hover: 'blue'},\n // radius: {default: 5},\n // stroke: {hover: 'red'},\n // }\n const attrMap = attributes.reduce((res, attr) => {\n res[attr] = Object.entries(rules).reduce((acc, entry) => {\n const [state, rule] = entry;\n if (typeof rule[attr] !== 'undefined') {\n acc[state] = rule[attr];\n }\n return acc;\n }, {});\n return res;\n }, {});\n // step 4: simplify the attribute map if only default exists for the attribute\n // simplifiedStyleMap = {\n // fill: {default: 'red', hover: 'blue'},\n // radius: 5,\n // stroke: {hover: 'red'},\n // }\n const simplifiedStyleMap = Object.entries(attrMap).reduce((res, entry) => {\n const [attr, valueMap] = entry;\n const onlyDefault = Object.keys(valueMap).length === 1 && valueMap.default !== undefined;\n if (onlyDefault) {\n res[attr] = valueMap.default;\n return res;\n }\n res[attr] = valueMap;\n return res;\n }, {});\n // step 5: create style property\n // if the propety only maps to default state => return value only\n // if the property maps to other states => return accessor function\n // start to parse properties\n this.properties = {};\n for (const key in simplifiedStyleMap) {\n this.properties[key] = new StyleProperty({\n key,\n value: simplifiedStyleMap[key],\n updateTrigger: updateTriggers.stateUpdateTrigger\n });\n }\n }\n _getProperty(deckglAccessor) {\n const map = DECKGL_ACCESSOR_MAP[this.type];\n if (!map) {\n throw new Error(`illegal type: ${this.type}`);\n }\n const styleProp = map[deckglAccessor];\n if (!styleProp) {\n log.error(`Invalid DeckGL accessor: ${deckglAccessor}`)();\n throw new Error(`Invalid DeckGL accessor: ${deckglAccessor}`);\n }\n return this.properties[styleProp];\n }\n getDeckGLAccessor(deckglAccessor) {\n const property = this._getProperty(deckglAccessor);\n // get the value\n if (property) {\n return property.getValue();\n }\n // return default value\n const styleProp = DECKGL_ACCESSOR_MAP[this.type][deckglAccessor];\n return StyleProperty.getDefault(styleProp);\n }\n getDeckGLAccessorUpdateTrigger(deckglAccessor) {\n const property = this._getProperty(deckglAccessor);\n // get the value\n if (property) {\n return property.getUpdateTrigger();\n }\n return false;\n }\n getDeckGLAccessors() {\n const accessorMap = DECKGL_ACCESSOR_MAP[this.type];\n return Object.keys(accessorMap).reduce((res, accessor) => {\n res[accessor] = this.getDeckGLAccessor(accessor);\n return res;\n }, {});\n }\n getDeckGLUpdateTriggers() {\n return DECKGL_UPDATE_TRIGGERS[this.type].reduce((res, accessor) => {\n res[accessor] = this.getDeckGLAccessorUpdateTrigger(accessor);\n return res;\n }, {});\n }\n}\n", "// deck.gl-community\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\nimport { EDGE_STATE, NODE_STATE } from \"./constants.js\";\nconst NODE_TO_EDGE_STATE_MAP = {\n [NODE_STATE.DEFAULT]: EDGE_STATE.DEFAULT,\n [NODE_STATE.HOVER]: EDGE_STATE.HOVER,\n [NODE_STATE.DRAGGING]: EDGE_STATE.DRAGGING,\n [NODE_STATE.SELECTED]: EDGE_STATE.SELECTED\n};\nfunction shouldEdgeBeSelected(edge) {\n return edge\n .getConnectedNodes()\n .some((node) => node.getState() === NODE_STATE.SELECTED && node.shouldHighlightConnectedEdges());\n}\nfunction setNodeState(node, state) {\n node.setState(state);\n if (node.shouldHighlightConnectedEdges()) {\n node.getConnectedEdges().forEach((edge) => {\n let newEdgeState = NODE_TO_EDGE_STATE_MAP[state];\n if (shouldEdgeBeSelected(edge)) {\n newEdgeState = EDGE_STATE.SELECTED;\n }\n edge.setState(newEdgeState);\n });\n }\n}\nexport class InteractionManager {\n notifyCallback;\n _lastInteraction = 0;\n _lastHoveredNode = null;\n _lastSelectedNode = null;\n nodeEvents = undefined;\n edgeEvents = undefined;\n engine = undefined;\n enableDragging = undefined;\n resumeLayoutAfterDragging = undefined;\n constructor(props, notifyCallback) {\n this.updateProps(props);\n this.notifyCallback = notifyCallback;\n // internal state\n this._lastInteraction = 0;\n this._lastHoveredNode = null;\n this._lastSelectedNode = null;\n }\n updateProps({ nodeEvents = {}, edgeEvents = {}, engine, enableDragging, resumeLayoutAfterDragging }) {\n this.nodeEvents = nodeEvents;\n this.edgeEvents = edgeEvents;\n this.engine = engine;\n this.enableDragging = enableDragging;\n this.resumeLayoutAfterDragging = resumeLayoutAfterDragging;\n }\n getLastInteraction() {\n return this._lastInteraction;\n }\n onClick(info, event) {\n const { object } = info;\n if (!object) {\n return;\n }\n if (object.isNode) {\n if (object.isSelectable()) {\n if (this._lastSelectedNode) {\n setNodeState(this._lastSelectedNode, NODE_STATE.DEFAULT);\n }\n setNodeState(object, NODE_STATE.SELECTED);\n this._lastSelectedNode = object;\n this._lastInteraction = Date.now();\n this.notifyCallback();\n }\n if (this.nodeEvents.onClick) {\n this.nodeEvents.onClick(info, event);\n }\n }\n if (object.isEdge && this.edgeEvents.onClick) {\n this.edgeEvents.onClick(info, event);\n }\n }\n _mouseLeaveNode() {\n const lastHoveredNode = this._lastHoveredNode;\n if (!(lastHoveredNode.isSelectable() && lastHoveredNode.getState() === NODE_STATE.SELECTED)) {\n // reset the last hovered node's state\n const newState = this._lastSelectedNode !== null && this._lastSelectedNode.id === this._lastHoveredNode?.id\n ? NODE_STATE.SELECTED\n : NODE_STATE.DEFAULT;\n setNodeState(lastHoveredNode, newState);\n }\n // trigger the callback if exists\n if (this.nodeEvents.onMouseLeave) {\n this.nodeEvents.onMouseLeave(lastHoveredNode);\n }\n }\n _mouseEnterNode(info) {\n // set the node's state to hover\n setNodeState(info.object, NODE_STATE.HOVER);\n // trigger the callback if exists\n if (this.nodeEvents.onMouseEnter) {\n this.nodeEvents.onMouseEnter(info);\n }\n if (this.nodeEvents.onHover) {\n this.nodeEvents.onHover(info);\n }\n }\n onHover(info, event) {\n if (!info.object) {\n if (this._lastHoveredNode) {\n this._mouseLeaveNode();\n this._lastInteraction = Date.now();\n this._lastHoveredNode = null;\n this.notifyCallback();\n }\n return;\n }\n // hover over on a node\n if (info.object.isNode) {\n const isSameNode = this._lastHoveredNode && this._lastHoveredNode.id === info.object.id;\n // stay in the same node\n if (isSameNode) {\n return;\n }\n if (this._lastHoveredNode) {\n // reset the previous hovered node's state if not the same node\n this._mouseLeaveNode();\n }\n // enter new node\n this._mouseEnterNode(info);\n this._lastInteraction = Date.now();\n this._lastHoveredNode = info.object;\n this.notifyCallback();\n }\n if (info.object.isEdge && this.edgeEvents.onHover) {\n this.edgeEvents.onHover(info);\n }\n }\n onDragStart(info, event) {\n if (this.nodeEvents.onDragStart) {\n this.nodeEvents.onDragStart(info);\n }\n }\n onDrag(info, event) {\n if (!info.object.isNode || !this.enableDragging) {\n return;\n }\n event.stopImmediatePropagation();\n // info.viewport is undefined when the object is offscreen, so we use viewport from onDragStart\n const coordinates = info.layer.context.viewport.unproject([info.x, info.y]);\n // limit the node position to be within bounds of the viewport\n const bounds = info.layer.context.viewport.getBounds(); // [minX, minY, maxX, maxY]\n const x = Math.min(Math.max(coordinates[0], bounds[0]), bounds[2]);\n const y = Math.min(Math.max(coordinates[1], bounds[1]), bounds[3]);\n this.engine.lockNodePosition(info.object, x, y);\n setNodeState(info.object, NODE_STATE.DRAGGING);\n this._lastInteraction = Date.now();\n this.notifyCallback();\n if (this.nodeEvents.onDrag) {\n this.nodeEvents.onDrag(info);\n }\n }\n onDragEnd(info, event) {\n if (!info.object.isNode || !this.enableDragging) {\n return;\n }\n if (this.resumeLayoutAfterDragging) {\n this.engine.resume();\n }\n setNodeState(info.object, NODE_STATE.DEFAULT);\n this.engine.unlockNodePosition(info.object);\n }\n}\n", "// deck.gl-community\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\nimport { CompositeLayer } from '@deck.gl/core';\nimport { ScatterplotLayer } from '@deck.gl/layers';\nexport class CircleLayer extends CompositeLayer {\n static layerName = 'CircleLayer';\n renderLayers() {\n const { data, getPosition, stylesheet, positionUpdateTrigger = 0 } = this.props;\n return [\n new ScatterplotLayer(this.getSubLayerProps({\n id: '__scatterplot-layer',\n data,\n getPosition,\n ...stylesheet.getDeckGLAccessors(),\n updateTriggers: {\n getPosition: positionUpdateTrigger,\n ...stylesheet.getDeckGLUpdateTriggers()\n }\n }))\n ];\n }\n}\n", "// deck.gl-community\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\nimport { CompositeLayer } from '@deck.gl/core';\nimport { IconLayer } from '@deck.gl/layers';\nexport class ImageLayer extends CompositeLayer {\n static layerName = 'ImageLayer';\n renderLayers() {\n const { data, getPosition, stylesheet, positionUpdateTrigger = 0 } = this.props;\n return [\n new IconLayer(this.getSubLayerProps({\n id: '__icon-layer',\n data,\n getPosition,\n ...stylesheet.getDeckGLAccessors(),\n updateTriggers: {\n getPosition: positionUpdateTrigger,\n ...stylesheet.getDeckGLUpdateTriggers()\n }\n }))\n ];\n }\n}\n", "// deck.gl-community\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\nimport { CompositeLayer } from '@deck.gl/core';\nimport { ZoomableTextLayer } from \"../common-layers/zoomable-text-layer/zoomable-text-layer.js\";\nexport class LabelLayer extends CompositeLayer {\n static layerName = 'LabelLayer';\n renderLayers() {\n const { data, getPosition, stylesheet, positionUpdateTrigger = 0 } = this.props;\n return [\n new ZoomableTextLayer(this.getSubLayerProps({\n id: '__text-layer',\n data,\n getPosition,\n ...stylesheet.getDeckGLAccessors(),\n updateTriggers: {\n ...stylesheet.getDeckGLUpdateTriggers(),\n getPosition: positionUpdateTrigger\n }\n }))\n ];\n }\n}\n", "// deck.gl-community\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\nimport { CompositeLayer } from '@deck.gl/core';\nimport { TextLayer } from '@deck.gl/layers';\nexport class ZoomableTextLayer extends CompositeLayer {\n static layerName = 'ZoomableTextLayer';\n initializeState() {\n this.state = { characterSet: [] };\n }\n shouldUpdateState({ props, changeFlags }) {\n const { scaleWithZoom } = this.props;\n if (!scaleWithZoom) {\n return changeFlags.dataChanged || changeFlags.propsChanged;\n }\n return changeFlags.dataChanged || changeFlags.propsChanged || changeFlags.viewportChanged;\n }\n updateState({ props, oldProps, changeFlags }) {\n super.updateState({ props, oldProps, changeFlags });\n if (changeFlags.propsOrDataChanged) {\n const { getText } = props;\n let textLabels = [];\n if (typeof getText === 'function') {\n textLabels = props.data.map(getText);\n }\n else {\n textLabels = [getText];\n }\n const characterSet = new Set(textLabels.join(''));\n const uniqueCharacters = Array.from(characterSet);\n this.setState({ characterSet: uniqueCharacters });\n }\n }\n renderLayers() {\n const { data, getPosition, getColor, getText, getSize, getTextAnchor, getAlignmentBaseline, getAngle, scaleWithZoom, updateTriggers, fontFamily, textWordUnits, textWordBreak, textMaxWidth, textSizeMinPixels } = this.props;\n const sizeUpdateTrigger = scaleWithZoom ? [getSize, this.context.viewport.zoom] : false;\n // getText only expects function not plain value (string)\n const newGetText = typeof getText === 'function' ? getText : () => getText;\n return [\n new TextLayer(this.getSubLayerProps({\n id: '__text-layer',\n data,\n sizeScale: scaleWithZoom ? Math.pow(2, this.context.viewport.zoom - 1) : 1,\n characterSet: this.state.characterSet,\n getPosition,\n getColor,\n getSize,\n getTextAnchor,\n getAlignmentBaseline,\n getAngle,\n getText: newGetText,\n maxWidth: textMaxWidth ?? 12,\n wordBreak: textWordBreak ?? 'break-all',\n fontFamily: fontFamily ?? 'Red Hat Text',\n wordUnits: textWordUnits ?? 'pixels',\n sizeMinPixels: textSizeMinPixels ?? 9,\n updateTriggers: {\n getSize: sizeUpdateTrigger,\n getAngle: [sizeUpdateTrigger, updateTriggers.getPosition],\n ...updateTriggers\n }\n }))\n ];\n }\n}\n", "// deck.gl-community\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\nimport { CompositeLayer } from '@deck.gl/core';\nimport { PolygonLayer } from '@deck.gl/layers';\nconst generateRectangle = (node, { getWidth, getHeight, getPosition }) => {\n const pos = getPosition(node);\n const width = typeof getWidth === 'function' ? getWidth(node._data.label.length * 12) : getWidth;\n const height = typeof getWidth === 'function' ? getHeight(node) : getHeight;\n const halfWidth = width / 2;\n const halfHeight = height / 2;\n return [\n [pos[0] - halfWidth, pos[1] - halfHeight],\n [pos[0] - halfWidth, pos[1] + halfHeight],\n [pos[0] + halfWidth, pos[1] + halfHeight],\n [pos[0] + halfWidth, pos[1] - halfHeight]\n ];\n};\nexport class RectangleLayer extends CompositeLayer {\n static layerName = 'RectangleLayer';\n renderLayers() {\n const { data, getPosition, stylesheet, positionUpdateTrigger = 0 } = this.props;\n const getFillColor = stylesheet.getDeckGLAccessor('getFillColor');\n const getLineWidth = stylesheet.getDeckGLAccessor('getLineWidth');\n return [\n new PolygonLayer(this.getSubLayerProps({\n id: '__polygon-layer',\n data,\n getPolygon: (node) => generateRectangle(node, {\n getPosition,\n getWidth: stylesheet.getDeckGLAccessor('getWidth'),\n getHeight: stylesheet.getDeckGLAccessor('getHeight')\n }),\n filled: Boolean(getFillColor),\n jointRounded: true,\n stroked: Boolean(getLineWidth),\n ...stylesheet.getDeckGLAccessors(),\n updateTriggers: {\n getPolygon: [\n positionUpdateTrigger,\n stylesheet.getDeckGLAccessorUpdateTrigger('getWidth'),\n stylesheet.getDeckGLAccessorUpdateTrigger('getHeight')\n ],\n ...stylesheet.getDeckGLUpdateTriggers()\n }\n }))\n ];\n }\n}\n", "// deck.gl-community\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\nexport const fs = /* glsl */ `\\\n#define SHADER_NAME rounded-rectangle-layer-fragment-shader\n\nprecision highp float;\n\nuniform float cornerRadius;\n\nvarying vec4 vFillColor;\nvarying vec2 unitPosition;\n\nvoid main(void) {\n\n float distToCenter = length(unitPosition);\n\n /* Calculate the cutoff radius for the rounded corners */\n float threshold = sqrt(2.0) * (1.0 - cornerRadius) + 1.0 * cornerRadius;\n if (distToCenter <= threshold) {\n gl_FragColor = vFillColor;\n } else {\n discard;\n }\n\n gl_FragColor = picking_filterHighlightColor(gl_FragColor);\n\n gl_FragColor = picking_filterPickingColor(gl_FragColor);\n}\n`;\n", "// deck.gl-community\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n// import {ScatterplotLayer} from '@deck.gl/layers';\nimport { fs } from \"./rounded-rectangle-layer-fragment.js\";\nimport { RectangleLayer } from \"./rectangle-layer.js\";\nexport class RoundedRectangleLayer extends RectangleLayer {\n static layerName = 'RoundedRectangleLayer';\n draw({ uniforms }) {\n super.draw({\n uniforms: {\n ...uniforms,\n cornerRadius: this.props.cornerRadius\n }\n });\n }\n getShaders() {\n // use object.assign to make sure we don't overwrite existing fields like `vs`, `modules`...\n return Object.assign({}, super.getShaders(undefined), {\n fs\n });\n }\n}\nRoundedRectangleLayer.defaultProps = {\n // cornerRadius: the amount of rounding at the rectangle corners\n // 0 - rectangle. 1 - circle.\n cornerRadius: 0.1\n};\n", "// deck.gl-community\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\nimport { CompositeLayer } from '@deck.gl/core';\nimport { PolygonLayer } from '@deck.gl/layers';\nimport { generateRoundedCorners } from \"../../utils/polygon-calculations.js\";\nconst generateRoundedRectangle = (node, { getWidth, getHeight, getPosition, getCornerRadius }) => {\n const pos = getPosition(node);\n const width = typeof getWidth === 'function' ? getWidth(node) : getWidth;\n const height = typeof getWidth === 'function' ? getHeight(node) : getHeight;\n const cornerRadius = typeof getCornerRadius === 'function' ? getCornerRadius(node) : getCornerRadius;\n const factor = 20;\n return generateRoundedCorners(pos, width, height, cornerRadius, factor);\n};\nexport class PathBasedRoundedRectangleLayer extends CompositeLayer {\n static layerName = 'PathBasedRoundedRectangleLayer';\n renderLayers() {\n const { data, getPosition, stylesheet, positionUpdateTrigger = 0 } = this.props;\n const getFillColor = stylesheet.getDeckGLAccessor('getFillColor');\n const getLineWidth = stylesheet.getDeckGLAccessor('getLineWidth');\n return [\n new PolygonLayer(this.getSubLayerProps({\n id: '__polygon-layer',\n data,\n getPolygon: (node) => generateRoundedRectangle(node, {\n getPosition,\n getWidth: stylesheet.getDeckGLAccessor('getWidth'),\n getHeight: stylesheet.getDeckGLAccessor('getHeight'),\n getCornerRadius: stylesheet.getDeckGLAccessor('getCornerRadius')\n }),\n filled: Boolean(getFillColor),\n stroked: Boolean(getLineWidth),\n ...stylesheet.getDeckGLAccessors(),\n updateTriggers: {\n getPolygon: [\n positionUpdateTrigger,\n stylesheet.getDeckGLAccessorUpdateTrigger('getWidth'),\n stylesheet.getDeckGLAccessorUpdateTrigger('getHeight'),\n stylesheet.getDeckGLAccessorUpdateTrigger('getCornerRadius')\n ],\n ...stylesheet.getDeckGLUpdateTriggers()\n }\n }))\n ];\n }\n}\n", "// deck.gl-community\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\nexport function generateRoundedCorners(pos, width, height, radius, factor = 20) {\n const halfWidth = width / 2;\n const halfHeight = height / 2;\n const bottomLeft = { X: pos[0] - halfWidth, Y: pos[1] - halfHeight };\n const topLeft = { X: pos[0] - halfWidth, Y: pos[1] + halfHeight };\n const bottomRight = { X: pos[0] + halfWidth, Y: pos[1] - halfHeight };\n const topRight = { X: pos[0] + halfWidth, Y: pos[1] + halfHeight };\n const roundedPointsForBottomLeft = getRoundedCorner(bottomLeft, topLeft, bottomRight, radius, factor);\n const roundedPointsForTopLeft = getRoundedCorner(topLeft, topRight, bottomLeft, radius, factor).reverse();\n const roundedPointsForTopRight = getRoundedCorner(topRight, bottomRight, topLeft, radius, factor).reverse();\n const roundedPointsForBottomRight = getRoundedCorner(bottomRight, bottomLeft, topRight, radius, factor).reverse();\n const result = [\n ...roundedPointsForBottomLeft,\n ...roundedPointsForTopLeft,\n ...roundedPointsForTopRight,\n ...roundedPointsForBottomRight\n ];\n return result;\n}\n/**\n *\n * @param {*} angularPoint = corner point\n * @param {*} p1 = edge one\n * @param {*} p2 = edge two\n * @param {*} radius = corner radius\n * @param {*} factor = affects the points used for curve\n * reference: https://stackoverflow.com/questions/24771828/how-to-calculate-rounded-corners-for-a-polygon\n */\n// eslint-disable-next-line max-statements\nfunction getRoundedCorner(angularPoint, p1, p2, radius, factor) {\n // Vector 1\n const dx1 = angularPoint.X - p1.X;\n const dy1 = angularPoint.Y - p1.Y;\n // Vector 2\n const dx2 = angularPoint.X - p2.X;\n const dy2 = angularPoint.Y - p2.Y;\n // Angle between vector 1 and vector 2 divided by 2\n const angle = (Math.atan2(dy1, dx1) - Math.atan2(dy2, dx2)) / 2;\n // The length of segment between angular point and the\n // points of intersection with the circle of a given radius\n const tan = Math.abs(Math.tan(angle));\n let segment = radius / tan;\n // var segment = 2;\n // Check the segment\n const length1 = getLength(dx1, dy1);\n const length2 = getLength(dx2, dy2);\n const length = Math.min(length1, length2);\n if (segment > length) {\n segment = length;\n radius = length * tan;\n }\n // Points of intersection are calculated by the proportion between\n // the coordinates of the vector, length of vector and the length of the segment.\n const p1Cross = getProportionPoint(angularPoint, segment, length1, dx1, dy1);\n const p2Cross = getProportionPoint(angularPoint, segment, length2, dx2, dy2);\n // Calculation of the coordinates of the circle\n // center by the addition of angular vectors.\n const dx = angularPoint.X * 2 - p1Cross.X - p2Cross.X;\n const dy = angularPoint.Y * 2 - p1Cross.Y - p2Cross.Y;\n const L = getLength(dx, dy);\n const d = getLength(segment, radius);\n const circlePoint = getProportionPoint(angularPoint, d, L, dx, dy);\n // StartAngle and EndAngle of arc\n let startAngle = Math.atan2(p1Cross.Y - circlePoint.Y, p1Cross.X - circlePoint.X);\n const endAngle = Math.atan2(p2Cross.Y - circlePoint.Y, p2Cross.X - circlePoint.X);\n // Sweep angle\n let sweepAngle = endAngle - startAngle;\n // Some additional checks\n if (sweepAngle < 0) {\n startAngle = endAngle;\n sweepAngle = -sweepAngle;\n }\n if (sweepAngle > Math.PI)\n sweepAngle = Math.PI - sweepAngle;\n const degreeFactor = factor / Math.PI;\n return getPointsForArc(sweepAngle, degreeFactor, startAngle, circlePoint, radius);\n}\nfunction getLength(dx, dy) {\n return Math.sqrt(dx * dx + dy * dy);\n}\nfunction getProportionPoint(point, segment, length, dx, dy) {\n const factor = segment / length;\n return {\n X: point.X - dx * factor,\n Y: point.Y - dy * factor\n };\n}\nfunction getPointsForArc(sweepAngle, degreeFactor, startAngle, circlePoint, radius) {\n const pointsCount = Math.abs(sweepAngle * degreeFactor);\n const sign = Math.sign(sweepAngle);\n const points = [];\n for (let i = 0; i < pointsCount; ++i) {\n const pointX = circlePoint.X + Math.cos(startAngle + (sign * i) / degreeFactor) * radius;\n const pointY = circlePoint.Y + Math.sin(startAngle + (sign * i) / degreeFactor) * radius;\n const point = [pointX, pointY];\n points.push(point);\n }\n return points;\n}\n", "// deck.gl-community\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\nimport { CompositeLayer } from '@deck.gl/core';\nimport { MarkerLayer } from \"../common-layers/marker-layer/marker-layer.js\";\nexport class ZoomableMarkerLayer extends CompositeLayer {\n static layerName = 'ZoomableMarkerLayer';\n shouldUpdateState({ props, changeFlags }) {\n const { stylesheet } = this.props;\n const scaleWithZoom = stylesheet.getDeckGLAccessor('scaleWithZoom');\n if (!scaleWithZoom) {\n return changeFlags.somethingChanged;\n }\n return changeFlags.somethingChanged || changeFlags.viewportChanged;\n }\n renderLayers() {\n const { data, getPosition, stylesheet, positionUpdateTrigger = 0 } = this.props;\n const getSize = stylesheet.getDeckGLAccessor('getSize');\n const scaleWithZoom = stylesheet.getDeckGLAccessor('scaleWithZoom');\n const sizeUpdateTrigger = scaleWithZoom ? [getSize, this.context.viewport.zoom] : false;\n const oiginalGetMarker = stylesheet.getDeckGLAccessor('getMarker');\n // getMarker only expects function not plain value (string)\n const getMarker = typeof oiginalGetMarker === 'function' ? oiginalGetMarker : () => oiginalGetMarker;\n return [\n new MarkerLayer(this.getSubLayerProps({\n id: 'zoomable-marker-layer',\n data,\n getPosition,\n sizeScale: scaleWithZoom ? Math.max(0, this.context.viewport.zoom) : 1,\n ...stylesheet.getDeckGLAccessors(),\n getMarker,\n updateTriggers: {\n ...stylesheet.getDeckGLUpdateTriggers(),\n getPosition: positionUpdateTrigger,\n getSize: sizeUpdateTrigger\n }\n }))\n ];\n }\n}\n", "// deck.gl-community\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\nimport { CompositeLayer } from '@deck.gl/core';\nimport { IconLayer } from '@deck.gl/layers';\nimport { MarkerMapping } from \"./marker-mapping.js\";\nimport { AtlasDataURL } from \"./atlas-data-url.js\";\nexport class MarkerLayer extends CompositeLayer {\n static layerName = 'MarkerLayer';\n static defaultProps = {\n id: 'MarkerLayer',\n data: [],\n getMarker: (d) => d.marker,\n getColor: (d) => [0, 0, 0],\n getSize: (d) => 10\n };\n renderLayers() {\n const { getMarker, ...otherProps } = this.props;\n return [\n new IconLayer(this.getSubLayerProps({\n id: 'marker-layer',\n iconAtlas: AtlasDataURL.dataURL,\n iconMapping: MarkerMapping,\n getIcon: getMarker,\n ...otherProps\n }))\n ];\n }\n}\n", "// deck.gl-community\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n/* eslint-disable */\nexport const MarkerMapping = {\n 'bell-filled': {\n x: 0,\n y: 0,\n width: 32,\n height: 32,\n mask: true\n },\n bell: {\n x: 32,\n y: 0,\n width: 32,\n height: 32,\n mask: true\n },\n 'bookmark-filled': {\n x: 0,\n y: 32,\n width: 32,\n height: 32,\n mask: true\n },\n bookmark: {\n x: 32,\n y: 32,\n width: 32,\n height: 32,\n mask: true\n },\n 'cd-filled': {\n x: 64,\n y: 0,\n width: 32,\n height: 32,\n mask: true\n },\n cd: {\n x: 64,\n y: 32,\n width: 32,\n height: 32,\n mask: true\n },\n checkmark: {\n x: 0,\n y: 64,\n width: 32,\n height: 32,\n mask: true\n },\n 'circle-check-filled': {\n x: 32,\n y: 64,\n width: 32,\n height: 32,\n mask: true\n },\n 'circle-check': {\n x: 64,\n y: 64,\n width: 32,\n height: 32,\n mask: true\n },\n 'circle-filled': {\n x: 96,\n y: 0,\n width: 32,\n height: 32,\n mask: true\n },\n 'circle-i-filled': {\n x: 96,\n y: 32,\n width: 32,\n height: 32,\n mask: true\n },\n 'circle-i': {\n x: 96,\n y: 64,\n width: 32,\n height: 32,\n mask: true\n },\n 'circle-minus-filled': {\n x: 0,\n y: 96,\n width: 32,\n height: 32,\n mask: true\n },\n 'circle-minus': {\n x: 32,\n y: 96,\n width: 32,\n height: 32,\n mask: true\n },\n 'circle-plus-filled': {\n x: 64,\n y: 96,\n width: 32,\n height: 32,\n mask: true\n },\n 'circle-plus': {\n x: 96,\n y: 96,\n width: 32,\n height: 32,\n mask: true\n },\n 'circle-questionmark-filled': {\n x: 128,\n y: 0,\n width: 32,\n height: 32,\n mask: true\n },\n 'circle-questionmark': {\n x: 128,\n y: 32,\n width: 32,\n height: 32,\n mask: true\n },\n 'circle-slash-filled': {\n x: 128,\n y: 64,\n width: 32,\n height: 32,\n mask: true\n },\n 'circle-slash': {\n x: 128,\n y: 96,\n width: 32,\n height: 32,\n mask: true\n },\n 'circle-x-filled': {\n x: 0,\n y: 128,\n width: 32,\n height: 32,\n mask: true\n },\n 'circle-x': {\n x: 32,\n y: 128,\n width: 32,\n height: 32,\n mask: true\n },\n circle: {\n x: 64,\n y: 128,\n width: 32,\n height: 32,\n mask: true\n },\n 'diamond-filled': {\n x: 96,\n y: 128,\n width: 32,\n height: 32,\n mask: true\n },\n diamond: {\n x: 128,\n y: 128,\n width: 32,\n height: 32,\n mask: true\n },\n 'flag-filled': {\n x: 160,\n y: 0,\n width: 32,\n height: 32,\n mask: true\n },\n flag: {\n x: 160,\n y: 32,\n width: 32,\n height: 32,\n mask: true\n },\n gear: {\n x: 160,\n y: 64,\n width: 32,\n height: 32,\n mask: true\n },\n 'heart-filled': {\n x: 160,\n y: 96,\n width: 32,\n height: 32,\n mask: true\n },\n heart: {\n x: 160,\n y: 128,\n width: 32,\n height: 32,\n mask: true\n },\n 'location-marker-filled': {\n x: 0,\n y: 160,\n width: 32,\n height: 32,\n mask: true\n },\n 'location-marker': {\n x: 32,\n y: 160,\n width: 32,\n height: 32,\n mask: true\n },\n 'octagonal-star-filled': {\n x: 64,\n y: 160,\n width: 32,\n height: 32,\n mask: true\n },\n 'octagonal-star': {\n x: 96,\n y: 160,\n width: 32,\n height: 32,\n mask: true\n },\n 'person-filled': {\n x: 128,\n y: 160,\n width: 32,\n height: 32,\n mask: true\n },\n person: {\n x: 160,\n y: 160,\n width: 32,\n height: 32,\n mask: true\n },\n 'pin-filled': {\n x: 192,\n y: 0,\n width: 32,\n height: 32,\n mask: true\n },\n pin: {\n x: 192,\n y: 32,\n width: 32,\n height: 32,\n mask: true\n },\n 'plus-small': {\n x: 192,\n y: 64,\n width: 32,\n height: 32,\n mask: true\n },\n plus: {\n x: 192,\n y: 96,\n width: 32,\n height: 32,\n mask: true\n },\n 'rectangle-filled': {\n x: 192,\n y: 128,\n width: 32,\n height: 32,\n mask: true\n },\n rectangle: {\n x: 192,\n y: 160,\n width: 32,\n height: 32,\n mask: true\n },\n 'star-filled': {\n x: 0,\n y: 192,\n width: 32,\n height: 32,\n mask: true\n },\n star: {\n x: 32,\n y: 192,\n width: 32,\n height: 32,\n mask: true\n },\n 'tag-filled': {\n x: 64,\n y: 192,\n width: 32,\n height: 32,\n mask: true\n },\n tag: {\n x: 96,\n y: 192,\n width: 32,\n height: 32,\n mask: true\n },\n 'thumb-down-filled': {\n x: 128,\n y: 192,\n width: 32,\n height: 32,\n mask: true\n },\n 'thumb-down': {\n x: 160,\n y: 192,\n width: 32,\n height: 32,\n mask: true\n },\n 'thumb-up': {\n x: 192,\n y: 192,\n width: 32,\n height: 32,\n mask: true\n },\n 'thumb_up-filled': {\n x: 224,\n y: 0,\n width: 32,\n height: 32,\n mask: true\n },\n 'triangle-down-filled': {\n x: 224,\n y: 32,\n width: 32,\n height: 32,\n mask: true\n },\n 'triangle-down': {\n x: 224,\n y: 64,\n width: 32,\n height: 32,\n mask: true\n },\n 'triangle-left-filled': {\n x: 224,\n y: 96,\n width: 32,\n height: 32,\n mask: true\n },\n 'triangle-left': {\n x: 224,\n y: 128,\n width: 32,\n height: 32,\n mask: true\n },\n 'triangle-right-filled': {\n x: 224,\n y: 160,\n width: 32,\n height: 32,\n mask: true\n },\n 'triangle-right': {\n x: 224,\n y: 192,\n width: 32,\n height: 32,\n mask: true\n },\n 'triangle-up-filled': {\n x: 0,\n y: 224,\n width: 32,\n height: 32,\n mask: true\n },\n 'triangle-up': {\n x: 32,\n y: 224,\n width: 32,\n height: 32,\n mask: true\n },\n 'x-small': {\n x: 64,\n y: 224,\n width: 32,\n height: 32,\n mask: true\n },\n x: {\n x: 96,\n y: 224,\n width: 32,\n height: 32,\n mask: true\n }\n};\n/* eslint-enable */\n", "// deck.gl-community\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n/* eslint-disable */\nexport const AtlasDataURL = {\n dataURL: 'data:image/png;base64,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'\n};\n/* eslint-enable */\n", "// deck.gl-community\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\nimport { COORDINATE_SYSTEM, CompositeLayer } from '@deck.gl/core';\nimport { EDGE_TYPE } from \"../core/constants.js\";\nimport { StraightLineEdgeLayer } from \"../layers/edge-layers/straight-line-edge-layer.js\";\nimport { PathEdgeLayer } from \"./edge-layers/path-edge-layer.js\";\nimport { CurvedEdgeLayer } from \"./edge-layers/curved-edge-layer.js\";\nconst EDGE_LAYER_MAP = {\n [EDGE_TYPE.LINE]: StraightLineEdgeLayer,\n [EDGE_TYPE.PATH]: PathEdgeLayer,\n [EDGE_TYPE.SPLINE_CURVE]: CurvedEdgeLayer\n};\nexport class EdgeLayer extends CompositeLayer {\n static layerName = 'EdgeLayer';\n static defaultProps = {\n data: [],\n pickable: true,\n getLayoutInfo: (d) => ({\n type: d.type,\n sourcePosition: d.sourcePosition,\n targetPosition: d.targetPosition,\n controlPoints: []\n }),\n positionUpdateTrigger: 0\n };\n updateState({ props, oldProps, changeFlags }) {\n super.updateState({ props, oldProps, changeFlags });\n if (changeFlags.dataChanged) {\n this.updateStateData();\n }\n }\n updateStateData() {\n const { data, getLayoutInfo } = this.props;\n // bucket edges by types\n const typedEdgeData = data.reduce((res, d) => {\n const { type } = getLayoutInfo(d);\n res[type].push(d);\n return res;\n }, {\n [EDGE_TYPE.LINE]: [],\n [EDGE_TYPE.PATH]: [],\n [EDGE_TYPE.SPLINE_CURVE]: []\n });\n this.setState({ typedEdgeData });\n }\n renderLayers() {\n const { getLayoutInfo, pickable, positionUpdateTrigger, stylesheet, id } = this.props;\n const { typedEdgeData } = this.state;\n // render lines by types (straight line, path, curves)\n return Object.entries(typedEdgeData).map((e, idx) => {\n const [type, edgeData] = e;\n const Layer = EDGE_LAYER_MAP[type];\n // invalid edge layer type\n if (!Layer) {\n return null;\n }\n return new Layer({\n id: `${id}-${idx}`,\n data: edgeData,\n getLayoutInfo,\n getColor: stylesheet.getDeckGLAccessor('getColor'),\n getWidth: stylesheet.getDeckGLAccessor('getWidth'),\n colorUpdateTrigger: stylesheet.getDeckGLAccessorUpdateTrigger('getColor'),\n widthUpdateTrigger: stylesheet.getDeckGLAccessorUpdateTrigger('getWidth'),\n positionUpdateTrigger,\n pickable,\n coordinateSystem: COORDINATE_SYSTEM.CARTESIAN,\n parameters: {\n depthCompare: 'always'\n }\n });\n });\n }\n}\n", "// deck.gl-community\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\nimport { CompositeLayer } from '@deck.gl/core';\nimport { LineLayer } from '@deck.gl/layers';\nexport class StraightLineEdgeLayer extends CompositeLayer {\n static layerName = 'StraightLineEdgeLayer';\n renderLayers() {\n const { data, getLayoutInfo, positionUpdateTrigger = 0, colorUpdateTrigger = 0, widthUpdateTrigger = 0, ...otherProps } = this.props;\n return [\n new LineLayer(this.getSubLayerProps({\n id: '__line-layer',\n data,\n getSourcePosition: (e) => getLayoutInfo(e).sourcePosition,\n getTargetPosition: (e) => getLayoutInfo(e).targetPosition,\n updateTriggers: {\n getColor: colorUpdateTrigger,\n getSourcePosition: positionUpdateTrigger,\n getTargetPosition: positionUpdateTrigger,\n getWidth: widthUpdateTrigger\n },\n ...otherProps\n }))\n ];\n }\n}\n", "// deck.gl-community\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\nimport { CompositeLayer } from '@deck.gl/core';\nimport { PathLayer } from '@deck.gl/layers';\nexport class PathEdgeLayer extends CompositeLayer {\n static layerName = 'PathEdgeLayer';\n renderLayers() {\n const { data, getLayoutInfo, positionUpdateTrigger = 0, colorUpdateTrigger = 0, widthUpdateTrigger = 0, ...otherProps } = this.props;\n return [\n new PathLayer(this.getSubLayerProps({\n id: '__line-layer',\n data,\n getPath: (e) => {\n const { sourcePosition, targetPosition, controlPoints } = getLayoutInfo(e);\n return [sourcePosition, ...controlPoints, targetPosition];\n },\n updateTriggers: {\n getColor: colorUpdateTrigger,\n getPath: positionUpdateTrigger,\n getWidth: widthUpdateTrigger\n },\n ...otherProps\n }))\n ];\n }\n}\n", "// deck.gl-community\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\nimport { CompositeLayer } from '@deck.gl/core';\nimport { ScatterplotLayer, LineLayer } from '@deck.gl/layers';\nimport { SplineLayer } from \"../common-layers/spline-layer/spline-layer.js\";\nconst DEBUG = false;\nexport class CurvedEdgeLayer extends CompositeLayer {\n static layerName = 'CurvedEdgeLayer';\n // @ts-expect-error TODO\n renderLayers() {\n const { data, getLayoutInfo, positionUpdateTrigger = 0, colorUpdateTrigger = 0, widthUpdateTrigger = 0, ...otherProps } = this.props;\n return [\n DEBUG &&\n new ScatterplotLayer(this.getSubLayerProps({\n id: '__control-points',\n data,\n getPosition: (e) => getLayoutInfo(e).controlPoints[0],\n getColor: (d) => [190, 190, 190, 150],\n getRadius: (d) => 5,\n updateTriggers: {\n getPosition: positionUpdateTrigger\n },\n ...otherProps\n })),\n DEBUG &&\n new LineLayer(this.getSubLayerProps({\n id: '__first_segment',\n data,\n getSourcePosition: (e) => getLayoutInfo(e).sourcePosition,\n getTargetPosition: (e) => getLayoutInfo(e).controlPoints[0],\n getColor: (e) => [210, 210, 210, 150],\n updateTriggers: {\n getSourcePosition: positionUpdateTrigger,\n getTargetPosition: positionUpdateTrigger\n },\n ...otherProps\n })),\n DEBUG &&\n new LineLayer(this.getSubLayerProps({\n id: '__last_segment',\n data,\n getSourcePosition: (e) => getLayoutInfo(e).controlPoints[0],\n getTargetPosition: (e) => getLayoutInfo(e).targetPosition,\n getColor: (e) => [210, 210, 210, 150],\n updateTriggers: {\n getSourcePosition: positionUpdateTrigger,\n getTargetPosition: positionUpdateTrigger\n },\n ...otherProps\n })),\n new SplineLayer(this.getSubLayerProps({\n id: '__spline_layer',\n data,\n getSourcePosition: (e) => getLayoutInfo(e).sourcePosition,\n getTargetPosition: (e) => getLayoutInfo(e).targetPosition,\n getControlPoints: (e) => getLayoutInfo(e).controlPoints,\n updateTriggers: {\n getSourcePosition: positionUpdateTrigger,\n getTargetPosition: positionUpdateTrigger,\n getControlPoints: positionUpdateTrigger,\n getColor: colorUpdateTrigger,\n getWidth: widthUpdateTrigger\n },\n ...otherProps\n }))\n ];\n }\n}\n", "// deck.gl-community\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\nimport { COORDINATE_SYSTEM, CompositeLayer } from '@deck.gl/core';\nimport { PathLayer } from '@deck.gl/layers';\nimport { getCurvePoints } from 'cardinal-spline-js';\n// const getCurvePoints = () => {};\n/* Constants */\nconst defaultProps = {\n id: 'spline-layer',\n getData: (d) => d.points,\n getAngle: (x) => 0,\n fontSize: 24,\n coordinateSystem: COORDINATE_SYSTEM.CARTESIAN,\n fp64: false\n};\nexport class SplineLayer extends CompositeLayer {\n static layerName = 'SplineLayer';\n initializeState() {\n this.state = { typedEdgeData: [] };\n }\n shouldUpdateState({ changeFlags }) {\n return changeFlags.dataChanged || changeFlags.propsChanged;\n }\n updateState({ props, oldProps, changeFlags }) {\n super.updateState({ props, oldProps, changeFlags });\n if (changeFlags.dataChanged || changeFlags.propsChanged) {\n this.updateSplineData();\n }\n }\n updateSplineData() {\n const { data } = this.props;\n const paths = data.reduce((res, d) => {\n const sourcePosition = this.props.getSourcePosition(d);\n const targetPosition = this.props.getTargetPosition(d);\n const controlPoints = this.props.getControlPoints(d);\n // Catmull-Rom curve\n const serializedControlPoints = controlPoints.toString().split(',');\n // NOTE: we might change the number of points according to the length.\n // so we can render less segements.\n // points = [x1, y1, x2, y2, ...];\n const points = getCurvePoints([...sourcePosition, ...serializedControlPoints, ...targetPosition], 0.5, 10);\n // convert points to [[x1, y1], [x2, y2], ...]\n const path = [];\n for (let idx = 0; idx < points.length; idx += 2) {\n path.push([points[idx], points[idx + 1]]);\n }\n res.push(path);\n return res;\n }, []);\n this.setState({ paths });\n }\n renderLayers() {\n const { coordinateSystem, getColor, getWidth, id, updateTriggers } = this.props;\n const { paths } = this.state;\n return new PathLayer({\n id: `${id}-splines`,\n data: paths,\n getPath: (d) => d,\n getColor,\n getWidth,\n coordinateSystem,\n updateTriggers\n });\n }\n}\nSplineLayer.layerName = 'SplineLayer';\nSplineLayer.defaultProps = defaultProps;\n", "// deck.gl-community\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\nimport { CompositeLayer } from '@deck.gl/core';\nimport { ZoomableTextLayer } from \"../common-layers/zoomable-text-layer/zoomable-text-layer.js\";\nexport class EdgeLabelLayer extends CompositeLayer {\n static layerName = 'EdgeLabelLayer';\n renderLayers() {\n const { data, getLayoutInfo, positionUpdateTrigger = 0, stylesheet } = this.props;\n return [\n new ZoomableTextLayer(this.getSubLayerProps({\n id: 'edge-label-layer',\n data,\n getPosition: (e) => {\n const { sourcePosition, targetPosition, controlPoints = [] } = getLayoutInfo(e);\n // consider all the points on this edge\n const allPoints = [sourcePosition, targetPosition, ...controlPoints];\n const sumX = allPoints.reduce((res, p) => res + p[0], 0);\n const sumY = allPoints.reduce((res, p) => res + p[1], 0);\n // find the centroid of those points\n return [sumX / allPoints.length, sumY / allPoints.length];\n },\n getAngle: (e) => {\n const { sourcePosition, targetPosition } = getLayoutInfo(e);\n // sort the nodes from left to right\n const [newSourcePosition, newTargetPosition] = sourcePosition[0] < targetPosition[0]\n ? [sourcePosition, targetPosition]\n : [targetPosition, sourcePosition];\n // angle in degrees\n const deltaX = newTargetPosition[0] - newSourcePosition[0];\n const deltaY = newTargetPosition[1] - newSourcePosition[1];\n return (Math.atan2(deltaY, deltaX) * -180) / Math.PI;\n },\n ...stylesheet.getDeckGLAccessors(),\n updateTriggers: {\n ...stylesheet.getDeckGLUpdateTriggers(),\n getPosition: positionUpdateTrigger\n }\n }))\n ];\n }\n}\n", "// deck.gl-community\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\nimport { CompositeLayer } from '@deck.gl/core';\nimport { FlowPathLayer } from \"../common-layers/flow-path-layer/flow-path-layer.js\";\nexport class FlowLayer extends CompositeLayer {\n static layerName = 'FlowLayer';\n renderLayers() {\n const { data, getLayoutInfo, positionUpdateTrigger = 0, stylesheet } = this.props;\n return [\n new FlowPathLayer(this.getSubLayerProps({\n id: '__flow-layer',\n data,\n ...stylesheet.getDeckGLAccessors(),\n getSourcePosition: (e) => getLayoutInfo(e).sourcePosition,\n getTargetPosition: (e) => getLayoutInfo(e).targetPosition,\n parameters: {\n depthTest: false\n },\n updateTriggers: {\n ...stylesheet.getDeckGLUpdateTriggers(),\n getSourcePosition: positionUpdateTrigger,\n getTargetPosition: positionUpdateTrigger\n }\n }))\n ];\n }\n}\n", "// deck.gl-community\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n// import {Buffer, Transform} from '@luma.gl/core';\nimport { LineLayer } from '@deck.gl/layers';\nimport { window } from 'global';\nimport { vs } from './flow-path-layer-vertex.glsl';\nimport { fs } from './flow-path-layer-fragment.glsl';\n// import {tfvs} from './flow-path-layer-vertex-tf.glsl';\nconst defaultProps = {\n ...LineLayer.defaultProps,\n getWidth: { type: 'accessor', value: 1 },\n getSpeed: { type: 'accessor', value: 0 }\n};\n/* eslint-disable camelcase */\nexport class FlowPathLayer extends LineLayer {\n getShaders() {\n const projectModule = this.use64bitPositions() ? 'project64' : 'project32';\n return { vs, fs, modules: [projectModule, 'picking'] };\n }\n initializeState() {\n super.initializeState();\n this.getAttributeManager().addInstanced({\n instanceSpeeds: {\n size: 1,\n transition: true,\n accessor: 'getSpeed',\n defaultValue: 0\n },\n instanceTailLengths: {\n size: 1,\n transition: true,\n accessor: 'getTailLength',\n defaultValue: 1\n }\n });\n this.setupTransformFeedback();\n this.setState({\n ...this.state,\n animation: window.requestAnimationFrame(this.animate.bind(this))\n });\n }\n animate() {\n const { transform } = this.state;\n if (transform) {\n transform.run();\n transform.swap();\n }\n this.setState({\n animation: window.requestAnimationFrame(this.animate.bind(this))\n });\n }\n updateState({ props, oldProps, changeFlags }) {\n super.updateState({ props, oldProps, changeFlags });\n const { speedsBuffer } = this.state;\n const speedChanged = changeFlags.dataChanged ||\n props.fp64 !== oldProps.fp64 ||\n (changeFlags.updateTriggersChanged &&\n (changeFlags.updateTriggersChanged.all || changeFlags.updateTriggersChanged.getSpeed));\n if (speedChanged) {\n const speeds = new Float32Array(props.data.length);\n for (let i = 0; i < props.data.length; i++) {\n speeds[i] =\n typeof props.getSpeed === 'function' ? props.getSpeed(props.data[i]) : props.getSpeed;\n }\n speedsBuffer.subData({ data: speeds });\n }\n if (props.fp64 !== oldProps.fp64) {\n if (this.state.model) {\n this.state.model.delete();\n }\n this.setState({ model: this._getModel() });\n this.getAttributeManager().invalidateAll();\n }\n }\n finalizeState() {\n super.finalizeState(this.context);\n window.cancelAnimationFrame(this.state.animation);\n }\n setupTransformFeedback() {\n throw new Error('Not implemented');\n // const {gl} = this.context;\n // const elementCount = this.props.data && this.props.data.length;\n // if (elementCount) {\n // const instanceOffsets = new Float32Array(elementCount);\n // const instanceSpeeds = new Float32Array(elementCount);\n // const offsetBuffer = new Buffer(gl, instanceOffsets);\n // const speedsBuffer = new Buffer(gl, instanceSpeeds);\n // this.setState({\n // speedsBuffer,\n // transform: new Transform(gl, {\n // id: 'transform-offset',\n // vs: tfvs,\n // elementCount,\n // sourceBuffers: {\n // a_offset: offsetBuffer,\n // a_speed: speedsBuffer\n // },\n // feedbackMap: {\n // a_offset: 'v_offset'\n // }\n // })\n // });\n // }\n }\n draw({ uniforms }) {\n throw new Error('Not implemented');\n // const {transform} = this.state;\n // if (!transform) {\n // return;\n // }\n // const {viewport} = this.context;\n // const {widthUnits, widthScale, widthMinPixels, widthMaxPixels} = this.props;\n // const widthMultiplier = widthUnits === 'pixels' ? viewport.distanceScales.metersPerPixel[2] : 1;\n // const offsetBuffer = transform.getBuffer('v_offset');\n // offsetBuffer.setAccessor({divisor: 1});\n // this.state.model\n // .setAttributes({\n // instanceOffsets: offsetBuffer\n // })\n // .setUniforms(\n // Object.assign({}, uniforms, {\n // widthScale: widthScale * widthMultiplier,\n // widthMinPixels,\n // widthMaxPixels\n // })\n // )\n // .draw();\n // offsetBuffer.setAccessor({divisor: 0});\n }\n}\nFlowPathLayer.layerName = 'FlowPathLayer';\nFlowPathLayer.defaultProps = defaultProps;\n", "// deck.gl-community\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\nexport const vs = /* glsl */ `\\\n#define SHADER_NAME flow-path-layer-vertex-shader\n\nattribute vec3 positions;\nattribute vec3 instanceSourcePositions;\nattribute vec3 instanceTargetPositions;\nattribute vec4 instanceSourceTargetPositions64xyLow;\nattribute vec4 instanceColors;\nattribute vec3 instancePickingColors;\nattribute float instanceWidths;\nattribute float instanceSpeeds;\nattribute float instanceOffsets;\nattribute float instanceTailLengths;\n\nuniform float opacity;\nuniform float widthScale;\nuniform float widthMinPixels;\nuniform float widthMaxPixels;\n\nvarying vec4 vColor;\nvarying float segmentIndex;\nvarying float speed;\nvarying float pathLength;\nvarying float tailLength;\nvarying float offset;\n\n// offset vector by strokeWidth pixels\n// offset_direction is -1 (left) or 1 (right)\nvec2 getExtrusionOffset(vec2 line_clipspace, float offset_direction, float width) {\n // normalized direction of the line\n vec2 dir_screenspace = normalize(line_clipspace * project_uViewportSize);\n // rotate by 90 degrees\n dir_screenspace = vec2(-dir_screenspace.y, dir_screenspace.x);\n\n vec2 offset_screenspace = dir_screenspace * offset_direction * width / 2.0;\n vec2 offset_clipspace = project_pixel_size_to_clipspace(offset_screenspace);\n\n return offset_clipspace;\n}\n\nvoid main(void) {\n // Position\n vec4 source = project_position_to_clipspace(instanceSourcePositions, instanceSourceTargetPositions64xyLow.xy, vec3(0.));\n vec4 target = project_position_to_clipspace(instanceTargetPositions, instanceSourceTargetPositions64xyLow.zw, vec3(0.));\n\n // Multiply out width and clamp to limits\n float widthPixels = clamp(\n project_size_to_pixel(instanceWidths * widthScale),\n widthMinPixels, widthMaxPixels\n );\n\n // linear interpolation of source & target to pick right coord\n segmentIndex = positions.x;\n speed = instanceSpeeds;\n tailLength = project_size_to_pixel(instanceTailLengths * widthScale);\n offset = instanceOffsets;\n pathLength = distance(instanceSourcePositions, instanceTargetPositions);\n vec4 p = mix(source, target, segmentIndex);\n\n // extrude\n vec2 offset = getExtrusionOffset(target.xy - source.xy, positions.y, widthPixels);\n gl_Position = p + vec4(offset, 0.0, 0.0);\n\n // Color\n vColor = vec4(instanceColors.rgb, instanceColors.a * opacity) / 255.;\n\n // Set color to be rendered to picking fbo (also used to check for selection highlight).\n picking_setPickingColor(instancePickingColors);\n}\n`;\n", "// deck.gl-community\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\nexport const fs = /* glsl */ `\\\n#define SHADER_NAME flow-path-layer-fragment-shader\n\nprecision highp float;\n\nvarying vec4 vColor;\nvarying float segmentIndex;\nvarying float speed;\nvarying float offset;\nvarying float pathLength;\nvarying float tailLength;\n\nvoid main(void) {\n gl_FragColor = vColor;\n\n // use highlight color if this fragment belongs to the selected object.\n gl_FragColor = picking_filterHighlightColor(gl_FragColor);\n\n // use picking color if rendering to picking FBO.\n gl_FragColor = picking_filterPickingColor(gl_FragColor);\n\n if (speed == 0.0) {\n gl_FragColor = vec4(0.0, 0.0, 0.0, 0.0);\n } else {\n // the portion of the visible segment (0 to 1) , ex: 0.3\n // edge cases: pathLength = 0 or tailLength > pathLength\n float segFragment = 0.0;\n if (pathLength != 0.0) {\n segFragment = tailLength / pathLength;\n }\n if (tailLength > pathLength) {\n segFragment = 1.0;\n }\n float startSegmentIndex = mod(offset, 60.0) / 60.0;\n // the end offset, cap to 1.0 (end of the line)\n float endSegmentIndex = min(startSegmentIndex + segFragment, 1.0);\n if (segmentIndex < startSegmentIndex || segmentIndex > endSegmentIndex) {\n gl_FragColor = vec4(0.0, 0.0, 0.0, 0.0);\n } else {\n // fading tail\n float portion = (segmentIndex - startSegmentIndex) / segFragment;\n gl_FragColor[3] = portion;\n }\n }\n}\n`;\n"],
5
5
  "mappings": "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",
6
6
  "names": ["isEqual", "import_meta", "defaultOptions", "defaultOptions", "getOffset", "offX", "offY", "import_core", "Color", "import_core", "import_layers", "import_core", "import_core", "import_layers", "getColor", "import_core", "import_layers", "import_core", "import_layers", "import_core", "import_core", "import_layers", "import_core", "import_core", "import_layers", "import_core", "import_layers", "import_core", "import_layers", "import_core", "import_layers", "getColor", "import_core", "import_core", "import_layers", "fs", "defaultProps", "fs", "defaultProps", "getOffset"]
7
7
  }