@deck.gl-community/graph-layers 9.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (210) hide show
  1. package/LICENSE +20 -0
  2. package/README.md +7 -0
  3. package/dist/core/base-layout.d.ts +71 -0
  4. package/dist/core/base-layout.js +133 -0
  5. package/dist/core/cache.d.ts +14 -0
  6. package/dist/core/cache.js +26 -0
  7. package/dist/core/constants.d.ts +101 -0
  8. package/dist/core/constants.js +48 -0
  9. package/dist/core/edge.d.ts +86 -0
  10. package/dist/core/edge.js +121 -0
  11. package/dist/core/graph-engine.d.ts +54 -0
  12. package/dist/core/graph-engine.js +128 -0
  13. package/dist/core/graph.d.ts +155 -0
  14. package/dist/core/graph.js +301 -0
  15. package/dist/core/interaction-manager.d.ts +40 -0
  16. package/dist/core/interaction-manager.js +169 -0
  17. package/dist/core/node.d.ts +103 -0
  18. package/dist/core/node.js +177 -0
  19. package/dist/index.cjs +3540 -0
  20. package/dist/index.cjs.map +7 -0
  21. package/dist/index.d.ts +19 -0
  22. package/dist/index.js +28 -0
  23. package/dist/layers/common-layers/flow-path-layer/flow-path-layer-fragment.glsl.d.ts +1 -0
  24. package/dist/layers/common-layers/flow-path-layer/flow-path-layer-fragment.glsl.js +49 -0
  25. package/dist/layers/common-layers/flow-path-layer/flow-path-layer-vertex-tf.glsl.d.ts +1 -0
  26. package/dist/layers/common-layers/flow-path-layer/flow-path-layer-vertex-tf.glsl.js +14 -0
  27. package/dist/layers/common-layers/flow-path-layer/flow-path-layer-vertex.glsl.d.ts +1 -0
  28. package/dist/layers/common-layers/flow-path-layer/flow-path-layer-vertex.glsl.js +73 -0
  29. package/dist/layers/common-layers/flow-path-layer/flow-path-layer.d.ts +20 -0
  30. package/dist/layers/common-layers/flow-path-layer/flow-path-layer.js +133 -0
  31. package/dist/layers/common-layers/marker-layer/atlas-data-url.d.ts +3 -0
  32. package/dist/layers/common-layers/marker-layer/atlas-data-url.js +8 -0
  33. package/dist/layers/common-layers/marker-layer/marker-layer.d.ts +13 -0
  34. package/dist/layers/common-layers/marker-layer/marker-layer.js +29 -0
  35. package/dist/layers/common-layers/marker-layer/marker-list.d.ts +62 -0
  36. package/dist/layers/common-layers/marker-layer/marker-list.js +67 -0
  37. package/dist/layers/common-layers/marker-layer/marker-mapping.d.ts +422 -0
  38. package/dist/layers/common-layers/marker-layer/marker-mapping.js +427 -0
  39. package/dist/layers/common-layers/spline-layer/spline-layer.d.ts +24 -0
  40. package/dist/layers/common-layers/spline-layer/spline-layer.js +68 -0
  41. package/dist/layers/common-layers/zoomable-text-layer/zoomable-text-layer.d.ts +16 -0
  42. package/dist/layers/common-layers/zoomable-text-layer/zoomable-text-layer.js +65 -0
  43. package/dist/layers/edge-layer.d.ts +25 -0
  44. package/dist/layers/edge-layer.js +75 -0
  45. package/dist/layers/edge-layers/curved-edge-layer.d.ts +6 -0
  46. package/dist/layers/edge-layers/curved-edge-layer.js +69 -0
  47. package/dist/layers/edge-layers/edge-label-layer.d.ts +6 -0
  48. package/dist/layers/edge-layers/edge-label-layer.js +42 -0
  49. package/dist/layers/edge-layers/flow-layer.d.ts +6 -0
  50. package/dist/layers/edge-layers/flow-layer.js +28 -0
  51. package/dist/layers/edge-layers/path-edge-layer.d.ts +6 -0
  52. package/dist/layers/edge-layers/path-edge-layer.js +27 -0
  53. package/dist/layers/edge-layers/straight-line-edge-layer.d.ts +6 -0
  54. package/dist/layers/edge-layers/straight-line-edge-layer.js +26 -0
  55. package/dist/layers/graph-layer.d.ts +32 -0
  56. package/dist/layers/graph-layer.js +193 -0
  57. package/dist/layers/node-layers/circle-layer.d.ts +6 -0
  58. package/dist/layers/node-layers/circle-layer.js +23 -0
  59. package/dist/layers/node-layers/image-layer.d.ts +6 -0
  60. package/dist/layers/node-layers/image-layer.js +23 -0
  61. package/dist/layers/node-layers/label-layer.d.ts +6 -0
  62. package/dist/layers/node-layers/label-layer.js +23 -0
  63. package/dist/layers/node-layers/path-rounded-rectange-layer.d.ts +6 -0
  64. package/dist/layers/node-layers/path-rounded-rectange-layer.js +46 -0
  65. package/dist/layers/node-layers/rectangle-layer.d.ts +6 -0
  66. package/dist/layers/node-layers/rectangle-layer.js +49 -0
  67. package/dist/layers/node-layers/rounded-rectangle-layer-fragment.d.ts +1 -0
  68. package/dist/layers/node-layers/rounded-rectangle-layer-fragment.js +30 -0
  69. package/dist/layers/node-layers/rounded-rectangle-layer.d.ts +8 -0
  70. package/dist/layers/node-layers/rounded-rectangle-layer.js +28 -0
  71. package/dist/layers/node-layers/zoomable-marker-layer.d.ts +10 -0
  72. package/dist/layers/node-layers/zoomable-marker-layer.js +40 -0
  73. package/dist/layouts/d3-force/d3-force-layout.d.ts +24 -0
  74. package/dist/layouts/d3-force/d3-force-layout.js +116 -0
  75. package/dist/layouts/d3-force/worker.d.ts +0 -0
  76. package/dist/layouts/d3-force/worker.js +46 -0
  77. package/dist/layouts/gpu-force/gpu-force-layout.d.ts +30 -0
  78. package/dist/layouts/gpu-force/gpu-force-layout.js +232 -0
  79. package/dist/layouts/gpu-force/worker.d.ts +0 -0
  80. package/dist/layouts/gpu-force/worker.js +116 -0
  81. package/dist/layouts/simple-layout/simple-layout.d.ts +22 -0
  82. package/dist/layouts/simple-layout/simple-layout.js +64 -0
  83. package/dist/loaders/edge-parsers.d.ts +6 -0
  84. package/dist/loaders/edge-parsers.js +17 -0
  85. package/dist/loaders/json-loader.d.ts +7 -0
  86. package/dist/loaders/json-loader.js +16 -0
  87. package/dist/loaders/node-parsers.d.ts +3 -0
  88. package/dist/loaders/node-parsers.js +11 -0
  89. package/dist/style/style-property.d.ts +14 -0
  90. package/dist/style/style-property.js +195 -0
  91. package/dist/style/style-sheet.d.ts +10 -0
  92. package/dist/style/style-sheet.js +252 -0
  93. package/dist/utils/create-graph.d.ts +8 -0
  94. package/dist/utils/create-graph.js +33 -0
  95. package/dist/utils/layer-utils.d.ts +1 -0
  96. package/dist/utils/layer-utils.js +20 -0
  97. package/dist/utils/log.d.ts +2 -0
  98. package/dist/utils/log.js +6 -0
  99. package/dist/utils/polygon-calculations.d.ts +1 -0
  100. package/dist/utils/polygon-calculations.js +102 -0
  101. package/package.json +55 -0
  102. package/src/core/base-layout.ts +154 -0
  103. package/src/core/cache.ts +31 -0
  104. package/src/core/constants.ts +58 -0
  105. package/src/core/edge.ts +145 -0
  106. package/src/core/graph-engine.ts +170 -0
  107. package/src/core/graph.ts +342 -0
  108. package/src/core/interaction-manager.ts +225 -0
  109. package/src/core/node.ts +205 -0
  110. package/src/index.ts +42 -0
  111. package/src/layers/common-layers/flow-path-layer/flow-path-layer-fragment.glsl.ts +50 -0
  112. package/src/layers/common-layers/flow-path-layer/flow-path-layer-vertex-tf.glsl.ts +15 -0
  113. package/src/layers/common-layers/flow-path-layer/flow-path-layer-vertex.glsl.ts +74 -0
  114. package/src/layers/common-layers/flow-path-layer/flow-path-layer.ts +154 -0
  115. package/src/layers/common-layers/marker-layer/atlas-data-url.ts +10 -0
  116. package/src/layers/common-layers/marker-layer/marker-atlas.png +0 -0
  117. package/src/layers/common-layers/marker-layer/marker-layer.ts +36 -0
  118. package/src/layers/common-layers/marker-layer/marker-list.ts +68 -0
  119. package/src/layers/common-layers/marker-layer/marker-mapping.ts +428 -0
  120. package/src/layers/common-layers/marker-layer/markers/bell-filled.png +0 -0
  121. package/src/layers/common-layers/marker-layer/markers/bell.png +0 -0
  122. package/src/layers/common-layers/marker-layer/markers/bookmark-filled.png +0 -0
  123. package/src/layers/common-layers/marker-layer/markers/bookmark.png +0 -0
  124. package/src/layers/common-layers/marker-layer/markers/cd-filled.png +0 -0
  125. package/src/layers/common-layers/marker-layer/markers/cd.png +0 -0
  126. package/src/layers/common-layers/marker-layer/markers/checkmark.png +0 -0
  127. package/src/layers/common-layers/marker-layer/markers/circle-check-filled.png +0 -0
  128. package/src/layers/common-layers/marker-layer/markers/circle-check.png +0 -0
  129. package/src/layers/common-layers/marker-layer/markers/circle-filled.png +0 -0
  130. package/src/layers/common-layers/marker-layer/markers/circle-i-filled.png +0 -0
  131. package/src/layers/common-layers/marker-layer/markers/circle-i.png +0 -0
  132. package/src/layers/common-layers/marker-layer/markers/circle-minus-filled.png +0 -0
  133. package/src/layers/common-layers/marker-layer/markers/circle-minus.png +0 -0
  134. package/src/layers/common-layers/marker-layer/markers/circle-plus-filled.png +0 -0
  135. package/src/layers/common-layers/marker-layer/markers/circle-plus.png +0 -0
  136. package/src/layers/common-layers/marker-layer/markers/circle-questionmark-filled.png +0 -0
  137. package/src/layers/common-layers/marker-layer/markers/circle-questionmark.png +0 -0
  138. package/src/layers/common-layers/marker-layer/markers/circle-slash-filled.png +0 -0
  139. package/src/layers/common-layers/marker-layer/markers/circle-slash.png +0 -0
  140. package/src/layers/common-layers/marker-layer/markers/circle-x-filled.png +0 -0
  141. package/src/layers/common-layers/marker-layer/markers/circle-x.png +0 -0
  142. package/src/layers/common-layers/marker-layer/markers/circle.png +0 -0
  143. package/src/layers/common-layers/marker-layer/markers/diamond-filled.png +0 -0
  144. package/src/layers/common-layers/marker-layer/markers/diamond.png +0 -0
  145. package/src/layers/common-layers/marker-layer/markers/flag-filled.png +0 -0
  146. package/src/layers/common-layers/marker-layer/markers/flag.png +0 -0
  147. package/src/layers/common-layers/marker-layer/markers/gear.png +0 -0
  148. package/src/layers/common-layers/marker-layer/markers/heart-filled.png +0 -0
  149. package/src/layers/common-layers/marker-layer/markers/heart.png +0 -0
  150. package/src/layers/common-layers/marker-layer/markers/location-marker-filled.png +0 -0
  151. package/src/layers/common-layers/marker-layer/markers/location-marker.png +0 -0
  152. package/src/layers/common-layers/marker-layer/markers/octagonal-star-filled.png +0 -0
  153. package/src/layers/common-layers/marker-layer/markers/octagonal-star.png +0 -0
  154. package/src/layers/common-layers/marker-layer/markers/person-filled.png +0 -0
  155. package/src/layers/common-layers/marker-layer/markers/person.png +0 -0
  156. package/src/layers/common-layers/marker-layer/markers/pin-filled.png +0 -0
  157. package/src/layers/common-layers/marker-layer/markers/pin.png +0 -0
  158. package/src/layers/common-layers/marker-layer/markers/plus-small.png +0 -0
  159. package/src/layers/common-layers/marker-layer/markers/plus.png +0 -0
  160. package/src/layers/common-layers/marker-layer/markers/rectangle-filled.png +0 -0
  161. package/src/layers/common-layers/marker-layer/markers/rectangle.png +0 -0
  162. package/src/layers/common-layers/marker-layer/markers/star-filled.png +0 -0
  163. package/src/layers/common-layers/marker-layer/markers/star.png +0 -0
  164. package/src/layers/common-layers/marker-layer/markers/tag-filled.png +0 -0
  165. package/src/layers/common-layers/marker-layer/markers/tag.png +0 -0
  166. package/src/layers/common-layers/marker-layer/markers/thumb-down-filled.png +0 -0
  167. package/src/layers/common-layers/marker-layer/markers/thumb-down.png +0 -0
  168. package/src/layers/common-layers/marker-layer/markers/thumb-up.png +0 -0
  169. package/src/layers/common-layers/marker-layer/markers/thumb_up-filled.png +0 -0
  170. package/src/layers/common-layers/marker-layer/markers/triangle-down-filled.png +0 -0
  171. package/src/layers/common-layers/marker-layer/markers/triangle-down.png +0 -0
  172. package/src/layers/common-layers/marker-layer/markers/triangle-left-filled.png +0 -0
  173. package/src/layers/common-layers/marker-layer/markers/triangle-left.png +0 -0
  174. package/src/layers/common-layers/marker-layer/markers/triangle-right-filled.png +0 -0
  175. package/src/layers/common-layers/marker-layer/markers/triangle-right.png +0 -0
  176. package/src/layers/common-layers/marker-layer/markers/triangle-up-filled.png +0 -0
  177. package/src/layers/common-layers/marker-layer/markers/triangle-up.png +0 -0
  178. package/src/layers/common-layers/marker-layer/markers/x-small.png +0 -0
  179. package/src/layers/common-layers/marker-layer/markers/x.png +0 -0
  180. package/src/layers/common-layers/spline-layer/spline-layer.ts +83 -0
  181. package/src/layers/common-layers/zoomable-text-layer/zoomable-text-layer.ts +90 -0
  182. package/src/layers/edge-layer.ts +88 -0
  183. package/src/layers/edge-layers/curved-edge-layer.ts +88 -0
  184. package/src/layers/edge-layers/edge-label-layer.ts +48 -0
  185. package/src/layers/edge-layers/flow-layer.ts +34 -0
  186. package/src/layers/edge-layers/path-edge-layer.ts +39 -0
  187. package/src/layers/edge-layers/straight-line-edge-layer.ts +38 -0
  188. package/src/layers/graph-layer.ts +225 -0
  189. package/src/layers/node-layers/circle-layer.ts +29 -0
  190. package/src/layers/node-layers/image-layer.ts +29 -0
  191. package/src/layers/node-layers/label-layer.ts +29 -0
  192. package/src/layers/node-layers/path-rounded-rectange-layer.ts +56 -0
  193. package/src/layers/node-layers/rectangle-layer.ts +58 -0
  194. package/src/layers/node-layers/rounded-rectangle-layer-fragment.ts +31 -0
  195. package/src/layers/node-layers/rounded-rectangle-layer.ts +32 -0
  196. package/src/layers/node-layers/zoomable-marker-layer.ts +49 -0
  197. package/src/layouts/d3-force/d3-force-layout.ts +145 -0
  198. package/src/layouts/d3-force/worker.ts +61 -0
  199. package/src/layouts/gpu-force/gpu-force-layout.ts +249 -0
  200. package/src/layouts/gpu-force/worker.ts +137 -0
  201. package/src/layouts/simple-layout/simple-layout.ts +87 -0
  202. package/src/loaders/edge-parsers.ts +21 -0
  203. package/src/loaders/json-loader.ts +19 -0
  204. package/src/loaders/node-parsers.ts +13 -0
  205. package/src/style/style-property.ts +229 -0
  206. package/src/style/style-sheet.ts +277 -0
  207. package/src/utils/create-graph.ts +38 -0
  208. package/src/utils/layer-utils.ts +23 -0
  209. package/src/utils/log.ts +9 -0
  210. package/src/utils/polygon-calculations.ts +154 -0
@@ -0,0 +1,229 @@
1
+ // deck.gl-community
2
+ // SPDX-License-Identifier: MIT
3
+ // Copyright (c) vis.gl contributors
4
+
5
+ import Color from 'color';
6
+ import {log} from '../utils/log';
7
+
8
+ /* Utils for type check */
9
+ function getColor(value) {
10
+ if (typeof value === 'string') {
11
+ try {
12
+ const color = Color.rgb(value).array();
13
+ if (Number.isFinite(color[3])) {
14
+ color[3] *= 255;
15
+ }
16
+ return color;
17
+ } catch (error) {
18
+ return [0, 0, 0];
19
+ }
20
+ }
21
+ if (Array.isArray(value) && Number.isFinite(value[0])) {
22
+ return value;
23
+ }
24
+ return [0, 0, 0];
25
+ }
26
+
27
+ function getNumber(value) {
28
+ switch (typeof value) {
29
+ case 'string':
30
+ value = Number(value);
31
+ return isNaN(value) ? null : value;
32
+
33
+ case 'number':
34
+ return value;
35
+
36
+ default:
37
+ return null;
38
+ }
39
+ }
40
+
41
+ function getBool(value) {
42
+ switch (typeof value) {
43
+ case 'boolean':
44
+ return value;
45
+
46
+ case 'string':
47
+ return value.toLowerCase() !== 'false';
48
+
49
+ case 'number':
50
+ return Boolean(value);
51
+
52
+ default:
53
+ return null;
54
+ }
55
+ }
56
+
57
+ function getOffset(value) {
58
+ if (typeof value === 'function') {
59
+ return value;
60
+ }
61
+
62
+ if (!Array.isArray(value) || value.length !== 2) {
63
+ return null;
64
+ }
65
+ return value.map(getNumber);
66
+ }
67
+
68
+ const IDENTITY = (x) => x;
69
+ const PROPERTY_FORMATTERS = {
70
+ opacity: getNumber,
71
+ zIndex: getNumber,
72
+
73
+ width: getNumber,
74
+ height: getNumber,
75
+ radius: getNumber,
76
+
77
+ fill: getColor,
78
+ stroke: getColor,
79
+ strokeWidth: getNumber,
80
+
81
+ // for marker
82
+ marker: String,
83
+ size: getNumber,
84
+
85
+ // text
86
+ color: getColor,
87
+ text: String,
88
+ fontSize: getNumber,
89
+ textAnchor: String,
90
+ alignmentBaseline: String,
91
+ angle: getNumber,
92
+ textMaxWidth: getNumber,
93
+ textWordBreak: String,
94
+ textSizeMinPixels: getNumber,
95
+
96
+ // edges
97
+ speed: getNumber,
98
+ tailLength: getNumber,
99
+
100
+ offset: getOffset,
101
+ scaleWithZoom: getBool
102
+ };
103
+
104
+ const DEFAULT_STYLES = {
105
+ opacity: 1,
106
+ zIndex: 0,
107
+
108
+ width: 0,
109
+ height: 0,
110
+ radius: 1,
111
+
112
+ fill: [0, 0, 0],
113
+ stroke: [0, 0, 0],
114
+ strokeWidth: 0,
115
+
116
+ marker: 'circle',
117
+ size: 12,
118
+
119
+ color: [0, 0, 0],
120
+ text: '',
121
+ fontSize: 12,
122
+ textAnchor: 'middle',
123
+ alignmentBaseline: 'center',
124
+ angle: 0,
125
+ textMaxWidth: -1,
126
+ textWordBreak: 'break-all',
127
+ textSizeMinPixels: 9,
128
+
129
+ speed: 0,
130
+ tailLength: 1,
131
+
132
+ offset: null,
133
+ scaleWithZoom: true
134
+ };
135
+
136
+ // code generation: generate a function as a layer accessor
137
+ function generateAccessor(key, value) {
138
+ const formatter = PROPERTY_FORMATTERS[key] || IDENTITY;
139
+ // ex: key = 'fill', value = {defaut: 'red', hover: 'blue'}
140
+ // valueMap => {defaut: [255, 0, 0], hover: [0, 0, 255]}
141
+ const valueMap = Object.keys(value).reduce((res, key0) => {
142
+ res[key0] = value[key0];
143
+ return res;
144
+ }, {}) as any;
145
+
146
+ return (node) => {
147
+ const statefulValue = valueMap[node.state];
148
+ if (!node.state || typeof statefulValue === 'undefined') {
149
+ return valueMap.default || DEFAULT_STYLES[key];
150
+ }
151
+ // else has stateful value
152
+ // check if the value is a function
153
+ if (typeof statefulValue === 'function') {
154
+ return formatter(statefulValue(node));
155
+ }
156
+ // or just a plain value
157
+ return formatter(statefulValue);
158
+ };
159
+ }
160
+
161
+ const VALUE_TYPE = {
162
+ ACCESSOR: 'ACCESSOR',
163
+ PLAIN_VALUE: 'PLAIN_VALUE'
164
+ };
165
+
166
+ export class StyleProperty {
167
+ key: any;
168
+ _updateTrigger: boolean;
169
+ _value: any;
170
+ _valueType: any;
171
+
172
+ // for getting default style
173
+ static getDefault(key) {
174
+ return DEFAULT_STYLES[key];
175
+ }
176
+
177
+ // pass the key and value of the property
178
+ // and format the value properly.
179
+ constructor({key, value, updateTrigger}) {
180
+ this.key = key;
181
+ this._updateTrigger = false;
182
+
183
+ // statefule property, ex:
184
+ // fill: {default: 'red', hover: 'blue'}
185
+ // note that offset: [0, 1], the type of array is object, too.
186
+ if (typeof value === 'object' && !Array.isArray(value)) {
187
+ // generate accessor function
188
+ this._value = generateAccessor(key, value);
189
+ this._valueType = VALUE_TYPE.ACCESSOR;
190
+ this._updateTrigger = updateTrigger;
191
+ }
192
+ // default state property, but value = accessor
193
+ // fill: () => 'red'
194
+ else if (typeof value === 'function') {
195
+ const formatter = PROPERTY_FORMATTERS[key] || IDENTITY;
196
+ // the output of the function should be formated by
197
+ // the corresponding formatter again.
198
+ // Ex: colorAccessor might return '#f00', which needs to
199
+ // be formated as [255, 0, 0];
200
+ this._value = (d) => formatter(value(d));
201
+ this._valueType = VALUE_TYPE.ACCESSOR;
202
+ this._updateTrigger = value;
203
+ }
204
+ // default state property with plain value:
205
+ // fill: 'red'
206
+ else {
207
+ // format the value properly
208
+ const formatter = PROPERTY_FORMATTERS[key] || IDENTITY;
209
+ this._value = formatter(value);
210
+ this._valueType = VALUE_TYPE.PLAIN_VALUE;
211
+ this._updateTrigger = false;
212
+ }
213
+
214
+ // sanity check
215
+ if (this._value === null) {
216
+ log.warn(`Invalid ${key} value: ${value}`)();
217
+ throw new Error(`Invalid ${key} value: ${value}`);
218
+ }
219
+ }
220
+
221
+ // get the formatted value
222
+ getValue() {
223
+ return this._value;
224
+ }
225
+
226
+ getUpdateTrigger() {
227
+ return this._updateTrigger;
228
+ }
229
+ }
@@ -0,0 +1,277 @@
1
+ // deck.gl-community
2
+ // SPDX-License-Identifier: MIT
3
+ // Copyright (c) vis.gl contributors
4
+
5
+ import {StyleProperty} from './style-property';
6
+
7
+ import {NODE_TYPE, EDGE_DECORATOR_TYPE} from '../core/constants';
8
+ import {log} from '../utils/log';
9
+
10
+ const COMMON_DECKGL_PROPS = {
11
+ getOffset: 'offset',
12
+ opacity: 'opacity'
13
+ };
14
+
15
+ const DECKGL_ACCESSOR_MAP = {
16
+ [NODE_TYPE.CIRCLE]: {
17
+ ...COMMON_DECKGL_PROPS,
18
+ getFillColor: 'fill',
19
+ getLineColor: 'stroke',
20
+ getLineWidth: 'strokeWidth',
21
+ getRadius: 'radius'
22
+ },
23
+
24
+ [NODE_TYPE.RECTANGLE]: {
25
+ ...COMMON_DECKGL_PROPS,
26
+ getWidth: 'width',
27
+ getHeight: 'height',
28
+ getFillColor: 'fill',
29
+ getLineColor: 'stroke',
30
+ getLineWidth: 'strokeWidth'
31
+ },
32
+
33
+ [NODE_TYPE.ROUNDED_RECTANGLE]: {
34
+ ...COMMON_DECKGL_PROPS,
35
+ getCornerRadius: 'cornerRadius',
36
+ getRadius: 'radius',
37
+ getWidth: 'width',
38
+ getHeight: 'height',
39
+ getFillColor: 'fill',
40
+ getLineColor: 'stroke',
41
+ getLineWidth: 'strokeWidth'
42
+ },
43
+
44
+ [NODE_TYPE.PATH_ROUNDED_RECTANGLE]: {
45
+ ...COMMON_DECKGL_PROPS,
46
+ getWidth: 'width',
47
+ getHeight: 'height',
48
+ getFillColor: 'fill',
49
+ getLineColor: 'stroke',
50
+ getLineWidth: 'strokeWidth',
51
+ getCornerRadius: 'cornerRadius'
52
+ },
53
+
54
+ [NODE_TYPE.LABEL]: {
55
+ ...COMMON_DECKGL_PROPS,
56
+ getColor: 'color',
57
+ getText: 'text',
58
+ getSize: 'fontSize',
59
+ getTextAnchor: 'textAnchor',
60
+ getAlignmentBaseline: 'alignmentBaseline',
61
+ getAngle: 'angle',
62
+ scaleWithZoom: 'scaleWithZoom',
63
+ textMaxWidth: 'textMaxWidth',
64
+ textWordBreak: 'textWordBreak',
65
+ textSizeMinPixels: 'textSizeMinPixels'
66
+ },
67
+
68
+ [NODE_TYPE.MARKER]: {
69
+ ...COMMON_DECKGL_PROPS,
70
+ getColor: 'fill',
71
+ getSize: 'size',
72
+ getMarker: 'marker',
73
+ scaleWithZoom: 'scaleWithZoom'
74
+ },
75
+
76
+ // --------- Edge related ---------
77
+ Edge: {
78
+ getColor: 'stroke',
79
+ getWidth: 'strokeWidth'
80
+ },
81
+ [EDGE_DECORATOR_TYPE.LABEL]: {
82
+ getColor: 'color',
83
+ getText: 'text',
84
+ getSize: 'fontSize',
85
+ getTextAnchor: 'textAnchor',
86
+ getAlignmentBaseline: 'alignmentBaseline',
87
+ scaleWithZoom: 'scaleWithZoom',
88
+ textMaxWidth: 'textMaxWidth',
89
+ textWordBreak: 'textWordBreak',
90
+ textSizeMinPixels: 'textSizeMinPixels'
91
+ },
92
+ [EDGE_DECORATOR_TYPE.FLOW]: {
93
+ getColor: 'color',
94
+ getWidth: 'width',
95
+ getSpeed: 'speed',
96
+ getTailLength: 'tailLength'
97
+ }
98
+ };
99
+
100
+ const DECKGL_UPDATE_TRIGGERS = {
101
+ [NODE_TYPE.CIRCLE]: ['getFillColor', 'getRadius', 'getLineColor', 'getLineWidth'],
102
+ [NODE_TYPE.RECTANGLE]: ['getFillColor', 'getLineColor', 'getLineWidth'],
103
+ [NODE_TYPE.ROUNDED_RECTANGLE]: [
104
+ 'getFillColor',
105
+ 'getLineColor',
106
+ 'getLineWidth',
107
+ 'getCornerRadius'
108
+ ],
109
+ [NODE_TYPE.PATH_ROUNDED_RECTANGLE]: [
110
+ 'getFillColor',
111
+ 'getLineColor',
112
+ 'getLineWidth',
113
+ 'getCornerRadius'
114
+ ],
115
+ [NODE_TYPE.LABEL]: [
116
+ 'getColor',
117
+ 'getText',
118
+ 'getSize',
119
+ 'getTextAnchor',
120
+ 'getAlignmentBaseline',
121
+ 'getAngle'
122
+ ],
123
+ [NODE_TYPE.MARKER]: ['getColor', 'getSize', 'getMarker'],
124
+ Edge: ['getColor', 'getWidth'],
125
+ [EDGE_DECORATOR_TYPE.LABEL]: [
126
+ 'getColor',
127
+ 'getText',
128
+ 'getSize',
129
+ 'getTextAnchor',
130
+ 'getAlignmentBaseline'
131
+ ],
132
+ [EDGE_DECORATOR_TYPE.FLOW]: ['getColor', 'getWidth', 'getSpeed', 'getTailLength']
133
+ };
134
+
135
+ export class Stylesheet {
136
+ type: any;
137
+ properties: any;
138
+ constructor(style, updateTriggers) {
139
+ const {type: layerType, ...restStyle} = style;
140
+ if (!layerType || !(layerType in DECKGL_ACCESSOR_MAP)) {
141
+ throw new Error(`illegal type: ${layerType}`);
142
+ }
143
+ this.type = layerType;
144
+
145
+ // style = {
146
+ // type: 'circle',
147
+ // fill: 'red'
148
+ // radius: 5,
149
+ //
150
+ // ':hover': {
151
+ // fill: 'blue',
152
+ // stroke: 'red'
153
+ // }
154
+ // };
155
+ // step 1: extract 'rules': default, hover
156
+ // default: {fill: 'red', radius: 5};
157
+ // hover: {fill: 'blue', stroke: 'red'};
158
+ const rules = Object.keys(restStyle).reduce(
159
+ (res, key) => {
160
+ const isSelector = key.startsWith(':');
161
+ if (isSelector) {
162
+ const state = key.substring(1);
163
+ res[state] = restStyle[key];
164
+ return res;
165
+ }
166
+ res.default[key] = restStyle[key];
167
+ return res;
168
+ },
169
+ {
170
+ default: {}
171
+ }
172
+ );
173
+
174
+ // step 2: extract all unique attributes from rules
175
+ // attributes: ['fill', 'radius', 'stroke']
176
+ const attributes = Object.values(rules).reduce((res, rule) => {
177
+ const attrs = Object.keys(rule);
178
+ const set = new Set([...(res as any), ...attrs]);
179
+ return Array.from(set);
180
+ }, []);
181
+ // step 3: create a attribute map as:
182
+ // attrMap = {
183
+ // fill: {default: 'red', hover: 'blue'},
184
+ // radius: {default: 5},
185
+ // stroke: {hover: 'red'},
186
+ // }
187
+ const attrMap = (attributes as any).reduce((res, attr) => {
188
+ res[attr] = Object.entries(rules).reduce((acc, entry) => {
189
+ const [state, rule] = entry;
190
+ if (typeof rule[attr] !== 'undefined') {
191
+ acc[state] = rule[attr];
192
+ }
193
+ return acc;
194
+ }, {});
195
+ return res;
196
+ }, {});
197
+
198
+ // step 4: simplify the attribute map if only default exists for the attribute
199
+ // simplifiedStyleMap = {
200
+ // fill: {default: 'red', hover: 'blue'},
201
+ // radius: 5,
202
+ // stroke: {hover: 'red'},
203
+ // }
204
+ const simplifiedStyleMap = Object.entries(attrMap).reduce((res, entry) => {
205
+ const [attr, valueMap] = entry as any;
206
+ const onlyDefault = Object.keys(valueMap).length === 1 && valueMap.default !== undefined;
207
+ if (onlyDefault) {
208
+ res[attr] = valueMap.default;
209
+ return res;
210
+ }
211
+ res[attr] = valueMap;
212
+ return res;
213
+ }, {});
214
+
215
+ // step 5: create style property
216
+ // if the propety only maps to default state => return value only
217
+ // if the property maps to other states => return accessor function
218
+
219
+ // start to parse properties
220
+ this.properties = {};
221
+ for (const key in simplifiedStyleMap) {
222
+ this.properties[key] = new StyleProperty({
223
+ key,
224
+ value: simplifiedStyleMap[key],
225
+ updateTrigger: updateTriggers.stateUpdateTrigger
226
+ });
227
+ }
228
+ }
229
+
230
+ _getProperty(deckglAccessor) {
231
+ const map = DECKGL_ACCESSOR_MAP[this.type];
232
+ if (!map) {
233
+ throw new Error(`illegal type: ${this.type}`);
234
+ }
235
+ const styleProp = map[deckglAccessor];
236
+ if (!styleProp) {
237
+ log.error(`Invalid DeckGL accessor: ${deckglAccessor}`)();
238
+ throw new Error(`Invalid DeckGL accessor: ${deckglAccessor}`);
239
+ }
240
+ return this.properties[styleProp];
241
+ }
242
+
243
+ getDeckGLAccessor(deckglAccessor) {
244
+ const property = this._getProperty(deckglAccessor);
245
+ // get the value
246
+ if (property) {
247
+ return property.getValue();
248
+ }
249
+ // return default value
250
+ const styleProp = DECKGL_ACCESSOR_MAP[this.type][deckglAccessor];
251
+ return StyleProperty.getDefault(styleProp);
252
+ }
253
+
254
+ getDeckGLAccessorUpdateTrigger(deckglAccessor) {
255
+ const property = this._getProperty(deckglAccessor);
256
+ // get the value
257
+ if (property) {
258
+ return property.getUpdateTrigger();
259
+ }
260
+ return false;
261
+ }
262
+
263
+ getDeckGLAccessors() {
264
+ const accessorMap = DECKGL_ACCESSOR_MAP[this.type];
265
+ return Object.keys(accessorMap).reduce((res, accessor) => {
266
+ res[accessor] = this.getDeckGLAccessor(accessor);
267
+ return res;
268
+ }, {});
269
+ }
270
+
271
+ getDeckGLUpdateTriggers() {
272
+ return DECKGL_UPDATE_TRIGGERS[this.type].reduce((res, accessor) => {
273
+ res[accessor] = this.getDeckGLAccessorUpdateTrigger(accessor);
274
+ return res;
275
+ }, {});
276
+ }
277
+ }
@@ -0,0 +1,38 @@
1
+ // deck.gl-community
2
+ // SPDX-License-Identifier: MIT
3
+ // Copyright (c) vis.gl contributors
4
+
5
+ import {Edge} from '../core/edge';
6
+ import {Node} from '../core/node';
7
+ import {Graph} from '../core/graph';
8
+
9
+ export function createGraph({name, nodes, edges, nodeParser, edgeParser}) {
10
+ // create a new empty graph
11
+ const graph = new Graph();
12
+
13
+ const graphName = name || Date.now();
14
+ graph.setGraphName(graphName);
15
+
16
+ // add nodes
17
+ const glNodes = nodes.map((node) => {
18
+ const {id} = nodeParser(node);
19
+ return new Node({
20
+ id,
21
+ data: node
22
+ });
23
+ });
24
+ graph.batchAddNodes(glNodes);
25
+
26
+ const glEdges = edges.map((edge) => {
27
+ const {id, sourceId, targetId, directed} = edgeParser(edge);
28
+ return new Edge({
29
+ id,
30
+ sourceId,
31
+ targetId,
32
+ directed,
33
+ data: edge
34
+ });
35
+ });
36
+ graph.batchAddEdges(glEdges);
37
+ return graph;
38
+ }
@@ -0,0 +1,23 @@
1
+ // deck.gl-community
2
+ // SPDX-License-Identifier: MIT
3
+ // Copyright (c) vis.gl contributors
4
+
5
+ export const mixedGetPosition = (getPosition, getOffset) => {
6
+ if (!getOffset) {
7
+ return getPosition;
8
+ }
9
+
10
+ if (typeof getOffset === 'function') {
11
+ return (d) => {
12
+ const [x, y] = getPosition(d);
13
+ const [offX, offY] = getOffset(d);
14
+ return [x + offX, y + offY];
15
+ };
16
+ }
17
+
18
+ const [offX, offY] = getOffset;
19
+ return (d) => {
20
+ const [x, y] = getPosition(d);
21
+ return [x + offX, y + offY];
22
+ };
23
+ };
@@ -0,0 +1,9 @@
1
+ // deck.gl-community
2
+ // SPDX-License-Identifier: MIT
3
+ // Copyright (c) vis.gl contributors
4
+
5
+ import {Log, COLOR} from 'probe.gl';
6
+
7
+ export const log = new Log({id: 'react-graph-layers'}).enable();
8
+
9
+ log.log({color: COLOR.CYAN}, 'Initialize react-graph-layers logger.')();