@milaboratories/miplots4 1.0.129 → 1.0.131

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 (351) hide show
  1. package/dist/DataFrame.d.ts +15 -9
  2. package/dist/DataFrame.d.ts.map +1 -1
  3. package/dist/DataFrame.js +105 -81
  4. package/dist/DataFrame.js.map +1 -1
  5. package/dist/bubble/ChartRenderer.d.ts +6 -5
  6. package/dist/bubble/ChartRenderer.d.ts.map +1 -1
  7. package/dist/bubble/ChartRenderer.js +123 -121
  8. package/dist/bubble/ChartRenderer.js.map +1 -1
  9. package/dist/bubble/components/Chart.d.ts +3 -2
  10. package/dist/bubble/components/Chart.d.ts.map +1 -1
  11. package/dist/bubble/components/Chart.js +78 -97
  12. package/dist/bubble/components/Chart.js.map +1 -1
  13. package/dist/bubble/components/ChartsGroup.d.ts +6 -5
  14. package/dist/bubble/components/ChartsGroup.d.ts.map +1 -1
  15. package/dist/bubble/components/ChartsGroup.js +39 -37
  16. package/dist/bubble/components/ChartsGroup.js.map +1 -1
  17. package/dist/bubble/getCellTooltip.d.ts +5 -0
  18. package/dist/bubble/getCellTooltip.d.ts.map +1 -0
  19. package/dist/bubble/getCellTooltip.js +28 -0
  20. package/dist/bubble/getCellTooltip.js.map +1 -0
  21. package/dist/bubble/{getCells.d.ts → getGroupedCellsData.d.ts} +4 -4
  22. package/dist/bubble/getGroupedCellsData.d.ts.map +1 -0
  23. package/dist/bubble/getGroupedCellsData.js +94 -0
  24. package/dist/bubble/getGroupedCellsData.js.map +1 -0
  25. package/dist/bubble/index.d.ts +4 -4
  26. package/dist/bubble/index.d.ts.map +1 -1
  27. package/dist/bubble/index.js +47 -42
  28. package/dist/bubble/index.js.map +1 -1
  29. package/dist/bubble/utils/calculateCaptionTails.d.ts +2 -2
  30. package/dist/bubble/utils/calculateCaptionTails.d.ts.map +1 -1
  31. package/dist/bubble/utils/calculateCaptionTails.js.map +1 -1
  32. package/dist/common/Legend.d.ts.map +1 -1
  33. package/dist/common/Legend.js.map +1 -1
  34. package/dist/common/Tooltip.js +1 -1
  35. package/dist/common/Tooltip.js.map +1 -1
  36. package/dist/common/types.d.ts +1 -1
  37. package/dist/common/types.d.ts.map +1 -1
  38. package/dist/common/useDataFrame.d.ts +11 -0
  39. package/dist/common/useDataFrame.d.ts.map +1 -0
  40. package/dist/common/useDataFrame.js +20 -0
  41. package/dist/common/useDataFrame.js.map +1 -0
  42. package/dist/dendro/ChartRenderer.d.ts +9 -8
  43. package/dist/dendro/ChartRenderer.d.ts.map +1 -1
  44. package/dist/dendro/ChartRenderer.js +187 -187
  45. package/dist/dendro/ChartRenderer.js.map +1 -1
  46. package/dist/dendro/components/Chart.d.ts +8 -8
  47. package/dist/dendro/components/Chart.d.ts.map +1 -1
  48. package/dist/dendro/components/Chart.js +35 -35
  49. package/dist/dendro/components/Chart.js.map +1 -1
  50. package/dist/dendro/components/Heatmap.d.ts +3 -3
  51. package/dist/dendro/components/Heatmap.d.ts.map +1 -1
  52. package/dist/dendro/components/Heatmap.js +23 -23
  53. package/dist/dendro/components/Heatmap.js.map +1 -1
  54. package/dist/dendro/components/Legend.d.ts.map +1 -1
  55. package/dist/dendro/components/Legend.js.map +1 -1
  56. package/dist/dendro/components/LinksGroup.d.ts +6 -6
  57. package/dist/dendro/components/LinksGroup.d.ts.map +1 -1
  58. package/dist/dendro/components/LinksGroup.js +17 -17
  59. package/dist/dendro/components/LinksGroup.js.map +1 -1
  60. package/dist/dendro/components/NodesGroup.d.ts +7 -7
  61. package/dist/dendro/components/NodesGroup.d.ts.map +1 -1
  62. package/dist/dendro/components/NodesGroup.js +29 -29
  63. package/dist/dendro/components/NodesGroup.js.map +1 -1
  64. package/dist/dendro/components/types.d.ts +2 -2
  65. package/dist/dendro/components/types.d.ts.map +1 -1
  66. package/dist/dendro/getHeatmapData.d.ts +2 -2
  67. package/dist/dendro/getHeatmapData.d.ts.map +1 -1
  68. package/dist/dendro/getHeatmapData.js +48 -44
  69. package/dist/dendro/getHeatmapData.js.map +1 -1
  70. package/dist/dendro/getHierarchyData.d.ts +3 -3
  71. package/dist/dendro/getHierarchyData.d.ts.map +1 -1
  72. package/dist/dendro/getHierarchyData.js +31 -31
  73. package/dist/dendro/getHierarchyData.js.map +1 -1
  74. package/dist/dendro/index.d.ts +5 -5
  75. package/dist/dendro/index.d.ts.map +1 -1
  76. package/dist/dendro/index.js +86 -89
  77. package/dist/dendro/index.js.map +1 -1
  78. package/dist/discrete/ChartRenderer.d.ts +6 -6
  79. package/dist/discrete/ChartRenderer.d.ts.map +1 -1
  80. package/dist/discrete/ChartRenderer.js +197 -196
  81. package/dist/discrete/ChartRenderer.js.map +1 -1
  82. package/dist/discrete/DiscreteSettingsImpl.d.ts +3 -3
  83. package/dist/discrete/DiscreteSettingsImpl.d.ts.map +1 -1
  84. package/dist/discrete/DiscreteSettingsImpl.js +8 -8
  85. package/dist/discrete/DiscreteSettingsImpl.js.map +1 -1
  86. package/dist/discrete/components/layers/BoxElement.js.map +1 -1
  87. package/dist/discrete/index.d.ts +1 -1
  88. package/dist/discrete/index.d.ts.map +1 -1
  89. package/dist/discrete/index.js +109 -106
  90. package/dist/discrete/index.js.map +1 -1
  91. package/dist/discrete/layers/bar.d.ts +2 -2
  92. package/dist/discrete/layers/bar.d.ts.map +1 -1
  93. package/dist/discrete/layers/bar.js +32 -37
  94. package/dist/discrete/layers/bar.js.map +1 -1
  95. package/dist/discrete/layers/binnedDots.d.ts +3 -3
  96. package/dist/discrete/layers/binnedDots.d.ts.map +1 -1
  97. package/dist/discrete/layers/binnedDots.js +66 -78
  98. package/dist/discrete/layers/binnedDots.js.map +1 -1
  99. package/dist/discrete/layers/boxes.d.ts +3 -4
  100. package/dist/discrete/layers/boxes.d.ts.map +1 -1
  101. package/dist/discrete/layers/boxes.js +59 -60
  102. package/dist/discrete/layers/boxes.js.map +1 -1
  103. package/dist/discrete/layers/dots.d.ts +2 -3
  104. package/dist/discrete/layers/dots.d.ts.map +1 -1
  105. package/dist/discrete/layers/dots.js +30 -30
  106. package/dist/discrete/layers/dots.js.map +1 -1
  107. package/dist/discrete/layers/lines.js +11 -10
  108. package/dist/discrete/layers/lines.js.map +1 -1
  109. package/dist/discrete/layers/logo.d.ts +2 -2
  110. package/dist/discrete/layers/logo.d.ts.map +1 -1
  111. package/dist/discrete/layers/logo.js +21 -21
  112. package/dist/discrete/layers/logo.js.map +1 -1
  113. package/dist/discrete/layers/pairedPoints.d.ts +2 -2
  114. package/dist/discrete/layers/pairedPoints.d.ts.map +1 -1
  115. package/dist/discrete/layers/pairedPoints.js +62 -62
  116. package/dist/discrete/layers/pairedPoints.js.map +1 -1
  117. package/dist/discrete/layers/sina.d.ts +3 -4
  118. package/dist/discrete/layers/sina.d.ts.map +1 -1
  119. package/dist/discrete/layers/sina.js +67 -71
  120. package/dist/discrete/layers/sina.js.map +1 -1
  121. package/dist/discrete/layers/stackedBar.d.ts +1 -1
  122. package/dist/discrete/layers/stackedBar.d.ts.map +1 -1
  123. package/dist/discrete/layers/stackedBar.js +25 -25
  124. package/dist/discrete/layers/stackedBar.js.map +1 -1
  125. package/dist/discrete/layers/violins.js +13 -13
  126. package/dist/discrete/utils/getOutliersBounds.d.ts +1 -1
  127. package/dist/discrete/utils/getOutliersBounds.d.ts.map +1 -1
  128. package/dist/discrete/utils/getOutliersBounds.js +5 -5
  129. package/dist/discrete/utils/getOutliersBounds.js.map +1 -1
  130. package/dist/discrete/utils/splitTextByWidth.js +1 -1
  131. package/dist/discrete/utils/splitTextByWidth.js.map +1 -1
  132. package/dist/heatmap/ChartRenderer.d.ts +7 -6
  133. package/dist/heatmap/ChartRenderer.d.ts.map +1 -1
  134. package/dist/heatmap/ChartRenderer.js +232 -230
  135. package/dist/heatmap/ChartRenderer.js.map +1 -1
  136. package/dist/heatmap/HeatmapSettingsImpl.d.ts +2 -2
  137. package/dist/heatmap/HeatmapSettingsImpl.d.ts.map +1 -1
  138. package/dist/heatmap/HeatmapSettingsImpl.js +1 -1
  139. package/dist/heatmap/HeatmapSettingsImpl.js.map +1 -1
  140. package/dist/heatmap/components/Annotations/Annotation.d.ts.map +1 -1
  141. package/dist/heatmap/components/Annotations/Annotation.js +40 -39
  142. package/dist/heatmap/components/Annotations/Annotation.js.map +1 -1
  143. package/dist/heatmap/components/Chart.d.ts.map +1 -1
  144. package/dist/heatmap/components/Chart.js +90 -89
  145. package/dist/heatmap/components/Chart.js.map +1 -1
  146. package/dist/heatmap/components/ChartsGroup.d.ts +2 -2
  147. package/dist/heatmap/components/ChartsGroup.d.ts.map +1 -1
  148. package/dist/heatmap/components/ChartsGroup.js +14 -14
  149. package/dist/heatmap/components/ChartsGroup.js.map +1 -1
  150. package/dist/heatmap/components/types.d.ts +3 -2
  151. package/dist/heatmap/components/types.d.ts.map +1 -1
  152. package/dist/heatmap/getCells.d.ts +3 -2
  153. package/dist/heatmap/getCells.d.ts.map +1 -1
  154. package/dist/heatmap/getCells.js +97 -93
  155. package/dist/heatmap/getCells.js.map +1 -1
  156. package/dist/heatmap/index.d.ts +3 -3
  157. package/dist/heatmap/index.d.ts.map +1 -1
  158. package/dist/heatmap/index.js +13 -12
  159. package/dist/heatmap/index.js.map +1 -1
  160. package/dist/heatmap/utils/calculateAnnotationTitleSizes.d.ts.map +1 -1
  161. package/dist/heatmap/utils/calculateAnnotationTitleSizes.js +1 -1
  162. package/dist/heatmap/utils/calculateAnnotationTitleSizes.js.map +1 -1
  163. package/dist/heatmap/utils/calculateCaptionTails.d.ts +1 -1
  164. package/dist/heatmap/utils/calculateCaptionTails.d.ts.map +1 -1
  165. package/dist/heatmap/utils/calculateCaptionTails.js.map +1 -1
  166. package/dist/histogram/ChartRenderer.d.ts +6 -5
  167. package/dist/histogram/ChartRenderer.d.ts.map +1 -1
  168. package/dist/histogram/ChartRenderer.js +154 -153
  169. package/dist/histogram/ChartRenderer.js.map +1 -1
  170. package/dist/histogram/HistogramSettingsImpl.d.ts +2 -2
  171. package/dist/histogram/HistogramSettingsImpl.d.ts.map +1 -1
  172. package/dist/histogram/HistogramSettingsImpl.js.map +1 -1
  173. package/dist/histogram/components/Chart.js +48 -48
  174. package/dist/histogram/components/Chart.js.map +1 -1
  175. package/dist/histogram/components/types.d.ts +4 -3
  176. package/dist/histogram/components/types.d.ts.map +1 -1
  177. package/dist/histogram/getHistogramData.d.ts +7 -7
  178. package/dist/histogram/getHistogramData.d.ts.map +1 -1
  179. package/dist/histogram/getHistogramData.js +52 -53
  180. package/dist/histogram/getHistogramData.js.map +1 -1
  181. package/dist/histogram/index.d.ts +3 -3
  182. package/dist/histogram/index.d.ts.map +1 -1
  183. package/dist/histogram/index.js +49 -45
  184. package/dist/histogram/index.js.map +1 -1
  185. package/dist/node_modules/@d3fc/d3fc-axis/src/axisBase.js +10 -10
  186. package/dist/node_modules/d3-array/src/min.js +5 -11
  187. package/dist/node_modules/d3-array/src/min.js.map +1 -1
  188. package/dist/node_modules/d3-shape/src/area.js +30 -30
  189. package/dist/node_modules/d3-shape/src/line.js +6 -6
  190. package/dist/node_modules/d3-shape/src/line.js.map +1 -1
  191. package/dist/node_modules/kdbush/index.js +148 -0
  192. package/dist/node_modules/kdbush/index.js.map +1 -0
  193. package/dist/scatterplot/ChartRenderer.d.ts +7 -6
  194. package/dist/scatterplot/ChartRenderer.d.ts.map +1 -1
  195. package/dist/scatterplot/ChartRenderer.js +213 -209
  196. package/dist/scatterplot/ChartRenderer.js.map +1 -1
  197. package/dist/scatterplot/ScatterplotSettingsImpl.d.ts +2 -2
  198. package/dist/scatterplot/ScatterplotSettingsImpl.d.ts.map +1 -1
  199. package/dist/scatterplot/ScatterplotSettingsImpl.js +28 -28
  200. package/dist/scatterplot/ScatterplotSettingsImpl.js.map +1 -1
  201. package/dist/scatterplot/components/ChartAxisTitles.d.ts.map +1 -1
  202. package/dist/scatterplot/components/ChartAxisTitles.js +31 -30
  203. package/dist/scatterplot/components/ChartAxisTitles.js.map +1 -1
  204. package/dist/scatterplot/components/ChartLayersData.d.ts.map +1 -1
  205. package/dist/scatterplot/components/ChartLayersData.js +138 -156
  206. package/dist/scatterplot/components/ChartLayersData.js.map +1 -1
  207. package/dist/scatterplot/components/ChartTooltip.d.ts.map +1 -1
  208. package/dist/scatterplot/components/ChartTooltip.js +41 -38
  209. package/dist/scatterplot/components/ChartTooltip.js.map +1 -1
  210. package/dist/scatterplot/components/ChartTrendsData.js +21 -21
  211. package/dist/scatterplot/components/ChartTrendsData.js.map +1 -1
  212. package/dist/scatterplot/components/types.d.ts +7 -7
  213. package/dist/scatterplot/components/types.d.ts.map +1 -1
  214. package/dist/scatterplot/constants.d.ts +1 -1
  215. package/dist/scatterplot/constants.d.ts.map +1 -1
  216. package/dist/scatterplot/constants.js.map +1 -1
  217. package/dist/scatterplot/dots.d.ts +2 -2
  218. package/dist/scatterplot/dots.d.ts.map +1 -1
  219. package/dist/scatterplot/dots.js +27 -25
  220. package/dist/scatterplot/dots.js.map +1 -1
  221. package/dist/scatterplot/getLayersData.d.ts +3 -3
  222. package/dist/scatterplot/getLayersData.d.ts.map +1 -1
  223. package/dist/scatterplot/getLayersData.js +12 -15
  224. package/dist/scatterplot/getLayersData.js.map +1 -1
  225. package/dist/scatterplot/index.d.ts +4 -4
  226. package/dist/scatterplot/index.d.ts.map +1 -1
  227. package/dist/scatterplot/index.js +71 -72
  228. package/dist/scatterplot/index.js.map +1 -1
  229. package/dist/scatterplot/linearRegression.d.ts +5 -4
  230. package/dist/scatterplot/linearRegression.d.ts.map +1 -1
  231. package/dist/scatterplot/linearRegression.js +88 -86
  232. package/dist/scatterplot/linearRegression.js.map +1 -1
  233. package/dist/scatterplot/utils/createAesGetter.d.ts +3 -2
  234. package/dist/scatterplot/utils/createAesGetter.d.ts.map +1 -1
  235. package/dist/scatterplot/utils/createAesGetter.js +21 -21
  236. package/dist/scatterplot/utils/createAesGetter.js.map +1 -1
  237. package/dist/scatterplot/utils/createLegendInfo.d.ts +2 -10
  238. package/dist/scatterplot/utils/createLegendInfo.d.ts.map +1 -1
  239. package/dist/scatterplot/utils/createLegendInfo.js +44 -37
  240. package/dist/scatterplot/utils/createLegendInfo.js.map +1 -1
  241. package/dist/scatterplot/utils/formatColumnValue.d.ts +5 -0
  242. package/dist/scatterplot/utils/formatColumnValue.d.ts.map +1 -0
  243. package/dist/scatterplot/utils/formatColumnValue.js +11 -0
  244. package/dist/scatterplot/utils/formatColumnValue.js.map +1 -0
  245. package/dist/scatterplot/utils/getVisibleLabels.d.ts +6 -9
  246. package/dist/scatterplot/utils/getVisibleLabels.d.ts.map +1 -1
  247. package/dist/scatterplot/utils/getVisibleLabels.js +46 -56
  248. package/dist/scatterplot/utils/getVisibleLabels.js.map +1 -1
  249. package/dist/scatterplot-umap/ChartRenderer.d.ts +18 -15
  250. package/dist/scatterplot-umap/ChartRenderer.d.ts.map +1 -1
  251. package/dist/scatterplot-umap/ChartRenderer.js +231 -214
  252. package/dist/scatterplot-umap/ChartRenderer.js.map +1 -1
  253. package/dist/scatterplot-umap/SettingsImpl.d.ts +2 -2
  254. package/dist/scatterplot-umap/SettingsImpl.d.ts.map +1 -1
  255. package/dist/scatterplot-umap/SettingsImpl.js +25 -25
  256. package/dist/scatterplot-umap/SettingsImpl.js.map +1 -1
  257. package/dist/scatterplot-umap/colors.d.ts +6 -0
  258. package/dist/scatterplot-umap/colors.d.ts.map +1 -0
  259. package/dist/scatterplot-umap/colors.js +42 -0
  260. package/dist/scatterplot-umap/colors.js.map +1 -0
  261. package/dist/scatterplot-umap/components/LowerSVG.d.ts +2 -2
  262. package/dist/scatterplot-umap/components/LowerSVG.d.ts.map +1 -1
  263. package/dist/scatterplot-umap/components/LowerSVG.js +97 -94
  264. package/dist/scatterplot-umap/components/LowerSVG.js.map +1 -1
  265. package/dist/scatterplot-umap/components/UpperSVG.d.ts.map +1 -1
  266. package/dist/scatterplot-umap/components/UpperSVG.js +20 -19
  267. package/dist/scatterplot-umap/components/UpperSVG.js.map +1 -1
  268. package/dist/scatterplot-umap/index.d.ts +0 -2
  269. package/dist/scatterplot-umap/index.d.ts.map +1 -1
  270. package/dist/scatterplot-umap/index.js +77 -102
  271. package/dist/scatterplot-umap/index.js.map +1 -1
  272. package/dist/scatterplot-umap/types.d.ts +7 -10
  273. package/dist/scatterplot-umap/types.d.ts.map +1 -1
  274. package/dist/types/bubble.d.ts +44 -12
  275. package/dist/types/bubble.d.ts.map +1 -1
  276. package/dist/types/common.d.ts +22 -3
  277. package/dist/types/common.d.ts.map +1 -1
  278. package/dist/types/common.js +3 -1
  279. package/dist/types/common.js.map +1 -1
  280. package/dist/types/dendro.d.ts +113 -10
  281. package/dist/types/dendro.d.ts.map +1 -1
  282. package/dist/types/dendro.js +1 -1
  283. package/dist/types/dendro.js.map +1 -1
  284. package/dist/types/discrete.d.ts +99 -22
  285. package/dist/types/discrete.d.ts.map +1 -1
  286. package/dist/types/discrete.js +3 -3
  287. package/dist/types/discrete.js.map +1 -1
  288. package/dist/types/heatmap.d.ts +187 -28
  289. package/dist/types/heatmap.d.ts.map +1 -1
  290. package/dist/types/heatmap.js +1 -1
  291. package/dist/types/heatmap.js.map +1 -1
  292. package/dist/types/histogram.d.ts +30 -8
  293. package/dist/types/histogram.d.ts.map +1 -1
  294. package/dist/types/histogram.js +1 -1
  295. package/dist/types/histogram.js.map +1 -1
  296. package/dist/types/scatterplot-umap.d.ts +149 -15
  297. package/dist/types/scatterplot-umap.d.ts.map +1 -1
  298. package/dist/types/scatterplot-umap.js +9 -9
  299. package/dist/types/scatterplot-umap.js.map +1 -1
  300. package/dist/types/scatterplot.d.ts +164 -12
  301. package/dist/types/scatterplot.d.ts.map +1 -1
  302. package/dist/types/scatterplot.js +1 -1
  303. package/dist/types/scatterplot.js.map +1 -1
  304. package/dist/utils/TextMeasurer/TextMeasurer.d.ts +7 -0
  305. package/dist/utils/TextMeasurer/TextMeasurer.d.ts.map +1 -0
  306. package/dist/utils/TextMeasurer/TextMeasurer.js +42 -0
  307. package/dist/utils/TextMeasurer/TextMeasurer.js.map +1 -0
  308. package/dist/utils/TextMeasurer/charToWidth.json.js +155 -0
  309. package/dist/utils/TextMeasurer/charToWidth.json.js.map +1 -0
  310. package/dist/utils/arrangeLegendParts.js +1 -1
  311. package/dist/utils/arrangeLegendParts.js.map +1 -1
  312. package/dist/utils/getChartEdgeSides.d.ts +1 -1
  313. package/dist/utils/getLegendWidth.d.ts.map +1 -1
  314. package/dist/utils/getLegendWidth.js +1 -1
  315. package/dist/utils/getLegendWidth.js.map +1 -1
  316. package/package.json +5 -3
  317. package/dist/bubble/getCells.d.ts.map +0 -1
  318. package/dist/bubble/getCells.js +0 -91
  319. package/dist/bubble/getCells.js.map +0 -1
  320. package/dist/node_modules/d3-quadtree/src/add.js +0 -30
  321. package/dist/node_modules/d3-quadtree/src/add.js.map +0 -1
  322. package/dist/node_modules/d3-quadtree/src/cover.js +0 -29
  323. package/dist/node_modules/d3-quadtree/src/cover.js.map +0 -1
  324. package/dist/node_modules/d3-quadtree/src/data.js +0 -12
  325. package/dist/node_modules/d3-quadtree/src/data.js.map +0 -1
  326. package/dist/node_modules/d3-quadtree/src/extent.js +0 -7
  327. package/dist/node_modules/d3-quadtree/src/extent.js.map +0 -1
  328. package/dist/node_modules/d3-quadtree/src/find.js +0 -26
  329. package/dist/node_modules/d3-quadtree/src/find.js.map +0 -1
  330. package/dist/node_modules/d3-quadtree/src/quad.js +0 -7
  331. package/dist/node_modules/d3-quadtree/src/quad.js.map +0 -1
  332. package/dist/node_modules/d3-quadtree/src/quadtree.js +0 -51
  333. package/dist/node_modules/d3-quadtree/src/quadtree.js.map +0 -1
  334. package/dist/node_modules/d3-quadtree/src/remove.js +0 -21
  335. package/dist/node_modules/d3-quadtree/src/remove.js.map +0 -1
  336. package/dist/node_modules/d3-quadtree/src/root.js +0 -7
  337. package/dist/node_modules/d3-quadtree/src/root.js.map +0 -1
  338. package/dist/node_modules/d3-quadtree/src/size.js +0 -12
  339. package/dist/node_modules/d3-quadtree/src/size.js.map +0 -1
  340. package/dist/node_modules/d3-quadtree/src/visit.js +0 -14
  341. package/dist/node_modules/d3-quadtree/src/visit.js.map +0 -1
  342. package/dist/node_modules/d3-quadtree/src/visitAfter.js +0 -19
  343. package/dist/node_modules/d3-quadtree/src/visitAfter.js.map +0 -1
  344. package/dist/node_modules/d3-quadtree/src/x.js +0 -11
  345. package/dist/node_modules/d3-quadtree/src/x.js.map +0 -1
  346. package/dist/node_modules/d3-quadtree/src/y.js +0 -11
  347. package/dist/node_modules/d3-quadtree/src/y.js.map +0 -1
  348. package/dist/utils/TextMeasurer.d.ts +0 -8
  349. package/dist/utils/TextMeasurer.d.ts.map +0 -1
  350. package/dist/utils/TextMeasurer.js +0 -27
  351. package/dist/utils/TextMeasurer.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"ChartRenderer.js","sources":["../../src/dendro/ChartRenderer.tsx"],"sourcesContent":["import {BLACK} from '../constants';\nimport type {HeatmapData} from './getHeatmapData';\nimport type {TreeNodeData} from './getHierarchyData';\nimport {updateLinksHeight, updateNodesHorizontalPosition} from './getHierarchyData';\nimport type {DotAesItem, LegendData, LegendItem} from './components/types';\nimport {DEFAULT_DOT_AES, LEGEND_OFFSET} from '../scatterplot/constants';\nimport {isCategoricalAes, isContinuousAes} from '../types';\nimport {getContinuousLegendTicks} from '../utils/getContinuousLegendTicks';\nimport {getContinuousLegendWidth, getDiscreteLegendWidth} from '../utils/getLegendWidth';\nimport {TextMeasurer} from '../utils/TextMeasurer';\nimport React from 'react';\nimport type {Root} from 'react-dom/client';\nimport {createRoot} from 'react-dom/client';\nimport {cluster} from 'd3-hierarchy';\nimport type {ScaleLinear, ScaleOrdinal, ScalePower} from 'd3-scale';\nimport {scaleLinear, scaleOrdinal, scaleSqrt} from 'd3-scale';\nimport type {HierarchyNode, HierarchyPointNode} from 'd3-hierarchy';\nimport type {DendroSettingsImpl} from './DendroSettingsImpl';\nimport type {\n CategoricalAesFromColumn,\n ClickEventData,\n ColumnName,\n ContinuousAesFromColumn,\n DataValue,\n DendroLegendInfo,\n LineShape,\n PointShape,\n} from '../types';\nimport {\n COLOR_NULL,\n HEATMAP_LEFT_OFFSET,\n HEIGHT,\n MARGIN,\n MAX_HEATMAP_WIDTH,\n MAX_LEGEND_HEIGHT,\n WIDTH,\n} from './constants';\nimport {Chart} from './components/Chart';\nimport {Error} from '../common/Error';\nimport type {ChartScales, ChartSizes} from './components/types';\nimport type {ReactElement} from 'react';\n\nfunction createAesGetter<InputType extends string | number | PointShape | LineShape>(\n aesItem: InputType | CategoricalAesFromColumn<InputType> | ContinuousAesFromColumn<InputType>\n): (v: Record<string, DataValue>) => InputType {\n if (isCategoricalAes<InputType>(aesItem)) {\n return (row: Record<string, DataValue>) => aesItem.valuesMap[String(row[aesItem.columnName.value])];\n }\n if (isContinuousAes<InputType>(aesItem)) {\n // size\n const {domain, range} = aesItem;\n const scale: ScalePower<InputType, InputType> = scaleSqrt<InputType, InputType>().domain(domain).range(range);\n return (row: Record<string, DataValue>) => {\n const v = scale(Number(row[aesItem.columnName.value]));\n return Math.max(1, v as number) as InputType;\n };\n }\n return (_v: Record<string, DataValue>) => aesItem;\n}\n\nfunction createAesGetters(aes: DendroSettingsImpl['aes']) {\n return {\n nodeShape: createAesGetter<string>(aes.nodeShape),\n nodeColor: createAesGetter<string>(aes.nodeColor),\n nodeSize: createAesGetter<number>(aes.nodeSize),\n lineShape: createAesGetter<string>(aes.lineShape),\n lineColor: createAesGetter<string>(aes.lineColor),\n };\n}\n\nconst getSteps = (count: number, valueExtent: number[]) => {\n const min = Math.min(...valueExtent);\n const max = Math.max(...valueExtent);\n if (min === max) {\n const steps = count % 2 === 0 ? [] : [min];\n for (let i = 1; i < count / 2 + 1; i++) {\n steps.push(min + i);\n steps.unshift(min - i);\n }\n return steps;\n }\n if (count < 2) {\n return [min, max];\n }\n const step = (max - min) / (count - 1);\n const steps = [];\n for (let i = 0; i < count - 1; i++) {\n steps.push(min + step * i);\n }\n steps.push(max);\n return steps;\n};\n\nfunction getCellHeight(leavesCount: number, scale = 1, minHeight?: number, maxHeight?: number) {\n const valueByNodeCount = (leavesCount < 16 ? 40 : leavesCount < 49 ? 32 : 24) * scale;\n return Math.max(Math.min(valueByNodeCount, maxHeight ?? Infinity), minHeight ?? -Infinity);\n}\n\nclass ChartRenderer {\n component: ReactElement = (<></>);\n reactRoot: Root | null = null;\n parentNode: HTMLElement | null = null;\n rootNode: HTMLElement | null = null;\n chartSizes: ChartSizes = {\n treeWidth: WIDTH,\n treeHeight: HEIGHT,\n heatmapWidth: 0,\n heatmapHeight: 0,\n totalWidth: WIDTH + WIDTH + MARGIN.LEFT + MARGIN.RIGHT,\n totalHeight: HEIGHT + MARGIN.TOP + MARGIN.BOTTOM,\n labelsOffset: 0,\n };\n\n legend: LegendData = {width: 0, height: 0, items: []};\n\n // heatmap scales and step\n heatmapScales: ChartScales = {\n x: scaleOrdinal<string, number>().domain(['null']).range([1]),\n y: scaleOrdinal<string, number>().domain(['null']).range([1]),\n };\n heatmapStep: {x: number; y: number} = {x: 0, y: 0};\n heatmapColorScale: {\n scale: ScaleLinear<string, string> | ScaleOrdinal<string, string, string>;\n getter: (v: DataValue) => string;\n } = {\n scale: scaleOrdinal([]),\n getter: () => 'white',\n };\n heatmapLabels: string[] = [];\n\n clear() {\n if (this.parentNode && this.rootNode) {\n this.parentNode?.removeChild(this.rootNode);\n this.parentNode = null;\n this.rootNode = null;\n }\n // timeout to avoid trying to unmount during rendering\n setTimeout(() => {\n this.reactRoot?.unmount();\n this.reactRoot = null;\n });\n }\n\n init(node: HTMLElement) {\n if (this.parentNode === null) {\n this.parentNode = node;\n this.rootNode = document.createElement('div');\n this.parentNode.appendChild(this.rootNode);\n this.reactRoot = createRoot(this.rootNode);\n }\n }\n\n updateHeatmapScales(\n heatmapData: HeatmapData | null,\n heatmapSettings: DendroSettingsImpl['heatmapSettings'],\n size: DendroSettingsImpl['chartSettings']['size']\n ) {\n if (heatmapData === null) {\n this.chartSizes.heatmapWidth = 0;\n return;\n }\n const {xKeysByGroups, xGroupKeys, xKeys, yKeys} = heatmapData;\n const groupGap = 5;\n // for shared facets max cells counts in group should be used\n const xCounts = xGroupKeys.map(xGroupKey => xKeysByGroups[xGroupKey].length);\n const xCellsCount = xCounts.reduce((sum, count) => sum + count, 0);\n const yStep = this.chartSizes.treeHeight / yKeys.length;\n const xStep = Math.min(\n Math.max(\n (MAX_HEATMAP_WIDTH - (xCounts.filter(count => count > 0).length - 1) * groupGap) / xCellsCount,\n size.minCellWidth\n ),\n size.maxCellWidth\n );\n\n const xPositions: number[] = [];\n let currentX = 0;\n xGroupKeys.forEach(xKey => {\n const axisKeys = xKeysByGroups[xKey];\n axisKeys.forEach(() => {\n xPositions.push(currentX);\n currentX += xStep;\n });\n // do not add offset for empty group\n if (axisKeys.length > 0) {\n currentX += groupGap;\n }\n });\n\n this.heatmapScales.x = scaleOrdinal<string, number>().domain(xKeys).range(xPositions);\n this.heatmapScales.y = scaleOrdinal<string, number>()\n .domain(yKeys)\n .range(yKeys.map((_key, idx) => idx * yStep));\n this.heatmapStep.x = xStep;\n this.heatmapStep.y = yStep;\n\n const {colorsList, colorsMap} = heatmapSettings.aes;\n if (heatmapSettings.valueType === 'continuous' && colorsList) {\n const scale = scaleLinear<string, string>()\n .domain(getSteps(colorsList.length, heatmapData.meta.valueExtent))\n .range(colorsList);\n this.heatmapColorScale = {\n scale,\n getter: v => scale(v as number),\n };\n }\n if (heatmapSettings.valueType === 'discrete' && colorsMap) {\n const values = Object.keys(colorsMap).filter(key => heatmapData.meta.uniqueValues.has(key));\n this.heatmapColorScale = {\n scale: scaleOrdinal(\n values,\n values.map(v => colorsMap[v])\n ).unknown(COLOR_NULL),\n getter: v => (v ? colorsMap[v] ?? COLOR_NULL : COLOR_NULL),\n };\n }\n if (heatmapSettings.valueType === 'stringSource' && colorsList) {\n const values = [...heatmapData.meta.uniqueValues];\n const scale = scaleOrdinal(\n values,\n values.map((_v, idx) => colorsList[idx % colorsList.length])\n ).unknown(COLOR_NULL);\n this.heatmapColorScale = {\n scale,\n getter: v => (v ? scale(v as string) : COLOR_NULL),\n };\n }\n\n this.chartSizes.heatmapWidth =\n this.heatmapScales.x(heatmapData.xKeys[heatmapData.xKeys.length - 1]) + this.heatmapStep.x;\n }\n\n updateLegendSize(\n legend: DendroSettingsImpl['chartSettings']['legend'],\n legendLabels: DendroLegendInfo,\n aes: DendroSettingsImpl['aes'],\n heatmapAnnotation: DendroSettingsImpl['heatmapAnnotation'],\n heatmapData: HeatmapData | null,\n heatmapSettings: DendroSettingsImpl['heatmapSettings']\n ) {\n if (!legend.show) {\n this.legend = {\n width: 0,\n height: 0,\n items: [],\n };\n return;\n }\n const textMeasurer = new TextMeasurer('600 14px Arial');\n const LINE_HEIGHT = 16;\n const GROUP_OFFSET = 48;\n const TEXT_LEFT_DISCRETE = 20;\n const COLUMN_OFFSET = 24;\n\n function getLegendItemWidth(keys: string[], title: string) {\n return Math.max(\n ...keys.map(text => textMeasurer.getTextWidth(String(text)) + TEXT_LEFT_DISCRETE),\n textMeasurer.getTextWidth(title)\n );\n }\n\n const columns: {\n columnKey: string;\n data: Record<string, DotAesItem>;\n values: string[];\n labels: Record<string, string>;\n }[] = [];\n\n const aesGrouping: ColumnName[] = [aes.nodeColor, aes.nodeShape, aes.lineColor]\n .filter(isCategoricalAes)\n .map(item => (item as CategoricalAesFromColumn<string>).columnName);\n aesGrouping.forEach(column => {\n const info = legendLabels[column.value];\n if (info.usedAes.length === 0 || !info.aesMap) {\n return;\n }\n const columnKey = column.label ?? column.value;\n const columnValues = info.values;\n const aesData: Record<string, DotAesItem> = {};\n columnValues.forEach(columnValue => {\n if (!aesData[columnValue]) {\n aesData[columnValue] = {...DEFAULT_DOT_AES} as DotAesItem;\n }\n info.usedAes.forEach(key => {\n if (key === 'dotFill' || key === 'lineColor') {\n aesData[columnValue].color = info.aesMap[columnValue]?.[key] ?? BLACK;\n }\n if (key === 'dotShape') {\n aesData[columnValue].shape = info.aesMap[columnValue]?.[key] ?? '21';\n }\n if (key === 'dotSize') {\n aesData[columnValue].size = info.aesMap[columnValue]?.[key] ?? 3;\n }\n });\n });\n\n columns.push({\n columnKey,\n data: aesData,\n values: info.values,\n labels: info.labels,\n });\n });\n const legendItems: LegendItem[] = [];\n let currentColumnWidth = 0;\n let currentColumnHeight = 0;\n let currentLeft = 0;\n let maxHeight = Math.min(this.chartSizes.treeHeight, MAX_LEGEND_HEIGHT);\n\n if (heatmapAnnotation && heatmapData) {\n const type = heatmapSettings.valueType;\n const title = heatmapAnnotation.label ?? heatmapAnnotation.value;\n if (type === 'continuous') {\n const colorScale = this.heatmapColorScale.scale as ScaleLinear<string, string>;\n const values = getContinuousLegendTicks(colorScale, heatmapData.meta.valueExtent, 4);\n const width = getContinuousLegendWidth(values, title);\n const legendItem: LegendItem = {\n id: 'heatmapValue',\n type: 'continuous',\n width,\n height: maxHeight,\n left: 0,\n top: 0,\n title,\n scale: colorScale,\n values,\n labels: {},\n };\n legendItems.push(legendItem);\n currentColumnHeight = legendItem.height + GROUP_OFFSET;\n currentColumnWidth = legendItem.width;\n } else {\n const colorScale = this.heatmapColorScale.scale as ScaleOrdinal<string, string>;\n const width = getDiscreteLegendWidth(colorScale, title);\n const values = colorScale.domain();\n const height = values.length * LINE_HEIGHT;\n const legendItem: LegendItem = {\n id: 'heatmapValue',\n type: 'discrete',\n width,\n height,\n left: 0,\n top: 0,\n title,\n scale: colorScale,\n values,\n labels: {},\n };\n legendItems.push(legendItem);\n currentColumnHeight = legendItem.height + GROUP_OFFSET;\n currentColumnWidth = legendItem.width;\n }\n }\n\n columns.map(({columnKey, labels, values, data}) => {\n if (currentColumnHeight > maxHeight) {\n currentColumnHeight = 0;\n currentLeft += currentColumnWidth + COLUMN_OFFSET;\n }\n const title = columnKey;\n const width = getLegendItemWidth(\n values.map(v => labels[v]),\n title\n );\n const height = values.length * LINE_HEIGHT;\n if (height > maxHeight) {\n maxHeight = height;\n }\n const scale = scaleOrdinal<DotAesItem>()\n .domain(values)\n .range(values.map(value => data[value]));\n const left = currentLeft;\n const top = currentColumnHeight;\n legendItems.push({id: columnKey, type: 'nodes', width, height, left, top, title, scale, values, labels});\n currentColumnWidth = width;\n currentColumnHeight += height + GROUP_OFFSET;\n });\n\n if (isContinuousAes(aes.nodeSize)) {\n if (currentColumnHeight > maxHeight) {\n currentColumnHeight = 0;\n currentLeft += currentColumnWidth + COLUMN_OFFSET;\n }\n const {columnName, domain, range} = aes.nodeSize;\n const title = columnName.label ?? columnName.value;\n const scale = scaleSqrt(domain, range);\n const values = scale.ticks(3);\n const format = scale.tickFormat(3);\n const labels = values.reduce((res: Record<string, string>, v) => {\n res[String(v)] = format(v);\n return res;\n }, {});\n const width = getLegendItemWidth(\n values.map(v => labels[v]),\n title\n );\n const height = (scale(Math.max(...values)) * 2 + 4) * values.length;\n if (height > maxHeight) {\n maxHeight = height;\n }\n const left = currentLeft;\n const top = currentColumnHeight;\n legendItems.push({id: columnName.value, type: 'size', width, height, left, top, title, scale, values, labels});\n currentColumnWidth = width;\n currentColumnHeight += height + GROUP_OFFSET;\n }\n\n const legendWidth = currentLeft + currentColumnWidth + 2 * LEGEND_OFFSET;\n const legendHeight = maxHeight;\n\n this.legend = {\n width: legendWidth,\n height: legendHeight,\n items: legendItems,\n };\n }\n\n updateChartSizes(\n size: DendroSettingsImpl['chartSettings']['size'],\n heatmapData: HeatmapData | null,\n hierarchy: HierarchyNode<TreeNodeData>\n ) {\n const leavesCount = hierarchy.leaves().length;\n this.chartSizes.treeWidth = heatmapData ? size.width / 2 : size.width;\n\n const height = getCellHeight(leavesCount, size.scale, size.minCellHeight, size.maxCellHeight) * leavesCount;\n\n this.chartSizes.treeHeight = height;\n this.chartSizes.heatmapHeight = height;\n }\n\n updateTotalSizes(heatmapData: HeatmapData | null) {\n this.chartSizes.totalWidth =\n this.chartSizes.treeWidth + this.chartSizes.heatmapWidth + this.legend.width + MARGIN.LEFT + MARGIN.RIGHT;\n if (heatmapData) {\n this.chartSizes.totalWidth += HEATMAP_LEFT_OFFSET;\n }\n if (this.legend.width > 0) {\n this.chartSizes.totalWidth += HEATMAP_LEFT_OFFSET;\n }\n this.chartSizes.totalHeight =\n Math.max(this.chartSizes.treeHeight, this.legend.height) + MARGIN.TOP + MARGIN.BOTTOM;\n }\n\n prepareTableLabels(heatmapData: HeatmapData | null) {\n const textMeasurer = new TextMeasurer('bold 14px Arial');\n const ELLIPSIS = '…';\n\n if (this.heatmapStep.x < 12 || !heatmapData) {\n this.heatmapLabels = [];\n return;\n }\n\n const limit = this.heatmapStep.x - 4;\n\n this.heatmapLabels = heatmapData.xKeys.map(x => {\n const label = heatmapData.meta.xLabels[x];\n let size = textMeasurer.getTextWidth(label);\n if (size < limit) {\n return label;\n }\n let curLabel = label;\n let letters = curLabel?.length;\n while (size > limit && letters > 0) {\n letters--;\n curLabel = label?.substring(0, letters) + ELLIPSIS;\n size = textMeasurer.getTextWidth(curLabel);\n }\n\n return letters > 0 ? curLabel : '';\n });\n }\n\n addLabelsWidthToTreeArea(root: HierarchyPointNode<TreeNodeData>, showLeavesLabels: boolean) {\n if (!showLeavesLabels) {\n return;\n }\n const leaves = root.leaves();\n const textMeasurer = new TextMeasurer('bold 14px Manrope');\n\n let offset = 0;\n leaves.forEach(node => {\n if (!node.data.label) {\n return;\n }\n const size = textMeasurer.getTextWidth(node.data.label);\n const diff = node.y + size - this.chartSizes.treeWidth + 8; // 8 - offset between point center and label\n if (diff > offset) {\n offset = diff;\n }\n });\n\n this.chartSizes.treeWidth += offset;\n }\n\n render(\n chartSettings: DendroSettingsImpl['chartSettings'],\n hierarchy: HierarchyNode<TreeNodeData>,\n connectionType: DendroSettingsImpl['connectionType'],\n rootPosition: DendroSettingsImpl['rootPosition'],\n edgeInheritance: DendroSettingsImpl['edgeInheritance'],\n showNodes: DendroSettingsImpl['showNodes'],\n showEdges: DendroSettingsImpl['showEdges'],\n showLeavesLabels: DendroSettingsImpl['showLeavesLabels'],\n showNodesLabels: DendroSettingsImpl['showNodesLabels'],\n aes: DendroSettingsImpl['aes'],\n labels: DendroSettingsImpl['labels'],\n heatmapAnnotation: DendroSettingsImpl['heatmapAnnotation'],\n heatmapData: HeatmapData | null,\n heatmapSettings: DendroSettingsImpl['heatmapSettings'],\n legendLabels: DendroLegendInfo,\n leavesMode: DendroSettingsImpl['leavesMode'],\n onClick: (data: ClickEventData) => void\n ) {\n this.updateChartSizes(chartSettings.size, heatmapData, hierarchy);\n this.updateHeatmapScales(heatmapData, heatmapSettings, chartSettings.size);\n this.updateLegendSize(chartSettings.legend, legendLabels, aes, heatmapAnnotation, heatmapData, heatmapSettings);\n this.prepareTableLabels(heatmapData);\n\n const clusterSize: [number, number] =\n rootPosition === 'top'\n ? [this.chartSizes.treeWidth, this.chartSizes.treeHeight]\n : [this.chartSizes.treeHeight, this.chartSizes.treeWidth];\n cluster<TreeNodeData>()\n .size(clusterSize)\n .separation(() => 1)(hierarchy);\n const root = hierarchy as HierarchyPointNode<TreeNodeData>;\n\n updateLinksHeight(\n root,\n rootPosition === 'top' ? this.chartSizes.treeHeight : this.chartSizes.treeWidth,\n leavesMode === 'alignLeavesToLine'\n );\n updateNodesHorizontalPosition(root);\n\n this.addLabelsWidthToTreeArea(root, showLeavesLabels);\n this.updateTotalSizes(heatmapData);\n\n const aesGetters = createAesGetters(aes);\n const component = (\n <Chart\n chartSizes={this.chartSizes}\n chartSettings={chartSettings}\n nodes={root.descendants()}\n links={root.links()}\n connectionType={connectionType}\n rootPosition={rootPosition}\n edgeInheritance={edgeInheritance}\n showNodes={showNodes}\n showEdges={showEdges}\n showLeavesLabels={showLeavesLabels}\n showNodesLabels={showNodesLabels}\n aesGetters={aesGetters}\n labels={labels}\n heatmapData={heatmapData}\n heatmapScales={this.heatmapScales}\n heatmapStep={this.heatmapStep}\n heatmapColor={this.heatmapColorScale.getter}\n heatmapLabels={this.heatmapLabels}\n legendData={this.legend}\n onClick={onClick}\n />\n );\n\n this.component = component;\n this.reactRoot?.render(component);\n }\n\n renderError(message: string) {\n this.reactRoot?.render(<Error message={message} />);\n }\n}\n\nexport default ChartRenderer;\n"],"names":["createAesGetter","aesItem","isCategoricalAes","row","isContinuousAes","domain","range","scale","scaleSqrt","v","_v","createAesGetters","aes","getSteps","count","valueExtent","min","max","steps","i","step","getCellHeight","leavesCount","minHeight","maxHeight","valueByNodeCount","ChartRenderer","__publicField","jsx","Fragment","WIDTH","HEIGHT","MARGIN","scaleOrdinal","_a","node","createRoot","heatmapData","heatmapSettings","size","xKeysByGroups","xGroupKeys","xKeys","yKeys","groupGap","xCounts","xGroupKey","xCellsCount","sum","yStep","xStep","MAX_HEATMAP_WIDTH","xPositions","currentX","xKey","axisKeys","_key","idx","colorsList","colorsMap","scaleLinear","values","key","COLOR_NULL","legend","legendLabels","heatmapAnnotation","textMeasurer","TextMeasurer","LINE_HEIGHT","GROUP_OFFSET","TEXT_LEFT_DISCRETE","COLUMN_OFFSET","getLegendItemWidth","keys","title","text","columns","item","column","info","columnKey","columnValues","aesData","columnValue","DEFAULT_DOT_AES","BLACK","_b","_c","legendItems","currentColumnWidth","currentColumnHeight","currentLeft","MAX_LEGEND_HEIGHT","type","colorScale","getContinuousLegendTicks","legendItem","getContinuousLegendWidth","width","getDiscreteLegendWidth","height","labels","data","value","left","top","columnName","format","res","legendWidth","LEGEND_OFFSET","legendHeight","hierarchy","HEATMAP_LEFT_OFFSET","ELLIPSIS","limit","x","label","curLabel","letters","root","showLeavesLabels","leaves","offset","diff","chartSettings","connectionType","rootPosition","edgeInheritance","showNodes","showEdges","showNodesLabels","leavesMode","onClick","clusterSize","cluster","updateLinksHeight","updateNodesHorizontalPosition","aesGetters","component","Chart","message","Error"],"mappings":"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"}
1
+ {"version":3,"file":"ChartRenderer.js","sources":["../../src/dendro/ChartRenderer.tsx"],"sourcesContent":["import type { HierarchyNode, HierarchyPointNode } from 'd3-hierarchy';\nimport { cluster } from 'd3-hierarchy';\nimport type { ScaleLinear, ScaleOrdinal, ScalePower } from 'd3-scale';\nimport { scaleLinear, scaleOrdinal, scaleSqrt } from 'd3-scale';\nimport type { ReactElement } from 'react';\nimport type { Root } from 'react-dom/client';\nimport { createRoot } from 'react-dom/client';\nimport { Error } from '../common/Error';\nimport { BLACK } from '../constants';\nimport type { DataFrame } from '../DataFrame';\nimport { DEFAULT_DOT_AES, LEGEND_OFFSET } from '../scatterplot/constants';\nimport type {\n CategoricalAesFromColumn,\n ClickEventData,\n ColumnName,\n ContinuousAesFromColumn,\n DataValue,\n DendroLegendInfo,\n LineShape,\n PointShape,\n} from '../types';\nimport { isCategoricalAes, isContinuousAes } from '../types';\nimport { getContinuousLegendTicks } from '../utils/getContinuousLegendTicks';\nimport { getContinuousLegendWidth, getDiscreteLegendWidth } from '../utils/getLegendWidth';\nimport { TextMeasurer } from '../utils/TextMeasurer/TextMeasurer';\nimport { Chart } from './components/Chart';\nimport type { ChartScales, ChartSizes, DotAesItem, LegendData, LegendItem } from './components/types';\nimport {\n COLOR_NULL,\n HEATMAP_LEFT_OFFSET,\n HEIGHT,\n MARGIN,\n MAX_HEATMAP_WIDTH,\n MAX_LEGEND_HEIGHT,\n WIDTH,\n} from './constants';\nimport type { DendroSettingsImpl } from './DendroSettingsImpl';\nimport type { HeatmapData } from './getHeatmapData';\nimport type { TreeNodeData } from './getHierarchyData';\nimport { updateLinksHeight, updateNodesHorizontalPosition } from './getHierarchyData';\n\nfunction createAesGetter<InputType extends string | number | PointShape | LineShape>(\n dataFrame: DataFrame,\n aesItem: InputType | CategoricalAesFromColumn<InputType> | ContinuousAesFromColumn<InputType>\n): (idx: number) => InputType {\n if (isCategoricalAes<InputType>(aesItem)) {\n return (idx: number) => aesItem.valuesMap[String(dataFrame.getColumnValue(aesItem.columnName.value, idx))];\n }\n if (isContinuousAes<InputType>(aesItem)) {\n // size\n const {domain, range} = aesItem;\n const scale: ScalePower<InputType, InputType> = scaleSqrt<InputType, InputType>().domain(domain).range(range);\n return (idx: number) => {\n const v = scale(Number(dataFrame.getColumnValue(aesItem.columnName.value, idx)));\n return Math.max(1, v as number) as InputType;\n };\n }\n return (_: number) => aesItem;\n}\n\nfunction createAesGetters(dataFrame: DataFrame, aes: DendroSettingsImpl['aes']) {\n return {\n nodeShape: createAesGetter<string>(dataFrame, aes.nodeShape),\n nodeColor: createAesGetter<string>(dataFrame, aes.nodeColor),\n nodeSize: createAesGetter<number>(dataFrame, aes.nodeSize),\n lineShape: createAesGetter<string>(dataFrame, aes.lineShape),\n lineColor: createAesGetter<string>(dataFrame, aes.lineColor),\n };\n}\n\nconst getSteps = (count: number, valueExtent: number[]) => {\n const min = Math.min(...valueExtent);\n const max = Math.max(...valueExtent);\n if (min === max) {\n const steps = count % 2 === 0 ? [] : [min];\n for (let i = 1; i < count / 2 + 1; i++) {\n steps.push(min + i);\n steps.unshift(min - i);\n }\n return steps;\n }\n if (count < 2) {\n return [min, max];\n }\n const step = (max - min) / (count - 1);\n const steps = [];\n for (let i = 0; i < count - 1; i++) {\n steps.push(min + step * i);\n }\n steps.push(max);\n return steps;\n};\n\nfunction getCellHeight(leavesCount: number, scale = 1, minHeight?: number, maxHeight?: number) {\n const valueByNodeCount = (leavesCount < 16 ? 40 : leavesCount < 49 ? 32 : 24) * scale;\n return Math.max(Math.min(valueByNodeCount, maxHeight ?? Infinity), minHeight ?? -Infinity);\n}\n\nclass ChartRenderer {\n component: ReactElement = (<></>);\n reactRoot: Root | null = null;\n parentNode: HTMLElement | null = null;\n rootNode: HTMLElement | null = null;\n chartSizes: ChartSizes = {\n treeWidth: WIDTH,\n treeHeight: HEIGHT,\n heatmapWidth: 0,\n heatmapHeight: 0,\n totalWidth: WIDTH + WIDTH + MARGIN.LEFT + MARGIN.RIGHT,\n totalHeight: HEIGHT + MARGIN.TOP + MARGIN.BOTTOM,\n labelsOffset: 0,\n };\n\n legend: LegendData = {width: 0, height: 0, items: []};\n\n // heatmap scales and step\n heatmapScales: ChartScales = {\n x: scaleOrdinal<string, number>().domain(['null']).range([1]),\n y: scaleOrdinal<string, number>().domain(['null']).range([1]),\n };\n heatmapStep: {x: number; y: number} = {x: 0, y: 0};\n heatmapColorScale: {\n scale: ScaleLinear<string, string> | ScaleOrdinal<string, string, string>;\n getter: (v: DataValue) => string;\n } = {\n scale: scaleOrdinal([]),\n getter: () => 'white',\n };\n heatmapLabels: string[] = [];\n\n clear() {\n if (this.parentNode && this.rootNode) {\n this.parentNode?.removeChild(this.rootNode);\n this.parentNode = null;\n this.rootNode = null;\n }\n // timeout to avoid trying to unmount during rendering\n setTimeout(() => {\n this.reactRoot?.unmount();\n this.reactRoot = null;\n });\n }\n\n init(node: HTMLElement) {\n if (this.parentNode === null) {\n this.parentNode = node;\n this.rootNode = document.createElement('div');\n this.parentNode.appendChild(this.rootNode);\n this.reactRoot = createRoot(this.rootNode);\n }\n }\n\n updateHeatmapScales(\n heatmapData: HeatmapData | null,\n heatmapSettings: DendroSettingsImpl['heatmapSettings'],\n size: DendroSettingsImpl['chartSettings']['size']\n ) {\n if (heatmapData === null) {\n this.chartSizes.heatmapWidth = 0;\n return;\n }\n const {xKeysByGroups, xGroupKeys, xKeys, yKeys} = heatmapData;\n const groupGap = 5;\n // for shared facets max cells counts in group should be used\n const xCounts = xGroupKeys.map(xGroupKey => xKeysByGroups[xGroupKey].length);\n const xCellsCount = xCounts.reduce((sum, count) => sum + count, 0);\n const yStep = this.chartSizes.treeHeight / yKeys.length;\n const xStep = Math.min(\n Math.max(\n (MAX_HEATMAP_WIDTH - (xCounts.filter(count => count > 0).length - 1) * groupGap) / xCellsCount,\n size.minCellWidth\n ),\n size.maxCellWidth\n );\n\n const xPositions: number[] = [];\n let currentX = 0;\n xGroupKeys.forEach(xKey => {\n const axisKeys = xKeysByGroups[xKey];\n axisKeys.forEach(() => {\n xPositions.push(currentX);\n currentX += xStep;\n });\n // do not add offset for empty group\n if (axisKeys.length > 0) {\n currentX += groupGap;\n }\n });\n\n this.heatmapScales.x = scaleOrdinal<string, number>().domain(xKeys).range(xPositions);\n this.heatmapScales.y = scaleOrdinal<string, number>()\n .domain(yKeys)\n .range(yKeys.map((_key, idx) => idx * yStep));\n this.heatmapStep.x = xStep;\n this.heatmapStep.y = yStep;\n\n const {colorsList, colorsMap} = heatmapSettings.aes;\n if (heatmapSettings.valueType === 'continuous' && colorsList) {\n const scale = scaleLinear<string, string>()\n .domain(getSteps(colorsList.length, heatmapData.meta.valueExtent))\n .range(colorsList);\n this.heatmapColorScale = {\n scale,\n getter: v => scale(v as number),\n };\n }\n if (heatmapSettings.valueType === 'discrete' && colorsMap) {\n const values = Object.keys(colorsMap).filter(key => heatmapData.meta.uniqueValues.has(key));\n this.heatmapColorScale = {\n scale: scaleOrdinal(\n values,\n values.map(v => colorsMap[v])\n ).unknown(COLOR_NULL),\n getter: v => (v ? colorsMap[v] ?? COLOR_NULL : COLOR_NULL),\n };\n }\n if (heatmapSettings.valueType === 'stringSource' && colorsList) {\n const values = [...heatmapData.meta.uniqueValues];\n const scale = scaleOrdinal(\n values,\n values.map((_v, idx) => colorsList[idx % colorsList.length])\n ).unknown(COLOR_NULL);\n this.heatmapColorScale = {\n scale,\n getter: v => (v ? scale(v as string) : COLOR_NULL),\n };\n }\n\n this.chartSizes.heatmapWidth =\n this.heatmapScales.x(heatmapData.xKeys[heatmapData.xKeys.length - 1]) + this.heatmapStep.x;\n }\n\n updateLegendSize(\n legend: DendroSettingsImpl['chartSettings']['legend'],\n legendLabels: DendroLegendInfo,\n aes: DendroSettingsImpl['aes'],\n heatmapAnnotation: DendroSettingsImpl['heatmapAnnotation'],\n heatmapData: HeatmapData | null,\n heatmapSettings: DendroSettingsImpl['heatmapSettings']\n ) {\n if (!legend.show) {\n this.legend = {\n width: 0,\n height: 0,\n items: [],\n };\n return;\n }\n const textMeasurer = new TextMeasurer('600 14px Arial');\n const LINE_HEIGHT = 16;\n const GROUP_OFFSET = 48;\n const TEXT_LEFT_DISCRETE = 20;\n const COLUMN_OFFSET = 24;\n\n function getLegendItemWidth(keys: string[], title: string) {\n return Math.max(\n ...keys.map(text => textMeasurer.getTextWidth(String(text)) + TEXT_LEFT_DISCRETE),\n textMeasurer.getTextWidth(title)\n );\n }\n\n const columns: {\n columnKey: string;\n data: Record<string, DotAesItem>;\n values: string[];\n labels: Record<string, string>;\n }[] = [];\n\n const aesGrouping: ColumnName[] = [aes.nodeColor, aes.nodeShape, aes.lineColor]\n .filter(isCategoricalAes)\n .map(item => (item as CategoricalAesFromColumn<string>).columnName);\n aesGrouping.forEach(column => {\n const info = legendLabels[column.value];\n if (info.usedAes.length === 0 || !info.aesMap) {\n return;\n }\n const columnKey = column.label ?? column.value;\n const columnValues = info.values;\n const aesData: Record<string, DotAesItem> = {};\n columnValues.forEach(columnValue => {\n if (!aesData[columnValue]) {\n aesData[columnValue] = {...DEFAULT_DOT_AES} as DotAesItem;\n }\n info.usedAes.forEach(key => {\n if (key === 'dotFill' || key === 'lineColor') {\n aesData[columnValue].color = info.aesMap[columnValue]?.[key] ?? BLACK;\n }\n if (key === 'dotShape') {\n aesData[columnValue].shape = info.aesMap[columnValue]?.[key] ?? '21';\n }\n if (key === 'dotSize') {\n aesData[columnValue].size = info.aesMap[columnValue]?.[key] ?? 3;\n }\n });\n });\n\n columns.push({\n columnKey,\n data: aesData,\n values: info.values,\n labels: info.labels,\n });\n });\n const legendItems: LegendItem[] = [];\n let currentColumnWidth = 0;\n let currentColumnHeight = 0;\n let currentLeft = 0;\n let maxHeight = Math.min(this.chartSizes.treeHeight, MAX_LEGEND_HEIGHT);\n\n if (heatmapAnnotation && heatmapData) {\n const type = heatmapSettings.valueType;\n const title = heatmapAnnotation.label ?? heatmapAnnotation.value;\n if (type === 'continuous') {\n const colorScale = this.heatmapColorScale.scale as ScaleLinear<string, string>;\n const values = getContinuousLegendTicks(colorScale, heatmapData.meta.valueExtent, 4);\n const width = getContinuousLegendWidth(values, title);\n const legendItem: LegendItem = {\n id: 'heatmapValue',\n type: 'continuous',\n width,\n height: maxHeight,\n left: 0,\n top: 0,\n title,\n scale: colorScale,\n values,\n labels: {},\n };\n legendItems.push(legendItem);\n currentColumnHeight = legendItem.height + GROUP_OFFSET;\n currentColumnWidth = legendItem.width;\n } else {\n const colorScale = this.heatmapColorScale.scale as ScaleOrdinal<string, string>;\n const width = getDiscreteLegendWidth(colorScale, title);\n const values = colorScale.domain();\n const height = values.length * LINE_HEIGHT;\n const legendItem: LegendItem = {\n id: 'heatmapValue',\n type: 'discrete',\n width,\n height,\n left: 0,\n top: 0,\n title,\n scale: colorScale,\n values,\n labels: {},\n };\n legendItems.push(legendItem);\n currentColumnHeight = legendItem.height + GROUP_OFFSET;\n currentColumnWidth = legendItem.width;\n }\n }\n\n columns.map(({columnKey, labels, values, data}) => {\n if (currentColumnHeight > maxHeight) {\n currentColumnHeight = 0;\n currentLeft += currentColumnWidth + COLUMN_OFFSET;\n }\n const title = columnKey;\n const width = getLegendItemWidth(\n values.map(v => labels[v]),\n title\n );\n const height = values.length * LINE_HEIGHT;\n if (height > maxHeight) {\n maxHeight = height;\n }\n const scale = scaleOrdinal<DotAesItem>()\n .domain(values)\n .range(values.map(value => data[value]));\n const left = currentLeft;\n const top = currentColumnHeight;\n legendItems.push({id: columnKey, type: 'nodes', width, height, left, top, title, scale, values, labels});\n currentColumnWidth = width;\n currentColumnHeight += height + GROUP_OFFSET;\n });\n\n if (isContinuousAes(aes.nodeSize)) {\n if (currentColumnHeight > maxHeight) {\n currentColumnHeight = 0;\n currentLeft += currentColumnWidth + COLUMN_OFFSET;\n }\n const {columnName, domain, range} = aes.nodeSize;\n const title = columnName.label ?? columnName.value;\n const scale = scaleSqrt(domain, range);\n const values = scale.ticks(3);\n const format = scale.tickFormat(3);\n const labels = values.reduce((res: Record<string, string>, v) => {\n res[String(v)] = format(v);\n return res;\n }, {});\n const width = getLegendItemWidth(\n values.map(v => labels[v]),\n title\n );\n const height = (scale(Math.max(...values)) * 2 + 4) * values.length;\n if (height > maxHeight) {\n maxHeight = height;\n }\n const left = currentLeft;\n const top = currentColumnHeight;\n legendItems.push({id: columnName.value, type: 'size', width, height, left, top, title, scale, values, labels});\n currentColumnWidth = width;\n currentColumnHeight += height + GROUP_OFFSET;\n }\n\n const legendWidth = currentLeft + currentColumnWidth + 2 * LEGEND_OFFSET;\n const legendHeight = maxHeight;\n\n this.legend = {\n width: legendWidth,\n height: legendHeight,\n items: legendItems,\n };\n }\n\n updateChartSizes(\n size: DendroSettingsImpl['chartSettings']['size'],\n heatmapData: HeatmapData | null,\n hierarchy: HierarchyNode<TreeNodeData>\n ) {\n const leavesCount = hierarchy.leaves().length;\n this.chartSizes.treeWidth = heatmapData ? size.width / 2 : size.width;\n\n const height = getCellHeight(leavesCount, size.scale, size.minCellHeight, size.maxCellHeight) * leavesCount;\n\n this.chartSizes.treeHeight = height;\n this.chartSizes.heatmapHeight = height;\n }\n\n updateTotalSizes(heatmapData: HeatmapData | null) {\n this.chartSizes.totalWidth =\n this.chartSizes.treeWidth + this.chartSizes.heatmapWidth + this.legend.width + MARGIN.LEFT + MARGIN.RIGHT;\n if (heatmapData) {\n this.chartSizes.totalWidth += HEATMAP_LEFT_OFFSET;\n }\n if (this.legend.width > 0) {\n this.chartSizes.totalWidth += HEATMAP_LEFT_OFFSET;\n }\n this.chartSizes.totalHeight =\n Math.max(this.chartSizes.treeHeight, this.legend.height) + MARGIN.TOP + MARGIN.BOTTOM;\n }\n\n prepareTableLabels(heatmapData: HeatmapData | null) {\n const textMeasurer = new TextMeasurer('bold 14px Arial');\n const ELLIPSIS = '…';\n\n if (this.heatmapStep.x < 12 || !heatmapData) {\n this.heatmapLabels = [];\n return;\n }\n\n const limit = this.heatmapStep.x - 4;\n\n this.heatmapLabels = heatmapData.xKeys.map(x => {\n const label = heatmapData.meta.xLabels[x];\n let size = textMeasurer.getTextWidth(label);\n if (size < limit) {\n return label;\n }\n let curLabel = label;\n let letters = curLabel?.length;\n while (size > limit && letters > 0) {\n letters--;\n curLabel = label?.substring(0, letters) + ELLIPSIS;\n size = textMeasurer.getTextWidth(curLabel);\n }\n\n return letters > 0 ? curLabel : '';\n });\n }\n\n addLabelsWidthToTreeArea(root: HierarchyPointNode<TreeNodeData>, showLeavesLabels: boolean) {\n if (!showLeavesLabels) {\n return;\n }\n const leaves = root.leaves();\n const textMeasurer = new TextMeasurer('bold 14px Manrope');\n\n let offset = 0;\n leaves.forEach(node => {\n if (!node.data.label) {\n return;\n }\n const size = textMeasurer.getTextWidth(node.data.label);\n const diff = node.y + size - this.chartSizes.treeWidth + 8; // 8 - offset between point center and label\n if (diff > offset) {\n offset = diff;\n }\n });\n\n this.chartSizes.treeWidth += offset;\n }\n\n render(\n dataFrame: DataFrame,\n chartSettings: DendroSettingsImpl['chartSettings'],\n hierarchy: HierarchyNode<TreeNodeData>,\n connectionType: DendroSettingsImpl['connectionType'],\n rootPosition: DendroSettingsImpl['rootPosition'],\n edgeInheritance: DendroSettingsImpl['edgeInheritance'],\n showNodes: DendroSettingsImpl['showNodes'],\n showEdges: DendroSettingsImpl['showEdges'],\n showLeavesLabels: DendroSettingsImpl['showLeavesLabels'],\n showNodesLabels: DendroSettingsImpl['showNodesLabels'],\n aes: DendroSettingsImpl['aes'],\n labels: DendroSettingsImpl['labels'],\n heatmapAnnotation: DendroSettingsImpl['heatmapAnnotation'],\n heatmapData: HeatmapData | null,\n heatmapSettings: DendroSettingsImpl['heatmapSettings'],\n legendLabels: DendroLegendInfo,\n leavesMode: DendroSettingsImpl['leavesMode'],\n onClick: (data: ClickEventData) => void\n ) {\n this.updateChartSizes(chartSettings.size, heatmapData, hierarchy);\n this.updateHeatmapScales(heatmapData, heatmapSettings, chartSettings.size);\n this.updateLegendSize(chartSettings.legend, legendLabels, aes, heatmapAnnotation, heatmapData, heatmapSettings);\n this.prepareTableLabels(heatmapData);\n\n const clusterSize: [number, number] =\n rootPosition === 'top'\n ? [this.chartSizes.treeWidth, this.chartSizes.treeHeight]\n : [this.chartSizes.treeHeight, this.chartSizes.treeWidth];\n cluster<TreeNodeData>()\n .size(clusterSize)\n .separation(() => 1)(hierarchy);\n const root = hierarchy as HierarchyPointNode<TreeNodeData>;\n\n updateLinksHeight(\n root,\n rootPosition === 'top' ? this.chartSizes.treeHeight : this.chartSizes.treeWidth,\n leavesMode === 'alignLeavesToLine'\n );\n updateNodesHorizontalPosition(root);\n\n this.addLabelsWidthToTreeArea(root, showLeavesLabels);\n this.updateTotalSizes(heatmapData);\n\n const aesGetters = createAesGetters(dataFrame, aes);\n const component = (\n <Chart\n chartSizes={this.chartSizes}\n chartSettings={chartSettings}\n nodes={root.descendants()}\n links={root.links()}\n connectionType={connectionType}\n rootPosition={rootPosition}\n edgeInheritance={edgeInheritance}\n showNodes={showNodes}\n showEdges={showEdges}\n showLeavesLabels={showLeavesLabels}\n showNodesLabels={showNodesLabels}\n aesGetters={aesGetters}\n labels={labels}\n heatmapData={heatmapData}\n heatmapScales={this.heatmapScales}\n heatmapStep={this.heatmapStep}\n heatmapColor={this.heatmapColorScale.getter}\n heatmapLabels={this.heatmapLabels}\n legendData={this.legend}\n onClick={onClick}\n />\n );\n\n this.component = component;\n this.reactRoot?.render(component);\n }\n\n renderError(message: string) {\n this.reactRoot?.render(<Error message={message} />);\n }\n}\n\nexport default ChartRenderer;\n"],"names":["createAesGetter","dataFrame","aesItem","isCategoricalAes","idx","isContinuousAes","domain","range","scale","scaleSqrt","v","_","createAesGetters","aes","getSteps","count","valueExtent","min","max","steps","i","step","getCellHeight","leavesCount","minHeight","maxHeight","valueByNodeCount","ChartRenderer","__publicField","jsx","Fragment","WIDTH","HEIGHT","MARGIN","scaleOrdinal","_a","node","createRoot","heatmapData","heatmapSettings","size","xKeysByGroups","xGroupKeys","xKeys","yKeys","groupGap","xCounts","xGroupKey","xCellsCount","sum","yStep","xStep","MAX_HEATMAP_WIDTH","xPositions","currentX","xKey","axisKeys","_key","colorsList","colorsMap","scaleLinear","values","key","COLOR_NULL","_v","legend","legendLabels","heatmapAnnotation","textMeasurer","TextMeasurer","LINE_HEIGHT","GROUP_OFFSET","TEXT_LEFT_DISCRETE","COLUMN_OFFSET","getLegendItemWidth","keys","title","text","columns","item","column","info","columnKey","columnValues","aesData","columnValue","DEFAULT_DOT_AES","BLACK","_b","_c","legendItems","currentColumnWidth","currentColumnHeight","currentLeft","MAX_LEGEND_HEIGHT","type","colorScale","getContinuousLegendTicks","legendItem","getContinuousLegendWidth","width","getDiscreteLegendWidth","height","labels","data","value","left","top","columnName","format","res","legendWidth","LEGEND_OFFSET","legendHeight","hierarchy","HEATMAP_LEFT_OFFSET","ELLIPSIS","limit","x","label","curLabel","letters","root","showLeavesLabels","leaves","offset","diff","chartSettings","connectionType","rootPosition","edgeInheritance","showNodes","showEdges","showNodesLabels","leavesMode","onClick","clusterSize","cluster","updateLinksHeight","updateNodesHorizontalPosition","aesGetters","component","Chart","message","Error"],"mappings":"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"}
@@ -1,9 +1,9 @@
1
- import { ChartScales, ChartSizes, LegendData } from './types';
1
+ import { HierarchyPointLink, HierarchyPointNode } from 'd3-hierarchy';
2
+ import { ClickEventData, ColumnName, DataValue } from '../../types';
2
3
  import { DendroSettingsImpl } from '../DendroSettingsImpl';
3
4
  import { HeatmapData } from '../getHeatmapData';
4
5
  import { TreeNodeData } from '../getHierarchyData';
5
- import { ClickEventData, ColumnName, DataValue } from '../../types';
6
- import { HierarchyPointLink, HierarchyPointNode } from 'd3-hierarchy';
6
+ import { ChartScales, ChartSizes, LegendData } from './types';
7
7
  interface ChartProps {
8
8
  chartSettings: DendroSettingsImpl['chartSettings'];
9
9
  chartSizes: ChartSizes;
@@ -17,11 +17,11 @@ interface ChartProps {
17
17
  showLeavesLabels: DendroSettingsImpl['showLeavesLabels'];
18
18
  showNodesLabels: DendroSettingsImpl['showNodesLabels'];
19
19
  aesGetters: {
20
- nodeShape: (row: Record<string, string>) => string;
21
- nodeColor: (row: Record<string, string>) => string;
22
- nodeSize: (row: Record<string, number>) => number;
23
- lineShape: (row: Record<string, string>) => string;
24
- lineColor: (row: Record<string, string>) => string;
20
+ nodeShape: (idx: number) => string;
21
+ nodeColor: (idx: number) => string;
22
+ nodeSize: (idx: number) => number;
23
+ lineShape: (idx: number) => string;
24
+ lineColor: (idx: number) => string;
25
25
  };
26
26
  labels: ColumnName;
27
27
  heatmapData: HeatmapData | null;
@@ -1 +1 @@
1
- {"version":3,"file":"Chart.d.ts","sourceRoot":"","sources":["../../../src/dendro/components/Chart.tsx"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAC,WAAW,EAAE,UAAU,EAAC,MAAM,SAAS,CAAC;AAErD,OAAO,KAAK,EAAC,kBAAkB,EAAC,MAAM,uBAAuB,CAAC;AAC9D,OAAO,KAAK,EAAC,WAAW,EAAC,MAAM,mBAAmB,CAAC;AACnD,OAAO,KAAK,EAAC,YAAY,EAAC,MAAM,qBAAqB,CAAC;AAEtD,OAAO,KAAK,EAAC,UAAU,EAAC,MAAM,SAAS,CAAC;AACxC,OAAO,KAAK,EAAC,cAAc,EAAE,UAAU,EAAE,SAAS,EAAC,MAAM,aAAa,CAAC;AACvE,OAAO,KAAK,EAAC,kBAAkB,EAAE,kBAAkB,EAAC,MAAM,cAAc,CAAC;AAgBzE,UAAU,UAAU;IAChB,aAAa,EAAE,kBAAkB,CAAC,eAAe,CAAC,CAAC;IACnD,UAAU,EAAE,UAAU,CAAC;IACvB,KAAK,EAAE,kBAAkB,CAAC,YAAY,CAAC,EAAE,CAAC;IAC1C,KAAK,EAAE,kBAAkB,CAAC,YAAY,CAAC,EAAE,CAAC;IAC1C,cAAc,EAAE,kBAAkB,CAAC,gBAAgB,CAAC,CAAC;IACrD,YAAY,EAAE,kBAAkB,CAAC,cAAc,CAAC,CAAC;IACjD,eAAe,EAAE,kBAAkB,CAAC,iBAAiB,CAAC,CAAC;IACvD,SAAS,EAAE,kBAAkB,CAAC,WAAW,CAAC,CAAC;IAC3C,SAAS,EAAE,kBAAkB,CAAC,WAAW,CAAC,CAAC;IAC3C,gBAAgB,EAAE,kBAAkB,CAAC,kBAAkB,CAAC,CAAC;IACzD,eAAe,EAAE,kBAAkB,CAAC,iBAAiB,CAAC,CAAC;IACvD,UAAU,EAAE;QACR,SAAS,EAAE,CAAC,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,KAAK,MAAM,CAAC;QACnD,SAAS,EAAE,CAAC,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,KAAK,MAAM,CAAC;QACnD,QAAQ,EAAE,CAAC,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,KAAK,MAAM,CAAC;QAClD,SAAS,EAAE,CAAC,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,KAAK,MAAM,CAAC;QACnD,SAAS,EAAE,CAAC,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,KAAK,MAAM,CAAC;KACtD,CAAC;IACF,MAAM,EAAE,UAAU,CAAC;IACnB,WAAW,EAAE,WAAW,GAAG,IAAI,CAAC;IAChC,aAAa,EAAE,WAAW,CAAC;IAC3B,WAAW,EAAE;QAAC,CAAC,EAAE,MAAM,CAAC;QAAC,CAAC,EAAE,MAAM,CAAA;KAAC,CAAC;IACpC,YAAY,EAAE,CAAC,CAAC,EAAE,SAAS,KAAK,MAAM,CAAC;IACvC,aAAa,EAAE,MAAM,EAAE,CAAC;IACxB,UAAU,EAAE,UAAU,CAAC;IACvB,OAAO,EAAE,CAAC,IAAI,EAAE,cAAc,KAAK,IAAI,CAAC;CAC3C;AAED,wBAAgB,KAAK,CAAC,EAClB,aAAa,EACb,UAAU,EACV,KAAK,EACL,KAAK,EACL,cAAc,EACd,YAAY,EACZ,eAAe,EACf,SAAS,EACT,SAAS,EACT,gBAAgB,EAChB,eAAe,EACf,UAAU,EACV,MAAM,EACN,WAAW,EACX,aAAa,EACb,WAAW,EACX,YAAY,EACZ,aAAa,EACb,UAAU,EACV,OAAO,GACV,EAAE,UAAU,2CA2IZ"}
1
+ {"version":3,"file":"Chart.d.ts","sourceRoot":"","sources":["../../../src/dendro/components/Chart.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAC;AAG3E,OAAO,KAAK,EAAE,cAAc,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAEzE,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AAChE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AACrD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAKxD,OAAO,KAAK,EAAE,WAAW,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAenE,UAAU,UAAU;IAChB,aAAa,EAAE,kBAAkB,CAAC,eAAe,CAAC,CAAC;IACnD,UAAU,EAAE,UAAU,CAAC;IACvB,KAAK,EAAE,kBAAkB,CAAC,YAAY,CAAC,EAAE,CAAC;IAC1C,KAAK,EAAE,kBAAkB,CAAC,YAAY,CAAC,EAAE,CAAC;IAC1C,cAAc,EAAE,kBAAkB,CAAC,gBAAgB,CAAC,CAAC;IACrD,YAAY,EAAE,kBAAkB,CAAC,cAAc,CAAC,CAAC;IACjD,eAAe,EAAE,kBAAkB,CAAC,iBAAiB,CAAC,CAAC;IACvD,SAAS,EAAE,kBAAkB,CAAC,WAAW,CAAC,CAAC;IAC3C,SAAS,EAAE,kBAAkB,CAAC,WAAW,CAAC,CAAC;IAC3C,gBAAgB,EAAE,kBAAkB,CAAC,kBAAkB,CAAC,CAAC;IACzD,eAAe,EAAE,kBAAkB,CAAC,iBAAiB,CAAC,CAAC;IACvD,UAAU,EAAE;QACR,SAAS,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,MAAM,CAAC;QACnC,SAAS,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,MAAM,CAAC;QACnC,QAAQ,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,MAAM,CAAC;QAClC,SAAS,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,MAAM,CAAC;QACnC,SAAS,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,MAAM,CAAC;KACtC,CAAC;IACF,MAAM,EAAE,UAAU,CAAC;IACnB,WAAW,EAAE,WAAW,GAAG,IAAI,CAAC;IAChC,aAAa,EAAE,WAAW,CAAC;IAC3B,WAAW,EAAE;QAAC,CAAC,EAAE,MAAM,CAAC;QAAC,CAAC,EAAE,MAAM,CAAA;KAAC,CAAC;IACpC,YAAY,EAAE,CAAC,CAAC,EAAE,SAAS,KAAK,MAAM,CAAC;IACvC,aAAa,EAAE,MAAM,EAAE,CAAC;IACxB,UAAU,EAAE,UAAU,CAAC;IACvB,OAAO,EAAE,CAAC,IAAI,EAAE,cAAc,KAAK,IAAI,CAAC;CAC3C;AAED,wBAAgB,KAAK,CAAC,EAClB,aAAa,EACb,UAAU,EACV,KAAK,EACL,KAAK,EACL,cAAc,EACd,YAAY,EACZ,eAAe,EACf,SAAS,EACT,SAAS,EACT,gBAAgB,EAChB,eAAe,EACf,UAAU,EACV,MAAM,EACN,WAAW,EACX,aAAa,EACb,WAAW,EACX,YAAY,EACZ,aAAa,EACb,UAAU,EACV,OAAO,GACV,EAAE,UAAU,2CA6IZ"}
@@ -1,11 +1,11 @@
1
1
  import { j as e } from "../../node_modules/react/jsx-runtime.js";
2
+ import L, { r as d } from "../../_virtual/index.js";
2
3
  import q from "../../common/fonts.js";
3
- import { Heatmap as J } from "./Heatmap.js";
4
- import { LinksGroup as L } from "./LinksGroup.js";
5
- import { NodesGroup as F } from "./NodesGroup.js";
6
- import { USER_UPDATE_EVENT as R, MARGIN as $, DIMMED_OPACITY as K, HEATMAP_LEFT_OFFSET as m } from "../constants.js";
4
+ import { USER_UPDATE_EVENT as F, MARGIN as R, DIMMED_OPACITY as J, HEATMAP_LEFT_OFFSET as m } from "../constants.js";
5
+ import { Heatmap as K } from "./Heatmap.js";
7
6
  import { Legend as Q } from "./Legend.js";
8
- import A, { r as d } from "../../_virtual/index.js";
7
+ import { LinksGroup as $ } from "./LinksGroup.js";
8
+ import { NodesGroup as A } from "./NodesGroup.js";
9
9
  function C(l) {
10
10
  if (!l)
11
11
  return null;
@@ -20,24 +20,24 @@ function lt({
20
20
  chartSizes: r,
21
21
  nodes: s,
22
22
  links: p,
23
- connectionType: M,
23
+ connectionType: I,
24
24
  rootPosition: x,
25
- edgeInheritance: O,
25
+ edgeInheritance: M,
26
26
  showNodes: h,
27
27
  showEdges: j,
28
- showLeavesLabels: S,
29
- showNodesLabels: W,
28
+ showLeavesLabels: O,
29
+ showNodesLabels: S,
30
30
  aesGetters: E,
31
- labels: _,
31
+ labels: W,
32
32
  heatmapData: g,
33
- heatmapScales: H,
34
- heatmapStep: I,
33
+ heatmapScales: _,
34
+ heatmapStep: H,
35
35
  heatmapColor: N,
36
36
  heatmapLabels: P,
37
37
  legendData: y,
38
- onClick: D
38
+ onClick: U
39
39
  }) {
40
- const U = d.useRef(null), [b, G] = d.useState(null), c = d.useRef(null);
40
+ const b = d.useRef(null), [D, G] = d.useState(null), c = d.useRef(null);
41
41
  d.useEffect(() => {
42
42
  c.current && G(c.current);
43
43
  function t() {
@@ -46,27 +46,27 @@ function lt({
46
46
  function o(i) {
47
47
  Object.entries(i.detail).forEach(([B, V]) => {
48
48
  if (B === "selectedNode") {
49
- const w = s.find((Y) => Y.data.rawData[0].id === V) ?? null;
49
+ const w = s.find((Y) => Y.data.rawIndexes[0] === V) ?? null;
50
50
  u(C(w)), f(w);
51
51
  }
52
52
  });
53
53
  }
54
- return document.addEventListener("click", t), document.addEventListener(R, o), () => {
55
- document.removeEventListener("click", t), document.removeEventListener(R, o);
54
+ return document.addEventListener("click", t), document.addEventListener(F, o), () => {
55
+ document.removeEventListener("click", t), document.removeEventListener(F, o);
56
56
  };
57
57
  }, []);
58
- const [n, u] = A.useState(null), [a, f] = A.useState(null), v = n !== null, T = {
59
- connectionType: M,
58
+ const [n, u] = L.useState(null), [a, f] = L.useState(null), v = n !== null, T = {
59
+ connectionType: I,
60
60
  rootPosition: x,
61
- edgeInheritance: O,
61
+ edgeInheritance: M,
62
62
  aesGetters: E
63
63
  }, k = {
64
64
  rootPosition: x,
65
- showLeavesLabels: S,
66
- showNodesLabels: W,
65
+ showLeavesLabels: O,
66
+ showNodesLabels: S,
67
67
  aesGetters: E,
68
- labels: _,
69
- onClick: D,
68
+ labels: W,
69
+ onClick: U,
70
70
  selectedNodeId: a == null ? void 0 : a.id,
71
71
  onSelectedUpdate: (t) => {
72
72
  u(C(t)), f(t);
@@ -77,16 +77,16 @@ function lt({
77
77
  {
78
78
  xmlns: "http://www.w3.org/2000/svg",
79
79
  viewBox: `0 0 ${r.totalWidth} ${r.totalHeight}`,
80
- ref: U,
80
+ ref: b,
81
81
  width: r.totalWidth,
82
82
  height: r.totalHeight,
83
83
  children: [
84
84
  /* @__PURE__ */ e.jsx("defs", { children: q }),
85
- /* @__PURE__ */ e.jsxs("g", { transform: `translate(${$.LEFT},${$.TOP})`, fontFamily: "Manrope", children: [
85
+ /* @__PURE__ */ e.jsxs("g", { transform: `translate(${R.LEFT},${R.TOP})`, fontFamily: "Manrope", children: [
86
86
  /* @__PURE__ */ e.jsx("text", { x: "0", y: "-12", fontSize: "20", children: l.title.name }),
87
- /* @__PURE__ */ e.jsxs("g", { opacity: v ? K : 1, children: [
87
+ /* @__PURE__ */ e.jsxs("g", { opacity: v ? J : 1, children: [
88
88
  j && /* @__PURE__ */ e.jsx(
89
- L,
89
+ $,
90
90
  {
91
91
  links: p.filter((t) => {
92
92
  const { source: o, target: i } = t;
@@ -97,7 +97,7 @@ function lt({
97
97
  }
98
98
  ),
99
99
  h && /* @__PURE__ */ e.jsx(
100
- F,
100
+ A,
101
101
  {
102
102
  nodes: s.filter((t) => !t.data.isFake && !(n != null && n.has(t.id ?? ""))),
103
103
  ...k
@@ -106,7 +106,7 @@ function lt({
106
106
  ] }),
107
107
  v && /* @__PURE__ */ e.jsxs("g", { children: [
108
108
  j && /* @__PURE__ */ e.jsx(
109
- L,
109
+ $,
110
110
  {
111
111
  links: p.filter((t) => {
112
112
  const { source: o, target: i } = t;
@@ -117,7 +117,7 @@ function lt({
117
117
  }
118
118
  ),
119
119
  h && /* @__PURE__ */ e.jsx(
120
- F,
120
+ A,
121
121
  {
122
122
  nodes: s.filter((t) => !t.data.isFake && (n == null ? void 0 : n.has(t.id ?? ""))),
123
123
  ...k
@@ -125,16 +125,16 @@ function lt({
125
125
  )
126
126
  ] }),
127
127
  g !== null && /* @__PURE__ */ e.jsx("g", { transform: `translate(${r.treeWidth + m},0)`, children: /* @__PURE__ */ e.jsx(
128
- J,
128
+ K,
129
129
  {
130
130
  heatmapData: g,
131
- scales: H,
132
- step: I,
131
+ scales: _,
132
+ step: H,
133
133
  colorScale: N,
134
134
  chartSizes: r,
135
135
  labels: P,
136
136
  selectedNode: a,
137
- tooltipsContainer: b
137
+ tooltipsContainer: D
138
138
  }
139
139
  ) }),
140
140
  l.legend.show && /* @__PURE__ */ e.jsx(
@@ -1 +1 @@
1
- {"version":3,"file":"Chart.js","sources":["../../../src/dendro/components/Chart.tsx"],"sourcesContent":["import fonts from '../../common/fonts';\nimport {Heatmap} from './Heatmap';\nimport {LinksGroup} from './LinksGroup';\nimport {NodesGroup} from './NodesGroup';\nimport type {ChartScales, ChartSizes} from './types';\nimport {DIMMED_OPACITY, HEATMAP_LEFT_OFFSET, MARGIN, USER_UPDATE_EVENT} from '../constants';\nimport type {DendroSettingsImpl} from '../DendroSettingsImpl';\nimport type {HeatmapData} from '../getHeatmapData';\nimport type {TreeNodeData} from '../getHierarchyData';\nimport {Legend} from './Legend';\nimport type {LegendData} from './types';\nimport type {ClickEventData, ColumnName, DataValue} from '../../types';\nimport type {HierarchyPointLink, HierarchyPointNode} from 'd3-hierarchy';\nimport React, {useEffect, useRef, useState} from 'react';\n\nfunction getSelectedPath(node: HierarchyPointNode<TreeNodeData> | null) {\n if (!node) {\n return null;\n }\n const set = new Set<string>();\n let current: HierarchyPointNode<TreeNodeData> | null = node;\n while (current) {\n set.add(current.id as string);\n current = current.parent;\n }\n return set;\n}\n\ninterface ChartProps {\n chartSettings: DendroSettingsImpl['chartSettings'];\n chartSizes: ChartSizes;\n nodes: HierarchyPointNode<TreeNodeData>[];\n links: HierarchyPointLink<TreeNodeData>[];\n connectionType: DendroSettingsImpl['connectionType'];\n rootPosition: DendroSettingsImpl['rootPosition'];\n edgeInheritance: DendroSettingsImpl['edgeInheritance'];\n showNodes: DendroSettingsImpl['showNodes'];\n showEdges: DendroSettingsImpl['showEdges'];\n showLeavesLabels: DendroSettingsImpl['showLeavesLabels'];\n showNodesLabels: DendroSettingsImpl['showNodesLabels'];\n aesGetters: {\n nodeShape: (row: Record<string, string>) => string;\n nodeColor: (row: Record<string, string>) => string;\n nodeSize: (row: Record<string, number>) => number;\n lineShape: (row: Record<string, string>) => string;\n lineColor: (row: Record<string, string>) => string;\n };\n labels: ColumnName;\n heatmapData: HeatmapData | null;\n heatmapScales: ChartScales;\n heatmapStep: {x: number; y: number};\n heatmapColor: (v: DataValue) => string;\n heatmapLabels: string[];\n legendData: LegendData;\n onClick: (data: ClickEventData) => void;\n}\n\nexport function Chart({\n chartSettings,\n chartSizes,\n nodes,\n links,\n connectionType,\n rootPosition,\n edgeInheritance,\n showNodes,\n showEdges,\n showLeavesLabels,\n showNodesLabels,\n aesGetters,\n labels,\n heatmapData,\n heatmapScales,\n heatmapStep,\n heatmapColor,\n heatmapLabels,\n legendData,\n onClick,\n}: ChartProps) {\n const ref = useRef(null);\n const [tooltipsContainer, setTooltipsContainer] = useState<SVGGElement|null>(null);\n const tooltipsRef = useRef<SVGGElement>(null);\n useEffect(() => {\n if (tooltipsRef.current) {\n setTooltipsContainer(tooltipsRef.current);\n }\n function onClick () {\n setSelectedPath(null);\n setSelectedNode(null);\n }\n function onOuterEvent (e:CustomEvent<Record<string, unknown>>) {\n const data = Object.entries(e.detail) as [string, unknown][];\n data.forEach(([key, value]) => {\n if (key === 'selectedNode') {\n const node = nodes.find((node) => node.data.rawData[0].id === value) ?? null;\n setSelectedPath(getSelectedPath(node));\n setSelectedNode(node);\n }\n });\n }\n document.addEventListener('click', onClick);\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore\n document.addEventListener(USER_UPDATE_EVENT, onOuterEvent);\n return () => {\n document.removeEventListener('click', onClick);\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore\n document.removeEventListener(USER_UPDATE_EVENT, onOuterEvent);\n };\n }, []);\n\n const [selectedPath, setSelectedPath] = React.useState<Set<string> | null>(null);\n const [selectedNode, setSelectedNode] = React.useState<HierarchyPointNode<TreeNodeData> | null>(null);\n const somethingSelected = selectedPath !== null;\n\n const linksProps = {\n connectionType,\n rootPosition,\n edgeInheritance,\n aesGetters,\n };\n const nodesProps = {\n rootPosition,\n showLeavesLabels,\n showNodesLabels,\n aesGetters,\n labels,\n onClick,\n selectedNodeId: selectedNode?.id,\n onSelectedUpdate: (node: HierarchyPointNode<TreeNodeData>) => {\n setSelectedPath(getSelectedPath(node));\n setSelectedNode(node);\n }\n };\n\n return (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox={`0 0 ${chartSizes.totalWidth} ${chartSizes.totalHeight}`}\n ref={ref}\n width={chartSizes.totalWidth}\n height={chartSizes.totalHeight}\n >\n <defs>{fonts}</defs>\n <g transform={`translate(${MARGIN.LEFT},${MARGIN.TOP})`} fontFamily=\"Manrope\">\n <text x=\"0\" y=\"-12\" fontSize=\"20\">\n {chartSettings.title.name}\n </text>\n <g opacity={somethingSelected ? DIMMED_OPACITY : 1}>\n {showEdges && (\n <LinksGroup\n links={links.filter(link => { // dimmed links if something selected or all links\n const {source, target} = link;\n return (\n !selectedPath ||\n !(selectedPath.has(source.id ?? '') && selectedPath.has(target.id ?? ''))\n );\n })}\n selected={false}\n {...linksProps}\n />\n )}\n {showNodes && (\n <NodesGroup\n nodes={nodes.filter(node => !node.data.isFake && !selectedPath?.has(node.id ?? ''))}\n {...nodesProps}\n />\n )}\n </g>\n {somethingSelected && (\n <g>\n {showEdges && (\n <LinksGroup\n links={links.filter(link => {\n const {source, target} = link;\n return selectedPath.has(source.id ?? '') && selectedPath.has(target.id ?? '');\n })}\n selected={true}\n {...linksProps}\n />\n )}\n {showNodes && (\n <NodesGroup\n nodes={nodes.filter(node => !node.data.isFake && selectedPath?.has(node.id ?? ''))}\n {...nodesProps}\n />\n )}\n </g>\n )}\n {heatmapData !== null && (\n <g transform={`translate(${chartSizes.treeWidth + HEATMAP_LEFT_OFFSET},0)`}>\n <Heatmap\n heatmapData={heatmapData}\n scales={heatmapScales}\n step={heatmapStep}\n colorScale={heatmapColor}\n chartSizes={chartSizes}\n labels={heatmapLabels}\n selectedNode={selectedNode}\n tooltipsContainer={tooltipsContainer}\n />\n </g>\n )}\n {chartSettings.legend.show && (\n <g\n transform={`translate(${\n chartSizes.treeWidth + HEATMAP_LEFT_OFFSET + chartSizes.heatmapWidth + HEATMAP_LEFT_OFFSET\n },0)`}\n >\n <Legend legendData={legendData} />\n </g>\n )}\n </g>\n <g ref={tooltipsRef} />\n </svg>\n );\n}\n"],"names":["getSelectedPath","node","set","current","Chart","chartSettings","chartSizes","nodes","links","connectionType","rootPosition","edgeInheritance","showNodes","showEdges","showLeavesLabels","showNodesLabels","aesGetters","labels","heatmapData","heatmapScales","heatmapStep","heatmapColor","heatmapLabels","legendData","onClick","ref","useRef","tooltipsContainer","setTooltipsContainer","useState","tooltipsRef","useEffect","setSelectedPath","setSelectedNode","onOuterEvent","e","key","value","USER_UPDATE_EVENT","selectedPath","React","selectedNode","somethingSelected","linksProps","nodesProps","jsxs","jsx","fonts","MARGIN","DIMMED_OPACITY","LinksGroup","link","source","target","NodesGroup","HEATMAP_LEFT_OFFSET","Heatmap","Legend"],"mappings":"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"}
1
+ {"version":3,"file":"Chart.js","sources":["../../../src/dendro/components/Chart.tsx"],"sourcesContent":["import type { HierarchyPointLink, HierarchyPointNode } from 'd3-hierarchy';\nimport React, { useEffect, useRef, useState } from 'react';\nimport fonts from '../../common/fonts';\nimport type { ClickEventData, ColumnName, DataValue } from '../../types';\nimport { DIMMED_OPACITY, HEATMAP_LEFT_OFFSET, MARGIN, USER_UPDATE_EVENT } from '../constants';\nimport type { DendroSettingsImpl } from '../DendroSettingsImpl';\nimport type { HeatmapData } from '../getHeatmapData';\nimport type { TreeNodeData } from '../getHierarchyData';\nimport { Heatmap } from './Heatmap';\nimport { Legend } from './Legend';\nimport { LinksGroup } from './LinksGroup';\nimport { NodesGroup } from './NodesGroup';\nimport type { ChartScales, ChartSizes, LegendData } from './types';\n\nfunction getSelectedPath(node: HierarchyPointNode<TreeNodeData> | null) {\n if (!node) {\n return null;\n }\n const set = new Set<string>();\n let current: HierarchyPointNode<TreeNodeData> | null = node;\n while (current) {\n set.add(current.id as string);\n current = current.parent;\n }\n return set;\n}\n\ninterface ChartProps {\n chartSettings: DendroSettingsImpl['chartSettings'];\n chartSizes: ChartSizes;\n nodes: HierarchyPointNode<TreeNodeData>[];\n links: HierarchyPointLink<TreeNodeData>[];\n connectionType: DendroSettingsImpl['connectionType'];\n rootPosition: DendroSettingsImpl['rootPosition'];\n edgeInheritance: DendroSettingsImpl['edgeInheritance'];\n showNodes: DendroSettingsImpl['showNodes'];\n showEdges: DendroSettingsImpl['showEdges'];\n showLeavesLabels: DendroSettingsImpl['showLeavesLabels'];\n showNodesLabels: DendroSettingsImpl['showNodesLabels'];\n aesGetters: {\n nodeShape: (idx: number) => string;\n nodeColor: (idx: number) => string;\n nodeSize: (idx: number) => number;\n lineShape: (idx: number) => string;\n lineColor: (idx: number) => string;\n };\n labels: ColumnName;\n heatmapData: HeatmapData | null;\n heatmapScales: ChartScales;\n heatmapStep: {x: number; y: number};\n heatmapColor: (v: DataValue) => string;\n heatmapLabels: string[];\n legendData: LegendData;\n onClick: (data: ClickEventData) => void;\n}\n\nexport function Chart({\n chartSettings,\n chartSizes,\n nodes,\n links,\n connectionType,\n rootPosition,\n edgeInheritance,\n showNodes,\n showEdges,\n showLeavesLabels,\n showNodesLabels,\n aesGetters,\n labels,\n heatmapData,\n heatmapScales,\n heatmapStep,\n heatmapColor,\n heatmapLabels,\n legendData,\n onClick,\n}: ChartProps) {\n const ref = useRef(null);\n const [tooltipsContainer, setTooltipsContainer] = useState<SVGGElement|null>(null);\n const tooltipsRef = useRef<SVGGElement>(null);\n useEffect(() => {\n if (tooltipsRef.current) {\n setTooltipsContainer(tooltipsRef.current);\n }\n function onClick () {\n setSelectedPath(null);\n setSelectedNode(null);\n }\n function onOuterEvent (e: CustomEvent<Record<string, unknown>>) {\n const data = Object.entries(e.detail) as [string, unknown][];\n \n data.forEach(([key, value]) => {\n if (key === 'selectedNode') {\n // TODO: what is value ???? should be row index\n const node = nodes.find((node) => node.data.rawIndexes[0] === value) ?? null;\n setSelectedPath(getSelectedPath(node));\n setSelectedNode(node);\n }\n });\n }\n document.addEventListener('click', onClick);\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore\n document.addEventListener(USER_UPDATE_EVENT, onOuterEvent);\n return () => {\n document.removeEventListener('click', onClick);\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore\n document.removeEventListener(USER_UPDATE_EVENT, onOuterEvent);\n };\n }, []);\n\n const [selectedPath, setSelectedPath] = React.useState<Set<string> | null>(null);\n const [selectedNode, setSelectedNode] = React.useState<HierarchyPointNode<TreeNodeData> | null>(null);\n const somethingSelected = selectedPath !== null;\n\n const linksProps = {\n connectionType,\n rootPosition,\n edgeInheritance,\n aesGetters,\n };\n const nodesProps = {\n rootPosition,\n showLeavesLabels,\n showNodesLabels,\n aesGetters,\n labels,\n onClick,\n selectedNodeId: selectedNode?.id,\n onSelectedUpdate: (node: HierarchyPointNode<TreeNodeData>) => {\n setSelectedPath(getSelectedPath(node));\n setSelectedNode(node);\n }\n };\n\n return (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox={`0 0 ${chartSizes.totalWidth} ${chartSizes.totalHeight}`}\n ref={ref}\n width={chartSizes.totalWidth}\n height={chartSizes.totalHeight}\n >\n <defs>{fonts}</defs>\n <g transform={`translate(${MARGIN.LEFT},${MARGIN.TOP})`} fontFamily=\"Manrope\">\n <text x=\"0\" y=\"-12\" fontSize=\"20\">\n {chartSettings.title.name}\n </text>\n <g opacity={somethingSelected ? DIMMED_OPACITY : 1}>\n {showEdges && (\n <LinksGroup\n links={links.filter(link => { // dimmed links if something selected or all links\n const {source, target} = link;\n return (\n !selectedPath ||\n !(selectedPath.has(source.id ?? '') && selectedPath.has(target.id ?? ''))\n );\n })}\n selected={false}\n {...linksProps}\n />\n )}\n {showNodes && (\n <NodesGroup\n nodes={nodes.filter(node => !node.data.isFake && !selectedPath?.has(node.id ?? ''))}\n {...nodesProps}\n />\n )}\n </g>\n {somethingSelected && (\n <g>\n {showEdges && (\n <LinksGroup\n links={links.filter(link => {\n const {source, target} = link;\n return selectedPath.has(source.id ?? '') && selectedPath.has(target.id ?? '');\n })}\n selected={true}\n {...linksProps}\n />\n )}\n {showNodes && (\n <NodesGroup\n nodes={nodes.filter(node => !node.data.isFake && selectedPath?.has(node.id ?? ''))}\n {...nodesProps}\n />\n )}\n </g>\n )}\n {heatmapData !== null && (\n <g transform={`translate(${chartSizes.treeWidth + HEATMAP_LEFT_OFFSET},0)`}>\n <Heatmap\n heatmapData={heatmapData}\n scales={heatmapScales}\n step={heatmapStep}\n colorScale={heatmapColor}\n chartSizes={chartSizes}\n labels={heatmapLabels}\n selectedNode={selectedNode}\n tooltipsContainer={tooltipsContainer}\n />\n </g>\n )}\n {chartSettings.legend.show && (\n <g\n transform={`translate(${\n chartSizes.treeWidth + HEATMAP_LEFT_OFFSET + chartSizes.heatmapWidth + HEATMAP_LEFT_OFFSET\n },0)`}\n >\n <Legend legendData={legendData} />\n </g>\n )}\n </g>\n <g ref={tooltipsRef} />\n </svg>\n );\n}\n"],"names":["getSelectedPath","node","set","current","Chart","chartSettings","chartSizes","nodes","links","connectionType","rootPosition","edgeInheritance","showNodes","showEdges","showLeavesLabels","showNodesLabels","aesGetters","labels","heatmapData","heatmapScales","heatmapStep","heatmapColor","heatmapLabels","legendData","onClick","ref","useRef","tooltipsContainer","setTooltipsContainer","useState","tooltipsRef","useEffect","setSelectedPath","setSelectedNode","onOuterEvent","e","key","value","USER_UPDATE_EVENT","selectedPath","React","selectedNode","somethingSelected","linksProps","nodesProps","jsxs","jsx","fonts","MARGIN","DIMMED_OPACITY","LinksGroup","link","source","target","NodesGroup","HEATMAP_LEFT_OFFSET","Heatmap","Legend"],"mappings":"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"}
@@ -1,8 +1,8 @@
1
- import { ChartScales, ChartSizes } from './types';
1
+ import { HierarchyPointNode } from 'd3-hierarchy';
2
+ import { DataValue } from '../../types';
2
3
  import { HeatmapData } from '../getHeatmapData';
3
4
  import { TreeNodeData } from '../getHierarchyData';
4
- import { DataValue } from '../../types';
5
- import { HierarchyPointNode } from 'd3-hierarchy';
5
+ import { ChartScales, ChartSizes } from './types';
6
6
  export declare function Heatmap({ heatmapData, scales, step, colorScale, tooltipsContainer, chartSizes, selectedNode, labels }: {
7
7
  heatmapData: HeatmapData;
8
8
  scales: ChartScales;
@@ -1 +1 @@
1
- {"version":3,"file":"Heatmap.d.ts","sourceRoot":"","sources":["../../../src/dendro/components/Heatmap.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAO,WAAW,EAAE,UAAU,EAAC,MAAM,SAAS,CAAC;AAE3D,OAAO,KAAK,EAAC,WAAW,EAAC,MAAM,mBAAmB,CAAC;AACnD,OAAO,KAAK,EAAC,YAAY,EAAC,MAAM,qBAAqB,CAAC;AACtD,OAAO,KAAK,EAAC,SAAS,EAAC,MAAM,aAAa,CAAC;AAC3C,OAAO,KAAK,EAAC,kBAAkB,EAAC,MAAM,cAAc,CAAC;AAmBrD,wBAAgB,OAAO,CAAC,EACpB,WAAW,EACX,MAAM,EACN,IAAI,EACJ,UAAU,EACV,iBAAiB,EACjB,UAAU,EACV,YAAY,EACZ,MAAM,EACT,EAAE;IACC,WAAW,EAAE,WAAW,CAAC;IACzB,MAAM,EAAE,WAAW,CAAC;IACpB,IAAI,EAAE;QAAC,CAAC,EAAE,MAAM,CAAC;QAAC,CAAC,EAAE,MAAM,CAAA;KAAC,CAAC;IAC7B,UAAU,EAAE,CAAC,KAAK,EAAE,SAAS,KAAK,MAAM,CAAC;IACzC,UAAU,EAAE,UAAU,CAAC;IACvB,iBAAiB,EAAE,OAAO,GAAG,IAAI,CAAC;IAClC,YAAY,EAAE,kBAAkB,CAAC,YAAY,CAAC,GAAG,IAAI,CAAC;IACtD,MAAM,EAAE,MAAM,EAAE,CAAA;CACnB,2CAgEA"}
1
+ {"version":3,"file":"Heatmap.d.ts","sourceRoot":"","sources":["../../../src/dendro/components/Heatmap.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAC;AAIvD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAE7C,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AACrD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACxD,OAAO,KAAK,EAAQ,WAAW,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAkB7D,wBAAgB,OAAO,CAAC,EACpB,WAAW,EACX,MAAM,EACN,IAAI,EACJ,UAAU,EACV,iBAAiB,EACjB,UAAU,EACV,YAAY,EACZ,MAAM,EACT,EAAE;IACC,WAAW,EAAE,WAAW,CAAC;IACzB,MAAM,EAAE,WAAW,CAAC;IACpB,IAAI,EAAE;QAAC,CAAC,EAAE,MAAM,CAAC;QAAC,CAAC,EAAE,MAAM,CAAA;KAAC,CAAC;IAC7B,UAAU,EAAE,CAAC,KAAK,EAAE,SAAS,KAAK,MAAM,CAAC;IACzC,UAAU,EAAE,UAAU,CAAC;IACvB,iBAAiB,EAAE,OAAO,GAAG,IAAI,CAAC;IAClC,YAAY,EAAE,kBAAkB,CAAC,YAAY,CAAC,GAAG,IAAI,CAAC;IACtD,MAAM,EAAE,MAAM,EAAE,CAAA;CACnB,2CAgEA"}
@@ -1,8 +1,8 @@
1
1
  import { j as i } from "../../node_modules/react/jsx-runtime.js";
2
- import { Tooltip as E } from "../../common/Tooltip.js";
3
- import { BLACK as O } from "../../constants.js";
4
- import { MARGIN as m, HEATMAP_LEFT_OFFSET as L, DIMMED_OPACITY as c, COLOR_EMPTY as C } from "../constants.js";
5
- import { r as W } from "../../_virtual/index.js";
2
+ import { r as E } from "../../_virtual/index.js";
3
+ import { Tooltip as O } from "../../common/Tooltip.js";
4
+ import { BLACK as L } from "../../constants.js";
5
+ import { MARGIN as m, HEATMAP_LEFT_OFFSET as c, DIMMED_OPACITY as C, COLOR_EMPTY as W } from "../constants.js";
6
6
  function A(e) {
7
7
  if (e === null)
8
8
  return "null";
@@ -12,10 +12,10 @@ function A(e) {
12
12
  }
13
13
  return e;
14
14
  }
15
- function P(e, o) {
15
+ function I(e, o) {
16
16
  return [`X: ${o[e.x]}`, `Node: ${e.y}`, `Value: ${A(e.value)}`];
17
17
  }
18
- function I({
18
+ function H({
19
19
  heatmapData: e,
20
20
  scales: o,
21
21
  step: n,
@@ -25,47 +25,47 @@ function I({
25
25
  selectedNode: p,
26
26
  labels: f
27
27
  }) {
28
- const { xKeys: s, yKeys: j, cells: d, meta: M } = e, [x, h] = W.useState(null), y = {
29
- left: u.treeWidth + L + m.LEFT,
28
+ const { xKeys: s, yKeys: j, cells: d, meta: M } = e, [a, h] = E.useState(null), y = {
29
+ left: u.treeWidth + c + m.LEFT,
30
30
  right: u.heatmapWidth + m.RIGHT,
31
31
  top: m.TOP,
32
32
  bottom: u.heatmapHeight + m.BOTTOM
33
33
  };
34
34
  return /* @__PURE__ */ i.jsxs("g", { onMouseLeave: () => h(null), children: [
35
- f.length && /* @__PURE__ */ i.jsx("g", { transform: "translate(0,-8)", children: s.map((r, a) => /* @__PURE__ */ i.jsxs("text", { x: o.x(r) + 2, fontWeight: "500", children: [
35
+ f.length && /* @__PURE__ */ i.jsx("g", { transform: "translate(0,-8)", children: s.map((r, x) => /* @__PURE__ */ i.jsxs("text", { x: o.x(r) + 2, fontWeight: "500", children: [
36
36
  /* @__PURE__ */ i.jsx("title", { children: M.xLabels[r] }),
37
- f[a]
37
+ f[x]
38
38
  ] }, r)) }),
39
39
  s.map(
40
- (r) => j.map((a) => {
40
+ (r) => j.map((x) => {
41
41
  var T;
42
- const t = (T = d == null ? void 0 : d[r]) == null ? void 0 : T[a];
42
+ const t = (T = d == null ? void 0 : d[r]) == null ? void 0 : T[x];
43
43
  return /* @__PURE__ */ i.jsx(
44
44
  "rect",
45
45
  {
46
46
  x: o.x(r),
47
- y: o.y(a),
47
+ y: o.y(x),
48
48
  width: n.x,
49
49
  height: n.y,
50
50
  stroke: "white",
51
51
  strokeWidth: "1px",
52
- fill: t ? g(t == null ? void 0 : t.value) : C,
52
+ fill: t ? g(t == null ? void 0 : t.value) : W,
53
53
  onMouseOver: () => {
54
54
  (t == null ? void 0 : t.value) !== null && typeof (t == null ? void 0 : t.value) < "u" ? h(t) : h(null);
55
55
  },
56
- opacity: p && p.data.rawData[0].id !== (t == null ? void 0 : t.data.id) ? c : 1
56
+ opacity: p && p.data.rawIndexes[0] !== (t == null ? void 0 : t.idx) ? C : 1
57
57
  },
58
- t ? t.id : `${r}_${a}`
58
+ t ? t.id : `${r}_${x}`
59
59
  );
60
60
  })
61
61
  ),
62
- f.length && /* @__PURE__ */ i.jsx("line", { x1: "0", x2: u.heatmapWidth, y1: "0", y2: "0", stroke: O, strokeWidth: "1px" }),
63
- x && l && /* @__PURE__ */ i.jsx(
64
- E,
62
+ f.length && /* @__PURE__ */ i.jsx("line", { x1: "0", x2: u.heatmapWidth, y1: "0", y2: "0", stroke: L, strokeWidth: "1px" }),
63
+ a && l && /* @__PURE__ */ i.jsx(
64
+ O,
65
65
  {
66
- content: P(x, e.meta.xLabels),
67
- x: o.x(x.x) + n.x / 2,
68
- y: o.y(x.y) + n.y / 2,
66
+ content: I(a, e.meta.xLabels),
67
+ x: o.x(a.x) + n.x / 2,
68
+ y: o.y(a.y) + n.y / 2,
69
69
  offset: s.length > 1 ? n.x / 2 : 0,
70
70
  active: !0,
71
71
  fixed: !1,
@@ -76,6 +76,6 @@ function I({
76
76
  ] });
77
77
  }
78
78
  export {
79
- I as Heatmap
79
+ H as Heatmap
80
80
  };
81
81
  //# sourceMappingURL=Heatmap.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"Heatmap.js","sources":["../../../src/dendro/components/Heatmap.tsx"],"sourcesContent":["import {Tooltip} from '../../common/Tooltip';\nimport {BLACK} from '../../constants';\nimport type {Cell, ChartScales, ChartSizes} from './types';\nimport {COLOR_EMPTY, DIMMED_OPACITY, HEATMAP_LEFT_OFFSET, MARGIN} from '../constants';\nimport type {HeatmapData} from '../getHeatmapData';\nimport type {TreeNodeData} from '../getHierarchyData';\nimport type {DataValue} from '../../types';\nimport type {HierarchyPointNode} from 'd3-hierarchy';\nimport React, {useState} from 'react';\n\nfunction formatCellValue(v: DataValue): number | string {\n if (v === null) {\n return 'null';\n }\n if (typeof v === 'number') {\n const whole = Math.floor(v);\n const decimal = v - whole;\n return whole + Number(decimal.toPrecision(2));\n }\n return v;\n}\n\nfunction getTooltipContent(cell: Cell, labels:Record<string, string>) {\n return [`X: ${labels[cell.x]}`, `Node: ${cell.y}`, `Value: ${formatCellValue(cell.value)}`];\n}\n\nexport function Heatmap({\n heatmapData,\n scales,\n step,\n colorScale,\n tooltipsContainer,\n chartSizes,\n selectedNode,\n labels\n}: {\n heatmapData: HeatmapData;\n scales: ChartScales;\n step: {x: number; y: number};\n colorScale: (value: DataValue) => string;\n chartSizes: ChartSizes;\n tooltipsContainer: Element | null;\n selectedNode: HierarchyPointNode<TreeNodeData> | null,\n labels: string[]\n}) {\n const {xKeys, yKeys, cells, meta} = heatmapData;\n const [selectedCell, setSelectedCell] = useState<Cell | null>(null);\n const sideDistances = {\n left: chartSizes.treeWidth + HEATMAP_LEFT_OFFSET + MARGIN.LEFT,\n right: chartSizes.heatmapWidth + MARGIN.RIGHT,\n top: MARGIN.TOP,\n bottom: chartSizes.heatmapHeight + MARGIN.BOTTOM,\n };\n return (\n <g onMouseLeave={() => setSelectedCell(null)}>\n {labels.length && (\n <g transform={'translate(0,-8)'} >\n {xKeys.map((key, idx) => (\n <text x={scales.x(key) + 2} key={key} fontWeight=\"500\">\n <title>{meta.xLabels[key]}</title>\n {labels[idx]}\n </text>\n ))}\n </g>\n )}\n {/* cells */}\n {xKeys.map(xKey =>\n yKeys.map(yKey => {\n const cell = cells?.[xKey]?.[yKey];\n return (\n <rect\n key={cell ? cell.id : `${xKey}_${yKey}`}\n x={scales.x(xKey)}\n y={scales.y(yKey)}\n width={step.x}\n height={step.y}\n stroke=\"white\"\n strokeWidth=\"1px\"\n fill={cell ? colorScale(cell?.value) : COLOR_EMPTY}\n onMouseOver={() => {\n if (cell?.value !== null && typeof cell?.value !== 'undefined') {\n setSelectedCell(cell);\n } else {\n setSelectedCell(null);\n }\n }}\n opacity={selectedNode && selectedNode.data.rawData[0].id !== cell?.data.id ? DIMMED_OPACITY : 1}\n />\n );\n })\n )}\n {labels.length && (\n <line x1=\"0\" x2={chartSizes.heatmapWidth} y1=\"0\" y2=\"0\" stroke={BLACK} strokeWidth=\"1px\"/>\n )}\n {selectedCell && tooltipsContainer && (\n <Tooltip\n content={getTooltipContent(selectedCell, heatmapData.meta.xLabels)}\n x={scales.x(selectedCell.x) + step.x / 2}\n y={scales.y(selectedCell.y) + step.y / 2}\n offset={xKeys.length > 1 ? step.x / 2 : 0}\n active={true}\n fixed={false}\n sideDistances={sideDistances}\n container={tooltipsContainer}\n />\n )}\n </g>\n );\n}\n"],"names":["formatCellValue","v","whole","decimal","getTooltipContent","cell","labels","Heatmap","heatmapData","scales","step","colorScale","tooltipsContainer","chartSizes","selectedNode","xKeys","yKeys","cells","meta","selectedCell","setSelectedCell","useState","sideDistances","HEATMAP_LEFT_OFFSET","MARGIN","jsx","key","idx","jsxs","xKey","yKey","_a","COLOR_EMPTY","DIMMED_OPACITY","BLACK","Tooltip"],"mappings":"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"}
1
+ {"version":3,"file":"Heatmap.js","sources":["../../../src/dendro/components/Heatmap.tsx"],"sourcesContent":["import type { HierarchyPointNode } from 'd3-hierarchy';\nimport { useState } from 'react';\nimport { Tooltip } from '../../common/Tooltip';\nimport { BLACK } from '../../constants';\nimport type { DataValue } from '../../types';\nimport { COLOR_EMPTY, DIMMED_OPACITY, HEATMAP_LEFT_OFFSET, MARGIN } from '../constants';\nimport type { HeatmapData } from '../getHeatmapData';\nimport type { TreeNodeData } from '../getHierarchyData';\nimport type { Cell, ChartScales, ChartSizes } from './types';\n\nfunction formatCellValue(v: DataValue): number | string {\n if (v === null) {\n return 'null';\n }\n if (typeof v === 'number') {\n const whole = Math.floor(v);\n const decimal = v - whole;\n return whole + Number(decimal.toPrecision(2));\n }\n return v;\n}\n\nfunction getTooltipContent(cell: Cell, labels:Record<string, string>) {\n return [`X: ${labels[cell.x]}`, `Node: ${cell.y}`, `Value: ${formatCellValue(cell.value)}`];\n}\n\nexport function Heatmap({\n heatmapData,\n scales,\n step,\n colorScale,\n tooltipsContainer,\n chartSizes,\n selectedNode,\n labels\n}: {\n heatmapData: HeatmapData;\n scales: ChartScales;\n step: {x: number; y: number};\n colorScale: (value: DataValue) => string;\n chartSizes: ChartSizes;\n tooltipsContainer: Element | null;\n selectedNode: HierarchyPointNode<TreeNodeData> | null,\n labels: string[]\n}) {\n const {xKeys, yKeys, cells, meta} = heatmapData;\n const [selectedCell, setSelectedCell] = useState<Cell | null>(null);\n const sideDistances = {\n left: chartSizes.treeWidth + HEATMAP_LEFT_OFFSET + MARGIN.LEFT,\n right: chartSizes.heatmapWidth + MARGIN.RIGHT,\n top: MARGIN.TOP,\n bottom: chartSizes.heatmapHeight + MARGIN.BOTTOM,\n };\n return (\n <g onMouseLeave={() => setSelectedCell(null)}>\n {labels.length && (\n <g transform={'translate(0,-8)'} >\n {xKeys.map((key, idx) => (\n <text x={scales.x(key) + 2} key={key} fontWeight=\"500\">\n <title>{meta.xLabels[key]}</title>\n {labels[idx]}\n </text>\n ))}\n </g>\n )}\n {/* cells */}\n {xKeys.map(xKey =>\n yKeys.map(yKey => {\n const cell = cells?.[xKey]?.[yKey];\n return (\n <rect\n key={cell ? cell.id : `${xKey}_${yKey}`}\n x={scales.x(xKey)}\n y={scales.y(yKey)}\n width={step.x}\n height={step.y}\n stroke=\"white\"\n strokeWidth=\"1px\"\n fill={cell ? colorScale(cell?.value) : COLOR_EMPTY}\n onMouseOver={() => {\n if (cell?.value !== null && typeof cell?.value !== 'undefined') {\n setSelectedCell(cell);\n } else {\n setSelectedCell(null);\n }\n }}\n opacity={selectedNode && selectedNode.data.rawIndexes[0] !== cell?.idx ? DIMMED_OPACITY : 1}\n />\n );\n })\n )}\n {labels.length && (\n <line x1=\"0\" x2={chartSizes.heatmapWidth} y1=\"0\" y2=\"0\" stroke={BLACK} strokeWidth=\"1px\"/>\n )}\n {selectedCell && tooltipsContainer && (\n <Tooltip\n content={getTooltipContent(selectedCell, heatmapData.meta.xLabels)}\n x={scales.x(selectedCell.x) + step.x / 2}\n y={scales.y(selectedCell.y) + step.y / 2}\n offset={xKeys.length > 1 ? step.x / 2 : 0}\n active={true}\n fixed={false}\n sideDistances={sideDistances}\n container={tooltipsContainer}\n />\n )}\n </g>\n );\n}\n"],"names":["formatCellValue","v","whole","decimal","getTooltipContent","cell","labels","Heatmap","heatmapData","scales","step","colorScale","tooltipsContainer","chartSizes","selectedNode","xKeys","yKeys","cells","meta","selectedCell","setSelectedCell","useState","sideDistances","HEATMAP_LEFT_OFFSET","MARGIN","jsx","key","idx","jsxs","xKey","yKey","_a","COLOR_EMPTY","DIMMED_OPACITY","BLACK","Tooltip"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"Legend.d.ts","sourceRoot":"","sources":["../../../src/dendro/components/Legend.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAa,UAAU,EAAuB,MAAM,SAAS,CAAC;AAS1E,UAAU,WAAW;IACjB,UAAU,EAAE,UAAU,CAAC;CAC1B;AAeD,wBAAgB,MAAM,CAAC,EAAC,UAAU,EAAC,EAAE,WAAW,2CAoH/C"}
1
+ {"version":3,"file":"Legend.d.ts","sourceRoot":"","sources":["../../../src/dendro/components/Legend.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAc,UAAU,EAAwB,MAAM,SAAS,CAAC;AAO5E,UAAU,WAAW;IACjB,UAAU,EAAE,UAAU,CAAC;CAC1B;AAeD,wBAAgB,MAAM,CAAC,EAAC,UAAU,EAAC,EAAE,WAAW,2CAoH/C"}