@deck.gl-community/graph-layers 9.2.0-beta.2 → 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 (232) hide show
  1. package/dist/core/graph-engine.d.ts +63 -21
  2. package/dist/core/graph-engine.d.ts.map +1 -1
  3. package/dist/core/graph-engine.js +155 -75
  4. package/dist/core/graph-engine.js.map +1 -1
  5. package/dist/core/graph-layout.d.ts +22 -18
  6. package/dist/core/graph-layout.d.ts.map +1 -1
  7. package/dist/core/graph-layout.js +33 -18
  8. package/dist/core/graph-layout.js.map +1 -1
  9. package/dist/core/interaction-manager.d.ts +2 -2
  10. package/dist/core/interaction-manager.d.ts.map +1 -1
  11. package/dist/core/interaction-manager.js +7 -5
  12. package/dist/core/interaction-manager.js.map +1 -1
  13. package/dist/graph/arrow-graph.d.ts +69 -0
  14. package/dist/graph/arrow-graph.d.ts.map +1 -0
  15. package/dist/graph/arrow-graph.js +513 -0
  16. package/dist/graph/arrow-graph.js.map +1 -0
  17. package/dist/graph/classic-graph.d.ts +169 -0
  18. package/dist/graph/classic-graph.d.ts.map +1 -0
  19. package/dist/graph/classic-graph.js +390 -0
  20. package/dist/graph/classic-graph.js.map +1 -0
  21. package/dist/graph/edge.d.ts +6 -6
  22. package/dist/graph/edge.d.ts.map +1 -1
  23. package/dist/graph/edge.js.map +1 -1
  24. package/dist/graph/functions/arrow-utils.d.ts +6 -0
  25. package/dist/graph/functions/arrow-utils.d.ts.map +1 -0
  26. package/dist/graph/functions/arrow-utils.js +67 -0
  27. package/dist/graph/functions/arrow-utils.js.map +1 -0
  28. package/dist/graph/functions/create-graph-from-data.d.ts +3 -0
  29. package/dist/graph/functions/create-graph-from-data.d.ts.map +1 -0
  30. package/dist/graph/functions/create-graph-from-data.js +12 -0
  31. package/dist/graph/functions/create-graph-from-data.js.map +1 -0
  32. package/dist/graph/graph-normalization.d.ts +10 -0
  33. package/dist/graph/graph-normalization.d.ts.map +1 -0
  34. package/dist/graph/graph-normalization.js +65 -0
  35. package/dist/graph/graph-normalization.js.map +1 -0
  36. package/dist/graph/graph.d.ts +62 -155
  37. package/dist/graph/graph.d.ts.map +1 -1
  38. package/dist/graph/graph.js +11 -300
  39. package/dist/graph/graph.js.map +1 -1
  40. package/dist/graph/node.d.ts +6 -6
  41. package/dist/graph/node.d.ts.map +1 -1
  42. package/dist/graph/node.js +2 -2
  43. package/dist/graph/node.js.map +1 -1
  44. package/dist/graph-data/arrow-graph-data-builder.d.ts +21 -0
  45. package/dist/graph-data/arrow-graph-data-builder.d.ts.map +1 -0
  46. package/dist/graph-data/arrow-graph-data-builder.js +105 -0
  47. package/dist/graph-data/arrow-graph-data-builder.js.map +1 -0
  48. package/dist/graph-data/graph-data-builder.d.ts +6 -0
  49. package/dist/graph-data/graph-data-builder.d.ts.map +1 -0
  50. package/dist/graph-data/graph-data-builder.js +1 -0
  51. package/dist/graph-data/graph-data-builder.js.map +1 -0
  52. package/dist/graph-data/graph-data.d.ts +40 -0
  53. package/dist/graph-data/graph-data.d.ts.map +1 -0
  54. package/dist/graph-data/graph-data.js +11 -0
  55. package/dist/graph-data/graph-data.js.map +1 -0
  56. package/dist/graph-data/plain-graph-data-builder.d.ts +20 -0
  57. package/dist/graph-data/plain-graph-data-builder.d.ts.map +1 -0
  58. package/dist/graph-data/plain-graph-data-builder.js +105 -0
  59. package/dist/graph-data/plain-graph-data-builder.js.map +1 -0
  60. package/dist/graph-style-schema.cdn.js +1 -1
  61. package/dist/graph-style-schema.json +1 -1
  62. package/dist/index.cjs +6905 -4576
  63. package/dist/index.cjs.map +4 -4
  64. package/dist/index.d.ts +14 -7
  65. package/dist/index.d.ts.map +1 -1
  66. package/dist/index.js +24 -11
  67. package/dist/index.js.map +1 -1
  68. package/dist/layers/common-layers/flow-path-layer/flow-path-layer.d.ts.map +1 -1
  69. package/dist/layers/common-layers/flow-path-layer/flow-path-layer.js +1 -2
  70. package/dist/layers/common-layers/flow-path-layer/flow-path-layer.js.map +1 -1
  71. package/dist/layers/common-layers/grid-layer/grid-layer.d.ts +83 -0
  72. package/dist/layers/common-layers/grid-layer/grid-layer.d.ts.map +1 -0
  73. package/dist/layers/common-layers/grid-layer/grid-layer.js +133 -0
  74. package/dist/layers/common-layers/grid-layer/grid-layer.js.map +1 -0
  75. package/dist/layers/edge-attachment-helper.d.ts.map +1 -1
  76. package/dist/layers/edge-attachment-helper.js +1 -2
  77. package/dist/layers/edge-attachment-helper.js.map +1 -1
  78. package/dist/layers/graph-layer.d.ts +68 -11
  79. package/dist/layers/graph-layer.d.ts.map +1 -1
  80. package/dist/layers/graph-layer.js +435 -50
  81. package/dist/layers/graph-layer.js.map +1 -1
  82. package/dist/layouts/d3-dag/collapsable-d3-dag-layout.d.ts +24 -0
  83. package/dist/layouts/d3-dag/collapsable-d3-dag-layout.d.ts.map +1 -0
  84. package/dist/layouts/d3-dag/collapsable-d3-dag-layout.js +251 -0
  85. package/dist/layouts/d3-dag/collapsable-d3-dag-layout.js.map +1 -0
  86. package/dist/layouts/d3-dag/d3-dag-layout.d.ts +46 -61
  87. package/dist/layouts/d3-dag/d3-dag-layout.d.ts.map +1 -1
  88. package/dist/layouts/d3-dag/d3-dag-layout.js +85 -270
  89. package/dist/layouts/d3-dag/d3-dag-layout.js.map +1 -1
  90. package/dist/layouts/d3-force/d3-force-layout.d.ts +20 -8
  91. package/dist/layouts/d3-force/d3-force-layout.d.ts.map +1 -1
  92. package/dist/layouts/d3-force/d3-force-layout.js +39 -20
  93. package/dist/layouts/d3-force/d3-force-layout.js.map +1 -1
  94. package/dist/layouts/experimental/force-multi-graph-layout.d.ts +19 -15
  95. package/dist/layouts/experimental/force-multi-graph-layout.d.ts.map +1 -1
  96. package/dist/layouts/experimental/force-multi-graph-layout.js +47 -38
  97. package/dist/layouts/experimental/force-multi-graph-layout.js.map +1 -1
  98. package/dist/layouts/experimental/hive-plot-layout.d.ts +18 -15
  99. package/dist/layouts/experimental/hive-plot-layout.d.ts.map +1 -1
  100. package/dist/layouts/experimental/hive-plot-layout.js +33 -34
  101. package/dist/layouts/experimental/hive-plot-layout.js.map +1 -1
  102. package/dist/layouts/experimental/radial-layout.d.ts +12 -7
  103. package/dist/layouts/experimental/radial-layout.d.ts.map +1 -1
  104. package/dist/layouts/experimental/radial-layout.js +31 -14
  105. package/dist/layouts/experimental/radial-layout.js.map +1 -1
  106. package/dist/layouts/gpu-force/gpu-force-layout.d.ts +11 -8
  107. package/dist/layouts/gpu-force/gpu-force-layout.d.ts.map +1 -1
  108. package/dist/layouts/gpu-force/gpu-force-layout.js +59 -56
  109. package/dist/layouts/gpu-force/gpu-force-layout.js.map +1 -1
  110. package/dist/layouts/simple-layout.d.ts +8 -25
  111. package/dist/layouts/simple-layout.d.ts.map +1 -1
  112. package/dist/layouts/simple-layout.js +13 -17
  113. package/dist/layouts/simple-layout.js.map +1 -1
  114. package/dist/loaders/dot-graph-loader.d.ts +25 -0
  115. package/dist/loaders/dot-graph-loader.d.ts.map +1 -0
  116. package/dist/loaders/dot-graph-loader.js +668 -0
  117. package/dist/loaders/dot-graph-loader.js.map +1 -0
  118. package/dist/loaders/json-graph-loader.d.ts +6 -0
  119. package/dist/loaders/json-graph-loader.d.ts.map +1 -0
  120. package/dist/loaders/json-graph-loader.js +31 -0
  121. package/dist/loaders/json-graph-loader.js.map +1 -0
  122. package/dist/loaders/{edge-parsers.d.ts → parsers/edge-parsers.d.ts} +1 -1
  123. package/dist/loaders/parsers/edge-parsers.d.ts.map +1 -0
  124. package/dist/loaders/{edge-parsers.js → parsers/edge-parsers.js} +1 -1
  125. package/dist/loaders/parsers/edge-parsers.js.map +1 -0
  126. package/dist/loaders/{node-parsers.d.ts → parsers/node-parsers.d.ts} +1 -1
  127. package/dist/loaders/parsers/node-parsers.d.ts.map +1 -0
  128. package/dist/loaders/{node-parsers.js → parsers/node-parsers.js} +1 -1
  129. package/dist/loaders/parsers/node-parsers.js.map +1 -0
  130. package/dist/loaders/parsers/parse-json-graph.d.ts +29 -0
  131. package/dist/loaders/parsers/parse-json-graph.d.ts.map +1 -0
  132. package/dist/loaders/parsers/parse-json-graph.js +78 -0
  133. package/dist/loaders/parsers/parse-json-graph.js.map +1 -0
  134. package/dist/style/graph-style-engine.d.ts +4 -2
  135. package/dist/style/graph-style-engine.d.ts.map +1 -1
  136. package/dist/style/graph-style-engine.js +3 -2
  137. package/dist/style/graph-style-engine.js.map +1 -1
  138. package/dist/style/{style-engine.d.ts → stylesheet-engine.d.ts} +3 -3
  139. package/dist/style/stylesheet-engine.d.ts.map +1 -0
  140. package/dist/style/{style-engine.js → stylesheet-engine.js} +1 -1
  141. package/dist/style/stylesheet-engine.js.map +1 -0
  142. package/dist/utils/collapsed-chains.d.ts +8 -8
  143. package/dist/utils/collapsed-chains.d.ts.map +1 -1
  144. package/dist/utils/collapsed-chains.js +1 -6
  145. package/dist/utils/collapsed-chains.js.map +1 -1
  146. package/dist/utils/rank-grid.d.ts +30 -0
  147. package/dist/utils/rank-grid.d.ts.map +1 -0
  148. package/dist/utils/rank-grid.js +306 -0
  149. package/dist/utils/rank-grid.js.map +1 -0
  150. package/package.json +4 -8
  151. package/src/_disabled/arrow-graph-data.ts.disabled +18 -0
  152. package/src/_disabled/columnar-graph-data-builder.ts.disabled +250 -0
  153. package/src/_disabled/graph-runtime-layout.ts.disabled +29 -0
  154. package/src/core/graph-engine.ts +201 -84
  155. package/src/core/graph-layout.ts +52 -29
  156. package/src/core/interaction-manager.ts +20 -20
  157. package/src/graph/arrow-graph.ts +648 -0
  158. package/src/graph/classic-graph.ts +447 -0
  159. package/src/graph/edge.ts +7 -7
  160. package/src/graph/functions/arrow-utils.ts +72 -0
  161. package/src/graph/functions/convert-arrow-graph-to-classic-graph.ts.disabled +47 -0
  162. package/src/graph/functions/convert-plain-graph-to-arrow-graph.ts.disabled +119 -0
  163. package/src/graph/functions/create-graph-from-data.ts +16 -0
  164. package/src/graph/functions/create-plain-graph-from-data.ts.disabled +176 -0
  165. package/src/graph/graph-normalization.ts +87 -0
  166. package/src/graph/graph.ts +68 -339
  167. package/src/graph/node.ts +9 -9
  168. package/src/graph/tabular-graph.ts.disabled +761 -0
  169. package/src/graph-data/arrow-graph-data-builder.ts +165 -0
  170. package/src/graph-data/graph-data-builder.ts +7 -0
  171. package/src/graph-data/graph-data.ts +57 -0
  172. package/src/graph-data/plain-graph-data-builder.ts +132 -0
  173. package/src/index.ts +53 -13
  174. package/src/layers/common-layers/flow-path-layer/flow-path-layer.ts +1 -2
  175. package/src/layers/common-layers/grid-layer/grid-layer.ts +237 -0
  176. package/src/layers/edge-attachment-helper.ts +22 -16
  177. package/src/layers/graph-layer.ts +642 -62
  178. package/src/layouts/d3-dag/collapsable-d3-dag-layout.ts +330 -0
  179. package/src/layouts/d3-dag/d3-dag-layout.ts +166 -396
  180. package/src/layouts/d3-force/d3-force-layout.ts +52 -30
  181. package/src/layouts/experimental/force-multi-graph-layout.ts +55 -49
  182. package/src/layouts/experimental/hive-plot-layout.ts +41 -42
  183. package/src/layouts/experimental/radial-layout.ts +39 -20
  184. package/src/layouts/gpu-force/gpu-force-layout.ts +72 -70
  185. package/src/layouts/simple-layout.ts +20 -44
  186. package/src/loaders/{create-graph.ts → deprecated/create-graph.ts.disabled} +6 -6
  187. package/src/loaders/deprecated/json-classic-graph-loader.ts.disabled +33 -0
  188. package/src/loaders/{simple-json-graph-loader.ts → deprecated/simple-json-graph-loader.ts.disabled} +3 -3
  189. package/src/loaders/{table-graph-loader.ts → deprecated/table-graph-loader.ts.disabled} +8 -8
  190. package/src/loaders/dot-graph-loader.ts +860 -0
  191. package/src/loaders/json-graph-loader.ts +48 -0
  192. package/src/loaders/parsers/create-graph-data.ts.disabled +45 -0
  193. package/src/loaders/{edge-parsers.ts → parsers/edge-parsers.ts} +2 -2
  194. package/src/loaders/{node-parsers.ts → parsers/node-parsers.ts} +2 -2
  195. package/src/loaders/parsers/parse-json-graph.ts +134 -0
  196. package/src/style/graph-style-engine.ts +5 -2
  197. package/src/style/{style-engine.ts → stylesheet-engine.ts} +3 -3
  198. package/src/utils/collapsed-chains.ts +11 -17
  199. package/src/utils/rank-grid.ts +426 -0
  200. package/dist/loaders/create-graph.d.ts +0 -12
  201. package/dist/loaders/create-graph.d.ts.map +0 -1
  202. package/dist/loaders/create-graph.js +0 -38
  203. package/dist/loaders/create-graph.js.map +0 -1
  204. package/dist/loaders/edge-parsers.d.ts.map +0 -1
  205. package/dist/loaders/edge-parsers.js.map +0 -1
  206. package/dist/loaders/json-loader.d.ts +0 -7
  207. package/dist/loaders/json-loader.d.ts.map +0 -1
  208. package/dist/loaders/json-loader.js +0 -16
  209. package/dist/loaders/json-loader.js.map +0 -1
  210. package/dist/loaders/node-parsers.d.ts.map +0 -1
  211. package/dist/loaders/node-parsers.js.map +0 -1
  212. package/dist/loaders/simple-json-graph-loader.d.ts +0 -11
  213. package/dist/loaders/simple-json-graph-loader.d.ts.map +0 -1
  214. package/dist/loaders/simple-json-graph-loader.js +0 -20
  215. package/dist/loaders/simple-json-graph-loader.js.map +0 -1
  216. package/dist/loaders/table-graph-loader.d.ts +0 -16
  217. package/dist/loaders/table-graph-loader.d.ts.map +0 -1
  218. package/dist/loaders/table-graph-loader.js +0 -91
  219. package/dist/loaders/table-graph-loader.js.map +0 -1
  220. package/dist/style/style-engine.d.ts.map +0 -1
  221. package/dist/style/style-engine.js.map +0 -1
  222. package/dist/widgets/long-press-button.d.ts +0 -12
  223. package/dist/widgets/long-press-button.d.ts.map +0 -1
  224. package/dist/widgets/long-press-button.js +0 -31
  225. package/dist/widgets/long-press-button.js.map +0 -1
  226. package/dist/widgets/view-control-widget.d.ts +0 -77
  227. package/dist/widgets/view-control-widget.d.ts.map +0 -1
  228. package/dist/widgets/view-control-widget.js +0 -197
  229. package/dist/widgets/view-control-widget.js.map +0 -1
  230. package/src/loaders/json-loader.ts +0 -19
  231. package/src/widgets/long-press-button.tsx +0 -50
  232. package/src/widgets/view-control-widget.tsx +0 -339
@@ -0,0 +1,237 @@
1
+ // deck.gl-community
2
+ // SPDX-License-Identifier: MIT
3
+ // Copyright (c) vis.gl contributors
4
+
5
+ import {CompositeLayer, type CompositeLayerProps, type UpdateParameters} from '@deck.gl/core';
6
+ import {LineLayer, TextLayer} from '@deck.gl/layers';
7
+
8
+ export type GridLineDatum = {
9
+ /** Optional label associated with the grid line. */
10
+ label?: string | number;
11
+ /** Horizontal grid lines use the yPosition value. */
12
+ yPosition?: number | null;
13
+ /** Vertical grid lines use the xPosition value. */
14
+ xPosition?: number | null;
15
+ };
16
+
17
+ export type GridLayerProps<DatumT extends GridLineDatum = GridLineDatum> = CompositeLayerProps & {
18
+ /** Collection of grid line definitions. */
19
+ data: readonly DatumT[];
20
+ /** Direction in which to draw grid lines. */
21
+ direction?: 'horizontal' | 'vertical';
22
+ /** Minimum X coordinate for grid lines. */
23
+ xMin?: number;
24
+ /** Maximum X coordinate for grid lines. */
25
+ xMax?: number;
26
+ /** Minimum Y coordinate for grid lines. */
27
+ yMin?: number;
28
+ /** Maximum Y coordinate for grid lines. */
29
+ yMax?: number;
30
+ /** Width of the grid lines in screen pixels. */
31
+ width?: number;
32
+ /** RGBA color for grid lines. */
33
+ color?: [number, number, number, number];
34
+ /** Optional accessor for line labels. */
35
+ getLabel?: (d: DatumT) => string | number | null | undefined;
36
+ /** Optional accessor for per-datum colors. */
37
+ getColor?: (d: DatumT) => [number, number, number, number] | null | undefined;
38
+ /** Optional accessor for per-datum widths. */
39
+ getWidth?: (d: DatumT) => number | null | undefined;
40
+ /** Whether to render labels alongside the grid lines. */
41
+ showLabels?: boolean;
42
+ /** Pixel offset applied to rendered labels. */
43
+ labelOffset?: [number, number];
44
+ };
45
+
46
+ const DEFAULT_COLOR: [number, number, number, number] = [200, 200, 200, 255];
47
+ const DEFAULT_WIDTH = 1;
48
+ const DEFAULT_OFFSET: [number, number] = [8, 0];
49
+ const DEFAULT_MIN = -1e6;
50
+ const DEFAULT_MAX = 1e6;
51
+
52
+ export class GridLayer<DatumT extends GridLineDatum = GridLineDatum> extends CompositeLayer<GridLayerProps<DatumT>> {
53
+ static override layerName = 'GridLayer';
54
+
55
+ static override defaultProps: Required<Pick<GridLayerProps<GridLineDatum>, 'direction' | 'width' | 'color' | 'xMin' | 'xMax' | 'yMin' | 'yMax' | 'showLabels' | 'labelOffset'>> = {
56
+ direction: 'horizontal',
57
+ width: DEFAULT_WIDTH,
58
+ color: DEFAULT_COLOR,
59
+ xMin: DEFAULT_MIN,
60
+ xMax: DEFAULT_MAX,
61
+ yMin: DEFAULT_MIN,
62
+ yMax: DEFAULT_MAX,
63
+ showLabels: true,
64
+ labelOffset: DEFAULT_OFFSET
65
+ } as const;
66
+
67
+ override shouldUpdateState(params: UpdateParameters<this>): boolean {
68
+ const {changeFlags} = params;
69
+ return Boolean(changeFlags.dataChanged || changeFlags.propsChanged || changeFlags.viewportChanged);
70
+ }
71
+
72
+ override renderLayers() {
73
+ const {
74
+ data,
75
+ direction = 'horizontal',
76
+ xMin = DEFAULT_MIN,
77
+ xMax = DEFAULT_MAX,
78
+ yMin = DEFAULT_MIN,
79
+ yMax = DEFAULT_MAX,
80
+ color = DEFAULT_COLOR,
81
+ width = DEFAULT_WIDTH,
82
+ getLabel,
83
+ getColor,
84
+ getWidth,
85
+ showLabels = true,
86
+ labelOffset = DEFAULT_OFFSET
87
+ } = this.props;
88
+
89
+ const bounds = this._resolveViewportBounds({xMin, xMax, yMin, yMax});
90
+ const lines = this._createLineSegments(data, direction, bounds);
91
+
92
+ if (!lines.length) {
93
+ return [];
94
+ }
95
+
96
+ const lineLayer = new LineLayer({
97
+ id: `${this.props.id}-lines`,
98
+ data: lines,
99
+ getSourcePosition: (d) => d.sourcePosition,
100
+ getTargetPosition: (d) => d.targetPosition,
101
+ getColor: getColor ? (d) => getColor(d.datum) ?? color : () => color,
102
+ getWidth: getWidth ? (d) => getWidth(d.datum) ?? width : () => width,
103
+ widthUnits: 'pixels',
104
+ parameters: {
105
+ depthTest: false
106
+ }
107
+ });
108
+
109
+ if (!showLabels) {
110
+ return [lineLayer];
111
+ }
112
+
113
+ const textData = this._createLabelData(lines, direction, bounds, getLabel);
114
+
115
+ if (!textData.length) {
116
+ return [lineLayer];
117
+ }
118
+
119
+ const textLayer = new TextLayer({
120
+ id: `${this.props.id}-labels`,
121
+ data: textData,
122
+ getPosition: (d) => d.position,
123
+ getText: (d) => d.text,
124
+ getColor: getColor ? (d) => getColor(d.datum) ?? color : () => color,
125
+ getSize: 12,
126
+ sizeUnits: 'pixels',
127
+ getPixelOffset: labelOffset,
128
+ getTextAnchor: () => 'start',
129
+ getAlignmentBaseline: () => 'center',
130
+ background: true,
131
+ backgroundPadding: [4, 2],
132
+ backgroundColor: [255, 255, 255, 200],
133
+ parameters: {
134
+ depthTest: false
135
+ }
136
+ });
137
+
138
+ return [lineLayer, textLayer];
139
+ }
140
+
141
+ private _resolveViewportBounds(bounds: {
142
+ xMin: number;
143
+ xMax: number;
144
+ yMin: number;
145
+ yMax: number;
146
+ }): {minX: number; maxX: number; minY: number; maxY: number} {
147
+ const viewportBounds = this.context?.viewport?.getBounds?.();
148
+ if (!Array.isArray(viewportBounds) || viewportBounds.length !== 4) {
149
+ return {minX: bounds.xMin, maxX: bounds.xMax, minY: bounds.yMin, maxY: bounds.yMax};
150
+ }
151
+
152
+ const [bxMin, byMin, bxMax, byMax] = viewportBounds;
153
+ const minX =
154
+ Number.isFinite(bxMin) && Number.isFinite(bxMax)
155
+ ? Math.min(bounds.xMin, bxMin)
156
+ : bounds.xMin;
157
+ const maxX =
158
+ Number.isFinite(bxMin) && Number.isFinite(bxMax)
159
+ ? Math.max(bounds.xMax, bxMax)
160
+ : bounds.xMax;
161
+ const minY =
162
+ Number.isFinite(byMin) && Number.isFinite(byMax)
163
+ ? Math.min(bounds.yMin, byMin)
164
+ : bounds.yMin;
165
+ const maxY =
166
+ Number.isFinite(byMin) && Number.isFinite(byMax)
167
+ ? Math.max(bounds.yMax, byMax)
168
+ : bounds.yMax;
169
+
170
+ return {minX, maxX, minY, maxY};
171
+ }
172
+
173
+ private _createLineSegments(
174
+ data: readonly DatumT[],
175
+ direction: 'horizontal' | 'vertical',
176
+ bounds: {minX: number; maxX: number; minY: number; maxY: number}
177
+ ): Array<{
178
+ sourcePosition: [number, number];
179
+ targetPosition: [number, number];
180
+ datum: DatumT;
181
+ }> {
182
+ const segments: Array<{
183
+ sourcePosition: [number, number];
184
+ targetPosition: [number, number];
185
+ datum: DatumT;
186
+ }> = [];
187
+
188
+ const isHorizontal = direction === 'horizontal';
189
+ for (const datum of data) {
190
+ const position = isHorizontal ? datum.yPosition : datum.xPosition;
191
+ if (typeof position === 'number' && Number.isFinite(position)) {
192
+ if (isHorizontal) {
193
+ segments.push({
194
+ sourcePosition: [bounds.minX, position],
195
+ targetPosition: [bounds.maxX, position],
196
+ datum
197
+ });
198
+ } else {
199
+ segments.push({
200
+ sourcePosition: [position, bounds.minY],
201
+ targetPosition: [position, bounds.maxY],
202
+ datum
203
+ });
204
+ }
205
+ }
206
+ }
207
+
208
+ return segments;
209
+ }
210
+
211
+ private _createLabelData(
212
+ lines: Array<{
213
+ sourcePosition: [number, number];
214
+ targetPosition: [number, number];
215
+ datum: DatumT;
216
+ }>,
217
+ direction: 'horizontal' | 'vertical',
218
+ bounds: {minX: number; maxX: number; minY: number; maxY: number},
219
+ getLabel?: (datum: DatumT) => string | number | null | undefined
220
+ ): Array<{position: [number, number]; text: string; datum: DatumT}> {
221
+ const labels: Array<{position: [number, number]; text: string; datum: DatumT}> = [];
222
+ const isHorizontal = direction === 'horizontal';
223
+
224
+ for (const {datum, sourcePosition} of lines) {
225
+ const rawLabel = getLabel ? getLabel(datum) : datum.label ?? null;
226
+ if (rawLabel !== null && rawLabel !== undefined && rawLabel !== '') {
227
+ const [sx, sy] = sourcePosition;
228
+ const position: [number, number] = isHorizontal
229
+ ? [bounds.minX, sy]
230
+ : [sx, bounds.minY];
231
+ labels.push({position, text: String(rawLabel), datum});
232
+ }
233
+ }
234
+
235
+ return labels;
236
+ }
237
+ }
@@ -4,16 +4,19 @@
4
4
 
5
5
  import type {InteractionManager} from '../core/interaction-manager';
6
6
  import type {GraphEngine} from '../core/graph-engine';
7
- import type {Node} from '../graph/node';
7
+ import type {NodeInterface} from '../graph/graph';
8
8
 
9
- import {GraphStyleEngine, type GraphStylesheet} from '../style/graph-style-engine';
9
+ import {
10
+ GraphStylesheetEngine,
11
+ type GraphStylesheet
12
+ } from '../style/graph-style-engine';
10
13
  import type {GraphLayerNodeStyle} from '../style/graph-layer-stylesheet';
11
14
  import {getNodeBoundaryIntersection, type GeometryNodeType, type NodeGeometry} from '../utils/node-boundary';
12
15
  import {warn} from '../utils/log';
13
16
 
14
- type NumericAccessor = ((node: Node) => number) | number | null | undefined;
17
+ type NumericAccessor = ((node: NodeInterface) => number) | number | null | undefined;
15
18
  type OffsetAccessor =
16
- | ((node: Node) => [number, number])
19
+ | ((node: NodeInterface) => [number, number])
17
20
  | [number, number]
18
21
  | null
19
22
  | undefined;
@@ -36,7 +39,7 @@ const GEOMETRY_NODE_TYPES: GeometryNodeType[] = [
36
39
  'marker'
37
40
  ];
38
41
 
39
- function evaluateNumericAccessor(accessor: NumericAccessor, node: Node): number | undefined {
42
+ function evaluateNumericAccessor(accessor: NumericAccessor, node: NodeInterface): number | undefined {
40
43
  if (typeof accessor === 'function') {
41
44
  const value = accessor(node);
42
45
  return typeof value === 'number' && Number.isFinite(value) ? value : undefined;
@@ -47,7 +50,7 @@ function evaluateNumericAccessor(accessor: NumericAccessor, node: Node): number
47
50
  return undefined;
48
51
  }
49
52
 
50
- function evaluateOffsetAccessor(accessor: OffsetAccessor, node: Node): [number, number] {
53
+ function evaluateOffsetAccessor(accessor: OffsetAccessor, node: NodeInterface): [number, number] {
51
54
  if (!accessor) {
52
55
  return [0, 0];
53
56
  }
@@ -85,7 +88,7 @@ function normalizePosition(value: any): [number, number] | null {
85
88
  return null;
86
89
  }
87
90
 
88
- function resolveAccessorValue(accessor: NumericAccessor | undefined, node: Node) {
91
+ function resolveAccessorValue(accessor: NumericAccessor | undefined, node: NodeInterface) {
89
92
  if (!accessor) {
90
93
  return undefined;
91
94
  }
@@ -103,7 +106,7 @@ function assignDimension(
103
106
  }
104
107
 
105
108
  function assignRectangleDimensions(
106
- node: Node,
109
+ node: NodeInterface,
107
110
  accessors: NodeStyleAccessors,
108
111
  geometry: NodeGeometry
109
112
  ) {
@@ -113,7 +116,7 @@ function assignRectangleDimensions(
113
116
 
114
117
  const GEOMETRY_APPLIERS: Record<
115
118
  GeometryNodeType,
116
- (node: Node, accessors: NodeStyleAccessors, geometry: NodeGeometry) => void
119
+ (node: NodeInterface, accessors: NodeStyleAccessors, geometry: NodeGeometry) => void
117
120
  > = {
118
121
  circle: (node, accessors, geometry) => {
119
122
  assignDimension(geometry, 'radius', resolveAccessorValue(accessors.getRadius, node));
@@ -158,7 +161,10 @@ export class EdgeAttachmentHelper {
158
161
 
159
162
  const nodeMap = engine
160
163
  .getNodes()
161
- .reduce((acc, node) => acc.set(node.getId(), node), new Map<string | number, Node>());
164
+ .reduce(
165
+ (acc, node) => acc.set(node.getId(), node),
166
+ new Map<string | number, NodeInterface>()
167
+ );
162
168
 
163
169
  return (edge: any) =>
164
170
  this._getAdjustedEdgeLayout(engine, nodeAccessorMap, nodeMap, edge);
@@ -191,9 +197,9 @@ export class EdgeAttachmentHelper {
191
197
  return;
192
198
  }
193
199
 
194
- let stylesheet: GraphStyleEngine | null = null;
200
+ let stylesheet: GraphStylesheetEngine | null = null;
195
201
  try {
196
- stylesheet = new GraphStyleEngine(restStyle as GraphStylesheet, {
202
+ stylesheet = engine.createStylesheetEngine(restStyle as GraphStylesheet, {
197
203
  stateUpdateTrigger: (interactionManager as any).getLastInteraction()
198
204
  });
199
205
  } catch (error) {
@@ -213,7 +219,7 @@ export class EdgeAttachmentHelper {
213
219
  const geometryType = type as GeometryNodeType;
214
220
  const accessors = this._createAccessorsForType(geometryType, stylesheet);
215
221
 
216
- nodes.forEach((node: Node) => {
222
+ nodes.forEach((node: NodeInterface) => {
217
223
  const id = node.getId();
218
224
  if (!nodeAccessorMap.has(id)) {
219
225
  nodeAccessorMap.set(id, accessors);
@@ -227,7 +233,7 @@ export class EdgeAttachmentHelper {
227
233
  private _getAdjustedEdgeLayout(
228
234
  engine: GraphEngine,
229
235
  nodeAccessorMap: Map<string | number, NodeStyleAccessors>,
230
- nodeMap: Map<string | number, Node>,
236
+ nodeMap: Map<string | number, NodeInterface>,
231
237
  edge: any
232
238
  ) {
233
239
  const layoutInfo = engine.getEdgePosition(edge);
@@ -287,7 +293,7 @@ export class EdgeAttachmentHelper {
287
293
 
288
294
  private _createAccessorsForType(
289
295
  geometryType: GeometryNodeType,
290
- stylesheet: GraphStyleEngine
296
+ stylesheet: GraphStylesheetEngine
291
297
  ): NodeStyleAccessors {
292
298
  const base: NodeStyleAccessors = {
293
299
  type: geometryType,
@@ -325,7 +331,7 @@ export class EdgeAttachmentHelper {
325
331
 
326
332
  private _computeNodeGeometry(
327
333
  engine: GraphEngine,
328
- node: Node,
334
+ node: NodeInterface,
329
335
  accessors?: NodeStyleAccessors
330
336
  ): NodeGeometry | null {
331
337
  const basePosition = engine.getNodePosition(node);