@tetrascience-npm/tetrascience-react-ui 0.7.0-beta.107.1 → 0.7.0-beta.128.1

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 (431) hide show
  1. package/README.md +2 -2
  2. package/dist/components/ai/chain-of-thought.cjs +1 -1
  3. package/dist/components/ai/chain-of-thought.cjs.map +1 -1
  4. package/dist/components/ai/chain-of-thought.js +1 -1
  5. package/dist/components/ai/chain-of-thought.js.map +1 -1
  6. package/dist/components/ai/confirmation.cjs +1 -1
  7. package/dist/components/ai/confirmation.cjs.map +1 -1
  8. package/dist/components/ai/confirmation.js +1 -1
  9. package/dist/components/ai/confirmation.js.map +1 -1
  10. package/dist/components/ai/context.cjs +1 -1
  11. package/dist/components/ai/context.cjs.map +1 -1
  12. package/dist/components/ai/context.js +36 -35
  13. package/dist/components/ai/context.js.map +1 -1
  14. package/dist/components/ai/message.cjs +1 -1
  15. package/dist/components/ai/message.cjs.map +1 -1
  16. package/dist/components/ai/message.js +68 -68
  17. package/dist/components/ai/message.js.map +1 -1
  18. package/dist/components/ai/prompt-input.cjs +1 -1
  19. package/dist/components/ai/prompt-input.cjs.map +1 -1
  20. package/dist/components/ai/prompt-input.js +4 -2
  21. package/dist/components/ai/prompt-input.js.map +1 -1
  22. package/dist/components/ai/queue.cjs +1 -1
  23. package/dist/components/ai/queue.cjs.map +1 -1
  24. package/dist/components/ai/queue.js +9 -9
  25. package/dist/components/ai/queue.js.map +1 -1
  26. package/dist/components/ai/reasoning.cjs +1 -1
  27. package/dist/components/ai/reasoning.cjs.map +1 -1
  28. package/dist/components/ai/reasoning.js +67 -67
  29. package/dist/components/ai/reasoning.js.map +1 -1
  30. package/dist/components/ai/stream-status.cjs +1 -1
  31. package/dist/components/ai/stream-status.cjs.map +1 -1
  32. package/dist/components/ai/stream-status.js +41 -39
  33. package/dist/components/ai/stream-status.js.map +1 -1
  34. package/dist/components/ai/streamdown-code-plugin.cjs +2 -0
  35. package/dist/components/ai/streamdown-code-plugin.cjs.map +1 -0
  36. package/dist/components/ai/streamdown-code-plugin.js +42 -0
  37. package/dist/components/ai/streamdown-code-plugin.js.map +1 -0
  38. package/dist/components/ai/streamdown-plugins.cjs +2 -0
  39. package/dist/components/ai/streamdown-plugins.cjs.map +1 -0
  40. package/dist/components/ai/streamdown-plugins.js +14 -0
  41. package/dist/components/ai/streamdown-plugins.js.map +1 -0
  42. package/dist/components/ai/task.cjs +1 -1
  43. package/dist/components/ai/task.cjs.map +1 -1
  44. package/dist/components/ai/task.js +18 -11
  45. package/dist/components/ai/task.js.map +1 -1
  46. package/dist/components/ai/tool.cjs +1 -1
  47. package/dist/components/ai/tool.cjs.map +1 -1
  48. package/dist/components/ai/tool.js +51 -55
  49. package/dist/components/ai/tool.js.map +1 -1
  50. package/dist/components/ai/use-streamdown-plugins.cjs +2 -0
  51. package/dist/components/ai/use-streamdown-plugins.cjs.map +1 -0
  52. package/dist/components/ai/use-streamdown-plugins.js +25 -0
  53. package/dist/components/ai/use-streamdown-plugins.js.map +1 -0
  54. package/dist/components/charts/AreaPlot/AreaPlot.cjs +2 -0
  55. package/dist/components/charts/AreaPlot/AreaPlot.cjs.map +1 -0
  56. package/dist/components/charts/AreaPlot/AreaPlot.js +270 -0
  57. package/dist/components/charts/AreaPlot/AreaPlot.js.map +1 -0
  58. package/dist/components/charts/BarChart/BarChart.cjs +2 -0
  59. package/dist/components/charts/BarChart/BarChart.cjs.map +1 -0
  60. package/dist/components/charts/BarChart/BarChart.js +219 -0
  61. package/dist/components/charts/BarChart/BarChart.js.map +1 -0
  62. package/dist/components/charts/BoxPlot/BoxPlot.cjs +2 -0
  63. package/dist/components/charts/BoxPlot/BoxPlot.cjs.map +1 -0
  64. package/dist/components/charts/{Boxplot/Boxplot.js → BoxPlot/BoxPlot.js} +78 -79
  65. package/dist/components/charts/BoxPlot/BoxPlot.js.map +1 -0
  66. package/dist/components/charts/ChartTooltip/ChartTooltip.cjs +1 -1
  67. package/dist/components/charts/ChartTooltip/ChartTooltip.cjs.map +1 -1
  68. package/dist/components/charts/ChartTooltip/ChartTooltip.js +22 -22
  69. package/dist/components/charts/ChartTooltip/ChartTooltip.js.map +1 -1
  70. package/dist/components/charts/Chromatogram/Chromatogram.cjs +1 -1
  71. package/dist/components/charts/Chromatogram/Chromatogram.cjs.map +1 -1
  72. package/dist/components/charts/Chromatogram/Chromatogram.js +232 -170
  73. package/dist/components/charts/Chromatogram/Chromatogram.js.map +1 -1
  74. package/dist/components/charts/Chromatogram/annotations.cjs +2 -0
  75. package/dist/components/charts/Chromatogram/annotations.cjs.map +1 -0
  76. package/dist/components/charts/Chromatogram/annotations.js +137 -0
  77. package/dist/components/charts/Chromatogram/annotations.js.map +1 -0
  78. package/dist/components/charts/Chromatogram/boundaryMarkers.cjs +2 -0
  79. package/dist/components/charts/Chromatogram/boundaryMarkers.cjs.map +1 -0
  80. package/dist/components/charts/Chromatogram/boundaryMarkers.js +34 -0
  81. package/dist/components/charts/Chromatogram/boundaryMarkers.js.map +1 -0
  82. package/dist/components/charts/{ChromatogramChart → Chromatogram}/constants.cjs +1 -1
  83. package/dist/components/charts/Chromatogram/constants.cjs.map +1 -0
  84. package/dist/components/charts/{ChromatogramChart → Chromatogram}/constants.js +11 -5
  85. package/dist/components/charts/Chromatogram/constants.js.map +1 -0
  86. package/dist/components/charts/Chromatogram/dataProcessing.cjs +2 -0
  87. package/dist/components/charts/Chromatogram/dataProcessing.cjs.map +1 -0
  88. package/dist/components/charts/Chromatogram/dataProcessing.js +90 -0
  89. package/dist/components/charts/Chromatogram/dataProcessing.js.map +1 -0
  90. package/dist/components/charts/Chromatogram/peakDetection.cjs.map +1 -0
  91. package/dist/components/charts/Chromatogram/peakDetection.js.map +1 -0
  92. package/dist/components/charts/Chromatogram/plotBuilder.cjs +2 -0
  93. package/dist/components/charts/Chromatogram/plotBuilder.cjs.map +1 -0
  94. package/dist/components/charts/Chromatogram/plotBuilder.js +216 -0
  95. package/dist/components/charts/Chromatogram/plotBuilder.js.map +1 -0
  96. package/dist/components/charts/Chromatogram/regionOverlays.cjs +2 -0
  97. package/dist/components/charts/Chromatogram/regionOverlays.cjs.map +1 -0
  98. package/dist/components/charts/Chromatogram/regionOverlays.js +26 -0
  99. package/dist/components/charts/Chromatogram/regionOverlays.js.map +1 -0
  100. package/dist/components/charts/Electropherogram/Electropherogram.cjs +2 -0
  101. package/dist/components/charts/Electropherogram/Electropherogram.cjs.map +1 -0
  102. package/dist/components/charts/Electropherogram/Electropherogram.js +180 -0
  103. package/dist/components/charts/Electropherogram/Electropherogram.js.map +1 -0
  104. package/dist/components/charts/Histogram/Histogram.cjs +1 -1
  105. package/dist/components/charts/Histogram/Histogram.cjs.map +1 -1
  106. package/dist/components/charts/Histogram/Histogram.js +107 -108
  107. package/dist/components/charts/Histogram/Histogram.js.map +1 -1
  108. package/dist/components/charts/LinePlot/LinePlot.cjs +2 -0
  109. package/dist/components/charts/LinePlot/LinePlot.cjs.map +1 -0
  110. package/dist/components/charts/LinePlot/LinePlot.js +224 -0
  111. package/dist/components/charts/LinePlot/LinePlot.js.map +1 -0
  112. package/dist/components/charts/PieChart/PieChart.cjs +1 -1
  113. package/dist/components/charts/PieChart/PieChart.cjs.map +1 -1
  114. package/dist/components/charts/PieChart/PieChart.js +62 -61
  115. package/dist/components/charts/PieChart/PieChart.js.map +1 -1
  116. package/dist/components/charts/PlateMap/PlateMap.cjs +1 -1
  117. package/dist/components/charts/PlateMap/PlateMap.cjs.map +1 -1
  118. package/dist/components/charts/PlateMap/PlateMap.js +246 -242
  119. package/dist/components/charts/PlateMap/PlateMap.js.map +1 -1
  120. package/dist/components/charts/ScatterPlot/ScatterPlot.cjs +2 -0
  121. package/dist/components/charts/ScatterPlot/ScatterPlot.cjs.map +1 -0
  122. package/dist/components/charts/ScatterPlot/ScatterPlot.js +252 -0
  123. package/dist/components/charts/ScatterPlot/ScatterPlot.js.map +1 -0
  124. package/dist/components/charts/ScatterPlotInteractive/ScatterPlotInteractive.cjs +2 -0
  125. package/dist/components/charts/ScatterPlotInteractive/ScatterPlotInteractive.cjs.map +1 -0
  126. package/dist/components/charts/ScatterPlotInteractive/ScatterPlotInteractive.js +215 -0
  127. package/dist/components/charts/ScatterPlotInteractive/ScatterPlotInteractive.js.map +1 -0
  128. package/dist/components/charts/ScatterPlotInteractive/constants.cjs +2 -0
  129. package/dist/components/charts/ScatterPlotInteractive/constants.cjs.map +1 -0
  130. package/dist/components/charts/ScatterPlotInteractive/constants.js +38 -0
  131. package/dist/components/charts/ScatterPlotInteractive/constants.js.map +1 -0
  132. package/dist/components/charts/ScatterPlotInteractive/utils.cjs +2 -0
  133. package/dist/components/charts/ScatterPlotInteractive/utils.cjs.map +1 -0
  134. package/dist/components/charts/ScatterPlotInteractive/utils.js +261 -0
  135. package/dist/components/charts/ScatterPlotInteractive/utils.js.map +1 -0
  136. package/dist/components/charts/StackedChromatogram/StackedChromatogram.cjs +2 -0
  137. package/dist/components/charts/StackedChromatogram/StackedChromatogram.cjs.map +1 -0
  138. package/dist/components/charts/StackedChromatogram/StackedChromatogram.js +40 -0
  139. package/dist/components/charts/StackedChromatogram/StackedChromatogram.js.map +1 -0
  140. package/dist/components/charts/StackedChromatogram/transforms.cjs +2 -0
  141. package/dist/components/charts/StackedChromatogram/transforms.cjs.map +1 -0
  142. package/dist/components/charts/StackedChromatogram/transforms.js +31 -0
  143. package/dist/components/charts/StackedChromatogram/transforms.js.map +1 -0
  144. package/dist/components/charts/plotly-loader.cjs +2 -0
  145. package/dist/components/charts/plotly-loader.cjs.map +1 -0
  146. package/dist/components/charts/plotly-loader.js +22 -0
  147. package/dist/components/charts/plotly-loader.js.map +1 -0
  148. package/dist/components/composed/AssistantLayout/AssistantLayout.cjs +2 -0
  149. package/dist/components/composed/AssistantLayout/AssistantLayout.cjs.map +1 -0
  150. package/dist/components/composed/AssistantLayout/AssistantLayout.js +142 -0
  151. package/dist/components/composed/AssistantLayout/AssistantLayout.js.map +1 -0
  152. package/dist/components/composed/AssistantLayout/dockLayout.cjs +2 -0
  153. package/dist/components/composed/AssistantLayout/dockLayout.cjs.map +1 -0
  154. package/dist/components/composed/AssistantLayout/dockLayout.js +10 -0
  155. package/dist/components/composed/AssistantLayout/dockLayout.js.map +1 -0
  156. package/dist/components/composed/Chat/Chat.cjs +1 -1
  157. package/dist/components/composed/Chat/Chat.cjs.map +1 -1
  158. package/dist/components/composed/Chat/Chat.js +23 -23
  159. package/dist/components/composed/Chat/Chat.js.map +1 -1
  160. package/dist/components/composed/ConfirmDialog/ConfirmDialog.cjs +1 -1
  161. package/dist/components/composed/ConfirmDialog/ConfirmDialog.cjs.map +1 -1
  162. package/dist/components/composed/ConfirmDialog/ConfirmDialog.js +33 -29
  163. package/dist/components/composed/ConfirmDialog/ConfirmDialog.js.map +1 -1
  164. package/dist/components/composed/DataAppShell/CollapseButton.cjs +2 -0
  165. package/dist/components/composed/DataAppShell/CollapseButton.cjs.map +1 -0
  166. package/dist/components/composed/DataAppShell/CollapseButton.js +42 -0
  167. package/dist/components/composed/DataAppShell/CollapseButton.js.map +1 -0
  168. package/dist/components/composed/DataAppShell/DataAppShell.cjs +1 -1
  169. package/dist/components/composed/DataAppShell/DataAppShell.cjs.map +1 -1
  170. package/dist/components/composed/DataAppShell/DataAppShell.js +349 -313
  171. package/dist/components/composed/DataAppShell/DataAppShell.js.map +1 -1
  172. package/dist/components/composed/DataAppShell/PrimaryNav.cjs +2 -0
  173. package/dist/components/composed/DataAppShell/PrimaryNav.cjs.map +1 -0
  174. package/dist/components/composed/DataAppShell/PrimaryNav.js +268 -0
  175. package/dist/components/composed/DataAppShell/PrimaryNav.js.map +1 -0
  176. package/dist/components/composed/DataAppShell/RightPanel.cjs +2 -0
  177. package/dist/components/composed/DataAppShell/RightPanel.cjs.map +1 -0
  178. package/dist/components/composed/DataAppShell/RightPanel.js +282 -0
  179. package/dist/components/composed/DataAppShell/RightPanel.js.map +1 -0
  180. package/dist/components/composed/DataAppShell/SecondaryNav.cjs +2 -0
  181. package/dist/components/composed/DataAppShell/SecondaryNav.cjs.map +1 -0
  182. package/dist/components/composed/DataAppShell/SecondaryNav.js +364 -0
  183. package/dist/components/composed/DataAppShell/SecondaryNav.js.map +1 -0
  184. package/dist/components/composed/DataAppShell/ShellContext.cjs +2 -0
  185. package/dist/components/composed/DataAppShell/ShellContext.cjs.map +1 -0
  186. package/dist/components/composed/DataAppShell/ShellContext.js +23 -0
  187. package/dist/components/composed/DataAppShell/ShellContext.js.map +1 -0
  188. package/dist/components/composed/MoleculeStructure/MoleculeStructure.cjs +2 -0
  189. package/dist/components/composed/MoleculeStructure/MoleculeStructure.cjs.map +1 -0
  190. package/dist/components/composed/MoleculeStructure/MoleculeStructure.js +87 -0
  191. package/dist/components/composed/MoleculeStructure/MoleculeStructure.js.map +1 -0
  192. package/dist/components/composed/MoleculeStructure/rdkit-loader.cjs +2 -0
  193. package/dist/components/composed/MoleculeStructure/rdkit-loader.cjs.map +1 -0
  194. package/dist/components/composed/MoleculeStructure/rdkit-loader.js +89 -0
  195. package/dist/components/composed/MoleculeStructure/rdkit-loader.js.map +1 -0
  196. package/dist/components/composed/MoleculeStructure/use-rdkit.cjs +2 -0
  197. package/dist/components/composed/MoleculeStructure/use-rdkit.cjs.map +1 -0
  198. package/dist/components/composed/MoleculeStructure/use-rdkit.js +19 -0
  199. package/dist/components/composed/MoleculeStructure/use-rdkit.js.map +1 -0
  200. package/dist/components/composed/PlateMapEditor/ManifestFilterPopover.cjs +1 -1
  201. package/dist/components/composed/PlateMapEditor/ManifestFilterPopover.cjs.map +1 -1
  202. package/dist/components/composed/PlateMapEditor/ManifestFilterPopover.js +17 -17
  203. package/dist/components/composed/PlateMapEditor/ManifestFilterPopover.js.map +1 -1
  204. package/dist/components/composed/PlateMapEditor/PlateMapActionsMenu.cjs +1 -1
  205. package/dist/components/composed/PlateMapEditor/PlateMapActionsMenu.cjs.map +1 -1
  206. package/dist/components/composed/PlateMapEditor/PlateMapActionsMenu.js +33 -33
  207. package/dist/components/composed/PlateMapEditor/PlateMapActionsMenu.js.map +1 -1
  208. package/dist/components/composed/PlateMapEditor/PlateMapPlateSelector.cjs +1 -1
  209. package/dist/components/composed/PlateMapEditor/PlateMapPlateSelector.cjs.map +1 -1
  210. package/dist/components/composed/PlateMapEditor/PlateMapPlateSelector.js +7 -7
  211. package/dist/components/composed/PlateMapEditor/PlateMapPlateSelector.js.map +1 -1
  212. package/dist/components/composed/PlateMapEditor/PlatePaintGrid.cjs +1 -1
  213. package/dist/components/composed/PlateMapEditor/PlatePaintGrid.cjs.map +1 -1
  214. package/dist/components/composed/PlateMapEditor/PlatePaintGrid.js +1 -1
  215. package/dist/components/composed/PlateMapEditor/PlatePaintGrid.js.map +1 -1
  216. package/dist/components/composed/PlateMapEditor/WellLegend.cjs +1 -1
  217. package/dist/components/composed/PlateMapEditor/WellLegend.cjs.map +1 -1
  218. package/dist/components/composed/PlateMapEditor/WellLegend.js +24 -12
  219. package/dist/components/composed/PlateMapEditor/WellLegend.js.map +1 -1
  220. package/dist/components/composed/PlateMapEditor/WellManifestTable.cjs +1 -1
  221. package/dist/components/composed/PlateMapEditor/WellManifestTable.cjs.map +1 -1
  222. package/dist/components/composed/PlateMapEditor/WellManifestTable.js +1 -1
  223. package/dist/components/composed/PlateMapEditor/WellManifestTable.js.map +1 -1
  224. package/dist/components/composed/TdpSearch/components/DefaultFilters.cjs +1 -1
  225. package/dist/components/composed/TdpSearch/components/DefaultFilters.cjs.map +1 -1
  226. package/dist/components/composed/TdpSearch/components/DefaultFilters.js +3 -3
  227. package/dist/components/composed/TdpSearch/components/DefaultFilters.js.map +1 -1
  228. package/dist/components/composed/TopBar/TopBar.cjs +2 -0
  229. package/dist/components/composed/TopBar/TopBar.cjs.map +1 -0
  230. package/dist/components/composed/TopBar/TopBar.js +56 -0
  231. package/dist/components/composed/TopBar/TopBar.js.map +1 -0
  232. package/dist/components/composed/UserMenu/UserMenu.cjs +2 -0
  233. package/dist/components/composed/UserMenu/UserMenu.cjs.map +1 -0
  234. package/dist/components/composed/UserMenu/UserMenu.js +99 -0
  235. package/dist/components/composed/UserMenu/UserMenu.js.map +1 -0
  236. package/dist/components/composed/tdp-link.cjs +1 -1
  237. package/dist/components/composed/tdp-link.cjs.map +1 -1
  238. package/dist/components/composed/tdp-link.js +5 -5
  239. package/dist/components/composed/tdp-link.js.map +1 -1
  240. package/dist/components/ui/alert.cjs +1 -1
  241. package/dist/components/ui/alert.cjs.map +1 -1
  242. package/dist/components/ui/alert.js +12 -12
  243. package/dist/components/ui/alert.js.map +1 -1
  244. package/dist/components/ui/badge.cjs +1 -1
  245. package/dist/components/ui/badge.cjs.map +1 -1
  246. package/dist/components/ui/badge.js +14 -14
  247. package/dist/components/ui/badge.js.map +1 -1
  248. package/dist/components/ui/banner.cjs +1 -1
  249. package/dist/components/ui/banner.cjs.map +1 -1
  250. package/dist/components/ui/banner.js +17 -17
  251. package/dist/components/ui/banner.js.map +1 -1
  252. package/dist/components/ui/button.cjs +1 -1
  253. package/dist/components/ui/button.cjs.map +1 -1
  254. package/dist/components/ui/button.js +16 -16
  255. package/dist/components/ui/button.js.map +1 -1
  256. package/dist/components/ui/calendar.cjs +1 -1
  257. package/dist/components/ui/calendar.cjs.map +1 -1
  258. package/dist/components/ui/calendar.js +3 -3
  259. package/dist/components/ui/calendar.js.map +1 -1
  260. package/dist/components/ui/code-block.cjs +3 -3
  261. package/dist/components/ui/code-block.cjs.map +1 -1
  262. package/dist/components/ui/code-block.js +136 -118
  263. package/dist/components/ui/code-block.js.map +1 -1
  264. package/dist/components/ui/code-editor.cjs +1 -1
  265. package/dist/components/ui/code-editor.cjs.map +1 -1
  266. package/dist/components/ui/code-editor.js +14 -12
  267. package/dist/components/ui/code-editor.js.map +1 -1
  268. package/dist/components/ui/combobox.cjs +1 -1
  269. package/dist/components/ui/combobox.cjs.map +1 -1
  270. package/dist/components/ui/combobox.js +33 -29
  271. package/dist/components/ui/combobox.js.map +1 -1
  272. package/dist/components/ui/command.cjs +1 -1
  273. package/dist/components/ui/command.cjs.map +1 -1
  274. package/dist/components/ui/command.js +81 -77
  275. package/dist/components/ui/command.js.map +1 -1
  276. package/dist/components/ui/context-menu.cjs +1 -1
  277. package/dist/components/ui/context-menu.cjs.map +1 -1
  278. package/dist/components/ui/context-menu.js +13 -13
  279. package/dist/components/ui/context-menu.js.map +1 -1
  280. package/dist/components/ui/data-table/data-table-column-toggle.cjs +1 -1
  281. package/dist/components/ui/data-table/data-table-column-toggle.cjs.map +1 -1
  282. package/dist/components/ui/data-table/data-table-column-toggle.js +70 -62
  283. package/dist/components/ui/data-table/data-table-column-toggle.js.map +1 -1
  284. package/dist/components/ui/data-table/data-table-filter.cjs +1 -1
  285. package/dist/components/ui/data-table/data-table-filter.cjs.map +1 -1
  286. package/dist/components/ui/data-table/data-table-filter.js +24 -23
  287. package/dist/components/ui/data-table/data-table-filter.js.map +1 -1
  288. package/dist/components/ui/data-table/data-table-group.cjs +1 -1
  289. package/dist/components/ui/data-table/data-table-group.cjs.map +1 -1
  290. package/dist/components/ui/data-table/data-table-group.js +17 -16
  291. package/dist/components/ui/data-table/data-table-group.js.map +1 -1
  292. package/dist/components/ui/data-table/data-table-pagination.cjs +1 -1
  293. package/dist/components/ui/data-table/data-table-pagination.cjs.map +1 -1
  294. package/dist/components/ui/data-table/data-table-pagination.js +15 -15
  295. package/dist/components/ui/data-table/data-table-pagination.js.map +1 -1
  296. package/dist/components/ui/data-table/data-table.cjs +1 -1
  297. package/dist/components/ui/data-table/data-table.cjs.map +1 -1
  298. package/dist/components/ui/data-table/data-table.js +191 -190
  299. package/dist/components/ui/data-table/data-table.js.map +1 -1
  300. package/dist/components/ui/dialog.cjs +1 -1
  301. package/dist/components/ui/dialog.cjs.map +1 -1
  302. package/dist/components/ui/dialog.js +1 -1
  303. package/dist/components/ui/dialog.js.map +1 -1
  304. package/dist/components/ui/dropdown-menu.cjs +1 -1
  305. package/dist/components/ui/dropdown-menu.cjs.map +1 -1
  306. package/dist/components/ui/dropdown-menu.js +12 -4
  307. package/dist/components/ui/dropdown-menu.js.map +1 -1
  308. package/dist/components/ui/hover-card.cjs +1 -1
  309. package/dist/components/ui/hover-card.cjs.map +1 -1
  310. package/dist/components/ui/hover-card.js +3 -3
  311. package/dist/components/ui/hover-card.js.map +1 -1
  312. package/dist/components/ui/item.cjs +1 -1
  313. package/dist/components/ui/item.cjs.map +1 -1
  314. package/dist/components/ui/item.js +44 -36
  315. package/dist/components/ui/item.js.map +1 -1
  316. package/dist/components/ui/menubar.cjs +1 -1
  317. package/dist/components/ui/menubar.cjs.map +1 -1
  318. package/dist/components/ui/menubar.js +2 -2
  319. package/dist/components/ui/menubar.js.map +1 -1
  320. package/dist/components/ui/navigation-menu.cjs +1 -1
  321. package/dist/components/ui/navigation-menu.cjs.map +1 -1
  322. package/dist/components/ui/navigation-menu.js +1 -1
  323. package/dist/components/ui/navigation-menu.js.map +1 -1
  324. package/dist/components/ui/popover.cjs +1 -1
  325. package/dist/components/ui/popover.cjs.map +1 -1
  326. package/dist/components/ui/popover.js +1 -1
  327. package/dist/components/ui/popover.js.map +1 -1
  328. package/dist/components/ui/scroll-area.cjs +1 -1
  329. package/dist/components/ui/scroll-area.cjs.map +1 -1
  330. package/dist/components/ui/scroll-area.js +1 -0
  331. package/dist/components/ui/scroll-area.js.map +1 -1
  332. package/dist/components/ui/select.cjs +1 -1
  333. package/dist/components/ui/select.cjs.map +1 -1
  334. package/dist/components/ui/select.js +1 -1
  335. package/dist/components/ui/select.js.map +1 -1
  336. package/dist/components/ui/sheet.cjs +1 -1
  337. package/dist/components/ui/sheet.cjs.map +1 -1
  338. package/dist/components/ui/sheet.js +5 -5
  339. package/dist/components/ui/sheet.js.map +1 -1
  340. package/dist/components/ui/sidebar.cjs +1 -1
  341. package/dist/components/ui/sidebar.cjs.map +1 -1
  342. package/dist/components/ui/sidebar.js +2 -2
  343. package/dist/components/ui/sidebar.js.map +1 -1
  344. package/dist/components/ui/slider.cjs +1 -1
  345. package/dist/components/ui/slider.cjs.map +1 -1
  346. package/dist/components/ui/slider.js +10 -9
  347. package/dist/components/ui/slider.js.map +1 -1
  348. package/dist/components/ui/sonner.cjs +1 -1
  349. package/dist/components/ui/sonner.cjs.map +1 -1
  350. package/dist/components/ui/sonner.js +25 -10
  351. package/dist/components/ui/sonner.js.map +1 -1
  352. package/dist/components/ui/table.cjs +1 -1
  353. package/dist/components/ui/table.cjs.map +1 -1
  354. package/dist/components/ui/table.js +1 -0
  355. package/dist/components/ui/table.js.map +1 -1
  356. package/dist/components/ui/tabs.cjs +1 -1
  357. package/dist/components/ui/tabs.cjs.map +1 -1
  358. package/dist/components/ui/tabs.js +18 -18
  359. package/dist/components/ui/tabs.js.map +1 -1
  360. package/dist/components/ui/tetra-molecule-icon.cjs +2 -0
  361. package/dist/components/ui/tetra-molecule-icon.cjs.map +1 -0
  362. package/dist/components/ui/tetra-molecule-icon.js +49 -0
  363. package/dist/components/ui/tetra-molecule-icon.js.map +1 -0
  364. package/dist/components/ui/toggle-group.cjs +1 -1
  365. package/dist/components/ui/toggle-group.cjs.map +1 -1
  366. package/dist/components/ui/toggle-group.js +35 -31
  367. package/dist/components/ui/toggle-group.js.map +1 -1
  368. package/dist/hooks/use-plotly-theme.cjs +1 -1
  369. package/dist/hooks/use-plotly-theme.cjs.map +1 -1
  370. package/dist/hooks/use-plotly-theme.js +4 -3
  371. package/dist/hooks/use-plotly-theme.js.map +1 -1
  372. package/dist/index.cjs +1 -1
  373. package/dist/index.css +1 -1
  374. package/dist/index.d.ts +1210 -132
  375. package/dist/index.js +694 -639
  376. package/dist/index.js.map +1 -1
  377. package/dist/index.tailwind.css +1 -1
  378. package/dist/lib/shiki.cjs +2 -0
  379. package/dist/lib/shiki.cjs.map +1 -0
  380. package/dist/lib/shiki.js +72 -0
  381. package/dist/lib/shiki.js.map +1 -0
  382. package/package.json +23 -12
  383. package/dist/components/charts/AreaGraph/AreaGraph.cjs +0 -2
  384. package/dist/components/charts/AreaGraph/AreaGraph.cjs.map +0 -1
  385. package/dist/components/charts/AreaGraph/AreaGraph.js +0 -271
  386. package/dist/components/charts/AreaGraph/AreaGraph.js.map +0 -1
  387. package/dist/components/charts/BarGraph/BarGraph.cjs +0 -2
  388. package/dist/components/charts/BarGraph/BarGraph.cjs.map +0 -1
  389. package/dist/components/charts/BarGraph/BarGraph.js +0 -220
  390. package/dist/components/charts/BarGraph/BarGraph.js.map +0 -1
  391. package/dist/components/charts/Boxplot/Boxplot.cjs +0 -2
  392. package/dist/components/charts/Boxplot/Boxplot.cjs.map +0 -1
  393. package/dist/components/charts/Boxplot/Boxplot.js.map +0 -1
  394. package/dist/components/charts/ChromatogramChart/ChromatogramChart.cjs +0 -2
  395. package/dist/components/charts/ChromatogramChart/ChromatogramChart.cjs.map +0 -1
  396. package/dist/components/charts/ChromatogramChart/ChromatogramChart.js +0 -227
  397. package/dist/components/charts/ChromatogramChart/ChromatogramChart.js.map +0 -1
  398. package/dist/components/charts/ChromatogramChart/annotations.cjs +0 -2
  399. package/dist/components/charts/ChromatogramChart/annotations.cjs.map +0 -1
  400. package/dist/components/charts/ChromatogramChart/annotations.js +0 -73
  401. package/dist/components/charts/ChromatogramChart/annotations.js.map +0 -1
  402. package/dist/components/charts/ChromatogramChart/boundaryMarkers.cjs +0 -2
  403. package/dist/components/charts/ChromatogramChart/boundaryMarkers.cjs.map +0 -1
  404. package/dist/components/charts/ChromatogramChart/boundaryMarkers.js +0 -34
  405. package/dist/components/charts/ChromatogramChart/boundaryMarkers.js.map +0 -1
  406. package/dist/components/charts/ChromatogramChart/constants.cjs.map +0 -1
  407. package/dist/components/charts/ChromatogramChart/constants.js.map +0 -1
  408. package/dist/components/charts/ChromatogramChart/dataProcessing.cjs +0 -2
  409. package/dist/components/charts/ChromatogramChart/dataProcessing.cjs.map +0 -1
  410. package/dist/components/charts/ChromatogramChart/dataProcessing.js +0 -79
  411. package/dist/components/charts/ChromatogramChart/dataProcessing.js.map +0 -1
  412. package/dist/components/charts/ChromatogramChart/peakDetection.cjs.map +0 -1
  413. package/dist/components/charts/ChromatogramChart/peakDetection.js.map +0 -1
  414. package/dist/components/charts/DotPlot/DotPlot.cjs +0 -2
  415. package/dist/components/charts/DotPlot/DotPlot.cjs.map +0 -1
  416. package/dist/components/charts/DotPlot/DotPlot.js +0 -208
  417. package/dist/components/charts/DotPlot/DotPlot.js.map +0 -1
  418. package/dist/components/charts/Heatmap/Heatmap.cjs +0 -2
  419. package/dist/components/charts/Heatmap/Heatmap.cjs.map +0 -1
  420. package/dist/components/charts/Heatmap/Heatmap.js +0 -67
  421. package/dist/components/charts/Heatmap/Heatmap.js.map +0 -1
  422. package/dist/components/charts/LineGraph/LineGraph.cjs +0 -2
  423. package/dist/components/charts/LineGraph/LineGraph.cjs.map +0 -1
  424. package/dist/components/charts/LineGraph/LineGraph.js +0 -225
  425. package/dist/components/charts/LineGraph/LineGraph.js.map +0 -1
  426. package/dist/components/charts/ScatterGraph/ScatterGraph.cjs +0 -2
  427. package/dist/components/charts/ScatterGraph/ScatterGraph.cjs.map +0 -1
  428. package/dist/components/charts/ScatterGraph/ScatterGraph.js +0 -234
  429. package/dist/components/charts/ScatterGraph/ScatterGraph.js.map +0 -1
  430. /package/dist/components/charts/{ChromatogramChart → Chromatogram}/peakDetection.cjs +0 -0
  431. /package/dist/components/charts/{ChromatogramChart → Chromatogram}/peakDetection.js +0 -0
@@ -1,225 +0,0 @@
1
- import { jsxs as W, jsx as D } from "react/jsx-runtime";
2
- import C from "plotly.js-dist";
3
- import { useRef as b, useMemo as m, useEffect as R } from "react";
4
- import { useChartTooltip as T } from "../ChartTooltip/ChartTooltip.js";
5
- import { useElementSize as q } from "../../../hooks/use-element-size.js";
6
- import { usePlotlyTheme as F } from "../../../hooks/use-plotly-theme.js";
7
- import { cn as J } from "../../../lib/utils.js";
8
- import { seriesColor as K } from "../../../utils/colors.js";
9
- const Q = 60, Z = 30, st = ({
10
- dataSeries: c,
11
- width: N,
12
- height: L,
13
- xRange: _,
14
- yRange: u,
15
- variant: d = "lines",
16
- xTitle: E,
17
- yTitle: I,
18
- title: g,
19
- xTickText: y
20
- }) => {
21
- const a = b(null), r = F(), { bindTooltip: A, tooltipElement: Y } = T({ xLabel: E, yLabel: I }), [j, P] = q(), l = N ?? P.width, s = L ?? P.height, X = l > 0 && s > 0, H = N === void 0, S = L === void 0, w = b({ width: l, height: s });
22
- w.current = { width: l, height: s };
23
- const v = b(!1), M = b({ width: 0, height: 0 }), { yMin: O, yMax: U } = m(() => {
24
- let e = Number.MAX_VALUE, t = Number.MIN_VALUE, i = Number.MAX_VALUE, o = Number.MIN_VALUE;
25
- c.forEach((f) => {
26
- f.x.forEach((p) => {
27
- e = Math.min(e, p), t = Math.max(t, p);
28
- }), f.y.forEach((p) => {
29
- i = Math.min(i, p), o = Math.max(o, p);
30
- });
31
- });
32
- const n = (t - e) * 0.1, k = (o - i) * 0.1;
33
- return {
34
- xMin: e - n,
35
- xMax: t + n,
36
- yMin: i - k,
37
- yMax: o + k
38
- };
39
- }, [c]), h = m(
40
- () => u || [O, U],
41
- [u, O, U]
42
- ), V = m(() => {
43
- const e = h[1] - h[0];
44
- let t = Math.pow(10, Math.floor(Math.log10(e)));
45
- e / t > 10 && (t = t * 2), e / t < 4 && (t = t / 2);
46
- const i = [];
47
- let o = Math.ceil(h[0] / t) * t;
48
- for (; o <= h[1]; )
49
- i.push(o), o += t;
50
- return i;
51
- }, [h]), x = m(
52
- () => [...new Set(c.flatMap((e) => e.x))].sort((e, t) => e - t),
53
- [c]
54
- ), B = !!y && y.length === x.length, G = m(() => {
55
- switch (d) {
56
- case "lines+markers":
57
- case "lines+markers+error_bars":
58
- return "lines+markers";
59
- default:
60
- return "lines";
61
- }
62
- }, [d]), z = m(
63
- () => ({
64
- tickcolor: r.tickColor,
65
- ticklen: 12,
66
- tickwidth: 1,
67
- ticks: "outside",
68
- tickfont: {
69
- size: 16,
70
- color: r.textColor,
71
- family: "Inter, sans-serif",
72
- weight: 400
73
- },
74
- linecolor: r.lineColor,
75
- linewidth: 1,
76
- position: 0,
77
- zeroline: !1
78
- }),
79
- [r]
80
- );
81
- return R(() => {
82
- if (!a.current || !X) return;
83
- const e = c.map((n, k) => {
84
- const f = K(k, n.color);
85
- return {
86
- x: n.x,
87
- y: n.y,
88
- type: "scatter",
89
- mode: G,
90
- name: n.name,
91
- hoverinfo: "none",
92
- line: {
93
- color: f,
94
- width: 1.5
95
- },
96
- marker: d === "lines" ? { opacity: 0 } : {
97
- color: f,
98
- size: 8,
99
- symbol: n.symbol || "triangle-up"
100
- },
101
- error_y: d === "lines+markers+error_bars" ? n.error_y || {
102
- type: "data",
103
- array: n.y.map(() => 10),
104
- visible: !0,
105
- color: f,
106
- thickness: 1,
107
- width: 5
108
- } : void 0
109
- };
110
- }), t = {
111
- ...g ? {
112
- title: {
113
- text: g,
114
- font: {
115
- size: 32,
116
- family: "Inter, sans-serif",
117
- color: r.textColor
118
- }
119
- }
120
- } : {},
121
- width: w.current.width,
122
- height: w.current.height,
123
- margin: {
124
- l: 80,
125
- r: 30,
126
- // Reserve room for tick labels, the x-axis title, and the
127
- // container-anchored bottom legend stacked beneath them.
128
- b: 96,
129
- t: g ? Q : Z,
130
- pad: 10
131
- },
132
- paper_bgcolor: r.paperBg,
133
- plot_bgcolor: r.plotBg,
134
- font: {
135
- family: "Inter, sans-serif"
136
- },
137
- dragmode: !1,
138
- xaxis: {
139
- title: {
140
- text: E,
141
- font: {
142
- size: 16,
143
- color: r.textSecondary,
144
- family: "Inter, sans-serif",
145
- weight: 400
146
- },
147
- standoff: 32
148
- },
149
- gridcolor: r.gridColor,
150
- range: _,
151
- autorange: !_,
152
- tickmode: "array",
153
- tickvals: x,
154
- ticktext: B ? y : x.map(String),
155
- showgrid: !0,
156
- // Reserve space for tick labels + the axis title so the bottom legend
157
- // can't overlap them at small sizes (SW-2157).
158
- automargin: !0,
159
- ...z
160
- },
161
- yaxis: {
162
- title: {
163
- text: I,
164
- font: {
165
- size: 16,
166
- color: r.textSecondary,
167
- family: "Inter, sans-serif",
168
- weight: 400
169
- },
170
- standoff: 30
171
- },
172
- gridcolor: r.gridColor,
173
- range: u,
174
- autorange: !u,
175
- tickmode: "array",
176
- tickvals: V,
177
- showgrid: !0,
178
- automargin: !0,
179
- ...z
180
- },
181
- legend: {
182
- // Anchor to the bottom of the container (not the plot area) so the
183
- // legend always clears the x-axis tick labels + title — a paper-relative
184
- // fractional offset collapses into the ticks at small heights (SW-2157).
185
- x: 0.5,
186
- y: 0,
187
- xanchor: "center",
188
- yanchor: "bottom",
189
- yref: "container",
190
- orientation: "h",
191
- font: {
192
- size: 16,
193
- color: r.legendColor,
194
- family: "Inter, sans-serif",
195
- weight: 500
196
- }
197
- },
198
- showlegend: !0
199
- }, i = {
200
- // Sizing is driven from the measured container; disable Plotly's own
201
- // window-resize responsiveness (it can't see container resizes).
202
- responsive: !1,
203
- displayModeBar: !1,
204
- displaylogo: !1
205
- };
206
- C.newPlot(a.current, e, t, i), A(a.current);
207
- const o = a.current;
208
- return v.current = !0, M.current = { ...w.current }, () => {
209
- o && (C.purge(o), v.current = !1);
210
- };
211
- }, [c, X, _, u, E, I, g, G, z, x, V, B, y, h, d, r, A]), R(() => {
212
- const e = a.current;
213
- !e || !v.current || l <= 0 || s <= 0 || M.current.width === l && M.current.height === s || (M.current = { width: l, height: s }, C.relayout(e, { width: l, height: s }).catch(
214
- () => {
215
- }
216
- ));
217
- }, [l, s]), /* @__PURE__ */ W("div", { ref: j, className: J("relative", H && "w-full", S && "h-full"), children: [
218
- /* @__PURE__ */ D("div", { ref: a, style: { width: "100%", height: "100%" } }),
219
- Y
220
- ] });
221
- };
222
- export {
223
- st as LineGraph
224
- };
225
- //# sourceMappingURL=LineGraph.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"LineGraph.js","sources":["../../../../src/components/charts/LineGraph/LineGraph.tsx"],"sourcesContent":["import Plotly from \"plotly.js-dist\";\nimport React, { useEffect, useRef, useMemo } from \"react\";\n\nimport { useChartTooltip } from \"../ChartTooltip\";\n\nimport { useElementSize } from \"@/hooks/use-element-size\";\nimport { usePlotlyTheme } from \"@/hooks/use-plotly-theme\";\nimport { cn } from \"@/lib/utils\";\nimport { seriesColor } from \"@/utils/colors\";\n\ntype MarkerSymbol =\n | \"circle\"\n | \"circle-open\"\n | \"circle-dot\"\n | \"circle-open-dot\"\n | \"square\"\n | \"square-open\"\n | \"square-dot\"\n | \"square-open-dot\"\n | \"diamond\"\n | \"diamond-open\"\n | \"diamond-dot\"\n | \"diamond-open-dot\"\n | \"cross\"\n | \"cross-open\"\n | \"cross-dot\"\n | \"cross-open-dot\"\n | \"x\"\n | \"x-open\"\n | \"x-dot\"\n | \"x-open-dot\"\n | \"triangle-up\"\n | \"triangle-up-open\"\n | \"triangle-up-dot\"\n | \"triangle-up-open-dot\"\n | \"triangle-down\"\n | \"triangle-down-open\"\n | \"triangle-down-dot\"\n | \"triangle-down-open-dot\"\n | \"triangle-left\"\n | \"triangle-left-open\"\n | \"triangle-left-dot\"\n | \"triangle-left-open-dot\"\n | \"triangle-right\"\n | \"triangle-right-open\"\n | \"triangle-right-dot\"\n | \"triangle-right-open-dot\"\n | \"triangle-ne\"\n | \"triangle-ne-open\"\n | \"triangle-ne-dot\"\n | \"triangle-ne-open-dot\"\n | \"triangle-se\"\n | \"triangle-se-open\"\n | \"triangle-se-dot\"\n | \"triangle-se-open-dot\"\n | \"triangle-sw\"\n | \"triangle-sw-open\"\n | \"triangle-sw-dot\"\n | \"triangle-sw-open-dot\"\n | \"triangle-nw\"\n | \"triangle-nw-open\"\n | \"triangle-nw-dot\"\n | \"triangle-nw-open-dot\"\n | \"pentagon\"\n | \"pentagon-open\"\n | \"pentagon-dot\"\n | \"pentagon-open-dot\"\n | \"hexagon\"\n | \"hexagon-open\"\n | \"hexagon-dot\"\n | \"hexagon-open-dot\"\n | \"hexagon2\"\n | \"hexagon2-open\"\n | \"hexagon2-dot\"\n | \"hexagon2-open-dot\"\n | \"octagon\"\n | \"octagon-open\"\n | \"octagon-dot\"\n | \"octagon-open-dot\"\n | \"star\"\n | \"star-open\"\n | \"star-dot\"\n | \"star-open-dot\"\n | \"hexagram\"\n | \"hexagram-open\"\n | \"hexagram-dot\"\n | \"hexagram-open-dot\"\n | \"star-triangle-up\"\n | \"star-triangle-up-open\"\n | \"star-triangle-up-dot\"\n | \"star-triangle-up-open-dot\"\n | \"star-triangle-down\"\n | \"star-triangle-down-open\"\n | \"star-triangle-down-dot\"\n | \"star-triangle-down-open-dot\"\n | \"star-square\"\n | \"star-square-open\"\n | \"star-square-dot\"\n | \"star-square-open-dot\"\n | \"star-diamond\"\n | \"star-diamond-open\"\n | \"star-diamond-dot\"\n | \"star-diamond-open-dot\"\n | \"diamond-tall\"\n | \"diamond-tall-open\"\n | \"diamond-tall-dot\"\n | \"diamond-tall-open-dot\"\n | \"diamond-wide\"\n | \"diamond-wide-open\"\n | \"diamond-wide-dot\"\n | \"diamond-wide-open-dot\"\n | \"hourglass\"\n | \"hourglass-open\"\n | \"bowtie\"\n | \"bowtie-open\"\n | \"circle-cross\"\n | \"circle-cross-open\"\n | \"circle-x\"\n | \"circle-x-open\"\n | \"square-cross\"\n | \"square-cross-open\"\n | \"square-x\"\n | \"square-x-open\"\n | \"diamond-cross\"\n | \"diamond-cross-open\"\n | \"diamond-x\"\n | \"diamond-x-open\"\n | \"cross-thin\"\n | \"cross-thin-open\"\n | \"x-thin\"\n | \"x-thin-open\"\n | \"asterisk\"\n | \"asterisk-open\"\n | \"hash\"\n | \"hash-open\"\n | \"hash-dot\"\n | \"hash-open-dot\"\n | \"y-up\"\n | \"y-up-open\"\n | \"y-down\"\n | \"y-down-open\"\n | \"y-left\"\n | \"y-left-open\"\n | \"y-right\"\n | \"y-right-open\"\n | \"line-ew\"\n | \"line-ew-open\"\n | \"line-ns\"\n | \"line-ns-open\"\n | \"line-ne\"\n | \"line-ne-open\"\n | \"line-nw\"\n | \"line-nw-open\"\n | \"arrow\"\n | \"arrow-open\"\n | \"arrow-wide\"\n | \"arrow-wide-open\";\n\ninterface LineDataSeries {\n x: number[];\n y: number[];\n name: string;\n /** Optional color override (auto-assigned from CHART_COLORS if not provided) */\n color?: string;\n symbol?: MarkerSymbol;\n error_y?: {\n type: \"data\";\n array: number[];\n visible: boolean;\n };\n}\n\ntype LineGraphVariant = \"lines\" | \"lines+markers\" | \"lines+markers+error_bars\";\n\n/** Top margin reserving room for the 32px title; reduced when no title is set */\nconst TITLE_MARGIN_TOP = 60;\nconst NO_TITLE_MARGIN_TOP = 30;\n\ntype LineGraphProps = {\n dataSeries: LineDataSeries[];\n /**\n * Fixed width in pixels. When omitted, the chart fills its container and\n * tracks the container's width via a `ResizeObserver`.\n */\n width?: number;\n /**\n * Fixed height in pixels. When omitted, the chart fills its container and\n * tracks the container's height via a `ResizeObserver`.\n */\n height?: number;\n xRange?: [number, number];\n yRange?: [number, number];\n variant?: LineGraphVariant;\n xTitle?: string;\n yTitle?: string;\n title?: string;\n /**\n * Categorical labels for the x-axis ticks. When provided, the x data values\n * still drive line positioning but the displayed tick labels match these\n * strings in order (e.g. [\"Mon\", \"Tue\", …]). Should align 1:1 with the\n * unique, ordered x values across all series.\n */\n xTickText?: string[];\n};\n\nconst LineGraph: React.FC<LineGraphProps> = ({\n dataSeries,\n width,\n height,\n xRange,\n yRange,\n variant = \"lines\",\n xTitle,\n yTitle,\n title,\n xTickText,\n}) => {\n const plotRef = useRef<HTMLDivElement>(null);\n const theme = usePlotlyTheme();\n const { bindTooltip, tooltipElement } = useChartTooltip({ xLabel: xTitle, yLabel: yTitle });\n\n // Omitted width/height → fill the container and track its measured size;\n // explicit pixel values override. See AreaGraph for the reference pattern.\n const [containerRef, measured] = useElementSize<HTMLDivElement>();\n const resolvedWidth = width ?? measured.width;\n const resolvedHeight = height ?? measured.height;\n const hasSize = resolvedWidth > 0 && resolvedHeight > 0;\n // Fill is per-dimension: omit width to fill the container width, omit height\n // to fill its height (so e.g. a fixed width with a container-driven height works).\n const fillWidth = width === undefined;\n const fillHeight = height === undefined;\n const sizeRef = useRef({ width: resolvedWidth, height: resolvedHeight });\n sizeRef.current = { width: resolvedWidth, height: resolvedHeight };\n const plotInitedRef = useRef(false);\n // Size last applied to the plot, so the resize effect can skip a redundant\n // relayout right after newPlot already drew at that size.\n const appliedSizeRef = useRef({ width: 0, height: 0 });\n\n const { yMin, yMax } = useMemo(() => {\n let minX = Number.MAX_VALUE;\n let maxX = Number.MIN_VALUE;\n let minY = Number.MAX_VALUE;\n let maxY = Number.MIN_VALUE;\n\n dataSeries.forEach((series) => {\n series.x.forEach((x) => {\n minX = Math.min(minX, x);\n maxX = Math.max(maxX, x);\n });\n series.y.forEach((y) => {\n minY = Math.min(minY, y);\n maxY = Math.max(maxY, y);\n });\n });\n\n const xPadding = (maxX - minX) * 0.1;\n const yPadding = (maxY - minY) * 0.1;\n\n return {\n xMin: minX - xPadding,\n xMax: maxX + xPadding,\n yMin: minY - yPadding,\n yMax: maxY + yPadding,\n };\n }, [dataSeries]);\n\n const effectiveYRange = useMemo(\n () => yRange || [yMin, yMax],\n [yRange, yMin, yMax],\n );\n\n const yTicks = useMemo(() => {\n const range = effectiveYRange[1] - effectiveYRange[0];\n let step = Math.pow(10, Math.floor(Math.log10(range)));\n\n if (range / step > 10) step = step * 2;\n if (range / step < 4) step = step / 2;\n\n const ticks = [];\n let current = Math.ceil(effectiveYRange[0] / step) * step;\n while (current <= effectiveYRange[1]) {\n ticks.push(current);\n current += step;\n }\n return ticks;\n }, [effectiveYRange]);\n\n const xTicks = useMemo(\n () => [...new Set(dataSeries.flatMap((s) => s.x))].sort((a, b) => a - b),\n [dataSeries],\n );\n\n // Only apply categorical labels when they align 1:1 with the tick positions;\n // a mismatch would silently mis-label ticks, so fall back to numeric ticks.\n const useCategoricalX = !!xTickText && xTickText.length === xTicks.length;\n\n const mode = useMemo((): \"lines\" | \"lines+markers\" => {\n switch (variant) {\n case \"lines+markers\":\n case \"lines+markers+error_bars\":\n return \"lines+markers\";\n default:\n return \"lines\";\n }\n }, [variant]);\n\n const tickOptions = useMemo(\n () => ({\n tickcolor: theme.tickColor,\n ticklen: 12,\n tickwidth: 1,\n ticks: \"outside\" as const,\n tickfont: {\n size: 16,\n color: theme.textColor,\n family: \"Inter, sans-serif\",\n weight: 400,\n },\n linecolor: theme.lineColor,\n linewidth: 1,\n position: 0,\n zeroline: false,\n }),\n [theme],\n );\n\n useEffect(() => {\n if (!plotRef.current || !hasSize) return;\n\n const plotData = dataSeries.map((series, index) => {\n const color = seriesColor(index, series.color);\n return {\n x: series.x,\n y: series.y,\n type: \"scatter\" as const,\n mode: mode,\n name: series.name,\n hoverinfo: \"none\" as const,\n line: {\n color,\n width: 1.5,\n },\n marker:\n variant === \"lines\"\n ? { opacity: 0 }\n : {\n color,\n size: 8,\n symbol: series.symbol || \"triangle-up\",\n },\n error_y:\n variant === \"lines+markers+error_bars\"\n ? series.error_y || {\n type: \"data\" as const,\n array: series.y.map(() => 10),\n visible: true,\n color,\n thickness: 1,\n width: 5,\n }\n : undefined,\n };\n });\n\n const layout = {\n ...(title\n ? {\n title: {\n text: title,\n font: {\n size: 32,\n family: \"Inter, sans-serif\",\n color: theme.textColor,\n },\n },\n }\n : {}),\n width: sizeRef.current.width,\n height: sizeRef.current.height,\n margin: {\n l: 80,\n r: 30,\n // Reserve room for tick labels, the x-axis title, and the\n // container-anchored bottom legend stacked beneath them.\n b: 96,\n t: title ? TITLE_MARGIN_TOP : NO_TITLE_MARGIN_TOP,\n pad: 10,\n },\n paper_bgcolor: theme.paperBg,\n plot_bgcolor: theme.plotBg,\n font: {\n family: \"Inter, sans-serif\",\n },\n dragmode: false as const,\n xaxis: {\n title: {\n text: xTitle,\n font: {\n size: 16,\n color: theme.textSecondary,\n family: \"Inter, sans-serif\",\n weight: 400,\n },\n standoff: 32,\n },\n gridcolor: theme.gridColor,\n range: xRange,\n autorange: !xRange,\n tickmode: \"array\" as const,\n tickvals: xTicks,\n ticktext: useCategoricalX ? xTickText : xTicks.map(String),\n showgrid: true,\n // Reserve space for tick labels + the axis title so the bottom legend\n // can't overlap them at small sizes (SW-2157).\n automargin: true,\n ...tickOptions,\n },\n yaxis: {\n title: {\n text: yTitle,\n font: {\n size: 16,\n color: theme.textSecondary,\n family: \"Inter, sans-serif\",\n weight: 400,\n },\n standoff: 30,\n },\n gridcolor: theme.gridColor,\n range: yRange,\n autorange: !yRange,\n tickmode: \"array\" as const,\n tickvals: yTicks,\n showgrid: true,\n automargin: true,\n ...tickOptions,\n },\n legend: {\n // Anchor to the bottom of the container (not the plot area) so the\n // legend always clears the x-axis tick labels + title — a paper-relative\n // fractional offset collapses into the ticks at small heights (SW-2157).\n x: 0.5,\n y: 0,\n xanchor: \"center\" as const,\n yanchor: \"bottom\" as const,\n yref: \"container\" as const,\n orientation: \"h\" as const,\n font: {\n size: 16,\n color: theme.legendColor,\n family: \"Inter, sans-serif\",\n weight: 500,\n },\n },\n showlegend: true,\n };\n\n const config = {\n // Sizing is driven from the measured container; disable Plotly's own\n // window-resize responsiveness (it can't see container resizes).\n responsive: false,\n displayModeBar: false,\n displaylogo: false,\n };\n\n Plotly.newPlot(plotRef.current, plotData, layout, config);\n bindTooltip(plotRef.current);\n\n // Capture ref value for cleanup\n const plotElement = plotRef.current;\n plotInitedRef.current = true;\n appliedSizeRef.current = { ...sizeRef.current };\n\n return () => {\n if (plotElement) {\n Plotly.purge(plotElement);\n plotInitedRef.current = false;\n }\n };\n }, [dataSeries, hasSize, xRange, yRange, xTitle, yTitle, title, mode, tickOptions, xTicks, yTicks, useCategoricalX, xTickText, effectiveYRange, variant, theme, bindTooltip]);\n\n // Resize in place when the measured/overridden size changes — cheaper than\n // recreating the plot, and it preserves tooltip/event bindings.\n useEffect(() => {\n const plotElement = plotRef.current;\n if (!plotElement || !plotInitedRef.current || resolvedWidth <= 0 || resolvedHeight <= 0) {\n return;\n }\n // newPlot already drew at the current size; skip the redundant relayout\n // (it would queue an automargin redraw that can reject if we unmount first).\n if (\n appliedSizeRef.current.width === resolvedWidth &&\n appliedSizeRef.current.height === resolvedHeight\n ) {\n return;\n }\n appliedSizeRef.current = { width: resolvedWidth, height: resolvedHeight };\n // Swallow rejections from a relayout that races an unmount/purge.\n void Plotly.relayout(plotElement, { width: resolvedWidth, height: resolvedHeight }).catch(\n () => {},\n );\n }, [resolvedWidth, resolvedHeight]);\n\n return (\n <div ref={containerRef} className={cn(\"relative\", fillWidth && \"w-full\", fillHeight && \"h-full\")}>\n <div ref={plotRef} style={{ width: \"100%\", height: \"100%\" }} />\n {tooltipElement}\n </div>\n );\n};\n\nexport { LineGraph };\nexport type { LineDataSeries, LineGraphVariant, LineGraphProps, MarkerSymbol };\n"],"names":["TITLE_MARGIN_TOP","NO_TITLE_MARGIN_TOP","LineGraph","dataSeries","width","height","xRange","yRange","variant","xTitle","yTitle","title","xTickText","plotRef","useRef","theme","usePlotlyTheme","bindTooltip","tooltipElement","useChartTooltip","containerRef","measured","useElementSize","resolvedWidth","resolvedHeight","hasSize","fillWidth","fillHeight","sizeRef","plotInitedRef","appliedSizeRef","yMin","yMax","useMemo","minX","maxX","minY","maxY","series","x","y","xPadding","yPadding","effectiveYRange","yTicks","range","step","ticks","current","xTicks","s","a","b","useCategoricalX","mode","tickOptions","useEffect","plotData","index","color","seriesColor","layout","config","Plotly","plotElement","jsxs","cn","jsx"],"mappings":"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"}
@@ -1,2 +0,0 @@
1
- "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const j=require("react/jsx-runtime"),g=require("plotly.js-dist"),s=require("react"),Y=require("../ChartTooltip/ChartTooltip.cjs"),G=require("../../../hooks/use-element-size.cjs"),H=require("../../../hooks/use-plotly-theme.cjs"),O=require("../../../lib/utils.cjs"),W=require("../../../utils/colors.cjs"),D=({dataSeries:x,width:C,height:I,xRange:d,yRange:m,xTitle:v,yTitle:k,title:S="Scatter Plot"})=>{const u=s.useRef(null),r=H.usePlotlyTheme(),{bindTooltip:q,tooltipElement:T}=Y.useChartTooltip({xLabel:v,yLabel:k}),[U,P]=G.useElementSize(),c=C??P.width,a=I??P.height,_=c>0&&a>0,V=C===void 0,B=I===void 0,M=s.useRef({width:c,height:a});M.current={width:c,height:a};const b=s.useRef(!1),w=s.useRef({width:0,height:0}),{xMin:L,xMax:N,yMin:A,yMax:R}=s.useMemo(()=>{let o=Number.MAX_VALUE,e=Number.MIN_VALUE,n=Number.MAX_VALUE,t=Number.MIN_VALUE;x.forEach(l=>{l.x.forEach(i=>{o=Math.min(o,i),e=Math.max(e,i)}),l.y.forEach(i=>{n=Math.min(n,i),t=Math.max(t,i)})});const p=(e-o)*.1,y=(t-n)*.1;return{xMin:o-p,xMax:e+p,yMin:n-y,yMax:t+y}},[x]),h=s.useMemo(()=>d||[L,N],[d,L,N]),f=s.useMemo(()=>m||[A,R],[m,A,R]),E=s.useMemo(()=>{const o=h[1]-h[0];let e=Math.pow(10,Math.floor(Math.log10(o)));o/e>10&&(e=e*2),o/e<4&&(e=e/2);const n=[];let t=Math.ceil(h[0]/e)*e;for(;t<=h[1];)n.push(t),t+=e;return n},[h]),X=s.useMemo(()=>{const o=f[1]-f[0];let e=Math.pow(10,Math.floor(Math.log10(o)));o/e>10&&(e=e*2),o/e<4&&(e=e/2);const n=[];let t=Math.ceil(f[0]/e)*e;for(;t<=f[1];)n.push(t),t+=e;return n},[f]),z=s.useMemo(()=>({tickcolor:r.tickColor,ticklen:12,tickwidth:1,ticks:"outside",tickfont:{size:16,color:r.textColor,family:"Inter, sans-serif",weight:400},linecolor:r.lineColor,linewidth:1,position:0,zeroline:!1}),[r]);return s.useEffect(()=>{if(!u.current||!_)return;const o=x.map((l,i)=>({x:l.x,y:l.y,type:"scatter",mode:"markers",name:l.name,marker:{color:W.seriesColor(i,l.color),size:10,symbol:"circle"},hoverinfo:"none"})),e={title:{text:S,font:{size:32,family:"Inter, sans-serif",color:r.textColor}},width:M.current.width,height:M.current.height,margin:{l:80,r:30,b:96,t:60,pad:10},paper_bgcolor:r.paperBg,plot_bgcolor:r.plotBg,font:{family:"Inter, sans-serif"},dragmode:!1,xaxis:{title:{text:v,font:{size:16,color:r.textSecondary,family:"Inter, sans-serif",weight:400},standoff:32},gridcolor:r.gridColor,range:d,autorange:!d,tickmode:"array",tickvals:E,ticktext:E.map(String),showgrid:!0,automargin:!0,...z},yaxis:{title:{text:k,font:{size:16,color:r.textSecondary,family:"Inter, sans-serif",weight:400},standoff:30},gridcolor:r.gridColor,range:m,autorange:!m,tickmode:"array",tickvals:X,showgrid:!0,automargin:!0,...z},legend:{x:.5,y:0,xanchor:"center",yanchor:"bottom",yref:"container",orientation:"h",font:{size:16,color:r.legendColor,family:"Inter, sans-serif",weight:500}},showlegend:!0,hovermode:"closest"},n={responsive:!1,displayModeBar:!1,displaylogo:!1};g.newPlot(u.current,o,e,n),q(u.current);const t=u.current;b.current=!0,w.current={...M.current};const p=t,y={color:r.spikeColor,width:2};return p.on("plotly_hover",l=>{const i=l.points[0];i&&g.relayout(t,{shapes:[{type:"line",xref:"x",yref:"paper",x0:i.x,x1:i.x,y0:0,y1:1,line:y,layer:"below"},{type:"line",xref:"paper",yref:"y",x0:0,x1:1,y0:i.y,y1:i.y,line:y,layer:"below"}]})}),p.on("plotly_unhover",()=>{g.relayout(t,{shapes:[]})}),()=>{t&&(g.purge(t),b.current=!1)}},[x,_,d,m,v,k,S,h,f,E,X,z,r,q]),s.useEffect(()=>{const o=u.current;!o||!b.current||c<=0||a<=0||w.current.width===c&&w.current.height===a||(w.current={width:c,height:a},g.relayout(o,{width:c,height:a}).catch(()=>{}))},[c,a]),j.jsxs("div",{ref:U,className:O.cn("relative",V&&"w-full",B&&"h-full"),children:[j.jsx("div",{ref:u,style:{width:"100%",height:"100%"}}),T]})};exports.ScatterGraph=D;
2
- //# sourceMappingURL=ScatterGraph.cjs.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"ScatterGraph.cjs","sources":["../../../../src/components/charts/ScatterGraph/ScatterGraph.tsx"],"sourcesContent":["import Plotly from \"plotly.js-dist\";\nimport React, { useEffect, useRef, useMemo } from \"react\";\n\nimport { useChartTooltip } from \"../ChartTooltip\";\n\nimport { useElementSize } from \"@/hooks/use-element-size\";\nimport { usePlotlyTheme } from \"@/hooks/use-plotly-theme\";\nimport { cn } from \"@/lib/utils\";\nimport { seriesColor } from \"@/utils/colors\";\n\ninterface ScatterDataPoint {\n x: number;\n y: number;\n additionalInfo?: Record<string, string | number>;\n}\n\ninterface ScatterDataSeries {\n x: number[];\n y: number[];\n name: string;\n /** Optional color override (auto-assigned from CHART_COLORS if not provided) */\n color?: string;\n}\n\ninterface ScatterGraphProps {\n dataSeries: ScatterDataSeries[];\n /**\n * Fixed width in pixels. When omitted, the chart fills its container and\n * tracks the container's width via a `ResizeObserver`.\n */\n width?: number;\n /**\n * Fixed height in pixels. When omitted, the chart fills its container and\n * tracks the container's height via a `ResizeObserver`.\n */\n height?: number;\n xRange?: [number, number];\n yRange?: [number, number];\n xTitle?: string;\n yTitle?: string;\n title?: string;\n}\n\nconst ScatterGraph: React.FC<ScatterGraphProps> = ({\n dataSeries,\n width,\n height,\n xRange,\n yRange,\n xTitle,\n yTitle,\n title = \"Scatter Plot\",\n}) => {\n const plotRef = useRef<HTMLDivElement>(null);\n const theme = usePlotlyTheme();\n const { bindTooltip, tooltipElement } = useChartTooltip({ xLabel: xTitle, yLabel: yTitle });\n\n // Omitted width/height → fill the container and track its measured size;\n // explicit pixel values override. See AreaGraph for the reference pattern.\n const [containerRef, measured] = useElementSize<HTMLDivElement>();\n const resolvedWidth = width ?? measured.width;\n const resolvedHeight = height ?? measured.height;\n const hasSize = resolvedWidth > 0 && resolvedHeight > 0;\n // Fill is per-dimension: omit width to fill the container width, omit height\n // to fill its height (so e.g. a fixed width with a container-driven height works).\n const fillWidth = width === undefined;\n const fillHeight = height === undefined;\n const sizeRef = useRef({ width: resolvedWidth, height: resolvedHeight });\n sizeRef.current = { width: resolvedWidth, height: resolvedHeight };\n const plotInitedRef = useRef(false);\n // Size last applied to the plot, so the resize effect can skip a redundant\n // relayout right after newPlot already drew at that size.\n const appliedSizeRef = useRef({ width: 0, height: 0 });\n\n const { xMin, xMax, yMin, yMax } = useMemo(() => {\n let minX = Number.MAX_VALUE;\n let maxX = Number.MIN_VALUE;\n let minY = Number.MAX_VALUE;\n let maxY = Number.MIN_VALUE;\n\n dataSeries.forEach((series) => {\n series.x.forEach((x) => {\n minX = Math.min(minX, x);\n maxX = Math.max(maxX, x);\n });\n series.y.forEach((y) => {\n minY = Math.min(minY, y);\n maxY = Math.max(maxY, y);\n });\n });\n\n const xPadding = (maxX - minX) * 0.1;\n const yPadding = (maxY - minY) * 0.1;\n\n return {\n xMin: minX - xPadding,\n xMax: maxX + xPadding,\n yMin: minY - yPadding,\n yMax: maxY + yPadding,\n };\n }, [dataSeries]);\n\n const effectiveXRange = useMemo(\n () => xRange || [xMin, xMax],\n [xRange, xMin, xMax],\n );\n\n const effectiveYRange = useMemo(\n () => yRange || [yMin, yMax],\n [yRange, yMin, yMax],\n );\n\n const xTicks = useMemo(() => {\n const range = effectiveXRange[1] - effectiveXRange[0];\n let step = Math.pow(10, Math.floor(Math.log10(range)));\n\n if (range / step > 10) step = step * 2;\n if (range / step < 4) step = step / 2;\n\n const ticks = [];\n let current = Math.ceil(effectiveXRange[0] / step) * step;\n while (current <= effectiveXRange[1]) {\n ticks.push(current);\n current += step;\n }\n return ticks;\n }, [effectiveXRange]);\n\n const yTicks = useMemo(() => {\n const range = effectiveYRange[1] - effectiveYRange[0];\n let step = Math.pow(10, Math.floor(Math.log10(range)));\n\n if (range / step > 10) step = step * 2;\n if (range / step < 4) step = step / 2;\n\n const ticks = [];\n let current = Math.ceil(effectiveYRange[0] / step) * step;\n while (current <= effectiveYRange[1]) {\n ticks.push(current);\n current += step;\n }\n return ticks;\n }, [effectiveYRange]);\n\n const tickOptions = useMemo(\n () => ({\n tickcolor: theme.tickColor,\n ticklen: 12,\n tickwidth: 1,\n ticks: \"outside\" as const,\n tickfont: {\n size: 16,\n color: theme.textColor,\n family: \"Inter, sans-serif\",\n weight: 400,\n },\n linecolor: theme.lineColor,\n linewidth: 1,\n position: 0,\n zeroline: false,\n }),\n [theme],\n );\n\n useEffect(() => {\n if (!plotRef.current || !hasSize) return;\n\n const plotData = dataSeries.map((series, index) => ({\n x: series.x,\n y: series.y,\n type: \"scatter\" as const,\n mode: \"markers\" as const,\n name: series.name,\n marker: {\n color: seriesColor(index, series.color),\n size: 10,\n symbol: \"circle\" as const,\n },\n hoverinfo: \"none\" as const,\n }));\n\n const layout = {\n title: {\n text: title,\n font: {\n size: 32,\n family: \"Inter, sans-serif\",\n color: theme.textColor,\n },\n },\n width: sizeRef.current.width,\n height: sizeRef.current.height,\n // Bottom margin reserves room for tick labels, the x-axis title, and the\n // container-anchored bottom legend stacked beneath them.\n margin: { l: 80, r: 30, b: 96, t: 60, pad: 10 },\n paper_bgcolor: theme.paperBg,\n plot_bgcolor: theme.plotBg,\n font: {\n family: \"Inter, sans-serif\",\n },\n dragmode: false as const,\n xaxis: {\n title: {\n text: xTitle,\n font: {\n size: 16,\n color: theme.textSecondary,\n family: \"Inter, sans-serif\",\n weight: 400,\n },\n standoff: 32,\n },\n gridcolor: theme.gridColor,\n range: xRange,\n autorange: !xRange,\n tickmode: \"array\" as const,\n tickvals: xTicks,\n ticktext: xTicks.map(String),\n showgrid: true,\n // Reserve space for tick labels + the axis title so the bottom legend\n // can't overlap them at small sizes (SW-2157).\n automargin: true,\n ...tickOptions,\n },\n yaxis: {\n title: {\n text: yTitle,\n font: {\n size: 16,\n color: theme.textSecondary,\n family: \"Inter, sans-serif\",\n weight: 400,\n },\n standoff: 30,\n },\n gridcolor: theme.gridColor,\n range: yRange,\n autorange: !yRange,\n tickmode: \"array\" as const,\n tickvals: yTicks,\n showgrid: true,\n automargin: true,\n ...tickOptions,\n },\n legend: {\n // Anchor to the bottom of the container (not the plot area) so the\n // legend always clears the x-axis tick labels + title — a paper-relative\n // fractional offset collapses into the ticks at small heights (SW-2157).\n x: 0.5,\n y: 0,\n xanchor: \"center\" as const,\n yanchor: \"bottom\" as const,\n yref: \"container\" as const,\n orientation: \"h\" as const,\n font: {\n size: 16,\n color: theme.legendColor,\n family: \"Inter, sans-serif\",\n weight: 500,\n },\n },\n showlegend: true,\n hovermode: \"closest\" as const,\n };\n\n const config = {\n // Sizing is driven from the measured container; disable Plotly's own\n // window-resize responsiveness (it can't see container resizes).\n responsive: false,\n displayModeBar: false,\n displaylogo: false,\n };\n\n Plotly.newPlot(plotRef.current, plotData, layout, config);\n bindTooltip(plotRef.current);\n\n // Capture ref value for cleanup\n const plotElement = plotRef.current;\n plotInitedRef.current = true;\n appliedSizeRef.current = { ...sizeRef.current };\n\n // Crosshair guide lines through the hovered point. Drawn as layout shapes\n // with `layer: \"below\"` so they sit behind the markers — native Plotly\n // spikelines always render on top and can't be moved behind.\n const emitter = plotElement as unknown as Plotly.PlotlyHTMLElement;\n const crosshairLine = { color: theme.spikeColor, width: 2 };\n emitter.on(\"plotly_hover\", (eventData) => {\n const point = eventData.points[0];\n if (!point) return;\n void Plotly.relayout(plotElement, {\n shapes: [\n {\n type: \"line\",\n xref: \"x\",\n yref: \"paper\",\n x0: point.x,\n x1: point.x,\n y0: 0,\n y1: 1,\n line: crosshairLine,\n layer: \"below\",\n },\n {\n type: \"line\",\n xref: \"paper\",\n yref: \"y\",\n x0: 0,\n x1: 1,\n y0: point.y,\n y1: point.y,\n line: crosshairLine,\n layer: \"below\",\n },\n ],\n });\n });\n emitter.on(\"plotly_unhover\", () => {\n void Plotly.relayout(plotElement, { shapes: [] });\n });\n\n return () => {\n if (plotElement) {\n Plotly.purge(plotElement);\n plotInitedRef.current = false;\n }\n };\n }, [dataSeries, hasSize, xRange, yRange, xTitle, yTitle, title, effectiveXRange, effectiveYRange, xTicks, yTicks, tickOptions, theme, bindTooltip]);\n\n // Resize in place when the measured/overridden size changes — cheaper than\n // recreating the plot, and it preserves the hover/crosshair event bindings.\n useEffect(() => {\n const plotElement = plotRef.current;\n if (!plotElement || !plotInitedRef.current || resolvedWidth <= 0 || resolvedHeight <= 0) {\n return;\n }\n // newPlot already drew at the current size; skip the redundant relayout\n // (it would queue an automargin redraw that can reject if we unmount first).\n if (\n appliedSizeRef.current.width === resolvedWidth &&\n appliedSizeRef.current.height === resolvedHeight\n ) {\n return;\n }\n appliedSizeRef.current = { width: resolvedWidth, height: resolvedHeight };\n // Swallow rejections from a relayout that races an unmount/purge.\n void Plotly.relayout(plotElement, { width: resolvedWidth, height: resolvedHeight }).catch(\n () => {},\n );\n }, [resolvedWidth, resolvedHeight]);\n\n return (\n <div ref={containerRef} className={cn(\"relative\", fillWidth && \"w-full\", fillHeight && \"h-full\")}>\n <div ref={plotRef} style={{ width: \"100%\", height: \"100%\" }} />\n {tooltipElement}\n </div>\n );\n};\n\nexport { ScatterGraph };\nexport type { ScatterDataPoint, ScatterDataSeries, ScatterGraphProps };\n"],"names":["ScatterGraph","dataSeries","width","height","xRange","yRange","xTitle","yTitle","title","plotRef","useRef","theme","usePlotlyTheme","bindTooltip","tooltipElement","useChartTooltip","containerRef","measured","useElementSize","resolvedWidth","resolvedHeight","hasSize","fillWidth","fillHeight","sizeRef","plotInitedRef","appliedSizeRef","xMin","xMax","yMin","yMax","useMemo","minX","maxX","minY","maxY","series","x","y","xPadding","yPadding","effectiveXRange","effectiveYRange","xTicks","range","step","ticks","current","yTicks","tickOptions","useEffect","plotData","index","seriesColor","layout","config","Plotly","plotElement","emitter","crosshairLine","eventData","point","jsxs","cn","jsx"],"mappings":"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"}
@@ -1,234 +0,0 @@
1
- import { jsxs as G, jsx as O } from "react/jsx-runtime";
2
- import g from "plotly.js-dist";
3
- import { useRef as k, useMemo as m, useEffect as Y } from "react";
4
- import { useChartTooltip as T } from "../ChartTooltip/ChartTooltip.js";
5
- import { useElementSize as q } from "../../../hooks/use-element-size.js";
6
- import { usePlotlyTheme as F } from "../../../hooks/use-plotly-theme.js";
7
- import { cn as J } from "../../../lib/utils.js";
8
- import { seriesColor as K } from "../../../utils/colors.js";
9
- const it = ({
10
- dataSeries: x,
11
- width: I,
12
- height: _,
13
- xRange: u,
14
- yRange: p,
15
- xTitle: v,
16
- yTitle: b,
17
- title: L = "Scatter Plot"
18
- }) => {
19
- const a = k(null), r = F(), { bindTooltip: N, tooltipElement: j } = T({ xLabel: v, yLabel: b }), [H, A] = q(), s = I ?? A.width, c = _ ?? A.height, P = s > 0 && c > 0, W = I === void 0, D = _ === void 0, w = k({ width: s, height: c });
20
- w.current = { width: s, height: c };
21
- const E = k(!1), M = k({ width: 0, height: 0 }), { xMin: S, xMax: X, yMin: U, yMax: V } = m(() => {
22
- let o = Number.MAX_VALUE, t = Number.MIN_VALUE, n = Number.MAX_VALUE, e = Number.MIN_VALUE;
23
- x.forEach((l) => {
24
- l.x.forEach((i) => {
25
- o = Math.min(o, i), t = Math.max(t, i);
26
- }), l.y.forEach((i) => {
27
- n = Math.min(n, i), e = Math.max(e, i);
28
- });
29
- });
30
- const d = (t - o) * 0.1, y = (e - n) * 0.1;
31
- return {
32
- xMin: o - d,
33
- xMax: t + d,
34
- yMin: n - y,
35
- yMax: e + y
36
- };
37
- }, [x]), h = m(
38
- () => u || [S, X],
39
- [u, S, X]
40
- ), f = m(
41
- () => p || [U, V],
42
- [p, U, V]
43
- ), z = m(() => {
44
- const o = h[1] - h[0];
45
- let t = Math.pow(10, Math.floor(Math.log10(o)));
46
- o / t > 10 && (t = t * 2), o / t < 4 && (t = t / 2);
47
- const n = [];
48
- let e = Math.ceil(h[0] / t) * t;
49
- for (; e <= h[1]; )
50
- n.push(e), e += t;
51
- return n;
52
- }, [h]), B = m(() => {
53
- const o = f[1] - f[0];
54
- let t = Math.pow(10, Math.floor(Math.log10(o)));
55
- o / t > 10 && (t = t * 2), o / t < 4 && (t = t / 2);
56
- const n = [];
57
- let e = Math.ceil(f[0] / t) * t;
58
- for (; e <= f[1]; )
59
- n.push(e), e += t;
60
- return n;
61
- }, [f]), C = m(
62
- () => ({
63
- tickcolor: r.tickColor,
64
- ticklen: 12,
65
- tickwidth: 1,
66
- ticks: "outside",
67
- tickfont: {
68
- size: 16,
69
- color: r.textColor,
70
- family: "Inter, sans-serif",
71
- weight: 400
72
- },
73
- linecolor: r.lineColor,
74
- linewidth: 1,
75
- position: 0,
76
- zeroline: !1
77
- }),
78
- [r]
79
- );
80
- return Y(() => {
81
- if (!a.current || !P) return;
82
- const o = x.map((l, i) => ({
83
- x: l.x,
84
- y: l.y,
85
- type: "scatter",
86
- mode: "markers",
87
- name: l.name,
88
- marker: {
89
- color: K(i, l.color),
90
- size: 10,
91
- symbol: "circle"
92
- },
93
- hoverinfo: "none"
94
- })), t = {
95
- title: {
96
- text: L,
97
- font: {
98
- size: 32,
99
- family: "Inter, sans-serif",
100
- color: r.textColor
101
- }
102
- },
103
- width: w.current.width,
104
- height: w.current.height,
105
- // Bottom margin reserves room for tick labels, the x-axis title, and the
106
- // container-anchored bottom legend stacked beneath them.
107
- margin: { l: 80, r: 30, b: 96, t: 60, pad: 10 },
108
- paper_bgcolor: r.paperBg,
109
- plot_bgcolor: r.plotBg,
110
- font: {
111
- family: "Inter, sans-serif"
112
- },
113
- dragmode: !1,
114
- xaxis: {
115
- title: {
116
- text: v,
117
- font: {
118
- size: 16,
119
- color: r.textSecondary,
120
- family: "Inter, sans-serif",
121
- weight: 400
122
- },
123
- standoff: 32
124
- },
125
- gridcolor: r.gridColor,
126
- range: u,
127
- autorange: !u,
128
- tickmode: "array",
129
- tickvals: z,
130
- ticktext: z.map(String),
131
- showgrid: !0,
132
- // Reserve space for tick labels + the axis title so the bottom legend
133
- // can't overlap them at small sizes (SW-2157).
134
- automargin: !0,
135
- ...C
136
- },
137
- yaxis: {
138
- title: {
139
- text: b,
140
- font: {
141
- size: 16,
142
- color: r.textSecondary,
143
- family: "Inter, sans-serif",
144
- weight: 400
145
- },
146
- standoff: 30
147
- },
148
- gridcolor: r.gridColor,
149
- range: p,
150
- autorange: !p,
151
- tickmode: "array",
152
- tickvals: B,
153
- showgrid: !0,
154
- automargin: !0,
155
- ...C
156
- },
157
- legend: {
158
- // Anchor to the bottom of the container (not the plot area) so the
159
- // legend always clears the x-axis tick labels + title — a paper-relative
160
- // fractional offset collapses into the ticks at small heights (SW-2157).
161
- x: 0.5,
162
- y: 0,
163
- xanchor: "center",
164
- yanchor: "bottom",
165
- yref: "container",
166
- orientation: "h",
167
- font: {
168
- size: 16,
169
- color: r.legendColor,
170
- family: "Inter, sans-serif",
171
- weight: 500
172
- }
173
- },
174
- showlegend: !0,
175
- hovermode: "closest"
176
- }, n = {
177
- // Sizing is driven from the measured container; disable Plotly's own
178
- // window-resize responsiveness (it can't see container resizes).
179
- responsive: !1,
180
- displayModeBar: !1,
181
- displaylogo: !1
182
- };
183
- g.newPlot(a.current, o, t, n), N(a.current);
184
- const e = a.current;
185
- E.current = !0, M.current = { ...w.current };
186
- const d = e, y = { color: r.spikeColor, width: 2 };
187
- return d.on("plotly_hover", (l) => {
188
- const i = l.points[0];
189
- i && g.relayout(e, {
190
- shapes: [
191
- {
192
- type: "line",
193
- xref: "x",
194
- yref: "paper",
195
- x0: i.x,
196
- x1: i.x,
197
- y0: 0,
198
- y1: 1,
199
- line: y,
200
- layer: "below"
201
- },
202
- {
203
- type: "line",
204
- xref: "paper",
205
- yref: "y",
206
- x0: 0,
207
- x1: 1,
208
- y0: i.y,
209
- y1: i.y,
210
- line: y,
211
- layer: "below"
212
- }
213
- ]
214
- });
215
- }), d.on("plotly_unhover", () => {
216
- g.relayout(e, { shapes: [] });
217
- }), () => {
218
- e && (g.purge(e), E.current = !1);
219
- };
220
- }, [x, P, u, p, v, b, L, h, f, z, B, C, r, N]), Y(() => {
221
- const o = a.current;
222
- !o || !E.current || s <= 0 || c <= 0 || M.current.width === s && M.current.height === c || (M.current = { width: s, height: c }, g.relayout(o, { width: s, height: c }).catch(
223
- () => {
224
- }
225
- ));
226
- }, [s, c]), /* @__PURE__ */ G("div", { ref: H, className: J("relative", W && "w-full", D && "h-full"), children: [
227
- /* @__PURE__ */ O("div", { ref: a, style: { width: "100%", height: "100%" } }),
228
- j
229
- ] });
230
- };
231
- export {
232
- it as ScatterGraph
233
- };
234
- //# sourceMappingURL=ScatterGraph.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"ScatterGraph.js","sources":["../../../../src/components/charts/ScatterGraph/ScatterGraph.tsx"],"sourcesContent":["import Plotly from \"plotly.js-dist\";\nimport React, { useEffect, useRef, useMemo } from \"react\";\n\nimport { useChartTooltip } from \"../ChartTooltip\";\n\nimport { useElementSize } from \"@/hooks/use-element-size\";\nimport { usePlotlyTheme } from \"@/hooks/use-plotly-theme\";\nimport { cn } from \"@/lib/utils\";\nimport { seriesColor } from \"@/utils/colors\";\n\ninterface ScatterDataPoint {\n x: number;\n y: number;\n additionalInfo?: Record<string, string | number>;\n}\n\ninterface ScatterDataSeries {\n x: number[];\n y: number[];\n name: string;\n /** Optional color override (auto-assigned from CHART_COLORS if not provided) */\n color?: string;\n}\n\ninterface ScatterGraphProps {\n dataSeries: ScatterDataSeries[];\n /**\n * Fixed width in pixels. When omitted, the chart fills its container and\n * tracks the container's width via a `ResizeObserver`.\n */\n width?: number;\n /**\n * Fixed height in pixels. When omitted, the chart fills its container and\n * tracks the container's height via a `ResizeObserver`.\n */\n height?: number;\n xRange?: [number, number];\n yRange?: [number, number];\n xTitle?: string;\n yTitle?: string;\n title?: string;\n}\n\nconst ScatterGraph: React.FC<ScatterGraphProps> = ({\n dataSeries,\n width,\n height,\n xRange,\n yRange,\n xTitle,\n yTitle,\n title = \"Scatter Plot\",\n}) => {\n const plotRef = useRef<HTMLDivElement>(null);\n const theme = usePlotlyTheme();\n const { bindTooltip, tooltipElement } = useChartTooltip({ xLabel: xTitle, yLabel: yTitle });\n\n // Omitted width/height → fill the container and track its measured size;\n // explicit pixel values override. See AreaGraph for the reference pattern.\n const [containerRef, measured] = useElementSize<HTMLDivElement>();\n const resolvedWidth = width ?? measured.width;\n const resolvedHeight = height ?? measured.height;\n const hasSize = resolvedWidth > 0 && resolvedHeight > 0;\n // Fill is per-dimension: omit width to fill the container width, omit height\n // to fill its height (so e.g. a fixed width with a container-driven height works).\n const fillWidth = width === undefined;\n const fillHeight = height === undefined;\n const sizeRef = useRef({ width: resolvedWidth, height: resolvedHeight });\n sizeRef.current = { width: resolvedWidth, height: resolvedHeight };\n const plotInitedRef = useRef(false);\n // Size last applied to the plot, so the resize effect can skip a redundant\n // relayout right after newPlot already drew at that size.\n const appliedSizeRef = useRef({ width: 0, height: 0 });\n\n const { xMin, xMax, yMin, yMax } = useMemo(() => {\n let minX = Number.MAX_VALUE;\n let maxX = Number.MIN_VALUE;\n let minY = Number.MAX_VALUE;\n let maxY = Number.MIN_VALUE;\n\n dataSeries.forEach((series) => {\n series.x.forEach((x) => {\n minX = Math.min(minX, x);\n maxX = Math.max(maxX, x);\n });\n series.y.forEach((y) => {\n minY = Math.min(minY, y);\n maxY = Math.max(maxY, y);\n });\n });\n\n const xPadding = (maxX - minX) * 0.1;\n const yPadding = (maxY - minY) * 0.1;\n\n return {\n xMin: minX - xPadding,\n xMax: maxX + xPadding,\n yMin: minY - yPadding,\n yMax: maxY + yPadding,\n };\n }, [dataSeries]);\n\n const effectiveXRange = useMemo(\n () => xRange || [xMin, xMax],\n [xRange, xMin, xMax],\n );\n\n const effectiveYRange = useMemo(\n () => yRange || [yMin, yMax],\n [yRange, yMin, yMax],\n );\n\n const xTicks = useMemo(() => {\n const range = effectiveXRange[1] - effectiveXRange[0];\n let step = Math.pow(10, Math.floor(Math.log10(range)));\n\n if (range / step > 10) step = step * 2;\n if (range / step < 4) step = step / 2;\n\n const ticks = [];\n let current = Math.ceil(effectiveXRange[0] / step) * step;\n while (current <= effectiveXRange[1]) {\n ticks.push(current);\n current += step;\n }\n return ticks;\n }, [effectiveXRange]);\n\n const yTicks = useMemo(() => {\n const range = effectiveYRange[1] - effectiveYRange[0];\n let step = Math.pow(10, Math.floor(Math.log10(range)));\n\n if (range / step > 10) step = step * 2;\n if (range / step < 4) step = step / 2;\n\n const ticks = [];\n let current = Math.ceil(effectiveYRange[0] / step) * step;\n while (current <= effectiveYRange[1]) {\n ticks.push(current);\n current += step;\n }\n return ticks;\n }, [effectiveYRange]);\n\n const tickOptions = useMemo(\n () => ({\n tickcolor: theme.tickColor,\n ticklen: 12,\n tickwidth: 1,\n ticks: \"outside\" as const,\n tickfont: {\n size: 16,\n color: theme.textColor,\n family: \"Inter, sans-serif\",\n weight: 400,\n },\n linecolor: theme.lineColor,\n linewidth: 1,\n position: 0,\n zeroline: false,\n }),\n [theme],\n );\n\n useEffect(() => {\n if (!plotRef.current || !hasSize) return;\n\n const plotData = dataSeries.map((series, index) => ({\n x: series.x,\n y: series.y,\n type: \"scatter\" as const,\n mode: \"markers\" as const,\n name: series.name,\n marker: {\n color: seriesColor(index, series.color),\n size: 10,\n symbol: \"circle\" as const,\n },\n hoverinfo: \"none\" as const,\n }));\n\n const layout = {\n title: {\n text: title,\n font: {\n size: 32,\n family: \"Inter, sans-serif\",\n color: theme.textColor,\n },\n },\n width: sizeRef.current.width,\n height: sizeRef.current.height,\n // Bottom margin reserves room for tick labels, the x-axis title, and the\n // container-anchored bottom legend stacked beneath them.\n margin: { l: 80, r: 30, b: 96, t: 60, pad: 10 },\n paper_bgcolor: theme.paperBg,\n plot_bgcolor: theme.plotBg,\n font: {\n family: \"Inter, sans-serif\",\n },\n dragmode: false as const,\n xaxis: {\n title: {\n text: xTitle,\n font: {\n size: 16,\n color: theme.textSecondary,\n family: \"Inter, sans-serif\",\n weight: 400,\n },\n standoff: 32,\n },\n gridcolor: theme.gridColor,\n range: xRange,\n autorange: !xRange,\n tickmode: \"array\" as const,\n tickvals: xTicks,\n ticktext: xTicks.map(String),\n showgrid: true,\n // Reserve space for tick labels + the axis title so the bottom legend\n // can't overlap them at small sizes (SW-2157).\n automargin: true,\n ...tickOptions,\n },\n yaxis: {\n title: {\n text: yTitle,\n font: {\n size: 16,\n color: theme.textSecondary,\n family: \"Inter, sans-serif\",\n weight: 400,\n },\n standoff: 30,\n },\n gridcolor: theme.gridColor,\n range: yRange,\n autorange: !yRange,\n tickmode: \"array\" as const,\n tickvals: yTicks,\n showgrid: true,\n automargin: true,\n ...tickOptions,\n },\n legend: {\n // Anchor to the bottom of the container (not the plot area) so the\n // legend always clears the x-axis tick labels + title — a paper-relative\n // fractional offset collapses into the ticks at small heights (SW-2157).\n x: 0.5,\n y: 0,\n xanchor: \"center\" as const,\n yanchor: \"bottom\" as const,\n yref: \"container\" as const,\n orientation: \"h\" as const,\n font: {\n size: 16,\n color: theme.legendColor,\n family: \"Inter, sans-serif\",\n weight: 500,\n },\n },\n showlegend: true,\n hovermode: \"closest\" as const,\n };\n\n const config = {\n // Sizing is driven from the measured container; disable Plotly's own\n // window-resize responsiveness (it can't see container resizes).\n responsive: false,\n displayModeBar: false,\n displaylogo: false,\n };\n\n Plotly.newPlot(plotRef.current, plotData, layout, config);\n bindTooltip(plotRef.current);\n\n // Capture ref value for cleanup\n const plotElement = plotRef.current;\n plotInitedRef.current = true;\n appliedSizeRef.current = { ...sizeRef.current };\n\n // Crosshair guide lines through the hovered point. Drawn as layout shapes\n // with `layer: \"below\"` so they sit behind the markers — native Plotly\n // spikelines always render on top and can't be moved behind.\n const emitter = plotElement as unknown as Plotly.PlotlyHTMLElement;\n const crosshairLine = { color: theme.spikeColor, width: 2 };\n emitter.on(\"plotly_hover\", (eventData) => {\n const point = eventData.points[0];\n if (!point) return;\n void Plotly.relayout(plotElement, {\n shapes: [\n {\n type: \"line\",\n xref: \"x\",\n yref: \"paper\",\n x0: point.x,\n x1: point.x,\n y0: 0,\n y1: 1,\n line: crosshairLine,\n layer: \"below\",\n },\n {\n type: \"line\",\n xref: \"paper\",\n yref: \"y\",\n x0: 0,\n x1: 1,\n y0: point.y,\n y1: point.y,\n line: crosshairLine,\n layer: \"below\",\n },\n ],\n });\n });\n emitter.on(\"plotly_unhover\", () => {\n void Plotly.relayout(plotElement, { shapes: [] });\n });\n\n return () => {\n if (plotElement) {\n Plotly.purge(plotElement);\n plotInitedRef.current = false;\n }\n };\n }, [dataSeries, hasSize, xRange, yRange, xTitle, yTitle, title, effectiveXRange, effectiveYRange, xTicks, yTicks, tickOptions, theme, bindTooltip]);\n\n // Resize in place when the measured/overridden size changes — cheaper than\n // recreating the plot, and it preserves the hover/crosshair event bindings.\n useEffect(() => {\n const plotElement = plotRef.current;\n if (!plotElement || !plotInitedRef.current || resolvedWidth <= 0 || resolvedHeight <= 0) {\n return;\n }\n // newPlot already drew at the current size; skip the redundant relayout\n // (it would queue an automargin redraw that can reject if we unmount first).\n if (\n appliedSizeRef.current.width === resolvedWidth &&\n appliedSizeRef.current.height === resolvedHeight\n ) {\n return;\n }\n appliedSizeRef.current = { width: resolvedWidth, height: resolvedHeight };\n // Swallow rejections from a relayout that races an unmount/purge.\n void Plotly.relayout(plotElement, { width: resolvedWidth, height: resolvedHeight }).catch(\n () => {},\n );\n }, [resolvedWidth, resolvedHeight]);\n\n return (\n <div ref={containerRef} className={cn(\"relative\", fillWidth && \"w-full\", fillHeight && \"h-full\")}>\n <div ref={plotRef} style={{ width: \"100%\", height: \"100%\" }} />\n {tooltipElement}\n </div>\n );\n};\n\nexport { ScatterGraph };\nexport type { ScatterDataPoint, ScatterDataSeries, ScatterGraphProps };\n"],"names":["ScatterGraph","dataSeries","width","height","xRange","yRange","xTitle","yTitle","title","plotRef","useRef","theme","usePlotlyTheme","bindTooltip","tooltipElement","useChartTooltip","containerRef","measured","useElementSize","resolvedWidth","resolvedHeight","hasSize","fillWidth","fillHeight","sizeRef","plotInitedRef","appliedSizeRef","xMin","xMax","yMin","yMax","useMemo","minX","maxX","minY","maxY","series","x","y","xPadding","yPadding","effectiveXRange","effectiveYRange","xTicks","range","step","ticks","current","yTicks","tickOptions","useEffect","plotData","index","seriesColor","layout","config","Plotly","plotElement","emitter","crosshairLine","eventData","point","jsxs","cn","jsx"],"mappings":"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"}