@unovis/ts 1.1.1-beta.6 → 1.1.1-beta.7

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 (710) hide show
  1. package/declaration.d.ts +1 -0
  2. package/index.ts +1 -0
  3. package/licences.txt +43 -0
  4. package/maps.ts +1 -0
  5. package/package.json +1 -1
  6. package/rollup.config.js +71 -0
  7. package/rules/ts-getter-setter.js +35 -0
  8. package/src/components/area/config.ts +29 -0
  9. package/src/components/area/index.ts +133 -0
  10. package/{components/area/style.js → src/components/area/style.ts} +9 -10
  11. package/src/components/area/types.ts +2 -0
  12. package/src/components/axis/config.ts +76 -0
  13. package/src/components/axis/index.ts +363 -0
  14. package/{components/axis/style.js → src/components/axis/style.ts} +27 -22
  15. package/src/components/axis/types.ts +4 -0
  16. package/src/components/brush/config.ts +51 -0
  17. package/src/components/brush/index.ts +233 -0
  18. package/{components/brush/style.js → src/components/brush/style.ts} +15 -14
  19. package/src/components/brush/types.ts +8 -0
  20. package/src/components/bullet-legend/config.ts +38 -0
  21. package/src/components/bullet-legend/index.ts +104 -0
  22. package/{components/bullet-legend/style.js → src/components/bullet-legend/style.ts} +18 -16
  23. package/src/components/bullet-legend/types.ts +7 -0
  24. package/src/components/chord-diagram/config.ts +53 -0
  25. package/src/components/chord-diagram/index.ts +401 -0
  26. package/src/components/chord-diagram/modules/label.ts +155 -0
  27. package/src/components/chord-diagram/modules/link.ts +91 -0
  28. package/src/components/chord-diagram/modules/node.ts +80 -0
  29. package/{components/chord-diagram/style.js → src/components/chord-diagram/style.ts} +39 -30
  30. package/src/components/chord-diagram/types.ts +68 -0
  31. package/src/components/crosshair/config.ts +48 -0
  32. package/src/components/crosshair/index.ts +220 -0
  33. package/{components/crosshair/style.js → src/components/crosshair/style.ts} +12 -12
  34. package/src/components/crosshair/types.ts +15 -0
  35. package/src/components/donut/config.ts +65 -0
  36. package/src/components/donut/index.ts +148 -0
  37. package/src/components/donut/modules/arc.ts +86 -0
  38. package/{components/donut/style.js → src/components/donut/style.ts} +20 -18
  39. package/src/components/donut/types.ts +17 -0
  40. package/src/components/flow-legend/config.ts +31 -0
  41. package/src/components/flow-legend/index.ts +103 -0
  42. package/{components/flow-legend/style.js → src/components/flow-legend/style.ts} +25 -21
  43. package/src/components/flow-legend/types.ts +10 -0
  44. package/src/components/free-brush/config.ts +54 -0
  45. package/src/components/free-brush/index.ts +207 -0
  46. package/{components/free-brush/style.js → src/components/free-brush/style.ts} +12 -12
  47. package/src/components/free-brush/types.ts +8 -0
  48. package/src/components/graph/config.ts +280 -0
  49. package/src/components/graph/index.ts +809 -0
  50. package/src/components/graph/modules/layout-helpers.ts +96 -0
  51. package/src/components/graph/modules/layout.ts +502 -0
  52. package/src/components/graph/modules/link/helper.ts +105 -0
  53. package/src/components/graph/modules/link/index.ts +302 -0
  54. package/{components/graph/modules/link/style.js → src/components/graph/modules/link/style.ts} +45 -34
  55. package/src/components/graph/modules/node/helper.ts +162 -0
  56. package/src/components/graph/modules/node/index.ts +343 -0
  57. package/{components/graph/modules/node/style.js → src/components/graph/modules/node/style.ts} +72 -52
  58. package/src/components/graph/modules/panel/helper.ts +160 -0
  59. package/src/components/graph/modules/panel/index.ts +137 -0
  60. package/{components/graph/modules/panel/style.js → src/components/graph/modules/panel/style.ts} +42 -32
  61. package/src/components/graph/modules/shape.ts +108 -0
  62. package/src/components/graph/modules/zoom-levels.ts +6 -0
  63. package/src/components/graph/style.ts +72 -0
  64. package/src/components/graph/types.ts +152 -0
  65. package/src/components/grouped-bar/config.ts +40 -0
  66. package/src/components/grouped-bar/index.ts +325 -0
  67. package/{components/grouped-bar/style.js → src/components/grouped-bar/style.ts} +15 -14
  68. package/src/components/leaflet-flow-map/config.ts +60 -0
  69. package/src/components/leaflet-flow-map/index.ts +279 -0
  70. package/src/components/leaflet-flow-map/renderer-utils.ts +14 -0
  71. package/src/components/leaflet-flow-map/renderer.ts +146 -0
  72. package/{components/leaflet-flow-map/shaders.js → src/components/leaflet-flow-map/shaders.ts} +4 -7
  73. package/src/components/leaflet-flow-map/types.ts +18 -0
  74. package/src/components/leaflet-map/config.ts +234 -0
  75. package/src/components/leaflet-map/index.ts +808 -0
  76. package/src/components/leaflet-map/leaflet.css +625 -0
  77. package/src/components/leaflet-map/modules/clusterBackground.ts +34 -0
  78. package/src/components/leaflet-map/modules/donut.ts +37 -0
  79. package/src/components/leaflet-map/modules/map.ts +178 -0
  80. package/src/components/leaflet-map/modules/node.ts +208 -0
  81. package/src/components/leaflet-map/modules/selectionRing.ts +63 -0
  82. package/src/components/leaflet-map/modules/utils.ts +290 -0
  83. package/{components → src/components}/leaflet-map/renderer/leaflet-maplibre-gl.js +76 -78
  84. package/src/components/leaflet-map/renderer/map-style.ts +24 -0
  85. package/src/components/leaflet-map/renderer/mapboxgl/mapboxgl-dark-theme.json +35 -0
  86. package/src/components/leaflet-map/renderer/mapboxgl/mapboxgl-light-theme.json +35 -0
  87. package/src/components/leaflet-map/renderer/mapboxgl/mapboxgl-settings.json +2185 -0
  88. package/src/components/leaflet-map/renderer/mapboxgl-layer.ts +43 -0
  89. package/src/components/leaflet-map/renderer/mapboxgl-utils.ts +40 -0
  90. package/{components → src/components}/leaflet-map/renderer/maplibre-gl.css.js +2 -4
  91. package/src/components/leaflet-map/style.ts +217 -0
  92. package/src/components/leaflet-map/types.ts +75 -0
  93. package/src/components/line/config.ts +34 -0
  94. package/src/components/line/index.ts +188 -0
  95. package/{components/line/style.js → src/components/line/style.ts} +18 -16
  96. package/src/components/line/types.ts +3 -0
  97. package/src/components/nested-donut/config.ts +75 -0
  98. package/src/components/nested-donut/index.ts +176 -0
  99. package/src/components/nested-donut/modules/arc.ts +78 -0
  100. package/src/components/nested-donut/modules/label.ts +63 -0
  101. package/src/components/nested-donut/style.ts +82 -0
  102. package/src/components/nested-donut/types.ts +29 -0
  103. package/src/components/sankey/config.ts +195 -0
  104. package/src/components/sankey/index.ts +387 -0
  105. package/src/components/sankey/modules/label.ts +228 -0
  106. package/src/components/sankey/modules/link.ts +141 -0
  107. package/src/components/sankey/modules/node.ts +221 -0
  108. package/{components/sankey/style.js → src/components/sankey/style.ts} +60 -44
  109. package/src/components/sankey/types.ts +95 -0
  110. package/src/components/scatter/config.ts +49 -0
  111. package/src/components/scatter/index.ts +220 -0
  112. package/src/components/scatter/modules/point.ts +123 -0
  113. package/src/components/scatter/modules/utils.ts +150 -0
  114. package/{components/scatter/style.js → src/components/scatter/style.ts} +15 -14
  115. package/src/components/scatter/types.ts +21 -0
  116. package/src/components/stacked-bar/config.ts +42 -0
  117. package/src/components/stacked-bar/index.ts +267 -0
  118. package/{components/stacked-bar/style.js → src/components/stacked-bar/style.ts} +15 -14
  119. package/src/components/stacked-bar/types.ts +5 -0
  120. package/src/components/timeline/config.ts +49 -0
  121. package/src/components/timeline/index.ts +302 -0
  122. package/{components/timeline/style.js → src/components/timeline/style.ts} +39 -30
  123. package/src/components/tooltip/config.ts +69 -0
  124. package/src/components/tooltip/index.ts +220 -0
  125. package/{components → src/components}/tooltip/style.js +11 -14
  126. package/src/components/topojson-map/config.ts +124 -0
  127. package/src/components/topojson-map/index.ts +436 -0
  128. package/{components/topojson-map/style.js → src/components/topojson-map/style.ts} +33 -26
  129. package/src/components/topojson-map/types.ts +123 -0
  130. package/src/components/topojson-map/utils.ts +29 -0
  131. package/src/components/vis-controls/config.ts +16 -0
  132. package/src/components/vis-controls/index.ts +68 -0
  133. package/{components/vis-controls/style.js → src/components/vis-controls/style.ts} +34 -27
  134. package/src/components/vis-controls/types.ts +14 -0
  135. package/src/components/xy-labels/config.ts +56 -0
  136. package/src/components/xy-labels/index.ts +109 -0
  137. package/src/components/xy-labels/modules/label.ts +140 -0
  138. package/{components/xy-labels/style.js → src/components/xy-labels/style.ts} +15 -14
  139. package/src/components/xy-labels/types.ts +26 -0
  140. package/src/components.ts +56 -0
  141. package/src/containers/single-container/config.ts +15 -0
  142. package/src/containers/single-container/index.ts +150 -0
  143. package/src/containers/xy-container/config.ts +112 -0
  144. package/src/containers/xy-container/index.ts +407 -0
  145. package/src/containers.ts +6 -0
  146. package/src/core/component/config.ts +61 -0
  147. package/src/core/component/index.ts +154 -0
  148. package/src/core/component/types.ts +9 -0
  149. package/src/core/config/index.ts +12 -0
  150. package/src/core/container/config.ts +56 -0
  151. package/src/core/container/index.ts +136 -0
  152. package/src/core/xy-component/config.ts +46 -0
  153. package/src/core/xy-component/index.ts +90 -0
  154. package/src/data-models/core.ts +15 -0
  155. package/src/data-models/graph.ts +138 -0
  156. package/src/data-models/map-graph.ts +72 -0
  157. package/src/data-models/map.ts +18 -0
  158. package/src/data-models/series.ts +16 -0
  159. package/src/index.ts +7 -0
  160. package/src/maps/china-provinces.json +1 -0
  161. package/src/maps/fr-regions.json +1 -0
  162. package/src/maps/germany-regions.json +1 -0
  163. package/src/maps/ind-regions.json +1 -0
  164. package/src/maps/uk-regions.json +1 -0
  165. package/src/maps/us-counties.json +1 -0
  166. package/src/maps/us-states.json +1 -0
  167. package/src/maps/world-110m-alpha.json +1 -0
  168. package/src/maps/world-simple.json +1 -0
  169. package/src/maps/world-simplest.json +1 -0
  170. package/src/maps.ts +34 -0
  171. package/src/styles/colors.ts +28 -0
  172. package/src/styles/index.ts +38 -0
  173. package/{styles/sizes.js → src/styles/sizes.ts} +6 -8
  174. package/src/types/accessor.ts +5 -0
  175. package/src/types/component.ts +15 -0
  176. package/src/types/curve.ts +62 -0
  177. package/src/types/data.ts +5 -0
  178. package/src/types/direction.ts +6 -0
  179. package/src/types/graph.ts +40 -0
  180. package/src/types/map.ts +5 -0
  181. package/src/types/misc.ts +10 -0
  182. package/src/types/position.ts +23 -0
  183. package/src/types/scale.ts +47 -0
  184. package/src/types/shape.ts +7 -0
  185. package/src/types/spacing.ts +6 -0
  186. package/src/types/svg.ts +32 -0
  187. package/src/types/symbol.ts +21 -0
  188. package/src/types/text.ts +71 -0
  189. package/src/types.ts +31 -0
  190. package/src/utils/color.ts +41 -0
  191. package/src/utils/d3.ts +15 -0
  192. package/src/utils/data.ts +328 -0
  193. package/src/utils/html.ts +13 -0
  194. package/src/utils/map.ts +29 -0
  195. package/src/utils/misc.ts +54 -0
  196. package/src/utils/path.ts +196 -0
  197. package/src/utils/scale.ts +1 -0
  198. package/src/utils/style.ts +37 -0
  199. package/src/utils/svg.ts +49 -0
  200. package/src/utils/text.ts +529 -0
  201. package/src/utils/type.ts +9 -0
  202. package/tsconfig.json +29 -0
  203. package/components/area/config.d.ts +0 -25
  204. package/components/area/config.js +0 -16
  205. package/components/area/config.js.map +0 -1
  206. package/components/area/index.d.ts +0 -19
  207. package/components/area/index.js +0 -102
  208. package/components/area/index.js.map +0 -1
  209. package/components/area/style.d.ts +0 -3
  210. package/components/area/style.js.map +0 -1
  211. package/components/area/types.d.ts +0 -6
  212. package/components/axis/config.d.ts +0 -71
  213. package/components/axis/config.js +0 -32
  214. package/components/axis/config.js.map +0 -1
  215. package/components/axis/index.d.ts +0 -44
  216. package/components/axis/index.js +0 -305
  217. package/components/axis/index.js.map +0 -1
  218. package/components/axis/style.d.ts +0 -9
  219. package/components/axis/style.js.map +0 -1
  220. package/components/axis/types.d.ts +0 -4
  221. package/components/axis/types.js +0 -8
  222. package/components/axis/types.js.map +0 -1
  223. package/components/brush/config.d.ts +0 -42
  224. package/components/brush/config.js +0 -24
  225. package/components/brush/config.js.map +0 -1
  226. package/components/brush/index.d.ts +0 -28
  227. package/components/brush/index.js +0 -199
  228. package/components/brush/index.js.map +0 -1
  229. package/components/brush/style.d.ts +0 -5
  230. package/components/brush/style.js.map +0 -1
  231. package/components/brush/types.d.ts +0 -7
  232. package/components/brush/types.js +0 -8
  233. package/components/brush/types.js.map +0 -1
  234. package/components/bullet-legend/config.d.ts +0 -34
  235. package/components/bullet-legend/config.js +0 -16
  236. package/components/bullet-legend/config.js.map +0 -1
  237. package/components/bullet-legend/index.d.ts +0 -19
  238. package/components/bullet-legend/index.js +0 -79
  239. package/components/bullet-legend/index.js.map +0 -1
  240. package/components/bullet-legend/style.d.ts +0 -6
  241. package/components/bullet-legend/style.js.map +0 -1
  242. package/components/bullet-legend/types.d.ts +0 -7
  243. package/components/bullet-legend/types.js +0 -2
  244. package/components/bullet-legend/types.js.map +0 -1
  245. package/components/chord-diagram/config.d.ts +0 -44
  246. package/components/chord-diagram/config.js +0 -25
  247. package/components/chord-diagram/config.js.map +0 -1
  248. package/components/chord-diagram/index.d.ts +0 -42
  249. package/components/chord-diagram/index.js +0 -305
  250. package/components/chord-diagram/index.js.map +0 -1
  251. package/components/chord-diagram/modules/label.d.ts +0 -8
  252. package/components/chord-diagram/modules/label.js +0 -115
  253. package/components/chord-diagram/modules/label.js.map +0 -1
  254. package/components/chord-diagram/modules/link.d.ts +0 -21
  255. package/components/chord-diagram/modules/link.js +0 -63
  256. package/components/chord-diagram/modules/link.js.map +0 -1
  257. package/components/chord-diagram/modules/node.d.ts +0 -17
  258. package/components/chord-diagram/modules/node.js +0 -52
  259. package/components/chord-diagram/modules/node.js.map +0 -1
  260. package/components/chord-diagram/style.d.ts +0 -13
  261. package/components/chord-diagram/style.js.map +0 -1
  262. package/components/chord-diagram/types.d.ts +0 -58
  263. package/components/chord-diagram/types.js +0 -8
  264. package/components/chord-diagram/types.js.map +0 -1
  265. package/components/crosshair/config.d.ts +0 -43
  266. package/components/crosshair/config.js +0 -19
  267. package/components/crosshair/config.js.map +0 -1
  268. package/components/crosshair/index.d.ts +0 -35
  269. package/components/crosshair/index.js +0 -183
  270. package/components/crosshair/index.js.map +0 -1
  271. package/components/crosshair/style.d.ts +0 -4
  272. package/components/crosshair/style.js.map +0 -1
  273. package/components/crosshair/types.d.ts +0 -13
  274. package/components/crosshair/types.js +0 -2
  275. package/components/crosshair/types.js.map +0 -1
  276. package/components/donut/config.d.ts +0 -59
  277. package/components/donut/config.js +0 -28
  278. package/components/donut/config.js.map +0 -1
  279. package/components/donut/index.d.ts +0 -21
  280. package/components/donut/index.js +0 -107
  281. package/components/donut/index.js.map +0 -1
  282. package/components/donut/modules/arc.d.ts +0 -10
  283. package/components/donut/modules/arc.js +0 -59
  284. package/components/donut/modules/arc.js.map +0 -1
  285. package/components/donut/style.d.ts +0 -7
  286. package/components/donut/style.js.map +0 -1
  287. package/components/donut/types.d.ts +0 -20
  288. package/components/flow-legend/config.d.ts +0 -29
  289. package/components/flow-legend/config.js +0 -18
  290. package/components/flow-legend/config.js.map +0 -1
  291. package/components/flow-legend/index.d.ts +0 -16
  292. package/components/flow-legend/index.js +0 -75
  293. package/components/flow-legend/index.js.map +0 -1
  294. package/components/flow-legend/style.d.ts +0 -8
  295. package/components/flow-legend/style.js.map +0 -1
  296. package/components/flow-legend/types.d.ts +0 -9
  297. package/components/flow-legend/types.js +0 -8
  298. package/components/flow-legend/types.js.map +0 -1
  299. package/components/free-brush/config.d.ts +0 -45
  300. package/components/free-brush/config.js +0 -24
  301. package/components/free-brush/config.js.map +0 -1
  302. package/components/free-brush/index.d.ts +0 -20
  303. package/components/free-brush/index.js +0 -192
  304. package/components/free-brush/index.js.map +0 -1
  305. package/components/free-brush/style.d.ts +0 -4
  306. package/components/free-brush/style.js.map +0 -1
  307. package/components/free-brush/types.d.ts +0 -7
  308. package/components/free-brush/types.js +0 -9
  309. package/components/free-brush/types.js.map +0 -1
  310. package/components/graph/config.d.ts +0 -238
  311. package/components/graph/config.js +0 -84
  312. package/components/graph/config.js.map +0 -1
  313. package/components/graph/index.d.ts +0 -126
  314. package/components/graph/index.js +0 -656
  315. package/components/graph/index.js.map +0 -1
  316. package/components/graph/modules/layout-helpers.d.ts +0 -21
  317. package/components/graph/modules/layout-helpers.js +0 -69
  318. package/components/graph/modules/layout-helpers.js.map +0 -1
  319. package/components/graph/modules/layout.d.ts +0 -10
  320. package/components/graph/modules/layout.js +0 -399
  321. package/components/graph/modules/layout.js.map +0 -1
  322. package/components/graph/modules/link/helper.d.ts +0 -25
  323. package/components/graph/modules/link/helper.js +0 -74
  324. package/components/graph/modules/link/helper.js.map +0 -1
  325. package/components/graph/modules/link/index.d.ts +0 -11
  326. package/components/graph/modules/link/index.js +0 -212
  327. package/components/graph/modules/link/index.js.map +0 -1
  328. package/components/graph/modules/link/style.d.ts +0 -15
  329. package/components/graph/modules/link/style.js.map +0 -1
  330. package/components/graph/modules/node/helper.d.ts +0 -21
  331. package/components/graph/modules/node/helper.js +0 -126
  332. package/components/graph/modules/node/helper.js.map +0 -1
  333. package/components/graph/modules/node/index.d.ts +0 -11
  334. package/components/graph/modules/node/index.js +0 -252
  335. package/components/graph/modules/node/index.js.map +0 -1
  336. package/components/graph/modules/node/style.d.ts +0 -24
  337. package/components/graph/modules/node/style.js.map +0 -1
  338. package/components/graph/modules/panel/helper.d.ts +0 -18
  339. package/components/graph/modules/panel/helper.js +0 -111
  340. package/components/graph/modules/panel/helper.js.map +0 -1
  341. package/components/graph/modules/panel/index.d.ts +0 -7
  342. package/components/graph/modules/panel/index.js +0 -98
  343. package/components/graph/modules/panel/index.js.map +0 -1
  344. package/components/graph/modules/panel/style.d.ts +0 -14
  345. package/components/graph/modules/panel/style.js.map +0 -1
  346. package/components/graph/modules/shape.d.ts +0 -6
  347. package/components/graph/modules/shape.js +0 -80
  348. package/components/graph/modules/shape.js.map +0 -1
  349. package/components/graph/modules/zoom-levels.d.ts +0 -6
  350. package/components/graph/modules/zoom-levels.js +0 -10
  351. package/components/graph/modules/zoom-levels.js.map +0 -1
  352. package/components/graph/style.d.ts +0 -6
  353. package/components/graph/style.js +0 -66
  354. package/components/graph/style.js.map +0 -1
  355. package/components/graph/types.d.ts +0 -125
  356. package/components/graph/types.js +0 -30
  357. package/components/graph/types.js.map +0 -1
  358. package/components/grouped-bar/config.d.ts +0 -36
  359. package/components/grouped-bar/config.js +0 -20
  360. package/components/grouped-bar/config.js.map +0 -1
  361. package/components/grouped-bar/index.d.ts +0 -32
  362. package/components/grouped-bar/index.js +0 -249
  363. package/components/grouped-bar/index.js.map +0 -1
  364. package/components/grouped-bar/style.d.ts +0 -5
  365. package/components/grouped-bar/style.js.map +0 -1
  366. package/components/leaflet-flow-map/config.d.ts +0 -46
  367. package/components/leaflet-flow-map/config.js +0 -25
  368. package/components/leaflet-flow-map/config.js.map +0 -1
  369. package/components/leaflet-flow-map/index.d.ts +0 -52
  370. package/components/leaflet-flow-map/index.js +0 -220
  371. package/components/leaflet-flow-map/index.js.map +0 -1
  372. package/components/leaflet-flow-map/renderer-utils.d.ts +0 -5
  373. package/components/leaflet-flow-map/renderer-utils.js +0 -15
  374. package/components/leaflet-flow-map/renderer-utils.js.map +0 -1
  375. package/components/leaflet-flow-map/renderer.d.ts +0 -26
  376. package/components/leaflet-flow-map/renderer.js +0 -117
  377. package/components/leaflet-flow-map/renderer.js.map +0 -1
  378. package/components/leaflet-flow-map/shaders.d.ts +0 -2
  379. package/components/leaflet-flow-map/shaders.js.map +0 -1
  380. package/components/leaflet-flow-map/types.d.ts +0 -23
  381. package/components/leaflet-map/config.d.ts +0 -193
  382. package/components/leaflet-map/config.js +0 -71
  383. package/components/leaflet-map/config.js.map +0 -1
  384. package/components/leaflet-map/index.d.ts +0 -130
  385. package/components/leaflet-map/index.js +0 -690
  386. package/components/leaflet-map/index.js.map +0 -1
  387. package/components/leaflet-map/leaflet.css.js +0 -5
  388. package/components/leaflet-map/leaflet.css.js.map +0 -1
  389. package/components/leaflet-map/modules/clusterBackground.d.ts +0 -5
  390. package/components/leaflet-map/modules/clusterBackground.js +0 -27
  391. package/components/leaflet-map/modules/clusterBackground.js.map +0 -1
  392. package/components/leaflet-map/modules/donut.d.ts +0 -3
  393. package/components/leaflet-map/modules/donut.js +0 -25
  394. package/components/leaflet-map/modules/donut.js.map +0 -1
  395. package/components/leaflet-map/modules/map.d.ts +0 -14
  396. package/components/leaflet-map/modules/map.js +0 -154
  397. package/components/leaflet-map/modules/map.js.map +0 -1
  398. package/components/leaflet-map/modules/node.d.ts +0 -9
  399. package/components/leaflet-map/modules/node.js +0 -162
  400. package/components/leaflet-map/modules/node.js.map +0 -1
  401. package/components/leaflet-map/modules/selectionRing.d.ts +0 -7
  402. package/components/leaflet-map/modules/selectionRing.js +0 -41
  403. package/components/leaflet-map/modules/selectionRing.js.map +0 -1
  404. package/components/leaflet-map/modules/utils.d.ts +0 -50
  405. package/components/leaflet-map/modules/utils.js +0 -210
  406. package/components/leaflet-map/modules/utils.js.map +0 -1
  407. package/components/leaflet-map/renderer/leaflet-maplibre-gl.js.map +0 -1
  408. package/components/leaflet-map/renderer/map-style.d.ts +0 -4
  409. package/components/leaflet-map/renderer/map-style.js +0 -15
  410. package/components/leaflet-map/renderer/map-style.js.map +0 -1
  411. package/components/leaflet-map/renderer/mapboxgl/mapboxgl-dark-theme.json.js +0 -40
  412. package/components/leaflet-map/renderer/mapboxgl/mapboxgl-dark-theme.json.js.map +0 -1
  413. package/components/leaflet-map/renderer/mapboxgl/mapboxgl-light-theme.json.js +0 -40
  414. package/components/leaflet-map/renderer/mapboxgl/mapboxgl-light-theme.json.js.map +0 -1
  415. package/components/leaflet-map/renderer/mapboxgl/mapboxgl-settings.json.js +0 -4981
  416. package/components/leaflet-map/renderer/mapboxgl/mapboxgl-settings.json.js.map +0 -1
  417. package/components/leaflet-map/renderer/mapboxgl-layer.d.ts +0 -8
  418. package/components/leaflet-map/renderer/mapboxgl-layer.js +0 -27
  419. package/components/leaflet-map/renderer/mapboxgl-layer.js.map +0 -1
  420. package/components/leaflet-map/renderer/mapboxgl-utils.d.ts +0 -4
  421. package/components/leaflet-map/renderer/mapboxgl-utils.js +0 -39
  422. package/components/leaflet-map/renderer/mapboxgl-utils.js.map +0 -1
  423. package/components/leaflet-map/renderer/maplibre-gl.css.js.map +0 -1
  424. package/components/leaflet-map/style.d.ts +0 -52
  425. package/components/leaflet-map/style.js +0 -183
  426. package/components/leaflet-map/style.js.map +0 -1
  427. package/components/leaflet-map/types.d.ts +0 -75
  428. package/components/leaflet-map/types.js +0 -15
  429. package/components/leaflet-map/types.js.map +0 -1
  430. package/components/line/config.d.ts +0 -30
  431. package/components/line/config.js +0 -17
  432. package/components/line/config.js.map +0 -1
  433. package/components/line/index.d.ts +0 -27
  434. package/components/line/index.js +0 -152
  435. package/components/line/index.js.map +0 -1
  436. package/components/line/style.d.ts +0 -6
  437. package/components/line/style.js.map +0 -1
  438. package/components/line/types.d.ts +0 -12
  439. package/components/nested-donut/config.d.ts +0 -59
  440. package/components/nested-donut/config.js +0 -19
  441. package/components/nested-donut/config.js.map +0 -1
  442. package/components/nested-donut/index.d.ts +0 -38
  443. package/components/nested-donut/index.js +0 -133
  444. package/components/nested-donut/index.js.map +0 -1
  445. package/components/nested-donut/modules/arc.d.ts +0 -17
  446. package/components/nested-donut/modules/arc.js +0 -50
  447. package/components/nested-donut/modules/arc.js.map +0 -1
  448. package/components/nested-donut/modules/label.d.ts +0 -7
  449. package/components/nested-donut/modules/label.js +0 -34
  450. package/components/nested-donut/modules/label.js.map +0 -1
  451. package/components/nested-donut/style.d.ts +0 -26
  452. package/components/nested-donut/style.js +0 -70
  453. package/components/nested-donut/style.js.map +0 -1
  454. package/components/nested-donut/types.d.ts +0 -24
  455. package/components/nested-donut/types.js +0 -11
  456. package/components/nested-donut/types.js.map +0 -1
  457. package/components/sankey/config.d.ts +0 -162
  458. package/components/sankey/config.js +0 -65
  459. package/components/sankey/config.js.map +0 -1
  460. package/components/sankey/index.d.ts +0 -59
  461. package/components/sankey/index.js +0 -306
  462. package/components/sankey/index.js.map +0 -1
  463. package/components/sankey/modules/label.d.ts +0 -23
  464. package/components/sankey/modules/label.js +0 -168
  465. package/components/sankey/modules/label.js.map +0 -1
  466. package/components/sankey/modules/link.d.ts +0 -14
  467. package/components/sankey/modules/link.js +0 -108
  468. package/components/sankey/modules/link.js.map +0 -1
  469. package/components/sankey/modules/node.d.ts +0 -10
  470. package/components/sankey/modules/node.js +0 -156
  471. package/components/sankey/modules/node.js.map +0 -1
  472. package/components/sankey/style.d.ts +0 -20
  473. package/components/sankey/style.js.map +0 -1
  474. package/components/sankey/types.d.ts +0 -84
  475. package/components/sankey/types.js +0 -34
  476. package/components/sankey/types.js.map +0 -1
  477. package/components/scatter/config.d.ts +0 -44
  478. package/components/scatter/config.js +0 -23
  479. package/components/scatter/config.js.map +0 -1
  480. package/components/scatter/index.d.ts +0 -28
  481. package/components/scatter/index.js +0 -167
  482. package/components/scatter/index.js.map +0 -1
  483. package/components/scatter/modules/point.d.ts +0 -7
  484. package/components/scatter/modules/point.js +0 -86
  485. package/components/scatter/modules/point.js.map +0 -1
  486. package/components/scatter/modules/utils.d.ts +0 -11
  487. package/components/scatter/modules/utils.js +0 -112
  488. package/components/scatter/modules/utils.js.map +0 -1
  489. package/components/scatter/style.d.ts +0 -5
  490. package/components/scatter/style.js.map +0 -1
  491. package/components/scatter/types.d.ts +0 -19
  492. package/components/stacked-bar/config.d.ts +0 -38
  493. package/components/stacked-bar/config.js +0 -20
  494. package/components/stacked-bar/config.js.map +0 -1
  495. package/components/stacked-bar/index.d.ts +0 -28
  496. package/components/stacked-bar/index.js +0 -208
  497. package/components/stacked-bar/index.js.map +0 -1
  498. package/components/stacked-bar/style.d.ts +0 -5
  499. package/components/stacked-bar/style.js.map +0 -1
  500. package/components/stacked-bar/types.d.ts +0 -5
  501. package/components/timeline/config.d.ts +0 -43
  502. package/components/timeline/config.js +0 -24
  503. package/components/timeline/config.js.map +0 -1
  504. package/components/timeline/index.d.ts +0 -41
  505. package/components/timeline/index.js +0 -244
  506. package/components/timeline/index.js.map +0 -1
  507. package/components/timeline/style.d.ts +0 -13
  508. package/components/timeline/style.js.map +0 -1
  509. package/components/tooltip/config.d.ts +0 -68
  510. package/components/tooltip/config.js +0 -20
  511. package/components/tooltip/config.js.map +0 -1
  512. package/components/tooltip/index.d.ts +0 -36
  513. package/components/tooltip/index.js +0 -184
  514. package/components/tooltip/index.js.map +0 -1
  515. package/components/tooltip/style.js.map +0 -1
  516. package/components/topojson-map/config.d.ts +0 -99
  517. package/components/topojson-map/config.js +0 -42
  518. package/components/topojson-map/config.js.map +0 -1
  519. package/components/topojson-map/index.d.ts +0 -52
  520. package/components/topojson-map/index.js +0 -355
  521. package/components/topojson-map/index.js.map +0 -1
  522. package/components/topojson-map/style.d.ts +0 -11
  523. package/components/topojson-map/style.js.map +0 -1
  524. package/components/topojson-map/types.d.ts +0 -78
  525. package/components/topojson-map/types.js +0 -80
  526. package/components/topojson-map/types.js.map +0 -1
  527. package/components/topojson-map/utils.d.ts +0 -3
  528. package/components/topojson-map/utils.js +0 -30
  529. package/components/topojson-map/utils.js.map +0 -1
  530. package/components/vis-controls/config.d.ts +0 -12
  531. package/components/vis-controls/config.js +0 -13
  532. package/components/vis-controls/config.js.map +0 -1
  533. package/components/vis-controls/index.d.ts +0 -14
  534. package/components/vis-controls/index.js +0 -52
  535. package/components/vis-controls/index.js.map +0 -1
  536. package/components/vis-controls/style.d.ts +0 -11
  537. package/components/vis-controls/style.js.map +0 -1
  538. package/components/vis-controls/types.d.ts +0 -13
  539. package/components/vis-controls/types.js +0 -8
  540. package/components/vis-controls/types.js.map +0 -1
  541. package/components/xy-labels/config.d.ts +0 -48
  542. package/components/xy-labels/config.js +0 -25
  543. package/components/xy-labels/config.js.map +0 -1
  544. package/components/xy-labels/index.d.ts +0 -15
  545. package/components/xy-labels/index.js +0 -87
  546. package/components/xy-labels/index.js.map +0 -1
  547. package/components/xy-labels/modules/label.d.ts +0 -9
  548. package/components/xy-labels/modules/label.js +0 -107
  549. package/components/xy-labels/modules/label.js.map +0 -1
  550. package/components/xy-labels/style.d.ts +0 -5
  551. package/components/xy-labels/style.js.map +0 -1
  552. package/components/xy-labels/types.d.ts +0 -23
  553. package/components/xy-labels/types.js +0 -9
  554. package/components/xy-labels/types.js.map +0 -1
  555. package/components.d.ts +0 -51
  556. package/components.js +0 -29
  557. package/components.js.map +0 -1
  558. package/containers/single-container/config.d.ts +0 -12
  559. package/containers/single-container/config.js +0 -12
  560. package/containers/single-container/config.js.map +0 -1
  561. package/containers/single-container/index.d.ts +0 -19
  562. package/containers/single-container/index.js +0 -128
  563. package/containers/single-container/index.js.map +0 -1
  564. package/containers/xy-container/config.d.ts +0 -99
  565. package/containers/xy-container/config.js +0 -30
  566. package/containers/xy-container/config.js.map +0 -1
  567. package/containers/xy-container/index.d.ts +0 -34
  568. package/containers/xy-container/index.js +0 -330
  569. package/containers/xy-container/index.js.map +0 -1
  570. package/containers.d.ts +0 -6
  571. package/containers.js +0 -4
  572. package/containers.js.map +0 -1
  573. package/core/component/config.d.ts +0 -58
  574. package/core/component/config.js +0 -14
  575. package/core/component/config.js.map +0 -1
  576. package/core/component/index.d.ts +0 -43
  577. package/core/component/index.js +0 -118
  578. package/core/component/index.js.map +0 -1
  579. package/core/component/types.d.ts +0 -2
  580. package/core/component/types.js +0 -2
  581. package/core/component/types.js.map +0 -1
  582. package/core/config/index.d.ts +0 -3
  583. package/core/config/index.js +0 -16
  584. package/core/config/index.js.map +0 -1
  585. package/core/container/config.d.ts +0 -48
  586. package/core/container/config.js +0 -29
  587. package/core/container/config.js.map +0 -1
  588. package/core/container/index.d.ts +0 -26
  589. package/core/container/index.js +0 -105
  590. package/core/container/index.js.map +0 -1
  591. package/core/xy-component/config.d.ts +0 -38
  592. package/core/xy-component/config.js +0 -20
  593. package/core/xy-component/config.js.map +0 -1
  594. package/core/xy-component/index.d.ts +0 -27
  595. package/core/xy-component/index.js +0 -74
  596. package/core/xy-component/index.js.map +0 -1
  597. package/data-models/core.d.ts +0 -6
  598. package/data-models/core.js +0 -14
  599. package/data-models/core.js.map +0 -1
  600. package/data-models/graph.d.ts +0 -24
  601. package/data-models/graph.js +0 -107
  602. package/data-models/graph.js.map +0 -1
  603. package/data-models/map-graph.d.ts +0 -21
  604. package/data-models/map-graph.js +0 -62
  605. package/data-models/map-graph.js.map +0 -1
  606. package/data-models/map.d.ts +0 -5
  607. package/data-models/map.js +0 -12
  608. package/data-models/map.js.map +0 -1
  609. package/data-models/series.d.ts +0 -6
  610. package/data-models/series.js +0 -19
  611. package/data-models/series.js.map +0 -1
  612. package/index.d.ts +0 -7
  613. package/index.js +0 -55
  614. package/index.js.map +0 -1
  615. package/maps/china-provinces.json.js +0 -140373
  616. package/maps/fr-regions.json.js +0 -14162
  617. package/maps/germany-regions.json.js +0 -35760
  618. package/maps/ind-regions.json.js +0 -290584
  619. package/maps/uk-regions.json.js +0 -96233
  620. package/maps/us-counties.json.js +0 -206318
  621. package/maps/us-states.json.js +0 -16345
  622. package/maps/world-110m-alpha.json.js +0 -251366
  623. package/maps/world-simple.json.js +0 -89428
  624. package/maps/world-simplest.json.js +0 -28175
  625. package/maps.d.ts +0 -60
  626. package/maps.js +0 -23
  627. package/styles/colors.d.ts +0 -7
  628. package/styles/colors.js +0 -24
  629. package/styles/colors.js.map +0 -1
  630. package/styles/index.d.ts +0 -7
  631. package/styles/index.js +0 -38
  632. package/styles/index.js.map +0 -1
  633. package/styles/sizes.d.ts +0 -2
  634. package/styles/sizes.js.map +0 -1
  635. package/types/accessor.d.ts +0 -5
  636. package/types/accessor.js +0 -2
  637. package/types/accessor.js.map +0 -1
  638. package/types/component.d.ts +0 -13
  639. package/types/component.js +0 -14
  640. package/types/component.js.map +0 -1
  641. package/types/curve.d.ts +0 -40
  642. package/types/curve.js +0 -46
  643. package/types/curve.js.map +0 -1
  644. package/types/data.d.ts +0 -7
  645. package/types/data.js +0 -2
  646. package/types/data.js.map +0 -1
  647. package/types/direction.d.ts +0 -6
  648. package/types/direction.js +0 -10
  649. package/types/direction.js.map +0 -1
  650. package/types/graph.d.ts +0 -35
  651. package/types/graph.js +0 -2
  652. package/types/graph.js.map +0 -1
  653. package/types/map.d.ts +0 -4
  654. package/types/map.js +0 -2
  655. package/types/map.js.map +0 -1
  656. package/types/misc.d.ts +0 -8
  657. package/types/position.d.ts +0 -20
  658. package/types/position.js +0 -27
  659. package/types/position.js.map +0 -1
  660. package/types/scale.d.ts +0 -23
  661. package/types/scale.js +0 -27
  662. package/types/scale.js.map +0 -1
  663. package/types/shape.d.ts +0 -7
  664. package/types/shape.js +0 -11
  665. package/types/shape.js.map +0 -1
  666. package/types/spacing.d.ts +0 -6
  667. package/types/spacing.js +0 -2
  668. package/types/spacing.js.map +0 -1
  669. package/types/svg.d.ts +0 -18
  670. package/types/svg.js +0 -22
  671. package/types/svg.js.map +0 -1
  672. package/types/symbol.d.ts +0 -18
  673. package/types/symbol.js +0 -24
  674. package/types/symbol.js.map +0 -1
  675. package/types/text.d.ts +0 -47
  676. package/types/text.js +0 -26
  677. package/types/text.js.map +0 -1
  678. package/types.d.ts +0 -27
  679. package/types.js +0 -30
  680. package/types.js.map +0 -1
  681. package/utils/color.d.ts +0 -10
  682. package/utils/color.js +0 -32
  683. package/utils/color.js.map +0 -1
  684. package/utils/d3.d.ts +0 -3
  685. package/utils/d3.js +0 -16
  686. package/utils/d3.js.map +0 -1
  687. package/utils/data.d.ts +0 -45
  688. package/utils/data.js +0 -274
  689. package/utils/data.js.map +0 -1
  690. package/utils/html.d.ts +0 -1
  691. package/utils/html.js +0 -16
  692. package/utils/html.js.map +0 -1
  693. package/utils/map.d.ts +0 -2
  694. package/utils/map.js +0 -20
  695. package/utils/map.js.map +0 -1
  696. package/utils/misc.d.ts +0 -9
  697. package/utils/misc.js +0 -47
  698. package/utils/misc.js.map +0 -1
  699. package/utils/path.d.ts +0 -23
  700. package/utils/path.js +0 -144
  701. package/utils/path.js.map +0 -1
  702. package/utils/scale.d.ts +0 -1
  703. package/utils/style.d.ts +0 -6
  704. package/utils/style.js +0 -24
  705. package/utils/style.js.map +0 -1
  706. package/utils/svg.d.ts +0 -3
  707. package/utils/text.d.ts +0 -139
  708. package/utils/text.js +0 -443
  709. package/utils/text.js.map +0 -1
  710. package/utils/type.d.ts +0 -5
@@ -0,0 +1,96 @@
1
+ // Types
2
+ import type { ElkNode } from 'elkjs/lib/elk.bundled.js'
3
+ import { GraphInputLink, GraphInputNode } from 'types/graph'
4
+ import { GenericAccessor } from 'types/accessor'
5
+
6
+ // Utils
7
+ import { getValue, isPlainObject, merge } from 'utils/data'
8
+
9
+ // Local Types
10
+ import { GraphNode, GraphElkLayoutSettings } from '../types'
11
+
12
+ export const DEFAULT_ELK_SETTINGS = {
13
+ hierarchyHandling: 'INCLUDE_CHILDREN',
14
+ 'nodePlacement.strategy': 'NETWORK_SIMPLEX',
15
+ 'elk.padding': '[top=15.0,left=15.0,bottom=15.0,right=15.0]',
16
+ 'spacing.nodeNodeBetweenLayers': '50',
17
+ 'spacing.edgeNodeBetweenLayers': '50',
18
+ 'spacing.nodeNode': '10',
19
+ }
20
+
21
+ export function positionNonConnectedNodes<N extends GraphInputNode, L extends GraphInputLink> (
22
+ nodes: GraphNode<N, L>[],
23
+ y: number,
24
+ spacing: number,
25
+ width: number,
26
+ xStart = 0
27
+ ): void {
28
+ nodes.forEach((d, i) => {
29
+ const x = spacing / 2 + i * spacing
30
+ const rowIdx = width ? Math.floor(x / width) : 0
31
+ d.y = (y + rowIdx * spacing) || 0
32
+ d.x = width ? x % width + xStart : x + xStart
33
+ })
34
+ }
35
+
36
+ export type GraphElkHierarchyNode<N extends GraphInputNode, L extends GraphInputLink> = {
37
+ id: string;
38
+ children: GraphNode<N, L>[] | GraphElkHierarchyNode<N, L>;
39
+ layoutOptions: GraphElkLayoutSettings;
40
+ }
41
+
42
+ export type GraphElkHierarchyNodeMap<N extends GraphInputNode, L extends GraphInputLink>
43
+ = Map<string | undefined | null, GraphNode<N, L>[] | GraphElkHierarchyNodeMap<N, L>>
44
+
45
+
46
+ export function toElkHierarchy<N extends GraphInputNode, L extends GraphInputLink> (
47
+ d: GraphElkHierarchyNodeMap<N, L> | GraphNode<N, L>[],
48
+ layoutOptions: GenericAccessor<GraphElkLayoutSettings, string> | undefined
49
+ ): (GraphElkHierarchyNode<N, L> | GraphNode<N, L>)[] {
50
+ if (!(d instanceof Map)) return d
51
+
52
+ const hierarchyNode = Array.from(d.entries()).map(([key, value]) => {
53
+ const children = toElkHierarchy(value, layoutOptions)
54
+ if (key) {
55
+ const layoutOps = isPlainObject(layoutOptions) ? DEFAULT_ELK_SETTINGS : merge(DEFAULT_ELK_SETTINGS, getValue(key, layoutOptions))
56
+ return {
57
+ id: key,
58
+ layoutOptions: layoutOps,
59
+ children,
60
+ } as GraphElkHierarchyNode<N, L>
61
+ } else {
62
+ return children
63
+ }
64
+ }).flat()
65
+
66
+ return hierarchyNode
67
+ }
68
+
69
+ export function adjustElkHierarchyCoordinates (node: ElkNode): void {
70
+ const parentX = node.x
71
+ const parentY = node.y
72
+
73
+ node.edges?.forEach(edge => {
74
+ edge.sections?.forEach(section => {
75
+ section.startPoint.x += parentX
76
+ section.startPoint.y += parentY
77
+ section.endPoint.x += parentX
78
+ section.endPoint.y += parentY
79
+ section.bendPoints?.forEach(bendPoint => {
80
+ bendPoint.x += parentX
81
+ bendPoint.y += parentY
82
+ })
83
+ })
84
+
85
+ edge.labels?.forEach(label => {
86
+ label.x += parentX
87
+ label.y += parentY
88
+ })
89
+ })
90
+
91
+ node.children?.forEach(child => {
92
+ child.x += parentX
93
+ child.y += parentY
94
+ adjustElkHierarchyCoordinates(child)
95
+ })
96
+ }
@@ -0,0 +1,502 @@
1
+ import { min, max, group } from 'd3-array'
2
+ import type { ElkNode } from 'elkjs/lib/elk.bundled.js'
3
+
4
+ // Core
5
+ import { GraphDataModel } from 'data-models/graph'
6
+
7
+ // Utils
8
+ import { without, clamp, groupBy, unique, sortBy, getString, getNumber, getValue, merge } from 'utils/data'
9
+
10
+ // Types
11
+ import { GraphInputLink, GraphInputNode } from 'types/graph'
12
+
13
+ // Local Types
14
+ import { GraphNode, GraphLink } from '../types'
15
+
16
+ // Config
17
+ import { GraphConfig } from '../config'
18
+
19
+ // Helpers
20
+ import { getMaxNodeSize, configuredNodeSize, getNodeSize, getAverageNodeSize } from './node/helper'
21
+ import {
22
+ DEFAULT_ELK_SETTINGS,
23
+ adjustElkHierarchyCoordinates,
24
+ positionNonConnectedNodes,
25
+ toElkHierarchy,
26
+ GraphElkHierarchyNode,
27
+ } from './layout-helpers'
28
+
29
+ export function applyLayoutCircular<N extends GraphInputNode, L extends GraphInputLink> (
30
+ datamodel: GraphDataModel<N, L, GraphNode<N, L>, GraphLink<N, L>>,
31
+ config: GraphConfig<N, L>,
32
+ width: number,
33
+ height: number
34
+ ): void {
35
+ const { nonConnectedNodes, connectedNodes, nodes } = datamodel
36
+ const { layoutNonConnectedAside, nodeSize } = config
37
+
38
+ const activeWidth = width
39
+ const activeHeight = height
40
+
41
+ // Handle layout nodes
42
+ const layoutNodes = layoutNonConnectedAside ? connectedNodes : nodes
43
+ const maxNodeSize = getMaxNodeSize(layoutNodes, nodeSize)
44
+ const yRatio = activeHeight / maxNodeSize
45
+ const yScaling = yRatio < layoutNodes.length / 2 ? layoutNodes.length / 2 / yRatio : 1
46
+ const xRatio = activeWidth / maxNodeSize
47
+ const xScaling = xRatio < layoutNodes.length / 2 ? layoutNodes.length / 2 / xRatio : 1
48
+ const scaling = Math.max(xScaling, yScaling)
49
+
50
+ layoutNodes.forEach((d, i) => {
51
+ const rX = scaling * activeWidth / 2
52
+ const rY = scaling * activeHeight / 2 // maxNodeSize * layoutNodes.length / 4
53
+ const angle = 2 * i * Math.PI / layoutNodes.length
54
+ d.x = activeWidth / 2 + rX * Math.cos(angle)
55
+ d.y = activeHeight / 2 + rY * Math.sin(angle)
56
+ })
57
+
58
+ // Handle non-connected nodes
59
+ if (layoutNonConnectedAside) {
60
+ const maxSize = getMaxNodeSize(nonConnectedNodes, nodeSize)
61
+ const maxY = max<number>(connectedNodes.map(d => d.y))
62
+ const maxX = max<number>(connectedNodes.map(d => d.x))
63
+ const minX = min<number>(connectedNodes.map(d => d.x))
64
+ const graphWidth = maxX - minX
65
+ positionNonConnectedNodes(nonConnectedNodes, maxY + maxSize * 3, maxSize * 2.25, Math.max(graphWidth, width), minX)
66
+ }
67
+ }
68
+
69
+ export function applyLayoutParallel<N extends GraphInputNode, L extends GraphInputLink> (
70
+ datamodel: GraphDataModel<N, L, GraphNode<N, L>, GraphLink<N, L>>,
71
+ config: GraphConfig<N, L>,
72
+ width: number,
73
+ height: number,
74
+ orientation?: string
75
+ ): void {
76
+ const { nonConnectedNodes, connectedNodes, nodes } = datamodel
77
+ const {
78
+ layoutNonConnectedAside, layoutGroupOrder, layoutParallelSortConnectionsByGroup, layoutParallelNodesPerColumn,
79
+ layoutParallelSubGroupsPerRow, nodeSize, layoutNodeGroup, layoutParallelNodeSubGroup, layoutParallelGroupSpacing,
80
+ } = config
81
+
82
+ const activeWidth = width - configuredNodeSize(nodeSize)
83
+ const activeHeight = height - configuredNodeSize(nodeSize) - (nonConnectedNodes.length ? configuredNodeSize(nodeSize) * 5 : 0)
84
+
85
+ // Handle connected nodes
86
+ const layoutNodes = layoutNonConnectedAside ? connectedNodes : nodes
87
+ const groupNames = unique(layoutNodes.map(d => getString(d, layoutNodeGroup, d._index)))
88
+ const groupNamesSorted: string[] = sortBy(groupNames, d => layoutGroupOrder.indexOf(d))
89
+
90
+ const groups = groupNamesSorted.map(groupName => {
91
+ const groupNodes = layoutNodes.filter(d => getString(d, layoutNodeGroup, d._index) === groupName)
92
+ const groupedBySubgroup = groupBy(groupNodes, d => getString(d, layoutParallelNodeSubGroup, d._index))
93
+ const subgroups = Object.keys(groupedBySubgroup).map(name => ({
94
+ nodes: groupedBySubgroup[name],
95
+ name,
96
+ }))
97
+
98
+ return {
99
+ name: groupName,
100
+ nodes: groupNodes,
101
+ subgroups,
102
+ }
103
+ })
104
+
105
+ // Sort
106
+ const group = groups.find(g => g.name === layoutParallelSortConnectionsByGroup)
107
+ if (group) {
108
+ const sortMap = {}
109
+ let idx = 0
110
+ group.subgroups.forEach(subgroup => {
111
+ subgroup.nodes.forEach(node => {
112
+ node.links.forEach(link => {
113
+ const linkTargetId = link?.target._id
114
+ sortMap[linkTargetId] = idx
115
+ idx = idx + 1
116
+ })
117
+ })
118
+ })
119
+
120
+ without(groups, group).forEach(g => {
121
+ g.subgroups.forEach(subgroup => {
122
+ subgroup.nodes.sort((a, b) => {
123
+ return (sortMap[a._id] || 0) - (sortMap[b._id] || 0)
124
+ })
125
+ })
126
+ })
127
+ }
128
+
129
+ const maxN = max(groups, d => d.nodes?.length)
130
+ const labelApprxHeight = 40
131
+ const labelMargin = 10
132
+ const subgroupMargin = 40
133
+ const maxNodeSize = getMaxNodeSize(layoutNodes, nodeSize)
134
+
135
+ if (orientation === 'horizontal') {
136
+ const minHorizontalStep = 2 * maxNodeSize + labelMargin
137
+ const maxHorizontalStep = 3.5 * maxNodeSize + labelMargin
138
+ const horizontalStep = clamp(activeWidth / (maxN - 1), minHorizontalStep, maxHorizontalStep)
139
+
140
+ const maxVerticalStep = maxNodeSize * 4 + labelApprxHeight
141
+ const minVerticalStep = maxNodeSize * 1.5 + labelApprxHeight
142
+ const verticalStep = (maxNodeSize + layoutParallelGroupSpacing) || clamp(activeHeight / (groups.length - 1), minVerticalStep, maxVerticalStep)
143
+ const subgroupNodeStep = maxNodeSize + labelApprxHeight + labelMargin
144
+
145
+ let y0 = (groups.length < 2) ? height / 2 : 0
146
+ groups.forEach(group => {
147
+ let x0 = 0
148
+ let dy = 0
149
+ let subgroupMaxWidth = 0
150
+ let groupWidth = 0
151
+ let groupHeight = 0
152
+ let k = 0
153
+ group.subgroups.forEach(subgroup => {
154
+ const subgroupRows = Math.ceil(subgroup.nodes.length / layoutParallelNodesPerColumn)
155
+ let n = 0
156
+ let x = x0
157
+ let y = y0 + dy
158
+ subgroup.nodes.forEach(d => {
159
+ x = x + horizontalStep
160
+ d.x = x
161
+ d.y = y
162
+ groupWidth = Math.max(groupWidth, x)
163
+
164
+ n = n + 1
165
+ if (n >= layoutParallelNodesPerColumn) {
166
+ n = 0
167
+ y += subgroupNodeStep
168
+ x = x0
169
+ }
170
+ })
171
+
172
+ const subgroupWidth = Math.min(subgroup.nodes.length, layoutParallelNodesPerColumn) * horizontalStep
173
+ const subgroupHeight = subgroupRows * subgroupNodeStep
174
+ subgroupMaxWidth = Math.max(subgroupMaxWidth, subgroupWidth)
175
+ dy = dy + subgroupHeight + subgroupMargin
176
+ k = k + 1
177
+ if (k >= layoutParallelSubGroupsPerRow) {
178
+ k = 0
179
+ dy = 0
180
+ x0 = x0 + subgroupMaxWidth + subgroupMargin
181
+ subgroupMaxWidth = 0
182
+ }
183
+
184
+ groupHeight = Math.max(groupHeight, y)
185
+ // x0 += Math.min(subgroup.nodes.length, layoutParallelNodesPerColumn) * horizontalStep + subgroupMargin
186
+ })
187
+
188
+ // Center group horizontally
189
+ group.subgroups.forEach(subgroup => {
190
+ subgroup.nodes.forEach(d => {
191
+ d.x -= groupWidth / 2
192
+ })
193
+ })
194
+ groupWidth = 0
195
+
196
+ // Update y0 for the next group
197
+ y0 = groupHeight + verticalStep
198
+ })
199
+ } else {
200
+ const minHorizontalStep = 6 * maxNodeSize + labelMargin
201
+ const maxHorizontalStep = 10 * maxNodeSize + labelMargin
202
+ const horizontalStep = (maxNodeSize + layoutParallelGroupSpacing) || clamp(activeWidth / (maxN - 1), minHorizontalStep, maxHorizontalStep)
203
+
204
+ const maxVerticalStep = maxNodeSize * 2.0 + labelApprxHeight
205
+ const minVerticalStep = maxNodeSize * 1.5 + labelApprxHeight
206
+ const verticalStep = clamp(activeHeight / (groups.length - 1), minVerticalStep, maxVerticalStep)
207
+ const subgroupNodeStep = maxNodeSize * 2.0
208
+
209
+ let x0 = (groups.length < 2) ? width / 2 : 0
210
+ groups.forEach(group => {
211
+ let y0 = 0
212
+ let dx = 0 // Horizontal shift inside the group (column)
213
+ let subgroupMaxHeight = 0
214
+ let groupWidth = 0
215
+ let groupHeight = 0
216
+
217
+ let k = 0
218
+ group.subgroups.forEach(subgroup => {
219
+ const subgroupColumns = Math.ceil(subgroup.nodes.length / layoutParallelNodesPerColumn)
220
+ let n = 0
221
+ let y = y0
222
+ let x = x0 + dx
223
+ subgroup.nodes.forEach(d => {
224
+ y = y + verticalStep
225
+ d.x = x
226
+ d.y = y
227
+ groupHeight = Math.max(groupHeight, y)
228
+
229
+ n = n + 1
230
+ if (n >= layoutParallelNodesPerColumn) {
231
+ n = 0
232
+ x += subgroupNodeStep
233
+ y = y0
234
+ }
235
+ })
236
+
237
+ const subgroupHeight = Math.min(subgroup.nodes.length, layoutParallelNodesPerColumn) * verticalStep
238
+ const subgroupWidth = subgroupColumns * subgroupNodeStep
239
+ subgroupMaxHeight = Math.max(subgroupMaxHeight, subgroupHeight)
240
+ dx = dx + subgroupWidth + subgroupMargin
241
+ k = k + 1
242
+ if (k >= layoutParallelSubGroupsPerRow) {
243
+ k = 0
244
+ dx = 0
245
+ y0 = y0 + subgroupMaxHeight + subgroupMargin
246
+ subgroupMaxHeight = 0
247
+ }
248
+
249
+ groupWidth = Math.max(groupWidth, x)
250
+ })
251
+
252
+ // Center group vertically
253
+ group.subgroups.forEach(subgroup => {
254
+ subgroup.nodes.forEach(d => {
255
+ d.y -= groupHeight / 2
256
+ })
257
+ })
258
+ groupHeight = 0
259
+
260
+ // Update x0 for the next group
261
+ x0 = groupWidth + horizontalStep
262
+ })
263
+ }
264
+
265
+ // Handle non-connected nodes
266
+ if (layoutNonConnectedAside) {
267
+ const maxSize = getMaxNodeSize(nonConnectedNodes, nodeSize)
268
+ const maxY = max<number>(connectedNodes.map(d => d.y)) || 0
269
+ const maxX = max<number>(connectedNodes.map(d => d.x)) || 0
270
+ const minX = min<number>(connectedNodes.map(d => d.x)) || 0
271
+ const graphWidth = (maxX - minX) || width
272
+ positionNonConnectedNodes(nonConnectedNodes, maxY + maxSize * 3, maxSize * 2.25, Math.max(graphWidth, width))
273
+ }
274
+ }
275
+
276
+ export async function applyLayoutDagre<N extends GraphInputNode, L extends GraphInputLink> (
277
+ datamodel: GraphDataModel<N, L, GraphNode<N, L>, GraphLink<N, L>>,
278
+ config: GraphConfig<N, L>,
279
+ width: number
280
+ ): Promise<void> {
281
+ const { nonConnectedNodes, connectedNodes, nodes, links } = datamodel
282
+ const { nodeSize, layoutNonConnectedAside, dagreLayoutSettings, nodeStrokeWidth, nodeLabel } = config
283
+
284
+ // eslint-disable-next-line @typescript-eslint/naming-convention
285
+ const { Graph } = await import('@unovis/graphlibrary')
286
+ const { layout } = await import('@unovis/dagre-layout')
287
+
288
+ // https://github.com/dagrejs/dagre/wiki
289
+ const dagreGraph = new Graph()
290
+
291
+ // Set an object for the graph label
292
+ dagreGraph.setGraph(dagreLayoutSettings)
293
+
294
+ // Default to assigning a new object as a label for each new edge.
295
+ dagreGraph.setDefaultEdgeLabel(() => ({}))
296
+
297
+ // Add nodes to the graph. The first argument is the node id. The second is
298
+ // metadata about the node. In this case we're going to add labels to each of
299
+ // our nodes.
300
+ const labelApprxHeight = 40
301
+ const nds = (layoutNonConnectedAside ? connectedNodes : nodes)
302
+ nds.forEach(node => {
303
+ dagreGraph.setNode(node._index, {
304
+ label: getString(node, nodeLabel, node._index),
305
+ width: getNumber(node, nodeSize, node._index) * 1.5 + getNumber(node, nodeStrokeWidth, node._index),
306
+ height: labelApprxHeight + getNumber(node, nodeSize, node._index) * 1.5,
307
+ originalNode: node,
308
+ })
309
+ })
310
+
311
+ // Add edges to the graph.
312
+ links.forEach(link => {
313
+ dagreGraph.setEdge((link.source as GraphNode)._index, (link.target as GraphNode)._index)
314
+ })
315
+
316
+ // Calculate the layout
317
+ layout(dagreGraph)
318
+
319
+ // Apply coordinates to the graph
320
+ dagreGraph.nodes().forEach(d => {
321
+ const node = dagreGraph.node(d)
322
+ node.originalNode.x = node.x // width * d.x / dagreGraph._label.width
323
+ node.originalNode.y = node.y // height * d.y / dagreGraph._label.height
324
+ })
325
+
326
+ // Handle non-connected nodes
327
+ if (layoutNonConnectedAside) {
328
+ const maxNodeSize = getMaxNodeSize(nonConnectedNodes, nodeSize)
329
+ const maxY = max<number>(connectedNodes.map(d => d.y))
330
+ const maxX = max<number>(connectedNodes.map(d => d.x))
331
+ const minX = min<number>(connectedNodes.map(d => d.x))
332
+ const graphWidth = maxX - minX
333
+ positionNonConnectedNodes(nonConnectedNodes, maxY + maxNodeSize * 3, maxNodeSize * 2.25, Math.max(graphWidth, width), 0)
334
+ }
335
+ }
336
+
337
+ export function applyLayoutConcentric<N extends GraphInputNode, L extends GraphInputLink> (
338
+ datamodel: GraphDataModel<N, L, GraphNode<N, L>, GraphLink<N, L>>,
339
+ config: GraphConfig<N, L>,
340
+ width: number,
341
+ height: number
342
+ ): void {
343
+ const { nonConnectedNodes, connectedNodes, nodes } = datamodel
344
+ const { layoutNonConnectedAside, layoutGroupOrder, nodeSize, layoutNodeGroup } = config
345
+
346
+ const layoutNodes = layoutNonConnectedAside ? connectedNodes : nodes
347
+
348
+ const groupNames: string[] = unique(layoutNodes.map(d => getString(d, layoutNodeGroup, d._index)))
349
+ const groupNamesSorted: string[] = sortBy(groupNames, d => layoutGroupOrder.indexOf(d))
350
+
351
+ const groups = groupNamesSorted.map(groupName => ({
352
+ name: groupName,
353
+ nodes: layoutNodes.filter(d => getString(d, layoutNodeGroup, d._index) === groupName),
354
+ }))
355
+
356
+ // Handle connected nodes
357
+ let r = 2 * getAverageNodeSize(groups[0]?.nodes ?? [], nodeSize)
358
+ const widthToHeightRatio = width / height
359
+
360
+ groups.forEach((group, i) => {
361
+ const avgNodeSize = getAverageNodeSize(group.nodes, nodeSize)
362
+ const requiredRadius = 1.1 * avgNodeSize * group.nodes.length / Math.PI
363
+ if (r < requiredRadius) r = requiredRadius
364
+
365
+ group.nodes.forEach((node, j) => {
366
+ // If the first (central) group has only one node
367
+ if (i === 0 && group.nodes.length === 1) {
368
+ node.x = width / 2
369
+ node.y = height / 2
370
+ } else {
371
+ let dAngle = 0
372
+ if (i === 0 && group.nodes.length === 3) dAngle = Math.PI / 6
373
+ if (i === 0 && group.nodes.length === 4) dAngle = Math.PI / 4
374
+ const angle = 2 * j * Math.PI / group.nodes.length + i * Math.PI / 12 + dAngle
375
+ node.x = width / 2 + r * Math.cos(angle) * widthToHeightRatio
376
+ node.y = height / 2 + r * Math.sin(angle)
377
+ }
378
+ })
379
+
380
+ const groupSpacing = avgNodeSize * 3
381
+ r += groupSpacing
382
+ })
383
+
384
+ // Handle non-connected nodes
385
+ if (layoutNonConnectedAside) {
386
+ const maxSize = getMaxNodeSize(nonConnectedNodes, nodeSize)
387
+ const maxY = max<number>(connectedNodes.map(d => d.y))
388
+ const maxX = max<number>(connectedNodes.map(d => d.x))
389
+ const minX = min<number>(connectedNodes.map(d => d.x))
390
+ const graphWidth = maxX - minX
391
+ positionNonConnectedNodes(nonConnectedNodes, maxY + maxSize * 3, maxSize * 2.25, graphWidth, minX)
392
+ }
393
+ }
394
+
395
+ export async function applyLayoutForce<N extends GraphInputNode, L extends GraphInputLink> (
396
+ datamodel: GraphDataModel<N, L, GraphNode<N, L>, GraphLink<N, L>>,
397
+ config: GraphConfig<N, L>,
398
+ width: number
399
+ ): Promise<void> {
400
+ const { layoutNonConnectedAside, forceLayoutSettings: { linkDistance, linkStrength, charge, forceXStrength, forceYStrength }, nodeSize } = config
401
+
402
+ const { forceSimulation, forceLink, forceManyBody, forceX, forceY, forceCollide } = await import('d3-force')
403
+
404
+ const { nonConnectedNodes, connectedNodes, nodes, links } = datamodel
405
+ const simulation = forceSimulation(layoutNonConnectedAside ? connectedNodes : nodes)
406
+ .force('link', forceLink(links)
407
+ .id((d) => String((d as GraphNode<N, L>)._id))
408
+ .distance(linkDistance)
409
+ .strength(linkStrength)
410
+ )
411
+ .force('charge', forceManyBody().strength(d => {
412
+ const linkCount = links.reduce((count, l) => count + Number((l.source === d) || (l.target === d)), 0)
413
+ return charge * Math.sqrt(linkCount)
414
+ }))
415
+ .force('x', forceX().strength(forceXStrength))
416
+ .force('y', forceY().strength(forceYStrength))
417
+ .force('collide', forceCollide().radius((d, i) => getNodeSize(d, nodeSize, i)).iterations(1))
418
+ .stop()
419
+
420
+ // See https://bl.ocks.org/mbostock/1667139, https://github.com/d3/d3-force/blob/master/README.md#simulation_tick
421
+ for (let i = 0, n = Math.ceil(Math.log(simulation.alphaMin()) / Math.log(1 - simulation.alphaDecay())); i < n; ++i) {
422
+ simulation.tick()
423
+ }
424
+
425
+ // Translate coordinates to values > 0 for better animated transition between layout
426
+ const yMin = min<number>(connectedNodes.map(d => d.y)) ?? 0
427
+ const xMin = min<number>(connectedNodes.map(d => d.x)) ?? 0
428
+ nodes.forEach(d => {
429
+ d.x -= xMin
430
+ d.y -= yMin
431
+ })
432
+
433
+ // Handle non-connected nodes
434
+ if (layoutNonConnectedAside) {
435
+ const maxSize = getMaxNodeSize(nonConnectedNodes, nodeSize)
436
+ const maxY = max<number>(connectedNodes.map(d => d.y))
437
+ const maxX = max<number>(connectedNodes.map(d => d.x))
438
+ const minX = min<number>(connectedNodes.map(d => d.x))
439
+ const graphWidth = maxX - minX
440
+ positionNonConnectedNodes(nonConnectedNodes, maxY + maxSize * 6, maxSize * 2.25, Math.max(graphWidth, width), minX)
441
+ }
442
+ }
443
+
444
+ export async function applyELKLayout<N extends GraphInputNode, L extends GraphInputLink> (
445
+ datamodel: GraphDataModel<N, L, GraphNode<N, L>, GraphLink<N, L>>,
446
+ config: GraphConfig<N, L>,
447
+ width: number
448
+ ): Promise<void> {
449
+ const ELK = (await import('elkjs/lib/elk.bundled.js')).default
450
+ const elk = new ELK()
451
+
452
+ const labelApprxHeight = 30
453
+ const nodes = datamodel.nodes.map(n => ({
454
+ ...n,
455
+ id: n._id,
456
+ width: getNumber(n, config.nodeSize, n._index) + getNumber(n, config.nodeStrokeWidth, n._index),
457
+ height: getNumber(n, config.nodeSize, n._index) + labelApprxHeight,
458
+ }))
459
+
460
+ let elkNodes: (GraphNode<N, L> | GraphElkHierarchyNode<N, L>)[]
461
+ if (config.layoutElkNodeGroups) {
462
+ const groupingFunctions = config.layoutElkNodeGroups
463
+ .map(accessor => (d: GraphNode<N, L>) => getString(d, accessor, d._index)) as [(d: GraphNode<N, L>) => string]
464
+ const grouped = group(nodes, ...groupingFunctions)
465
+ elkNodes = toElkHierarchy(grouped, config.layoutElkSettings)
466
+ } else {
467
+ elkNodes = nodes
468
+ }
469
+
470
+ const rootNodeId = 'root'
471
+ const elkGraph: ElkNode = {
472
+ id: rootNodeId,
473
+ layoutOptions: merge(DEFAULT_ELK_SETTINGS, getValue(rootNodeId, config.layoutElkSettings)),
474
+ children: elkNodes as ElkNode[],
475
+ edges: datamodel.links.map(l => ({
476
+ id: l._id,
477
+ sources: [l.source._id],
478
+ targets: [l.target._id],
479
+ })),
480
+ }
481
+
482
+ const layout = await elk.layout(elkGraph)
483
+ adjustElkHierarchyCoordinates(layout)
484
+
485
+ nodes.forEach((node, i) => {
486
+ const found = datamodel.nodes.find(n => n._id === node.id)
487
+ if (!found) return
488
+
489
+ found.x = node.x
490
+ found.y = node.y
491
+ })
492
+
493
+ // Handle non-connected nodes
494
+ if (config.layoutNonConnectedAside) {
495
+ const maxSize = getMaxNodeSize(datamodel.nonConnectedNodes, config.nodeSize)
496
+ const maxY = max<number>(datamodel.connectedNodes.map(d => d.y)) || 0
497
+ const maxX = max<number>(datamodel.connectedNodes.map(d => d.x)) || 0
498
+ const minX = min<number>(datamodel.connectedNodes.map(d => d.x)) || 0
499
+ const graphWidth = (maxX - minX) || width
500
+ positionNonConnectedNodes(datamodel.nonConnectedNodes, maxY + maxSize * 3, maxSize * 2.25, Math.max(graphWidth, width))
501
+ }
502
+ }
@@ -0,0 +1,105 @@
1
+ // Utils
2
+ import { getNumber, getString, getValue } from 'utils/data'
3
+ import { getColor, hexToBrightness } from 'utils/color'
4
+ import { color } from 'd3-color'
5
+
6
+ // Types
7
+ import { GraphInputLink, GraphInputNode } from 'types/graph'
8
+
9
+ // Local Types
10
+ import { GraphLink, GraphLinkArrowStyle, GraphCircleLabel } from '../../types'
11
+
12
+ // Config
13
+ import { GraphConfig } from '../../config'
14
+
15
+ // Helpers
16
+ import { getX, getY } from '../node/helper'
17
+ import { ZoomLevel } from '../zoom-levels'
18
+
19
+ export const getPolylineData = (d: { x1: number; x2: number; y1: number; y2: number}): string => `${d.x1},${d.y1} ${(d.x1 + d.x2) / 2},${(d.y1 + d.y2) / 2} ${d.x2},${d.y2}`
20
+
21
+ export const LINK_LABEL_RADIUS = 8
22
+ export const LINK_MARKER_WIDTH = 12
23
+ export const LINK_MARKER_HEIGHT = 8
24
+
25
+ export function getLinkShift (link: GraphLink, spacing: number): { dx: number; dy: number } {
26
+ const sourceNode = link.source
27
+ const targetNode = link.target
28
+ const angle = Math.atan2(getY(targetNode) - getY(sourceNode), getX(targetNode) - getX(sourceNode)) - Math.PI / 2
29
+ const dx = Math.cos(angle) * spacing * link._direction * (link._index - (link._neighbours - 1) / 2)
30
+ const dy = Math.sin(angle) * spacing * link._direction * (link._index - (link._neighbours - 1) / 2)
31
+ return { dx, dy }
32
+ }
33
+
34
+ export function getLinkShiftTransform (link: GraphLink, spacing: number): string {
35
+ const { dx, dy } = getLinkShift(link, spacing)
36
+ return `translate(${dx}, ${dy})`
37
+ }
38
+
39
+ export function getLinkLabelShift (link: GraphLink, linkSpacing: number, shiftFromCenter = 0): string {
40
+ const x1 = getX(link.source)
41
+ const y1 = getY(link.source)
42
+ const x2 = getX(link.target)
43
+ const y2 = getY(link.target)
44
+ const angle = Math.atan2(y2 - y1, x2 - x1)
45
+ const perpendicularShift = getLinkShift(link, linkSpacing)
46
+
47
+ const x = x1 + 0.5 * (x2 - x1) + shiftFromCenter * Math.cos(angle) + perpendicularShift.dx
48
+ const y = y1 + 0.5 * (y2 - y1) + shiftFromCenter * Math.sin(angle) + perpendicularShift.dy
49
+ return `translate(${x}, ${y})`
50
+ }
51
+
52
+ export function getLinkStrokeWidth<N extends GraphInputNode, L extends GraphInputLink> (
53
+ d: GraphLink,
54
+ scale: number,
55
+ config: GraphConfig<N, L>
56
+ ): number {
57
+ const m = getNumber(d, config.linkWidth, d._indexGlobal)
58
+ return m / Math.pow(scale, 0.5)
59
+ }
60
+
61
+ export function getLinkBandWidth<N extends GraphInputNode, L extends GraphInputLink> (
62
+ d: GraphLink,
63
+ scale: number,
64
+ config: GraphConfig<N, L>
65
+ ): number {
66
+ const { nodeSize, linkBandWidth } = config
67
+ const sourceNodeSize = getNumber(d.source, nodeSize, d.source._index)
68
+ const targetNodeSize = getNumber(d.target, nodeSize, d.target._index)
69
+ const minNodeSize = Math.min(sourceNodeSize, targetNodeSize)
70
+ return Math.min(minNodeSize, getNumber(d, linkBandWidth, d._indexGlobal) / Math.pow(scale || 1, 0.5)) || 0
71
+ }
72
+
73
+ export function getLinkColor<N extends GraphInputNode, L extends GraphInputLink> (link: GraphLink, config: GraphConfig<N, L>): string {
74
+ const { linkStroke } = config
75
+ const c = getColor(link, linkStroke, link._indexGlobal, true) ?? 'var(--vis-graph-link-stroke-color)'
76
+ return c || null
77
+ }
78
+
79
+ export function getLinkArrow<N extends GraphInputNode, L extends GraphInputLink> (
80
+ d: GraphLink,
81
+ scale: number,
82
+ config: GraphConfig<N, L>
83
+ ): string {
84
+ const { linkArrow } = config
85
+ if (scale > ZoomLevel.Level2 && getString(d, linkArrow, d._indexGlobal)) {
86
+ return getValue<GraphLink, GraphLinkArrowStyle>(d, linkArrow, d._indexGlobal)
87
+ }
88
+ return null
89
+ }
90
+
91
+ export function getArrowPath (): string {
92
+ return `M0,0 V${LINK_MARKER_HEIGHT} L${LINK_MARKER_WIDTH},${LINK_MARKER_HEIGHT / 2} Z`
93
+ }
94
+
95
+ export function getDoubleArrowPath (): string {
96
+ return `M0,${LINK_MARKER_HEIGHT / 2} L${LINK_MARKER_WIDTH},0 L${LINK_MARKER_WIDTH * 2},${LINK_MARKER_HEIGHT / 2} L${LINK_MARKER_WIDTH},${LINK_MARKER_HEIGHT} Z`
97
+ }
98
+
99
+ export function getLinkLabelTextColor (label: GraphCircleLabel): string {
100
+ if (!label.color) return null
101
+
102
+ const hex = color(label.color).hex()
103
+ const brightness = hexToBrightness(hex)
104
+ return brightness > 0.65 ? 'var(--vis-graph-link-label-text-color-dark)' : 'var(--vis-graph-link-label-text-color-bright)'
105
+ }