@deck.gl-community/graph-layers 9.0.0

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 (210) hide show
  1. package/LICENSE +20 -0
  2. package/README.md +7 -0
  3. package/dist/core/base-layout.d.ts +71 -0
  4. package/dist/core/base-layout.js +133 -0
  5. package/dist/core/cache.d.ts +14 -0
  6. package/dist/core/cache.js +26 -0
  7. package/dist/core/constants.d.ts +101 -0
  8. package/dist/core/constants.js +48 -0
  9. package/dist/core/edge.d.ts +86 -0
  10. package/dist/core/edge.js +121 -0
  11. package/dist/core/graph-engine.d.ts +54 -0
  12. package/dist/core/graph-engine.js +128 -0
  13. package/dist/core/graph.d.ts +155 -0
  14. package/dist/core/graph.js +301 -0
  15. package/dist/core/interaction-manager.d.ts +40 -0
  16. package/dist/core/interaction-manager.js +169 -0
  17. package/dist/core/node.d.ts +103 -0
  18. package/dist/core/node.js +177 -0
  19. package/dist/index.cjs +3540 -0
  20. package/dist/index.cjs.map +7 -0
  21. package/dist/index.d.ts +19 -0
  22. package/dist/index.js +28 -0
  23. package/dist/layers/common-layers/flow-path-layer/flow-path-layer-fragment.glsl.d.ts +1 -0
  24. package/dist/layers/common-layers/flow-path-layer/flow-path-layer-fragment.glsl.js +49 -0
  25. package/dist/layers/common-layers/flow-path-layer/flow-path-layer-vertex-tf.glsl.d.ts +1 -0
  26. package/dist/layers/common-layers/flow-path-layer/flow-path-layer-vertex-tf.glsl.js +14 -0
  27. package/dist/layers/common-layers/flow-path-layer/flow-path-layer-vertex.glsl.d.ts +1 -0
  28. package/dist/layers/common-layers/flow-path-layer/flow-path-layer-vertex.glsl.js +73 -0
  29. package/dist/layers/common-layers/flow-path-layer/flow-path-layer.d.ts +20 -0
  30. package/dist/layers/common-layers/flow-path-layer/flow-path-layer.js +133 -0
  31. package/dist/layers/common-layers/marker-layer/atlas-data-url.d.ts +3 -0
  32. package/dist/layers/common-layers/marker-layer/atlas-data-url.js +8 -0
  33. package/dist/layers/common-layers/marker-layer/marker-layer.d.ts +13 -0
  34. package/dist/layers/common-layers/marker-layer/marker-layer.js +29 -0
  35. package/dist/layers/common-layers/marker-layer/marker-list.d.ts +62 -0
  36. package/dist/layers/common-layers/marker-layer/marker-list.js +67 -0
  37. package/dist/layers/common-layers/marker-layer/marker-mapping.d.ts +422 -0
  38. package/dist/layers/common-layers/marker-layer/marker-mapping.js +427 -0
  39. package/dist/layers/common-layers/spline-layer/spline-layer.d.ts +24 -0
  40. package/dist/layers/common-layers/spline-layer/spline-layer.js +68 -0
  41. package/dist/layers/common-layers/zoomable-text-layer/zoomable-text-layer.d.ts +16 -0
  42. package/dist/layers/common-layers/zoomable-text-layer/zoomable-text-layer.js +65 -0
  43. package/dist/layers/edge-layer.d.ts +25 -0
  44. package/dist/layers/edge-layer.js +75 -0
  45. package/dist/layers/edge-layers/curved-edge-layer.d.ts +6 -0
  46. package/dist/layers/edge-layers/curved-edge-layer.js +69 -0
  47. package/dist/layers/edge-layers/edge-label-layer.d.ts +6 -0
  48. package/dist/layers/edge-layers/edge-label-layer.js +42 -0
  49. package/dist/layers/edge-layers/flow-layer.d.ts +6 -0
  50. package/dist/layers/edge-layers/flow-layer.js +28 -0
  51. package/dist/layers/edge-layers/path-edge-layer.d.ts +6 -0
  52. package/dist/layers/edge-layers/path-edge-layer.js +27 -0
  53. package/dist/layers/edge-layers/straight-line-edge-layer.d.ts +6 -0
  54. package/dist/layers/edge-layers/straight-line-edge-layer.js +26 -0
  55. package/dist/layers/graph-layer.d.ts +32 -0
  56. package/dist/layers/graph-layer.js +193 -0
  57. package/dist/layers/node-layers/circle-layer.d.ts +6 -0
  58. package/dist/layers/node-layers/circle-layer.js +23 -0
  59. package/dist/layers/node-layers/image-layer.d.ts +6 -0
  60. package/dist/layers/node-layers/image-layer.js +23 -0
  61. package/dist/layers/node-layers/label-layer.d.ts +6 -0
  62. package/dist/layers/node-layers/label-layer.js +23 -0
  63. package/dist/layers/node-layers/path-rounded-rectange-layer.d.ts +6 -0
  64. package/dist/layers/node-layers/path-rounded-rectange-layer.js +46 -0
  65. package/dist/layers/node-layers/rectangle-layer.d.ts +6 -0
  66. package/dist/layers/node-layers/rectangle-layer.js +49 -0
  67. package/dist/layers/node-layers/rounded-rectangle-layer-fragment.d.ts +1 -0
  68. package/dist/layers/node-layers/rounded-rectangle-layer-fragment.js +30 -0
  69. package/dist/layers/node-layers/rounded-rectangle-layer.d.ts +8 -0
  70. package/dist/layers/node-layers/rounded-rectangle-layer.js +28 -0
  71. package/dist/layers/node-layers/zoomable-marker-layer.d.ts +10 -0
  72. package/dist/layers/node-layers/zoomable-marker-layer.js +40 -0
  73. package/dist/layouts/d3-force/d3-force-layout.d.ts +24 -0
  74. package/dist/layouts/d3-force/d3-force-layout.js +116 -0
  75. package/dist/layouts/d3-force/worker.d.ts +0 -0
  76. package/dist/layouts/d3-force/worker.js +46 -0
  77. package/dist/layouts/gpu-force/gpu-force-layout.d.ts +30 -0
  78. package/dist/layouts/gpu-force/gpu-force-layout.js +232 -0
  79. package/dist/layouts/gpu-force/worker.d.ts +0 -0
  80. package/dist/layouts/gpu-force/worker.js +116 -0
  81. package/dist/layouts/simple-layout/simple-layout.d.ts +22 -0
  82. package/dist/layouts/simple-layout/simple-layout.js +64 -0
  83. package/dist/loaders/edge-parsers.d.ts +6 -0
  84. package/dist/loaders/edge-parsers.js +17 -0
  85. package/dist/loaders/json-loader.d.ts +7 -0
  86. package/dist/loaders/json-loader.js +16 -0
  87. package/dist/loaders/node-parsers.d.ts +3 -0
  88. package/dist/loaders/node-parsers.js +11 -0
  89. package/dist/style/style-property.d.ts +14 -0
  90. package/dist/style/style-property.js +195 -0
  91. package/dist/style/style-sheet.d.ts +10 -0
  92. package/dist/style/style-sheet.js +252 -0
  93. package/dist/utils/create-graph.d.ts +8 -0
  94. package/dist/utils/create-graph.js +33 -0
  95. package/dist/utils/layer-utils.d.ts +1 -0
  96. package/dist/utils/layer-utils.js +20 -0
  97. package/dist/utils/log.d.ts +2 -0
  98. package/dist/utils/log.js +6 -0
  99. package/dist/utils/polygon-calculations.d.ts +1 -0
  100. package/dist/utils/polygon-calculations.js +102 -0
  101. package/package.json +55 -0
  102. package/src/core/base-layout.ts +154 -0
  103. package/src/core/cache.ts +31 -0
  104. package/src/core/constants.ts +58 -0
  105. package/src/core/edge.ts +145 -0
  106. package/src/core/graph-engine.ts +170 -0
  107. package/src/core/graph.ts +342 -0
  108. package/src/core/interaction-manager.ts +225 -0
  109. package/src/core/node.ts +205 -0
  110. package/src/index.ts +42 -0
  111. package/src/layers/common-layers/flow-path-layer/flow-path-layer-fragment.glsl.ts +50 -0
  112. package/src/layers/common-layers/flow-path-layer/flow-path-layer-vertex-tf.glsl.ts +15 -0
  113. package/src/layers/common-layers/flow-path-layer/flow-path-layer-vertex.glsl.ts +74 -0
  114. package/src/layers/common-layers/flow-path-layer/flow-path-layer.ts +154 -0
  115. package/src/layers/common-layers/marker-layer/atlas-data-url.ts +10 -0
  116. package/src/layers/common-layers/marker-layer/marker-atlas.png +0 -0
  117. package/src/layers/common-layers/marker-layer/marker-layer.ts +36 -0
  118. package/src/layers/common-layers/marker-layer/marker-list.ts +68 -0
  119. package/src/layers/common-layers/marker-layer/marker-mapping.ts +428 -0
  120. package/src/layers/common-layers/marker-layer/markers/bell-filled.png +0 -0
  121. package/src/layers/common-layers/marker-layer/markers/bell.png +0 -0
  122. package/src/layers/common-layers/marker-layer/markers/bookmark-filled.png +0 -0
  123. package/src/layers/common-layers/marker-layer/markers/bookmark.png +0 -0
  124. package/src/layers/common-layers/marker-layer/markers/cd-filled.png +0 -0
  125. package/src/layers/common-layers/marker-layer/markers/cd.png +0 -0
  126. package/src/layers/common-layers/marker-layer/markers/checkmark.png +0 -0
  127. package/src/layers/common-layers/marker-layer/markers/circle-check-filled.png +0 -0
  128. package/src/layers/common-layers/marker-layer/markers/circle-check.png +0 -0
  129. package/src/layers/common-layers/marker-layer/markers/circle-filled.png +0 -0
  130. package/src/layers/common-layers/marker-layer/markers/circle-i-filled.png +0 -0
  131. package/src/layers/common-layers/marker-layer/markers/circle-i.png +0 -0
  132. package/src/layers/common-layers/marker-layer/markers/circle-minus-filled.png +0 -0
  133. package/src/layers/common-layers/marker-layer/markers/circle-minus.png +0 -0
  134. package/src/layers/common-layers/marker-layer/markers/circle-plus-filled.png +0 -0
  135. package/src/layers/common-layers/marker-layer/markers/circle-plus.png +0 -0
  136. package/src/layers/common-layers/marker-layer/markers/circle-questionmark-filled.png +0 -0
  137. package/src/layers/common-layers/marker-layer/markers/circle-questionmark.png +0 -0
  138. package/src/layers/common-layers/marker-layer/markers/circle-slash-filled.png +0 -0
  139. package/src/layers/common-layers/marker-layer/markers/circle-slash.png +0 -0
  140. package/src/layers/common-layers/marker-layer/markers/circle-x-filled.png +0 -0
  141. package/src/layers/common-layers/marker-layer/markers/circle-x.png +0 -0
  142. package/src/layers/common-layers/marker-layer/markers/circle.png +0 -0
  143. package/src/layers/common-layers/marker-layer/markers/diamond-filled.png +0 -0
  144. package/src/layers/common-layers/marker-layer/markers/diamond.png +0 -0
  145. package/src/layers/common-layers/marker-layer/markers/flag-filled.png +0 -0
  146. package/src/layers/common-layers/marker-layer/markers/flag.png +0 -0
  147. package/src/layers/common-layers/marker-layer/markers/gear.png +0 -0
  148. package/src/layers/common-layers/marker-layer/markers/heart-filled.png +0 -0
  149. package/src/layers/common-layers/marker-layer/markers/heart.png +0 -0
  150. package/src/layers/common-layers/marker-layer/markers/location-marker-filled.png +0 -0
  151. package/src/layers/common-layers/marker-layer/markers/location-marker.png +0 -0
  152. package/src/layers/common-layers/marker-layer/markers/octagonal-star-filled.png +0 -0
  153. package/src/layers/common-layers/marker-layer/markers/octagonal-star.png +0 -0
  154. package/src/layers/common-layers/marker-layer/markers/person-filled.png +0 -0
  155. package/src/layers/common-layers/marker-layer/markers/person.png +0 -0
  156. package/src/layers/common-layers/marker-layer/markers/pin-filled.png +0 -0
  157. package/src/layers/common-layers/marker-layer/markers/pin.png +0 -0
  158. package/src/layers/common-layers/marker-layer/markers/plus-small.png +0 -0
  159. package/src/layers/common-layers/marker-layer/markers/plus.png +0 -0
  160. package/src/layers/common-layers/marker-layer/markers/rectangle-filled.png +0 -0
  161. package/src/layers/common-layers/marker-layer/markers/rectangle.png +0 -0
  162. package/src/layers/common-layers/marker-layer/markers/star-filled.png +0 -0
  163. package/src/layers/common-layers/marker-layer/markers/star.png +0 -0
  164. package/src/layers/common-layers/marker-layer/markers/tag-filled.png +0 -0
  165. package/src/layers/common-layers/marker-layer/markers/tag.png +0 -0
  166. package/src/layers/common-layers/marker-layer/markers/thumb-down-filled.png +0 -0
  167. package/src/layers/common-layers/marker-layer/markers/thumb-down.png +0 -0
  168. package/src/layers/common-layers/marker-layer/markers/thumb-up.png +0 -0
  169. package/src/layers/common-layers/marker-layer/markers/thumb_up-filled.png +0 -0
  170. package/src/layers/common-layers/marker-layer/markers/triangle-down-filled.png +0 -0
  171. package/src/layers/common-layers/marker-layer/markers/triangle-down.png +0 -0
  172. package/src/layers/common-layers/marker-layer/markers/triangle-left-filled.png +0 -0
  173. package/src/layers/common-layers/marker-layer/markers/triangle-left.png +0 -0
  174. package/src/layers/common-layers/marker-layer/markers/triangle-right-filled.png +0 -0
  175. package/src/layers/common-layers/marker-layer/markers/triangle-right.png +0 -0
  176. package/src/layers/common-layers/marker-layer/markers/triangle-up-filled.png +0 -0
  177. package/src/layers/common-layers/marker-layer/markers/triangle-up.png +0 -0
  178. package/src/layers/common-layers/marker-layer/markers/x-small.png +0 -0
  179. package/src/layers/common-layers/marker-layer/markers/x.png +0 -0
  180. package/src/layers/common-layers/spline-layer/spline-layer.ts +83 -0
  181. package/src/layers/common-layers/zoomable-text-layer/zoomable-text-layer.ts +90 -0
  182. package/src/layers/edge-layer.ts +88 -0
  183. package/src/layers/edge-layers/curved-edge-layer.ts +88 -0
  184. package/src/layers/edge-layers/edge-label-layer.ts +48 -0
  185. package/src/layers/edge-layers/flow-layer.ts +34 -0
  186. package/src/layers/edge-layers/path-edge-layer.ts +39 -0
  187. package/src/layers/edge-layers/straight-line-edge-layer.ts +38 -0
  188. package/src/layers/graph-layer.ts +225 -0
  189. package/src/layers/node-layers/circle-layer.ts +29 -0
  190. package/src/layers/node-layers/image-layer.ts +29 -0
  191. package/src/layers/node-layers/label-layer.ts +29 -0
  192. package/src/layers/node-layers/path-rounded-rectange-layer.ts +56 -0
  193. package/src/layers/node-layers/rectangle-layer.ts +58 -0
  194. package/src/layers/node-layers/rounded-rectangle-layer-fragment.ts +31 -0
  195. package/src/layers/node-layers/rounded-rectangle-layer.ts +32 -0
  196. package/src/layers/node-layers/zoomable-marker-layer.ts +49 -0
  197. package/src/layouts/d3-force/d3-force-layout.ts +145 -0
  198. package/src/layouts/d3-force/worker.ts +61 -0
  199. package/src/layouts/gpu-force/gpu-force-layout.ts +249 -0
  200. package/src/layouts/gpu-force/worker.ts +137 -0
  201. package/src/layouts/simple-layout/simple-layout.ts +87 -0
  202. package/src/loaders/edge-parsers.ts +21 -0
  203. package/src/loaders/json-loader.ts +19 -0
  204. package/src/loaders/node-parsers.ts +13 -0
  205. package/src/style/style-property.ts +229 -0
  206. package/src/style/style-sheet.ts +277 -0
  207. package/src/utils/create-graph.ts +38 -0
  208. package/src/utils/layer-utils.ts +23 -0
  209. package/src/utils/log.ts +9 -0
  210. package/src/utils/polygon-calculations.ts +154 -0
package/dist/index.cjs ADDED
@@ -0,0 +1,3540 @@
1
+ var __create = Object.create;
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __getProtoOf = Object.getPrototypeOf;
6
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
7
+ var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
8
+ var __export = (target, all) => {
9
+ for (var name in all)
10
+ __defProp(target, name, { get: all[name], enumerable: true });
11
+ };
12
+ var __copyProps = (to, from, except, desc) => {
13
+ if (from && typeof from === "object" || typeof from === "function") {
14
+ for (let key of __getOwnPropNames(from))
15
+ if (!__hasOwnProp.call(to, key) && key !== except)
16
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
17
+ }
18
+ return to;
19
+ };
20
+ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
21
+ // If the importer is in node compatibility mode or this is not an ESM
22
+ // file that has been converted to a CommonJS file using a Babel-
23
+ // compatible transform (i.e. "__esModule" has not been set), then set
24
+ // "default" to the CommonJS "module.exports" for node compatibility.
25
+ isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
26
+ mod
27
+ ));
28
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
29
+ var __publicField = (obj, key, value) => {
30
+ __defNormalProp(obj, typeof key !== "symbol" ? key + "" : key, value);
31
+ return value;
32
+ };
33
+
34
+ // dist/index.js
35
+ var dist_exports = {};
36
+ __export(dist_exports, {
37
+ BaseLayout: () => BaseLayout,
38
+ CompositeEdgeLayer: () => EdgeLayer,
39
+ D3ForceLayout: () => D3ForceLayout,
40
+ EDGE_DECORATOR_TYPE: () => EDGE_DECORATOR_TYPE,
41
+ EDGE_TYPE: () => EDGE_TYPE,
42
+ Edge: () => Edge,
43
+ EdgeLayer: () => EdgeLayer,
44
+ GPUForceLayout: () => GPUForceLayout,
45
+ Graph: () => Graph,
46
+ GraphEngine: () => GraphEngine,
47
+ GraphLayer: () => GraphLayer,
48
+ JSONLoader: () => JSONLoader,
49
+ LAYOUT_STATE: () => LAYOUT_STATE,
50
+ MARKER_TYPE: () => MARKER_TYPE,
51
+ NODE_STATE: () => NODE_STATE,
52
+ NODE_TYPE: () => NODE_TYPE,
53
+ Node: () => Node,
54
+ SimpleLayout: () => SimpleLayout,
55
+ basicEdgeParser: () => basicEdgeParser,
56
+ basicNodeParser: () => basicNodeParser,
57
+ createGraph: () => createGraph,
58
+ log: () => log,
59
+ mixedGetPosition: () => mixedGetPosition
60
+ });
61
+ module.exports = __toCommonJS(dist_exports);
62
+
63
+ // dist/core/cache.js
64
+ var Cache = class {
65
+ _keys = /* @__PURE__ */ new Map();
66
+ /**
67
+ * @param key The key of the cache
68
+ * @returns {*} The value of the cache as set by the `set` method.
69
+ */
70
+ get(key) {
71
+ var _a;
72
+ return (_a = this._keys.get(key)) == null ? void 0 : _a.value;
73
+ }
74
+ /**
75
+ * @param key The key of the cache
76
+ * @param createValue A callback to create the value of the cache if it is needed.
77
+ * @param version The version of the cache. If the version is smaller than the current version, the cache will not be updated.
78
+ */
79
+ set(key, createValue, version) {
80
+ const cached = this._keys.get(key);
81
+ const keyUpdated = cached === void 0 || version > cached.version;
82
+ if (!keyUpdated) {
83
+ return;
84
+ }
85
+ this._keys.set(key, { version, value: createValue() });
86
+ }
87
+ };
88
+
89
+ // dist/core/graph-engine.js
90
+ var GraphEngine = class extends EventTarget {
91
+ _graph;
92
+ _layout;
93
+ _cache = new Cache();
94
+ _layoutDirty = false;
95
+ _transactionInProgress = false;
96
+ constructor(graph, layout) {
97
+ super();
98
+ this._graph = graph;
99
+ this._layout = layout;
100
+ }
101
+ /** Getters */
102
+ getNodes = () => {
103
+ this._updateCache("nodes", () => this._graph.getNodes().filter((node) => this.getNodePosition(node)));
104
+ return this._cache.get("nodes");
105
+ };
106
+ getEdges = () => {
107
+ this._updateCache("edges", () => this._graph.getEdges().filter((edge) => this.getEdgePosition(edge)));
108
+ return this._cache.get("edges");
109
+ };
110
+ getNodePosition = (node) => this._layout.getNodePosition(node);
111
+ getEdgePosition = (edge) => this._layout.getEdgePosition(edge);
112
+ getGraphVersion = () => this._graph.version;
113
+ getLayoutLastUpdate = () => this._layout.version;
114
+ getLayoutState = () => this._layout.state;
115
+ /** Operations on the graph */
116
+ lockNodePosition = (node, x, y) => this._layout.lockNodePosition(node, x, y);
117
+ unlockNodePosition = (node) => this._layout.unlockNodePosition(node);
118
+ /**
119
+ * @fires GraphEngine#onLayoutStart
120
+ */
121
+ _onLayoutStart = () => {
122
+ this.dispatchEvent(new CustomEvent("onLayoutStart"));
123
+ };
124
+ /**
125
+ * @fires GraphEngine#onLayoutChange
126
+ */
127
+ _onLayoutChange = () => {
128
+ this.dispatchEvent(new CustomEvent("onLayoutChange"));
129
+ };
130
+ /**
131
+ * @fires GraphEngine#onLayoutDone
132
+ */
133
+ _onLayoutDone = () => {
134
+ this.dispatchEvent(new CustomEvent("onLayoutDone"));
135
+ };
136
+ /**
137
+ * @fires GraphEngine#onLayoutError
138
+ */
139
+ _onLayoutError = () => {
140
+ this.dispatchEvent(new CustomEvent("onLayoutError"));
141
+ };
142
+ _onGraphStructureChanged = (entity) => {
143
+ this._layoutDirty = true;
144
+ this._graphChanged();
145
+ };
146
+ _onTransactionStart = () => {
147
+ this._transactionInProgress = true;
148
+ };
149
+ _onTransactionEnd = () => {
150
+ this._transactionInProgress = false;
151
+ this._graphChanged();
152
+ };
153
+ /** Layout calculations */
154
+ run = () => {
155
+ this._graph.addEventListener("transactionStart", this._onTransactionStart);
156
+ this._graph.addEventListener("transactionEnd", this._onTransactionEnd);
157
+ this._graph.addEventListener("onNodeAdded", this._onGraphStructureChanged);
158
+ this._graph.addEventListener("onNodeRemoved", this._onGraphStructureChanged);
159
+ this._graph.addEventListener("onEdgeAdded", this._onGraphStructureChanged);
160
+ this._graph.addEventListener("onEdgeRemoved", this._onGraphStructureChanged);
161
+ this._layout.addEventListener("onLayoutStart", this._onLayoutStart);
162
+ this._layout.addEventListener("onLayoutChange", this._onLayoutChange);
163
+ this._layout.addEventListener("onLayoutDone", this._onLayoutDone);
164
+ this._layout.addEventListener("onLayoutError", this._onLayoutError);
165
+ this._layout.initializeGraph(this._graph);
166
+ this._layout.start();
167
+ };
168
+ clear = () => {
169
+ this._graph.removeEventListener("transactionStart", this._onTransactionStart);
170
+ this._graph.removeEventListener("transactionEnd", this._onTransactionEnd);
171
+ this._graph.removeEventListener("onNodeAdded", this._onGraphStructureChanged);
172
+ this._graph.removeEventListener("onNodeRemoved", this._onGraphStructureChanged);
173
+ this._graph.removeEventListener("onEdgeAdded", this._onGraphStructureChanged);
174
+ this._graph.removeEventListener("onEdgeRemoved", this._onGraphStructureChanged);
175
+ this._layout.removeEventListener("onLayoutStart", this._onLayoutStart);
176
+ this._layout.removeEventListener("onLayoutChange", this._onLayoutChange);
177
+ this._layout.removeEventListener("onLayoutDone", this._onLayoutDone);
178
+ this._layout.removeEventListener("onLayoutError", this._onLayoutError);
179
+ };
180
+ resume = () => this._layout.resume();
181
+ stop = () => this._layout.stop();
182
+ _graphChanged = () => {
183
+ if (this._layoutDirty && !this._transactionInProgress) {
184
+ this._updateLayout();
185
+ }
186
+ };
187
+ _updateLayout = () => {
188
+ this._layout.updateGraph(this._graph);
189
+ this._layout.update();
190
+ this._layoutDirty = false;
191
+ };
192
+ _updateCache(key, updateValue) {
193
+ this._cache.set(key, updateValue, this._graph.version + this._layout.version);
194
+ }
195
+ };
196
+
197
+ // dist/utils/log.js
198
+ var import_probe = require("probe.gl");
199
+ var log = new import_probe.Log({ id: "react-graph-layers" }).enable();
200
+ log.log({ color: import_probe.COLOR.CYAN }, "Initialize react-graph-layers logger.")();
201
+
202
+ // dist/core/graph.js
203
+ var Graph = class extends EventTarget {
204
+ /** List object of nodes. */
205
+ _nodeMap = {};
206
+ /** List of object edges. */
207
+ _edgeMap = {};
208
+ /**
209
+ * Identifies whether performing dirty check when streaming new data. If
210
+ * the name of the graph is not specified, will fall back to current time stamp.
211
+ */
212
+ _name = Date.now().toString();
213
+ /** Version the graph. A version is a number that is incremented every time the graph is updated. */
214
+ version = 0;
215
+ /** Cached data: create array data from maps. */
216
+ _cache = new Cache();
217
+ /**
218
+ * The constructor of the Graph class.
219
+ * @param {Object} graph - copy the graph if this exists.
220
+ */
221
+ constructor(graph = null) {
222
+ super();
223
+ if (graph) {
224
+ this._nodeMap = graph._nodeMap;
225
+ this._edgeMap = graph._edgeMap;
226
+ this._name = graph && graph._name;
227
+ }
228
+ }
229
+ /**
230
+ * Set graph name
231
+ * @param {string} name
232
+ */
233
+ setGraphName(name) {
234
+ this._name = name;
235
+ }
236
+ /** Get the name of the graph. Default value is the time stamp when creating this graph.
237
+ * @return {string} graph name.
238
+ */
239
+ getGraphName() {
240
+ return this._name.toString();
241
+ }
242
+ /**
243
+ * Perform a batch of operations defined by cb before indicating graph is updated
244
+ * @param {function} cb - a callback fuction containing the operations to perform
245
+ */
246
+ transaction(cb) {
247
+ try {
248
+ this.dispatchEvent(new CustomEvent("transactionStart"));
249
+ return cb();
250
+ } finally {
251
+ this.dispatchEvent(new CustomEvent("transactionEnd"));
252
+ }
253
+ }
254
+ /**
255
+ * Add a new node to the graph.
256
+ * @param {Node} node - expect a Node object to be added to the graph.
257
+ */
258
+ addNode(node) {
259
+ this._nodeMap[node.getId()] = node;
260
+ this._bumpVersion();
261
+ this.dispatchEvent(new CustomEvent("onNodeAdded", { node }));
262
+ }
263
+ /**
264
+ * Batch add nodes to the graph.
265
+ * @param {Node[]} nodes - a list of nodes to be added.
266
+ */
267
+ batchAddNodes(nodes) {
268
+ this._nodeMap = nodes.reduce((res, node) => {
269
+ res[node.getId()] = node;
270
+ this.dispatchEvent(new CustomEvent("onNodeAdded", { node }));
271
+ return res;
272
+ }, { ...this._nodeMap });
273
+ this._bumpVersion();
274
+ }
275
+ /**
276
+ * Get all the nodes of the graph.
277
+ * @return {Node[]} - get all the nodes in the graph.
278
+ */
279
+ getNodes() {
280
+ this._updateCache("nodes", () => Object.values(this._nodeMap));
281
+ return this._cache.get("nodes");
282
+ }
283
+ /**
284
+ * Get the node map of the graph. The key of the map is the ID of the nodes.
285
+ * @return {Object} - a map of nodes keyed by node IDs.
286
+ */
287
+ getNodeMap() {
288
+ return this._nodeMap;
289
+ }
290
+ /**
291
+ * Find a node by id
292
+ * @param {String} nodeId The id of the node
293
+ * @return {Object} Node
294
+ */
295
+ findNode(nodeId) {
296
+ return this._nodeMap[nodeId];
297
+ }
298
+ /**
299
+ * Update the indicated node to the provided value
300
+ * @param {Node} node
301
+ */
302
+ updateNode(node) {
303
+ this._nodeMap[node.getId()] = node;
304
+ this._bumpVersion();
305
+ this.dispatchEvent(new CustomEvent("onNodeUpdated", { node }));
306
+ }
307
+ /**
308
+ * Add a new edge to the graph.
309
+ * @param {Edge} edge - expect a Edge object to be added to the graph.
310
+ */
311
+ addEdge(edge) {
312
+ const sourceNode = this.findNode(edge.getSourceNodeId());
313
+ const targetNode = this.findNode(edge.getTargetNodeId());
314
+ if (!sourceNode || !targetNode) {
315
+ log.warn(`Unable to add edge ${edge.id}, source or target node is missing.`)();
316
+ return;
317
+ }
318
+ this._edgeMap[edge.getId()] = edge;
319
+ sourceNode.addConnectedEdges(edge);
320
+ targetNode.addConnectedEdges(edge);
321
+ this._bumpVersion();
322
+ this.dispatchEvent(new CustomEvent("onEdgeAdded", { edge }));
323
+ }
324
+ /**
325
+ * Batch add edges to the graph
326
+ * @param {Edge[]} edges - a list of edges to be added.
327
+ */
328
+ batchAddEdges(edges) {
329
+ edges.forEach((edge) => this.addEdge(edge));
330
+ this._bumpVersion();
331
+ }
332
+ /**
333
+ * Update the indicated edge to the provided value
334
+ * @param {Edge} edge
335
+ */
336
+ updateEdge(edge) {
337
+ this._edgeMap[edge.getId()] = edge;
338
+ this._bumpVersion();
339
+ this.dispatchEvent(new CustomEvent("onEdgeUpdated", { edge }));
340
+ }
341
+ /**
342
+ * Remove a node from the graph by node ID
343
+ * @param {String|Number} nodeId - the ID of the target node.
344
+ */
345
+ removeNode(nodeId) {
346
+ const node = this.findNode(nodeId);
347
+ if (!node) {
348
+ log.warn(`Unable to remove node ${nodeId} - doesn't exist`)();
349
+ return;
350
+ }
351
+ node.getConnectedEdges().forEach((e) => {
352
+ delete this._edgeMap[e.getId()];
353
+ });
354
+ delete this._nodeMap[nodeId];
355
+ this._bumpVersion();
356
+ this.dispatchEvent(new CustomEvent("onNodeRemoved", { node }));
357
+ }
358
+ /**
359
+ * Get all the edges of the graph.
360
+ * @return {Edge[]} get all the edges in the graph.
361
+ */
362
+ getEdges() {
363
+ this._updateCache("edges", () => Object.values(this._edgeMap));
364
+ return this._cache.get("edges");
365
+ }
366
+ /**
367
+ * Get the edge map of the graph. The key of the map is the ID of the edges.
368
+ * @return {Object} - a map of edges keyed by edge IDs.
369
+ */
370
+ getEdgeMap() {
371
+ return this._edgeMap;
372
+ }
373
+ /**
374
+ * Remove an edge from the graph by the edge ID
375
+ * @param {String|Number} edgeId - the target edge ID.
376
+ */
377
+ removeEdge(edgeId) {
378
+ const edge = this.findEdge(edgeId);
379
+ if (!edge) {
380
+ log.warn(`Unable to remove edge ${edgeId} - doesn't exist`)();
381
+ return;
382
+ }
383
+ const sourceNode = this.findNode(edge.getSourceNodeId());
384
+ const targetNode = this.findNode(edge.getTargetNodeId());
385
+ delete this._edgeMap[edgeId];
386
+ sourceNode.removeConnectedEdges(edge);
387
+ targetNode.removeConnectedEdges(edge);
388
+ this._bumpVersion();
389
+ }
390
+ /**
391
+ * Find the edge by edge ID.
392
+ * @param {String|Number} id - the target edge ID
393
+ * @return {Edge} - the target edge.
394
+ */
395
+ findEdge(edgeId) {
396
+ return this._edgeMap[edgeId];
397
+ }
398
+ /**
399
+ * Return all the connected edges of a node by nodeID.
400
+ * @param {String|Number} nodeId - the target node ID
401
+ * @return {Edge[]} - an array of the connected edges.
402
+ */
403
+ getConnectedEdges(nodeId) {
404
+ const node = this.findNode(nodeId);
405
+ if (!node) {
406
+ log.warn(`Unable to find node ${nodeId} - doesn't exist`)();
407
+ return [];
408
+ }
409
+ return node.getConnectedEdges();
410
+ }
411
+ /**
412
+ * Return all the sibling nodes of a node by nodeID.
413
+ * @param {String|Number} nodeId - the target node ID
414
+ * @return {Node[]} - an array of the sibling nodes.
415
+ */
416
+ getNodeSiblings(nodeId) {
417
+ const node = this.findNode(nodeId);
418
+ if (!node) {
419
+ log.warn(`Unable to find node ${nodeId} - doesn't exist`)();
420
+ return [];
421
+ }
422
+ return node.getSiblingIds().map((siblingNodeId) => this.findNode(siblingNodeId));
423
+ }
424
+ /**
425
+ * Get the degree of a node.
426
+ * @param {String|Number} nodeId - the target node ID.
427
+ * @return {Number} - the degree of the node.
428
+ */
429
+ getDegree(nodeId) {
430
+ const node = this.findNode(nodeId);
431
+ if (!node) {
432
+ log.warn(`Unable to find node ${nodeId} - doesn't exist`)();
433
+ return 0;
434
+ }
435
+ return node.getDegree();
436
+ }
437
+ /**
438
+ * Clean up all the nodes in the graph.
439
+ */
440
+ resetNodes() {
441
+ this._nodeMap = {};
442
+ this._bumpVersion();
443
+ }
444
+ /**
445
+ * Clean up all the edges in the graph.
446
+ */
447
+ resetEdges() {
448
+ this._edgeMap = {};
449
+ this._bumpVersion();
450
+ }
451
+ /**
452
+ * Clean up everything in the graph.
453
+ */
454
+ reset() {
455
+ this.resetNodes();
456
+ this.resetEdges();
457
+ this._bumpVersion();
458
+ }
459
+ /**
460
+ * Trigger an update to the graph.
461
+ */
462
+ triggerUpdate() {
463
+ this._bumpVersion();
464
+ }
465
+ /**
466
+ * Return true if the graph is empty.
467
+ * @return {Boolean} Return true if the graph is empty.
468
+ */
469
+ isEmpty() {
470
+ return Object.keys(this._nodeMap).length === 0;
471
+ }
472
+ /**
473
+ * Check the equality of two graphs data by checking last update time stamp
474
+ * @param {Object} g Another graph to be compared against itself
475
+ * @return {Bool} True if the graph is the same as itself.
476
+ */
477
+ equals(g) {
478
+ if (!g || !(g instanceof Graph)) {
479
+ return false;
480
+ }
481
+ return this.version === g.version;
482
+ }
483
+ _bumpVersion() {
484
+ this.version += 1;
485
+ }
486
+ _updateCache(key, updateValue) {
487
+ this._cache.set(key, updateValue, this.version);
488
+ }
489
+ };
490
+
491
+ // dist/layers/common-layers/marker-layer/marker-list.js
492
+ var MarkerList = {
493
+ "bell-filled": "bell-filled",
494
+ bell: "bell",
495
+ "bookmark-filled": "bookmark-filled",
496
+ bookmark: "bookmark",
497
+ "cd-filled": "cd-filled",
498
+ cd: "cd",
499
+ checkmark: "checkmark",
500
+ "circle-check-filled": "circle-check-filled",
501
+ "circle-check": "circle-check",
502
+ "circle-filled": "circle-filled",
503
+ "circle-i-filled": "circle-i-filled",
504
+ "circle-i": "circle-i",
505
+ "circle-minus-filled": "circle-minus-filled",
506
+ "circle-minus": "circle-minus",
507
+ "circle-plus-filled": "circle-plus-filled",
508
+ "circle-plus": "circle-plus",
509
+ "circle-questionmark-filled": "circle-questionmark-filled",
510
+ "circle-questionmark": "circle-questionmark",
511
+ "circle-slash-filled": "circle-slash-filled",
512
+ "circle-slash": "circle-slash",
513
+ "circle-x-filled": "circle-x-filled",
514
+ "circle-x": "circle-x",
515
+ circle: "circle",
516
+ "diamond-filled": "diamond-filled",
517
+ diamond: "diamond",
518
+ "flag-filled": "flag-filled",
519
+ flag: "flag",
520
+ gear: "gear",
521
+ "heart-filled": "heart-filled",
522
+ heart: "heart",
523
+ "location-marker-filled": "location-marker-filled",
524
+ "location-marker": "location-marker",
525
+ "octagonal-star-filled": "octagonal-star-filled",
526
+ "octagonal-star": "octagonal-star",
527
+ "person-filled": "person-filled",
528
+ person: "person",
529
+ "pin-filled": "pin-filled",
530
+ pin: "pin",
531
+ "plus-small": "plus-small",
532
+ plus: "plus",
533
+ "rectangle-filled": "rectangle-filled",
534
+ rectangle: "rectangle",
535
+ "star-filled": "star-filled",
536
+ star: "star",
537
+ "tag-filled": "tag-filled",
538
+ tag: "tag",
539
+ "thumb-down-filled": "thumb-down-filled",
540
+ "thumb-down": "thumb-down",
541
+ "thumb-up": "thumb-up",
542
+ "thumb_up-filled": "thumb_up-filled",
543
+ "triangle-down-filled": "triangle-down-filled",
544
+ "triangle-down": "triangle-down",
545
+ "triangle-left-filled": "triangle-left-filled",
546
+ "triangle-left": "triangle-left",
547
+ "triangle-right-filled": "triangle-right-filled",
548
+ "triangle-right": "triangle-right",
549
+ "triangle-up-filled": "triangle-up-filled",
550
+ "triangle-up": "triangle-up",
551
+ "x-small": "x-small",
552
+ x: "x"
553
+ };
554
+
555
+ // dist/core/constants.js
556
+ var MARKER_TYPE = MarkerList;
557
+ var NODE_STATE = {
558
+ DEFAULT: "default",
559
+ HOVER: "hover",
560
+ DRAGGING: "dragging",
561
+ SELECTED: "selected"
562
+ };
563
+ var EDGE_STATE = {
564
+ DEFAULT: "default",
565
+ HOVER: "hover",
566
+ DRAGGING: "dragging",
567
+ SELECTED: "selected"
568
+ };
569
+ var NODE_TYPE = {
570
+ CIRCLE: "CIRCLE",
571
+ RECTANGLE: "RECTANGLE",
572
+ ROUNDED_RECTANGLE: "ROUNDED_RECTANGLE",
573
+ PATH_ROUNDED_RECTANGLE: "PATH_ROUNDED_RECTANGLE",
574
+ ICON: "ICON",
575
+ LABEL: "LABEL",
576
+ MARKER: "MARKER"
577
+ };
578
+ var EDGE_TYPE = {
579
+ SPLINE_CURVE: "SPLINE_CURVE",
580
+ LINE: "LINE",
581
+ PATH: "PATH"
582
+ };
583
+ var EDGE_DECORATOR_TYPE = {
584
+ LABEL: "EDGE_LABEL",
585
+ FLOW: "FLOW"
586
+ };
587
+ var LAYOUT_STATE = {
588
+ INIT: "INIT",
589
+ START: "START",
590
+ CALCULATING: "CALCULATING",
591
+ DONE: "DONE",
592
+ ERROR: "ERROR"
593
+ };
594
+
595
+ // dist/core/node.js
596
+ var Node = class {
597
+ id;
598
+ /** Keep a reference to origin data. */
599
+ _data;
600
+ /** List edges. */
601
+ _connectedEdges = {};
602
+ /** Interaction state of the node. */
603
+ state = NODE_STATE.DEFAULT;
604
+ /** Can the node be selected? */
605
+ _selectable;
606
+ /** Should the state of this node affect the state of the connected edges? */
607
+ _highlightConnectedEdges;
608
+ /** Check the type of the object when picking engine gets it. */
609
+ isNode = true;
610
+ /**
611
+ * The constructor of a node
612
+ * @param {String|Number} options.id - the unique ID of the node
613
+ * @param {Record<string, unknown>} options.data - origin data reference
614
+ */
615
+ constructor({ id, selectable = false, highlightConnectedEdges = false, data = {} }) {
616
+ this.id = id;
617
+ this._data = data;
618
+ this._selectable = selectable;
619
+ this._highlightConnectedEdges = highlightConnectedEdges;
620
+ }
621
+ /**
622
+ * Return the ID of the node
623
+ * @return {String|Number} - the ID of the node.
624
+ */
625
+ getId() {
626
+ return this.id;
627
+ }
628
+ /**
629
+ * Return the degree of the node -- includes in-degree and out-degree
630
+ * @return {Number} - the degree of the node.
631
+ */
632
+ getDegree() {
633
+ return Object.keys(this._connectedEdges).length;
634
+ }
635
+ /**
636
+ * Return the in-degree of the node.
637
+ * @return {Number} - the in-degree of the node.
638
+ */
639
+ getInDegree() {
640
+ const nodeId = this.getId();
641
+ return this.getConnectedEdges().reduce((count, e) => {
642
+ const isDirected = e.isDirected();
643
+ if (isDirected && e.getTargetNodeId() === nodeId) {
644
+ count += 1;
645
+ }
646
+ return count;
647
+ }, 0);
648
+ }
649
+ /**
650
+ * Return the out-degree of the node.
651
+ * @return {Number} - the out-degree of the node.
652
+ */
653
+ getOutDegree() {
654
+ const nodeId = this.getId();
655
+ return this.getConnectedEdges().reduce((count, e) => {
656
+ const isDirected = e.isDirected();
657
+ if (isDirected && e.getSourceNodeId() === nodeId) {
658
+ count += 1;
659
+ }
660
+ return count;
661
+ }, 0);
662
+ }
663
+ /**
664
+ * Return all the IDs of the sibling nodes.
665
+ * @return {String[]} [description]
666
+ */
667
+ getSiblingIds() {
668
+ const nodeId = this.getId();
669
+ return this.getConnectedEdges().reduce((siblings, e) => {
670
+ if (e.getTargetNodeId() === nodeId) {
671
+ siblings.push(e.getSourceNodeId());
672
+ } else {
673
+ siblings.push(e.getTargetNodeId());
674
+ }
675
+ return siblings;
676
+ }, []);
677
+ }
678
+ /**
679
+ * Return all the connected edges.
680
+ * @return {Object[]} - an array of the connected edges.
681
+ */
682
+ getConnectedEdges() {
683
+ return Object.values(this._connectedEdges);
684
+ }
685
+ /**
686
+ * Return of the value of the selected property key.
687
+ * @param {String} key - property key.
688
+ * @return {Any} - the value of the property or undefined (not found).
689
+ */
690
+ getPropertyValue(key) {
691
+ if (this.hasOwnProperty(key)) {
692
+ return this[key];
693
+ } else if (this._data.hasOwnProperty(key)) {
694
+ return this._data[key];
695
+ }
696
+ return void 0;
697
+ }
698
+ /**
699
+ * Set the new node data.
700
+ * @param {Record<string, unknown>} data - the new data of the node
701
+ */
702
+ setData(data) {
703
+ this._data = data;
704
+ }
705
+ /**
706
+ * Update a data property.
707
+ * @param {String} key - the key of the property
708
+ * @param {Any} value - the value of the property.
709
+ */
710
+ setDataProperty(key, value) {
711
+ this._data[key] = value;
712
+ }
713
+ /**
714
+ * Set node state
715
+ * @param {String} state - one of NODE_STATE
716
+ */
717
+ setState(state) {
718
+ this.state = state;
719
+ }
720
+ /**
721
+ * Get node state
722
+ * @returns {string} state - one of NODE_STATE
723
+ */
724
+ getState() {
725
+ return this.state;
726
+ }
727
+ /**
728
+ * Add connected edges to the node
729
+ * @param {Edge || Edge[]} edge an edge or an array of edges to be added to this._connectedEdges
730
+ */
731
+ addConnectedEdges(edge) {
732
+ const iterableEdges = Array.isArray(edge) ? edge : [edge];
733
+ iterableEdges.forEach((e) => {
734
+ this._connectedEdges[e.id] = e;
735
+ e.addNode(this);
736
+ });
737
+ }
738
+ /**
739
+ * Remove edges from this._connectedEdges
740
+ * @param {Edge | Edge[]} edge an edge or an array of edges to be removed from this._connectedEdges
741
+ */
742
+ removeConnectedEdges(edge) {
743
+ const iterableEdges = Array.isArray(edge) ? edge : [edge];
744
+ iterableEdges.forEach((e) => {
745
+ e.removeNode(this);
746
+ delete this._connectedEdges[e.id];
747
+ });
748
+ }
749
+ /**
750
+ * Clear this._connectedEdges
751
+ */
752
+ clearConnectedEdges() {
753
+ Object.values(this._connectedEdges).forEach((e) => e.removeNode(this));
754
+ this._connectedEdges = {};
755
+ }
756
+ isSelectable() {
757
+ return this._selectable;
758
+ }
759
+ shouldHighlightConnectedEdges() {
760
+ return this._highlightConnectedEdges;
761
+ }
762
+ };
763
+
764
+ // dist/core/edge.js
765
+ var Edge = class {
766
+ /** Unique uuid of the edge. */
767
+ id;
768
+ /** ID of the source node. */
769
+ _sourceId;
770
+ /** ID of the target node. */
771
+ _targetId;
772
+ /** Whether the edge is directed or not. */
773
+ _directed;
774
+ /** Origin data reference of the edge. */
775
+ _data;
776
+ /** Check the type of the object when picking engine gets it. */
777
+ isEdge = true;
778
+ /** Nodes at either end of this edge. */
779
+ _connectedNodes = {};
780
+ /** Edge state. */
781
+ state = EDGE_STATE.DEFAULT;
782
+ /**
783
+ * The constructor
784
+ * @param {String|Number} options.id - the unique ID of the edge
785
+ * @param {String|Number} options.sourceId - the ID of the source node
786
+ * @param {String|Number} options.targetId - the ID of the target node
787
+ * @param {Boolean} options.directed - whether the edge is directed or not
788
+ * @param {Record<string, unknown>} options.data - origin data reference
789
+ */
790
+ constructor({ id, sourceId, targetId, data, directed = false }) {
791
+ this.id = id;
792
+ this._sourceId = sourceId;
793
+ this._targetId = targetId;
794
+ this._directed = directed;
795
+ this._data = data;
796
+ }
797
+ /**
798
+ * Return the ID of the edge
799
+ * @return {String|Number} - the ID of the edge.
800
+ */
801
+ getId() {
802
+ return this.id;
803
+ }
804
+ /**
805
+ * Return whether the edge is directed or not.
806
+ * @return {Boolean} true if the edge is directed.
807
+ */
808
+ isDirected() {
809
+ return this._directed;
810
+ }
811
+ /**
812
+ * Get the ID of the source node.
813
+ * @return {String|Number} the ID of the source node.
814
+ */
815
+ getSourceNodeId() {
816
+ return this._sourceId;
817
+ }
818
+ /**
819
+ * Get the ID of the target node.
820
+ * @return {String|Number} the ID of the target node.
821
+ */
822
+ getTargetNodeId() {
823
+ return this._targetId;
824
+ }
825
+ /**
826
+ * Return of the value of the selected property key.
827
+ * @param {String} key - property key.
828
+ * @return {Any} - the value of the property.
829
+ */
830
+ getPropertyValue(key) {
831
+ if (this.hasOwnProperty(key)) {
832
+ return this[key];
833
+ } else if (this._data.hasOwnProperty(key)) {
834
+ return this._data[key];
835
+ }
836
+ return void 0;
837
+ }
838
+ /**
839
+ * Set the origin data as a reference.
840
+ * @param {Object} data - the origin data.
841
+ */
842
+ setData(data) {
843
+ this._data = data;
844
+ }
845
+ /**
846
+ * Update a data property.
847
+ * @param {String} key - the key of the property
848
+ * @param {Any} value - the value of the property.
849
+ */
850
+ setDataProperty(key, value) {
851
+ this._data[key] = value;
852
+ }
853
+ /**
854
+ * Set edge state
855
+ * @param {String} state - one of EDGE_STATE
856
+ */
857
+ setState(state) {
858
+ this.state = state;
859
+ }
860
+ /**
861
+ * Get edge state
862
+ * @returns {string} state - one of EDGE_STATE
863
+ */
864
+ getState() {
865
+ return this.state;
866
+ }
867
+ addNode(node) {
868
+ this._connectedNodes[node.getId()] = node;
869
+ }
870
+ removeNode(node) {
871
+ delete this._connectedNodes[node.getId()];
872
+ }
873
+ getConnectedNodes() {
874
+ return Object.values(this._connectedNodes);
875
+ }
876
+ };
877
+
878
+ // dist/core/base-layout.js
879
+ var import_lodash = __toESM(require("lodash.isequal"), 1);
880
+ var BaseLayout = class extends EventTarget {
881
+ /** Name of the layout. */
882
+ _name = "BaseLayout";
883
+ /** Extra configuration options of the layout. */
884
+ _options;
885
+ version = 0;
886
+ state = LAYOUT_STATE.INIT;
887
+ /**
888
+ * Constructor of BaseLayout
889
+ * @param {Object} options extra configuration options of the layout
890
+ */
891
+ constructor(options = {}) {
892
+ super();
893
+ this._options = options;
894
+ }
895
+ /**
896
+ * @fires BaseLayout#onLayoutStart
897
+ * @protected
898
+ */
899
+ _onLayoutStart() {
900
+ this._updateState(LAYOUT_STATE.CALCULATING);
901
+ this.dispatchEvent(new CustomEvent("onLayoutStart"));
902
+ }
903
+ /**
904
+ * @fires BaseLayout#onLayoutChange
905
+ * @protected
906
+ */
907
+ _onLayoutChange() {
908
+ this._updateState(LAYOUT_STATE.CALCULATING);
909
+ this.dispatchEvent(new CustomEvent("onLayoutChange"));
910
+ }
911
+ /**
912
+ * @fires BaseLayout#onLayoutDone
913
+ * @protected
914
+ */
915
+ _onLayoutDone() {
916
+ this._updateState(LAYOUT_STATE.DONE);
917
+ this.dispatchEvent(new CustomEvent("onLayoutDone"));
918
+ }
919
+ /**
920
+ * @fires BaseLayout#onLayoutError
921
+ * @protected
922
+ */
923
+ _onLayoutError() {
924
+ this._updateState(LAYOUT_STATE.ERROR);
925
+ this.dispatchEvent(new CustomEvent("onLayoutError"));
926
+ }
927
+ /**
928
+ * Check the equality of two layouts
929
+ * @param {Object} layout The layout to be compared.
930
+ * @return {Bool} True if the layout is the same as itself.
931
+ */
932
+ equals(layout) {
933
+ if (!layout || !(layout instanceof BaseLayout)) {
934
+ return false;
935
+ }
936
+ return this._name === layout._name && (0, import_lodash.default)(this._options, layout._options);
937
+ }
938
+ /** virtual functions: will be implemented in the child class */
939
+ // first time to pass the graph data into this layout
940
+ initializeGraph(graph) {
941
+ }
942
+ // update the existing graph
943
+ updateGraph(graph) {
944
+ }
945
+ // start the layout calculation
946
+ start() {
947
+ }
948
+ // update the layout calculation
949
+ update() {
950
+ }
951
+ // resume the layout calculation
952
+ resume() {
953
+ }
954
+ // stop the layout calculation
955
+ stop() {
956
+ }
957
+ // access the position of the node in the layout
958
+ getNodePosition(node) {
959
+ return [0, 0];
960
+ }
961
+ // access the layout information of the edge
962
+ getEdgePosition(edge) {
963
+ return {
964
+ type: EDGE_TYPE.LINE,
965
+ sourcePosition: [0, 0],
966
+ targetPosition: [0, 0],
967
+ controlPoints: []
968
+ };
969
+ }
970
+ /**
971
+ * Pin the node to a designated position, and the node won't move anymore
972
+ * @param {Object} node Node to be locked
973
+ * @param {Number} x x coordinate
974
+ * @param {Number} y y coordinate
975
+ */
976
+ lockNodePosition(node, x, y) {
977
+ }
978
+ /**
979
+ * Unlock the node, the node will be able to move freely.
980
+ * @param {Object} node Node to be unlocked
981
+ */
982
+ unlockNodePosition(node) {
983
+ }
984
+ _updateState(state) {
985
+ this.state = state;
986
+ this.version += 1;
987
+ }
988
+ };
989
+
990
+ // dist/layouts/d3-force/d3-force-layout.js
991
+ var import_meta = {};
992
+ var defaultOptions = {
993
+ alpha: 0.3,
994
+ resumeAlpha: 0.1,
995
+ nBodyStrength: -900,
996
+ nBodyDistanceMin: 100,
997
+ nBodyDistanceMax: 400,
998
+ getCollisionRadius: 0
999
+ };
1000
+ var D3ForceLayout = class extends BaseLayout {
1001
+ _name = "D3";
1002
+ _positionsByNodeId = /* @__PURE__ */ new Map();
1003
+ _graph;
1004
+ _worker;
1005
+ constructor(options) {
1006
+ super(options);
1007
+ this._options = {
1008
+ ...defaultOptions,
1009
+ ...options
1010
+ };
1011
+ }
1012
+ initializeGraph(graph) {
1013
+ this._graph = graph;
1014
+ }
1015
+ // for streaming new data on the same graph
1016
+ updateGraph(graph) {
1017
+ this._graph = graph;
1018
+ this._positionsByNodeId = new Map(this._graph.getNodes().map((node) => [node.id, this._positionsByNodeId.get(node.id)]));
1019
+ }
1020
+ start() {
1021
+ this._engageWorker();
1022
+ this._onLayoutStart();
1023
+ }
1024
+ update() {
1025
+ this._engageWorker();
1026
+ }
1027
+ _engageWorker() {
1028
+ if (this._worker) {
1029
+ this._worker.terminate();
1030
+ }
1031
+ this._worker = new Worker(new URL("./worker.js", import_meta.url).href);
1032
+ this._worker.postMessage({
1033
+ nodes: this._graph.getNodes().map((node) => ({
1034
+ id: node.id,
1035
+ ...this._positionsByNodeId.get(node.id)
1036
+ })),
1037
+ edges: this._graph.getEdges().map((edge) => ({
1038
+ id: edge.id,
1039
+ source: edge.getSourceNodeId(),
1040
+ target: edge.getTargetNodeId()
1041
+ })),
1042
+ options: this._options
1043
+ });
1044
+ this._worker.onmessage = (event) => {
1045
+ if (event.data.type !== "end") {
1046
+ return;
1047
+ }
1048
+ event.data.nodes.forEach(({ id, ...d3 }) => this._positionsByNodeId.set(id, {
1049
+ ...d3,
1050
+ // precompute so that when we return the node position we do not need to do the conversion
1051
+ coordinates: [d3.x, d3.y]
1052
+ }));
1053
+ this._onLayoutChange();
1054
+ this._onLayoutDone();
1055
+ };
1056
+ }
1057
+ resume() {
1058
+ throw new Error("Resume unavailable");
1059
+ }
1060
+ stop() {
1061
+ this._worker.terminate();
1062
+ }
1063
+ getEdgePosition = (edge) => {
1064
+ const sourceNode = this._graph.findNode(edge.getSourceNodeId());
1065
+ const targetNode = this._graph.findNode(edge.getTargetNodeId());
1066
+ if (!this.getNodePosition(sourceNode) || !this.getNodePosition(targetNode)) {
1067
+ return null;
1068
+ }
1069
+ return {
1070
+ type: EDGE_TYPE.LINE,
1071
+ sourcePosition: this.getNodePosition(sourceNode),
1072
+ targetPosition: this.getNodePosition(targetNode),
1073
+ controlPoints: []
1074
+ };
1075
+ };
1076
+ getNodePosition = (node) => {
1077
+ const d3Node = this._positionsByNodeId.get(node.id);
1078
+ if (d3Node) {
1079
+ return d3Node.coordinates;
1080
+ }
1081
+ return null;
1082
+ };
1083
+ lockNodePosition = (node, x, y) => {
1084
+ const d3Node = this._positionsByNodeId.get(node.id);
1085
+ this._positionsByNodeId.set(node.id, {
1086
+ ...d3Node,
1087
+ x,
1088
+ y,
1089
+ fx: x,
1090
+ fy: y,
1091
+ coordinates: [x, y]
1092
+ });
1093
+ this._onLayoutChange();
1094
+ this._onLayoutDone();
1095
+ };
1096
+ unlockNodePosition = (node) => {
1097
+ const d3Node = this._positionsByNodeId.get(node.id);
1098
+ d3Node.fx = null;
1099
+ d3Node.fy = null;
1100
+ };
1101
+ };
1102
+
1103
+ // dist/layouts/gpu-force/gpu-force-layout.js
1104
+ var import_meta2 = {};
1105
+ var defaultOptions2 = {
1106
+ alpha: 0.3,
1107
+ resumeAlpha: 0.1,
1108
+ nBodyStrength: -900,
1109
+ nBodyDistanceMin: 100,
1110
+ nBodyDistanceMax: 400,
1111
+ getCollisionRadius: 0
1112
+ };
1113
+ var GPUForceLayout = class extends BaseLayout {
1114
+ _name = "GPU";
1115
+ _d3Graph;
1116
+ _nodeMap;
1117
+ _edgeMap;
1118
+ _graph;
1119
+ _worker;
1120
+ _callbacks;
1121
+ constructor(options) {
1122
+ super(options);
1123
+ this._name = "GPU";
1124
+ this._options = {
1125
+ ...defaultOptions2,
1126
+ ...options
1127
+ };
1128
+ this._d3Graph = { nodes: [], edges: [] };
1129
+ this._nodeMap = {};
1130
+ this._edgeMap = {};
1131
+ }
1132
+ initializeGraph(graph) {
1133
+ this._graph = graph;
1134
+ this._nodeMap = {};
1135
+ this._edgeMap = {};
1136
+ const d3Nodes = graph.getNodes().map((node) => {
1137
+ const id = node.id;
1138
+ const locked = node.getPropertyValue("locked") || false;
1139
+ const x = node.getPropertyValue("x") || 0;
1140
+ const y = node.getPropertyValue("y") || 0;
1141
+ const collisionRadius = node.getPropertyValue("collisionRadius") || 0;
1142
+ const d3Node = {
1143
+ id,
1144
+ x,
1145
+ y,
1146
+ fx: locked ? x : null,
1147
+ fy: locked ? y : null,
1148
+ collisionRadius,
1149
+ locked
1150
+ };
1151
+ this._nodeMap[node.id] = d3Node;
1152
+ return d3Node;
1153
+ });
1154
+ const d3Edges = graph.getEdges().map((edge) => {
1155
+ const d3Edge = {
1156
+ id: edge.id,
1157
+ source: this._nodeMap[edge.getSourceNodeId()],
1158
+ target: this._nodeMap[edge.getTargetNodeId()]
1159
+ };
1160
+ this._edgeMap[edge.id] = d3Edge;
1161
+ return d3Edge;
1162
+ });
1163
+ this._d3Graph = {
1164
+ nodes: d3Nodes,
1165
+ edges: d3Edges
1166
+ };
1167
+ }
1168
+ start() {
1169
+ this._engageWorker();
1170
+ }
1171
+ update() {
1172
+ this._engageWorker();
1173
+ }
1174
+ _engageWorker() {
1175
+ if (this._worker) {
1176
+ this._worker.terminate();
1177
+ }
1178
+ this._worker = new Worker(new URL("./worker.js", import_meta2.url).href);
1179
+ const { alpha, nBodyStrength, nBodyDistanceMin, nBodyDistanceMax, getCollisionRadius } = this._options;
1180
+ this._worker.postMessage({
1181
+ nodes: this._d3Graph.nodes,
1182
+ edges: this._d3Graph.edges,
1183
+ options: {
1184
+ alpha,
1185
+ nBodyStrength,
1186
+ nBodyDistanceMin,
1187
+ nBodyDistanceMax,
1188
+ getCollisionRadius
1189
+ }
1190
+ });
1191
+ this._worker.onmessage = (event) => {
1192
+ switch (event.data.type) {
1193
+ case "tick":
1194
+ this.ticked(event.data);
1195
+ break;
1196
+ case "end":
1197
+ this.ended(event.data);
1198
+ break;
1199
+ default:
1200
+ break;
1201
+ }
1202
+ };
1203
+ }
1204
+ ticked(data) {
1205
+ }
1206
+ ended(data) {
1207
+ const { nodes, edges } = data;
1208
+ this.updateD3Graph({ nodes, edges });
1209
+ this._onLayoutChange();
1210
+ this._onLayoutDone();
1211
+ }
1212
+ resume() {
1213
+ throw new Error("Resume unavailable");
1214
+ }
1215
+ stop() {
1216
+ this._worker.terminate();
1217
+ }
1218
+ // for steaming new data on the same graph
1219
+ updateGraph(graph) {
1220
+ if (this._graph.getGraphName() !== graph.getGraphName()) {
1221
+ this._nodeMap = {};
1222
+ this._edgeMap = {};
1223
+ }
1224
+ this._graph = graph;
1225
+ const newNodeMap = {};
1226
+ const newD3Nodes = graph.getNodes().map((node) => {
1227
+ const id = node.id;
1228
+ const locked = node.getPropertyValue("locked") || false;
1229
+ const x = node.getPropertyValue("x") || 0;
1230
+ const y = node.getPropertyValue("y") || 0;
1231
+ const fx = locked ? x : null;
1232
+ const fy = locked ? y : null;
1233
+ const collisionRadius = node.getPropertyValue("collisionRadius") || 0;
1234
+ const oldD3Node = this._nodeMap[node.id];
1235
+ const newD3Node = oldD3Node ? oldD3Node : { id, x, y, fx, fy, collisionRadius };
1236
+ newNodeMap[node.id] = newD3Node;
1237
+ return newD3Node;
1238
+ });
1239
+ this._nodeMap = newNodeMap;
1240
+ this._d3Graph.nodes = newD3Nodes;
1241
+ const newEdgeMap = {};
1242
+ const newD3Edges = graph.getEdges().map((edge) => {
1243
+ const oldD3Edge = this._edgeMap[edge.id];
1244
+ const newD3Edge = oldD3Edge || {
1245
+ id: edge.id,
1246
+ source: newNodeMap[edge.getSourceNodeId()],
1247
+ target: newNodeMap[edge.getTargetNodeId()]
1248
+ };
1249
+ newEdgeMap[edge.id] = newD3Edge;
1250
+ return newD3Edge;
1251
+ });
1252
+ this._edgeMap = newEdgeMap;
1253
+ this._d3Graph.edges = newD3Edges;
1254
+ }
1255
+ updateD3Graph(graph) {
1256
+ const existingNodes = this._graph.getNodes();
1257
+ const newNodeMap = {};
1258
+ const newD3Nodes = graph.nodes.map((node) => {
1259
+ const existingNode = existingNodes.find((n) => n.getId() === node.id);
1260
+ existingNode.setDataProperty("locked", node.locked);
1261
+ existingNode.setDataProperty("x", node.x);
1262
+ existingNode.setDataProperty("y", node.y);
1263
+ existingNode.setDataProperty("collisionRadius", node.collisionRadius);
1264
+ newNodeMap[node.id] = node;
1265
+ return node;
1266
+ });
1267
+ this._nodeMap = newNodeMap;
1268
+ this._d3Graph.nodes = newD3Nodes;
1269
+ const newEdgeMap = {};
1270
+ const newD3Edges = graph.edges.map((edge) => {
1271
+ newEdgeMap[edge.id] = edge;
1272
+ return edge;
1273
+ });
1274
+ this._graph.triggerUpdate();
1275
+ this._edgeMap = newEdgeMap;
1276
+ this._d3Graph.edges = newD3Edges;
1277
+ }
1278
+ getNodePosition = (node) => {
1279
+ const d3Node = this._nodeMap[node.id];
1280
+ if (d3Node) {
1281
+ return [d3Node.x, d3Node.y];
1282
+ }
1283
+ return [0, 0];
1284
+ };
1285
+ getEdgePosition = (edge) => {
1286
+ const d3Edge = this._edgeMap[edge.id];
1287
+ const sourcePosition = d3Edge && d3Edge.source;
1288
+ const targetPosition = d3Edge && d3Edge.target;
1289
+ if (d3Edge && sourcePosition && targetPosition) {
1290
+ return {
1291
+ type: EDGE_TYPE.LINE,
1292
+ sourcePosition: [sourcePosition.x, sourcePosition.y],
1293
+ targetPosition: [targetPosition.x, targetPosition.y],
1294
+ controlPoints: []
1295
+ };
1296
+ }
1297
+ return {
1298
+ type: EDGE_TYPE.LINE,
1299
+ sourcePosition: [0, 0],
1300
+ targetPosition: [0, 0],
1301
+ controlPoints: []
1302
+ };
1303
+ };
1304
+ lockNodePosition = (node, x, y) => {
1305
+ const d3Node = this._nodeMap[node.id];
1306
+ d3Node.x = x;
1307
+ d3Node.y = y;
1308
+ d3Node.fx = x;
1309
+ d3Node.fy = y;
1310
+ this._callbacks.onLayoutChange();
1311
+ this._callbacks.onLayoutDone();
1312
+ };
1313
+ unlockNodePosition = (node) => {
1314
+ const d3Node = this._nodeMap[node.id];
1315
+ d3Node.fx = null;
1316
+ d3Node.fy = null;
1317
+ };
1318
+ };
1319
+
1320
+ // dist/layouts/simple-layout/simple-layout.js
1321
+ var defaultOptions3 = {
1322
+ nodePositionAccessor: (node) => [node.getPropertyValue("x"), node.getPropertyValue("y")]
1323
+ };
1324
+ var SimpleLayout = class extends BaseLayout {
1325
+ _name = "SimpleLayout";
1326
+ _graph = null;
1327
+ _nodeMap = {};
1328
+ _nodePositionMap = {};
1329
+ constructor(options = {}) {
1330
+ super({ ...defaultOptions3, ...options });
1331
+ }
1332
+ initializeGraph(graph) {
1333
+ this.updateGraph(graph);
1334
+ }
1335
+ _notifyLayoutComplete() {
1336
+ this._onLayoutStart();
1337
+ this._onLayoutChange();
1338
+ this._onLayoutDone();
1339
+ }
1340
+ start() {
1341
+ this._notifyLayoutComplete();
1342
+ }
1343
+ update() {
1344
+ this._notifyLayoutComplete();
1345
+ }
1346
+ resume() {
1347
+ this._notifyLayoutComplete();
1348
+ }
1349
+ updateGraph(graph) {
1350
+ this._graph = graph;
1351
+ this._nodeMap = graph.getNodes().reduce((res, node) => {
1352
+ res[node.getId()] = node;
1353
+ return res;
1354
+ }, {});
1355
+ this._nodePositionMap = graph.getNodes().reduce((res, node) => {
1356
+ res[node.getId()] = this._options.nodePositionAccessor(node);
1357
+ return res;
1358
+ }, {});
1359
+ }
1360
+ setNodePositionAccessor = (accessor) => {
1361
+ this._options.nodePositionAccessor = accessor;
1362
+ };
1363
+ getNodePosition = (node) => this._nodePositionMap[node.getId()];
1364
+ getEdgePosition = (edge) => {
1365
+ const sourcePos = this._nodePositionMap[edge.getSourceNodeId()];
1366
+ const targetPos = this._nodePositionMap[edge.getTargetNodeId()];
1367
+ return {
1368
+ type: EDGE_TYPE.LINE,
1369
+ sourcePosition: sourcePos,
1370
+ targetPosition: targetPos,
1371
+ controlPoints: []
1372
+ };
1373
+ };
1374
+ lockNodePosition = (node, x, y) => {
1375
+ this._nodePositionMap[node.getId()] = [x, y];
1376
+ this._onLayoutChange();
1377
+ this._onLayoutDone();
1378
+ };
1379
+ };
1380
+
1381
+ // dist/utils/create-graph.js
1382
+ function createGraph({ name, nodes, edges, nodeParser, edgeParser }) {
1383
+ const graph = new Graph();
1384
+ const graphName = name || Date.now();
1385
+ graph.setGraphName(graphName);
1386
+ const glNodes = nodes.map((node) => {
1387
+ const { id } = nodeParser(node);
1388
+ return new Node({
1389
+ id,
1390
+ data: node
1391
+ });
1392
+ });
1393
+ graph.batchAddNodes(glNodes);
1394
+ const glEdges = edges.map((edge) => {
1395
+ const { id, sourceId, targetId, directed } = edgeParser(edge);
1396
+ return new Edge({
1397
+ id,
1398
+ sourceId,
1399
+ targetId,
1400
+ directed,
1401
+ data: edge
1402
+ });
1403
+ });
1404
+ graph.batchAddEdges(glEdges);
1405
+ return graph;
1406
+ }
1407
+
1408
+ // dist/loaders/node-parsers.js
1409
+ function basicNodeParser(node) {
1410
+ if (node.id === void 0) {
1411
+ log.error("Invalid node: id is missing.")();
1412
+ return null;
1413
+ }
1414
+ return { id: node.id };
1415
+ }
1416
+
1417
+ // dist/loaders/edge-parsers.js
1418
+ function basicEdgeParser(edge) {
1419
+ const { id, directed, sourceId, targetId } = edge;
1420
+ if (sourceId === void 0 || targetId === void 0) {
1421
+ log.error("Invalid edge: sourceId or targetId is missing.")();
1422
+ return null;
1423
+ }
1424
+ return {
1425
+ id,
1426
+ directed: directed || false,
1427
+ sourceId,
1428
+ targetId
1429
+ };
1430
+ }
1431
+
1432
+ // dist/loaders/json-loader.js
1433
+ var JSONLoader = ({ json, nodeParser = basicNodeParser, edgeParser = basicEdgeParser }) => {
1434
+ const { name = "default", nodes, edges } = json;
1435
+ if (!nodes) {
1436
+ log.error("Invalid graph: nodes is missing.")();
1437
+ return null;
1438
+ }
1439
+ const graph = createGraph({ name, nodes, edges, nodeParser, edgeParser });
1440
+ return graph;
1441
+ };
1442
+
1443
+ // dist/utils/layer-utils.js
1444
+ var mixedGetPosition = (getPosition, getOffset2) => {
1445
+ if (!getOffset2) {
1446
+ return getPosition;
1447
+ }
1448
+ if (typeof getOffset2 === "function") {
1449
+ return (d) => {
1450
+ const [x, y] = getPosition(d);
1451
+ const [offX2, offY2] = getOffset2(d);
1452
+ return [x + offX2, y + offY2];
1453
+ };
1454
+ }
1455
+ const [offX, offY] = getOffset2;
1456
+ return (d) => {
1457
+ const [x, y] = getPosition(d);
1458
+ return [x + offX, y + offY];
1459
+ };
1460
+ };
1461
+
1462
+ // dist/layers/graph-layer.js
1463
+ var import_core16 = require("@deck.gl/core");
1464
+
1465
+ // dist/style/style-property.js
1466
+ var import_color = __toESM(require("color"), 1);
1467
+ function getColor(value) {
1468
+ if (typeof value === "string") {
1469
+ try {
1470
+ const color = import_color.default.rgb(value).array();
1471
+ if (Number.isFinite(color[3])) {
1472
+ color[3] *= 255;
1473
+ }
1474
+ return color;
1475
+ } catch (error) {
1476
+ return [0, 0, 0];
1477
+ }
1478
+ }
1479
+ if (Array.isArray(value) && Number.isFinite(value[0])) {
1480
+ return value;
1481
+ }
1482
+ return [0, 0, 0];
1483
+ }
1484
+ function getNumber(value) {
1485
+ switch (typeof value) {
1486
+ case "string":
1487
+ value = Number(value);
1488
+ return isNaN(value) ? null : value;
1489
+ case "number":
1490
+ return value;
1491
+ default:
1492
+ return null;
1493
+ }
1494
+ }
1495
+ function getBool(value) {
1496
+ switch (typeof value) {
1497
+ case "boolean":
1498
+ return value;
1499
+ case "string":
1500
+ return value.toLowerCase() !== "false";
1501
+ case "number":
1502
+ return Boolean(value);
1503
+ default:
1504
+ return null;
1505
+ }
1506
+ }
1507
+ function getOffset(value) {
1508
+ if (typeof value === "function") {
1509
+ return value;
1510
+ }
1511
+ if (!Array.isArray(value) || value.length !== 2) {
1512
+ return null;
1513
+ }
1514
+ return value.map(getNumber);
1515
+ }
1516
+ var IDENTITY = (x) => x;
1517
+ var PROPERTY_FORMATTERS = {
1518
+ opacity: getNumber,
1519
+ zIndex: getNumber,
1520
+ width: getNumber,
1521
+ height: getNumber,
1522
+ radius: getNumber,
1523
+ fill: getColor,
1524
+ stroke: getColor,
1525
+ strokeWidth: getNumber,
1526
+ // for marker
1527
+ marker: String,
1528
+ size: getNumber,
1529
+ // text
1530
+ color: getColor,
1531
+ text: String,
1532
+ fontSize: getNumber,
1533
+ textAnchor: String,
1534
+ alignmentBaseline: String,
1535
+ angle: getNumber,
1536
+ textMaxWidth: getNumber,
1537
+ textWordBreak: String,
1538
+ textSizeMinPixels: getNumber,
1539
+ // edges
1540
+ speed: getNumber,
1541
+ tailLength: getNumber,
1542
+ offset: getOffset,
1543
+ scaleWithZoom: getBool
1544
+ };
1545
+ var DEFAULT_STYLES = {
1546
+ opacity: 1,
1547
+ zIndex: 0,
1548
+ width: 0,
1549
+ height: 0,
1550
+ radius: 1,
1551
+ fill: [0, 0, 0],
1552
+ stroke: [0, 0, 0],
1553
+ strokeWidth: 0,
1554
+ marker: "circle",
1555
+ size: 12,
1556
+ color: [0, 0, 0],
1557
+ text: "",
1558
+ fontSize: 12,
1559
+ textAnchor: "middle",
1560
+ alignmentBaseline: "center",
1561
+ angle: 0,
1562
+ textMaxWidth: -1,
1563
+ textWordBreak: "break-all",
1564
+ textSizeMinPixels: 9,
1565
+ speed: 0,
1566
+ tailLength: 1,
1567
+ offset: null,
1568
+ scaleWithZoom: true
1569
+ };
1570
+ function generateAccessor(key, value) {
1571
+ const formatter = PROPERTY_FORMATTERS[key] || IDENTITY;
1572
+ const valueMap = Object.keys(value).reduce((res, key0) => {
1573
+ res[key0] = value[key0];
1574
+ return res;
1575
+ }, {});
1576
+ return (node) => {
1577
+ const statefulValue = valueMap[node.state];
1578
+ if (!node.state || typeof statefulValue === "undefined") {
1579
+ return valueMap.default || DEFAULT_STYLES[key];
1580
+ }
1581
+ if (typeof statefulValue === "function") {
1582
+ return formatter(statefulValue(node));
1583
+ }
1584
+ return formatter(statefulValue);
1585
+ };
1586
+ }
1587
+ var VALUE_TYPE = {
1588
+ ACCESSOR: "ACCESSOR",
1589
+ PLAIN_VALUE: "PLAIN_VALUE"
1590
+ };
1591
+ var StyleProperty = class {
1592
+ key;
1593
+ _updateTrigger;
1594
+ _value;
1595
+ _valueType;
1596
+ // for getting default style
1597
+ static getDefault(key) {
1598
+ return DEFAULT_STYLES[key];
1599
+ }
1600
+ // pass the key and value of the property
1601
+ // and format the value properly.
1602
+ constructor({ key, value, updateTrigger }) {
1603
+ this.key = key;
1604
+ this._updateTrigger = false;
1605
+ if (typeof value === "object" && !Array.isArray(value)) {
1606
+ this._value = generateAccessor(key, value);
1607
+ this._valueType = VALUE_TYPE.ACCESSOR;
1608
+ this._updateTrigger = updateTrigger;
1609
+ } else if (typeof value === "function") {
1610
+ const formatter = PROPERTY_FORMATTERS[key] || IDENTITY;
1611
+ this._value = (d) => formatter(value(d));
1612
+ this._valueType = VALUE_TYPE.ACCESSOR;
1613
+ this._updateTrigger = value;
1614
+ } else {
1615
+ const formatter = PROPERTY_FORMATTERS[key] || IDENTITY;
1616
+ this._value = formatter(value);
1617
+ this._valueType = VALUE_TYPE.PLAIN_VALUE;
1618
+ this._updateTrigger = false;
1619
+ }
1620
+ if (this._value === null) {
1621
+ log.warn(`Invalid ${key} value: ${value}`)();
1622
+ throw new Error(`Invalid ${key} value: ${value}`);
1623
+ }
1624
+ }
1625
+ // get the formatted value
1626
+ getValue() {
1627
+ return this._value;
1628
+ }
1629
+ getUpdateTrigger() {
1630
+ return this._updateTrigger;
1631
+ }
1632
+ };
1633
+
1634
+ // dist/style/style-sheet.js
1635
+ var COMMON_DECKGL_PROPS = {
1636
+ getOffset: "offset",
1637
+ opacity: "opacity"
1638
+ };
1639
+ var DECKGL_ACCESSOR_MAP = {
1640
+ [NODE_TYPE.CIRCLE]: {
1641
+ ...COMMON_DECKGL_PROPS,
1642
+ getFillColor: "fill",
1643
+ getLineColor: "stroke",
1644
+ getLineWidth: "strokeWidth",
1645
+ getRadius: "radius"
1646
+ },
1647
+ [NODE_TYPE.RECTANGLE]: {
1648
+ ...COMMON_DECKGL_PROPS,
1649
+ getWidth: "width",
1650
+ getHeight: "height",
1651
+ getFillColor: "fill",
1652
+ getLineColor: "stroke",
1653
+ getLineWidth: "strokeWidth"
1654
+ },
1655
+ [NODE_TYPE.ROUNDED_RECTANGLE]: {
1656
+ ...COMMON_DECKGL_PROPS,
1657
+ getCornerRadius: "cornerRadius",
1658
+ getRadius: "radius",
1659
+ getWidth: "width",
1660
+ getHeight: "height",
1661
+ getFillColor: "fill",
1662
+ getLineColor: "stroke",
1663
+ getLineWidth: "strokeWidth"
1664
+ },
1665
+ [NODE_TYPE.PATH_ROUNDED_RECTANGLE]: {
1666
+ ...COMMON_DECKGL_PROPS,
1667
+ getWidth: "width",
1668
+ getHeight: "height",
1669
+ getFillColor: "fill",
1670
+ getLineColor: "stroke",
1671
+ getLineWidth: "strokeWidth",
1672
+ getCornerRadius: "cornerRadius"
1673
+ },
1674
+ [NODE_TYPE.LABEL]: {
1675
+ ...COMMON_DECKGL_PROPS,
1676
+ getColor: "color",
1677
+ getText: "text",
1678
+ getSize: "fontSize",
1679
+ getTextAnchor: "textAnchor",
1680
+ getAlignmentBaseline: "alignmentBaseline",
1681
+ getAngle: "angle",
1682
+ scaleWithZoom: "scaleWithZoom",
1683
+ textMaxWidth: "textMaxWidth",
1684
+ textWordBreak: "textWordBreak",
1685
+ textSizeMinPixels: "textSizeMinPixels"
1686
+ },
1687
+ [NODE_TYPE.MARKER]: {
1688
+ ...COMMON_DECKGL_PROPS,
1689
+ getColor: "fill",
1690
+ getSize: "size",
1691
+ getMarker: "marker",
1692
+ scaleWithZoom: "scaleWithZoom"
1693
+ },
1694
+ // --------- Edge related ---------
1695
+ Edge: {
1696
+ getColor: "stroke",
1697
+ getWidth: "strokeWidth"
1698
+ },
1699
+ [EDGE_DECORATOR_TYPE.LABEL]: {
1700
+ getColor: "color",
1701
+ getText: "text",
1702
+ getSize: "fontSize",
1703
+ getTextAnchor: "textAnchor",
1704
+ getAlignmentBaseline: "alignmentBaseline",
1705
+ scaleWithZoom: "scaleWithZoom",
1706
+ textMaxWidth: "textMaxWidth",
1707
+ textWordBreak: "textWordBreak",
1708
+ textSizeMinPixels: "textSizeMinPixels"
1709
+ },
1710
+ [EDGE_DECORATOR_TYPE.FLOW]: {
1711
+ getColor: "color",
1712
+ getWidth: "width",
1713
+ getSpeed: "speed",
1714
+ getTailLength: "tailLength"
1715
+ }
1716
+ };
1717
+ var DECKGL_UPDATE_TRIGGERS = {
1718
+ [NODE_TYPE.CIRCLE]: ["getFillColor", "getRadius", "getLineColor", "getLineWidth"],
1719
+ [NODE_TYPE.RECTANGLE]: ["getFillColor", "getLineColor", "getLineWidth"],
1720
+ [NODE_TYPE.ROUNDED_RECTANGLE]: [
1721
+ "getFillColor",
1722
+ "getLineColor",
1723
+ "getLineWidth",
1724
+ "getCornerRadius"
1725
+ ],
1726
+ [NODE_TYPE.PATH_ROUNDED_RECTANGLE]: [
1727
+ "getFillColor",
1728
+ "getLineColor",
1729
+ "getLineWidth",
1730
+ "getCornerRadius"
1731
+ ],
1732
+ [NODE_TYPE.LABEL]: [
1733
+ "getColor",
1734
+ "getText",
1735
+ "getSize",
1736
+ "getTextAnchor",
1737
+ "getAlignmentBaseline",
1738
+ "getAngle"
1739
+ ],
1740
+ [NODE_TYPE.MARKER]: ["getColor", "getSize", "getMarker"],
1741
+ Edge: ["getColor", "getWidth"],
1742
+ [EDGE_DECORATOR_TYPE.LABEL]: [
1743
+ "getColor",
1744
+ "getText",
1745
+ "getSize",
1746
+ "getTextAnchor",
1747
+ "getAlignmentBaseline"
1748
+ ],
1749
+ [EDGE_DECORATOR_TYPE.FLOW]: ["getColor", "getWidth", "getSpeed", "getTailLength"]
1750
+ };
1751
+ var Stylesheet = class {
1752
+ type;
1753
+ properties;
1754
+ constructor(style, updateTriggers) {
1755
+ const { type: layerType, ...restStyle } = style;
1756
+ if (!layerType || !(layerType in DECKGL_ACCESSOR_MAP)) {
1757
+ throw new Error(`illegal type: ${layerType}`);
1758
+ }
1759
+ this.type = layerType;
1760
+ const rules = Object.keys(restStyle).reduce((res, key) => {
1761
+ const isSelector = key.startsWith(":");
1762
+ if (isSelector) {
1763
+ const state = key.substring(1);
1764
+ res[state] = restStyle[key];
1765
+ return res;
1766
+ }
1767
+ res.default[key] = restStyle[key];
1768
+ return res;
1769
+ }, {
1770
+ default: {}
1771
+ });
1772
+ const attributes = Object.values(rules).reduce((res, rule) => {
1773
+ const attrs = Object.keys(rule);
1774
+ const set = /* @__PURE__ */ new Set([...res, ...attrs]);
1775
+ return Array.from(set);
1776
+ }, []);
1777
+ const attrMap = attributes.reduce((res, attr) => {
1778
+ res[attr] = Object.entries(rules).reduce((acc, entry) => {
1779
+ const [state, rule] = entry;
1780
+ if (typeof rule[attr] !== "undefined") {
1781
+ acc[state] = rule[attr];
1782
+ }
1783
+ return acc;
1784
+ }, {});
1785
+ return res;
1786
+ }, {});
1787
+ const simplifiedStyleMap = Object.entries(attrMap).reduce((res, entry) => {
1788
+ const [attr, valueMap] = entry;
1789
+ const onlyDefault = Object.keys(valueMap).length === 1 && valueMap.default !== void 0;
1790
+ if (onlyDefault) {
1791
+ res[attr] = valueMap.default;
1792
+ return res;
1793
+ }
1794
+ res[attr] = valueMap;
1795
+ return res;
1796
+ }, {});
1797
+ this.properties = {};
1798
+ for (const key in simplifiedStyleMap) {
1799
+ this.properties[key] = new StyleProperty({
1800
+ key,
1801
+ value: simplifiedStyleMap[key],
1802
+ updateTrigger: updateTriggers.stateUpdateTrigger
1803
+ });
1804
+ }
1805
+ }
1806
+ _getProperty(deckglAccessor) {
1807
+ const map = DECKGL_ACCESSOR_MAP[this.type];
1808
+ if (!map) {
1809
+ throw new Error(`illegal type: ${this.type}`);
1810
+ }
1811
+ const styleProp = map[deckglAccessor];
1812
+ if (!styleProp) {
1813
+ log.error(`Invalid DeckGL accessor: ${deckglAccessor}`)();
1814
+ throw new Error(`Invalid DeckGL accessor: ${deckglAccessor}`);
1815
+ }
1816
+ return this.properties[styleProp];
1817
+ }
1818
+ getDeckGLAccessor(deckglAccessor) {
1819
+ const property = this._getProperty(deckglAccessor);
1820
+ if (property) {
1821
+ return property.getValue();
1822
+ }
1823
+ const styleProp = DECKGL_ACCESSOR_MAP[this.type][deckglAccessor];
1824
+ return StyleProperty.getDefault(styleProp);
1825
+ }
1826
+ getDeckGLAccessorUpdateTrigger(deckglAccessor) {
1827
+ const property = this._getProperty(deckglAccessor);
1828
+ if (property) {
1829
+ return property.getUpdateTrigger();
1830
+ }
1831
+ return false;
1832
+ }
1833
+ getDeckGLAccessors() {
1834
+ const accessorMap = DECKGL_ACCESSOR_MAP[this.type];
1835
+ return Object.keys(accessorMap).reduce((res, accessor) => {
1836
+ res[accessor] = this.getDeckGLAccessor(accessor);
1837
+ return res;
1838
+ }, {});
1839
+ }
1840
+ getDeckGLUpdateTriggers() {
1841
+ return DECKGL_UPDATE_TRIGGERS[this.type].reduce((res, accessor) => {
1842
+ res[accessor] = this.getDeckGLAccessorUpdateTrigger(accessor);
1843
+ return res;
1844
+ }, {});
1845
+ }
1846
+ };
1847
+
1848
+ // dist/core/interaction-manager.js
1849
+ var NODE_TO_EDGE_STATE_MAP = {
1850
+ [NODE_STATE.DEFAULT]: EDGE_STATE.DEFAULT,
1851
+ [NODE_STATE.HOVER]: EDGE_STATE.HOVER,
1852
+ [NODE_STATE.DRAGGING]: EDGE_STATE.DRAGGING,
1853
+ [NODE_STATE.SELECTED]: EDGE_STATE.SELECTED
1854
+ };
1855
+ function shouldEdgeBeSelected(edge) {
1856
+ return edge.getConnectedNodes().some((node) => node.getState() === NODE_STATE.SELECTED && node.shouldHighlightConnectedEdges());
1857
+ }
1858
+ function setNodeState(node, state) {
1859
+ node.setState(state);
1860
+ if (node.shouldHighlightConnectedEdges()) {
1861
+ node.getConnectedEdges().forEach((edge) => {
1862
+ let newEdgeState = NODE_TO_EDGE_STATE_MAP[state];
1863
+ if (shouldEdgeBeSelected(edge)) {
1864
+ newEdgeState = EDGE_STATE.SELECTED;
1865
+ }
1866
+ edge.setState(newEdgeState);
1867
+ });
1868
+ }
1869
+ }
1870
+ var InteractionManager = class {
1871
+ notifyCallback;
1872
+ _lastInteraction = 0;
1873
+ _lastHoveredNode = null;
1874
+ _lastSelectedNode = null;
1875
+ nodeEvents = void 0;
1876
+ edgeEvents = void 0;
1877
+ engine = void 0;
1878
+ enableDragging = void 0;
1879
+ resumeLayoutAfterDragging = void 0;
1880
+ constructor(props, notifyCallback) {
1881
+ this.updateProps(props);
1882
+ this.notifyCallback = notifyCallback;
1883
+ this._lastInteraction = 0;
1884
+ this._lastHoveredNode = null;
1885
+ this._lastSelectedNode = null;
1886
+ }
1887
+ updateProps({ nodeEvents = {}, edgeEvents = {}, engine, enableDragging, resumeLayoutAfterDragging }) {
1888
+ this.nodeEvents = nodeEvents;
1889
+ this.edgeEvents = edgeEvents;
1890
+ this.engine = engine;
1891
+ this.enableDragging = enableDragging;
1892
+ this.resumeLayoutAfterDragging = resumeLayoutAfterDragging;
1893
+ }
1894
+ getLastInteraction() {
1895
+ return this._lastInteraction;
1896
+ }
1897
+ onClick(info, event) {
1898
+ const { object } = info;
1899
+ if (!object) {
1900
+ return;
1901
+ }
1902
+ if (object.isNode) {
1903
+ if (object.isSelectable()) {
1904
+ if (this._lastSelectedNode) {
1905
+ setNodeState(this._lastSelectedNode, NODE_STATE.DEFAULT);
1906
+ }
1907
+ setNodeState(object, NODE_STATE.SELECTED);
1908
+ this._lastSelectedNode = object;
1909
+ this._lastInteraction = Date.now();
1910
+ this.notifyCallback();
1911
+ }
1912
+ if (this.nodeEvents.onClick) {
1913
+ this.nodeEvents.onClick(info, event);
1914
+ }
1915
+ }
1916
+ if (object.isEdge && this.edgeEvents.onClick) {
1917
+ this.edgeEvents.onClick(info, event);
1918
+ }
1919
+ }
1920
+ _mouseLeaveNode() {
1921
+ var _a;
1922
+ const lastHoveredNode = this._lastHoveredNode;
1923
+ if (!(lastHoveredNode.isSelectable() && lastHoveredNode.getState() === NODE_STATE.SELECTED)) {
1924
+ const newState = this._lastSelectedNode !== null && this._lastSelectedNode.id === ((_a = this._lastHoveredNode) == null ? void 0 : _a.id) ? NODE_STATE.SELECTED : NODE_STATE.DEFAULT;
1925
+ setNodeState(lastHoveredNode, newState);
1926
+ }
1927
+ if (this.nodeEvents.onMouseLeave) {
1928
+ this.nodeEvents.onMouseLeave(lastHoveredNode);
1929
+ }
1930
+ }
1931
+ _mouseEnterNode(info) {
1932
+ setNodeState(info.object, NODE_STATE.HOVER);
1933
+ if (this.nodeEvents.onMouseEnter) {
1934
+ this.nodeEvents.onMouseEnter(info);
1935
+ }
1936
+ if (this.nodeEvents.onHover) {
1937
+ this.nodeEvents.onHover(info);
1938
+ }
1939
+ }
1940
+ onHover(info, event) {
1941
+ if (!info.object) {
1942
+ if (this._lastHoveredNode) {
1943
+ this._mouseLeaveNode();
1944
+ this._lastInteraction = Date.now();
1945
+ this._lastHoveredNode = null;
1946
+ this.notifyCallback();
1947
+ }
1948
+ return;
1949
+ }
1950
+ if (info.object.isNode) {
1951
+ const isSameNode = this._lastHoveredNode && this._lastHoveredNode.id === info.object.id;
1952
+ if (isSameNode) {
1953
+ return;
1954
+ }
1955
+ if (this._lastHoveredNode) {
1956
+ this._mouseLeaveNode();
1957
+ }
1958
+ this._mouseEnterNode(info);
1959
+ this._lastInteraction = Date.now();
1960
+ this._lastHoveredNode = info.object;
1961
+ this.notifyCallback();
1962
+ }
1963
+ if (info.object.isEdge && this.edgeEvents.onHover) {
1964
+ this.edgeEvents.onHover(info);
1965
+ }
1966
+ }
1967
+ onDragStart(info, event) {
1968
+ if (this.nodeEvents.onDragStart) {
1969
+ this.nodeEvents.onDragStart(info);
1970
+ }
1971
+ }
1972
+ onDrag(info, event) {
1973
+ if (!info.object.isNode || !this.enableDragging) {
1974
+ return;
1975
+ }
1976
+ event.stopImmediatePropagation();
1977
+ const coordinates = info.layer.context.viewport.unproject([info.x, info.y]);
1978
+ const bounds = info.layer.context.viewport.getBounds();
1979
+ const x = Math.min(Math.max(coordinates[0], bounds[0]), bounds[2]);
1980
+ const y = Math.min(Math.max(coordinates[1], bounds[1]), bounds[3]);
1981
+ this.engine.lockNodePosition(info.object, x, y);
1982
+ setNodeState(info.object, NODE_STATE.DRAGGING);
1983
+ this._lastInteraction = Date.now();
1984
+ this.notifyCallback();
1985
+ if (this.nodeEvents.onDrag) {
1986
+ this.nodeEvents.onDrag(info);
1987
+ }
1988
+ }
1989
+ onDragEnd(info, event) {
1990
+ if (!info.object.isNode || !this.enableDragging) {
1991
+ return;
1992
+ }
1993
+ if (this.resumeLayoutAfterDragging) {
1994
+ this.engine.resume();
1995
+ }
1996
+ setNodeState(info.object, NODE_STATE.DEFAULT);
1997
+ this.engine.unlockNodePosition(info.object);
1998
+ }
1999
+ };
2000
+
2001
+ // dist/layers/node-layers/circle-layer.js
2002
+ var import_core = require("@deck.gl/core");
2003
+ var import_layers = require("@deck.gl/layers");
2004
+ var CircleLayer = class extends import_core.CompositeLayer {
2005
+ renderLayers() {
2006
+ const { data, getPosition, stylesheet, positionUpdateTrigger = 0 } = this.props;
2007
+ return [
2008
+ new import_layers.ScatterplotLayer(this.getSubLayerProps({
2009
+ id: "__scatterplot-layer",
2010
+ data,
2011
+ getPosition,
2012
+ ...stylesheet.getDeckGLAccessors(),
2013
+ updateTriggers: {
2014
+ getPosition: positionUpdateTrigger,
2015
+ ...stylesheet.getDeckGLUpdateTriggers()
2016
+ }
2017
+ }))
2018
+ ];
2019
+ }
2020
+ };
2021
+ __publicField(CircleLayer, "layerName", "CircleLayer");
2022
+
2023
+ // dist/layers/node-layers/image-layer.js
2024
+ var import_core2 = require("@deck.gl/core");
2025
+ var import_layers2 = require("@deck.gl/layers");
2026
+ var ImageLayer = class extends import_core2.CompositeLayer {
2027
+ renderLayers() {
2028
+ const { data, getPosition, stylesheet, positionUpdateTrigger = 0 } = this.props;
2029
+ return [
2030
+ new import_layers2.IconLayer(this.getSubLayerProps({
2031
+ id: "__icon-layer",
2032
+ data,
2033
+ getPosition,
2034
+ ...stylesheet.getDeckGLAccessors(),
2035
+ updateTriggers: {
2036
+ getPosition: positionUpdateTrigger,
2037
+ ...stylesheet.getDeckGLUpdateTriggers()
2038
+ }
2039
+ }))
2040
+ ];
2041
+ }
2042
+ };
2043
+ __publicField(ImageLayer, "layerName", "ImageLayer");
2044
+
2045
+ // dist/layers/node-layers/label-layer.js
2046
+ var import_core4 = require("@deck.gl/core");
2047
+
2048
+ // dist/layers/common-layers/zoomable-text-layer/zoomable-text-layer.js
2049
+ var import_core3 = require("@deck.gl/core");
2050
+ var import_layers3 = require("@deck.gl/layers");
2051
+ var ZoomableTextLayer = class extends import_core3.CompositeLayer {
2052
+ initializeState() {
2053
+ this.state = { characterSet: [] };
2054
+ }
2055
+ shouldUpdateState({ props, changeFlags }) {
2056
+ const { scaleWithZoom } = this.props;
2057
+ if (!scaleWithZoom) {
2058
+ return changeFlags.dataChanged || changeFlags.propsChanged;
2059
+ }
2060
+ return changeFlags.dataChanged || changeFlags.propsChanged || changeFlags.viewportChanged;
2061
+ }
2062
+ updateState({ props, oldProps, changeFlags }) {
2063
+ super.updateState({ props, oldProps, changeFlags });
2064
+ if (changeFlags.propsOrDataChanged) {
2065
+ const { getText } = props;
2066
+ let textLabels = [];
2067
+ if (typeof getText === "function") {
2068
+ textLabels = props.data.map(getText);
2069
+ } else {
2070
+ textLabels = [getText];
2071
+ }
2072
+ const characterSet = new Set(textLabels.join(""));
2073
+ const uniqueCharacters = Array.from(characterSet);
2074
+ this.setState({ characterSet: uniqueCharacters });
2075
+ }
2076
+ }
2077
+ renderLayers() {
2078
+ const { data, getPosition, getColor: getColor2, getText, getSize, getTextAnchor, getAlignmentBaseline, getAngle, scaleWithZoom, updateTriggers, fontFamily, textWordUnits, textWordBreak, textMaxWidth, textSizeMinPixels } = this.props;
2079
+ const sizeUpdateTrigger = scaleWithZoom ? [getSize, this.context.viewport.zoom] : false;
2080
+ const newGetText = typeof getText === "function" ? getText : () => getText;
2081
+ return [
2082
+ new import_layers3.TextLayer(this.getSubLayerProps({
2083
+ id: "__text-layer",
2084
+ data,
2085
+ sizeScale: scaleWithZoom ? Math.pow(2, this.context.viewport.zoom - 1) : 1,
2086
+ characterSet: this.state.characterSet,
2087
+ getPosition,
2088
+ getColor: getColor2,
2089
+ getSize,
2090
+ getTextAnchor,
2091
+ getAlignmentBaseline,
2092
+ getAngle,
2093
+ getText: newGetText,
2094
+ maxWidth: textMaxWidth ?? 12,
2095
+ wordBreak: textWordBreak ?? "break-all",
2096
+ fontFamily: fontFamily ?? "Red Hat Text",
2097
+ wordUnits: textWordUnits ?? "pixels",
2098
+ sizeMinPixels: textSizeMinPixels ?? 9,
2099
+ updateTriggers: {
2100
+ getSize: sizeUpdateTrigger,
2101
+ getAngle: [sizeUpdateTrigger, updateTriggers.getPosition],
2102
+ ...updateTriggers
2103
+ }
2104
+ }))
2105
+ ];
2106
+ }
2107
+ };
2108
+ __publicField(ZoomableTextLayer, "layerName", "ZoomableTextLayer");
2109
+
2110
+ // dist/layers/node-layers/label-layer.js
2111
+ var LabelLayer = class extends import_core4.CompositeLayer {
2112
+ renderLayers() {
2113
+ const { data, getPosition, stylesheet, positionUpdateTrigger = 0 } = this.props;
2114
+ return [
2115
+ new ZoomableTextLayer(this.getSubLayerProps({
2116
+ id: "__text-layer",
2117
+ data,
2118
+ getPosition,
2119
+ ...stylesheet.getDeckGLAccessors(),
2120
+ updateTriggers: {
2121
+ ...stylesheet.getDeckGLUpdateTriggers(),
2122
+ getPosition: positionUpdateTrigger
2123
+ }
2124
+ }))
2125
+ ];
2126
+ }
2127
+ };
2128
+ __publicField(LabelLayer, "layerName", "LabelLayer");
2129
+
2130
+ // dist/layers/node-layers/rectangle-layer.js
2131
+ var import_core5 = require("@deck.gl/core");
2132
+ var import_layers4 = require("@deck.gl/layers");
2133
+ var generateRectangle = (node, { getWidth, getHeight, getPosition }) => {
2134
+ const pos = getPosition(node);
2135
+ const width = typeof getWidth === "function" ? getWidth(node._data.label.length * 12) : getWidth;
2136
+ const height = typeof getWidth === "function" ? getHeight(node) : getHeight;
2137
+ const halfWidth = width / 2;
2138
+ const halfHeight = height / 2;
2139
+ return [
2140
+ [pos[0] - halfWidth, pos[1] - halfHeight],
2141
+ [pos[0] - halfWidth, pos[1] + halfHeight],
2142
+ [pos[0] + halfWidth, pos[1] + halfHeight],
2143
+ [pos[0] + halfWidth, pos[1] - halfHeight]
2144
+ ];
2145
+ };
2146
+ var RectangleLayer = class extends import_core5.CompositeLayer {
2147
+ renderLayers() {
2148
+ const { data, getPosition, stylesheet, positionUpdateTrigger = 0 } = this.props;
2149
+ const getFillColor = stylesheet.getDeckGLAccessor("getFillColor");
2150
+ const getLineWidth = stylesheet.getDeckGLAccessor("getLineWidth");
2151
+ return [
2152
+ new import_layers4.PolygonLayer(this.getSubLayerProps({
2153
+ id: "__polygon-layer",
2154
+ data,
2155
+ getPolygon: (node) => generateRectangle(node, {
2156
+ getPosition,
2157
+ getWidth: stylesheet.getDeckGLAccessor("getWidth"),
2158
+ getHeight: stylesheet.getDeckGLAccessor("getHeight")
2159
+ }),
2160
+ filled: Boolean(getFillColor),
2161
+ jointRounded: true,
2162
+ stroked: Boolean(getLineWidth),
2163
+ ...stylesheet.getDeckGLAccessors(),
2164
+ updateTriggers: {
2165
+ getPolygon: [
2166
+ positionUpdateTrigger,
2167
+ stylesheet.getDeckGLAccessorUpdateTrigger("getWidth"),
2168
+ stylesheet.getDeckGLAccessorUpdateTrigger("getHeight")
2169
+ ],
2170
+ ...stylesheet.getDeckGLUpdateTriggers()
2171
+ }
2172
+ }))
2173
+ ];
2174
+ }
2175
+ };
2176
+ __publicField(RectangleLayer, "layerName", "RectangleLayer");
2177
+
2178
+ // dist/layers/node-layers/rounded-rectangle-layer-fragment.js
2179
+ var fs = (
2180
+ /* glsl */
2181
+ `#define SHADER_NAME rounded-rectangle-layer-fragment-shader
2182
+
2183
+ precision highp float;
2184
+
2185
+ uniform float cornerRadius;
2186
+
2187
+ varying vec4 vFillColor;
2188
+ varying vec2 unitPosition;
2189
+
2190
+ void main(void) {
2191
+
2192
+ float distToCenter = length(unitPosition);
2193
+
2194
+ /* Calculate the cutoff radius for the rounded corners */
2195
+ float threshold = sqrt(2.0) * (1.0 - cornerRadius) + 1.0 * cornerRadius;
2196
+ if (distToCenter <= threshold) {
2197
+ gl_FragColor = vFillColor;
2198
+ } else {
2199
+ discard;
2200
+ }
2201
+
2202
+ gl_FragColor = picking_filterHighlightColor(gl_FragColor);
2203
+
2204
+ gl_FragColor = picking_filterPickingColor(gl_FragColor);
2205
+ }
2206
+ `
2207
+ );
2208
+
2209
+ // dist/layers/node-layers/rounded-rectangle-layer.js
2210
+ var RoundedRectangleLayer = class extends RectangleLayer {
2211
+ draw({ uniforms }) {
2212
+ super.draw({
2213
+ uniforms: {
2214
+ ...uniforms,
2215
+ cornerRadius: this.props.cornerRadius
2216
+ }
2217
+ });
2218
+ }
2219
+ getShaders() {
2220
+ return Object.assign({}, super.getShaders(void 0), {
2221
+ fs
2222
+ });
2223
+ }
2224
+ };
2225
+ __publicField(RoundedRectangleLayer, "layerName", "RoundedRectangleLayer");
2226
+ RoundedRectangleLayer.defaultProps = {
2227
+ // cornerRadius: the amount of rounding at the rectangle corners
2228
+ // 0 - rectangle. 1 - circle.
2229
+ cornerRadius: 0.1
2230
+ };
2231
+
2232
+ // dist/layers/node-layers/path-rounded-rectange-layer.js
2233
+ var import_core6 = require("@deck.gl/core");
2234
+ var import_layers5 = require("@deck.gl/layers");
2235
+
2236
+ // dist/utils/polygon-calculations.js
2237
+ function generateRoundedCorners(pos, width, height, radius, factor = 20) {
2238
+ const halfWidth = width / 2;
2239
+ const halfHeight = height / 2;
2240
+ const bottomLeft = { X: pos[0] - halfWidth, Y: pos[1] - halfHeight };
2241
+ const topLeft = { X: pos[0] - halfWidth, Y: pos[1] + halfHeight };
2242
+ const bottomRight = { X: pos[0] + halfWidth, Y: pos[1] - halfHeight };
2243
+ const topRight = { X: pos[0] + halfWidth, Y: pos[1] + halfHeight };
2244
+ const roundedPointsForBottomLeft = getRoundedCorner(bottomLeft, topLeft, bottomRight, radius, factor);
2245
+ const roundedPointsForTopLeft = getRoundedCorner(topLeft, topRight, bottomLeft, radius, factor).reverse();
2246
+ const roundedPointsForTopRight = getRoundedCorner(topRight, bottomRight, topLeft, radius, factor).reverse();
2247
+ const roundedPointsForBottomRight = getRoundedCorner(bottomRight, bottomLeft, topRight, radius, factor).reverse();
2248
+ const result = [
2249
+ ...roundedPointsForBottomLeft,
2250
+ ...roundedPointsForTopLeft,
2251
+ ...roundedPointsForTopRight,
2252
+ ...roundedPointsForBottomRight
2253
+ ];
2254
+ return result;
2255
+ }
2256
+ function getRoundedCorner(angularPoint, p1, p2, radius, factor) {
2257
+ const dx1 = angularPoint.X - p1.X;
2258
+ const dy1 = angularPoint.Y - p1.Y;
2259
+ const dx2 = angularPoint.X - p2.X;
2260
+ const dy2 = angularPoint.Y - p2.Y;
2261
+ const angle = (Math.atan2(dy1, dx1) - Math.atan2(dy2, dx2)) / 2;
2262
+ const tan = Math.abs(Math.tan(angle));
2263
+ let segment = radius / tan;
2264
+ const length1 = getLength(dx1, dy1);
2265
+ const length2 = getLength(dx2, dy2);
2266
+ const length = Math.min(length1, length2);
2267
+ if (segment > length) {
2268
+ segment = length;
2269
+ radius = length * tan;
2270
+ }
2271
+ const p1Cross = getProportionPoint(angularPoint, segment, length1, dx1, dy1);
2272
+ const p2Cross = getProportionPoint(angularPoint, segment, length2, dx2, dy2);
2273
+ const dx = angularPoint.X * 2 - p1Cross.X - p2Cross.X;
2274
+ const dy = angularPoint.Y * 2 - p1Cross.Y - p2Cross.Y;
2275
+ const L = getLength(dx, dy);
2276
+ const d = getLength(segment, radius);
2277
+ const circlePoint = getProportionPoint(angularPoint, d, L, dx, dy);
2278
+ let startAngle = Math.atan2(p1Cross.Y - circlePoint.Y, p1Cross.X - circlePoint.X);
2279
+ const endAngle = Math.atan2(p2Cross.Y - circlePoint.Y, p2Cross.X - circlePoint.X);
2280
+ let sweepAngle = endAngle - startAngle;
2281
+ if (sweepAngle < 0) {
2282
+ startAngle = endAngle;
2283
+ sweepAngle = -sweepAngle;
2284
+ }
2285
+ if (sweepAngle > Math.PI)
2286
+ sweepAngle = Math.PI - sweepAngle;
2287
+ const degreeFactor = factor / Math.PI;
2288
+ return getPointsForArc(sweepAngle, degreeFactor, startAngle, circlePoint, radius);
2289
+ }
2290
+ function getLength(dx, dy) {
2291
+ return Math.sqrt(dx * dx + dy * dy);
2292
+ }
2293
+ function getProportionPoint(point, segment, length, dx, dy) {
2294
+ const factor = segment / length;
2295
+ return {
2296
+ X: point.X - dx * factor,
2297
+ Y: point.Y - dy * factor
2298
+ };
2299
+ }
2300
+ function getPointsForArc(sweepAngle, degreeFactor, startAngle, circlePoint, radius) {
2301
+ const pointsCount = Math.abs(sweepAngle * degreeFactor);
2302
+ const sign = Math.sign(sweepAngle);
2303
+ const points = [];
2304
+ for (let i = 0; i < pointsCount; ++i) {
2305
+ const pointX = circlePoint.X + Math.cos(startAngle + sign * i / degreeFactor) * radius;
2306
+ const pointY = circlePoint.Y + Math.sin(startAngle + sign * i / degreeFactor) * radius;
2307
+ const point = [pointX, pointY];
2308
+ points.push(point);
2309
+ }
2310
+ return points;
2311
+ }
2312
+
2313
+ // dist/layers/node-layers/path-rounded-rectange-layer.js
2314
+ var generateRoundedRectangle = (node, { getWidth, getHeight, getPosition, getCornerRadius }) => {
2315
+ const pos = getPosition(node);
2316
+ const width = typeof getWidth === "function" ? getWidth(node) : getWidth;
2317
+ const height = typeof getWidth === "function" ? getHeight(node) : getHeight;
2318
+ const cornerRadius = typeof getCornerRadius === "function" ? getCornerRadius(node) : getCornerRadius;
2319
+ const factor = 20;
2320
+ return generateRoundedCorners(pos, width, height, cornerRadius, factor);
2321
+ };
2322
+ var PathBasedRoundedRectangleLayer = class extends import_core6.CompositeLayer {
2323
+ renderLayers() {
2324
+ const { data, getPosition, stylesheet, positionUpdateTrigger = 0 } = this.props;
2325
+ const getFillColor = stylesheet.getDeckGLAccessor("getFillColor");
2326
+ const getLineWidth = stylesheet.getDeckGLAccessor("getLineWidth");
2327
+ return [
2328
+ new import_layers5.PolygonLayer(this.getSubLayerProps({
2329
+ id: "__polygon-layer",
2330
+ data,
2331
+ getPolygon: (node) => generateRoundedRectangle(node, {
2332
+ getPosition,
2333
+ getWidth: stylesheet.getDeckGLAccessor("getWidth"),
2334
+ getHeight: stylesheet.getDeckGLAccessor("getHeight"),
2335
+ getCornerRadius: stylesheet.getDeckGLAccessor("getCornerRadius")
2336
+ }),
2337
+ filled: Boolean(getFillColor),
2338
+ stroked: Boolean(getLineWidth),
2339
+ ...stylesheet.getDeckGLAccessors(),
2340
+ updateTriggers: {
2341
+ getPolygon: [
2342
+ positionUpdateTrigger,
2343
+ stylesheet.getDeckGLAccessorUpdateTrigger("getWidth"),
2344
+ stylesheet.getDeckGLAccessorUpdateTrigger("getHeight"),
2345
+ stylesheet.getDeckGLAccessorUpdateTrigger("getCornerRadius")
2346
+ ],
2347
+ ...stylesheet.getDeckGLUpdateTriggers()
2348
+ }
2349
+ }))
2350
+ ];
2351
+ }
2352
+ };
2353
+ __publicField(PathBasedRoundedRectangleLayer, "layerName", "PathBasedRoundedRectangleLayer");
2354
+
2355
+ // dist/layers/node-layers/zoomable-marker-layer.js
2356
+ var import_core8 = require("@deck.gl/core");
2357
+
2358
+ // dist/layers/common-layers/marker-layer/marker-layer.js
2359
+ var import_core7 = require("@deck.gl/core");
2360
+ var import_layers6 = require("@deck.gl/layers");
2361
+
2362
+ // dist/layers/common-layers/marker-layer/marker-mapping.js
2363
+ var MarkerMapping = {
2364
+ "bell-filled": {
2365
+ x: 0,
2366
+ y: 0,
2367
+ width: 32,
2368
+ height: 32,
2369
+ mask: true
2370
+ },
2371
+ bell: {
2372
+ x: 32,
2373
+ y: 0,
2374
+ width: 32,
2375
+ height: 32,
2376
+ mask: true
2377
+ },
2378
+ "bookmark-filled": {
2379
+ x: 0,
2380
+ y: 32,
2381
+ width: 32,
2382
+ height: 32,
2383
+ mask: true
2384
+ },
2385
+ bookmark: {
2386
+ x: 32,
2387
+ y: 32,
2388
+ width: 32,
2389
+ height: 32,
2390
+ mask: true
2391
+ },
2392
+ "cd-filled": {
2393
+ x: 64,
2394
+ y: 0,
2395
+ width: 32,
2396
+ height: 32,
2397
+ mask: true
2398
+ },
2399
+ cd: {
2400
+ x: 64,
2401
+ y: 32,
2402
+ width: 32,
2403
+ height: 32,
2404
+ mask: true
2405
+ },
2406
+ checkmark: {
2407
+ x: 0,
2408
+ y: 64,
2409
+ width: 32,
2410
+ height: 32,
2411
+ mask: true
2412
+ },
2413
+ "circle-check-filled": {
2414
+ x: 32,
2415
+ y: 64,
2416
+ width: 32,
2417
+ height: 32,
2418
+ mask: true
2419
+ },
2420
+ "circle-check": {
2421
+ x: 64,
2422
+ y: 64,
2423
+ width: 32,
2424
+ height: 32,
2425
+ mask: true
2426
+ },
2427
+ "circle-filled": {
2428
+ x: 96,
2429
+ y: 0,
2430
+ width: 32,
2431
+ height: 32,
2432
+ mask: true
2433
+ },
2434
+ "circle-i-filled": {
2435
+ x: 96,
2436
+ y: 32,
2437
+ width: 32,
2438
+ height: 32,
2439
+ mask: true
2440
+ },
2441
+ "circle-i": {
2442
+ x: 96,
2443
+ y: 64,
2444
+ width: 32,
2445
+ height: 32,
2446
+ mask: true
2447
+ },
2448
+ "circle-minus-filled": {
2449
+ x: 0,
2450
+ y: 96,
2451
+ width: 32,
2452
+ height: 32,
2453
+ mask: true
2454
+ },
2455
+ "circle-minus": {
2456
+ x: 32,
2457
+ y: 96,
2458
+ width: 32,
2459
+ height: 32,
2460
+ mask: true
2461
+ },
2462
+ "circle-plus-filled": {
2463
+ x: 64,
2464
+ y: 96,
2465
+ width: 32,
2466
+ height: 32,
2467
+ mask: true
2468
+ },
2469
+ "circle-plus": {
2470
+ x: 96,
2471
+ y: 96,
2472
+ width: 32,
2473
+ height: 32,
2474
+ mask: true
2475
+ },
2476
+ "circle-questionmark-filled": {
2477
+ x: 128,
2478
+ y: 0,
2479
+ width: 32,
2480
+ height: 32,
2481
+ mask: true
2482
+ },
2483
+ "circle-questionmark": {
2484
+ x: 128,
2485
+ y: 32,
2486
+ width: 32,
2487
+ height: 32,
2488
+ mask: true
2489
+ },
2490
+ "circle-slash-filled": {
2491
+ x: 128,
2492
+ y: 64,
2493
+ width: 32,
2494
+ height: 32,
2495
+ mask: true
2496
+ },
2497
+ "circle-slash": {
2498
+ x: 128,
2499
+ y: 96,
2500
+ width: 32,
2501
+ height: 32,
2502
+ mask: true
2503
+ },
2504
+ "circle-x-filled": {
2505
+ x: 0,
2506
+ y: 128,
2507
+ width: 32,
2508
+ height: 32,
2509
+ mask: true
2510
+ },
2511
+ "circle-x": {
2512
+ x: 32,
2513
+ y: 128,
2514
+ width: 32,
2515
+ height: 32,
2516
+ mask: true
2517
+ },
2518
+ circle: {
2519
+ x: 64,
2520
+ y: 128,
2521
+ width: 32,
2522
+ height: 32,
2523
+ mask: true
2524
+ },
2525
+ "diamond-filled": {
2526
+ x: 96,
2527
+ y: 128,
2528
+ width: 32,
2529
+ height: 32,
2530
+ mask: true
2531
+ },
2532
+ diamond: {
2533
+ x: 128,
2534
+ y: 128,
2535
+ width: 32,
2536
+ height: 32,
2537
+ mask: true
2538
+ },
2539
+ "flag-filled": {
2540
+ x: 160,
2541
+ y: 0,
2542
+ width: 32,
2543
+ height: 32,
2544
+ mask: true
2545
+ },
2546
+ flag: {
2547
+ x: 160,
2548
+ y: 32,
2549
+ width: 32,
2550
+ height: 32,
2551
+ mask: true
2552
+ },
2553
+ gear: {
2554
+ x: 160,
2555
+ y: 64,
2556
+ width: 32,
2557
+ height: 32,
2558
+ mask: true
2559
+ },
2560
+ "heart-filled": {
2561
+ x: 160,
2562
+ y: 96,
2563
+ width: 32,
2564
+ height: 32,
2565
+ mask: true
2566
+ },
2567
+ heart: {
2568
+ x: 160,
2569
+ y: 128,
2570
+ width: 32,
2571
+ height: 32,
2572
+ mask: true
2573
+ },
2574
+ "location-marker-filled": {
2575
+ x: 0,
2576
+ y: 160,
2577
+ width: 32,
2578
+ height: 32,
2579
+ mask: true
2580
+ },
2581
+ "location-marker": {
2582
+ x: 32,
2583
+ y: 160,
2584
+ width: 32,
2585
+ height: 32,
2586
+ mask: true
2587
+ },
2588
+ "octagonal-star-filled": {
2589
+ x: 64,
2590
+ y: 160,
2591
+ width: 32,
2592
+ height: 32,
2593
+ mask: true
2594
+ },
2595
+ "octagonal-star": {
2596
+ x: 96,
2597
+ y: 160,
2598
+ width: 32,
2599
+ height: 32,
2600
+ mask: true
2601
+ },
2602
+ "person-filled": {
2603
+ x: 128,
2604
+ y: 160,
2605
+ width: 32,
2606
+ height: 32,
2607
+ mask: true
2608
+ },
2609
+ person: {
2610
+ x: 160,
2611
+ y: 160,
2612
+ width: 32,
2613
+ height: 32,
2614
+ mask: true
2615
+ },
2616
+ "pin-filled": {
2617
+ x: 192,
2618
+ y: 0,
2619
+ width: 32,
2620
+ height: 32,
2621
+ mask: true
2622
+ },
2623
+ pin: {
2624
+ x: 192,
2625
+ y: 32,
2626
+ width: 32,
2627
+ height: 32,
2628
+ mask: true
2629
+ },
2630
+ "plus-small": {
2631
+ x: 192,
2632
+ y: 64,
2633
+ width: 32,
2634
+ height: 32,
2635
+ mask: true
2636
+ },
2637
+ plus: {
2638
+ x: 192,
2639
+ y: 96,
2640
+ width: 32,
2641
+ height: 32,
2642
+ mask: true
2643
+ },
2644
+ "rectangle-filled": {
2645
+ x: 192,
2646
+ y: 128,
2647
+ width: 32,
2648
+ height: 32,
2649
+ mask: true
2650
+ },
2651
+ rectangle: {
2652
+ x: 192,
2653
+ y: 160,
2654
+ width: 32,
2655
+ height: 32,
2656
+ mask: true
2657
+ },
2658
+ "star-filled": {
2659
+ x: 0,
2660
+ y: 192,
2661
+ width: 32,
2662
+ height: 32,
2663
+ mask: true
2664
+ },
2665
+ star: {
2666
+ x: 32,
2667
+ y: 192,
2668
+ width: 32,
2669
+ height: 32,
2670
+ mask: true
2671
+ },
2672
+ "tag-filled": {
2673
+ x: 64,
2674
+ y: 192,
2675
+ width: 32,
2676
+ height: 32,
2677
+ mask: true
2678
+ },
2679
+ tag: {
2680
+ x: 96,
2681
+ y: 192,
2682
+ width: 32,
2683
+ height: 32,
2684
+ mask: true
2685
+ },
2686
+ "thumb-down-filled": {
2687
+ x: 128,
2688
+ y: 192,
2689
+ width: 32,
2690
+ height: 32,
2691
+ mask: true
2692
+ },
2693
+ "thumb-down": {
2694
+ x: 160,
2695
+ y: 192,
2696
+ width: 32,
2697
+ height: 32,
2698
+ mask: true
2699
+ },
2700
+ "thumb-up": {
2701
+ x: 192,
2702
+ y: 192,
2703
+ width: 32,
2704
+ height: 32,
2705
+ mask: true
2706
+ },
2707
+ "thumb_up-filled": {
2708
+ x: 224,
2709
+ y: 0,
2710
+ width: 32,
2711
+ height: 32,
2712
+ mask: true
2713
+ },
2714
+ "triangle-down-filled": {
2715
+ x: 224,
2716
+ y: 32,
2717
+ width: 32,
2718
+ height: 32,
2719
+ mask: true
2720
+ },
2721
+ "triangle-down": {
2722
+ x: 224,
2723
+ y: 64,
2724
+ width: 32,
2725
+ height: 32,
2726
+ mask: true
2727
+ },
2728
+ "triangle-left-filled": {
2729
+ x: 224,
2730
+ y: 96,
2731
+ width: 32,
2732
+ height: 32,
2733
+ mask: true
2734
+ },
2735
+ "triangle-left": {
2736
+ x: 224,
2737
+ y: 128,
2738
+ width: 32,
2739
+ height: 32,
2740
+ mask: true
2741
+ },
2742
+ "triangle-right-filled": {
2743
+ x: 224,
2744
+ y: 160,
2745
+ width: 32,
2746
+ height: 32,
2747
+ mask: true
2748
+ },
2749
+ "triangle-right": {
2750
+ x: 224,
2751
+ y: 192,
2752
+ width: 32,
2753
+ height: 32,
2754
+ mask: true
2755
+ },
2756
+ "triangle-up-filled": {
2757
+ x: 0,
2758
+ y: 224,
2759
+ width: 32,
2760
+ height: 32,
2761
+ mask: true
2762
+ },
2763
+ "triangle-up": {
2764
+ x: 32,
2765
+ y: 224,
2766
+ width: 32,
2767
+ height: 32,
2768
+ mask: true
2769
+ },
2770
+ "x-small": {
2771
+ x: 64,
2772
+ y: 224,
2773
+ width: 32,
2774
+ height: 32,
2775
+ mask: true
2776
+ },
2777
+ x: {
2778
+ x: 96,
2779
+ y: 224,
2780
+ width: 32,
2781
+ height: 32,
2782
+ mask: true
2783
+ }
2784
+ };
2785
+
2786
+ // dist/layers/common-layers/marker-layer/atlas-data-url.js
2787
+ var AtlasDataURL = {
2788
+ dataURL: "data:image/png;base64,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"
2789
+ };
2790
+
2791
+ // dist/layers/common-layers/marker-layer/marker-layer.js
2792
+ var MarkerLayer = class extends import_core7.CompositeLayer {
2793
+ renderLayers() {
2794
+ const { getMarker, ...otherProps } = this.props;
2795
+ return [
2796
+ new import_layers6.IconLayer(this.getSubLayerProps({
2797
+ id: "marker-layer",
2798
+ iconAtlas: AtlasDataURL.dataURL,
2799
+ iconMapping: MarkerMapping,
2800
+ getIcon: getMarker,
2801
+ ...otherProps
2802
+ }))
2803
+ ];
2804
+ }
2805
+ };
2806
+ __publicField(MarkerLayer, "layerName", "MarkerLayer");
2807
+ __publicField(MarkerLayer, "defaultProps", {
2808
+ id: "MarkerLayer",
2809
+ data: [],
2810
+ getMarker: (d) => d.marker,
2811
+ getColor: (d) => [0, 0, 0],
2812
+ getSize: (d) => 10
2813
+ });
2814
+
2815
+ // dist/layers/node-layers/zoomable-marker-layer.js
2816
+ var ZoomableMarkerLayer = class extends import_core8.CompositeLayer {
2817
+ shouldUpdateState({ props, changeFlags }) {
2818
+ const { stylesheet } = this.props;
2819
+ const scaleWithZoom = stylesheet.getDeckGLAccessor("scaleWithZoom");
2820
+ if (!scaleWithZoom) {
2821
+ return changeFlags.somethingChanged;
2822
+ }
2823
+ return changeFlags.somethingChanged || changeFlags.viewportChanged;
2824
+ }
2825
+ renderLayers() {
2826
+ const { data, getPosition, stylesheet, positionUpdateTrigger = 0 } = this.props;
2827
+ const getSize = stylesheet.getDeckGLAccessor("getSize");
2828
+ const scaleWithZoom = stylesheet.getDeckGLAccessor("scaleWithZoom");
2829
+ const sizeUpdateTrigger = scaleWithZoom ? [getSize, this.context.viewport.zoom] : false;
2830
+ const oiginalGetMarker = stylesheet.getDeckGLAccessor("getMarker");
2831
+ const getMarker = typeof oiginalGetMarker === "function" ? oiginalGetMarker : () => oiginalGetMarker;
2832
+ return [
2833
+ new MarkerLayer(this.getSubLayerProps({
2834
+ id: "zoomable-marker-layer",
2835
+ data,
2836
+ getPosition,
2837
+ sizeScale: scaleWithZoom ? Math.max(0, this.context.viewport.zoom) : 1,
2838
+ ...stylesheet.getDeckGLAccessors(),
2839
+ getMarker,
2840
+ updateTriggers: {
2841
+ ...stylesheet.getDeckGLUpdateTriggers(),
2842
+ getPosition: positionUpdateTrigger,
2843
+ getSize: sizeUpdateTrigger
2844
+ }
2845
+ }))
2846
+ ];
2847
+ }
2848
+ };
2849
+ __publicField(ZoomableMarkerLayer, "layerName", "ZoomableMarkerLayer");
2850
+
2851
+ // dist/layers/edge-layer.js
2852
+ var import_core13 = require("@deck.gl/core");
2853
+
2854
+ // dist/layers/edge-layers/straight-line-edge-layer.js
2855
+ var import_core9 = require("@deck.gl/core");
2856
+ var import_layers7 = require("@deck.gl/layers");
2857
+ var StraightLineEdgeLayer = class extends import_core9.CompositeLayer {
2858
+ renderLayers() {
2859
+ const { data, getLayoutInfo, positionUpdateTrigger = 0, colorUpdateTrigger = 0, widthUpdateTrigger = 0, ...otherProps } = this.props;
2860
+ return [
2861
+ new import_layers7.LineLayer(this.getSubLayerProps({
2862
+ id: "__line-layer",
2863
+ data,
2864
+ getSourcePosition: (e) => getLayoutInfo(e).sourcePosition,
2865
+ getTargetPosition: (e) => getLayoutInfo(e).targetPosition,
2866
+ updateTriggers: {
2867
+ getColor: colorUpdateTrigger,
2868
+ getSourcePosition: positionUpdateTrigger,
2869
+ getTargetPosition: positionUpdateTrigger,
2870
+ getWidth: widthUpdateTrigger
2871
+ },
2872
+ ...otherProps
2873
+ }))
2874
+ ];
2875
+ }
2876
+ };
2877
+ __publicField(StraightLineEdgeLayer, "layerName", "StraightLineEdgeLayer");
2878
+
2879
+ // dist/layers/edge-layers/path-edge-layer.js
2880
+ var import_core10 = require("@deck.gl/core");
2881
+ var import_layers8 = require("@deck.gl/layers");
2882
+ var PathEdgeLayer = class extends import_core10.CompositeLayer {
2883
+ renderLayers() {
2884
+ const { data, getLayoutInfo, positionUpdateTrigger = 0, colorUpdateTrigger = 0, widthUpdateTrigger = 0, ...otherProps } = this.props;
2885
+ return [
2886
+ new import_layers8.PathLayer(this.getSubLayerProps({
2887
+ id: "__line-layer",
2888
+ data,
2889
+ getPath: (e) => {
2890
+ const { sourcePosition, targetPosition, controlPoints } = getLayoutInfo(e);
2891
+ return [sourcePosition, ...controlPoints, targetPosition];
2892
+ },
2893
+ updateTriggers: {
2894
+ getColor: colorUpdateTrigger,
2895
+ getPath: positionUpdateTrigger,
2896
+ getWidth: widthUpdateTrigger
2897
+ },
2898
+ ...otherProps
2899
+ }))
2900
+ ];
2901
+ }
2902
+ };
2903
+ __publicField(PathEdgeLayer, "layerName", "PathEdgeLayer");
2904
+
2905
+ // dist/layers/edge-layers/curved-edge-layer.js
2906
+ var import_core12 = require("@deck.gl/core");
2907
+ var import_layers10 = require("@deck.gl/layers");
2908
+
2909
+ // dist/layers/common-layers/spline-layer/spline-layer.js
2910
+ var import_core11 = require("@deck.gl/core");
2911
+ var import_layers9 = require("@deck.gl/layers");
2912
+ var import_cardinal_spline_js = require("cardinal-spline-js");
2913
+ var defaultProps = {
2914
+ id: "spline-layer",
2915
+ getData: (d) => d.points,
2916
+ getAngle: (x) => 0,
2917
+ fontSize: 24,
2918
+ coordinateSystem: import_core11.COORDINATE_SYSTEM.CARTESIAN,
2919
+ fp64: false
2920
+ };
2921
+ var SplineLayer = class extends import_core11.CompositeLayer {
2922
+ initializeState() {
2923
+ this.state = { typedEdgeData: [] };
2924
+ }
2925
+ shouldUpdateState({ changeFlags }) {
2926
+ return changeFlags.dataChanged || changeFlags.propsChanged;
2927
+ }
2928
+ updateState({ props, oldProps, changeFlags }) {
2929
+ super.updateState({ props, oldProps, changeFlags });
2930
+ if (changeFlags.dataChanged || changeFlags.propsChanged) {
2931
+ this.updateSplineData();
2932
+ }
2933
+ }
2934
+ updateSplineData() {
2935
+ const { data } = this.props;
2936
+ const paths = data.reduce((res, d) => {
2937
+ const sourcePosition = this.props.getSourcePosition(d);
2938
+ const targetPosition = this.props.getTargetPosition(d);
2939
+ const controlPoints = this.props.getControlPoints(d);
2940
+ const serializedControlPoints = controlPoints.toString().split(",");
2941
+ const points = (0, import_cardinal_spline_js.getCurvePoints)([...sourcePosition, ...serializedControlPoints, ...targetPosition], 0.5, 10);
2942
+ const path = [];
2943
+ for (let idx = 0; idx < points.length; idx += 2) {
2944
+ path.push([points[idx], points[idx + 1]]);
2945
+ }
2946
+ res.push(path);
2947
+ return res;
2948
+ }, []);
2949
+ this.setState({ paths });
2950
+ }
2951
+ renderLayers() {
2952
+ const { coordinateSystem, getColor: getColor2, getWidth, id, updateTriggers } = this.props;
2953
+ const { paths } = this.state;
2954
+ return new import_layers9.PathLayer({
2955
+ id: `${id}-splines`,
2956
+ data: paths,
2957
+ getPath: (d) => d,
2958
+ getColor: getColor2,
2959
+ getWidth,
2960
+ coordinateSystem,
2961
+ updateTriggers
2962
+ });
2963
+ }
2964
+ };
2965
+ __publicField(SplineLayer, "layerName", "SplineLayer");
2966
+ SplineLayer.layerName = "SplineLayer";
2967
+ SplineLayer.defaultProps = defaultProps;
2968
+
2969
+ // dist/layers/edge-layers/curved-edge-layer.js
2970
+ var DEBUG = false;
2971
+ var CurvedEdgeLayer = class extends import_core12.CompositeLayer {
2972
+ // @ts-expect-error TODO
2973
+ renderLayers() {
2974
+ const { data, getLayoutInfo, positionUpdateTrigger = 0, colorUpdateTrigger = 0, widthUpdateTrigger = 0, ...otherProps } = this.props;
2975
+ return [
2976
+ DEBUG && new import_layers10.ScatterplotLayer(this.getSubLayerProps({
2977
+ id: "__control-points",
2978
+ data,
2979
+ getPosition: (e) => getLayoutInfo(e).controlPoints[0],
2980
+ getColor: (d) => [190, 190, 190, 150],
2981
+ getRadius: (d) => 5,
2982
+ updateTriggers: {
2983
+ getPosition: positionUpdateTrigger
2984
+ },
2985
+ ...otherProps
2986
+ })),
2987
+ DEBUG && new import_layers10.LineLayer(this.getSubLayerProps({
2988
+ id: "__first_segment",
2989
+ data,
2990
+ getSourcePosition: (e) => getLayoutInfo(e).sourcePosition,
2991
+ getTargetPosition: (e) => getLayoutInfo(e).controlPoints[0],
2992
+ getColor: (e) => [210, 210, 210, 150],
2993
+ updateTriggers: {
2994
+ getSourcePosition: positionUpdateTrigger,
2995
+ getTargetPosition: positionUpdateTrigger
2996
+ },
2997
+ ...otherProps
2998
+ })),
2999
+ DEBUG && new import_layers10.LineLayer(this.getSubLayerProps({
3000
+ id: "__last_segment",
3001
+ data,
3002
+ getSourcePosition: (e) => getLayoutInfo(e).controlPoints[0],
3003
+ getTargetPosition: (e) => getLayoutInfo(e).targetPosition,
3004
+ getColor: (e) => [210, 210, 210, 150],
3005
+ updateTriggers: {
3006
+ getSourcePosition: positionUpdateTrigger,
3007
+ getTargetPosition: positionUpdateTrigger
3008
+ },
3009
+ ...otherProps
3010
+ })),
3011
+ new SplineLayer(this.getSubLayerProps({
3012
+ id: "__spline_layer",
3013
+ data,
3014
+ getSourcePosition: (e) => getLayoutInfo(e).sourcePosition,
3015
+ getTargetPosition: (e) => getLayoutInfo(e).targetPosition,
3016
+ getControlPoints: (e) => getLayoutInfo(e).controlPoints,
3017
+ updateTriggers: {
3018
+ getSourcePosition: positionUpdateTrigger,
3019
+ getTargetPosition: positionUpdateTrigger,
3020
+ getControlPoints: positionUpdateTrigger,
3021
+ getColor: colorUpdateTrigger,
3022
+ getWidth: widthUpdateTrigger
3023
+ },
3024
+ ...otherProps
3025
+ }))
3026
+ ];
3027
+ }
3028
+ };
3029
+ __publicField(CurvedEdgeLayer, "layerName", "CurvedEdgeLayer");
3030
+
3031
+ // dist/layers/edge-layer.js
3032
+ var EDGE_LAYER_MAP = {
3033
+ [EDGE_TYPE.LINE]: StraightLineEdgeLayer,
3034
+ [EDGE_TYPE.PATH]: PathEdgeLayer,
3035
+ [EDGE_TYPE.SPLINE_CURVE]: CurvedEdgeLayer
3036
+ };
3037
+ var EdgeLayer = class extends import_core13.CompositeLayer {
3038
+ updateState({ props, oldProps, changeFlags }) {
3039
+ super.updateState({ props, oldProps, changeFlags });
3040
+ if (changeFlags.dataChanged) {
3041
+ this.updateStateData();
3042
+ }
3043
+ }
3044
+ updateStateData() {
3045
+ const { data, getLayoutInfo } = this.props;
3046
+ const typedEdgeData = data.reduce((res, d) => {
3047
+ const { type } = getLayoutInfo(d);
3048
+ res[type].push(d);
3049
+ return res;
3050
+ }, {
3051
+ [EDGE_TYPE.LINE]: [],
3052
+ [EDGE_TYPE.PATH]: [],
3053
+ [EDGE_TYPE.SPLINE_CURVE]: []
3054
+ });
3055
+ this.setState({ typedEdgeData });
3056
+ }
3057
+ renderLayers() {
3058
+ const { getLayoutInfo, pickable, positionUpdateTrigger, stylesheet, id } = this.props;
3059
+ const { typedEdgeData } = this.state;
3060
+ return Object.entries(typedEdgeData).map((e, idx) => {
3061
+ const [type, edgeData] = e;
3062
+ const Layer = EDGE_LAYER_MAP[type];
3063
+ if (!Layer) {
3064
+ return null;
3065
+ }
3066
+ return new Layer({
3067
+ id: `${id}-${idx}`,
3068
+ data: edgeData,
3069
+ getLayoutInfo,
3070
+ getColor: stylesheet.getDeckGLAccessor("getColor"),
3071
+ getWidth: stylesheet.getDeckGLAccessor("getWidth"),
3072
+ colorUpdateTrigger: stylesheet.getDeckGLAccessorUpdateTrigger("getColor"),
3073
+ widthUpdateTrigger: stylesheet.getDeckGLAccessorUpdateTrigger("getWidth"),
3074
+ positionUpdateTrigger,
3075
+ pickable,
3076
+ coordinateSystem: import_core13.COORDINATE_SYSTEM.CARTESIAN,
3077
+ parameters: {
3078
+ depthCompare: "always"
3079
+ }
3080
+ });
3081
+ });
3082
+ }
3083
+ };
3084
+ __publicField(EdgeLayer, "layerName", "EdgeLayer");
3085
+ __publicField(EdgeLayer, "defaultProps", {
3086
+ data: [],
3087
+ pickable: true,
3088
+ getLayoutInfo: (d) => ({
3089
+ type: d.type,
3090
+ sourcePosition: d.sourcePosition,
3091
+ targetPosition: d.targetPosition,
3092
+ controlPoints: []
3093
+ }),
3094
+ positionUpdateTrigger: 0
3095
+ });
3096
+
3097
+ // dist/layers/edge-layers/edge-label-layer.js
3098
+ var import_core14 = require("@deck.gl/core");
3099
+ var EdgeLabelLayer = class extends import_core14.CompositeLayer {
3100
+ renderLayers() {
3101
+ const { data, getLayoutInfo, positionUpdateTrigger = 0, stylesheet } = this.props;
3102
+ return [
3103
+ new ZoomableTextLayer(this.getSubLayerProps({
3104
+ id: "edge-label-layer",
3105
+ data,
3106
+ getPosition: (e) => {
3107
+ const { sourcePosition, targetPosition, controlPoints = [] } = getLayoutInfo(e);
3108
+ const allPoints = [sourcePosition, targetPosition, ...controlPoints];
3109
+ const sumX = allPoints.reduce((res, p) => res + p[0], 0);
3110
+ const sumY = allPoints.reduce((res, p) => res + p[1], 0);
3111
+ return [sumX / allPoints.length, sumY / allPoints.length];
3112
+ },
3113
+ getAngle: (e) => {
3114
+ const { sourcePosition, targetPosition } = getLayoutInfo(e);
3115
+ const [newSourcePosition, newTargetPosition] = sourcePosition[0] < targetPosition[0] ? [sourcePosition, targetPosition] : [targetPosition, sourcePosition];
3116
+ const deltaX = newTargetPosition[0] - newSourcePosition[0];
3117
+ const deltaY = newTargetPosition[1] - newSourcePosition[1];
3118
+ return Math.atan2(deltaY, deltaX) * -180 / Math.PI;
3119
+ },
3120
+ ...stylesheet.getDeckGLAccessors(),
3121
+ updateTriggers: {
3122
+ ...stylesheet.getDeckGLUpdateTriggers(),
3123
+ getPosition: positionUpdateTrigger
3124
+ }
3125
+ }))
3126
+ ];
3127
+ }
3128
+ };
3129
+ __publicField(EdgeLabelLayer, "layerName", "EdgeLabelLayer");
3130
+
3131
+ // dist/layers/edge-layers/flow-layer.js
3132
+ var import_core15 = require("@deck.gl/core");
3133
+
3134
+ // dist/layers/common-layers/flow-path-layer/flow-path-layer.js
3135
+ var import_layers11 = require("@deck.gl/layers");
3136
+ var import_global = require("global");
3137
+
3138
+ // dist/layers/common-layers/flow-path-layer/flow-path-layer-vertex.glsl.js
3139
+ var vs = (
3140
+ /* glsl */
3141
+ `#define SHADER_NAME flow-path-layer-vertex-shader
3142
+
3143
+ attribute vec3 positions;
3144
+ attribute vec3 instanceSourcePositions;
3145
+ attribute vec3 instanceTargetPositions;
3146
+ attribute vec4 instanceSourceTargetPositions64xyLow;
3147
+ attribute vec4 instanceColors;
3148
+ attribute vec3 instancePickingColors;
3149
+ attribute float instanceWidths;
3150
+ attribute float instanceSpeeds;
3151
+ attribute float instanceOffsets;
3152
+ attribute float instanceTailLengths;
3153
+
3154
+ uniform float opacity;
3155
+ uniform float widthScale;
3156
+ uniform float widthMinPixels;
3157
+ uniform float widthMaxPixels;
3158
+
3159
+ varying vec4 vColor;
3160
+ varying float segmentIndex;
3161
+ varying float speed;
3162
+ varying float pathLength;
3163
+ varying float tailLength;
3164
+ varying float offset;
3165
+
3166
+ // offset vector by strokeWidth pixels
3167
+ // offset_direction is -1 (left) or 1 (right)
3168
+ vec2 getExtrusionOffset(vec2 line_clipspace, float offset_direction, float width) {
3169
+ // normalized direction of the line
3170
+ vec2 dir_screenspace = normalize(line_clipspace * project_uViewportSize);
3171
+ // rotate by 90 degrees
3172
+ dir_screenspace = vec2(-dir_screenspace.y, dir_screenspace.x);
3173
+
3174
+ vec2 offset_screenspace = dir_screenspace * offset_direction * width / 2.0;
3175
+ vec2 offset_clipspace = project_pixel_size_to_clipspace(offset_screenspace);
3176
+
3177
+ return offset_clipspace;
3178
+ }
3179
+
3180
+ void main(void) {
3181
+ // Position
3182
+ vec4 source = project_position_to_clipspace(instanceSourcePositions, instanceSourceTargetPositions64xyLow.xy, vec3(0.));
3183
+ vec4 target = project_position_to_clipspace(instanceTargetPositions, instanceSourceTargetPositions64xyLow.zw, vec3(0.));
3184
+
3185
+ // Multiply out width and clamp to limits
3186
+ float widthPixels = clamp(
3187
+ project_size_to_pixel(instanceWidths * widthScale),
3188
+ widthMinPixels, widthMaxPixels
3189
+ );
3190
+
3191
+ // linear interpolation of source & target to pick right coord
3192
+ segmentIndex = positions.x;
3193
+ speed = instanceSpeeds;
3194
+ tailLength = project_size_to_pixel(instanceTailLengths * widthScale);
3195
+ offset = instanceOffsets;
3196
+ pathLength = distance(instanceSourcePositions, instanceTargetPositions);
3197
+ vec4 p = mix(source, target, segmentIndex);
3198
+
3199
+ // extrude
3200
+ vec2 offset = getExtrusionOffset(target.xy - source.xy, positions.y, widthPixels);
3201
+ gl_Position = p + vec4(offset, 0.0, 0.0);
3202
+
3203
+ // Color
3204
+ vColor = vec4(instanceColors.rgb, instanceColors.a * opacity) / 255.;
3205
+
3206
+ // Set color to be rendered to picking fbo (also used to check for selection highlight).
3207
+ picking_setPickingColor(instancePickingColors);
3208
+ }
3209
+ `
3210
+ );
3211
+
3212
+ // dist/layers/common-layers/flow-path-layer/flow-path-layer-fragment.glsl.js
3213
+ var fs2 = (
3214
+ /* glsl */
3215
+ `#define SHADER_NAME flow-path-layer-fragment-shader
3216
+
3217
+ precision highp float;
3218
+
3219
+ varying vec4 vColor;
3220
+ varying float segmentIndex;
3221
+ varying float speed;
3222
+ varying float offset;
3223
+ varying float pathLength;
3224
+ varying float tailLength;
3225
+
3226
+ void main(void) {
3227
+ gl_FragColor = vColor;
3228
+
3229
+ // use highlight color if this fragment belongs to the selected object.
3230
+ gl_FragColor = picking_filterHighlightColor(gl_FragColor);
3231
+
3232
+ // use picking color if rendering to picking FBO.
3233
+ gl_FragColor = picking_filterPickingColor(gl_FragColor);
3234
+
3235
+ if (speed == 0.0) {
3236
+ gl_FragColor = vec4(0.0, 0.0, 0.0, 0.0);
3237
+ } else {
3238
+ // the portion of the visible segment (0 to 1) , ex: 0.3
3239
+ // edge cases: pathLength = 0 or tailLength > pathLength
3240
+ float segFragment = 0.0;
3241
+ if (pathLength != 0.0) {
3242
+ segFragment = tailLength / pathLength;
3243
+ }
3244
+ if (tailLength > pathLength) {
3245
+ segFragment = 1.0;
3246
+ }
3247
+ float startSegmentIndex = mod(offset, 60.0) / 60.0;
3248
+ // the end offset, cap to 1.0 (end of the line)
3249
+ float endSegmentIndex = min(startSegmentIndex + segFragment, 1.0);
3250
+ if (segmentIndex < startSegmentIndex || segmentIndex > endSegmentIndex) {
3251
+ gl_FragColor = vec4(0.0, 0.0, 0.0, 0.0);
3252
+ } else {
3253
+ // fading tail
3254
+ float portion = (segmentIndex - startSegmentIndex) / segFragment;
3255
+ gl_FragColor[3] = portion;
3256
+ }
3257
+ }
3258
+ }
3259
+ `
3260
+ );
3261
+
3262
+ // dist/layers/common-layers/flow-path-layer/flow-path-layer.js
3263
+ var defaultProps2 = {
3264
+ ...import_layers11.LineLayer.defaultProps,
3265
+ getWidth: { type: "accessor", value: 1 },
3266
+ getSpeed: { type: "accessor", value: 0 }
3267
+ };
3268
+ var FlowPathLayer = class extends import_layers11.LineLayer {
3269
+ getShaders() {
3270
+ const projectModule = this.use64bitPositions() ? "project64" : "project32";
3271
+ return { vs, fs: fs2, modules: [projectModule, "picking"] };
3272
+ }
3273
+ initializeState() {
3274
+ super.initializeState();
3275
+ this.getAttributeManager().addInstanced({
3276
+ instanceSpeeds: {
3277
+ size: 1,
3278
+ transition: true,
3279
+ accessor: "getSpeed",
3280
+ defaultValue: 0
3281
+ },
3282
+ instanceTailLengths: {
3283
+ size: 1,
3284
+ transition: true,
3285
+ accessor: "getTailLength",
3286
+ defaultValue: 1
3287
+ }
3288
+ });
3289
+ this.setupTransformFeedback();
3290
+ this.setState({
3291
+ ...this.state,
3292
+ animation: import_global.window.requestAnimationFrame(this.animate.bind(this))
3293
+ });
3294
+ }
3295
+ animate() {
3296
+ const { transform } = this.state;
3297
+ if (transform) {
3298
+ transform.run();
3299
+ transform.swap();
3300
+ }
3301
+ this.setState({
3302
+ animation: import_global.window.requestAnimationFrame(this.animate.bind(this))
3303
+ });
3304
+ }
3305
+ updateState({ props, oldProps, changeFlags }) {
3306
+ super.updateState({ props, oldProps, changeFlags });
3307
+ const { speedsBuffer } = this.state;
3308
+ const speedChanged = changeFlags.dataChanged || props.fp64 !== oldProps.fp64 || changeFlags.updateTriggersChanged && (changeFlags.updateTriggersChanged.all || changeFlags.updateTriggersChanged.getSpeed);
3309
+ if (speedChanged) {
3310
+ const speeds = new Float32Array(props.data.length);
3311
+ for (let i = 0; i < props.data.length; i++) {
3312
+ speeds[i] = typeof props.getSpeed === "function" ? props.getSpeed(props.data[i]) : props.getSpeed;
3313
+ }
3314
+ speedsBuffer.subData({ data: speeds });
3315
+ }
3316
+ if (props.fp64 !== oldProps.fp64) {
3317
+ if (this.state.model) {
3318
+ this.state.model.delete();
3319
+ }
3320
+ this.setState({ model: this._getModel() });
3321
+ this.getAttributeManager().invalidateAll();
3322
+ }
3323
+ }
3324
+ finalizeState() {
3325
+ super.finalizeState(this.context);
3326
+ import_global.window.cancelAnimationFrame(this.state.animation);
3327
+ }
3328
+ setupTransformFeedback() {
3329
+ throw new Error("Not implemented");
3330
+ }
3331
+ draw({ uniforms }) {
3332
+ throw new Error("Not implemented");
3333
+ }
3334
+ };
3335
+ FlowPathLayer.layerName = "FlowPathLayer";
3336
+ FlowPathLayer.defaultProps = defaultProps2;
3337
+
3338
+ // dist/layers/edge-layers/flow-layer.js
3339
+ var FlowLayer = class extends import_core15.CompositeLayer {
3340
+ renderLayers() {
3341
+ const { data, getLayoutInfo, positionUpdateTrigger = 0, stylesheet } = this.props;
3342
+ return [
3343
+ new FlowPathLayer(this.getSubLayerProps({
3344
+ id: "__flow-layer",
3345
+ data,
3346
+ ...stylesheet.getDeckGLAccessors(),
3347
+ getSourcePosition: (e) => getLayoutInfo(e).sourcePosition,
3348
+ getTargetPosition: (e) => getLayoutInfo(e).targetPosition,
3349
+ parameters: {
3350
+ depthTest: false
3351
+ },
3352
+ updateTriggers: {
3353
+ ...stylesheet.getDeckGLUpdateTriggers(),
3354
+ getSourcePosition: positionUpdateTrigger,
3355
+ getTargetPosition: positionUpdateTrigger
3356
+ }
3357
+ }))
3358
+ ];
3359
+ }
3360
+ };
3361
+ __publicField(FlowLayer, "layerName", "FlowLayer");
3362
+
3363
+ // dist/layers/graph-layer.js
3364
+ var NODE_LAYER_MAP = {
3365
+ [NODE_TYPE.RECTANGLE]: RectangleLayer,
3366
+ [NODE_TYPE.ROUNDED_RECTANGLE]: RoundedRectangleLayer,
3367
+ [NODE_TYPE.PATH_ROUNDED_RECTANGLE]: PathBasedRoundedRectangleLayer,
3368
+ [NODE_TYPE.ICON]: ImageLayer,
3369
+ [NODE_TYPE.CIRCLE]: CircleLayer,
3370
+ [NODE_TYPE.LABEL]: LabelLayer,
3371
+ [NODE_TYPE.MARKER]: ZoomableMarkerLayer
3372
+ };
3373
+ var EDGE_DECORATOR_LAYER_MAP = {
3374
+ [EDGE_DECORATOR_TYPE.LABEL]: EdgeLabelLayer,
3375
+ [EDGE_DECORATOR_TYPE.FLOW]: FlowLayer
3376
+ };
3377
+ var SHARED_LAYER_PROPS = {
3378
+ coordinateSystem: import_core16.COORDINATE_SYSTEM.CARTESIAN,
3379
+ parameters: {
3380
+ depthTest: false
3381
+ }
3382
+ };
3383
+ var defaultProps3 = {
3384
+ // an array of styles for layers
3385
+ nodeStyle: [],
3386
+ nodeEvents: {
3387
+ onMouseLeave: () => {
3388
+ },
3389
+ onHover: () => {
3390
+ },
3391
+ onMouseEnter: () => {
3392
+ },
3393
+ onClick: () => {
3394
+ },
3395
+ onDrag: () => {
3396
+ }
3397
+ },
3398
+ edgeStyle: {
3399
+ color: "black",
3400
+ strokeWidth: 1,
3401
+ // an array of styles for layers
3402
+ decorators: []
3403
+ },
3404
+ edgeEvents: {
3405
+ onClick: () => {
3406
+ },
3407
+ onHover: () => {
3408
+ }
3409
+ },
3410
+ enableDragging: false
3411
+ };
3412
+ var GraphLayer = class extends import_core16.CompositeLayer {
3413
+ forceUpdate = () => {
3414
+ if (this.context && this.context.layerManager) {
3415
+ this.setNeedsUpdate();
3416
+ this.setChangeFlags({ dataChanged: true });
3417
+ }
3418
+ };
3419
+ constructor(props) {
3420
+ super(props);
3421
+ props.engine.addEventListener("onLayoutChange", this.forceUpdate);
3422
+ }
3423
+ initializeState() {
3424
+ const interactionManager = new InteractionManager(this.props, () => this.forceUpdate());
3425
+ this.state = { interactionManager };
3426
+ }
3427
+ shouldUpdateState({ changeFlags }) {
3428
+ return changeFlags.dataChanged || changeFlags.propsChanged;
3429
+ }
3430
+ updateState({ props }) {
3431
+ this.state.interactionManager.updateProps(props);
3432
+ }
3433
+ finalize() {
3434
+ this.props.engine.removeEventListener("onLayoutChange", this.forceUpdate);
3435
+ }
3436
+ createNodeLayers() {
3437
+ const { engine, nodeStyle } = this.props;
3438
+ if (!nodeStyle || !Array.isArray(nodeStyle) || nodeStyle.length === 0) {
3439
+ return [];
3440
+ }
3441
+ return nodeStyle.filter(Boolean).map((style, idx) => {
3442
+ const { pickable = true, visible = true, data = (nodes) => nodes, ...restStyle } = style;
3443
+ const LayerType = NODE_LAYER_MAP[style.type];
3444
+ if (!LayerType) {
3445
+ log.error(`Invalid node type: ${style.type}`)();
3446
+ throw new Error(`Invalid node type: ${style.type}`);
3447
+ }
3448
+ const stylesheet = new Stylesheet(restStyle, {
3449
+ stateUpdateTrigger: this.state.interactionManager.getLastInteraction()
3450
+ });
3451
+ const getOffset2 = stylesheet.getDeckGLAccessor("getOffset");
3452
+ return new LayerType({
3453
+ ...SHARED_LAYER_PROPS,
3454
+ id: `node-rule-${idx}`,
3455
+ data: data(engine.getNodes()),
3456
+ getPosition: mixedGetPosition(engine.getNodePosition, getOffset2),
3457
+ pickable,
3458
+ positionUpdateTrigger: [
3459
+ engine.getLayoutLastUpdate(),
3460
+ engine.getLayoutState(),
3461
+ stylesheet.getDeckGLAccessorUpdateTrigger("getOffset")
3462
+ ].join(),
3463
+ stylesheet,
3464
+ visible
3465
+ });
3466
+ });
3467
+ }
3468
+ createEdgeLayers() {
3469
+ const { edgeStyle, engine } = this.props;
3470
+ if (!edgeStyle) {
3471
+ return [];
3472
+ }
3473
+ return (Array.isArray(edgeStyle) ? edgeStyle : [edgeStyle]).filter(Boolean).flatMap((style, idx) => {
3474
+ const { decorators, data = (edges) => edges, visible = true, ...restEdgeStyle } = style;
3475
+ const stylesheet = new Stylesheet({
3476
+ type: "Edge",
3477
+ ...restEdgeStyle
3478
+ }, {
3479
+ stateUpdateTrigger: this.state.interactionManager.getLastInteraction()
3480
+ });
3481
+ const edgeLayer = new EdgeLayer({
3482
+ ...SHARED_LAYER_PROPS,
3483
+ id: `edge-layer-${idx}`,
3484
+ data: data(engine.getEdges()),
3485
+ getLayoutInfo: engine.getEdgePosition,
3486
+ pickable: true,
3487
+ positionUpdateTrigger: [engine.getLayoutLastUpdate(), engine.getLayoutState()].join(),
3488
+ stylesheet,
3489
+ visible
3490
+ });
3491
+ if (!decorators || !Array.isArray(decorators) || decorators.length === 0) {
3492
+ return edgeLayer;
3493
+ }
3494
+ const decoratorLayers = decorators.filter(Boolean).flatMap((decoratorStyle, idx2) => {
3495
+ const DecoratorLayer = EDGE_DECORATOR_LAYER_MAP[decoratorStyle.type];
3496
+ if (!DecoratorLayer) {
3497
+ log.error(`Invalid edge decorator type: ${decoratorStyle.type}`)();
3498
+ throw new Error(`Invalid edge decorator type: ${decoratorStyle.type}`);
3499
+ }
3500
+ const decoratorStylesheet = new Stylesheet(decoratorStyle, {
3501
+ stateUpdateTrigger: this.state.interactionManager.getLastInteraction()
3502
+ });
3503
+ return new DecoratorLayer({
3504
+ ...SHARED_LAYER_PROPS,
3505
+ id: `edge-decorator-${idx2}`,
3506
+ data: data(engine.getEdges()),
3507
+ getLayoutInfo: engine.getEdgePosition,
3508
+ pickable: true,
3509
+ positionUpdateTrigger: [engine.getLayoutLastUpdate(), engine.getLayoutState()].join(),
3510
+ stylesheet: decoratorStylesheet
3511
+ });
3512
+ });
3513
+ return [edgeLayer, decoratorLayers];
3514
+ });
3515
+ }
3516
+ onClick(info, event) {
3517
+ return this.state.interactionManager.onClick(info, event) || false;
3518
+ }
3519
+ onHover(info, event) {
3520
+ return this.state.interactionManager.onHover(info, event) || false;
3521
+ }
3522
+ onDragStart(info, event) {
3523
+ this.state.interactionManager.onDragStart(info, event);
3524
+ }
3525
+ onDrag(info, event) {
3526
+ this.state.interactionManager.onDrag(info, event);
3527
+ }
3528
+ onDragEnd(info, event) {
3529
+ this.state.interactionManager.onDragEnd(info, event);
3530
+ }
3531
+ renderLayers() {
3532
+ return [this.createEdgeLayers(), this.createNodeLayers()];
3533
+ }
3534
+ };
3535
+ __publicField(GraphLayer, "defaultProps", {
3536
+ pickable: true
3537
+ });
3538
+ GraphLayer.layerName = "GraphLayer";
3539
+ GraphLayer.defaultProps = defaultProps3;
3540
+ //# sourceMappingURL=index.cjs.map