@deck.gl-community/graph-layers 9.1.0-beta.8 → 9.2.0-beta.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (252) hide show
  1. package/LICENSE +1 -1
  2. package/dist/_deprecated/old-constants.d.ts +107 -0
  3. package/dist/_deprecated/old-constants.d.ts.map +1 -0
  4. package/dist/_deprecated/old-constants.js +111 -0
  5. package/dist/_deprecated/old-constants.js.map +1 -0
  6. package/dist/core/cache.d.ts +0 -1
  7. package/dist/core/cache.js +0 -1
  8. package/dist/core/constants.d.ts +12 -100
  9. package/dist/core/constants.d.ts.map +1 -1
  10. package/dist/core/constants.js +3 -44
  11. package/dist/core/constants.js.map +1 -1
  12. package/dist/core/graph-engine.d.ts +12 -11
  13. package/dist/core/graph-engine.d.ts.map +1 -1
  14. package/dist/core/graph-engine.js +22 -11
  15. package/dist/core/graph-engine.js.map +1 -1
  16. package/dist/core/graph-layout.d.ts +48 -21
  17. package/dist/core/graph-layout.d.ts.map +1 -1
  18. package/dist/core/graph-layout.js +91 -24
  19. package/dist/core/graph-layout.js.map +1 -1
  20. package/dist/core/interaction-manager.d.ts +6 -4
  21. package/dist/core/interaction-manager.d.ts.map +1 -1
  22. package/dist/core/interaction-manager.js +59 -17
  23. package/dist/core/interaction-manager.js.map +1 -1
  24. package/dist/graph/edge.d.ts +7 -7
  25. package/dist/graph/edge.d.ts.map +1 -1
  26. package/dist/graph/edge.js +3 -6
  27. package/dist/graph/edge.js.map +1 -1
  28. package/dist/graph/graph.d.ts +2 -3
  29. package/dist/graph/graph.js +8 -9
  30. package/dist/graph/graph.js.map +1 -1
  31. package/dist/graph/node.d.ts +7 -8
  32. package/dist/graph/node.d.ts.map +1 -1
  33. package/dist/graph/node.js +3 -5
  34. package/dist/graph/node.js.map +1 -1
  35. package/dist/graph-style-schema.cdn.d.ts +2 -0
  36. package/dist/graph-style-schema.cdn.js +2 -0
  37. package/dist/graph-style-schema.json +12 -0
  38. package/dist/index.cjs +2821 -549
  39. package/dist/index.cjs.map +4 -4
  40. package/dist/index.d.ts +28 -22
  41. package/dist/index.d.ts.map +1 -1
  42. package/dist/index.js +25 -21
  43. package/dist/index.js.map +1 -1
  44. package/dist/layers/common-layers/flow-path-layer/flow-path-layer-fragment.glsl.d.ts +0 -1
  45. package/dist/layers/common-layers/flow-path-layer/flow-path-layer-fragment.glsl.js +0 -1
  46. package/dist/layers/common-layers/flow-path-layer/flow-path-layer-vertex-tf.glsl.d.ts +0 -1
  47. package/dist/layers/common-layers/flow-path-layer/flow-path-layer-vertex-tf.glsl.js +0 -1
  48. package/dist/layers/common-layers/flow-path-layer/flow-path-layer-vertex.glsl.d.ts +0 -1
  49. package/dist/layers/common-layers/flow-path-layer/flow-path-layer-vertex.glsl.js +0 -1
  50. package/dist/layers/common-layers/flow-path-layer/flow-path-layer.d.ts +0 -1
  51. package/dist/layers/common-layers/flow-path-layer/flow-path-layer.js +0 -1
  52. package/dist/layers/common-layers/marker-layer/atlas-data-url.d.ts +0 -1
  53. package/dist/layers/common-layers/marker-layer/atlas-data-url.js +0 -1
  54. package/dist/layers/common-layers/marker-layer/marker-layer.d.ts +0 -1
  55. package/dist/layers/common-layers/marker-layer/marker-layer.js +2 -3
  56. package/dist/layers/common-layers/marker-layer/marker-list.d.ts +2 -63
  57. package/dist/layers/common-layers/marker-layer/marker-list.d.ts.map +1 -1
  58. package/dist/layers/common-layers/marker-layer/marker-list.js +1 -65
  59. package/dist/layers/common-layers/marker-layer/marker-list.js.map +1 -1
  60. package/dist/layers/common-layers/marker-layer/marker-mapping.d.ts +0 -1
  61. package/dist/layers/common-layers/marker-layer/marker-mapping.js +0 -1
  62. package/dist/layers/common-layers/spline-layer/spline-layer.d.ts +0 -1
  63. package/dist/layers/common-layers/spline-layer/spline-layer.js +0 -1
  64. package/dist/layers/common-layers/zoomable-text-layer/zoomable-text-layer.d.ts +0 -1
  65. package/dist/layers/common-layers/zoomable-text-layer/zoomable-text-layer.js +0 -1
  66. package/dist/layers/edge-attachment-helper.d.ts +15 -0
  67. package/dist/layers/edge-attachment-helper.d.ts.map +1 -0
  68. package/dist/layers/edge-attachment-helper.js +230 -0
  69. package/dist/layers/edge-attachment-helper.js.map +1 -0
  70. package/dist/layers/edge-layer.d.ts +1 -5
  71. package/dist/layers/edge-layer.d.ts.map +1 -1
  72. package/dist/layers/edge-layer.js +9 -11
  73. package/dist/layers/edge-layer.js.map +1 -1
  74. package/dist/layers/edge-layers/arrow-2d-geometry.d.ts +4 -0
  75. package/dist/layers/edge-layers/arrow-2d-geometry.d.ts.map +1 -0
  76. package/dist/layers/edge-layers/arrow-2d-geometry.js +42 -0
  77. package/dist/layers/edge-layers/arrow-2d-geometry.js.map +1 -0
  78. package/dist/layers/edge-layers/curved-edge-layer.d.ts +1 -2
  79. package/dist/layers/edge-layers/curved-edge-layer.js +1 -2
  80. package/dist/layers/edge-layers/edge-arrow-layer.d.ts +21 -0
  81. package/dist/layers/edge-layers/edge-arrow-layer.d.ts.map +1 -0
  82. package/dist/layers/edge-layers/edge-arrow-layer.js +131 -0
  83. package/dist/layers/edge-layers/edge-arrow-layer.js.map +1 -0
  84. package/dist/layers/edge-layers/edge-label-layer.d.ts +1 -2
  85. package/dist/layers/edge-layers/edge-label-layer.js +1 -2
  86. package/dist/layers/edge-layers/flow-layer.d.ts +1 -2
  87. package/dist/layers/edge-layers/flow-layer.js +1 -2
  88. package/dist/layers/edge-layers/path-edge-layer.d.ts +0 -1
  89. package/dist/layers/edge-layers/path-edge-layer.js +0 -1
  90. package/dist/layers/edge-layers/straight-line-edge-layer.d.ts +0 -1
  91. package/dist/layers/edge-layers/straight-line-edge-layer.js +0 -1
  92. package/dist/layers/graph-layer.d.ts +22 -23
  93. package/dist/layers/graph-layer.d.ts.map +1 -1
  94. package/dist/layers/graph-layer.js +218 -62
  95. package/dist/layers/graph-layer.js.map +1 -1
  96. package/dist/layers/node-layers/circle-layer.d.ts +0 -1
  97. package/dist/layers/node-layers/circle-layer.js +0 -1
  98. package/dist/layers/node-layers/image-layer.d.ts +0 -1
  99. package/dist/layers/node-layers/image-layer.js +0 -1
  100. package/dist/layers/node-layers/label-layer.d.ts +1 -2
  101. package/dist/layers/node-layers/label-layer.js +1 -2
  102. package/dist/layers/node-layers/path-rounded-rectangle-layer.d.ts +0 -1
  103. package/dist/layers/node-layers/path-rounded-rectangle-layer.js +1 -2
  104. package/dist/layers/node-layers/rectangle-layer.d.ts +0 -1
  105. package/dist/layers/node-layers/rectangle-layer.js +0 -1
  106. package/dist/layers/node-layers/rounded-rectangle-layer-fragment.d.ts +0 -1
  107. package/dist/layers/node-layers/rounded-rectangle-layer-fragment.js +0 -1
  108. package/dist/layers/node-layers/rounded-rectangle-layer.d.ts +1 -2
  109. package/dist/layers/node-layers/rounded-rectangle-layer.js +2 -3
  110. package/dist/layers/node-layers/zoomable-marker-layer.d.ts +1 -2
  111. package/dist/layers/node-layers/zoomable-marker-layer.js +1 -2
  112. package/dist/layouts/d3-dag/d3-dag-layout.d.ts +117 -0
  113. package/dist/layouts/d3-dag/d3-dag-layout.d.ts.map +1 -0
  114. package/dist/layouts/d3-dag/d3-dag-layout.js +716 -0
  115. package/dist/layouts/d3-dag/d3-dag-layout.js.map +1 -0
  116. package/dist/layouts/d3-force/d3-force-layout.d.ts +4 -4
  117. package/dist/layouts/d3-force/d3-force-layout.d.ts.map +1 -1
  118. package/dist/layouts/d3-force/d3-force-layout.js +25 -10
  119. package/dist/layouts/d3-force/d3-force-layout.js.map +1 -1
  120. package/dist/layouts/d3-force/worker.d.ts +0 -1
  121. package/dist/layouts/d3-force/worker.js +0 -1
  122. package/dist/layouts/experimental/force-multi-graph-layout.d.ts +9 -8
  123. package/dist/layouts/experimental/force-multi-graph-layout.d.ts.map +1 -1
  124. package/dist/layouts/experimental/force-multi-graph-layout.js +15 -11
  125. package/dist/layouts/experimental/force-multi-graph-layout.js.map +1 -1
  126. package/dist/layouts/experimental/hive-plot-layout.d.ts +11 -8
  127. package/dist/layouts/experimental/hive-plot-layout.d.ts.map +1 -1
  128. package/dist/layouts/experimental/hive-plot-layout.js +12 -7
  129. package/dist/layouts/experimental/hive-plot-layout.js.map +1 -1
  130. package/dist/layouts/experimental/radial-layout.d.ts +10 -7
  131. package/dist/layouts/experimental/radial-layout.d.ts.map +1 -1
  132. package/dist/layouts/experimental/radial-layout.js +11 -6
  133. package/dist/layouts/experimental/radial-layout.js.map +1 -1
  134. package/dist/layouts/gpu-force/gpu-force-layout.d.ts +4 -4
  135. package/dist/layouts/gpu-force/gpu-force-layout.d.ts.map +1 -1
  136. package/dist/layouts/gpu-force/gpu-force-layout.js +18 -9
  137. package/dist/layouts/gpu-force/gpu-force-layout.js.map +1 -1
  138. package/dist/layouts/gpu-force/worker.d.ts +0 -1
  139. package/dist/layouts/gpu-force/worker.js +0 -1
  140. package/dist/layouts/simple-layout.d.ts +19 -12
  141. package/dist/layouts/simple-layout.d.ts.map +1 -1
  142. package/dist/layouts/simple-layout.js +26 -15
  143. package/dist/layouts/simple-layout.js.map +1 -1
  144. package/dist/loaders/create-graph.d.ts +1 -2
  145. package/dist/loaders/create-graph.js +3 -4
  146. package/dist/loaders/edge-parsers.d.ts +1 -2
  147. package/dist/loaders/edge-parsers.js +2 -3
  148. package/dist/loaders/edge-parsers.js.map +1 -1
  149. package/dist/loaders/json-loader.d.ts +2 -3
  150. package/dist/loaders/json-loader.d.ts.map +1 -1
  151. package/dist/loaders/json-loader.js +5 -6
  152. package/dist/loaders/json-loader.js.map +1 -1
  153. package/dist/loaders/node-parsers.d.ts +1 -2
  154. package/dist/loaders/node-parsers.js +2 -3
  155. package/dist/loaders/node-parsers.js.map +1 -1
  156. package/dist/loaders/simple-json-graph-loader.d.ts +0 -1
  157. package/dist/loaders/simple-json-graph-loader.d.ts.map +1 -1
  158. package/dist/loaders/simple-json-graph-loader.js +5 -6
  159. package/dist/loaders/simple-json-graph-loader.js.map +1 -1
  160. package/dist/loaders/table-graph-loader.d.ts +3 -4
  161. package/dist/loaders/table-graph-loader.js +5 -6
  162. package/dist/loaders/table-graph-loader.js.map +1 -1
  163. package/dist/style/graph-layer-stylesheet.d.ts +34 -0
  164. package/dist/style/graph-layer-stylesheet.d.ts.map +1 -0
  165. package/dist/style/graph-layer-stylesheet.js +39 -0
  166. package/dist/style/graph-layer-stylesheet.js.map +1 -0
  167. package/dist/style/graph-style-accessor-map.d.ts +93 -0
  168. package/dist/style/graph-style-accessor-map.d.ts.map +1 -0
  169. package/dist/style/graph-style-accessor-map.js +93 -0
  170. package/dist/style/graph-style-accessor-map.js.map +1 -0
  171. package/dist/style/graph-style-engine.d.ts +10 -0
  172. package/dist/style/graph-style-engine.d.ts.map +1 -0
  173. package/dist/style/graph-style-engine.js +163 -0
  174. package/dist/style/graph-style-engine.js.map +1 -0
  175. package/dist/style/graph-stylesheet.schema.d.ts +310 -0
  176. package/dist/style/graph-stylesheet.schema.d.ts.map +1 -0
  177. package/dist/style/graph-stylesheet.schema.js +237 -0
  178. package/dist/style/graph-stylesheet.schema.js.map +1 -0
  179. package/dist/style/style-engine.d.ts +33 -0
  180. package/dist/style/style-engine.d.ts.map +1 -0
  181. package/dist/style/style-engine.js +121 -0
  182. package/dist/style/style-engine.js.map +1 -0
  183. package/dist/style/style-property.d.ts +2 -3
  184. package/dist/style/style-property.d.ts.map +1 -1
  185. package/dist/style/style-property.js +224 -48
  186. package/dist/style/style-property.js.map +1 -1
  187. package/dist/utils/collapsed-chains.d.ts +17 -0
  188. package/dist/utils/collapsed-chains.d.ts.map +1 -0
  189. package/dist/utils/collapsed-chains.js +197 -0
  190. package/dist/utils/collapsed-chains.js.map +1 -0
  191. package/dist/utils/layer-utils.d.ts +0 -1
  192. package/dist/utils/layer-utils.d.ts.map +1 -1
  193. package/dist/utils/layer-utils.js +0 -1
  194. package/dist/utils/log.d.ts +2 -1
  195. package/dist/utils/log.d.ts.map +1 -1
  196. package/dist/utils/log.js +12 -2
  197. package/dist/utils/log.js.map +1 -1
  198. package/dist/utils/node-boundary.d.ts +10 -0
  199. package/dist/utils/node-boundary.d.ts.map +1 -0
  200. package/dist/utils/node-boundary.js +130 -0
  201. package/dist/utils/node-boundary.js.map +1 -0
  202. package/dist/utils/polygon-calculations.d.ts +0 -1
  203. package/dist/utils/polygon-calculations.js +0 -1
  204. package/dist/widgets/long-press-button.d.ts +0 -1
  205. package/dist/widgets/long-press-button.js +0 -1
  206. package/dist/widgets/view-control-widget.d.ts +4 -5
  207. package/dist/widgets/view-control-widget.d.ts.map +1 -1
  208. package/dist/widgets/view-control-widget.js +10 -8
  209. package/dist/widgets/view-control-widget.js.map +1 -1
  210. package/package.json +23 -7
  211. package/src/_deprecated/old-constants.ts +122 -0
  212. package/src/core/constants.ts +21 -43
  213. package/src/core/graph-engine.ts +24 -9
  214. package/src/core/graph-layout.ts +133 -28
  215. package/src/core/interaction-manager.ts +80 -20
  216. package/src/graph/edge.ts +6 -6
  217. package/src/graph/graph.ts +7 -7
  218. package/src/graph/node.ts +6 -6
  219. package/src/index.ts +31 -6
  220. package/src/layers/common-layers/marker-layer/marker-list.ts +62 -64
  221. package/src/layers/edge-attachment-helper.ts +355 -0
  222. package/src/layers/edge-layer.ts +6 -7
  223. package/src/layers/edge-layers/arrow-2d-geometry.ts +51 -0
  224. package/src/layers/edge-layers/edge-arrow-layer.ts +171 -0
  225. package/src/layers/graph-layer.ts +304 -86
  226. package/src/layouts/d3-dag/d3-dag-layout.ts +969 -0
  227. package/src/layouts/d3-force/d3-force-layout.ts +33 -11
  228. package/src/layouts/experimental/force-multi-graph-layout.ts +22 -13
  229. package/src/layouts/experimental/hive-plot-layout.ts +22 -10
  230. package/src/layouts/experimental/radial-layout.ts +20 -8
  231. package/src/layouts/gpu-force/gpu-force-layout.ts +22 -10
  232. package/src/layouts/simple-layout.ts +48 -25
  233. package/src/loaders/edge-parsers.ts +2 -2
  234. package/src/loaders/json-loader.ts +2 -2
  235. package/src/loaders/node-parsers.ts +2 -2
  236. package/src/loaders/simple-json-graph-loader.ts +2 -2
  237. package/src/loaders/table-graph-loader.ts +2 -2
  238. package/src/style/graph-layer-stylesheet.ts +99 -0
  239. package/src/style/graph-style-accessor-map.ts +103 -0
  240. package/src/style/graph-style-engine.ts +229 -0
  241. package/src/style/graph-stylesheet.schema.ts +344 -0
  242. package/src/style/style-engine.ts +168 -0
  243. package/src/style/style-property.ts +314 -51
  244. package/src/utils/collapsed-chains.ts +261 -0
  245. package/src/utils/log.ts +15 -1
  246. package/src/utils/node-boundary.ts +238 -0
  247. package/src/widgets/view-control-widget.tsx +15 -13
  248. package/dist/style/style-sheet.d.ts +0 -11
  249. package/dist/style/style-sheet.d.ts.map +0 -1
  250. package/dist/style/style-sheet.js +0 -253
  251. package/dist/style/style-sheet.js.map +0 -1
  252. package/src/style/style-sheet.ts +0 -277
@@ -2,19 +2,32 @@
2
2
  // SPDX-License-Identifier: MIT
3
3
  // Copyright (c) vis.gl contributors
4
4
 
5
+ /* eslint-disable no-continue */
6
+
5
7
  import type {CompositeLayerProps} from '@deck.gl/core';
6
8
  import {COORDINATE_SYSTEM, CompositeLayer} from '@deck.gl/core';
9
+ import {PolygonLayer} from '@deck.gl/layers';
7
10
 
8
- import {NODE_TYPE, EDGE_DECORATOR_TYPE} from '../core/constants';
9
11
  import {Graph} from '../graph/graph';
12
+ import type {Node} from '../graph/node';
10
13
  import {GraphLayout} from '../core/graph-layout';
11
14
  import {GraphEngine} from '../core/graph-engine';
12
15
 
13
- import {Stylesheet} from '../style/style-sheet';
16
+ import {GraphStyleEngine, type GraphStylesheet} from '../style/graph-style-engine';
14
17
  import {mixedGetPosition} from '../utils/layer-utils';
15
18
  import {InteractionManager} from '../core/interaction-manager';
19
+ import {buildCollapsedChainLayers} from '../utils/collapsed-chains';
20
+
21
+ import {warn} from '../utils/log';
16
22
 
17
- import {log} from '../utils/log';
23
+ import {
24
+ DEFAULT_GRAPH_LAYER_STYLESHEET,
25
+ normalizeGraphLayerStylesheet,
26
+ type GraphLayerEdgeStyle,
27
+ type GraphLayerNodeStyle,
28
+ type GraphLayerStylesheet,
29
+ type NormalizedGraphLayerStylesheet
30
+ } from '../style/graph-layer-stylesheet';
18
31
 
19
32
  // node layers
20
33
  import {CircleLayer} from './node-layers/circle-layer';
@@ -29,22 +42,25 @@ import {ZoomableMarkerLayer} from './node-layers/zoomable-marker-layer';
29
42
  import {EdgeLayer} from './edge-layer';
30
43
  import {EdgeLabelLayer} from './edge-layers/edge-label-layer';
31
44
  import {FlowLayer} from './edge-layers/flow-layer';
45
+ import {EdgeArrowLayer} from './edge-layers/edge-arrow-layer';
46
+ import {EdgeAttachmentHelper} from './edge-attachment-helper';
32
47
 
33
48
  import {JSONLoader} from '../loaders/json-loader';
34
49
 
35
50
  const NODE_LAYER_MAP = {
36
- [NODE_TYPE.RECTANGLE]: RectangleLayer,
37
- [NODE_TYPE.ROUNDED_RECTANGLE]: RoundedRectangleLayer,
38
- [NODE_TYPE.PATH_ROUNDED_RECTANGLE]: PathBasedRoundedRectangleLayer,
39
- [NODE_TYPE.ICON]: ImageLayer,
40
- [NODE_TYPE.CIRCLE]: CircleLayer,
41
- [NODE_TYPE.LABEL]: LabelLayer,
42
- [NODE_TYPE.MARKER]: ZoomableMarkerLayer
51
+ 'rectangle': RectangleLayer,
52
+ 'rounded-rectangle': RoundedRectangleLayer,
53
+ 'path-rounded-rectangle': PathBasedRoundedRectangleLayer,
54
+ 'icon': ImageLayer,
55
+ 'circle': CircleLayer,
56
+ 'label': LabelLayer,
57
+ 'marker': ZoomableMarkerLayer
43
58
  };
44
59
 
45
60
  const EDGE_DECORATOR_LAYER_MAP = {
46
- [EDGE_DECORATOR_TYPE.LABEL]: EdgeLabelLayer,
47
- [EDGE_DECORATOR_TYPE.FLOW]: FlowLayer
61
+ 'edge-label': EdgeLabelLayer,
62
+ 'flow': FlowLayer,
63
+ 'arrow': EdgeArrowLayer
48
64
  };
49
65
 
50
66
  const SHARED_LAYER_PROPS = {
@@ -54,6 +70,14 @@ const SHARED_LAYER_PROPS = {
54
70
  }
55
71
  };
56
72
 
73
+ const NODE_STYLE_DEPRECATION_MESSAGE =
74
+ 'GraphLayer: `nodeStyle` has been replaced by `stylesheet.nodes` and will be removed in a future release.';
75
+ const EDGE_STYLE_DEPRECATION_MESSAGE =
76
+ 'GraphLayer: `edgeStyle` has been replaced by `stylesheet.edges` and will be removed in a future release.';
77
+
78
+ let NODE_STYLE_DEPRECATION_WARNED = false;
79
+ let EDGE_STYLE_DEPRECATION_WARNED = false;
80
+
57
81
  export type GraphLayerProps = CompositeLayerProps & _GraphLayerProps;
58
82
 
59
83
  export type _GraphLayerProps = {
@@ -62,14 +86,11 @@ export type _GraphLayerProps = {
62
86
  graphLoader?: (opts: {json: any}) => Graph;
63
87
  engine?: GraphEngine;
64
88
 
65
- // an array of styles for layers
66
- nodeStyle?: any[];
67
- edgeStyle?: {
68
- stroke?: string;
69
- strokeWidth?: number;
70
- /** an array of styles for layers */
71
- decorators?: any[];
72
- };
89
+ stylesheet?: GraphLayerStylesheet;
90
+ /** @deprecated Use `stylesheet.nodes`. */
91
+ nodeStyle?: GraphLayerNodeStyle[];
92
+ /** @deprecated Use `stylesheet.edges`. */
93
+ edgeStyle?: GraphLayerEdgeStyle | GraphLayerEdgeStyle[];
73
94
  nodeEvents?: {
74
95
  onMouseLeave?: () => void;
75
96
  onHover?: () => void;
@@ -84,6 +105,7 @@ export type _GraphLayerProps = {
84
105
  enableDragging?: boolean;
85
106
  };
86
107
 
108
+ /** Composite layer that renders graph nodes, edges, and decorators. */
87
109
  export class GraphLayer extends CompositeLayer<GraphLayerProps> {
88
110
  static layerName = 'GraphLayer';
89
111
 
@@ -95,7 +117,8 @@ export class GraphLayer extends CompositeLayer<GraphLayerProps> {
95
117
  // Graph props
96
118
  graphLoader: JSONLoader,
97
119
 
98
- nodeStyle: [],
120
+ stylesheet: DEFAULT_GRAPH_LAYER_STYLESHEET,
121
+ nodeStyle: undefined as unknown as GraphLayerNodeStyle[],
99
122
  nodeEvents: {
100
123
  onMouseLeave: () => {},
101
124
  onHover: () => {},
@@ -103,12 +126,7 @@ export class GraphLayer extends CompositeLayer<GraphLayerProps> {
103
126
  onClick: () => {},
104
127
  onDrag: () => {}
105
128
  },
106
- edgeStyle: {
107
- stroke: 'black',
108
- strokeWidth: 1,
109
- // an array of styles for layers
110
- decorators: []
111
- },
129
+ edgeStyle: undefined as unknown as GraphLayerEdgeStyle | GraphLayerEdgeStyle[],
112
130
  edgeEvents: {
113
131
  onClick: () => {},
114
132
  onHover: () => {}
@@ -122,6 +140,8 @@ export class GraphLayer extends CompositeLayer<GraphLayerProps> {
122
140
  graphEngine?: GraphEngine;
123
141
  };
124
142
 
143
+ private readonly _edgeAttachmentHelper = new EdgeAttachmentHelper();
144
+
125
145
  forceUpdate = () => {
126
146
  if (this.context && this.context.layerManager) {
127
147
  this.setNeedsUpdate();
@@ -163,6 +183,10 @@ export class GraphLayer extends CompositeLayer<GraphLayerProps> {
163
183
  this._setGraphEngine(graphEngine);
164
184
  this.state.interactionManager.updateProps(props);
165
185
  this.forceUpdate();
186
+ } else if (changeFlags.propsChanged && props.engine !== oldProps.engine) {
187
+ this._setGraphEngine(props.engine);
188
+ this.state.interactionManager.updateProps(props);
189
+ this.forceUpdate();
166
190
  }
167
191
  }
168
192
 
@@ -170,6 +194,40 @@ export class GraphLayer extends CompositeLayer<GraphLayerProps> {
170
194
  this._removeGraphEngine();
171
195
  }
172
196
 
197
+ private _getResolvedStylesheet(): NormalizedGraphLayerStylesheet {
198
+ const {stylesheet, nodeStyle, edgeStyle} = this.props;
199
+
200
+ const usingNodeStyle = typeof nodeStyle !== 'undefined';
201
+ if (usingNodeStyle && !NODE_STYLE_DEPRECATION_WARNED) {
202
+ warn(NODE_STYLE_DEPRECATION_MESSAGE);
203
+ NODE_STYLE_DEPRECATION_WARNED = true;
204
+ }
205
+
206
+ const usingEdgeStyle = typeof edgeStyle !== 'undefined';
207
+ if (usingEdgeStyle && !EDGE_STYLE_DEPRECATION_WARNED) {
208
+ warn(EDGE_STYLE_DEPRECATION_MESSAGE);
209
+ EDGE_STYLE_DEPRECATION_WARNED = true;
210
+ }
211
+
212
+ return normalizeGraphLayerStylesheet({
213
+ stylesheet,
214
+ nodeStyle: usingNodeStyle ? nodeStyle : undefined,
215
+ edgeStyle: usingEdgeStyle ? edgeStyle : undefined
216
+ });
217
+ }
218
+
219
+ private _createStyleEngine(style: GraphStylesheet, context: string): GraphStyleEngine | null {
220
+ try {
221
+ return new GraphStyleEngine(style, {
222
+ stateUpdateTrigger: (this.state.interactionManager as any).getLastInteraction()
223
+ });
224
+ } catch (error) {
225
+ const message = error instanceof Error ? error.message : String(error);
226
+ warn(`GraphLayer: Failed to apply ${context}: ${message}`);
227
+ return null;
228
+ }
229
+ }
230
+
173
231
  _setGraphEngine(graphEngine: GraphEngine) {
174
232
  if (graphEngine === this.state.graphEngine) {
175
233
  return;
@@ -194,66 +252,91 @@ export class GraphLayer extends CompositeLayer<GraphLayerProps> {
194
252
 
195
253
  createNodeLayers() {
196
254
  const engine = this.state.graphEngine;
197
- const {nodeStyle} = this.props;
198
- if (!engine || !nodeStyle || !Array.isArray(nodeStyle) || nodeStyle.length === 0) {
255
+ const {nodes: nodeStyles} = this._getResolvedStylesheet();
256
+
257
+ if (!engine || !Array.isArray(nodeStyles) || nodeStyles.length === 0) {
199
258
  return [];
200
259
  }
201
260
 
202
- return nodeStyle.filter(Boolean).map((style, idx) => {
203
- const {pickable = true, visible = true, data = (nodes) => nodes, ...restStyle} = style;
204
- const LayerType = NODE_LAYER_MAP[style.type];
205
- if (!LayerType) {
206
- log.error(`Invalid node type: ${style.type}`)();
207
- throw new Error(`Invalid node type: ${style.type}`);
208
- }
209
- const stylesheet = new Stylesheet(restStyle, {
210
- stateUpdateTrigger: (this.state.interactionManager as any).getLastInteraction()
211
- });
212
- const getOffset = stylesheet.getDeckGLAccessor('getOffset');
213
- return new LayerType({
214
- ...SHARED_LAYER_PROPS,
215
- id: `node-rule-${idx}`,
216
- data: data(engine.getNodes()),
217
- getPosition: mixedGetPosition(engine.getNodePosition, getOffset),
218
- pickable,
219
- positionUpdateTrigger: [
220
- engine.getLayoutLastUpdate(),
221
- engine.getLayoutState(),
222
- stylesheet.getDeckGLAccessorUpdateTrigger('getOffset')
223
- ].join(),
224
- stylesheet,
225
- visible
226
- } as any);
227
- });
261
+ const baseLayers = nodeStyles
262
+ .filter(Boolean)
263
+ .map((style, idx) => {
264
+ const {pickable = true, visible = true, data = (nodes) => nodes, ...restStyle} = style;
265
+ const LayerType = NODE_LAYER_MAP[style.type];
266
+ if (!LayerType) {
267
+ warn(`GraphLayer: Invalid node type "${style.type}".`);
268
+ return null;
269
+ }
270
+ const stylesheet = this._createStyleEngine(
271
+ restStyle as unknown as GraphStylesheet,
272
+ `node stylesheet "${style.type}"`
273
+ );
274
+ if (!stylesheet) {
275
+ return null;
276
+ }
277
+ const getOffset = stylesheet.getDeckGLAccessor('getOffset');
278
+ return new LayerType({
279
+ ...SHARED_LAYER_PROPS,
280
+ id: `node-rule-${idx}`,
281
+ data: data(engine.getNodes()),
282
+ getPosition: mixedGetPosition(engine.getNodePosition, getOffset),
283
+ pickable,
284
+ positionUpdateTrigger: [
285
+ engine.getLayoutLastUpdate(),
286
+ engine.getLayoutState(),
287
+ stylesheet.getDeckGLAccessorUpdateTrigger('getOffset')
288
+ ].join(),
289
+ stylesheet,
290
+ visible
291
+ } as any);
292
+ })
293
+ .filter(Boolean) as any[];
294
+
295
+ const chainLayers = this._createChainOverlayLayers(engine);
296
+
297
+ return [...baseLayers, ...chainLayers];
228
298
  }
229
299
 
230
300
  createEdgeLayers() {
231
301
  const engine = this.state.graphEngine;
232
- const {edgeStyle} = this.props;
302
+ const {edges: edgeStyles, nodes: nodeStyles} = this._getResolvedStylesheet();
233
303
 
234
- if (!engine || !edgeStyle) {
304
+ if (!engine || !edgeStyles) {
235
305
  return [];
236
306
  }
237
307
 
238
- return (Array.isArray(edgeStyle) ? edgeStyle : [edgeStyle])
308
+ const edgeStyleArray = Array.isArray(edgeStyles) ? edgeStyles : [edgeStyles];
309
+
310
+ if (edgeStyleArray.length === 0) {
311
+ return [];
312
+ }
313
+
314
+ const getLayoutInfo = this._edgeAttachmentHelper.getLayoutAccessor({
315
+ engine,
316
+ interactionManager: this.state.interactionManager,
317
+ nodeStyle: nodeStyles
318
+ });
319
+
320
+ return edgeStyleArray
239
321
  .filter(Boolean)
240
322
  .flatMap((style, idx) => {
241
323
  const {decorators, data = (edges) => edges, visible = true, ...restEdgeStyle} = style;
242
- const stylesheet = new Stylesheet(
324
+ const stylesheet = this._createStyleEngine(
243
325
  {
244
- type: 'Edge',
326
+ type: 'edge',
245
327
  ...restEdgeStyle
246
- },
247
- {
248
- stateUpdateTrigger: (this.state.interactionManager as any).getLastInteraction()
249
- }
328
+ } as GraphStylesheet,
329
+ 'edge stylesheet'
250
330
  );
331
+ if (!stylesheet) {
332
+ return [];
333
+ }
251
334
 
252
335
  const edgeLayer = new EdgeLayer({
253
336
  ...SHARED_LAYER_PROPS,
254
337
  id: `edge-layer-${idx}`,
255
338
  data: data(engine.getEdges()),
256
- getLayoutInfo: engine.getEdgePosition,
339
+ getLayoutInfo,
257
340
  pickable: true,
258
341
  positionUpdateTrigger: [engine.getLayoutLastUpdate(), engine.getLayoutState()].join(),
259
342
  stylesheet,
@@ -261,28 +344,37 @@ export class GraphLayer extends CompositeLayer<GraphLayerProps> {
261
344
  } as any);
262
345
 
263
346
  if (!decorators || !Array.isArray(decorators) || decorators.length === 0) {
264
- return edgeLayer;
347
+ return [edgeLayer];
265
348
  }
266
- const decoratorLayers = decorators.filter(Boolean).flatMap((decoratorStyle, idx2) => {
267
- const DecoratorLayer = EDGE_DECORATOR_LAYER_MAP[decoratorStyle.type];
268
- if (!DecoratorLayer) {
269
- log.error(`Invalid edge decorator type: ${decoratorStyle.type}`)();
270
- throw new Error(`Invalid edge decorator type: ${decoratorStyle.type}`);
271
- }
272
- const decoratorStylesheet = new Stylesheet(decoratorStyle, {
273
- stateUpdateTrigger: (this.state.interactionManager as any).getLastInteraction()
274
- });
275
- return new DecoratorLayer({
276
- ...SHARED_LAYER_PROPS,
277
- id: `edge-decorator-${idx2}`,
278
- data: data(engine.getEdges()),
279
- getLayoutInfo: engine.getEdgePosition,
280
- pickable: true,
281
- positionUpdateTrigger: [engine.getLayoutLastUpdate(), engine.getLayoutState()].join(),
282
- stylesheet: decoratorStylesheet
283
- } as any);
284
- });
285
- return [edgeLayer, decoratorLayers];
349
+
350
+ const decoratorLayers = decorators
351
+ .filter(Boolean)
352
+ .map((decoratorStyle, idx2) => {
353
+ const DecoratorLayer = EDGE_DECORATOR_LAYER_MAP[decoratorStyle.type];
354
+ if (!DecoratorLayer) {
355
+ warn(`GraphLayer: Invalid edge decorator type "${decoratorStyle.type}".`);
356
+ return null;
357
+ }
358
+ const decoratorStylesheet = this._createStyleEngine(
359
+ decoratorStyle as unknown as GraphStylesheet,
360
+ `edge decorator stylesheet "${decoratorStyle.type}"`
361
+ );
362
+ if (!decoratorStylesheet) {
363
+ return null;
364
+ }
365
+ return new DecoratorLayer({
366
+ ...SHARED_LAYER_PROPS,
367
+ id: `edge-decorator-${idx2}`,
368
+ data: data(engine.getEdges()),
369
+ getLayoutInfo,
370
+ pickable: true,
371
+ positionUpdateTrigger: [engine.getLayoutLastUpdate(), engine.getLayoutState()].join(),
372
+ stylesheet: decoratorStylesheet
373
+ } as any);
374
+ })
375
+ .filter(Boolean);
376
+
377
+ return [edgeLayer, ...decoratorLayers];
286
378
  });
287
379
  }
288
380
 
@@ -309,4 +401,130 @@ export class GraphLayer extends CompositeLayer<GraphLayerProps> {
309
401
  renderLayers() {
310
402
  return [this.createEdgeLayers(), this.createNodeLayers()];
311
403
  }
404
+
405
+ private _createChainOverlayLayers(engine: GraphEngine) {
406
+ const chainData = buildCollapsedChainLayers(engine);
407
+ if (!chainData) {
408
+ return [];
409
+ }
410
+
411
+ const {
412
+ collapsedNodes,
413
+ collapsedOutlineNodes,
414
+ expandedNodes,
415
+ expandedOutlineNodes,
416
+ getChainOutlinePolygon,
417
+ outlineUpdateTrigger
418
+ } = chainData;
419
+
420
+ const layers: any[] = [];
421
+
422
+ if (collapsedOutlineNodes.length > 0) {
423
+ layers.push(
424
+ new PolygonLayer({
425
+ ...SHARED_LAYER_PROPS,
426
+ id: 'collapsed-chain-outlines',
427
+ data: collapsedOutlineNodes,
428
+ getPolygon: (node: Node) => getChainOutlinePolygon(node),
429
+ stroked: true,
430
+ filled: false,
431
+ getLineColor: [220, 64, 64, 220],
432
+ getLineWidth: 2,
433
+ lineWidthUnits: 'pixels',
434
+ lineWidthMinPixels: 2,
435
+ pickable: true,
436
+ updateTriggers: {
437
+ getPolygon: [outlineUpdateTrigger]
438
+ }
439
+ })
440
+ );
441
+ }
442
+
443
+ const collapsedMarkerStylesheet = this._createStyleEngine(
444
+ {
445
+ type: 'marker',
446
+ fill: [64, 96, 192, 255],
447
+ size: 32,
448
+ marker: 'circle-plus-filled',
449
+ offset: [24, -24],
450
+ scaleWithZoom: false
451
+ } as GraphStylesheet<'marker'>,
452
+ 'collapsed chain marker stylesheet'
453
+ );
454
+
455
+ if (collapsedMarkerStylesheet && collapsedNodes.length > 0) {
456
+ const getOffset = collapsedMarkerStylesheet.getDeckGLAccessor('getOffset');
457
+ layers.push(
458
+ new ZoomableMarkerLayer({
459
+ ...SHARED_LAYER_PROPS,
460
+ id: 'collapsed-chain-markers',
461
+ data: collapsedNodes,
462
+ getPosition: mixedGetPosition(engine.getNodePosition, getOffset),
463
+ pickable: true,
464
+ positionUpdateTrigger: [
465
+ engine.getLayoutLastUpdate(),
466
+ engine.getLayoutState(),
467
+ collapsedMarkerStylesheet.getDeckGLAccessorUpdateTrigger('getOffset')
468
+ ].join(),
469
+ stylesheet: collapsedMarkerStylesheet,
470
+ visible: true
471
+ } as any)
472
+ );
473
+ }
474
+
475
+ if (expandedOutlineNodes.length > 0) {
476
+ layers.push(
477
+ new PolygonLayer({
478
+ ...SHARED_LAYER_PROPS,
479
+ id: 'expanded-chain-outlines',
480
+ data: expandedOutlineNodes,
481
+ getPolygon: (node: Node) => getChainOutlinePolygon(node),
482
+ stroked: true,
483
+ filled: false,
484
+ getLineColor: [64, 96, 192, 200],
485
+ getLineWidth: 2,
486
+ lineWidthUnits: 'pixels',
487
+ lineWidthMinPixels: 2,
488
+ pickable: true,
489
+ updateTriggers: {
490
+ getPolygon: [outlineUpdateTrigger]
491
+ }
492
+ })
493
+ );
494
+ }
495
+
496
+ const expandedMarkerStylesheet = this._createStyleEngine(
497
+ {
498
+ type: 'marker',
499
+ fill: [64, 96, 192, 255],
500
+ size: 32,
501
+ marker: 'circle-minus-filled',
502
+ offset: [24, -24],
503
+ scaleWithZoom: false
504
+ } as GraphStylesheet<'marker'>,
505
+ 'expanded chain marker stylesheet'
506
+ );
507
+
508
+ if (expandedMarkerStylesheet && expandedNodes.length > 0) {
509
+ const getOffset = expandedMarkerStylesheet.getDeckGLAccessor('getOffset');
510
+ layers.push(
511
+ new ZoomableMarkerLayer({
512
+ ...SHARED_LAYER_PROPS,
513
+ id: 'expanded-chain-markers',
514
+ data: expandedNodes,
515
+ getPosition: mixedGetPosition(engine.getNodePosition, getOffset),
516
+ pickable: true,
517
+ positionUpdateTrigger: [
518
+ engine.getLayoutLastUpdate(),
519
+ engine.getLayoutState(),
520
+ expandedMarkerStylesheet.getDeckGLAccessorUpdateTrigger('getOffset')
521
+ ].join(),
522
+ stylesheet: expandedMarkerStylesheet,
523
+ visible: true
524
+ } as any)
525
+ );
526
+ }
527
+
528
+ return layers;
529
+ }
312
530
  }