@fusedashlabs/widgets 0.2.0 → 0.4.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 (592) hide show
  1. package/CHANGELOG.md +94 -17
  2. package/README.md +24 -26
  3. package/dist/components/area-chart/element/ui9000-area-chart.d.ts +1 -1
  4. package/dist/components/area-grouped-bar-chart/element/ui9000-area-grouped-bar-chart.d.ts +1 -1
  5. package/dist/components/area-grouped-bar-chart/lib/normalize.js +3 -3
  6. package/dist/components/area-grouped-bar-chart/lib/normalize.js.map +1 -1
  7. package/dist/components/bar-chart/element/ui9000-bar-chart.d.ts +1 -1
  8. package/dist/components/bias-variance-tradeoff-chart/element/styles.d.ts +7 -0
  9. package/dist/components/bias-variance-tradeoff-chart/element/styles.d.ts.map +1 -0
  10. package/dist/components/bias-variance-tradeoff-chart/element/styles.js +13 -0
  11. package/dist/components/bias-variance-tradeoff-chart/element/styles.js.map +1 -0
  12. package/dist/components/bias-variance-tradeoff-chart/element/ui9000-bias-variance-tradeoff-chart.d.ts +27 -0
  13. package/dist/components/bias-variance-tradeoff-chart/element/ui9000-bias-variance-tradeoff-chart.d.ts.map +1 -0
  14. package/dist/components/bias-variance-tradeoff-chart/element/ui9000-bias-variance-tradeoff-chart.js +173 -0
  15. package/dist/components/bias-variance-tradeoff-chart/element/ui9000-bias-variance-tradeoff-chart.js.map +1 -0
  16. package/dist/components/bias-variance-tradeoff-chart/index.d.ts +5 -0
  17. package/dist/components/bias-variance-tradeoff-chart/index.d.ts.map +1 -0
  18. package/dist/components/bias-variance-tradeoff-chart/index.js +19 -0
  19. package/dist/components/bias-variance-tradeoff-chart/lib/domain.d.ts +8 -0
  20. package/dist/components/bias-variance-tradeoff-chart/lib/domain.d.ts.map +1 -0
  21. package/dist/components/bias-variance-tradeoff-chart/lib/domain.js +37 -0
  22. package/dist/components/bias-variance-tradeoff-chart/lib/domain.js.map +1 -0
  23. package/dist/components/bias-variance-tradeoff-chart/lib/format.d.ts +3 -0
  24. package/dist/components/bias-variance-tradeoff-chart/lib/format.d.ts.map +1 -0
  25. package/dist/components/bias-variance-tradeoff-chart/lib/format.js +9 -0
  26. package/dist/components/bias-variance-tradeoff-chart/lib/format.js.map +1 -0
  27. package/dist/components/bias-variance-tradeoff-chart/lib/index.d.ts +5 -0
  28. package/dist/components/bias-variance-tradeoff-chart/lib/index.d.ts.map +1 -0
  29. package/dist/components/bias-variance-tradeoff-chart/lib/normalize.d.ts +4 -0
  30. package/dist/components/bias-variance-tradeoff-chart/lib/normalize.d.ts.map +1 -0
  31. package/dist/components/bias-variance-tradeoff-chart/lib/normalize.js +135 -0
  32. package/dist/components/bias-variance-tradeoff-chart/lib/normalize.js.map +1 -0
  33. package/dist/components/bias-variance-tradeoff-chart/lib/types.d.ts +47 -0
  34. package/dist/components/bias-variance-tradeoff-chart/lib/types.d.ts.map +1 -0
  35. package/dist/components/bias-variance-tradeoff-chart/metadata.json.d.ts +41 -0
  36. package/dist/components/bias-variance-tradeoff-chart/metadata.json.js +42 -0
  37. package/dist/components/bias-variance-tradeoff-chart/metadata.json.js.map +1 -0
  38. package/dist/components/bias-variance-tradeoff-chart/render/draw.d.ts +31 -0
  39. package/dist/components/bias-variance-tradeoff-chart/render/draw.d.ts.map +1 -0
  40. package/dist/components/bias-variance-tradeoff-chart/render/draw.js +203 -0
  41. package/dist/components/bias-variance-tradeoff-chart/render/draw.js.map +1 -0
  42. package/dist/components/bias-variance-tradeoff-chart/render/index.d.ts +2 -0
  43. package/dist/components/bias-variance-tradeoff-chart/render/index.d.ts.map +1 -0
  44. package/dist/components/box-plot-chart/element/ui9000-box-plot-chart.d.ts +1 -1
  45. package/dist/components/bubble-chart/element/ui9000-bubble-chart.d.ts +1 -1
  46. package/dist/components/chart-renderer/element/ui9000-chart-renderer.d.ts +1 -0
  47. package/dist/components/chart-renderer/element/ui9000-chart-renderer.d.ts.map +1 -1
  48. package/dist/components/chart-renderer/element/ui9000-chart-renderer.js +12 -1
  49. package/dist/components/chart-renderer/element/ui9000-chart-renderer.js.map +1 -1
  50. package/dist/components/chart-renderer/lib/registry.d.ts.map +1 -1
  51. package/dist/components/chart-renderer/lib/registry.js +29 -4
  52. package/dist/components/chart-renderer/lib/registry.js.map +1 -1
  53. package/dist/components/chart-renderer/lib/types.d.ts +5 -0
  54. package/dist/components/chart-renderer/lib/types.d.ts.map +1 -1
  55. package/dist/components/donut-chart/element/ui9000-donut-chart.d.ts +1 -1
  56. package/dist/components/donut-chart/element/ui9000-donut-chart.js +1 -1
  57. package/dist/components/donut-chart/element/ui9000-donut-chart.js.map +1 -1
  58. package/dist/components/gini-impurity-entropy-chart/element/styles.d.ts +2 -0
  59. package/dist/components/gini-impurity-entropy-chart/element/styles.d.ts.map +1 -0
  60. package/dist/components/{donut-group-chart → gini-impurity-entropy-chart}/element/styles.js +17 -11
  61. package/dist/components/gini-impurity-entropy-chart/element/styles.js.map +1 -0
  62. package/dist/components/gini-impurity-entropy-chart/element/ui9000-gini-impurity-entropy-chart.d.ts +36 -0
  63. package/dist/components/gini-impurity-entropy-chart/element/ui9000-gini-impurity-entropy-chart.d.ts.map +1 -0
  64. package/dist/components/gini-impurity-entropy-chart/element/ui9000-gini-impurity-entropy-chart.js +186 -0
  65. package/dist/components/gini-impurity-entropy-chart/element/ui9000-gini-impurity-entropy-chart.js.map +1 -0
  66. package/dist/components/gini-impurity-entropy-chart/index.d.ts +5 -0
  67. package/dist/components/gini-impurity-entropy-chart/index.d.ts.map +1 -0
  68. package/dist/components/gini-impurity-entropy-chart/index.js +32 -0
  69. package/dist/components/gini-impurity-entropy-chart/index.js.map +1 -0
  70. package/dist/components/gini-impurity-entropy-chart/lib/domain.d.ts +9 -0
  71. package/dist/components/gini-impurity-entropy-chart/lib/domain.d.ts.map +1 -0
  72. package/dist/components/gini-impurity-entropy-chart/lib/domain.js +32 -0
  73. package/dist/components/gini-impurity-entropy-chart/lib/domain.js.map +1 -0
  74. package/dist/components/gini-impurity-entropy-chart/lib/format.d.ts +10 -0
  75. package/dist/components/gini-impurity-entropy-chart/lib/format.d.ts.map +1 -0
  76. package/dist/components/gini-impurity-entropy-chart/lib/format.js +22 -0
  77. package/dist/components/gini-impurity-entropy-chart/lib/format.js.map +1 -0
  78. package/dist/components/gini-impurity-entropy-chart/lib/index.d.ts +7 -0
  79. package/dist/components/gini-impurity-entropy-chart/lib/index.d.ts.map +1 -0
  80. package/dist/components/gini-impurity-entropy-chart/lib/normalize.d.ts +7 -0
  81. package/dist/components/gini-impurity-entropy-chart/lib/normalize.d.ts.map +1 -0
  82. package/dist/components/gini-impurity-entropy-chart/lib/normalize.js +117 -0
  83. package/dist/components/gini-impurity-entropy-chart/lib/normalize.js.map +1 -0
  84. package/dist/components/gini-impurity-entropy-chart/lib/overlays.d.ts +19 -0
  85. package/dist/components/gini-impurity-entropy-chart/lib/overlays.d.ts.map +1 -0
  86. package/dist/components/gini-impurity-entropy-chart/lib/overlays.js +63 -0
  87. package/dist/components/gini-impurity-entropy-chart/lib/overlays.js.map +1 -0
  88. package/dist/components/gini-impurity-entropy-chart/lib/series.d.ts +12 -0
  89. package/dist/components/gini-impurity-entropy-chart/lib/series.d.ts.map +1 -0
  90. package/dist/components/gini-impurity-entropy-chart/lib/series.js +45 -0
  91. package/dist/components/gini-impurity-entropy-chart/lib/series.js.map +1 -0
  92. package/dist/components/gini-impurity-entropy-chart/lib/types.d.ts +83 -0
  93. package/dist/components/gini-impurity-entropy-chart/lib/types.d.ts.map +1 -0
  94. package/dist/components/gini-impurity-entropy-chart/lib/types.js +19 -0
  95. package/dist/components/gini-impurity-entropy-chart/lib/types.js.map +1 -0
  96. package/dist/components/gini-impurity-entropy-chart/metadata.json.d.ts +115 -0
  97. package/dist/components/gini-impurity-entropy-chart/metadata.json.js +42 -0
  98. package/dist/components/gini-impurity-entropy-chart/metadata.json.js.map +1 -0
  99. package/dist/components/gini-impurity-entropy-chart/render/draw.d.ts +40 -0
  100. package/dist/components/gini-impurity-entropy-chart/render/draw.d.ts.map +1 -0
  101. package/dist/components/gini-impurity-entropy-chart/render/draw.js +160 -0
  102. package/dist/components/gini-impurity-entropy-chart/render/draw.js.map +1 -0
  103. package/dist/components/gini-impurity-entropy-chart/render/index.d.ts +2 -0
  104. package/dist/components/gini-impurity-entropy-chart/render/index.d.ts.map +1 -0
  105. package/dist/components/histogram-chart/element/ui9000-histogram-chart.d.ts +1 -1
  106. package/dist/components/kpi-widget/element/ui9000-kpi-widget.d.ts +1 -1
  107. package/dist/components/kpi-widget/element/ui9000-kpi-widget.js +1 -1
  108. package/dist/components/line-chart/element/ui9000-line-chart.d.ts +1 -1
  109. package/dist/components/lollipop/element/styles.d.ts.map +1 -1
  110. package/dist/components/lollipop/element/styles.js +19 -1
  111. package/dist/components/lollipop/element/styles.js.map +1 -1
  112. package/dist/components/lollipop/element/ui9000-lollipop.d.ts +7 -2
  113. package/dist/components/lollipop/element/ui9000-lollipop.d.ts.map +1 -1
  114. package/dist/components/lollipop/element/ui9000-lollipop.js +68 -7
  115. package/dist/components/lollipop/element/ui9000-lollipop.js.map +1 -1
  116. package/dist/components/lollipop/index.d.ts +1 -1
  117. package/dist/components/lollipop/index.d.ts.map +1 -1
  118. package/dist/components/lollipop/index.js +2 -0
  119. package/dist/components/lollipop/index.js.map +1 -1
  120. package/dist/components/lollipop/lib/domain.d.ts +16 -1
  121. package/dist/components/lollipop/lib/domain.d.ts.map +1 -1
  122. package/dist/components/lollipop/lib/domain.js +56 -1
  123. package/dist/components/lollipop/lib/domain.js.map +1 -1
  124. package/dist/components/lollipop/lib/index.d.ts +3 -2
  125. package/dist/components/lollipop/lib/index.d.ts.map +1 -1
  126. package/dist/components/lollipop/lib/layout.d.ts +16 -0
  127. package/dist/components/lollipop/lib/layout.d.ts.map +1 -0
  128. package/dist/components/lollipop/lib/layout.js +16 -0
  129. package/dist/components/lollipop/lib/layout.js.map +1 -0
  130. package/dist/components/lollipop/lib/types.d.ts +5 -0
  131. package/dist/components/lollipop/lib/types.d.ts.map +1 -1
  132. package/dist/components/lollipop/metadata.json.d.ts +10 -0
  133. package/dist/components/lollipop/metadata.json.js +4 -1
  134. package/dist/components/lollipop/metadata.json.js.map +1 -1
  135. package/dist/components/lollipop/render/draw.d.ts +8 -1
  136. package/dist/components/lollipop/render/draw.d.ts.map +1 -1
  137. package/dist/components/lollipop/render/draw.js +155 -84
  138. package/dist/components/lollipop/render/draw.js.map +1 -1
  139. package/dist/components/map-chart/element/styles.d.ts +2 -0
  140. package/dist/components/map-chart/element/styles.d.ts.map +1 -0
  141. package/dist/components/map-chart/element/styles.js +372 -0
  142. package/dist/components/map-chart/element/styles.js.map +1 -0
  143. package/dist/components/map-chart/element/ui9000-map-chart.d.ts +54 -0
  144. package/dist/components/map-chart/element/ui9000-map-chart.d.ts.map +1 -0
  145. package/dist/components/map-chart/element/ui9000-map-chart.js +539 -0
  146. package/dist/components/map-chart/element/ui9000-map-chart.js.map +1 -0
  147. package/dist/components/map-chart/index.d.ts +5 -0
  148. package/dist/components/map-chart/index.d.ts.map +1 -0
  149. package/dist/components/map-chart/index.js +29 -0
  150. package/dist/components/map-chart/index.js.map +1 -0
  151. package/dist/components/map-chart/lib/constants.d.ts +34 -0
  152. package/dist/components/map-chart/lib/constants.d.ts.map +1 -0
  153. package/dist/components/map-chart/lib/constants.js +122 -0
  154. package/dist/components/map-chart/lib/constants.js.map +1 -0
  155. package/dist/components/map-chart/lib/domain.d.ts +12 -0
  156. package/dist/components/map-chart/lib/domain.d.ts.map +1 -0
  157. package/dist/components/map-chart/lib/domain.js +105 -0
  158. package/dist/components/map-chart/lib/domain.js.map +1 -0
  159. package/dist/components/map-chart/lib/format.d.ts +8 -0
  160. package/dist/components/map-chart/lib/format.d.ts.map +1 -0
  161. package/dist/components/map-chart/lib/format.js +45 -0
  162. package/dist/components/map-chart/lib/format.js.map +1 -0
  163. package/dist/components/map-chart/lib/geo-index.d.ts +7 -0
  164. package/dist/components/map-chart/lib/geo-index.d.ts.map +1 -0
  165. package/dist/components/map-chart/lib/geo-index.js +200 -0
  166. package/dist/components/map-chart/lib/geo-index.js.map +1 -0
  167. package/dist/components/map-chart/lib/geojson.d.ts +5 -0
  168. package/dist/components/map-chart/lib/geojson.d.ts.map +1 -0
  169. package/dist/components/map-chart/lib/geojson.js +47 -0
  170. package/dist/components/map-chart/lib/geojson.js.map +1 -0
  171. package/dist/components/map-chart/lib/index.d.ts +13 -0
  172. package/dist/components/map-chart/lib/index.d.ts.map +1 -0
  173. package/dist/components/map-chart/lib/join.d.ts +7 -0
  174. package/dist/components/map-chart/lib/join.d.ts.map +1 -0
  175. package/dist/components/map-chart/lib/join.js +156 -0
  176. package/dist/components/map-chart/lib/join.js.map +1 -0
  177. package/dist/components/map-chart/lib/legend.d.ts +45 -0
  178. package/dist/components/map-chart/lib/legend.d.ts.map +1 -0
  179. package/dist/components/map-chart/lib/legend.js +108 -0
  180. package/dist/components/map-chart/lib/legend.js.map +1 -0
  181. package/dist/components/map-chart/lib/normalize.d.ts +3 -0
  182. package/dist/components/map-chart/lib/normalize.d.ts.map +1 -0
  183. package/dist/components/map-chart/lib/normalize.js +177 -0
  184. package/dist/components/map-chart/lib/normalize.js.map +1 -0
  185. package/dist/components/map-chart/lib/pmtiles.d.ts +41 -0
  186. package/dist/components/map-chart/lib/pmtiles.d.ts.map +1 -0
  187. package/dist/components/map-chart/lib/pmtiles.js +112 -0
  188. package/dist/components/map-chart/lib/pmtiles.js.map +1 -0
  189. package/dist/components/map-chart/lib/types.d.ts +128 -0
  190. package/dist/components/map-chart/lib/types.d.ts.map +1 -0
  191. package/dist/components/map-chart/metadata.json.d.ts +83 -0
  192. package/dist/components/map-chart/metadata.json.js +42 -0
  193. package/dist/components/map-chart/metadata.json.js.map +1 -0
  194. package/dist/components/map-chart/render/draw.d.ts +24 -0
  195. package/dist/components/map-chart/render/draw.d.ts.map +1 -0
  196. package/dist/components/map-chart/render/draw.js +455 -0
  197. package/dist/components/map-chart/render/draw.js.map +1 -0
  198. package/dist/components/map-chart/render/index.d.ts +2 -0
  199. package/dist/components/map-chart/render/index.d.ts.map +1 -0
  200. package/dist/components/matrix-chart/element/styles.d.ts +2 -0
  201. package/dist/components/matrix-chart/element/styles.d.ts.map +1 -0
  202. package/dist/components/matrix-chart/element/styles.js +97 -0
  203. package/dist/components/matrix-chart/element/styles.js.map +1 -0
  204. package/dist/components/matrix-chart/element/ui9000-matrix-chart.d.ts +39 -0
  205. package/dist/components/matrix-chart/element/ui9000-matrix-chart.d.ts.map +1 -0
  206. package/dist/components/matrix-chart/element/ui9000-matrix-chart.js +238 -0
  207. package/dist/components/matrix-chart/element/ui9000-matrix-chart.js.map +1 -0
  208. package/dist/components/matrix-chart/index.d.ts +5 -0
  209. package/dist/components/matrix-chart/index.d.ts.map +1 -0
  210. package/dist/components/matrix-chart/index.js +20 -0
  211. package/dist/components/matrix-chart/index.js.map +1 -0
  212. package/dist/components/matrix-chart/lib/domain.d.ts +7 -0
  213. package/dist/components/matrix-chart/lib/domain.d.ts.map +1 -0
  214. package/dist/components/matrix-chart/lib/domain.js +58 -0
  215. package/dist/components/matrix-chart/lib/domain.js.map +1 -0
  216. package/dist/components/matrix-chart/lib/format.d.ts +5 -0
  217. package/dist/components/matrix-chart/lib/format.d.ts.map +1 -0
  218. package/dist/components/matrix-chart/lib/format.js +16 -0
  219. package/dist/components/matrix-chart/lib/format.js.map +1 -0
  220. package/dist/components/matrix-chart/lib/index.d.ts +5 -0
  221. package/dist/components/matrix-chart/lib/index.d.ts.map +1 -0
  222. package/dist/components/matrix-chart/lib/normalize.d.ts +5 -0
  223. package/dist/components/matrix-chart/lib/normalize.d.ts.map +1 -0
  224. package/dist/components/matrix-chart/lib/normalize.js +165 -0
  225. package/dist/components/matrix-chart/lib/normalize.js.map +1 -0
  226. package/dist/components/matrix-chart/lib/types.d.ts +33 -0
  227. package/dist/components/matrix-chart/lib/types.d.ts.map +1 -0
  228. package/dist/components/matrix-chart/metadata.json.d.ts +110 -0
  229. package/dist/components/matrix-chart/metadata.json.js +42 -0
  230. package/dist/components/matrix-chart/metadata.json.js.map +1 -0
  231. package/dist/components/matrix-chart/render/draw.d.ts +63 -0
  232. package/dist/components/matrix-chart/render/draw.d.ts.map +1 -0
  233. package/dist/components/matrix-chart/render/draw.js +225 -0
  234. package/dist/components/matrix-chart/render/draw.js.map +1 -0
  235. package/dist/components/matrix-chart/render/index.d.ts +2 -0
  236. package/dist/components/matrix-chart/render/index.d.ts.map +1 -0
  237. package/dist/components/network-graph/element/styles.d.ts +2 -0
  238. package/dist/components/network-graph/element/styles.d.ts.map +1 -0
  239. package/dist/components/network-graph/element/styles.js +272 -0
  240. package/dist/components/network-graph/element/styles.js.map +1 -0
  241. package/dist/components/network-graph/element/ui9000-network-graph.d.ts +47 -0
  242. package/dist/components/network-graph/element/ui9000-network-graph.d.ts.map +1 -0
  243. package/dist/components/network-graph/element/ui9000-network-graph.js +307 -0
  244. package/dist/components/network-graph/element/ui9000-network-graph.js.map +1 -0
  245. package/dist/components/network-graph/index.d.ts +5 -0
  246. package/dist/components/network-graph/index.d.ts.map +1 -0
  247. package/dist/components/network-graph/index.js +37 -0
  248. package/dist/components/network-graph/index.js.map +1 -0
  249. package/dist/components/network-graph/lib/domain.d.ts +96 -0
  250. package/dist/components/network-graph/lib/domain.d.ts.map +1 -0
  251. package/dist/components/network-graph/lib/domain.js +211 -0
  252. package/dist/components/network-graph/lib/domain.js.map +1 -0
  253. package/dist/components/network-graph/lib/format.d.ts +7 -0
  254. package/dist/components/network-graph/lib/format.d.ts.map +1 -0
  255. package/dist/components/network-graph/lib/format.js +29 -0
  256. package/dist/components/network-graph/lib/format.js.map +1 -0
  257. package/dist/components/network-graph/lib/index.d.ts +6 -0
  258. package/dist/components/network-graph/lib/index.d.ts.map +1 -0
  259. package/dist/components/network-graph/lib/legend.d.ts +15 -0
  260. package/dist/components/network-graph/lib/legend.d.ts.map +1 -0
  261. package/dist/components/network-graph/lib/legend.js +35 -0
  262. package/dist/components/network-graph/lib/legend.js.map +1 -0
  263. package/dist/components/network-graph/lib/normalize.d.ts +10 -0
  264. package/dist/components/network-graph/lib/normalize.d.ts.map +1 -0
  265. package/dist/components/network-graph/lib/normalize.js +140 -0
  266. package/dist/components/network-graph/lib/normalize.js.map +1 -0
  267. package/dist/components/network-graph/lib/types.d.ts +56 -0
  268. package/dist/components/network-graph/lib/types.d.ts.map +1 -0
  269. package/dist/components/network-graph/metadata.json.d.ts +91 -0
  270. package/dist/components/network-graph/metadata.json.js +42 -0
  271. package/dist/components/network-graph/metadata.json.js.map +1 -0
  272. package/dist/components/network-graph/render/draw.d.ts +49 -0
  273. package/dist/components/network-graph/render/draw.d.ts.map +1 -0
  274. package/dist/components/network-graph/render/draw.js +493 -0
  275. package/dist/components/network-graph/render/draw.js.map +1 -0
  276. package/dist/components/network-graph/render/index.d.ts +2 -0
  277. package/dist/components/network-graph/render/index.d.ts.map +1 -0
  278. package/dist/components/parallel-coordinates-chart/element/styles.d.ts +2 -0
  279. package/dist/components/parallel-coordinates-chart/element/styles.d.ts.map +1 -0
  280. package/dist/components/parallel-coordinates-chart/element/styles.js +71 -0
  281. package/dist/components/parallel-coordinates-chart/element/styles.js.map +1 -0
  282. package/dist/components/parallel-coordinates-chart/element/ui9000-parallel-coordinates-chart.d.ts +33 -0
  283. package/dist/components/parallel-coordinates-chart/element/ui9000-parallel-coordinates-chart.d.ts.map +1 -0
  284. package/dist/components/parallel-coordinates-chart/element/ui9000-parallel-coordinates-chart.js +182 -0
  285. package/dist/components/parallel-coordinates-chart/element/ui9000-parallel-coordinates-chart.js.map +1 -0
  286. package/dist/components/parallel-coordinates-chart/index.d.ts +5 -0
  287. package/dist/components/parallel-coordinates-chart/index.d.ts.map +1 -0
  288. package/dist/components/parallel-coordinates-chart/index.js +23 -0
  289. package/dist/components/parallel-coordinates-chart/index.js.map +1 -0
  290. package/dist/components/parallel-coordinates-chart/lib/domain.d.ts +14 -0
  291. package/dist/components/parallel-coordinates-chart/lib/domain.d.ts.map +1 -0
  292. package/dist/components/parallel-coordinates-chart/lib/domain.js +28 -0
  293. package/dist/components/parallel-coordinates-chart/lib/domain.js.map +1 -0
  294. package/dist/components/parallel-coordinates-chart/lib/format.d.ts +12 -0
  295. package/dist/components/parallel-coordinates-chart/lib/format.d.ts.map +1 -0
  296. package/dist/components/parallel-coordinates-chart/lib/format.js +18 -0
  297. package/dist/components/parallel-coordinates-chart/lib/format.js.map +1 -0
  298. package/dist/components/parallel-coordinates-chart/lib/index.d.ts +5 -0
  299. package/dist/components/parallel-coordinates-chart/lib/index.d.ts.map +1 -0
  300. package/dist/components/parallel-coordinates-chart/lib/normalize.d.ts +23 -0
  301. package/dist/components/parallel-coordinates-chart/lib/normalize.d.ts.map +1 -0
  302. package/dist/components/parallel-coordinates-chart/lib/normalize.js +156 -0
  303. package/dist/components/parallel-coordinates-chart/lib/normalize.js.map +1 -0
  304. package/dist/components/parallel-coordinates-chart/lib/types.d.ts +48 -0
  305. package/dist/components/parallel-coordinates-chart/lib/types.d.ts.map +1 -0
  306. package/dist/components/parallel-coordinates-chart/metadata.json.d.ts +103 -0
  307. package/dist/components/parallel-coordinates-chart/metadata.json.js +45 -0
  308. package/dist/components/parallel-coordinates-chart/render/draw.d.ts +30 -0
  309. package/dist/components/parallel-coordinates-chart/render/draw.d.ts.map +1 -0
  310. package/dist/components/parallel-coordinates-chart/render/draw.js +160 -0
  311. package/dist/components/parallel-coordinates-chart/render/draw.js.map +1 -0
  312. package/dist/components/parallel-coordinates-chart/render/index.d.ts +2 -0
  313. package/dist/components/parallel-coordinates-chart/render/index.d.ts.map +1 -0
  314. package/dist/components/pie-chart/element/styles.d.ts.map +1 -1
  315. package/dist/components/pie-chart/element/styles.js +34 -1
  316. package/dist/components/pie-chart/element/styles.js.map +1 -1
  317. package/dist/components/pie-chart/element/ui9000-pie-chart.d.ts +1 -3
  318. package/dist/components/pie-chart/element/ui9000-pie-chart.d.ts.map +1 -1
  319. package/dist/components/pie-chart/element/ui9000-pie-chart.js +2 -8
  320. package/dist/components/pie-chart/element/ui9000-pie-chart.js.map +1 -1
  321. package/dist/components/pie-chart/metadata.json.d.ts +1 -7
  322. package/dist/components/pie-chart/metadata.json.js +2 -2
  323. package/dist/components/polar-area-chart/element/styles.d.ts +2 -0
  324. package/dist/components/polar-area-chart/element/styles.d.ts.map +1 -0
  325. package/dist/components/polar-area-chart/element/styles.js +48 -0
  326. package/dist/components/polar-area-chart/element/styles.js.map +1 -0
  327. package/dist/components/polar-area-chart/element/ui9000-polar-area-chart.d.ts +29 -0
  328. package/dist/components/polar-area-chart/element/ui9000-polar-area-chart.d.ts.map +1 -0
  329. package/dist/components/polar-area-chart/element/ui9000-polar-area-chart.js +168 -0
  330. package/dist/components/polar-area-chart/element/ui9000-polar-area-chart.js.map +1 -0
  331. package/dist/components/polar-area-chart/index.d.ts +5 -0
  332. package/dist/components/polar-area-chart/index.d.ts.map +1 -0
  333. package/dist/components/polar-area-chart/index.js +19 -0
  334. package/dist/components/polar-area-chart/index.js.map +1 -0
  335. package/dist/components/polar-area-chart/lib/domain.d.ts +33 -0
  336. package/dist/components/polar-area-chart/lib/domain.d.ts.map +1 -0
  337. package/dist/components/polar-area-chart/lib/domain.js +67 -0
  338. package/dist/components/polar-area-chart/lib/domain.js.map +1 -0
  339. package/dist/components/polar-area-chart/lib/index.d.ts +4 -0
  340. package/dist/components/polar-area-chart/lib/index.d.ts.map +1 -0
  341. package/dist/components/polar-area-chart/lib/normalize.d.ts +4 -0
  342. package/dist/components/polar-area-chart/lib/normalize.d.ts.map +1 -0
  343. package/dist/components/polar-area-chart/lib/normalize.js +183 -0
  344. package/dist/components/polar-area-chart/lib/normalize.js.map +1 -0
  345. package/dist/components/polar-area-chart/lib/types.d.ts +48 -0
  346. package/dist/components/polar-area-chart/lib/types.d.ts.map +1 -0
  347. package/dist/components/polar-area-chart/metadata.json.d.ts +79 -0
  348. package/dist/components/polar-area-chart/metadata.json.js +42 -0
  349. package/dist/components/polar-area-chart/metadata.json.js.map +1 -0
  350. package/dist/components/polar-area-chart/render/draw.d.ts +25 -0
  351. package/dist/components/polar-area-chart/render/draw.d.ts.map +1 -0
  352. package/dist/components/polar-area-chart/render/draw.js +127 -0
  353. package/dist/components/polar-area-chart/render/draw.js.map +1 -0
  354. package/dist/components/polar-area-chart/render/index.d.ts +2 -0
  355. package/dist/components/polar-area-chart/render/index.d.ts.map +1 -0
  356. package/dist/components/punchcard-chart/element/ui9000-punchcard-chart.d.ts +1 -1
  357. package/dist/components/punchcard-chart/metadata.json.d.ts +1 -1
  358. package/dist/components/punchcard-chart/metadata.json.js +1 -1
  359. package/dist/components/radar-chart/element/ui9000-radar-chart.d.ts +1 -1
  360. package/dist/components/radial-bar-chart/element/styles.d.ts +2 -0
  361. package/dist/components/radial-bar-chart/element/styles.d.ts.map +1 -0
  362. package/dist/components/radial-bar-chart/element/styles.js +53 -0
  363. package/dist/components/radial-bar-chart/element/styles.js.map +1 -0
  364. package/dist/components/radial-bar-chart/element/ui9000-radial-bar-chart.d.ts +35 -0
  365. package/dist/components/radial-bar-chart/element/ui9000-radial-bar-chart.d.ts.map +1 -0
  366. package/dist/components/radial-bar-chart/element/ui9000-radial-bar-chart.js +174 -0
  367. package/dist/components/radial-bar-chart/element/ui9000-radial-bar-chart.js.map +1 -0
  368. package/dist/components/radial-bar-chart/index.d.ts +5 -0
  369. package/dist/components/radial-bar-chart/index.d.ts.map +1 -0
  370. package/dist/components/radial-bar-chart/index.js +21 -0
  371. package/dist/components/radial-bar-chart/index.js.map +1 -0
  372. package/dist/components/radial-bar-chart/lib/domain.d.ts +47 -0
  373. package/dist/components/radial-bar-chart/lib/domain.d.ts.map +1 -0
  374. package/dist/components/radial-bar-chart/lib/domain.js +50 -0
  375. package/dist/components/radial-bar-chart/lib/domain.js.map +1 -0
  376. package/dist/components/radial-bar-chart/lib/format.d.ts +6 -0
  377. package/dist/components/radial-bar-chart/lib/format.d.ts.map +1 -0
  378. package/dist/components/radial-bar-chart/lib/format.js +12 -0
  379. package/dist/components/radial-bar-chart/lib/format.js.map +1 -0
  380. package/dist/components/radial-bar-chart/lib/index.d.ts +5 -0
  381. package/dist/components/radial-bar-chart/lib/index.d.ts.map +1 -0
  382. package/dist/components/radial-bar-chart/lib/normalize.d.ts +4 -0
  383. package/dist/components/radial-bar-chart/lib/normalize.d.ts.map +1 -0
  384. package/dist/components/radial-bar-chart/lib/normalize.js +92 -0
  385. package/dist/components/radial-bar-chart/lib/normalize.js.map +1 -0
  386. package/dist/components/radial-bar-chart/lib/types.d.ts +34 -0
  387. package/dist/components/radial-bar-chart/lib/types.d.ts.map +1 -0
  388. package/dist/components/radial-bar-chart/metadata.json.d.ts +62 -0
  389. package/dist/components/radial-bar-chart/metadata.json.js +42 -0
  390. package/dist/components/radial-bar-chart/metadata.json.js.map +1 -0
  391. package/dist/components/radial-bar-chart/render/draw.d.ts +29 -0
  392. package/dist/components/radial-bar-chart/render/draw.d.ts.map +1 -0
  393. package/dist/components/radial-bar-chart/render/draw.js +92 -0
  394. package/dist/components/radial-bar-chart/render/draw.js.map +1 -0
  395. package/dist/components/radial-bar-chart/render/index.d.ts +2 -0
  396. package/dist/components/radial-bar-chart/render/index.d.ts.map +1 -0
  397. package/dist/components/sankey-chart/element/styles.d.ts.map +1 -1
  398. package/dist/components/sankey-chart/element/styles.js +7 -27
  399. package/dist/components/sankey-chart/element/styles.js.map +1 -1
  400. package/dist/components/sankey-chart/element/ui9000-sankey-chart.d.ts +6 -6
  401. package/dist/components/sankey-chart/element/ui9000-sankey-chart.d.ts.map +1 -1
  402. package/dist/components/sankey-chart/element/ui9000-sankey-chart.js +39 -36
  403. package/dist/components/sankey-chart/element/ui9000-sankey-chart.js.map +1 -1
  404. package/dist/components/sankey-chart/index.js +4 -2
  405. package/dist/components/sankey-chart/index.js.map +1 -1
  406. package/dist/components/sankey-chart/lib/domain.d.ts +2 -2
  407. package/dist/components/sankey-chart/lib/domain.d.ts.map +1 -1
  408. package/dist/components/sankey-chart/lib/domain.js +1 -13
  409. package/dist/components/sankey-chart/lib/domain.js.map +1 -1
  410. package/dist/components/sankey-chart/lib/format.d.ts +1 -2
  411. package/dist/components/sankey-chart/lib/format.d.ts.map +1 -1
  412. package/dist/components/sankey-chart/lib/format.js +3 -7
  413. package/dist/components/sankey-chart/lib/format.js.map +1 -1
  414. package/dist/components/scatter-plot-chart/element/ui9000-scatter-plot.d.ts +1 -1
  415. package/dist/components/scatter-sparkline-chart/element/ui9000-scatter-sparkline-chart.d.ts +1 -1
  416. package/dist/components/spark-area-chart/element/ui9000-spark-area-chart.d.ts +1 -1
  417. package/dist/components/spark-line-chart/element/ui9000-spark-line-chart.d.ts +1 -1
  418. package/dist/components/step-line-chart/element/ui9000-step-line-chart.d.ts +1 -1
  419. package/dist/components/treemap-chart/element/styles.d.ts +2 -0
  420. package/dist/components/treemap-chart/element/styles.d.ts.map +1 -0
  421. package/dist/components/treemap-chart/element/styles.js +141 -0
  422. package/dist/components/treemap-chart/element/styles.js.map +1 -0
  423. package/dist/components/treemap-chart/element/ui9000-treemap-chart.d.ts +35 -0
  424. package/dist/components/treemap-chart/element/ui9000-treemap-chart.d.ts.map +1 -0
  425. package/dist/components/treemap-chart/element/ui9000-treemap-chart.js +177 -0
  426. package/dist/components/treemap-chart/element/ui9000-treemap-chart.js.map +1 -0
  427. package/dist/components/treemap-chart/index.d.ts +5 -0
  428. package/dist/components/treemap-chart/index.d.ts.map +1 -0
  429. package/dist/components/treemap-chart/index.js +22 -0
  430. package/dist/components/treemap-chart/index.js.map +1 -0
  431. package/dist/components/treemap-chart/lib/color.d.ts +25 -0
  432. package/dist/components/treemap-chart/lib/color.d.ts.map +1 -0
  433. package/dist/components/treemap-chart/lib/color.js +67 -0
  434. package/dist/components/treemap-chart/lib/color.js.map +1 -0
  435. package/dist/components/treemap-chart/lib/format.d.ts +7 -0
  436. package/dist/components/treemap-chart/lib/format.d.ts.map +1 -0
  437. package/dist/components/treemap-chart/lib/format.js +9 -0
  438. package/dist/components/treemap-chart/lib/format.js.map +1 -0
  439. package/dist/components/treemap-chart/lib/index.d.ts +6 -0
  440. package/dist/components/treemap-chart/lib/index.d.ts.map +1 -0
  441. package/dist/components/treemap-chart/lib/layout.d.ts +18 -0
  442. package/dist/components/treemap-chart/lib/layout.d.ts.map +1 -0
  443. package/dist/components/treemap-chart/lib/layout.js +31 -0
  444. package/dist/components/treemap-chart/lib/layout.js.map +1 -0
  445. package/dist/components/treemap-chart/lib/normalize.d.ts +4 -0
  446. package/dist/components/treemap-chart/lib/normalize.d.ts.map +1 -0
  447. package/dist/components/treemap-chart/lib/normalize.js +182 -0
  448. package/dist/components/treemap-chart/lib/normalize.js.map +1 -0
  449. package/dist/components/treemap-chart/lib/types.d.ts +63 -0
  450. package/dist/components/treemap-chart/lib/types.d.ts.map +1 -0
  451. package/dist/components/treemap-chart/metadata.json.d.ts +126 -0
  452. package/dist/components/treemap-chart/metadata.json.js +45 -0
  453. package/dist/components/treemap-chart/metadata.json.js.map +1 -0
  454. package/dist/components/treemap-chart/render/draw.d.ts +24 -0
  455. package/dist/components/treemap-chart/render/draw.d.ts.map +1 -0
  456. package/dist/components/treemap-chart/render/draw.js +124 -0
  457. package/dist/components/treemap-chart/render/draw.js.map +1 -0
  458. package/dist/components/treemap-chart/render/index.d.ts +2 -0
  459. package/dist/components/treemap-chart/render/index.d.ts.map +1 -0
  460. package/dist/components/violin-chart/element/ui9000-violin-chart.d.ts +1 -1
  461. package/dist/components/waterfall-chart/element/ui9000-waterfall-chart.d.ts +1 -1
  462. package/dist/element/chart-legend-render.d.ts +5 -0
  463. package/dist/element/chart-legend-render.d.ts.map +1 -1
  464. package/dist/element/chart-legend-render.js +19 -1
  465. package/dist/element/chart-legend-render.js.map +1 -1
  466. package/dist/element/chart-shell-styles.d.ts.map +1 -1
  467. package/dist/element/chart-shell-styles.js +35 -0
  468. package/dist/element/chart-shell-styles.js.map +1 -1
  469. package/dist/element/ui9000-chart-base.d.ts +2 -2
  470. package/dist/index.d.ts +20 -4
  471. package/dist/index.d.ts.map +1 -1
  472. package/dist/index.js +178 -47
  473. package/dist/index.js.map +1 -1
  474. package/dist/lazy/bias-variance-tradeoff-chart.d.ts +4 -0
  475. package/dist/lazy/bias-variance-tradeoff-chart.d.ts.map +1 -0
  476. package/dist/lazy/bias-variance-tradeoff-chart.js +5 -0
  477. package/dist/lazy/bias-variance-tradeoff-chart.js.map +1 -0
  478. package/dist/lazy/gini-impurity-entropy-chart.d.ts +4 -0
  479. package/dist/lazy/gini-impurity-entropy-chart.d.ts.map +1 -0
  480. package/dist/lazy/gini-impurity-entropy-chart.js +5 -0
  481. package/dist/lazy/gini-impurity-entropy-chart.js.map +1 -0
  482. package/dist/lazy/index.d.ts +10 -2
  483. package/dist/lazy/index.d.ts.map +1 -1
  484. package/dist/lazy/index.js +72 -8
  485. package/dist/lazy/index.js.map +1 -1
  486. package/dist/lazy/map-chart.d.ts +4 -0
  487. package/dist/lazy/map-chart.d.ts.map +1 -0
  488. package/dist/lazy/map-chart.js +5 -0
  489. package/dist/lazy/map-chart.js.map +1 -0
  490. package/dist/lazy/matrix-chart.d.ts +4 -0
  491. package/dist/lazy/matrix-chart.d.ts.map +1 -0
  492. package/dist/lazy/matrix-chart.js +5 -0
  493. package/dist/lazy/matrix-chart.js.map +1 -0
  494. package/dist/lazy/network-graph.d.ts +4 -0
  495. package/dist/lazy/network-graph.d.ts.map +1 -0
  496. package/dist/lazy/network-graph.js +5 -0
  497. package/dist/lazy/network-graph.js.map +1 -0
  498. package/dist/lazy/parallel-coordinates-chart.d.ts +4 -0
  499. package/dist/lazy/parallel-coordinates-chart.d.ts.map +1 -0
  500. package/dist/lazy/parallel-coordinates-chart.js +5 -0
  501. package/dist/lazy/parallel-coordinates-chart.js.map +1 -0
  502. package/dist/lazy/polar-area-chart.d.ts +4 -0
  503. package/dist/lazy/polar-area-chart.d.ts.map +1 -0
  504. package/dist/lazy/polar-area-chart.js +5 -0
  505. package/dist/lazy/polar-area-chart.js.map +1 -0
  506. package/dist/lazy/radial-bar-chart.d.ts +4 -0
  507. package/dist/lazy/radial-bar-chart.d.ts.map +1 -0
  508. package/dist/lazy/radial-bar-chart.js +5 -0
  509. package/dist/lazy/radial-bar-chart.js.map +1 -0
  510. package/dist/lazy/treemap-chart.d.ts +4 -0
  511. package/dist/lazy/treemap-chart.d.ts.map +1 -0
  512. package/dist/lazy/treemap-chart.js +5 -0
  513. package/dist/lazy/treemap-chart.js.map +1 -0
  514. package/dist/node_modules/lit-html/directive.js.map +1 -0
  515. package/dist/node_modules/lit-html/directives/style-map.js.map +1 -0
  516. package/dist/node_modules/lit-html/lit-html.js.map +1 -0
  517. package/dist/utils/axis-units.d.ts +15 -0
  518. package/dist/utils/axis-units.d.ts.map +1 -0
  519. package/dist/utils/axis-units.js +27 -0
  520. package/dist/utils/axis-units.js.map +1 -0
  521. package/dist/utils/breakpoints.d.ts +7 -0
  522. package/dist/utils/breakpoints.d.ts.map +1 -0
  523. package/dist/utils/breakpoints.js +17 -0
  524. package/dist/utils/breakpoints.js.map +1 -0
  525. package/dist/utils/chart-helpers.d.ts +25 -6
  526. package/dist/utils/chart-helpers.d.ts.map +1 -1
  527. package/dist/utils/chart-helpers.js +70 -15
  528. package/dist/utils/chart-helpers.js.map +1 -1
  529. package/dist/utils/format-text.d.ts +22 -0
  530. package/dist/utils/format-text.d.ts.map +1 -0
  531. package/dist/utils/format-text.js +33 -0
  532. package/dist/utils/format-text.js.map +1 -0
  533. package/dist/utils/fuse-palette.d.ts +12 -0
  534. package/dist/utils/fuse-palette.d.ts.map +1 -1
  535. package/dist/utils/fuse-palette.js +23 -1
  536. package/dist/utils/fuse-palette.js.map +1 -1
  537. package/dist/utils/fuse-widget.d.ts +13 -4
  538. package/dist/utils/fuse-widget.d.ts.map +1 -1
  539. package/dist/utils/fuse-widget.js.map +1 -1
  540. package/dist/utils/fusedash-visual.d.ts +208 -52
  541. package/dist/utils/fusedash-visual.d.ts.map +1 -1
  542. package/dist/utils/fusedash-visual.js +162 -30
  543. package/dist/utils/fusedash-visual.js.map +1 -1
  544. package/package.json +91 -12
  545. package/dist/components/donut-group-chart/element/styles.d.ts +0 -2
  546. package/dist/components/donut-group-chart/element/styles.d.ts.map +0 -1
  547. package/dist/components/donut-group-chart/element/styles.js.map +0 -1
  548. package/dist/components/donut-group-chart/element/ui9000-donut-group-chart.d.ts +0 -34
  549. package/dist/components/donut-group-chart/element/ui9000-donut-group-chart.d.ts.map +0 -1
  550. package/dist/components/donut-group-chart/element/ui9000-donut-group-chart.js +0 -169
  551. package/dist/components/donut-group-chart/element/ui9000-donut-group-chart.js.map +0 -1
  552. package/dist/components/donut-group-chart/index.d.ts +0 -5
  553. package/dist/components/donut-group-chart/index.d.ts.map +0 -1
  554. package/dist/components/donut-group-chart/index.js +0 -23
  555. package/dist/components/donut-group-chart/lib/domain.d.ts +0 -39
  556. package/dist/components/donut-group-chart/lib/domain.d.ts.map +0 -1
  557. package/dist/components/donut-group-chart/lib/domain.js +0 -51
  558. package/dist/components/donut-group-chart/lib/domain.js.map +0 -1
  559. package/dist/components/donut-group-chart/lib/format.d.ts +0 -7
  560. package/dist/components/donut-group-chart/lib/format.d.ts.map +0 -1
  561. package/dist/components/donut-group-chart/lib/format.js +0 -21
  562. package/dist/components/donut-group-chart/lib/format.js.map +0 -1
  563. package/dist/components/donut-group-chart/lib/index.d.ts +0 -5
  564. package/dist/components/donut-group-chart/lib/index.d.ts.map +0 -1
  565. package/dist/components/donut-group-chart/lib/normalize.d.ts +0 -14
  566. package/dist/components/donut-group-chart/lib/normalize.d.ts.map +0 -1
  567. package/dist/components/donut-group-chart/lib/normalize.js +0 -98
  568. package/dist/components/donut-group-chart/lib/normalize.js.map +0 -1
  569. package/dist/components/donut-group-chart/lib/types.d.ts +0 -49
  570. package/dist/components/donut-group-chart/lib/types.d.ts.map +0 -1
  571. package/dist/components/donut-group-chart/metadata.json.d.ts +0 -113
  572. package/dist/components/donut-group-chart/metadata.json.js +0 -45
  573. package/dist/components/donut-group-chart/render/draw.d.ts +0 -44
  574. package/dist/components/donut-group-chart/render/draw.d.ts.map +0 -1
  575. package/dist/components/donut-group-chart/render/draw.js +0 -194
  576. package/dist/components/donut-group-chart/render/draw.js.map +0 -1
  577. package/dist/components/donut-group-chart/render/index.d.ts +0 -2
  578. package/dist/components/donut-group-chart/render/index.d.ts.map +0 -1
  579. package/dist/components/donut-group-chart/tests/fixtures.d.ts +0 -33
  580. package/dist/components/donut-group-chart/tests/fixtures.d.ts.map +0 -1
  581. package/dist/lazy/donut-group-chart.d.ts +0 -4
  582. package/dist/lazy/donut-group-chart.d.ts.map +0 -1
  583. package/dist/lazy/donut-group-chart.js +0 -5
  584. package/dist/lazy/donut-group-chart.js.map +0 -1
  585. package/dist/node_modules/.pnpm/lit-html@3.3.3/node_modules/lit-html/directive.js.map +0 -1
  586. package/dist/node_modules/.pnpm/lit-html@3.3.3/node_modules/lit-html/directives/style-map.js.map +0 -1
  587. package/dist/node_modules/.pnpm/lit-html@3.3.3/node_modules/lit-html/lit-html.js.map +0 -1
  588. /package/dist/components/{donut-group-chart → bias-variance-tradeoff-chart}/index.js.map +0 -0
  589. /package/dist/components/{donut-group-chart → parallel-coordinates-chart}/metadata.json.js.map +0 -0
  590. /package/dist/node_modules/{.pnpm/lit-html@3.3.3/node_modules/lit-html → lit-html}/directive.js +0 -0
  591. /package/dist/node_modules/{.pnpm/lit-html@3.3.3/node_modules/lit-html → lit-html}/directives/style-map.js +0 -0
  592. /package/dist/node_modules/{.pnpm/lit-html@3.3.3/node_modules/lit-html → lit-html}/lit-html.js +0 -0
@@ -0,0 +1,493 @@
1
+ import { drag } from "d3-drag";
2
+ import { forceCenter, forceX, forceY, forceLink, forceSimulation, forceManyBody, forceCollide } from "d3-force";
3
+ import { select } from "d3-selection";
4
+ import { zoom, zoomIdentity } from "d3-zoom";
5
+ import { nodeRadius, NODE_COLORS, LINK_COLORS, LINK_WIDTH, LINK_LABEL_COLORS, shadowRadius, NODE_BORDER_WIDTH, nodeColor, LABEL_ALWAYS_ABOVE, networkForces, NODE_LABEL_COLORS, scaleLinkWidthByMax, INITIAL_NODE_RADIUS_RATIO } from "../lib/domain.js";
6
+ import { formatLinkValue, formatNodeValue } from "../lib/format.js";
7
+ const LABEL_PADDING_TOP = 14;
8
+ const LABEL_PADDING_BOTTOM = 4;
9
+ const LABEL_PADDING_GAP = 5;
10
+ const LABEL_TITLE_SIZE = 12;
11
+ const LABEL_TITLE_LINE = 16;
12
+ const LABEL_VALUE_SIZE = 10;
13
+ const LABEL_VALUE_LINE = 14;
14
+ const LINK_LABEL_SIZE = 8;
15
+ const LINK_LABEL_PAD_X = 2;
16
+ const LINK_LABEL_PAD_Y = 1;
17
+ const LINK_LABEL_OFFSET = 10;
18
+ const DRAG_AREA_PAD = 10;
19
+ const DRAG_SLOP = 5;
20
+ const ZOOM_EXTENT = [0.3, 4];
21
+ const PRESETTLE_TICKS = 250;
22
+ const FIT_PADDING = 32;
23
+ const FIT_SCALE_EXTENT = [0.4, 1.25];
24
+ const GOLDEN_ANGLE = Math.PI * (3 - Math.sqrt(5));
25
+ const GRAPHS = /* @__PURE__ */ new WeakMap();
26
+ let instanceCount = 0;
27
+ function clamp(value, min, max) {
28
+ return Math.max(min, Math.min(max, value));
29
+ }
30
+ function endpointId(end) {
31
+ return typeof end === "string" ? end : end.id;
32
+ }
33
+ function measure(el) {
34
+ if (!el || typeof el.getBBox !== "function") return null;
35
+ try {
36
+ return el.getBBox();
37
+ } catch {
38
+ return null;
39
+ }
40
+ }
41
+ function rimPoint(x, y, towardX, towardY, radius) {
42
+ const dx = towardX - x;
43
+ const dy = towardY - y;
44
+ const distance = Math.sqrt(dx * dx + dy * dy);
45
+ if (distance === 0) return { x, y };
46
+ return { x: x + dx / distance * radius, y: y + dy / distance * radius };
47
+ }
48
+ function stopNetworkGraph(container) {
49
+ const state = GRAPHS.get(container);
50
+ if (!state) return;
51
+ state.controller = null;
52
+ if (!state.simulation) return;
53
+ for (const node of state.simulation.nodes()) {
54
+ if (typeof node.x === "number" && typeof node.y === "number") {
55
+ state.positions.set(node.id, { x: node.x, y: node.y });
56
+ }
57
+ }
58
+ state.simulation.stop();
59
+ state.simulation = null;
60
+ }
61
+ function updateNetworkGraphVisibility(container, visibleIds) {
62
+ var _a;
63
+ const controller = (_a = GRAPHS.get(container)) == null ? void 0 : _a.controller;
64
+ if (!controller) return false;
65
+ controller.setVisibleIds(visibleIds);
66
+ return true;
67
+ }
68
+ function resizeNetworkGraph(container, width, height) {
69
+ var _a;
70
+ const controller = (_a = GRAPHS.get(container)) == null ? void 0 : _a.controller;
71
+ if (!controller || width <= 0 || height <= 0) return false;
72
+ controller.resize(width, height);
73
+ return true;
74
+ }
75
+ function renderNetworkGraph(container, options) {
76
+ var _a;
77
+ const { model, theme, onSelect } = options;
78
+ let visibleIds = options.visibleIds;
79
+ let width = options.width;
80
+ let height = options.height;
81
+ stopNetworkGraph(container);
82
+ container.replaceChildren();
83
+ if (!model.nodes.length || width <= 0 || height <= 0) return null;
84
+ const positions = ((_a = GRAPHS.get(container)) == null ? void 0 : _a.positions) ?? /* @__PURE__ */ new Map();
85
+ const instance = ++instanceCount;
86
+ const blurId = `ui9000-ng-blur-${instance}`;
87
+ const shadowId = `ui9000-ng-shadow-${instance}`;
88
+ const radiusById = new Map(
89
+ model.nodes.map((node) => [node.id, nodeRadius(node, model.breakpoints)])
90
+ );
91
+ const maxNodeRadius = Math.max(...radiusById.values());
92
+ const simNodes = model.nodes.map((node, index) => {
93
+ const seed = positions.get(node.id) ?? seedPosition(index, model.nodes.length, width, height);
94
+ return { ...node, x: seed.x, y: seed.y };
95
+ });
96
+ const nodeById = new Map(simNodes.map((node) => [node.id, node]));
97
+ const simLinks = model.links.map((link) => ({ ...link }));
98
+ const isNodeVisible = (id) => !visibleIds || visibleIds.has(id);
99
+ const isLinkVisible = (link) => isNodeVisible(endpointId(link.source)) && isNodeVisible(endpointId(link.target));
100
+ const neighbours = /* @__PURE__ */ new Map();
101
+ for (const link of simLinks) {
102
+ const source = endpointId(link.source);
103
+ const target = endpointId(link.target);
104
+ if (!neighbours.has(source)) neighbours.set(source, /* @__PURE__ */ new Set());
105
+ if (!neighbours.has(target)) neighbours.set(target, /* @__PURE__ */ new Set());
106
+ neighbours.get(source).add(target);
107
+ neighbours.get(target).add(source);
108
+ }
109
+ let activeNodeId = options.activeNodeId ?? null;
110
+ let hoveredNodeId = null;
111
+ const svg = select(container).append("svg").attr("width", "100%").attr("height", "100%").attr("viewBox", `0 0 ${width} ${height}`).attr("preserveAspectRatio", "xMidYMid meet").style("display", "block").style("font-family", theme.fontFamily);
112
+ appendDefs(svg, blurId, shadowId);
113
+ const root = svg.append("g").attr("class", "graph-root");
114
+ const linkLayer = root.append("g").attr("class", "link-layer");
115
+ const linkLabelLayer = root.append("g").attr("class", "link-label-layer");
116
+ const nodeLayer = root.append("g").attr("class", "node-layer");
117
+ const links = buildLinks(linkLayer, linkLabelLayer, simLinks);
118
+ const nodes = buildNodes({
119
+ layer: nodeLayer,
120
+ simNodes,
121
+ model,
122
+ radiusById,
123
+ blurId,
124
+ shadowId
125
+ });
126
+ const labelExtent = /* @__PURE__ */ new Map();
127
+ for (const part of nodes) {
128
+ if (!part.alwaysLabelled || !part.labelBg) continue;
129
+ const right = Number(part.labelBg.getAttribute("width")) || 0;
130
+ const half = (Number(part.labelBg.getAttribute("height")) || 0) / 2;
131
+ if (right || half) labelExtent.set(part.datum.id, { right, half });
132
+ }
133
+ const forces = networkForces(width, height, maxNodeRadius);
134
+ const centerForce = forceCenter(width / 2, height / 2).strength(0.1);
135
+ const xForce = forceX(width / 2).strength(0.05);
136
+ const yForce = forceY(height / 2).strength(0.05);
137
+ const linkForce = forceLink(simLinks).id((d) => d.id).distance(forces.linkDistance).strength(0.5);
138
+ const simulation = forceSimulation(simNodes).stop().force("link", linkForce).force(
139
+ "charge",
140
+ forceManyBody().strength((d) => isNodeVisible(d.id) ? forces.charge : 0)
141
+ ).force("center", centerForce).force(
142
+ "collision",
143
+ forceCollide().radius((d) => isNodeVisible(d.id) ? forces.collide : 0)
144
+ ).force("x", xForce).force("y", yForce);
145
+ function pinIndependentNodes() {
146
+ const linked = /* @__PURE__ */ new Set();
147
+ for (const link of simLinks) {
148
+ if (!isLinkVisible(link)) continue;
149
+ linked.add(endpointId(link.source));
150
+ linked.add(endpointId(link.target));
151
+ }
152
+ for (const node of simNodes) {
153
+ if (isNodeVisible(node.id) && linked.has(node.id)) {
154
+ node.fx = null;
155
+ node.fy = null;
156
+ } else {
157
+ node.fx = node.x;
158
+ node.fy = node.y;
159
+ }
160
+ }
161
+ }
162
+ GRAPHS.set(container, { simulation, positions, controller: null });
163
+ const isConnected = (id) => {
164
+ var _a2;
165
+ return !!activeNodeId && activeNodeId !== id && !!((_a2 = neighbours.get(activeNodeId)) == null ? void 0 : _a2.has(id));
166
+ };
167
+ const isLinkActive = (link) => !!activeNodeId && (endpointId(link.source) === activeNodeId || endpointId(link.target) === activeNodeId);
168
+ function updateFrame() {
169
+ for (const node of simNodes) {
170
+ const radius = radiusById.get(node.id) ?? 0;
171
+ node.x = clamp(node.x ?? width / 2, radius, width - radius);
172
+ node.y = clamp(node.y ?? height / 2, radius, height - radius);
173
+ }
174
+ for (const part of links) {
175
+ const source = nodeById.get(endpointId(part.datum.source));
176
+ const target = nodeById.get(endpointId(part.datum.target));
177
+ if (!source || !target) continue;
178
+ const sx = source.x ?? 0;
179
+ const sy = source.y ?? 0;
180
+ const tx = target.x ?? 0;
181
+ const ty = target.y ?? 0;
182
+ const from = rimPoint(sx, sy, tx, ty, radiusById.get(source.id) ?? 0);
183
+ const to = rimPoint(tx, ty, sx, sy, radiusById.get(target.id) ?? 0);
184
+ part.line.setAttribute("x1", String(from.x));
185
+ part.line.setAttribute("y1", String(from.y));
186
+ part.line.setAttribute("x2", String(to.x));
187
+ part.line.setAttribute("y2", String(to.y));
188
+ if (!part.label) continue;
189
+ const show = part.visible && isLinkActive(part.datum);
190
+ part.label.style.opacity = show ? "1" : "0";
191
+ if (!show) continue;
192
+ const angle = Math.atan2(to.y - from.y, to.x - from.x) * 180 / Math.PI;
193
+ const upright = angle > 90 || angle < -90 ? angle + 180 : angle;
194
+ const perpendicular = (angle - 90) * Math.PI / 180;
195
+ const cx = (from.x + to.x) / 2 + Math.cos(perpendicular) * LINK_LABEL_OFFSET;
196
+ const cy = (from.y + to.y) / 2 + Math.sin(perpendicular) * LINK_LABEL_OFFSET;
197
+ part.label.setAttribute("transform", `translate(${cx}, ${cy}) rotate(${upright})`);
198
+ }
199
+ for (const part of nodes) {
200
+ part.group.setAttribute(
201
+ "transform",
202
+ `translate(${part.datum.x ?? 0}, ${part.datum.y ?? 0})`
203
+ );
204
+ }
205
+ }
206
+ function applyState() {
207
+ var _a2, _b, _c;
208
+ for (const part of nodes) {
209
+ const id = part.datum.id;
210
+ const active = activeNodeId === id;
211
+ const hovered = hoveredNodeId === id;
212
+ const connected = isConnected(id);
213
+ part.background.setAttribute(
214
+ "fill",
215
+ active && !part.hasImage ? NODE_COLORS.activeFill : nodeColor(part.datum)
216
+ );
217
+ if (!part.label) continue;
218
+ const show = part.alwaysLabelled || active || hovered || connected;
219
+ part.label.style.opacity = show ? "1" : "0";
220
+ if (part.labelBg) {
221
+ part.labelBg.setAttribute(
222
+ "fill",
223
+ active ? NODE_LABEL_COLORS.backgroundActive : hovered ? NODE_LABEL_COLORS.backgroundHover : NODE_LABEL_COLORS.background
224
+ );
225
+ }
226
+ const textFill = active ? NODE_LABEL_COLORS.textActive : NODE_LABEL_COLORS.text;
227
+ (_a2 = part.labelTitle) == null ? void 0 : _a2.setAttribute("fill", textFill);
228
+ (_b = part.labelTitle) == null ? void 0 : _b.setAttribute("font-weight", active || connected ? "600" : "400");
229
+ (_c = part.labelValue) == null ? void 0 : _c.setAttribute("fill", textFill);
230
+ }
231
+ for (const part of links) {
232
+ part.line.setAttribute(
233
+ "stroke-width",
234
+ String(
235
+ isLinkActive(part.datum) ? scaleLinkWidthByMax(part.datum.value, model.maxLinkValue) : LINK_WIDTH
236
+ )
237
+ );
238
+ }
239
+ }
240
+ function setActive(id) {
241
+ activeNodeId = id;
242
+ applyState();
243
+ updateFrame();
244
+ onSelect == null ? void 0 : onSelect(id);
245
+ }
246
+ function applyVisibility() {
247
+ for (const part of nodes) {
248
+ const visible = isNodeVisible(part.datum.id);
249
+ part.group.style.opacity = visible ? "1" : "0";
250
+ part.group.style.pointerEvents = visible ? "all" : "none";
251
+ if (part.grab) part.grab.style.pointerEvents = visible ? "all" : "none";
252
+ }
253
+ for (const part of links) {
254
+ part.visible = isLinkVisible(part.datum);
255
+ part.line.style.opacity = part.visible ? "1" : "0";
256
+ }
257
+ linkForce.links(simLinks.filter((link) => isLinkVisible(link)));
258
+ pinIndependentNodes();
259
+ if (hoveredNodeId && !isNodeVisible(hoveredNodeId)) hoveredNodeId = null;
260
+ if (activeNodeId && !isNodeVisible(activeNodeId)) setActive(null);
261
+ else {
262
+ applyState();
263
+ updateFrame();
264
+ }
265
+ }
266
+ function applyFit() {
267
+ const fitted = fitTransform(
268
+ simNodes.filter((node) => isNodeVisible(node.id)),
269
+ radiusById,
270
+ width,
271
+ height,
272
+ labelExtent
273
+ );
274
+ if (!fitted) return;
275
+ if (zoomBehaviour) svg.call(zoomBehaviour.transform, fitted);
276
+ else root.attr("transform", fitted.toString());
277
+ }
278
+ function resize(nextWidth, nextHeight) {
279
+ width = nextWidth;
280
+ height = nextHeight;
281
+ svg.attr("viewBox", `0 0 ${width} ${height}`);
282
+ centerForce.x(width / 2).y(height / 2);
283
+ xForce.x(width / 2);
284
+ yForce.y(height / 2);
285
+ updateFrame();
286
+ applyFit();
287
+ }
288
+ attachNodeInteractions({
289
+ nodes,
290
+ simulation,
291
+ getBounds: () => ({ width, height }),
292
+ radiusById,
293
+ onHover: (id) => {
294
+ hoveredNodeId = id;
295
+ applyState();
296
+ },
297
+ onClick: (id) => setActive(activeNodeId === id ? null : id),
298
+ onDragEnd: pinIndependentNodes
299
+ });
300
+ let zoomBehaviour = null;
301
+ if (options.enableZoom !== false) {
302
+ zoomBehaviour = zoom().scaleExtent(ZOOM_EXTENT).filter((event) => {
303
+ var _a2, _b;
304
+ if (event.type === "wheel") return !!(event.ctrlKey || event.metaKey);
305
+ if (event.button != null && event.button !== 0) return false;
306
+ return !((_b = (_a2 = event.target) == null ? void 0 : _a2.closest) == null ? void 0 : _b.call(_a2, "g.node"));
307
+ }).on("zoom", (event) => {
308
+ root.attr("transform", event.transform.toString());
309
+ });
310
+ svg.call(zoomBehaviour);
311
+ }
312
+ simulation.tick(PRESETTLE_TICKS);
313
+ applyVisibility();
314
+ applyFit();
315
+ simulation.on("tick", updateFrame);
316
+ const controller = {
317
+ setVisibleIds(next) {
318
+ visibleIds = next;
319
+ applyVisibility();
320
+ },
321
+ resize
322
+ };
323
+ GRAPHS.set(container, { simulation, positions, controller });
324
+ return controller;
325
+ }
326
+ function fitTransform(nodes, radiusById, width, height, labelExtent) {
327
+ let minX = Infinity;
328
+ let minY = Infinity;
329
+ let maxX = -Infinity;
330
+ let maxY = -Infinity;
331
+ for (const node of nodes) {
332
+ if (typeof node.x !== "number" || typeof node.y !== "number") continue;
333
+ const radius = radiusById.get(node.id) ?? 0;
334
+ const label = labelExtent.get(node.id);
335
+ const vertical = Math.max(radius, (label == null ? void 0 : label.half) ?? 0);
336
+ minX = Math.min(minX, node.x - radius);
337
+ minY = Math.min(minY, node.y - vertical);
338
+ maxX = Math.max(maxX, node.x + radius + ((label == null ? void 0 : label.right) ?? 0));
339
+ maxY = Math.max(maxY, node.y + vertical);
340
+ }
341
+ if (!Number.isFinite(minX)) return null;
342
+ const spanX = Math.max(maxX - minX, 1);
343
+ const spanY = Math.max(maxY - minY, 1);
344
+ const scale = clamp(
345
+ Math.min((width - FIT_PADDING * 2) / spanX, (height - FIT_PADDING * 2) / spanY),
346
+ FIT_SCALE_EXTENT[0],
347
+ FIT_SCALE_EXTENT[1]
348
+ );
349
+ return zoomIdentity.translate(width / 2 - (minX + maxX) / 2 * scale, height / 2 - (minY + maxY) / 2 * scale).scale(scale);
350
+ }
351
+ function seedPosition(index, count, width, height) {
352
+ const maxRadius = Math.min(width, height) * INITIAL_NODE_RADIUS_RATIO;
353
+ const radius = maxRadius * Math.sqrt(count <= 1 ? 0 : index / (count - 1));
354
+ const angle = index * GOLDEN_ANGLE;
355
+ return {
356
+ x: width / 2 + Math.cos(angle) * radius,
357
+ y: height / 2 + Math.sin(angle) * radius
358
+ };
359
+ }
360
+ function appendDefs(svg, blurId, shadowId) {
361
+ const defs = svg.append("defs");
362
+ defs.append("filter").attr("id", blurId).attr("x", "-50%").attr("y", "-50%").attr("width", "200%").attr("height", "200%").append("feGaussianBlur").attr("stdDeviation", 12);
363
+ const radial = defs.append("radialGradient").attr("id", shadowId);
364
+ radial.append("stop").attr("offset", "0%").attr("stop-color", NODE_COLORS.shadowInner).attr("stop-opacity", 1);
365
+ radial.append("stop").attr("offset", "100%").attr("stop-color", NODE_COLORS.shadowOuter).attr("stop-opacity", 0.12);
366
+ }
367
+ function buildLinks(linkLayer, labelLayer, simLinks) {
368
+ return simLinks.map((datum) => {
369
+ const line = linkLayer.append("line").attr("class", "link-line").attr("stroke", LINK_COLORS[datum.type]).attr("stroke-width", LINK_WIDTH).attr("stroke-linecap", "round").style("opacity", 1).style("pointer-events", "none").node();
370
+ let label = null;
371
+ {
372
+ const group = labelLayer.append("g").attr("class", "link-label").style("opacity", 0).style("pointer-events", "none");
373
+ const background = group.append("rect").attr("class", "link-label-background").attr("rx", 5).attr("ry", 5).attr("fill", LINK_LABEL_COLORS.background);
374
+ const text = group.append("text").attr("class", "link-label-text").text(formatLinkValue(datum.value)).attr("font-size", LINK_LABEL_SIZE).attr("fill", LINK_LABEL_COLORS.text).attr("dominant-baseline", "middle").attr("text-anchor", "middle");
375
+ const box = measure(text.node());
376
+ if (box) {
377
+ background.attr("x", box.x - LINK_LABEL_PAD_X).attr("y", box.y - LINK_LABEL_PAD_Y).attr("width", box.width + LINK_LABEL_PAD_X * 2).attr("height", box.height + LINK_LABEL_PAD_Y * 2);
378
+ }
379
+ label = group.node();
380
+ }
381
+ return { datum, line, label, visible: true };
382
+ });
383
+ }
384
+ function buildNodes(params) {
385
+ const { layer, simNodes, model, radiusById, blurId, shadowId } = params;
386
+ return simNodes.map((datum) => {
387
+ const radius = radiusById.get(datum.id) ?? 0;
388
+ const shadow = shadowRadius(datum, model.breakpoints);
389
+ const hasImage = !!datum.img;
390
+ const group = layer.append("g").datum(datum).attr("class", "node").style("cursor", "grab").style("opacity", 1).style("pointer-events", "all");
391
+ const label = appendNodeLabel(group, datum, radius);
392
+ group.append("circle").attr("class", "node-shadow-blue").attr("r", shadow).attr("fill", NODE_COLORS.glow).attr("opacity", 0.15).attr("filter", `url(#${blurId})`).style("pointer-events", "none");
393
+ const grab = group.append("circle").attr("class", "node-drag-area").attr("r", radius + NODE_BORDER_WIDTH + DRAG_AREA_PAD).attr("fill", "transparent").style("cursor", "grab").style("pointer-events", "all").node();
394
+ group.append("circle").attr("class", "node-shadow-dark").attr("r", shadow).attr("fill", `url(#${shadowId})`).attr("opacity", 0.1).attr("filter", `url(#${blurId})`).style("pointer-events", "none");
395
+ const background = group.append("circle").attr("class", "node-background").attr("r", radius).attr("fill", nodeColor(datum)).style("opacity", hasImage ? 0 : 1).style("pointer-events", "none").node();
396
+ group.append("circle").attr("class", "node-border-white").attr("r", radius).attr("fill", "none").attr("stroke", NODE_COLORS.innerBorder).attr("stroke-width", NODE_BORDER_WIDTH).style("pointer-events", "none");
397
+ if (hasImage) {
398
+ group.append("image").attr("class", "node-image").attr("href", datum.img).attr("width", radius * 2).attr("height", radius * 2).attr("x", -radius).attr("y", -radius).attr("clip-path", `circle(${radius}px at ${radius}px ${radius}px)`).attr("preserveAspectRatio", "xMidYMid slice").style("pointer-events", "none");
399
+ }
400
+ group.append("circle").attr("class", "node-border-purple").attr("r", radius + NODE_BORDER_WIDTH).attr("fill", "none").attr("stroke", NODE_COLORS.outerBorder).attr("stroke-width", NODE_BORDER_WIDTH).style("pointer-events", "none");
401
+ return {
402
+ datum,
403
+ group: group.node(),
404
+ background,
405
+ grab,
406
+ label: label.group,
407
+ labelBg: label.background,
408
+ labelTitle: label.title,
409
+ labelValue: label.value,
410
+ radius,
411
+ hasImage,
412
+ alwaysLabelled: radius > LABEL_ALWAYS_ABOVE
413
+ };
414
+ });
415
+ }
416
+ function appendNodeLabel(group, datum, radius) {
417
+ const valueText = formatNodeValue(datum.value);
418
+ if (!datum.label && !valueText) {
419
+ return { group: null, background: null, title: null, value: null };
420
+ }
421
+ const labelGroup = group.append("g").attr("class", "node-label").attr("transform", "translate(1, 0)").style("opacity", 0).style("pointer-events", "none");
422
+ const background = labelGroup.append("rect").attr("class", "node-label-background").attr("rx", 4).attr("ry", 4).attr("fill", NODE_LABEL_COLORS.background);
423
+ const title = labelGroup.append("text").attr("class", "node-label-title").text(datum.label).attr("font-size", LABEL_TITLE_SIZE).attr("font-weight", "400").attr("fill", NODE_LABEL_COLORS.text).attr("text-anchor", "middle").attr("dominant-baseline", "hanging");
424
+ const value = labelGroup.append("text").attr("class", "node-label-value").text(valueText).attr("font-size", LABEL_VALUE_SIZE).attr("fill", NODE_LABEL_COLORS.text).attr("text-anchor", "middle").attr("dominant-baseline", "hanging");
425
+ const paddingX = radius + LABEL_PADDING_GAP;
426
+ const titleBox = measure(title.node());
427
+ const valueBox = measure(value.node());
428
+ const contentWidth = Math.max((titleBox == null ? void 0 : titleBox.width) ?? 0, (valueBox == null ? void 0 : valueBox.width) ?? 0);
429
+ const boxWidth = paddingX * 2 + contentWidth;
430
+ const boxHeight = LABEL_PADDING_TOP + LABEL_TITLE_LINE + LABEL_VALUE_LINE + LABEL_PADDING_BOTTOM;
431
+ const centerX = paddingX + contentWidth / 2;
432
+ background.attr("x", 0).attr("y", -boxHeight / 2).attr("width", boxWidth).attr("height", boxHeight);
433
+ title.attr("x", centerX).attr("y", -boxHeight / 2 + LABEL_PADDING_TOP);
434
+ value.attr("x", centerX).attr("y", -boxHeight / 2 + LABEL_PADDING_TOP + LABEL_TITLE_LINE);
435
+ return {
436
+ group: labelGroup.node(),
437
+ background: background.node(),
438
+ title: title.node(),
439
+ value: value.node()
440
+ };
441
+ }
442
+ function attachNodeInteractions(params) {
443
+ const { nodes, simulation, getBounds, radiusById, onHover, onClick, onDragEnd } = params;
444
+ let moved = false;
445
+ let start = null;
446
+ const behaviour = drag().filter((event) => event.button === 0).on("start", (event, d) => {
447
+ event.sourceEvent.stopPropagation();
448
+ start = { x: event.sourceEvent.clientX, y: event.sourceEvent.clientY };
449
+ moved = false;
450
+ if (!event.active) simulation.alphaTarget(0.3).restart();
451
+ const { width, height } = getBounds();
452
+ d.fx = d.x ?? width / 2;
453
+ d.fy = d.y ?? height / 2;
454
+ }).on("drag", (event, d) => {
455
+ if (start) {
456
+ const dx = event.sourceEvent.clientX - start.x;
457
+ const dy = event.sourceEvent.clientY - start.y;
458
+ if (Math.sqrt(dx * dx + dy * dy) > DRAG_SLOP) moved = true;
459
+ }
460
+ const { width, height } = getBounds();
461
+ const radius = radiusById.get(d.id) ?? 0;
462
+ d.fx = clamp((d.fx ?? d.x ?? 0) + event.dx, radius, width - radius);
463
+ d.fy = clamp((d.fy ?? d.y ?? 0) + event.dy, radius, height - radius);
464
+ }).on("end", (event, d) => {
465
+ if (!event.active) simulation.alphaTarget(0);
466
+ d.x = d.fx ?? d.x;
467
+ d.y = d.fy ?? d.y;
468
+ onDragEnd();
469
+ start = null;
470
+ });
471
+ for (const part of nodes) {
472
+ const group = select(part.group);
473
+ group.call(behaviour);
474
+ const grab = group.select(".node-drag-area");
475
+ grab.on("click", (event) => {
476
+ event.stopPropagation();
477
+ if (moved) {
478
+ moved = false;
479
+ return;
480
+ }
481
+ onClick(part.datum.id);
482
+ });
483
+ grab.on("mouseenter", () => onHover(part.datum.id));
484
+ grab.on("mouseleave", () => onHover(null));
485
+ }
486
+ }
487
+ export {
488
+ renderNetworkGraph,
489
+ resizeNetworkGraph,
490
+ stopNetworkGraph,
491
+ updateNetworkGraphVisibility
492
+ };
493
+ //# sourceMappingURL=draw.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"draw.js","sources":["../../../../src/components/network-graph/render/draw.ts"],"sourcesContent":["import { drag, type D3DragEvent } from 'd3-drag';\nimport {\n forceCenter,\n forceCollide,\n forceLink,\n forceManyBody,\n forceSimulation,\n forceX,\n forceY,\n type Simulation,\n type SimulationLinkDatum,\n type SimulationNodeDatum,\n} from 'd3-force';\nimport { select, type Selection } from 'd3-selection';\nimport { zoom, zoomIdentity, type ZoomBehavior, type ZoomTransform } from 'd3-zoom';\n\nimport type { WidgetTheme } from '../../../types/index.js';\nimport {\n INITIAL_NODE_RADIUS_RATIO,\n LABEL_ALWAYS_ABOVE,\n LINK_COLORS,\n LINK_LABEL_COLORS,\n LINK_WIDTH,\n NODE_BORDER_WIDTH,\n NODE_COLORS,\n NODE_LABEL_COLORS,\n formatLinkValue,\n formatNodeValue,\n networkForces,\n nodeColor,\n nodeRadius,\n scaleLinkWidthByMax,\n shadowRadius,\n type NetworkGraphModel,\n type NetworkLink,\n type NetworkNode,\n} from '../lib/index.js';\n\n/** Node label box (client `createNodeLabel`). */\nconst LABEL_PADDING_TOP = 14;\nconst LABEL_PADDING_BOTTOM = 4;\nconst LABEL_PADDING_GAP = 5;\nconst LABEL_TITLE_SIZE = 12;\nconst LABEL_TITLE_LINE = 16;\nconst LABEL_VALUE_SIZE = 10;\nconst LABEL_VALUE_LINE = 14;\n/** Link pill (client `createLinkLabelBackground`). */\nconst LINK_LABEL_SIZE = 8;\nconst LINK_LABEL_PAD_X = 2;\nconst LINK_LABEL_PAD_Y = 1;\nconst LINK_LABEL_OFFSET = 10;\n/** Invisible grab ring around each node (client `.node-drag-area`). */\nconst DRAG_AREA_PAD = 10;\n/** Pointer travel that turns a click into a drag (client). */\nconst DRAG_SLOP = 5;\nconst ZOOM_EXTENT: [number, number] = [0.3, 4];\n/**\n * The client animates the layout in from the canvas centre. A chat card is read\n * at a glance, so the simulation is stepped to rest before the first paint and\n * then left idle — dragging a node restarts it, exactly as in the client.\n */\nconst PRESETTLE_TICKS = 250;\n/** Padding kept around the graph when it is fitted to the container. */\nconst FIT_PADDING = 32;\n/** Fitting may enlarge a sparse graph, but never past readable label sizes. */\nconst FIT_SCALE_EXTENT: [number, number] = [0.4, 1.25];\n/** Even seed ring so the first frame is reproducible across renders. */\nconst GOLDEN_ANGLE = Math.PI * (3 - Math.sqrt(5));\n\ntype SimNode = NetworkNode & SimulationNodeDatum;\ntype SimLink = Omit<NetworkLink, 'source' | 'target'> &\n SimulationLinkDatum<SimNode> & { source: string | SimNode; target: string | SimNode };\n\nexport interface RenderNetworkGraphOptions {\n model: NetworkGraphModel;\n /** `null` shows every node; otherwise only these ids stay visible. */\n visibleIds: Set<string> | null;\n width: number;\n height: number;\n theme: WidgetTheme;\n /** Selection carried across a redraw (legend filtering keeps it). */\n activeNodeId?: string | null;\n /** Fired when a node is clicked; `null` when the same node is clicked again. */\n onSelect?: (id: string | null) => void;\n /** Drag-to-pan plus ctrl/cmd + wheel zoom. */\n enableZoom?: boolean;\n}\n\ninterface NodeParts {\n datum: SimNode;\n group: SVGGElement;\n background: SVGCircleElement;\n /** Invisible ring that carries the pointer handlers. */\n grab: SVGCircleElement | null;\n label: SVGGElement | null;\n labelBg: SVGRectElement | null;\n labelTitle: SVGTextElement | null;\n labelValue: SVGTextElement | null;\n radius: number;\n hasImage: boolean;\n alwaysLabelled: boolean;\n}\n\n/** How far a node's always-on label reaches past the circle itself. */\ninterface LabelExtent {\n right: number;\n half: number;\n}\n\ninterface LinkParts {\n datum: SimLink;\n line: SVGLineElement;\n label: SVGGElement | null;\n visible: boolean;\n}\n\n/**\n * Live handle on a mounted graph. The element keeps this so the legend filter\n * and container resizes can update the plot in place instead of rebuilding it.\n */\nexport interface NetworkGraphController {\n /**\n * Legend filter — hides nodes/links in place. Isolated visible nodes stay\n * pinned in their zone; ghost links to hidden nodes leave the force.\n */\n setVisibleIds(visibleIds: Set<string> | null): void;\n /** Container resize — re-frames the settled layout, runs no new force ticks. */\n resize(width: number, height: number): void;\n}\n\ninterface GraphState {\n simulation: Simulation<SimNode, SimLink> | null;\n positions: Map<string, { x: number; y: number }>;\n controller: NetworkGraphController | null;\n}\n\nconst GRAPHS = new WeakMap<HTMLElement, GraphState>();\n\nlet instanceCount = 0;\n\nfunction clamp(value: number, min: number, max: number): number {\n return Math.max(min, Math.min(max, value));\n}\n\nfunction endpointId(end: string | SimNode): string {\n return typeof end === 'string' ? end : end.id;\n}\n\n/** `getBBox` is unavailable outside a real layout engine (jsdom, detached DOM). */\nfunction measure(el: SVGGraphicsElement | null): DOMRect | null {\n if (!el || typeof el.getBBox !== 'function') return null;\n try {\n return el.getBBox();\n } catch {\n return null;\n }\n}\n\n/**\n * Client `getLinkPoint` — pull an endpoint out to the rim of its node so the\n * stroke starts where the circle ends.\n */\nfunction rimPoint(\n x: number,\n y: number,\n towardX: number,\n towardY: number,\n radius: number,\n): { x: number; y: number } {\n const dx = towardX - x;\n const dy = towardY - y;\n const distance = Math.sqrt(dx * dx + dy * dy);\n if (distance === 0) return { x, y };\n return { x: x + (dx / distance) * radius, y: y + (dy / distance) * radius };\n}\n\n/** Stop the simulation attached to `container`, keeping its layout for the next draw. */\nexport function stopNetworkGraph(container: HTMLElement): void {\n const state = GRAPHS.get(container);\n if (!state) return;\n state.controller = null;\n if (!state.simulation) return;\n for (const node of state.simulation.nodes()) {\n if (typeof node.x === 'number' && typeof node.y === 'number') {\n state.positions.set(node.id, { x: node.x, y: node.y });\n }\n }\n state.simulation.stop();\n state.simulation = null;\n}\n\n/**\n * Legend filter. Returns `false` when no graph is mounted so the caller can fall\n * back to a full render; on success nothing is rebuilt and the camera holds.\n */\nexport function updateNetworkGraphVisibility(\n container: HTMLElement,\n visibleIds: Set<string> | null,\n): boolean {\n const controller = GRAPHS.get(container)?.controller;\n if (!controller) return false;\n controller.setVisibleIds(visibleIds);\n return true;\n}\n\n/**\n * Container resize. Returns `false` when no graph is mounted; otherwise the\n * settled layout is re-framed without re-running the force simulation.\n */\nexport function resizeNetworkGraph(\n container: HTMLElement,\n width: number,\n height: number,\n): boolean {\n const controller = GRAPHS.get(container)?.controller;\n if (!controller || width <= 0 || height <= 0) return false;\n controller.resize(width, height);\n return true;\n}\n\n/**\n * FuseDash NetworkGraph — a d3-force layout of image/colour nodes joined by\n * value-weighted links. The client lays out on a fixed 2000x1375 canvas and\n * zooms into it; chat gives the chart its container instead, so the simulation\n * runs in container coordinates with the spatial forces scaled to match.\n */\nexport function renderNetworkGraph(\n container: HTMLElement,\n options: RenderNetworkGraphOptions,\n): NetworkGraphController | null {\n const { model, theme, onSelect } = options;\n // Mutated in place by the controller — a filter or a resize must not rebuild.\n let visibleIds = options.visibleIds;\n let width = options.width;\n let height = options.height;\n\n stopNetworkGraph(container);\n container.replaceChildren();\n if (!model.nodes.length || width <= 0 || height <= 0) return null;\n\n const positions = GRAPHS.get(container)?.positions ?? new Map();\n const instance = ++instanceCount;\n const blurId = `ui9000-ng-blur-${instance}`;\n const shadowId = `ui9000-ng-shadow-${instance}`;\n\n const radiusById = new Map(\n model.nodes.map((node) => [node.id, nodeRadius(node, model.breakpoints)]),\n );\n const maxNodeRadius = Math.max(...radiusById.values());\n\n const simNodes: SimNode[] = model.nodes.map((node, index) => {\n const seed = positions.get(node.id) ?? seedPosition(index, model.nodes.length, width, height);\n return { ...node, x: seed.x, y: seed.y };\n });\n const nodeById = new Map(simNodes.map((node) => [node.id, node]));\n const simLinks: SimLink[] = model.links.map((link) => ({ ...link }));\n\n const isNodeVisible = (id: string): boolean => !visibleIds || visibleIds.has(id);\n const isLinkVisible = (link: SimLink): boolean =>\n isNodeVisible(endpointId(link.source)) && isNodeVisible(endpointId(link.target));\n\n const neighbours = new Map<string, Set<string>>();\n for (const link of simLinks) {\n const source = endpointId(link.source);\n const target = endpointId(link.target);\n if (!neighbours.has(source)) neighbours.set(source, new Set());\n if (!neighbours.has(target)) neighbours.set(target, new Set());\n neighbours.get(source)!.add(target);\n neighbours.get(target)!.add(source);\n }\n\n let activeNodeId = options.activeNodeId ?? null;\n let hoveredNodeId: string | null = null;\n\n const svg = select(container)\n .append('svg')\n .attr('width', '100%')\n .attr('height', '100%')\n .attr('viewBox', `0 0 ${width} ${height}`)\n .attr('preserveAspectRatio', 'xMidYMid meet')\n .style('display', 'block')\n .style('font-family', theme.fontFamily);\n\n appendDefs(svg, blurId, shadowId);\n\n const root = svg.append('g').attr('class', 'graph-root');\n const linkLayer = root.append('g').attr('class', 'link-layer');\n const linkLabelLayer = root.append('g').attr('class', 'link-label-layer');\n const nodeLayer = root.append('g').attr('class', 'node-layer');\n\n const links = buildLinks(linkLayer, linkLabelLayer, simLinks);\n const nodes = buildNodes({\n layer: nodeLayer,\n simNodes,\n model,\n radiusById,\n blurId,\n shadowId,\n });\n\n // Labels hang off the right of their node and are taller than a small circle,\n // so the camera has to allow for them or a narrow frame clips them.\n const labelExtent = new Map<string, LabelExtent>();\n for (const part of nodes) {\n if (!part.alwaysLabelled || !part.labelBg) continue;\n const right = Number(part.labelBg.getAttribute('width')) || 0;\n const half = (Number(part.labelBg.getAttribute('height')) || 0) / 2;\n if (right || half) labelExtent.set(part.datum.id, { right, half });\n }\n\n const forces = networkForces(width, height, maxNodeRadius);\n // Centring forces are kept by reference: a resize retargets them instead of\n // rebuilding the simulation.\n const centerForce = forceCenter<SimNode>(width / 2, height / 2).strength(0.1);\n const xForce = forceX<SimNode>(width / 2).strength(0.05);\n const yForce = forceY<SimNode>(height / 2).strength(0.05);\n // The first settle uses every link so each node lands in its network zone.\n // After a legend filter, only visible–visible edges stay in the force.\n const linkForce = forceLink<SimNode, SimLink>(simLinks)\n .id((d) => d.id)\n .distance(forces.linkDistance)\n .strength(0.5);\n const simulation = forceSimulation<SimNode>(simNodes)\n .stop()\n .force('link', linkForce)\n .force(\n 'charge',\n forceManyBody<SimNode>().strength((d) => (isNodeVisible(d.id) ? forces.charge : 0)),\n )\n .force('center', centerForce)\n .force(\n 'collision',\n forceCollide<SimNode>().radius((d) => (isNodeVisible(d.id) ? forces.collide : 0)),\n )\n .force('x', xForce)\n .force('y', yForce);\n\n /**\n * A node with no remaining visible edge stays where it is. Hidden nodes are\n * pinned too so they cannot pull or shove the rest of the graph.\n */\n function pinIndependentNodes(): void {\n const linked = new Set<string>();\n for (const link of simLinks) {\n if (!isLinkVisible(link)) continue;\n linked.add(endpointId(link.source));\n linked.add(endpointId(link.target));\n }\n for (const node of simNodes) {\n if (isNodeVisible(node.id) && linked.has(node.id)) {\n node.fx = null;\n node.fy = null;\n } else {\n node.fx = node.x;\n node.fy = node.y;\n }\n }\n }\n\n GRAPHS.set(container, { simulation, positions, controller: null });\n\n const isConnected = (id: string): boolean =>\n !!activeNodeId && activeNodeId !== id && !!neighbours.get(activeNodeId)?.has(id);\n\n const isLinkActive = (link: SimLink): boolean =>\n !!activeNodeId &&\n (endpointId(link.source) === activeNodeId || endpointId(link.target) === activeNodeId);\n\n /** Geometry — runs on every simulation tick. */\n function updateFrame(): void {\n for (const node of simNodes) {\n const radius = radiusById.get(node.id) ?? 0;\n node.x = clamp(node.x ?? width / 2, radius, width - radius);\n node.y = clamp(node.y ?? height / 2, radius, height - radius);\n }\n\n for (const part of links) {\n const source = nodeById.get(endpointId(part.datum.source));\n const target = nodeById.get(endpointId(part.datum.target));\n if (!source || !target) continue;\n\n const sx = source.x ?? 0;\n const sy = source.y ?? 0;\n const tx = target.x ?? 0;\n const ty = target.y ?? 0;\n const from = rimPoint(sx, sy, tx, ty, radiusById.get(source.id) ?? 0);\n const to = rimPoint(tx, ty, sx, sy, radiusById.get(target.id) ?? 0);\n\n part.line.setAttribute('x1', String(from.x));\n part.line.setAttribute('y1', String(from.y));\n part.line.setAttribute('x2', String(to.x));\n part.line.setAttribute('y2', String(to.y));\n\n if (!part.label) continue;\n const show = part.visible && isLinkActive(part.datum);\n part.label.style.opacity = show ? '1' : '0';\n if (!show) continue;\n\n const angle = (Math.atan2(to.y - from.y, to.x - from.x) * 180) / Math.PI;\n const upright = angle > 90 || angle < -90 ? angle + 180 : angle;\n const perpendicular = ((angle - 90) * Math.PI) / 180;\n const cx = (from.x + to.x) / 2 + Math.cos(perpendicular) * LINK_LABEL_OFFSET;\n const cy = (from.y + to.y) / 2 + Math.sin(perpendicular) * LINK_LABEL_OFFSET;\n part.label.setAttribute('transform', `translate(${cx}, ${cy}) rotate(${upright})`);\n }\n\n for (const part of nodes) {\n part.group.setAttribute(\n 'transform',\n `translate(${part.datum.x ?? 0}, ${part.datum.y ?? 0})`,\n );\n }\n }\n\n /** Selection / hover styling — runs only when the interaction state changes. */\n function applyState(): void {\n for (const part of nodes) {\n const id = part.datum.id;\n const active = activeNodeId === id;\n const hovered = hoveredNodeId === id;\n const connected = isConnected(id);\n\n part.background.setAttribute(\n 'fill',\n active && !part.hasImage ? NODE_COLORS.activeFill : nodeColor(part.datum),\n );\n\n if (!part.label) continue;\n const show = part.alwaysLabelled || active || hovered || connected;\n part.label.style.opacity = show ? '1' : '0';\n\n if (part.labelBg) {\n part.labelBg.setAttribute(\n 'fill',\n active\n ? NODE_LABEL_COLORS.backgroundActive\n : hovered\n ? NODE_LABEL_COLORS.backgroundHover\n : NODE_LABEL_COLORS.background,\n );\n }\n const textFill = active ? NODE_LABEL_COLORS.textActive : NODE_LABEL_COLORS.text;\n part.labelTitle?.setAttribute('fill', textFill);\n part.labelTitle?.setAttribute('font-weight', active || connected ? '600' : '400');\n part.labelValue?.setAttribute('fill', textFill);\n }\n\n for (const part of links) {\n part.line.setAttribute(\n 'stroke-width',\n String(\n isLinkActive(part.datum)\n ? scaleLinkWidthByMax(part.datum.value, model.maxLinkValue)\n : LINK_WIDTH,\n ),\n );\n }\n }\n\n function setActive(id: string | null): void {\n activeNodeId = id;\n applyState();\n updateFrame();\n onSelect?.(id);\n }\n\n /**\n * Legend filter. Hidden nodes and their edges leave the picture and the\n * force; remaining nodes keep their zone — isolated ones are pinned so the\n * centre forces cannot pile them together.\n */\n function applyVisibility(): void {\n for (const part of nodes) {\n const visible = isNodeVisible(part.datum.id);\n part.group.style.opacity = visible ? '1' : '0';\n part.group.style.pointerEvents = visible ? 'all' : 'none';\n if (part.grab) part.grab.style.pointerEvents = visible ? 'all' : 'none';\n }\n for (const part of links) {\n part.visible = isLinkVisible(part.datum);\n part.line.style.opacity = part.visible ? '1' : '0';\n }\n linkForce.links(simLinks.filter((link) => isLinkVisible(link)));\n pinIndependentNodes();\n // A node filtered out of view must not stay selected or hovered.\n if (hoveredNodeId && !isNodeVisible(hoveredNodeId)) hoveredNodeId = null;\n if (activeNodeId && !isNodeVisible(activeNodeId)) setActive(null);\n else {\n applyState();\n updateFrame();\n }\n }\n\n /** Centre the visible nodes in the current frame. */\n function applyFit(): void {\n const fitted = fitTransform(\n simNodes.filter((node) => isNodeVisible(node.id)),\n radiusById,\n width,\n height,\n labelExtent,\n );\n if (!fitted) return;\n if (zoomBehaviour) svg.call(zoomBehaviour.transform, fitted);\n else root.attr('transform', fitted.toString());\n }\n\n /**\n * Container resize. The settled layout is still good, so only the viewBox, the\n * clamp bounds, the centring force targets and the camera move — re-running\n * PRESETTLE_TICKS here would reshuffle the graph under the reader.\n */\n function resize(nextWidth: number, nextHeight: number): void {\n width = nextWidth;\n height = nextHeight;\n svg.attr('viewBox', `0 0 ${width} ${height}`);\n centerForce.x(width / 2).y(height / 2);\n xForce.x(width / 2);\n yForce.y(height / 2);\n updateFrame();\n applyFit();\n }\n\n attachNodeInteractions({\n nodes,\n simulation,\n getBounds: () => ({ width, height }),\n radiusById,\n onHover: (id) => {\n hoveredNodeId = id;\n applyState();\n },\n onClick: (id) => setActive(activeNodeId === id ? null : id),\n onDragEnd: pinIndependentNodes,\n });\n\n let zoomBehaviour: ZoomBehavior<SVGSVGElement, unknown> | null = null;\n\n if (options.enableZoom !== false) {\n zoomBehaviour = zoom<SVGSVGElement, unknown>()\n .scaleExtent(ZOOM_EXTENT)\n .filter((event: Event & { ctrlKey?: boolean; metaKey?: boolean; button?: number }) => {\n // Chat scrolls the transcript — plain wheel must pass through.\n if (event.type === 'wheel') return !!(event.ctrlKey || event.metaKey);\n if (event.button != null && event.button !== 0) return false;\n return !(event.target as Element | null)?.closest?.('g.node');\n })\n .on('zoom', (event: { transform: ZoomTransform }) => {\n root.attr('transform', event.transform.toString());\n });\n svg.call(zoomBehaviour);\n }\n\n // The only place the layout is settled: first mount and data changes.\n simulation.tick(PRESETTLE_TICKS);\n applyVisibility();\n applyFit();\n simulation.on('tick', updateFrame);\n\n const controller: NetworkGraphController = {\n setVisibleIds(next) {\n visibleIds = next;\n applyVisibility();\n },\n resize,\n };\n GRAPHS.set(container, { simulation, positions, controller });\n return controller;\n}\n\n/**\n * Centre the settled layout in the container. The client zooms into a fixed\n * canvas; here the canvas *is* the container, so a graph that condenses into a\n * corner is nudged back into view. Filtered-out nodes stay in the simulation to\n * hold the layout steady, so only the visible ones frame the camera.\n */\nfunction fitTransform(\n nodes: SimNode[],\n radiusById: Map<string, number>,\n width: number,\n height: number,\n labelExtent: Map<string, LabelExtent>,\n): ZoomTransform | null {\n let minX = Infinity;\n let minY = Infinity;\n let maxX = -Infinity;\n let maxY = -Infinity;\n\n for (const node of nodes) {\n if (typeof node.x !== 'number' || typeof node.y !== 'number') continue;\n const radius = radiusById.get(node.id) ?? 0;\n const label = labelExtent.get(node.id);\n const vertical = Math.max(radius, label?.half ?? 0);\n minX = Math.min(minX, node.x - radius);\n minY = Math.min(minY, node.y - vertical);\n maxX = Math.max(maxX, node.x + radius + (label?.right ?? 0));\n maxY = Math.max(maxY, node.y + vertical);\n }\n if (!Number.isFinite(minX)) return null;\n\n const spanX = Math.max(maxX - minX, 1);\n const spanY = Math.max(maxY - minY, 1);\n const scale = clamp(\n Math.min((width - FIT_PADDING * 2) / spanX, (height - FIT_PADDING * 2) / spanY),\n FIT_SCALE_EXTENT[0],\n FIT_SCALE_EXTENT[1],\n );\n\n return zoomIdentity\n .translate(width / 2 - ((minX + maxX) / 2) * scale, height / 2 - ((minY + maxY) / 2) * scale)\n .scale(scale);\n}\n\nfunction seedPosition(\n index: number,\n count: number,\n width: number,\n height: number,\n): { x: number; y: number } {\n const maxRadius = Math.min(width, height) * INITIAL_NODE_RADIUS_RATIO;\n const radius = maxRadius * Math.sqrt(count <= 1 ? 0 : index / (count - 1));\n const angle = index * GOLDEN_ANGLE;\n return {\n x: width / 2 + Math.cos(angle) * radius,\n y: height / 2 + Math.sin(angle) * radius,\n };\n}\n\nfunction appendDefs(\n svg: Selection<SVGSVGElement, unknown, null, undefined>,\n blurId: string,\n shadowId: string,\n): void {\n const defs = svg.append('defs');\n defs\n .append('filter')\n .attr('id', blurId)\n .attr('x', '-50%')\n .attr('y', '-50%')\n .attr('width', '200%')\n .attr('height', '200%')\n .append('feGaussianBlur')\n .attr('stdDeviation', 12);\n\n const radial = defs.append('radialGradient').attr('id', shadowId);\n radial\n .append('stop')\n .attr('offset', '0%')\n .attr('stop-color', NODE_COLORS.shadowInner)\n .attr('stop-opacity', 1);\n radial\n .append('stop')\n .attr('offset', '100%')\n .attr('stop-color', NODE_COLORS.shadowOuter)\n .attr('stop-opacity', 0.12);\n}\n\n/** Every link is built once; the legend filter only toggles what is painted. */\nfunction buildLinks(\n linkLayer: Selection<SVGGElement, unknown, null, undefined>,\n labelLayer: Selection<SVGGElement, unknown, null, undefined>,\n simLinks: SimLink[],\n): LinkParts[] {\n return simLinks.map((datum) => {\n const line = linkLayer\n .append('line')\n .attr('class', 'link-line')\n .attr('stroke', LINK_COLORS[datum.type])\n .attr('stroke-width', LINK_WIDTH)\n .attr('stroke-linecap', 'round')\n .style('opacity', 1)\n .style('pointer-events', 'none')\n .node() as SVGLineElement;\n\n let label: SVGGElement | null = null;\n {\n const group = labelLayer\n .append('g')\n .attr('class', 'link-label')\n .style('opacity', 0)\n .style('pointer-events', 'none');\n\n const background = group\n .append('rect')\n .attr('class', 'link-label-background')\n .attr('rx', 5)\n .attr('ry', 5)\n .attr('fill', LINK_LABEL_COLORS.background);\n\n const text = group\n .append('text')\n .attr('class', 'link-label-text')\n .text(formatLinkValue(datum.value))\n .attr('font-size', LINK_LABEL_SIZE)\n .attr('fill', LINK_LABEL_COLORS.text)\n .attr('dominant-baseline', 'middle')\n .attr('text-anchor', 'middle');\n\n const box = measure(text.node());\n if (box) {\n background\n .attr('x', box.x - LINK_LABEL_PAD_X)\n .attr('y', box.y - LINK_LABEL_PAD_Y)\n .attr('width', box.width + LINK_LABEL_PAD_X * 2)\n .attr('height', box.height + LINK_LABEL_PAD_Y * 2);\n }\n label = group.node();\n }\n\n return { datum, line, label, visible: true };\n });\n}\n\nfunction buildNodes(params: {\n layer: Selection<SVGGElement, unknown, null, undefined>;\n simNodes: SimNode[];\n model: NetworkGraphModel;\n radiusById: Map<string, number>;\n blurId: string;\n shadowId: string;\n}): NodeParts[] {\n const { layer, simNodes, model, radiusById, blurId, shadowId } = params;\n\n return simNodes.map((datum) => {\n const radius = radiusById.get(datum.id) ?? 0;\n const shadow = shadowRadius(datum, model.breakpoints);\n const hasImage = !!datum.img;\n\n const group = layer\n .append('g')\n .datum(datum)\n .attr('class', 'node')\n .style('cursor', 'grab')\n .style('opacity', 1)\n .style('pointer-events', 'all');\n\n // Client stacking order: label behind the bloom, chrome on top of it.\n const label = appendNodeLabel(group, datum, radius);\n\n group\n .append('circle')\n .attr('class', 'node-shadow-blue')\n .attr('r', shadow)\n .attr('fill', NODE_COLORS.glow)\n .attr('opacity', 0.15)\n .attr('filter', `url(#${blurId})`)\n .style('pointer-events', 'none');\n\n const grab = group\n .append('circle')\n .attr('class', 'node-drag-area')\n .attr('r', radius + NODE_BORDER_WIDTH + DRAG_AREA_PAD)\n .attr('fill', 'transparent')\n .style('cursor', 'grab')\n .style('pointer-events', 'all')\n .node() as SVGCircleElement;\n\n group\n .append('circle')\n .attr('class', 'node-shadow-dark')\n .attr('r', shadow)\n .attr('fill', `url(#${shadowId})`)\n .attr('opacity', 0.1)\n .attr('filter', `url(#${blurId})`)\n .style('pointer-events', 'none');\n\n const background = group\n .append('circle')\n .attr('class', 'node-background')\n .attr('r', radius)\n .attr('fill', nodeColor(datum))\n .style('opacity', hasImage ? 0 : 1)\n .style('pointer-events', 'none')\n .node() as SVGCircleElement;\n\n group\n .append('circle')\n .attr('class', 'node-border-white')\n .attr('r', radius)\n .attr('fill', 'none')\n .attr('stroke', NODE_COLORS.innerBorder)\n .attr('stroke-width', NODE_BORDER_WIDTH)\n .style('pointer-events', 'none');\n\n if (hasImage) {\n group\n .append('image')\n .attr('class', 'node-image')\n .attr('href', datum.img as string)\n .attr('width', radius * 2)\n .attr('height', radius * 2)\n .attr('x', -radius)\n .attr('y', -radius)\n .attr('clip-path', `circle(${radius}px at ${radius}px ${radius}px)`)\n .attr('preserveAspectRatio', 'xMidYMid slice')\n .style('pointer-events', 'none');\n }\n\n group\n .append('circle')\n .attr('class', 'node-border-purple')\n .attr('r', radius + NODE_BORDER_WIDTH)\n .attr('fill', 'none')\n .attr('stroke', NODE_COLORS.outerBorder)\n .attr('stroke-width', NODE_BORDER_WIDTH)\n .style('pointer-events', 'none');\n\n return {\n datum,\n group: group.node() as SVGGElement,\n background,\n grab,\n label: label.group,\n labelBg: label.background,\n labelTitle: label.title,\n labelValue: label.value,\n radius,\n hasImage,\n alwaysLabelled: radius > LABEL_ALWAYS_ABOVE,\n };\n });\n}\n\nfunction appendNodeLabel(\n group: Selection<SVGGElement, SimNode, null, undefined>,\n datum: SimNode,\n radius: number,\n): {\n group: SVGGElement | null;\n background: SVGRectElement | null;\n title: SVGTextElement | null;\n value: SVGTextElement | null;\n} {\n const valueText = formatNodeValue(datum.value);\n if (!datum.label && !valueText) {\n return { group: null, background: null, title: null, value: null };\n }\n\n const labelGroup = group\n .append('g')\n .attr('class', 'node-label')\n .attr('transform', 'translate(1, 0)')\n .style('opacity', 0)\n .style('pointer-events', 'none');\n\n const background = labelGroup\n .append('rect')\n .attr('class', 'node-label-background')\n .attr('rx', 4)\n .attr('ry', 4)\n .attr('fill', NODE_LABEL_COLORS.background);\n\n const title = labelGroup\n .append('text')\n .attr('class', 'node-label-title')\n .text(datum.label)\n .attr('font-size', LABEL_TITLE_SIZE)\n .attr('font-weight', '400')\n .attr('fill', NODE_LABEL_COLORS.text)\n .attr('text-anchor', 'middle')\n .attr('dominant-baseline', 'hanging');\n\n const value = labelGroup\n .append('text')\n .attr('class', 'node-label-value')\n .text(valueText)\n .attr('font-size', LABEL_VALUE_SIZE)\n .attr('fill', NODE_LABEL_COLORS.text)\n .attr('text-anchor', 'middle')\n .attr('dominant-baseline', 'hanging');\n\n const paddingX = radius + LABEL_PADDING_GAP;\n const titleBox = measure(title.node());\n const valueBox = measure(value.node());\n const contentWidth = Math.max(titleBox?.width ?? 0, valueBox?.width ?? 0);\n const boxWidth = paddingX * 2 + contentWidth;\n const boxHeight =\n LABEL_PADDING_TOP + LABEL_TITLE_LINE + LABEL_VALUE_LINE + LABEL_PADDING_BOTTOM;\n const centerX = paddingX + contentWidth / 2;\n\n background\n .attr('x', 0)\n .attr('y', -boxHeight / 2)\n .attr('width', boxWidth)\n .attr('height', boxHeight);\n title.attr('x', centerX).attr('y', -boxHeight / 2 + LABEL_PADDING_TOP);\n value\n .attr('x', centerX)\n .attr('y', -boxHeight / 2 + LABEL_PADDING_TOP + LABEL_TITLE_LINE);\n\n return {\n group: labelGroup.node(),\n background: background.node(),\n title: title.node(),\n value: value.node(),\n };\n}\n\nfunction attachNodeInteractions(params: {\n nodes: NodeParts[];\n simulation: Simulation<SimNode, SimLink>;\n /** Read per event — the frame changes on resize without a rebuild. */\n getBounds: () => { width: number; height: number };\n radiusById: Map<string, number>;\n onHover: (id: string | null) => void;\n onClick: (id: string) => void;\n /** Re-pin isolated / hidden nodes after a drag so they keep their zone. */\n onDragEnd: () => void;\n}): void {\n const { nodes, simulation, getBounds, radiusById, onHover, onClick, onDragEnd } = params;\n let moved = false;\n let start: { x: number; y: number } | null = null;\n\n const behaviour = drag<SVGGElement, SimNode>()\n .filter((event: MouseEvent) => event.button === 0)\n .on('start', (event: D3DragEvent<SVGGElement, SimNode, unknown>, d) => {\n event.sourceEvent.stopPropagation();\n start = { x: event.sourceEvent.clientX, y: event.sourceEvent.clientY };\n moved = false;\n if (!event.active) simulation.alphaTarget(0.3).restart();\n const { width, height } = getBounds();\n d.fx = d.x ?? width / 2;\n d.fy = d.y ?? height / 2;\n })\n .on('drag', (event: D3DragEvent<SVGGElement, SimNode, unknown>, d) => {\n if (start) {\n const dx = event.sourceEvent.clientX - start.x;\n const dy = event.sourceEvent.clientY - start.y;\n if (Math.sqrt(dx * dx + dy * dy) > DRAG_SLOP) moved = true;\n }\n const { width, height } = getBounds();\n const radius = radiusById.get(d.id) ?? 0;\n d.fx = clamp((d.fx ?? d.x ?? 0) + event.dx, radius, width - radius);\n d.fy = clamp((d.fy ?? d.y ?? 0) + event.dy, radius, height - radius);\n })\n .on('end', (event: D3DragEvent<SVGGElement, SimNode, unknown>, d) => {\n if (!event.active) simulation.alphaTarget(0);\n d.x = d.fx ?? d.x;\n d.y = d.fy ?? d.y;\n onDragEnd();\n start = null;\n });\n\n for (const part of nodes) {\n const group = select<SVGGElement, SimNode>(part.group);\n group.call(behaviour);\n\n const grab = group.select<SVGCircleElement>('.node-drag-area');\n grab.on('click', (event: MouseEvent) => {\n event.stopPropagation();\n if (moved) {\n moved = false;\n return;\n }\n onClick(part.datum.id);\n });\n grab.on('mouseenter', () => onHover(part.datum.id));\n grab.on('mouseleave', () => onHover(null));\n }\n}\n"],"names":["_a"],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export { renderNetworkGraph, resizeNetworkGraph, stopNetworkGraph, updateNetworkGraphVisibility, type NetworkGraphController, type RenderNetworkGraphOptions, } from './draw.js';
2
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/components/network-graph/render/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,kBAAkB,EAClB,kBAAkB,EAClB,gBAAgB,EAChB,4BAA4B,EAC5B,KAAK,sBAAsB,EAC3B,KAAK,yBAAyB,GAC/B,MAAM,WAAW,CAAC"}
@@ -0,0 +1,2 @@
1
+ export declare const parallelCoordinatesStyles: import('lit').CSSResult;
2
+ //# sourceMappingURL=styles.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"styles.d.ts","sourceRoot":"","sources":["../../../../src/components/parallel-coordinates-chart/element/styles.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,yBAAyB,yBAiErC,CAAC"}