@deck.gl-community/graph-layers 9.1.1 → 9.2.0-beta.3

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 (354) hide show
  1. package/dist/_deprecated/old-constants.d.ts +107 -0
  2. package/dist/_deprecated/old-constants.d.ts.map +1 -0
  3. package/dist/_deprecated/old-constants.js +111 -0
  4. package/dist/_deprecated/old-constants.js.map +1 -0
  5. package/dist/core/cache.d.ts +0 -1
  6. package/dist/core/cache.js +0 -1
  7. package/dist/core/constants.d.ts +12 -100
  8. package/dist/core/constants.d.ts.map +1 -1
  9. package/dist/core/constants.js +3 -44
  10. package/dist/core/constants.js.map +1 -1
  11. package/dist/core/graph-engine.d.ts +63 -20
  12. package/dist/core/graph-engine.d.ts.map +1 -1
  13. package/dist/core/graph-engine.js +163 -72
  14. package/dist/core/graph-engine.js.map +1 -1
  15. package/dist/core/graph-layout.d.ts +63 -32
  16. package/dist/core/graph-layout.d.ts.map +1 -1
  17. package/dist/core/graph-layout.js +118 -36
  18. package/dist/core/graph-layout.js.map +1 -1
  19. package/dist/core/interaction-manager.d.ts +7 -5
  20. package/dist/core/interaction-manager.d.ts.map +1 -1
  21. package/dist/core/interaction-manager.js +64 -20
  22. package/dist/core/interaction-manager.js.map +1 -1
  23. package/dist/graph/arrow-graph.d.ts +69 -0
  24. package/dist/graph/arrow-graph.d.ts.map +1 -0
  25. package/dist/graph/arrow-graph.js +513 -0
  26. package/dist/graph/arrow-graph.js.map +1 -0
  27. package/dist/graph/classic-graph.d.ts +169 -0
  28. package/dist/graph/classic-graph.d.ts.map +1 -0
  29. package/dist/graph/classic-graph.js +390 -0
  30. package/dist/graph/classic-graph.js.map +1 -0
  31. package/dist/graph/edge.d.ts +12 -12
  32. package/dist/graph/edge.d.ts.map +1 -1
  33. package/dist/graph/edge.js +3 -6
  34. package/dist/graph/edge.js.map +1 -1
  35. package/dist/graph/functions/arrow-utils.d.ts +6 -0
  36. package/dist/graph/functions/arrow-utils.d.ts.map +1 -0
  37. package/dist/graph/functions/arrow-utils.js +67 -0
  38. package/dist/graph/functions/arrow-utils.js.map +1 -0
  39. package/dist/graph/functions/create-graph-from-data.d.ts +3 -0
  40. package/dist/graph/functions/create-graph-from-data.d.ts.map +1 -0
  41. package/dist/graph/functions/create-graph-from-data.js +12 -0
  42. package/dist/graph/functions/create-graph-from-data.js.map +1 -0
  43. package/dist/graph/graph-normalization.d.ts +10 -0
  44. package/dist/graph/graph-normalization.d.ts.map +1 -0
  45. package/dist/graph/graph-normalization.js +65 -0
  46. package/dist/graph/graph-normalization.js.map +1 -0
  47. package/dist/graph/graph.d.ts +62 -156
  48. package/dist/graph/graph.d.ts.map +1 -1
  49. package/dist/graph/graph.js +11 -301
  50. package/dist/graph/graph.js.map +1 -1
  51. package/dist/graph/node.d.ts +12 -13
  52. package/dist/graph/node.d.ts.map +1 -1
  53. package/dist/graph/node.js +5 -7
  54. package/dist/graph/node.js.map +1 -1
  55. package/dist/graph-data/arrow-graph-data-builder.d.ts +21 -0
  56. package/dist/graph-data/arrow-graph-data-builder.d.ts.map +1 -0
  57. package/dist/graph-data/arrow-graph-data-builder.js +105 -0
  58. package/dist/graph-data/arrow-graph-data-builder.js.map +1 -0
  59. package/dist/graph-data/graph-data-builder.d.ts +6 -0
  60. package/dist/graph-data/graph-data-builder.d.ts.map +1 -0
  61. package/dist/graph-data/graph-data-builder.js +1 -0
  62. package/dist/graph-data/graph-data-builder.js.map +1 -0
  63. package/dist/graph-data/graph-data.d.ts +40 -0
  64. package/dist/graph-data/graph-data.d.ts.map +1 -0
  65. package/dist/graph-data/graph-data.js +11 -0
  66. package/dist/graph-data/graph-data.js.map +1 -0
  67. package/dist/graph-data/plain-graph-data-builder.d.ts +20 -0
  68. package/dist/graph-data/plain-graph-data-builder.d.ts.map +1 -0
  69. package/dist/graph-data/plain-graph-data-builder.js +105 -0
  70. package/dist/graph-data/plain-graph-data-builder.js.map +1 -0
  71. package/dist/graph-style-schema.cdn.d.ts +2 -0
  72. package/dist/graph-style-schema.cdn.js +2 -0
  73. package/dist/graph-style-schema.json +12 -0
  74. package/dist/index.cjs +7851 -3250
  75. package/dist/index.cjs.map +4 -4
  76. package/dist/index.d.ts +35 -22
  77. package/dist/index.d.ts.map +1 -1
  78. package/dist/index.js +42 -25
  79. package/dist/index.js.map +1 -1
  80. package/dist/layers/common-layers/flow-path-layer/flow-path-layer-fragment.glsl.d.ts +0 -1
  81. package/dist/layers/common-layers/flow-path-layer/flow-path-layer-fragment.glsl.js +0 -1
  82. package/dist/layers/common-layers/flow-path-layer/flow-path-layer-vertex-tf.glsl.d.ts +0 -1
  83. package/dist/layers/common-layers/flow-path-layer/flow-path-layer-vertex-tf.glsl.js +0 -1
  84. package/dist/layers/common-layers/flow-path-layer/flow-path-layer-vertex.glsl.d.ts +0 -1
  85. package/dist/layers/common-layers/flow-path-layer/flow-path-layer-vertex.glsl.js +0 -1
  86. package/dist/layers/common-layers/flow-path-layer/flow-path-layer.d.ts +0 -1
  87. package/dist/layers/common-layers/flow-path-layer/flow-path-layer.d.ts.map +1 -1
  88. package/dist/layers/common-layers/flow-path-layer/flow-path-layer.js +1 -3
  89. package/dist/layers/common-layers/flow-path-layer/flow-path-layer.js.map +1 -1
  90. package/dist/layers/common-layers/grid-layer/grid-layer.d.ts +83 -0
  91. package/dist/layers/common-layers/grid-layer/grid-layer.d.ts.map +1 -0
  92. package/dist/layers/common-layers/grid-layer/grid-layer.js +133 -0
  93. package/dist/layers/common-layers/grid-layer/grid-layer.js.map +1 -0
  94. package/dist/layers/common-layers/marker-layer/atlas-data-url.d.ts +0 -1
  95. package/dist/layers/common-layers/marker-layer/atlas-data-url.js +0 -1
  96. package/dist/layers/common-layers/marker-layer/marker-layer.d.ts +0 -1
  97. package/dist/layers/common-layers/marker-layer/marker-layer.js +2 -3
  98. package/dist/layers/common-layers/marker-layer/marker-list.d.ts +2 -63
  99. package/dist/layers/common-layers/marker-layer/marker-list.d.ts.map +1 -1
  100. package/dist/layers/common-layers/marker-layer/marker-list.js +1 -65
  101. package/dist/layers/common-layers/marker-layer/marker-list.js.map +1 -1
  102. package/dist/layers/common-layers/marker-layer/marker-mapping.d.ts +0 -1
  103. package/dist/layers/common-layers/marker-layer/marker-mapping.js +0 -1
  104. package/dist/layers/common-layers/spline-layer/spline-layer.d.ts +0 -1
  105. package/dist/layers/common-layers/spline-layer/spline-layer.js +0 -1
  106. package/dist/layers/common-layers/zoomable-text-layer/zoomable-text-layer.d.ts +0 -1
  107. package/dist/layers/common-layers/zoomable-text-layer/zoomable-text-layer.js +0 -1
  108. package/dist/layers/edge-attachment-helper.d.ts +15 -0
  109. package/dist/layers/edge-attachment-helper.d.ts.map +1 -0
  110. package/dist/layers/edge-attachment-helper.js +229 -0
  111. package/dist/layers/edge-attachment-helper.js.map +1 -0
  112. package/dist/layers/edge-layer.d.ts +1 -5
  113. package/dist/layers/edge-layer.d.ts.map +1 -1
  114. package/dist/layers/edge-layer.js +9 -11
  115. package/dist/layers/edge-layer.js.map +1 -1
  116. package/dist/layers/edge-layers/arrow-2d-geometry.d.ts +4 -0
  117. package/dist/layers/edge-layers/arrow-2d-geometry.d.ts.map +1 -0
  118. package/dist/layers/edge-layers/arrow-2d-geometry.js +42 -0
  119. package/dist/layers/edge-layers/arrow-2d-geometry.js.map +1 -0
  120. package/dist/layers/edge-layers/curved-edge-layer.d.ts +1 -2
  121. package/dist/layers/edge-layers/curved-edge-layer.js +1 -2
  122. package/dist/layers/edge-layers/edge-arrow-layer.d.ts +21 -0
  123. package/dist/layers/edge-layers/edge-arrow-layer.d.ts.map +1 -0
  124. package/dist/layers/edge-layers/edge-arrow-layer.js +131 -0
  125. package/dist/layers/edge-layers/edge-arrow-layer.js.map +1 -0
  126. package/dist/layers/edge-layers/edge-label-layer.d.ts +1 -2
  127. package/dist/layers/edge-layers/edge-label-layer.js +1 -2
  128. package/dist/layers/edge-layers/flow-layer.d.ts +1 -2
  129. package/dist/layers/edge-layers/flow-layer.js +1 -2
  130. package/dist/layers/edge-layers/path-edge-layer.d.ts +0 -1
  131. package/dist/layers/edge-layers/path-edge-layer.js +0 -1
  132. package/dist/layers/edge-layers/straight-line-edge-layer.d.ts +0 -1
  133. package/dist/layers/edge-layers/straight-line-edge-layer.js +0 -1
  134. package/dist/layers/graph-layer.d.ts +85 -29
  135. package/dist/layers/graph-layer.d.ts.map +1 -1
  136. package/dist/layers/graph-layer.js +635 -94
  137. package/dist/layers/graph-layer.js.map +1 -1
  138. package/dist/layers/node-layers/circle-layer.d.ts +0 -1
  139. package/dist/layers/node-layers/circle-layer.js +0 -1
  140. package/dist/layers/node-layers/image-layer.d.ts +0 -1
  141. package/dist/layers/node-layers/image-layer.js +0 -1
  142. package/dist/layers/node-layers/label-layer.d.ts +1 -2
  143. package/dist/layers/node-layers/label-layer.js +1 -2
  144. package/dist/layers/node-layers/path-rounded-rectangle-layer.d.ts +0 -1
  145. package/dist/layers/node-layers/path-rounded-rectangle-layer.js +1 -2
  146. package/dist/layers/node-layers/rectangle-layer.d.ts +0 -1
  147. package/dist/layers/node-layers/rectangle-layer.js +0 -1
  148. package/dist/layers/node-layers/rounded-rectangle-layer-fragment.d.ts +0 -1
  149. package/dist/layers/node-layers/rounded-rectangle-layer-fragment.js +0 -1
  150. package/dist/layers/node-layers/rounded-rectangle-layer.d.ts +1 -2
  151. package/dist/layers/node-layers/rounded-rectangle-layer.js +2 -3
  152. package/dist/layers/node-layers/zoomable-marker-layer.d.ts +1 -2
  153. package/dist/layers/node-layers/zoomable-marker-layer.js +1 -2
  154. package/dist/layouts/d3-dag/collapsable-d3-dag-layout.d.ts +24 -0
  155. package/dist/layouts/d3-dag/collapsable-d3-dag-layout.d.ts.map +1 -0
  156. package/dist/layouts/d3-dag/collapsable-d3-dag-layout.js +251 -0
  157. package/dist/layouts/d3-dag/collapsable-d3-dag-layout.js.map +1 -0
  158. package/dist/layouts/d3-dag/d3-dag-layout.d.ts +102 -0
  159. package/dist/layouts/d3-dag/d3-dag-layout.d.ts.map +1 -0
  160. package/dist/layouts/d3-dag/d3-dag-layout.js +531 -0
  161. package/dist/layouts/d3-dag/d3-dag-layout.js.map +1 -0
  162. package/dist/layouts/d3-force/d3-force-layout.d.ts +23 -11
  163. package/dist/layouts/d3-force/d3-force-layout.d.ts.map +1 -1
  164. package/dist/layouts/d3-force/d3-force-layout.js +63 -29
  165. package/dist/layouts/d3-force/d3-force-layout.js.map +1 -1
  166. package/dist/layouts/d3-force/worker.d.ts +0 -1
  167. package/dist/layouts/d3-force/worker.js +0 -1
  168. package/dist/layouts/experimental/force-multi-graph-layout.d.ts +25 -20
  169. package/dist/layouts/experimental/force-multi-graph-layout.d.ts.map +1 -1
  170. package/dist/layouts/experimental/force-multi-graph-layout.js +60 -47
  171. package/dist/layouts/experimental/force-multi-graph-layout.js.map +1 -1
  172. package/dist/layouts/experimental/hive-plot-layout.d.ts +26 -20
  173. package/dist/layouts/experimental/hive-plot-layout.d.ts.map +1 -1
  174. package/dist/layouts/experimental/hive-plot-layout.js +43 -39
  175. package/dist/layouts/experimental/hive-plot-layout.js.map +1 -1
  176. package/dist/layouts/experimental/radial-layout.d.ts +20 -12
  177. package/dist/layouts/experimental/radial-layout.d.ts.map +1 -1
  178. package/dist/layouts/experimental/radial-layout.js +41 -19
  179. package/dist/layouts/experimental/radial-layout.js.map +1 -1
  180. package/dist/layouts/gpu-force/gpu-force-layout.d.ts +15 -12
  181. package/dist/layouts/gpu-force/gpu-force-layout.d.ts.map +1 -1
  182. package/dist/layouts/gpu-force/gpu-force-layout.js +71 -59
  183. package/dist/layouts/gpu-force/gpu-force-layout.js.map +1 -1
  184. package/dist/layouts/gpu-force/worker.d.ts +0 -1
  185. package/dist/layouts/gpu-force/worker.js +0 -1
  186. package/dist/layouts/simple-layout.d.ts +21 -31
  187. package/dist/layouts/simple-layout.d.ts.map +1 -1
  188. package/dist/layouts/simple-layout.js +33 -26
  189. package/dist/layouts/simple-layout.js.map +1 -1
  190. package/dist/loaders/dot-graph-loader.d.ts +25 -0
  191. package/dist/loaders/dot-graph-loader.d.ts.map +1 -0
  192. package/dist/loaders/dot-graph-loader.js +668 -0
  193. package/dist/loaders/dot-graph-loader.js.map +1 -0
  194. package/dist/loaders/json-graph-loader.d.ts +6 -0
  195. package/dist/loaders/json-graph-loader.d.ts.map +1 -0
  196. package/dist/loaders/json-graph-loader.js +31 -0
  197. package/dist/loaders/json-graph-loader.js.map +1 -0
  198. package/dist/loaders/parsers/edge-parsers.d.ts +2 -0
  199. package/dist/loaders/parsers/edge-parsers.d.ts.map +1 -0
  200. package/dist/loaders/{edge-parsers.js → parsers/edge-parsers.js} +2 -3
  201. package/dist/loaders/parsers/edge-parsers.js.map +1 -0
  202. package/dist/loaders/parsers/node-parsers.d.ts +2 -0
  203. package/dist/loaders/parsers/node-parsers.d.ts.map +1 -0
  204. package/dist/loaders/{node-parsers.js → parsers/node-parsers.js} +2 -3
  205. package/dist/loaders/parsers/node-parsers.js.map +1 -0
  206. package/dist/loaders/parsers/parse-json-graph.d.ts +29 -0
  207. package/dist/loaders/parsers/parse-json-graph.d.ts.map +1 -0
  208. package/dist/loaders/parsers/parse-json-graph.js +78 -0
  209. package/dist/loaders/parsers/parse-json-graph.js.map +1 -0
  210. package/dist/style/graph-layer-stylesheet.d.ts +34 -0
  211. package/dist/style/graph-layer-stylesheet.d.ts.map +1 -0
  212. package/dist/style/graph-layer-stylesheet.js +39 -0
  213. package/dist/style/graph-layer-stylesheet.js.map +1 -0
  214. package/dist/style/graph-style-accessor-map.d.ts +93 -0
  215. package/dist/style/graph-style-accessor-map.d.ts.map +1 -0
  216. package/dist/style/graph-style-accessor-map.js +93 -0
  217. package/dist/style/graph-style-accessor-map.js.map +1 -0
  218. package/dist/style/graph-style-engine.d.ts +12 -0
  219. package/dist/style/graph-style-engine.d.ts.map +1 -0
  220. package/dist/style/graph-style-engine.js +164 -0
  221. package/dist/style/graph-style-engine.js.map +1 -0
  222. package/dist/style/graph-stylesheet.schema.d.ts +310 -0
  223. package/dist/style/graph-stylesheet.schema.d.ts.map +1 -0
  224. package/dist/style/graph-stylesheet.schema.js +237 -0
  225. package/dist/style/graph-stylesheet.schema.js.map +1 -0
  226. package/dist/style/style-property.d.ts +2 -3
  227. package/dist/style/style-property.d.ts.map +1 -1
  228. package/dist/style/style-property.js +224 -48
  229. package/dist/style/style-property.js.map +1 -1
  230. package/dist/style/stylesheet-engine.d.ts +33 -0
  231. package/dist/style/stylesheet-engine.d.ts.map +1 -0
  232. package/dist/style/stylesheet-engine.js +121 -0
  233. package/dist/style/stylesheet-engine.js.map +1 -0
  234. package/dist/utils/collapsed-chains.d.ts +17 -0
  235. package/dist/utils/collapsed-chains.d.ts.map +1 -0
  236. package/dist/utils/collapsed-chains.js +192 -0
  237. package/dist/utils/collapsed-chains.js.map +1 -0
  238. package/dist/utils/layer-utils.d.ts +0 -1
  239. package/dist/utils/layer-utils.d.ts.map +1 -1
  240. package/dist/utils/layer-utils.js +0 -1
  241. package/dist/utils/log.d.ts +2 -1
  242. package/dist/utils/log.d.ts.map +1 -1
  243. package/dist/utils/log.js +12 -2
  244. package/dist/utils/log.js.map +1 -1
  245. package/dist/utils/node-boundary.d.ts +10 -0
  246. package/dist/utils/node-boundary.d.ts.map +1 -0
  247. package/dist/utils/node-boundary.js +130 -0
  248. package/dist/utils/node-boundary.js.map +1 -0
  249. package/dist/utils/polygon-calculations.d.ts +0 -1
  250. package/dist/utils/polygon-calculations.js +0 -1
  251. package/dist/utils/rank-grid.d.ts +30 -0
  252. package/dist/utils/rank-grid.d.ts.map +1 -0
  253. package/dist/utils/rank-grid.js +306 -0
  254. package/dist/utils/rank-grid.js.map +1 -0
  255. package/package.json +25 -13
  256. package/src/_deprecated/old-constants.ts +122 -0
  257. package/src/_disabled/arrow-graph-data.ts.disabled +18 -0
  258. package/src/_disabled/columnar-graph-data-builder.ts.disabled +250 -0
  259. package/src/_disabled/graph-runtime-layout.ts.disabled +29 -0
  260. package/src/core/constants.ts +21 -43
  261. package/src/core/graph-engine.ts +212 -80
  262. package/src/core/graph-layout.ts +175 -47
  263. package/src/core/interaction-manager.ts +93 -33
  264. package/src/graph/arrow-graph.ts +648 -0
  265. package/src/graph/classic-graph.ts +447 -0
  266. package/src/graph/edge.ts +13 -13
  267. package/src/graph/functions/arrow-utils.ts +72 -0
  268. package/src/graph/functions/convert-arrow-graph-to-classic-graph.ts.disabled +47 -0
  269. package/src/graph/functions/convert-plain-graph-to-arrow-graph.ts.disabled +119 -0
  270. package/src/graph/functions/create-graph-from-data.ts +16 -0
  271. package/src/graph/functions/create-plain-graph-from-data.ts.disabled +176 -0
  272. package/src/graph/graph-normalization.ts +87 -0
  273. package/src/graph/graph.ts +68 -339
  274. package/src/graph/node.ts +15 -15
  275. package/src/graph/tabular-graph.ts.disabled +761 -0
  276. package/src/graph-data/arrow-graph-data-builder.ts +165 -0
  277. package/src/graph-data/graph-data-builder.ts +7 -0
  278. package/src/graph-data/graph-data.ts +57 -0
  279. package/src/graph-data/plain-graph-data-builder.ts +132 -0
  280. package/src/index.ts +82 -17
  281. package/src/layers/common-layers/flow-path-layer/flow-path-layer.ts +1 -2
  282. package/src/layers/common-layers/grid-layer/grid-layer.ts +237 -0
  283. package/src/layers/common-layers/marker-layer/marker-list.ts +62 -64
  284. package/src/layers/edge-attachment-helper.ts +361 -0
  285. package/src/layers/edge-layer.ts +6 -7
  286. package/src/layers/edge-layers/arrow-2d-geometry.ts +51 -0
  287. package/src/layers/edge-layers/edge-arrow-layer.ts +171 -0
  288. package/src/layers/graph-layer.ts +928 -130
  289. package/src/layouts/d3-dag/collapsable-d3-dag-layout.ts +330 -0
  290. package/src/layouts/d3-dag/d3-dag-layout.ts +739 -0
  291. package/src/layouts/d3-force/d3-force-layout.ts +83 -39
  292. package/src/layouts/experimental/force-multi-graph-layout.ts +72 -57
  293. package/src/layouts/experimental/hive-plot-layout.ts +60 -49
  294. package/src/layouts/experimental/radial-layout.ts +57 -26
  295. package/src/layouts/gpu-force/gpu-force-layout.ts +86 -72
  296. package/src/layouts/simple-layout.ts +51 -52
  297. package/src/loaders/{create-graph.ts → deprecated/create-graph.ts.disabled} +6 -6
  298. package/src/loaders/deprecated/json-classic-graph-loader.ts.disabled +33 -0
  299. package/src/loaders/{simple-json-graph-loader.ts → deprecated/simple-json-graph-loader.ts.disabled} +4 -4
  300. package/src/loaders/{table-graph-loader.ts → deprecated/table-graph-loader.ts.disabled} +9 -9
  301. package/src/loaders/dot-graph-loader.ts +860 -0
  302. package/src/loaders/json-graph-loader.ts +48 -0
  303. package/src/loaders/parsers/create-graph-data.ts.disabled +45 -0
  304. package/src/loaders/{edge-parsers.ts → parsers/edge-parsers.ts} +3 -3
  305. package/src/loaders/{node-parsers.ts → parsers/node-parsers.ts} +3 -3
  306. package/src/loaders/parsers/parse-json-graph.ts +134 -0
  307. package/src/style/graph-layer-stylesheet.ts +99 -0
  308. package/src/style/graph-style-accessor-map.ts +103 -0
  309. package/src/style/graph-style-engine.ts +232 -0
  310. package/src/style/graph-stylesheet.schema.ts +344 -0
  311. package/src/style/style-property.ts +314 -51
  312. package/src/style/stylesheet-engine.ts +168 -0
  313. package/src/utils/collapsed-chains.ts +255 -0
  314. package/src/utils/log.ts +15 -1
  315. package/src/utils/node-boundary.ts +238 -0
  316. package/src/utils/rank-grid.ts +426 -0
  317. package/dist/loaders/create-graph.d.ts +0 -13
  318. package/dist/loaders/create-graph.d.ts.map +0 -1
  319. package/dist/loaders/create-graph.js +0 -39
  320. package/dist/loaders/create-graph.js.map +0 -1
  321. package/dist/loaders/edge-parsers.d.ts +0 -3
  322. package/dist/loaders/edge-parsers.d.ts.map +0 -1
  323. package/dist/loaders/edge-parsers.js.map +0 -1
  324. package/dist/loaders/json-loader.d.ts +0 -8
  325. package/dist/loaders/json-loader.d.ts.map +0 -1
  326. package/dist/loaders/json-loader.js +0 -17
  327. package/dist/loaders/json-loader.js.map +0 -1
  328. package/dist/loaders/node-parsers.d.ts +0 -3
  329. package/dist/loaders/node-parsers.d.ts.map +0 -1
  330. package/dist/loaders/node-parsers.js.map +0 -1
  331. package/dist/loaders/simple-json-graph-loader.d.ts +0 -12
  332. package/dist/loaders/simple-json-graph-loader.d.ts.map +0 -1
  333. package/dist/loaders/simple-json-graph-loader.js +0 -21
  334. package/dist/loaders/simple-json-graph-loader.js.map +0 -1
  335. package/dist/loaders/table-graph-loader.d.ts +0 -17
  336. package/dist/loaders/table-graph-loader.d.ts.map +0 -1
  337. package/dist/loaders/table-graph-loader.js +0 -92
  338. package/dist/loaders/table-graph-loader.js.map +0 -1
  339. package/dist/style/style-sheet.d.ts +0 -11
  340. package/dist/style/style-sheet.d.ts.map +0 -1
  341. package/dist/style/style-sheet.js +0 -253
  342. package/dist/style/style-sheet.js.map +0 -1
  343. package/dist/widgets/long-press-button.d.ts +0 -13
  344. package/dist/widgets/long-press-button.d.ts.map +0 -1
  345. package/dist/widgets/long-press-button.js +0 -32
  346. package/dist/widgets/long-press-button.js.map +0 -1
  347. package/dist/widgets/view-control-widget.d.ts +0 -78
  348. package/dist/widgets/view-control-widget.d.ts.map +0 -1
  349. package/dist/widgets/view-control-widget.js +0 -195
  350. package/dist/widgets/view-control-widget.js.map +0 -1
  351. package/src/loaders/json-loader.ts +0 -19
  352. package/src/style/style-sheet.ts +0 -277
  353. package/src/widgets/long-press-button.tsx +0 -50
  354. package/src/widgets/view-control-widget.tsx +0 -337
@@ -2,37 +2,46 @@
2
2
  // SPDX-License-Identifier: MIT
3
3
  // Copyright (c) vis.gl contributors
4
4
  import { COORDINATE_SYSTEM, CompositeLayer } from '@deck.gl/core';
5
- import { NODE_TYPE, EDGE_DECORATOR_TYPE } from "../core/constants.js";
6
- import { GraphEngine } from "../core/graph-engine.js";
7
- import { Stylesheet } from "../style/style-sheet.js";
8
- import { mixedGetPosition } from "../utils/layer-utils.js";
9
- import { InteractionManager } from "../core/interaction-manager.js";
10
- import { log } from "../utils/log.js";
5
+ import { PolygonLayer } from '@deck.gl/layers';
6
+ import { ClassicGraph } from '../graph/classic-graph';
7
+ import { GraphLayout } from '../core/graph-layout';
8
+ import { GraphEngine } from '../core/graph-engine';
9
+ import { GraphStylesheetEngine } from '../style/graph-style-engine';
10
+ import { DEFAULT_GRAPH_LAYER_STYLESHEET, normalizeGraphLayerStylesheet } from '../style/graph-layer-stylesheet';
11
11
  // node layers
12
- import { CircleLayer } from "./node-layers/circle-layer.js";
13
- import { ImageLayer } from "./node-layers/image-layer.js";
14
- import { LabelLayer } from "./node-layers/label-layer.js";
15
- import { RectangleLayer } from "./node-layers/rectangle-layer.js";
16
- import { RoundedRectangleLayer } from "./node-layers/rounded-rectangle-layer.js";
17
- import { PathBasedRoundedRectangleLayer } from "./node-layers/path-rounded-rectangle-layer.js";
18
- import { ZoomableMarkerLayer } from "./node-layers/zoomable-marker-layer.js";
12
+ import { CircleLayer } from './node-layers/circle-layer';
13
+ import { ImageLayer } from './node-layers/image-layer';
14
+ import { LabelLayer } from './node-layers/label-layer';
15
+ import { RectangleLayer } from './node-layers/rectangle-layer';
16
+ import { RoundedRectangleLayer } from './node-layers/rounded-rectangle-layer';
17
+ import { PathBasedRoundedRectangleLayer } from './node-layers/path-rounded-rectangle-layer';
18
+ import { ZoomableMarkerLayer } from './node-layers/zoomable-marker-layer';
19
19
  // edge layers
20
- import { EdgeLayer } from "./edge-layer.js";
21
- import { EdgeLabelLayer } from "./edge-layers/edge-label-layer.js";
22
- import { FlowLayer } from "./edge-layers/flow-layer.js";
23
- import { JSONLoader } from "../loaders/json-loader.js";
20
+ import { EdgeLayer } from './edge-layer';
21
+ import { EdgeLabelLayer } from './edge-layers/edge-label-layer';
22
+ import { FlowLayer } from './edge-layers/flow-layer';
23
+ import { EdgeArrowLayer } from './edge-layers/edge-arrow-layer';
24
+ import { EdgeAttachmentHelper } from './edge-attachment-helper';
25
+ import { GridLayer } from './common-layers/grid-layer/grid-layer';
26
+ import { JSONGraphLoader } from '../loaders/json-graph-loader';
27
+ import { mixedGetPosition } from '../utils/layer-utils';
28
+ import { InteractionManager } from '../core/interaction-manager';
29
+ import { buildCollapsedChainLayers } from '../utils/collapsed-chains';
30
+ import { mapRanksToYPositions, selectRankLines } from '../utils/rank-grid';
31
+ import { warn } from '../utils/log';
24
32
  const NODE_LAYER_MAP = {
25
- [NODE_TYPE.RECTANGLE]: RectangleLayer,
26
- [NODE_TYPE.ROUNDED_RECTANGLE]: RoundedRectangleLayer,
27
- [NODE_TYPE.PATH_ROUNDED_RECTANGLE]: PathBasedRoundedRectangleLayer,
28
- [NODE_TYPE.ICON]: ImageLayer,
29
- [NODE_TYPE.CIRCLE]: CircleLayer,
30
- [NODE_TYPE.LABEL]: LabelLayer,
31
- [NODE_TYPE.MARKER]: ZoomableMarkerLayer
33
+ 'rectangle': RectangleLayer,
34
+ 'rounded-rectangle': RoundedRectangleLayer,
35
+ 'path-rounded-rectangle': PathBasedRoundedRectangleLayer,
36
+ 'icon': ImageLayer,
37
+ 'circle': CircleLayer,
38
+ 'label': LabelLayer,
39
+ 'marker': ZoomableMarkerLayer
32
40
  };
33
41
  const EDGE_DECORATOR_LAYER_MAP = {
34
- [EDGE_DECORATOR_TYPE.LABEL]: EdgeLabelLayer,
35
- [EDGE_DECORATOR_TYPE.FLOW]: FlowLayer
42
+ 'edge-label': EdgeLabelLayer,
43
+ 'flow': FlowLayer,
44
+ 'arrow': EdgeArrowLayer
36
45
  };
37
46
  const SHARED_LAYER_PROPS = {
38
47
  coordinateSystem: COORDINATE_SYSTEM.CARTESIAN,
@@ -40,15 +49,26 @@ const SHARED_LAYER_PROPS = {
40
49
  depthTest: false
41
50
  }
42
51
  };
52
+ const NODE_STYLE_DEPRECATION_MESSAGE = 'GraphLayer: `nodeStyle` has been replaced by `stylesheet.nodes` and will be removed in a future release.';
53
+ const EDGE_STYLE_DEPRECATION_MESSAGE = 'GraphLayer: `edgeStyle` has been replaced by `stylesheet.edges` and will be removed in a future release.';
54
+ const GRAPH_PROP_DEPRECATION_MESSAGE = 'GraphLayer: `graph` prop is deprecated. Pass graphs via the `data` prop instead.';
55
+ const LAYOUT_REQUIRED_MESSAGE = 'GraphLayer: `layout` must be provided when supplying raw graph data.';
56
+ let NODE_STYLE_DEPRECATION_WARNED = false;
57
+ let EDGE_STYLE_DEPRECATION_WARNED = false;
58
+ let GRAPH_PROP_DEPRECATION_WARNED = false;
59
+ let LAYOUT_REQUIRED_WARNED = false;
60
+ /** Composite layer that renders graph nodes, edges, and decorators. */
43
61
  export class GraphLayer extends CompositeLayer {
44
62
  static layerName = 'GraphLayer';
45
63
  static defaultProps = {
46
64
  // Composite layer props
47
65
  // @ts-expect-error composite layer props
48
66
  pickable: true,
67
+ data: { type: 'object', value: null, async: true },
49
68
  // Graph props
50
- graphLoader: JSONLoader,
51
- nodeStyle: [],
69
+ graphLoader: JSONGraphLoader,
70
+ stylesheet: DEFAULT_GRAPH_LAYER_STYLESHEET,
71
+ nodeStyle: undefined,
52
72
  nodeEvents: {
53
73
  onMouseLeave: () => { },
54
74
  onHover: () => { },
@@ -56,96 +76,485 @@ export class GraphLayer extends CompositeLayer {
56
76
  onClick: () => { },
57
77
  onDrag: () => { }
58
78
  },
59
- edgeStyle: {
60
- stroke: 'black',
61
- strokeWidth: 1,
62
- // an array of styles for layers
63
- decorators: []
64
- },
79
+ edgeStyle: undefined,
65
80
  edgeEvents: {
66
81
  onClick: () => { },
67
82
  onHover: () => { }
68
83
  },
69
- enableDragging: false
84
+ enableDragging: false,
85
+ rankGrid: false,
86
+ resumeLayoutAfterDragging: true
70
87
  };
71
88
  // @ts-expect-error Some typescript confusion due to override of base class state
72
89
  state;
90
+ _edgeAttachmentHelper = new EdgeAttachmentHelper();
91
+ _suppressNextDeckDataChange = false;
73
92
  forceUpdate = () => {
74
- if (this.context && this.context.layerManager) {
75
- this.setNeedsUpdate();
76
- this.setChangeFlags({ dataChanged: true }); // TODO
93
+ if (!this.state) {
94
+ return;
77
95
  }
96
+ this.setNeedsRedraw();
97
+ this.setState({ interactionVersion: this.state.interactionVersion + 1 });
78
98
  };
79
99
  constructor(props) {
80
100
  super(props);
81
101
  }
82
102
  initializeState() {
103
+ const interactionManager = new InteractionManager({
104
+ nodeEvents: this.props.nodeEvents,
105
+ edgeEvents: this.props.edgeEvents,
106
+ engine: undefined,
107
+ enableDragging: Boolean(this.props.enableDragging),
108
+ resumeLayoutAfterDragging: Boolean(this.props.resumeLayoutAfterDragging ?? GraphLayer.defaultProps.resumeLayoutAfterDragging)
109
+ }, () => this.forceUpdate());
83
110
  this.state = {
84
- interactionManager: new InteractionManager(this.props, () => this.forceUpdate())
111
+ interactionManager,
112
+ graphEngine: null,
113
+ layoutVersion: 0,
114
+ layoutState: undefined,
115
+ interactionVersion: 0
85
116
  };
86
- const engine = this.props.engine;
87
- this._setGraphEngine(engine);
117
+ this._syncInteractionManager(this.props, null);
118
+ this._refreshEngineFromProps(this.props, { force: true });
88
119
  }
89
120
  shouldUpdateState({ changeFlags }) {
90
- return changeFlags.dataChanged || changeFlags.propsChanged;
121
+ return changeFlags.dataChanged || changeFlags.propsChanged || changeFlags.stateChanged;
91
122
  }
92
123
  updateState({ props, oldProps, changeFlags }) {
93
- if (changeFlags.dataChanged &&
94
- props.data &&
95
- !(Array.isArray(props.data) && props.data.length === 0)) {
96
- // console.log(props.data);
97
- const graph = this.props.graphLoader({ json: props.data });
98
- const layout = this.props.layout;
99
- const graphEngine = new GraphEngine({ graph, layout });
100
- this._setGraphEngine(graphEngine);
101
- this.state.interactionManager.updateProps(props);
102
- this.forceUpdate();
103
- }
104
- else if (changeFlags.propsChanged && props.graph !== oldProps.graph) {
105
- const graphEngine = new GraphEngine({ graph: props.graph, layout: props.layout });
106
- this._setGraphEngine(graphEngine);
107
- this.state.interactionManager.updateProps(props);
108
- this.forceUpdate();
124
+ const propsDataChanged = props.data !== oldProps.data;
125
+ const deckDataChanged = changeFlags.dataChanged && !(this._suppressNextDeckDataChange && !propsDataChanged);
126
+ const dataChanged = deckDataChanged || propsDataChanged;
127
+ const layoutChanged = props.layout !== oldProps.layout;
128
+ const graphChanged = props.graph !== oldProps.graph;
129
+ const engineChanged = props.engine !== oldProps.engine;
130
+ const loaderChanged = props.graphLoader !== oldProps.graphLoader;
131
+ const engineRefreshed = this._refreshEngineFromProps(props, {
132
+ dataChanged,
133
+ layoutChanged,
134
+ graphChanged,
135
+ engineChanged,
136
+ loaderChanged
137
+ });
138
+ if (!engineRefreshed && changeFlags.propsChanged) {
139
+ const engine = this.state.graphEngine;
140
+ if (engine) {
141
+ this._applyGraphEngineCallbacks(engine);
142
+ }
143
+ }
144
+ if (!engineRefreshed && (changeFlags.propsChanged || changeFlags.stateChanged)) {
145
+ this._syncInteractionManager(props, this.state.graphEngine ?? null);
109
146
  }
147
+ this._suppressNextDeckDataChange = false;
110
148
  }
111
149
  finalize() {
112
150
  this._removeGraphEngine();
151
+ this._syncInteractionManager(this.props, null);
152
+ }
153
+ _getResolvedStylesheet() {
154
+ const { stylesheet, nodeStyle, edgeStyle } = this.props;
155
+ const usingNodeStyle = typeof nodeStyle !== 'undefined';
156
+ if (usingNodeStyle && !NODE_STYLE_DEPRECATION_WARNED) {
157
+ warn(NODE_STYLE_DEPRECATION_MESSAGE);
158
+ NODE_STYLE_DEPRECATION_WARNED = true;
159
+ }
160
+ const usingEdgeStyle = typeof edgeStyle !== 'undefined';
161
+ if (usingEdgeStyle && !EDGE_STYLE_DEPRECATION_WARNED) {
162
+ warn(EDGE_STYLE_DEPRECATION_MESSAGE);
163
+ EDGE_STYLE_DEPRECATION_WARNED = true;
164
+ }
165
+ return normalizeGraphLayerStylesheet({
166
+ stylesheet,
167
+ nodeStyle: usingNodeStyle ? nodeStyle : undefined,
168
+ edgeStyle: usingEdgeStyle ? edgeStyle : undefined
169
+ });
170
+ }
171
+ _createStylesheetEngine(style, context) {
172
+ try {
173
+ return new GraphStylesheetEngine(style, {
174
+ stateUpdateTrigger: this.state.interactionManager.getLastInteraction()
175
+ });
176
+ }
177
+ catch (error) {
178
+ const message = error instanceof Error ? error.message : String(error);
179
+ warn(`GraphLayer: Failed to apply ${context}: ${message}`);
180
+ return null;
181
+ }
182
+ }
183
+ _refreshEngineFromProps(props, { force = false, dataChanged = false, layoutChanged = false, graphChanged = false, engineChanged = false, loaderChanged = false }) {
184
+ const { engine: nextEngine, shouldReplace } = this._resolveEngineCandidate(props, {
185
+ force,
186
+ dataChanged,
187
+ layoutChanged,
188
+ graphChanged,
189
+ engineChanged,
190
+ loaderChanged
191
+ });
192
+ if (nextEngine === undefined) {
193
+ return false;
194
+ }
195
+ const currentEngine = this.state.graphEngine ?? null;
196
+ if (!shouldReplace && nextEngine === currentEngine) {
197
+ return false;
198
+ }
199
+ this._setGraphEngine(nextEngine);
200
+ this._syncInteractionManager(props, nextEngine);
201
+ return true;
202
+ }
203
+ _resolveEngineCandidate(props, flags) {
204
+ const dataResult = this._getEngineFromData(props, flags);
205
+ if (dataResult) {
206
+ return dataResult;
207
+ }
208
+ const engineResult = this._getEngineFromEngineProp(props, flags);
209
+ if (engineResult) {
210
+ return engineResult;
211
+ }
212
+ const graphResult = this._getEngineFromGraphProp(props, flags);
213
+ if (graphResult) {
214
+ return graphResult;
215
+ }
216
+ if (props.data === null || props.graph === null || props.engine === null || flags.force) {
217
+ return { engine: null, shouldReplace: true };
218
+ }
219
+ return { engine: undefined, shouldReplace: flags.force };
220
+ }
221
+ _getEngineFromData(props, { force, dataChanged, layoutChanged, loaderChanged }) {
222
+ const dataValue = props.data;
223
+ if (dataValue === null || typeof dataValue === 'undefined') {
224
+ return null;
225
+ }
226
+ const shouldRebuild = force || dataChanged || layoutChanged || loaderChanged;
227
+ if (!shouldRebuild) {
228
+ return { engine: undefined, shouldReplace: false };
229
+ }
230
+ const engine = this._deriveEngineFromData(dataValue, props);
231
+ if (typeof engine === 'undefined') {
232
+ return { engine: undefined, shouldReplace: false };
233
+ }
234
+ return {
235
+ engine,
236
+ shouldReplace: true
237
+ };
113
238
  }
239
+ _getEngineFromEngineProp(props, { force, engineChanged }) {
240
+ if (typeof props.engine === 'undefined') {
241
+ return null;
242
+ }
243
+ if (props.engine === null) {
244
+ return { engine: null, shouldReplace: true };
245
+ }
246
+ return {
247
+ engine: props.engine,
248
+ shouldReplace: force || engineChanged
249
+ };
250
+ }
251
+ _getEngineFromGraphProp(props, { force, graphChanged, layoutChanged }) {
252
+ if (typeof props.graph === 'undefined') {
253
+ return null;
254
+ }
255
+ if (props.graph === null) {
256
+ return { engine: null, shouldReplace: true };
257
+ }
258
+ this._warnGraphProp();
259
+ return {
260
+ engine: this._buildEngineFromGraph(props.graph, props.layout),
261
+ shouldReplace: force || graphChanged || layoutChanged
262
+ };
263
+ }
264
+ _deriveEngineFromData(data, props) {
265
+ if (data === null || typeof data === 'undefined') {
266
+ return null;
267
+ }
268
+ if (typeof data?.then === 'function') {
269
+ return undefined;
270
+ }
271
+ if (data instanceof GraphEngine) {
272
+ return data;
273
+ }
274
+ const graphCandidate = this._coerceGraph(data);
275
+ if (graphCandidate) {
276
+ return this._buildEngineFromGraph(graphCandidate, props.layout);
277
+ }
278
+ if (typeof data === 'string') {
279
+ return undefined;
280
+ }
281
+ if (Array.isArray(data) || isPlainObject(data)) {
282
+ const loader = props.graphLoader ?? JSONGraphLoader;
283
+ const graph = loader({ json: data });
284
+ if (!graph) {
285
+ return null;
286
+ }
287
+ return this._buildEngineFromGraph(graph, props.layout);
288
+ }
289
+ return null;
290
+ }
291
+ _buildEngineFromGraph(graph, layout) {
292
+ if (!graph) {
293
+ return null;
294
+ }
295
+ if (!layout) {
296
+ this._warnLayoutRequired();
297
+ return null;
298
+ }
299
+ if (graph instanceof ClassicGraph && layout instanceof GraphLayout) {
300
+ return new GraphEngine({ graph, layout });
301
+ }
302
+ if (layout instanceof GraphLayout && !(graph instanceof ClassicGraph)) {
303
+ const legacyGraph = this._convertToClassicGraph(graph);
304
+ if (legacyGraph) {
305
+ return new GraphEngine({ graph: legacyGraph, layout });
306
+ }
307
+ this._warnLayoutRequired();
308
+ return null;
309
+ }
310
+ if (layout) {
311
+ return new GraphEngine({ graph, layout });
312
+ }
313
+ this._warnLayoutRequired();
314
+ return null;
315
+ }
316
+ _syncInteractionManager(props, engine) {
317
+ const resumeLayoutAfterDragging = props.resumeLayoutAfterDragging ?? GraphLayer.defaultProps.resumeLayoutAfterDragging;
318
+ this.state.interactionManager.updateProps({
319
+ nodeEvents: props.nodeEvents ?? GraphLayer.defaultProps.nodeEvents,
320
+ edgeEvents: props.edgeEvents ?? GraphLayer.defaultProps.edgeEvents,
321
+ engine: (engine ?? props.engine ?? null),
322
+ enableDragging: Boolean(props.enableDragging),
323
+ resumeLayoutAfterDragging: Boolean(resumeLayoutAfterDragging)
324
+ });
325
+ }
326
+ _warnGraphProp() {
327
+ if (!GRAPH_PROP_DEPRECATION_WARNED) {
328
+ warn(GRAPH_PROP_DEPRECATION_MESSAGE);
329
+ GRAPH_PROP_DEPRECATION_WARNED = true;
330
+ }
331
+ }
332
+ _warnLayoutRequired() {
333
+ if (!LAYOUT_REQUIRED_WARNED) {
334
+ warn(LAYOUT_REQUIRED_MESSAGE);
335
+ LAYOUT_REQUIRED_WARNED = true;
336
+ }
337
+ }
338
+ _isGraph(value) {
339
+ if (!value || typeof value !== 'object') {
340
+ return false;
341
+ }
342
+ const candidate = value;
343
+ return (typeof candidate.getNodes === 'function' && typeof candidate.getEdges === 'function');
344
+ }
345
+ _coerceGraph(value) {
346
+ if (value instanceof ClassicGraph) {
347
+ return value;
348
+ }
349
+ if (this._isGraph(value)) {
350
+ return value;
351
+ }
352
+ return null;
353
+ }
354
+ _convertToClassicGraph(graph) {
355
+ if (graph instanceof ClassicGraph) {
356
+ return graph;
357
+ }
358
+ const candidate = graph;
359
+ if (typeof candidate.toClassicGraph === 'function') {
360
+ try {
361
+ return candidate.toClassicGraph() ?? null;
362
+ }
363
+ catch (error) {
364
+ warn('GraphLayer: failed to convert graph to ClassicGraph for layout compatibility.', error);
365
+ }
366
+ }
367
+ return null;
368
+ }
369
+ _updateLayoutSnapshot(engine) {
370
+ const activeEngine = engine ?? this.state.graphEngine ?? null;
371
+ if (!activeEngine) {
372
+ if (this.state.layoutVersion !== 0 || typeof this.state.layoutState !== 'undefined') {
373
+ this._suppressNextDeckDataChange = true;
374
+ this.setState({ layoutVersion: 0, layoutState: undefined });
375
+ }
376
+ this.setNeedsRedraw();
377
+ return;
378
+ }
379
+ const nextVersion = activeEngine.getLayoutLastUpdate();
380
+ const nextState = activeEngine.getLayoutState();
381
+ if (this.state.layoutVersion !== nextVersion || this.state.layoutState !== nextState) {
382
+ this._suppressNextDeckDataChange = true;
383
+ this.setState({ layoutVersion: nextVersion, layoutState: nextState });
384
+ }
385
+ this.setNeedsRedraw();
386
+ }
387
+ _handleLayoutEvent = () => {
388
+ this._updateLayoutSnapshot();
389
+ };
114
390
  _setGraphEngine(graphEngine) {
115
391
  if (graphEngine === this.state.graphEngine) {
392
+ if (graphEngine) {
393
+ this._applyGraphEngineCallbacks(graphEngine);
394
+ }
395
+ this._updateLayoutSnapshot(graphEngine);
116
396
  return;
117
397
  }
118
398
  this._removeGraphEngine();
119
399
  if (graphEngine) {
120
400
  this.state.graphEngine = graphEngine;
121
- this.state.graphEngine.run();
122
- // added or removed a node, or in general something layout related changed
123
- this.state.graphEngine.addEventListener('onLayoutChange', this.forceUpdate);
401
+ this._applyGraphEngineCallbacks(graphEngine);
402
+ graphEngine.run();
403
+ this._updateLayoutSnapshot(graphEngine);
404
+ }
405
+ else {
406
+ this.state.graphEngine = null;
407
+ this._updateLayoutSnapshot(null);
124
408
  }
125
409
  }
126
410
  _removeGraphEngine() {
127
- if (this.state.graphEngine) {
128
- this.state.graphEngine.removeEventListener('onLayoutChange', this.forceUpdate);
129
- this.state.graphEngine.clear();
411
+ const engine = this.state.graphEngine;
412
+ if (engine) {
413
+ engine.setProps({
414
+ onLayoutStart: undefined,
415
+ onLayoutChange: undefined,
416
+ onLayoutDone: undefined,
417
+ onLayoutError: undefined
418
+ });
419
+ engine.clear();
130
420
  this.state.graphEngine = null;
421
+ this._updateLayoutSnapshot(null);
422
+ }
423
+ }
424
+ _applyGraphEngineCallbacks(engine) {
425
+ engine.setProps({
426
+ onLayoutStart: (detail) => {
427
+ this._handleLayoutEvent();
428
+ this.props.onLayoutStart?.(detail);
429
+ },
430
+ onLayoutChange: (detail) => {
431
+ this._handleLayoutEvent();
432
+ this.props.onLayoutChange?.(detail);
433
+ },
434
+ onLayoutDone: (detail) => {
435
+ this._handleLayoutEvent();
436
+ this.props.onLayoutDone?.(detail);
437
+ },
438
+ onLayoutError: (error) => {
439
+ this._handleLayoutEvent();
440
+ this.props.onLayoutError?.(error);
441
+ }
442
+ });
443
+ }
444
+ _createRankGridLayer() {
445
+ const engine = this.state.graphEngine;
446
+ if (!engine) {
447
+ return null;
448
+ }
449
+ const { enabled, config } = this._normalizeRankGridConfig(this.props.rankGrid);
450
+ if (!enabled) {
451
+ return null;
452
+ }
453
+ const bounds = this._resolveRankGridBounds(engine);
454
+ if (!bounds) {
455
+ return null;
456
+ }
457
+ const data = this._buildRankGridData(engine, config, bounds);
458
+ if (!data) {
459
+ return null;
460
+ }
461
+ const direction = config?.direction ?? 'horizontal';
462
+ const gridProps = config?.gridProps ?? {};
463
+ return new GridLayer({
464
+ id: `${this.props.id}-rank-grid`,
465
+ data,
466
+ direction,
467
+ xMin: bounds.xMin,
468
+ xMax: bounds.xMax,
469
+ yMin: bounds.yMin,
470
+ yMax: bounds.yMax,
471
+ pickable: false,
472
+ ...gridProps
473
+ });
474
+ }
475
+ _normalizeRankGridConfig(value) {
476
+ if (typeof value === 'boolean') {
477
+ return { enabled: value };
478
+ }
479
+ if (value && typeof value === 'object') {
480
+ return { enabled: value.enabled ?? true, config: value };
481
+ }
482
+ return { enabled: false };
483
+ }
484
+ _resolveRankGridBounds(engine) {
485
+ const bounds = engine.getLayoutBounds();
486
+ if (!bounds) {
487
+ return null;
488
+ }
489
+ const [[minXRaw, minYRaw], [maxXRaw, maxYRaw]] = bounds;
490
+ const values = [minXRaw, minYRaw, maxXRaw, maxYRaw];
491
+ if (!values.every((value) => typeof value === 'number' && Number.isFinite(value))) {
492
+ return null;
131
493
  }
494
+ return {
495
+ xMin: Math.min(minXRaw, maxXRaw),
496
+ xMax: Math.max(minXRaw, maxXRaw),
497
+ yMin: Math.min(minYRaw, maxYRaw),
498
+ yMax: Math.max(minYRaw, maxYRaw)
499
+ };
500
+ }
501
+ _buildRankGridData(engine, config, bounds) {
502
+ const rankLabelPrefix = this._resolveRankFieldLabel(config?.rankAccessor);
503
+ // @ts-ignore iterator type
504
+ const rankPositions = mapRanksToYPositions(engine.getNodes(), engine.getNodePosition, {
505
+ rankAccessor: config?.rankAccessor,
506
+ labelAccessor: config?.labelAccessor,
507
+ yRange: { min: bounds.yMin, max: bounds.yMax }
508
+ });
509
+ if (rankPositions.length === 0) {
510
+ return null;
511
+ }
512
+ const selectedRanks = selectRankLines(rankPositions, {
513
+ yMin: bounds.yMin,
514
+ yMax: bounds.yMax,
515
+ maxCount: config?.maxLines ?? 8
516
+ });
517
+ if (selectedRanks.length === 0) {
518
+ return null;
519
+ }
520
+ return selectedRanks.map(({ rank, label, yPosition }) => ({
521
+ label: `${rankLabelPrefix} ${rank}`,
522
+ rank,
523
+ originalLabel: label === undefined ? undefined : label,
524
+ yPosition
525
+ }));
526
+ }
527
+ _resolveRankFieldLabel(rankAccessor) {
528
+ if (!rankAccessor) {
529
+ return 'srank';
530
+ }
531
+ if (typeof rankAccessor === 'string' && rankAccessor.length > 0) {
532
+ return rankAccessor;
533
+ }
534
+ if (typeof rankAccessor === 'function' && rankAccessor.name) {
535
+ return rankAccessor.name;
536
+ }
537
+ return 'rank';
132
538
  }
133
539
  createNodeLayers() {
134
540
  const engine = this.state.graphEngine;
135
- const { nodeStyle } = this.props;
136
- if (!engine || !nodeStyle || !Array.isArray(nodeStyle) || nodeStyle.length === 0) {
541
+ const { nodes: nodeStyles } = this._getResolvedStylesheet();
542
+ if (!engine || !Array.isArray(nodeStyles) || nodeStyles.length === 0) {
137
543
  return [];
138
544
  }
139
- return nodeStyle.filter(Boolean).map((style, idx) => {
545
+ const baseLayers = nodeStyles
546
+ .filter(Boolean)
547
+ .map((style, idx) => {
140
548
  const { pickable = true, visible = true, data = (nodes) => nodes, ...restStyle } = style;
141
549
  const LayerType = NODE_LAYER_MAP[style.type];
142
550
  if (!LayerType) {
143
- log.error(`Invalid node type: ${style.type}`)();
144
- throw new Error(`Invalid node type: ${style.type}`);
551
+ warn(`GraphLayer: Invalid node type "${style.type}".`);
552
+ return null;
553
+ }
554
+ const stylesheet = this._createStylesheetEngine(restStyle, `node stylesheet "${style.type}"`);
555
+ if (!stylesheet) {
556
+ return null;
145
557
  }
146
- const stylesheet = new Stylesheet(restStyle, {
147
- stateUpdateTrigger: this.state.interactionManager.getLastInteraction()
148
- });
149
558
  const getOffset = stylesheet.getDeckGLAccessor('getOffset');
150
559
  return new LayerType({
151
560
  ...SHARED_LAYER_PROPS,
@@ -161,57 +570,75 @@ export class GraphLayer extends CompositeLayer {
161
570
  stylesheet,
162
571
  visible
163
572
  });
164
- });
573
+ })
574
+ .filter(Boolean);
575
+ const chainLayers = this._createChainOverlayLayers(engine);
576
+ return [...baseLayers, ...chainLayers];
165
577
  }
166
578
  createEdgeLayers() {
167
579
  const engine = this.state.graphEngine;
168
- const { edgeStyle } = this.props;
169
- if (!engine || !edgeStyle) {
580
+ const { edges: edgeStyles, nodes: nodeStyles } = this._getResolvedStylesheet();
581
+ if (!engine || !edgeStyles) {
170
582
  return [];
171
583
  }
172
- return (Array.isArray(edgeStyle) ? edgeStyle : [edgeStyle])
584
+ const edgeStyleArray = Array.isArray(edgeStyles) ? edgeStyles : [edgeStyles];
585
+ if (edgeStyleArray.length === 0) {
586
+ return [];
587
+ }
588
+ const getLayoutInfo = this._edgeAttachmentHelper.getLayoutAccessor({
589
+ engine,
590
+ interactionManager: this.state.interactionManager,
591
+ nodeStyle: nodeStyles
592
+ });
593
+ return edgeStyleArray
173
594
  .filter(Boolean)
174
595
  .flatMap((style, idx) => {
175
596
  const { decorators, data = (edges) => edges, visible = true, ...restEdgeStyle } = style;
176
- const stylesheet = new Stylesheet({
177
- type: 'Edge',
597
+ const stylesheet = this._createStylesheetEngine({
598
+ type: 'edge',
178
599
  ...restEdgeStyle
179
- }, {
180
- stateUpdateTrigger: this.state.interactionManager.getLastInteraction()
181
- });
600
+ }, 'edge stylesheet');
601
+ if (!stylesheet) {
602
+ return [];
603
+ }
182
604
  const edgeLayer = new EdgeLayer({
183
605
  ...SHARED_LAYER_PROPS,
184
606
  id: `edge-layer-${idx}`,
185
607
  data: data(engine.getEdges()),
186
- getLayoutInfo: engine.getEdgePosition,
608
+ getLayoutInfo,
187
609
  pickable: true,
188
610
  positionUpdateTrigger: [engine.getLayoutLastUpdate(), engine.getLayoutState()].join(),
189
611
  stylesheet,
190
612
  visible
191
613
  });
192
614
  if (!decorators || !Array.isArray(decorators) || decorators.length === 0) {
193
- return edgeLayer;
615
+ return [edgeLayer];
194
616
  }
195
- const decoratorLayers = decorators.filter(Boolean).flatMap((decoratorStyle, idx2) => {
617
+ const decoratorLayers = decorators
618
+ .filter(Boolean)
619
+ // @ts-ignore eslint-disable-next-line @typescript-eslint/no-unused-vars
620
+ .map((decoratorStyle, idx2) => {
196
621
  const DecoratorLayer = EDGE_DECORATOR_LAYER_MAP[decoratorStyle.type];
197
622
  if (!DecoratorLayer) {
198
- log.error(`Invalid edge decorator type: ${decoratorStyle.type}`)();
199
- throw new Error(`Invalid edge decorator type: ${decoratorStyle.type}`);
623
+ warn(`GraphLayer: Invalid edge decorator type "${decoratorStyle.type}".`);
624
+ return null;
625
+ }
626
+ const decoratorStylesheet = this._createStylesheetEngine(decoratorStyle, `edge decorator stylesheet "${decoratorStyle.type}"`);
627
+ if (!decoratorStylesheet) {
628
+ return null;
200
629
  }
201
- const decoratorStylesheet = new Stylesheet(decoratorStyle, {
202
- stateUpdateTrigger: this.state.interactionManager.getLastInteraction()
203
- });
204
630
  return new DecoratorLayer({
205
631
  ...SHARED_LAYER_PROPS,
206
632
  id: `edge-decorator-${idx2}`,
207
633
  data: data(engine.getEdges()),
208
- getLayoutInfo: engine.getEdgePosition,
634
+ getLayoutInfo,
209
635
  pickable: true,
210
636
  positionUpdateTrigger: [engine.getLayoutLastUpdate(), engine.getLayoutState()].join(),
211
637
  stylesheet: decoratorStylesheet
212
638
  });
213
- });
214
- return [edgeLayer, decoratorLayers];
639
+ })
640
+ .filter(Boolean);
641
+ return [edgeLayer, ...decoratorLayers];
215
642
  });
216
643
  }
217
644
  onClick(info, event) {
@@ -230,7 +657,121 @@ export class GraphLayer extends CompositeLayer {
230
657
  this.state.interactionManager.onDragEnd(info, event);
231
658
  }
232
659
  renderLayers() {
233
- return [this.createEdgeLayers(), this.createNodeLayers()];
660
+ const layers = [];
661
+ const gridLayer = this._createRankGridLayer();
662
+ if (gridLayer) {
663
+ layers.push(gridLayer);
664
+ }
665
+ const edgeLayers = this.createEdgeLayers();
666
+ if (Array.isArray(edgeLayers) && edgeLayers.length > 0) {
667
+ layers.push(...edgeLayers);
668
+ }
669
+ const nodeLayers = this.createNodeLayers();
670
+ if (Array.isArray(nodeLayers) && nodeLayers.length > 0) {
671
+ layers.push(...nodeLayers);
672
+ }
673
+ return layers;
674
+ }
675
+ _createChainOverlayLayers(engine) {
676
+ const chainData = buildCollapsedChainLayers(engine);
677
+ if (!chainData) {
678
+ return [];
679
+ }
680
+ const { collapsedNodes, collapsedOutlineNodes, expandedNodes, expandedOutlineNodes, getChainOutlinePolygon, outlineUpdateTrigger } = chainData;
681
+ const layers = [];
682
+ if (collapsedOutlineNodes.length > 0) {
683
+ layers.push(new PolygonLayer({
684
+ ...SHARED_LAYER_PROPS,
685
+ id: 'collapsed-chain-outlines',
686
+ data: collapsedOutlineNodes,
687
+ getPolygon: (node) => getChainOutlinePolygon(node),
688
+ stroked: true,
689
+ filled: false,
690
+ getLineColor: [220, 64, 64, 220],
691
+ getLineWidth: 2,
692
+ lineWidthUnits: 'pixels',
693
+ lineWidthMinPixels: 2,
694
+ pickable: true,
695
+ updateTriggers: {
696
+ getPolygon: [outlineUpdateTrigger]
697
+ }
698
+ }));
699
+ }
700
+ const collapsedMarkerStylesheet = this._createStylesheetEngine({
701
+ type: 'marker',
702
+ fill: [64, 96, 192, 255],
703
+ size: 32,
704
+ marker: 'circle-plus-filled',
705
+ offset: [24, -24],
706
+ scaleWithZoom: false
707
+ }, 'collapsed chain marker stylesheet');
708
+ if (collapsedMarkerStylesheet && collapsedNodes.length > 0) {
709
+ const getOffset = collapsedMarkerStylesheet.getDeckGLAccessor('getOffset');
710
+ layers.push(new ZoomableMarkerLayer({
711
+ ...SHARED_LAYER_PROPS,
712
+ id: 'collapsed-chain-markers',
713
+ data: collapsedNodes,
714
+ getPosition: mixedGetPosition(engine.getNodePosition, getOffset),
715
+ pickable: true,
716
+ positionUpdateTrigger: [
717
+ engine.getLayoutLastUpdate(),
718
+ engine.getLayoutState(),
719
+ collapsedMarkerStylesheet.getDeckGLAccessorUpdateTrigger('getOffset')
720
+ ].join(),
721
+ stylesheet: collapsedMarkerStylesheet,
722
+ visible: true
723
+ }));
724
+ }
725
+ if (expandedOutlineNodes.length > 0) {
726
+ layers.push(new PolygonLayer({
727
+ ...SHARED_LAYER_PROPS,
728
+ id: 'expanded-chain-outlines',
729
+ data: expandedOutlineNodes,
730
+ getPolygon: (node) => getChainOutlinePolygon(node),
731
+ stroked: true,
732
+ filled: false,
733
+ getLineColor: [64, 96, 192, 200],
734
+ getLineWidth: 2,
735
+ lineWidthUnits: 'pixels',
736
+ lineWidthMinPixels: 2,
737
+ pickable: true,
738
+ updateTriggers: {
739
+ getPolygon: [outlineUpdateTrigger]
740
+ }
741
+ }));
742
+ }
743
+ const expandedMarkerStylesheet = this._createStylesheetEngine({
744
+ type: 'marker',
745
+ fill: [64, 96, 192, 255],
746
+ size: 32,
747
+ marker: 'circle-minus-filled',
748
+ offset: [24, -24],
749
+ scaleWithZoom: false
750
+ }, 'expanded chain marker stylesheet');
751
+ if (expandedMarkerStylesheet && expandedNodes.length > 0) {
752
+ const getOffset = expandedMarkerStylesheet.getDeckGLAccessor('getOffset');
753
+ layers.push(new ZoomableMarkerLayer({
754
+ ...SHARED_LAYER_PROPS,
755
+ id: 'expanded-chain-markers',
756
+ data: expandedNodes,
757
+ getPosition: mixedGetPosition(engine.getNodePosition, getOffset),
758
+ pickable: true,
759
+ positionUpdateTrigger: [
760
+ engine.getLayoutLastUpdate(),
761
+ engine.getLayoutState(),
762
+ expandedMarkerStylesheet.getDeckGLAccessorUpdateTrigger('getOffset')
763
+ ].join(),
764
+ stylesheet: expandedMarkerStylesheet,
765
+ visible: true
766
+ }));
767
+ }
768
+ return layers;
769
+ }
770
+ }
771
+ function isPlainObject(value) {
772
+ if (!value || typeof value !== 'object') {
773
+ return false;
234
774
  }
775
+ const prototype = Object.getPrototypeOf(value);
776
+ return prototype === Object.prototype || prototype === null;
235
777
  }
236
- //# sourceMappingURL=graph-layer.js.map