@tetrascience-npm/tetrascience-react-ui 0.7.0-beta.108.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 (439) 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.map +1 -0
  79. package/dist/components/charts/Chromatogram/boundaryMarkers.js.map +1 -0
  80. package/dist/components/charts/Chromatogram/constants.cjs.map +1 -0
  81. package/dist/components/charts/Chromatogram/constants.js.map +1 -0
  82. package/dist/components/charts/Chromatogram/dataProcessing.cjs.map +1 -0
  83. package/dist/components/charts/Chromatogram/dataProcessing.js.map +1 -0
  84. package/dist/components/charts/Chromatogram/peakDetection.cjs.map +1 -0
  85. package/dist/components/charts/Chromatogram/peakDetection.js.map +1 -0
  86. package/dist/components/charts/Chromatogram/plotBuilder.cjs +2 -0
  87. package/dist/components/charts/Chromatogram/plotBuilder.cjs.map +1 -0
  88. package/dist/components/charts/Chromatogram/plotBuilder.js +216 -0
  89. package/dist/components/charts/Chromatogram/plotBuilder.js.map +1 -0
  90. package/dist/components/charts/Chromatogram/regionOverlays.cjs.map +1 -0
  91. package/dist/components/charts/Chromatogram/regionOverlays.js.map +1 -0
  92. package/dist/components/charts/Electropherogram/Electropherogram.cjs +2 -0
  93. package/dist/components/charts/Electropherogram/Electropherogram.cjs.map +1 -0
  94. package/dist/components/charts/Electropherogram/Electropherogram.js +180 -0
  95. package/dist/components/charts/Electropherogram/Electropherogram.js.map +1 -0
  96. package/dist/components/charts/Histogram/Histogram.cjs +1 -1
  97. package/dist/components/charts/Histogram/Histogram.cjs.map +1 -1
  98. package/dist/components/charts/Histogram/Histogram.js +107 -108
  99. package/dist/components/charts/Histogram/Histogram.js.map +1 -1
  100. package/dist/components/charts/LinePlot/LinePlot.cjs +2 -0
  101. package/dist/components/charts/LinePlot/LinePlot.cjs.map +1 -0
  102. package/dist/components/charts/LinePlot/LinePlot.js +224 -0
  103. package/dist/components/charts/LinePlot/LinePlot.js.map +1 -0
  104. package/dist/components/charts/PieChart/PieChart.cjs +1 -1
  105. package/dist/components/charts/PieChart/PieChart.cjs.map +1 -1
  106. package/dist/components/charts/PieChart/PieChart.js +62 -61
  107. package/dist/components/charts/PieChart/PieChart.js.map +1 -1
  108. package/dist/components/charts/PlateMap/PlateMap.cjs +1 -1
  109. package/dist/components/charts/PlateMap/PlateMap.cjs.map +1 -1
  110. package/dist/components/charts/PlateMap/PlateMap.js +246 -242
  111. package/dist/components/charts/PlateMap/PlateMap.js.map +1 -1
  112. package/dist/components/charts/ScatterPlot/ScatterPlot.cjs +2 -0
  113. package/dist/components/charts/ScatterPlot/ScatterPlot.cjs.map +1 -0
  114. package/dist/components/charts/ScatterPlot/ScatterPlot.js +252 -0
  115. package/dist/components/charts/ScatterPlot/ScatterPlot.js.map +1 -0
  116. package/dist/components/charts/ScatterPlotInteractive/ScatterPlotInteractive.cjs +2 -0
  117. package/dist/components/charts/ScatterPlotInteractive/ScatterPlotInteractive.cjs.map +1 -0
  118. package/dist/components/charts/ScatterPlotInteractive/ScatterPlotInteractive.js +215 -0
  119. package/dist/components/charts/ScatterPlotInteractive/ScatterPlotInteractive.js.map +1 -0
  120. package/dist/components/charts/ScatterPlotInteractive/constants.cjs +2 -0
  121. package/dist/components/charts/ScatterPlotInteractive/constants.cjs.map +1 -0
  122. package/dist/components/charts/ScatterPlotInteractive/constants.js +38 -0
  123. package/dist/components/charts/ScatterPlotInteractive/constants.js.map +1 -0
  124. package/dist/components/charts/ScatterPlotInteractive/utils.cjs +2 -0
  125. package/dist/components/charts/ScatterPlotInteractive/utils.cjs.map +1 -0
  126. package/dist/components/charts/ScatterPlotInteractive/utils.js +261 -0
  127. package/dist/components/charts/ScatterPlotInteractive/utils.js.map +1 -0
  128. package/dist/components/charts/StackedChromatogram/StackedChromatogram.cjs +2 -0
  129. package/dist/components/charts/StackedChromatogram/StackedChromatogram.cjs.map +1 -0
  130. package/dist/components/charts/StackedChromatogram/StackedChromatogram.js +40 -0
  131. package/dist/components/charts/StackedChromatogram/StackedChromatogram.js.map +1 -0
  132. package/dist/components/charts/StackedChromatogram/transforms.cjs.map +1 -0
  133. package/dist/components/charts/StackedChromatogram/transforms.js.map +1 -0
  134. package/dist/components/charts/plotly-loader.cjs +2 -0
  135. package/dist/components/charts/plotly-loader.cjs.map +1 -0
  136. package/dist/components/charts/plotly-loader.js +22 -0
  137. package/dist/components/charts/plotly-loader.js.map +1 -0
  138. package/dist/components/composed/AssistantLayout/AssistantLayout.cjs +2 -0
  139. package/dist/components/composed/AssistantLayout/AssistantLayout.cjs.map +1 -0
  140. package/dist/components/composed/AssistantLayout/AssistantLayout.js +142 -0
  141. package/dist/components/composed/AssistantLayout/AssistantLayout.js.map +1 -0
  142. package/dist/components/composed/AssistantLayout/dockLayout.cjs +2 -0
  143. package/dist/components/composed/AssistantLayout/dockLayout.cjs.map +1 -0
  144. package/dist/components/composed/AssistantLayout/dockLayout.js +10 -0
  145. package/dist/components/composed/AssistantLayout/dockLayout.js.map +1 -0
  146. package/dist/components/composed/Chat/Chat.cjs +1 -1
  147. package/dist/components/composed/Chat/Chat.cjs.map +1 -1
  148. package/dist/components/composed/Chat/Chat.js +23 -23
  149. package/dist/components/composed/Chat/Chat.js.map +1 -1
  150. package/dist/components/composed/ConfirmDialog/ConfirmDialog.cjs +1 -1
  151. package/dist/components/composed/ConfirmDialog/ConfirmDialog.cjs.map +1 -1
  152. package/dist/components/composed/ConfirmDialog/ConfirmDialog.js +33 -29
  153. package/dist/components/composed/ConfirmDialog/ConfirmDialog.js.map +1 -1
  154. package/dist/components/composed/DataAppShell/CollapseButton.cjs +2 -0
  155. package/dist/components/composed/DataAppShell/CollapseButton.cjs.map +1 -0
  156. package/dist/components/composed/DataAppShell/CollapseButton.js +42 -0
  157. package/dist/components/composed/DataAppShell/CollapseButton.js.map +1 -0
  158. package/dist/components/composed/DataAppShell/DataAppShell.cjs +1 -1
  159. package/dist/components/composed/DataAppShell/DataAppShell.cjs.map +1 -1
  160. package/dist/components/composed/DataAppShell/DataAppShell.js +349 -313
  161. package/dist/components/composed/DataAppShell/DataAppShell.js.map +1 -1
  162. package/dist/components/composed/DataAppShell/PrimaryNav.cjs +2 -0
  163. package/dist/components/composed/DataAppShell/PrimaryNav.cjs.map +1 -0
  164. package/dist/components/composed/DataAppShell/PrimaryNav.js +268 -0
  165. package/dist/components/composed/DataAppShell/PrimaryNav.js.map +1 -0
  166. package/dist/components/composed/DataAppShell/RightPanel.cjs +2 -0
  167. package/dist/components/composed/DataAppShell/RightPanel.cjs.map +1 -0
  168. package/dist/components/composed/DataAppShell/RightPanel.js +282 -0
  169. package/dist/components/composed/DataAppShell/RightPanel.js.map +1 -0
  170. package/dist/components/composed/DataAppShell/SecondaryNav.cjs +2 -0
  171. package/dist/components/composed/DataAppShell/SecondaryNav.cjs.map +1 -0
  172. package/dist/components/composed/DataAppShell/SecondaryNav.js +364 -0
  173. package/dist/components/composed/DataAppShell/SecondaryNav.js.map +1 -0
  174. package/dist/components/composed/DataAppShell/ShellContext.cjs +2 -0
  175. package/dist/components/composed/DataAppShell/ShellContext.cjs.map +1 -0
  176. package/dist/components/composed/DataAppShell/ShellContext.js +23 -0
  177. package/dist/components/composed/DataAppShell/ShellContext.js.map +1 -0
  178. package/dist/components/composed/MoleculeStructure/MoleculeStructure.cjs +2 -0
  179. package/dist/components/composed/MoleculeStructure/MoleculeStructure.cjs.map +1 -0
  180. package/dist/components/composed/MoleculeStructure/MoleculeStructure.js +87 -0
  181. package/dist/components/composed/MoleculeStructure/MoleculeStructure.js.map +1 -0
  182. package/dist/components/composed/MoleculeStructure/rdkit-loader.cjs +2 -0
  183. package/dist/components/composed/MoleculeStructure/rdkit-loader.cjs.map +1 -0
  184. package/dist/components/composed/MoleculeStructure/rdkit-loader.js +89 -0
  185. package/dist/components/composed/MoleculeStructure/rdkit-loader.js.map +1 -0
  186. package/dist/components/composed/MoleculeStructure/use-rdkit.cjs +2 -0
  187. package/dist/components/composed/MoleculeStructure/use-rdkit.cjs.map +1 -0
  188. package/dist/components/composed/MoleculeStructure/use-rdkit.js +19 -0
  189. package/dist/components/composed/MoleculeStructure/use-rdkit.js.map +1 -0
  190. package/dist/components/composed/PlateMapEditor/ManifestFilterPopover.cjs +1 -1
  191. package/dist/components/composed/PlateMapEditor/ManifestFilterPopover.cjs.map +1 -1
  192. package/dist/components/composed/PlateMapEditor/ManifestFilterPopover.js +17 -17
  193. package/dist/components/composed/PlateMapEditor/ManifestFilterPopover.js.map +1 -1
  194. package/dist/components/composed/PlateMapEditor/PlateMapActionsMenu.cjs +1 -1
  195. package/dist/components/composed/PlateMapEditor/PlateMapActionsMenu.cjs.map +1 -1
  196. package/dist/components/composed/PlateMapEditor/PlateMapActionsMenu.js +33 -33
  197. package/dist/components/composed/PlateMapEditor/PlateMapActionsMenu.js.map +1 -1
  198. package/dist/components/composed/PlateMapEditor/PlateMapPlateSelector.cjs +1 -1
  199. package/dist/components/composed/PlateMapEditor/PlateMapPlateSelector.cjs.map +1 -1
  200. package/dist/components/composed/PlateMapEditor/PlateMapPlateSelector.js +7 -7
  201. package/dist/components/composed/PlateMapEditor/PlateMapPlateSelector.js.map +1 -1
  202. package/dist/components/composed/PlateMapEditor/PlatePaintGrid.cjs +1 -1
  203. package/dist/components/composed/PlateMapEditor/PlatePaintGrid.cjs.map +1 -1
  204. package/dist/components/composed/PlateMapEditor/PlatePaintGrid.js +1 -1
  205. package/dist/components/composed/PlateMapEditor/PlatePaintGrid.js.map +1 -1
  206. package/dist/components/composed/PlateMapEditor/WellLegend.cjs +1 -1
  207. package/dist/components/composed/PlateMapEditor/WellLegend.cjs.map +1 -1
  208. package/dist/components/composed/PlateMapEditor/WellLegend.js +24 -12
  209. package/dist/components/composed/PlateMapEditor/WellLegend.js.map +1 -1
  210. package/dist/components/composed/PlateMapEditor/WellManifestTable.cjs +1 -1
  211. package/dist/components/composed/PlateMapEditor/WellManifestTable.cjs.map +1 -1
  212. package/dist/components/composed/PlateMapEditor/WellManifestTable.js +1 -1
  213. package/dist/components/composed/PlateMapEditor/WellManifestTable.js.map +1 -1
  214. package/dist/components/composed/TdpSearch/components/DefaultFilters.cjs +1 -1
  215. package/dist/components/composed/TdpSearch/components/DefaultFilters.cjs.map +1 -1
  216. package/dist/components/composed/TdpSearch/components/DefaultFilters.js +3 -3
  217. package/dist/components/composed/TdpSearch/components/DefaultFilters.js.map +1 -1
  218. package/dist/components/composed/TopBar/TopBar.cjs +2 -0
  219. package/dist/components/composed/TopBar/TopBar.cjs.map +1 -0
  220. package/dist/components/composed/TopBar/TopBar.js +56 -0
  221. package/dist/components/composed/TopBar/TopBar.js.map +1 -0
  222. package/dist/components/composed/UserMenu/UserMenu.cjs +2 -0
  223. package/dist/components/composed/UserMenu/UserMenu.cjs.map +1 -0
  224. package/dist/components/composed/UserMenu/UserMenu.js +99 -0
  225. package/dist/components/composed/UserMenu/UserMenu.js.map +1 -0
  226. package/dist/components/composed/tdp-link.cjs +1 -1
  227. package/dist/components/composed/tdp-link.cjs.map +1 -1
  228. package/dist/components/composed/tdp-link.js +5 -5
  229. package/dist/components/composed/tdp-link.js.map +1 -1
  230. package/dist/components/ui/alert.cjs +1 -1
  231. package/dist/components/ui/alert.cjs.map +1 -1
  232. package/dist/components/ui/alert.js +12 -12
  233. package/dist/components/ui/alert.js.map +1 -1
  234. package/dist/components/ui/badge.cjs +1 -1
  235. package/dist/components/ui/badge.cjs.map +1 -1
  236. package/dist/components/ui/badge.js +14 -14
  237. package/dist/components/ui/badge.js.map +1 -1
  238. package/dist/components/ui/banner.cjs +1 -1
  239. package/dist/components/ui/banner.cjs.map +1 -1
  240. package/dist/components/ui/banner.js +17 -17
  241. package/dist/components/ui/banner.js.map +1 -1
  242. package/dist/components/ui/button.cjs +1 -1
  243. package/dist/components/ui/button.cjs.map +1 -1
  244. package/dist/components/ui/button.js +16 -16
  245. package/dist/components/ui/button.js.map +1 -1
  246. package/dist/components/ui/calendar.cjs +1 -1
  247. package/dist/components/ui/calendar.cjs.map +1 -1
  248. package/dist/components/ui/calendar.js +3 -3
  249. package/dist/components/ui/calendar.js.map +1 -1
  250. package/dist/components/ui/code-block.cjs +3 -3
  251. package/dist/components/ui/code-block.cjs.map +1 -1
  252. package/dist/components/ui/code-block.js +136 -118
  253. package/dist/components/ui/code-block.js.map +1 -1
  254. package/dist/components/ui/code-editor.cjs +1 -1
  255. package/dist/components/ui/code-editor.cjs.map +1 -1
  256. package/dist/components/ui/code-editor.js +14 -12
  257. package/dist/components/ui/code-editor.js.map +1 -1
  258. package/dist/components/ui/combobox.cjs +1 -1
  259. package/dist/components/ui/combobox.cjs.map +1 -1
  260. package/dist/components/ui/combobox.js +33 -29
  261. package/dist/components/ui/combobox.js.map +1 -1
  262. package/dist/components/ui/command.cjs +1 -1
  263. package/dist/components/ui/command.cjs.map +1 -1
  264. package/dist/components/ui/command.js +81 -77
  265. package/dist/components/ui/command.js.map +1 -1
  266. package/dist/components/ui/context-menu.cjs +1 -1
  267. package/dist/components/ui/context-menu.cjs.map +1 -1
  268. package/dist/components/ui/context-menu.js +13 -13
  269. package/dist/components/ui/context-menu.js.map +1 -1
  270. package/dist/components/ui/data-table/data-table-column-toggle.cjs +1 -1
  271. package/dist/components/ui/data-table/data-table-column-toggle.cjs.map +1 -1
  272. package/dist/components/ui/data-table/data-table-column-toggle.js +70 -62
  273. package/dist/components/ui/data-table/data-table-column-toggle.js.map +1 -1
  274. package/dist/components/ui/data-table/data-table-filter.cjs +1 -1
  275. package/dist/components/ui/data-table/data-table-filter.cjs.map +1 -1
  276. package/dist/components/ui/data-table/data-table-filter.js +24 -23
  277. package/dist/components/ui/data-table/data-table-filter.js.map +1 -1
  278. package/dist/components/ui/data-table/data-table-group.cjs +1 -1
  279. package/dist/components/ui/data-table/data-table-group.cjs.map +1 -1
  280. package/dist/components/ui/data-table/data-table-group.js +17 -16
  281. package/dist/components/ui/data-table/data-table-group.js.map +1 -1
  282. package/dist/components/ui/data-table/data-table-pagination.cjs +1 -1
  283. package/dist/components/ui/data-table/data-table-pagination.cjs.map +1 -1
  284. package/dist/components/ui/data-table/data-table-pagination.js +15 -15
  285. package/dist/components/ui/data-table/data-table-pagination.js.map +1 -1
  286. package/dist/components/ui/data-table/data-table.cjs +1 -1
  287. package/dist/components/ui/data-table/data-table.cjs.map +1 -1
  288. package/dist/components/ui/data-table/data-table.js +191 -190
  289. package/dist/components/ui/data-table/data-table.js.map +1 -1
  290. package/dist/components/ui/dialog.cjs +1 -1
  291. package/dist/components/ui/dialog.cjs.map +1 -1
  292. package/dist/components/ui/dialog.js +1 -1
  293. package/dist/components/ui/dialog.js.map +1 -1
  294. package/dist/components/ui/dropdown-menu.cjs +1 -1
  295. package/dist/components/ui/dropdown-menu.cjs.map +1 -1
  296. package/dist/components/ui/dropdown-menu.js +12 -4
  297. package/dist/components/ui/dropdown-menu.js.map +1 -1
  298. package/dist/components/ui/hover-card.cjs +1 -1
  299. package/dist/components/ui/hover-card.cjs.map +1 -1
  300. package/dist/components/ui/hover-card.js +3 -3
  301. package/dist/components/ui/hover-card.js.map +1 -1
  302. package/dist/components/ui/item.cjs +1 -1
  303. package/dist/components/ui/item.cjs.map +1 -1
  304. package/dist/components/ui/item.js +44 -36
  305. package/dist/components/ui/item.js.map +1 -1
  306. package/dist/components/ui/menubar.cjs +1 -1
  307. package/dist/components/ui/menubar.cjs.map +1 -1
  308. package/dist/components/ui/menubar.js +2 -2
  309. package/dist/components/ui/menubar.js.map +1 -1
  310. package/dist/components/ui/navigation-menu.cjs +1 -1
  311. package/dist/components/ui/navigation-menu.cjs.map +1 -1
  312. package/dist/components/ui/navigation-menu.js +1 -1
  313. package/dist/components/ui/navigation-menu.js.map +1 -1
  314. package/dist/components/ui/popover.cjs +1 -1
  315. package/dist/components/ui/popover.cjs.map +1 -1
  316. package/dist/components/ui/popover.js +1 -1
  317. package/dist/components/ui/popover.js.map +1 -1
  318. package/dist/components/ui/scroll-area.cjs +1 -1
  319. package/dist/components/ui/scroll-area.cjs.map +1 -1
  320. package/dist/components/ui/scroll-area.js +1 -0
  321. package/dist/components/ui/scroll-area.js.map +1 -1
  322. package/dist/components/ui/select.cjs +1 -1
  323. package/dist/components/ui/select.cjs.map +1 -1
  324. package/dist/components/ui/select.js +1 -1
  325. package/dist/components/ui/select.js.map +1 -1
  326. package/dist/components/ui/sheet.cjs +1 -1
  327. package/dist/components/ui/sheet.cjs.map +1 -1
  328. package/dist/components/ui/sheet.js +5 -5
  329. package/dist/components/ui/sheet.js.map +1 -1
  330. package/dist/components/ui/sidebar.cjs +1 -1
  331. package/dist/components/ui/sidebar.cjs.map +1 -1
  332. package/dist/components/ui/sidebar.js +2 -2
  333. package/dist/components/ui/sidebar.js.map +1 -1
  334. package/dist/components/ui/slider.cjs +1 -1
  335. package/dist/components/ui/slider.cjs.map +1 -1
  336. package/dist/components/ui/slider.js +10 -9
  337. package/dist/components/ui/slider.js.map +1 -1
  338. package/dist/components/ui/sonner.cjs +1 -1
  339. package/dist/components/ui/sonner.cjs.map +1 -1
  340. package/dist/components/ui/sonner.js +25 -10
  341. package/dist/components/ui/sonner.js.map +1 -1
  342. package/dist/components/ui/table.cjs +1 -1
  343. package/dist/components/ui/table.cjs.map +1 -1
  344. package/dist/components/ui/table.js +1 -0
  345. package/dist/components/ui/table.js.map +1 -1
  346. package/dist/components/ui/tabs.cjs +1 -1
  347. package/dist/components/ui/tabs.cjs.map +1 -1
  348. package/dist/components/ui/tabs.js +18 -18
  349. package/dist/components/ui/tabs.js.map +1 -1
  350. package/dist/components/ui/tetra-molecule-icon.cjs +2 -0
  351. package/dist/components/ui/tetra-molecule-icon.cjs.map +1 -0
  352. package/dist/components/ui/tetra-molecule-icon.js +49 -0
  353. package/dist/components/ui/tetra-molecule-icon.js.map +1 -0
  354. package/dist/components/ui/toggle-group.cjs +1 -1
  355. package/dist/components/ui/toggle-group.cjs.map +1 -1
  356. package/dist/components/ui/toggle-group.js +35 -31
  357. package/dist/components/ui/toggle-group.js.map +1 -1
  358. package/dist/hooks/use-plotly-theme.cjs +1 -1
  359. package/dist/hooks/use-plotly-theme.cjs.map +1 -1
  360. package/dist/hooks/use-plotly-theme.js +4 -3
  361. package/dist/hooks/use-plotly-theme.js.map +1 -1
  362. package/dist/index.cjs +1 -1
  363. package/dist/index.css +1 -1
  364. package/dist/index.d.ts +1073 -136
  365. package/dist/index.js +698 -647
  366. package/dist/index.js.map +1 -1
  367. package/dist/index.tailwind.css +1 -1
  368. package/dist/lib/shiki.cjs +2 -0
  369. package/dist/lib/shiki.cjs.map +1 -0
  370. package/dist/lib/shiki.js +72 -0
  371. package/dist/lib/shiki.js.map +1 -0
  372. package/package.json +23 -12
  373. package/dist/components/charts/AreaGraph/AreaGraph.cjs +0 -2
  374. package/dist/components/charts/AreaGraph/AreaGraph.cjs.map +0 -1
  375. package/dist/components/charts/AreaGraph/AreaGraph.js +0 -271
  376. package/dist/components/charts/AreaGraph/AreaGraph.js.map +0 -1
  377. package/dist/components/charts/BarGraph/BarGraph.cjs +0 -2
  378. package/dist/components/charts/BarGraph/BarGraph.cjs.map +0 -1
  379. package/dist/components/charts/BarGraph/BarGraph.js +0 -220
  380. package/dist/components/charts/BarGraph/BarGraph.js.map +0 -1
  381. package/dist/components/charts/Boxplot/Boxplot.cjs +0 -2
  382. package/dist/components/charts/Boxplot/Boxplot.cjs.map +0 -1
  383. package/dist/components/charts/Boxplot/Boxplot.js.map +0 -1
  384. package/dist/components/charts/ChromatogramChart/ChromatogramChart.cjs +0 -2
  385. package/dist/components/charts/ChromatogramChart/ChromatogramChart.cjs.map +0 -1
  386. package/dist/components/charts/ChromatogramChart/ChromatogramChart.js +0 -241
  387. package/dist/components/charts/ChromatogramChart/ChromatogramChart.js.map +0 -1
  388. package/dist/components/charts/ChromatogramChart/annotations.cjs +0 -2
  389. package/dist/components/charts/ChromatogramChart/annotations.cjs.map +0 -1
  390. package/dist/components/charts/ChromatogramChart/annotations.js +0 -136
  391. package/dist/components/charts/ChromatogramChart/annotations.js.map +0 -1
  392. package/dist/components/charts/ChromatogramChart/boundaryMarkers.cjs.map +0 -1
  393. package/dist/components/charts/ChromatogramChart/boundaryMarkers.js.map +0 -1
  394. package/dist/components/charts/ChromatogramChart/constants.cjs.map +0 -1
  395. package/dist/components/charts/ChromatogramChart/constants.js.map +0 -1
  396. package/dist/components/charts/ChromatogramChart/dataProcessing.cjs.map +0 -1
  397. package/dist/components/charts/ChromatogramChart/dataProcessing.js.map +0 -1
  398. package/dist/components/charts/ChromatogramChart/peakDetection.cjs.map +0 -1
  399. package/dist/components/charts/ChromatogramChart/peakDetection.js.map +0 -1
  400. package/dist/components/charts/ChromatogramChart/plotBuilder.cjs +0 -2
  401. package/dist/components/charts/ChromatogramChart/plotBuilder.cjs.map +0 -1
  402. package/dist/components/charts/ChromatogramChart/plotBuilder.js +0 -207
  403. package/dist/components/charts/ChromatogramChart/plotBuilder.js.map +0 -1
  404. package/dist/components/charts/ChromatogramChart/regionOverlays.cjs.map +0 -1
  405. package/dist/components/charts/ChromatogramChart/regionOverlays.js.map +0 -1
  406. package/dist/components/charts/DotPlot/DotPlot.cjs +0 -2
  407. package/dist/components/charts/DotPlot/DotPlot.cjs.map +0 -1
  408. package/dist/components/charts/DotPlot/DotPlot.js +0 -208
  409. package/dist/components/charts/DotPlot/DotPlot.js.map +0 -1
  410. package/dist/components/charts/Heatmap/Heatmap.cjs +0 -2
  411. package/dist/components/charts/Heatmap/Heatmap.cjs.map +0 -1
  412. package/dist/components/charts/Heatmap/Heatmap.js +0 -67
  413. package/dist/components/charts/Heatmap/Heatmap.js.map +0 -1
  414. package/dist/components/charts/LineGraph/LineGraph.cjs +0 -2
  415. package/dist/components/charts/LineGraph/LineGraph.cjs.map +0 -1
  416. package/dist/components/charts/LineGraph/LineGraph.js +0 -225
  417. package/dist/components/charts/LineGraph/LineGraph.js.map +0 -1
  418. package/dist/components/charts/ScatterGraph/ScatterGraph.cjs +0 -2
  419. package/dist/components/charts/ScatterGraph/ScatterGraph.cjs.map +0 -1
  420. package/dist/components/charts/ScatterGraph/ScatterGraph.js +0 -234
  421. package/dist/components/charts/ScatterGraph/ScatterGraph.js.map +0 -1
  422. package/dist/components/charts/StackedChromatogramChart/StackedChromatogramChart.cjs +0 -2
  423. package/dist/components/charts/StackedChromatogramChart/StackedChromatogramChart.cjs.map +0 -1
  424. package/dist/components/charts/StackedChromatogramChart/StackedChromatogramChart.js +0 -40
  425. package/dist/components/charts/StackedChromatogramChart/StackedChromatogramChart.js.map +0 -1
  426. package/dist/components/charts/StackedChromatogramChart/transforms.cjs.map +0 -1
  427. package/dist/components/charts/StackedChromatogramChart/transforms.js.map +0 -1
  428. /package/dist/components/charts/{ChromatogramChart → Chromatogram}/boundaryMarkers.cjs +0 -0
  429. /package/dist/components/charts/{ChromatogramChart → Chromatogram}/boundaryMarkers.js +0 -0
  430. /package/dist/components/charts/{ChromatogramChart → Chromatogram}/constants.cjs +0 -0
  431. /package/dist/components/charts/{ChromatogramChart → Chromatogram}/constants.js +0 -0
  432. /package/dist/components/charts/{ChromatogramChart → Chromatogram}/dataProcessing.cjs +0 -0
  433. /package/dist/components/charts/{ChromatogramChart → Chromatogram}/dataProcessing.js +0 -0
  434. /package/dist/components/charts/{ChromatogramChart → Chromatogram}/peakDetection.cjs +0 -0
  435. /package/dist/components/charts/{ChromatogramChart → Chromatogram}/peakDetection.js +0 -0
  436. /package/dist/components/charts/{ChromatogramChart → Chromatogram}/regionOverlays.cjs +0 -0
  437. /package/dist/components/charts/{ChromatogramChart → Chromatogram}/regionOverlays.js +0 -0
  438. /package/dist/components/charts/{StackedChromatogramChart → StackedChromatogram}/transforms.cjs +0 -0
  439. /package/dist/components/charts/{StackedChromatogramChart → StackedChromatogram}/transforms.js +0 -0
@@ -0,0 +1,261 @@
1
+ import { DEFAULT_MAX_POINTS as E, COLORS as d, DEFAULT_CATEGORY_COLORS as T, DEFAULT_MARKER_SIZE as y, DEFAULT_SIZE_RANGE as v, PLOT_CONSTANTS as f } from "./constants.js";
2
+ function R(t, e) {
3
+ let r = Number.POSITIVE_INFINITY, n = Number.NEGATIVE_INFINITY;
4
+ for (const o of t) {
5
+ const l = o.metadata?.[e];
6
+ typeof l == "number" && Number.isFinite(l) && (r = Math.min(r, l), n = Math.max(n, l));
7
+ }
8
+ return !Number.isFinite(r) || !Number.isFinite(n) ? { min: 0, max: 1 } : r === n ? { min: r - 1, max: n + 1 } : { min: r, max: n };
9
+ }
10
+ function _(t, e) {
11
+ const r = t.map((n) => n.metadata?.[e]).filter((n) => typeof n == "string");
12
+ return [...new Set(r)].sort();
13
+ }
14
+ function X(t, e) {
15
+ if (!e || e.type === "static") {
16
+ const r = e?.value || d.primary;
17
+ return new Array(t.length).fill(r);
18
+ }
19
+ if (e.type === "categorical" && e.field) {
20
+ const r = _(t, e.field), n = e.categoryColors || {}, o = {};
21
+ return r.forEach((l, i) => {
22
+ o[l] = n[l] || T[i % T.length];
23
+ }), t.map((l) => {
24
+ const i = l.metadata?.[e.field];
25
+ return o[String(i)] || T[0];
26
+ });
27
+ }
28
+ return new Array(t.length).fill(d.primary);
29
+ }
30
+ function P(t, e) {
31
+ if (!e || e.type === "static") {
32
+ const r = e?.value || "circle";
33
+ return new Array(t.length).fill(r);
34
+ }
35
+ if (e.type === "categorical" && e.field) {
36
+ const r = _(t, e.field), n = e.categoryShapes || {}, o = ["circle", "square", "diamond", "cross", "x", "triangle-up", "triangle-down", "star"], l = {};
37
+ return r.forEach((i, a) => {
38
+ l[i] = n[i] || o[a % o.length];
39
+ }), t.map((i) => {
40
+ const a = i.metadata?.[e.field];
41
+ return l[String(a)] || "circle";
42
+ });
43
+ }
44
+ return new Array(t.length).fill("circle");
45
+ }
46
+ function G(t, e) {
47
+ if (!e || e.type === "static") {
48
+ const r = e?.value || y;
49
+ return new Array(t.length).fill(r);
50
+ }
51
+ if (e.type === "categorical" && e.field) {
52
+ const r = _(t, e.field), n = e.categorySizes || {}, o = {};
53
+ return r.forEach((l, i) => {
54
+ o[l] = n[l] || y + i * 2;
55
+ }), t.map((l) => {
56
+ const i = l.metadata?.[e.field];
57
+ return o[String(i)] || y;
58
+ });
59
+ }
60
+ if (e.type === "continuous" && e.field) {
61
+ const r = e.min !== void 0 && e.max !== void 0 ? { min: e.min, max: e.max } : R(t, e.field), n = e.sizeRange || v, [o, l] = n;
62
+ return t.map((i) => {
63
+ const a = i.metadata?.[e.field];
64
+ if (typeof a == "number" && Number.isFinite(a)) {
65
+ const s = (a - r.min) / (r.max - r.min);
66
+ return o + s * (l - o);
67
+ }
68
+ return y;
69
+ });
70
+ }
71
+ return new Array(t.length).fill(y);
72
+ }
73
+ function D(t, e) {
74
+ if (!e.enabled || t.length <= (e.maxPoints || E))
75
+ return t;
76
+ const r = e.maxPoints || E;
77
+ return (e.strategy || "lttb") === "lttb" ? Y(t, r) : t;
78
+ }
79
+ function h(t, e, r, n) {
80
+ const o = r - e;
81
+ if (o > 0) {
82
+ let i = 0, a = 0;
83
+ for (let s = e; s < r; s++)
84
+ i += t[s].x, a += t[s].y;
85
+ return { x: i / o, y: a / o };
86
+ }
87
+ const l = Math.max(0, Math.min(e, n - 1));
88
+ return { x: t[l].x, y: t[l].y };
89
+ }
90
+ function Y(t, e) {
91
+ const r = t.length;
92
+ if (e <= 0 || r === 0) return [];
93
+ if (e >= r) return t;
94
+ if (e === 1) return [t[0]];
95
+ if (e === 2) return [t[0], t[r - 1]];
96
+ const n = (r - 2) / (e - 2), { floor: o, abs: l, min: i } = Math, a = [t[0]];
97
+ let s = 0;
98
+ for (let c = 0; c < e - 2; c++) {
99
+ const u = i(o((c + 1) * n) + 1, r - 1), O = i(o((c + 2) * n) + 1, r), { x: b, y: L } = h(t, u, O, r), I = i(o(c * n) + 1, r - 1), C = i(o((c + 1) * n) + 1, r - 1), x = t[s].x, S = t[s].y;
100
+ let g = -1, A = t[I], N = I;
101
+ for (let m = I; m < C; m++) {
102
+ const F = l((x - b) * (t[m].y - S) - (x - t[m].x) * (L - S)) * 0.5;
103
+ F > g && (g = F, A = t[m], N = m);
104
+ }
105
+ a.push(A), s = N;
106
+ }
107
+ return a.push(t[r - 1]), a;
108
+ }
109
+ function Z(t, e) {
110
+ const r = [];
111
+ if (r.push(`X: ${t.x.toFixed(2)}`), r.push(`Y: ${t.y.toFixed(2)}`), t.label && r.push(`Label: ${t.label}`), e && t.metadata) {
112
+ for (const n of e)
113
+ if (n in t.metadata) {
114
+ const o = t.metadata[n];
115
+ r.push(`${n}: ${o}`);
116
+ }
117
+ } else if (t.metadata && !e)
118
+ for (const [n, o] of Object.entries(t.metadata))
119
+ r.push(`${n}: ${o}`);
120
+ return r.join("<br>");
121
+ }
122
+ function K(t) {
123
+ const e = t.ctrlKey || t.metaKey;
124
+ return t.shiftKey && e ? "toggle" : t.shiftKey ? "add" : e ? "remove" : "replace";
125
+ }
126
+ function $(t, e, r = 0.1, n = "linear") {
127
+ const o = n === "log";
128
+ let l = 1 / 0, i = -1 / 0;
129
+ for (const s of t) {
130
+ const c = s[e];
131
+ if (!Number.isFinite(c) || o && c <= 0) continue;
132
+ const u = o ? Math.log10(c) : c;
133
+ u < l && (l = u), u > i && (i = u);
134
+ }
135
+ if (!Number.isFinite(l))
136
+ return [0, 1];
137
+ if (l === i)
138
+ return [l - 1, i + 1];
139
+ const a = i - l;
140
+ return [l - a * r, i + a * r];
141
+ }
142
+ function k(t, e, r) {
143
+ const n = new Set(t);
144
+ switch (r) {
145
+ case "replace":
146
+ return new Set(e);
147
+ case "add":
148
+ for (const o of e)
149
+ n.add(o);
150
+ return n;
151
+ case "remove":
152
+ for (const o of e)
153
+ n.delete(o);
154
+ return n;
155
+ case "toggle":
156
+ for (const o of e)
157
+ n.has(o) ? n.delete(o) : n.add(o);
158
+ return n;
159
+ default:
160
+ return n;
161
+ }
162
+ }
163
+ const U = ({
164
+ title: t,
165
+ xAxis: e,
166
+ yAxis: r,
167
+ width: n,
168
+ height: o,
169
+ xRange: l,
170
+ yRange: i,
171
+ enableLassoSelection: a,
172
+ enableBoxSelection: s,
173
+ theme: c
174
+ }) => ({
175
+ autosize: !1,
176
+ width: n,
177
+ height: o,
178
+ title: t ? {
179
+ text: t,
180
+ font: {
181
+ family: f.FONT_FAMILY,
182
+ size: f.TITLE_FONT_SIZE,
183
+ color: c.textColor
184
+ },
185
+ x: 0.5,
186
+ xanchor: "center"
187
+ } : void 0,
188
+ margin: {
189
+ l: f.MARGIN_LEFT,
190
+ r: f.MARGIN_RIGHT,
191
+ t: t ? f.MARGIN_TOP : f.MARGIN_TOP - f.TITLE_FONT_SIZE,
192
+ b: f.MARGIN_BOTTOM
193
+ },
194
+ xaxis: {
195
+ title: {
196
+ text: e.title || "",
197
+ font: {
198
+ family: f.FONT_FAMILY,
199
+ size: f.AXIS_TITLE_FONT_SIZE,
200
+ color: c.textSecondary
201
+ }
202
+ },
203
+ type: e.scale === "log" ? "log" : "linear",
204
+ range: l,
205
+ autorange: !l,
206
+ gridcolor: c.gridColor,
207
+ linecolor: c.lineColor,
208
+ linewidth: f.AXIS_LINE_WIDTH,
209
+ tickfont: {
210
+ family: f.FONT_FAMILY,
211
+ size: f.AXIS_TICK_FONT_SIZE,
212
+ color: c.textColor
213
+ },
214
+ zeroline: !1
215
+ },
216
+ yaxis: {
217
+ title: {
218
+ text: r.title || "",
219
+ font: {
220
+ family: f.FONT_FAMILY,
221
+ size: f.AXIS_TITLE_FONT_SIZE,
222
+ color: c.textSecondary
223
+ }
224
+ },
225
+ type: r.scale === "log" ? "log" : "linear",
226
+ range: i,
227
+ autorange: !i,
228
+ gridcolor: c.gridColor,
229
+ linecolor: c.lineColor,
230
+ linewidth: f.AXIS_LINE_WIDTH,
231
+ tickfont: {
232
+ family: f.FONT_FAMILY,
233
+ size: f.AXIS_TICK_FONT_SIZE,
234
+ color: c.textColor
235
+ },
236
+ zeroline: !1
237
+ },
238
+ paper_bgcolor: c.paperBg,
239
+ plot_bgcolor: c.plotBg,
240
+ font: {
241
+ family: f.FONT_FAMILY,
242
+ color: c.textColor
243
+ },
244
+ hovermode: "closest",
245
+ dragmode: a ? "lasso" : s ? "select" : !1
246
+ });
247
+ export {
248
+ k as applySelection,
249
+ $ as calculateAxisRange,
250
+ R as calculateRange,
251
+ D as downsampleData,
252
+ Z as generateTooltipContent,
253
+ U as getPlotlyLayoutConfig,
254
+ K as getSelectionMode,
255
+ _ as getUniqueCategories,
256
+ Y as lttbDownsample,
257
+ X as mapColors,
258
+ P as mapShapes,
259
+ G as mapSizes
260
+ };
261
+ //# sourceMappingURL=utils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.js","sources":["../../../../src/components/charts/ScatterPlotInteractive/utils.ts"],"sourcesContent":["import {\n COLORS,\n DEFAULT_CATEGORY_COLORS,\n DEFAULT_MAX_POINTS,\n DEFAULT_MARKER_SIZE,\n DEFAULT_SIZE_RANGE,\n PLOT_CONSTANTS,\n} from \"./constants\";\n\nimport type {\n AxisConfig,\n ColorMapping,\n DownsamplingConfig,\n ScatterPoint,\n SelectionMode,\n ShapeMapping,\n SizeMapping,\n} from \"./types\";\nimport type { PlotlyThemeColors } from \"@/hooks/use-plotly-theme\";\n\n/**\n * Calculate min and max values for a numeric field in the data\n */\nexport function calculateRange(data: ScatterPoint[], field: string): { min: number; max: number } {\n let min = Number.POSITIVE_INFINITY;\n let max = Number.NEGATIVE_INFINITY;\n\n for (const point of data) {\n const value = point.metadata?.[field];\n if (typeof value === \"number\" && Number.isFinite(value)) {\n min = Math.min(min, value);\n max = Math.max(max, value);\n }\n }\n\n // Handle edge case where all values are invalid\n if (!Number.isFinite(min) || !Number.isFinite(max)) {\n return { min: 0, max: 1 };\n }\n\n // Handle edge case where min === max\n if (min === max) {\n return { min: min - 1, max: max + 1 };\n }\n\n return { min, max };\n}\n\n/**\n * Get unique categorical values from a field\n */\nexport function getUniqueCategories(data: ScatterPoint[], field: string): string[] {\n const uniqueCategories = data\n .map((point) => point.metadata?.[field])\n .filter((value): value is string => typeof value === \"string\");\n\n return [...new Set(uniqueCategories)].sort();\n}\n\n/**\n * Map colors based on color mapping configuration\n */\nexport function mapColors(data: ScatterPoint[], colorMapping?: ColorMapping): string[] {\n if (!colorMapping || colorMapping.type === \"static\") {\n const color = colorMapping?.value || COLORS.primary;\n return new Array(data.length).fill(color);\n }\n\n if (colorMapping.type === \"categorical\" && colorMapping.field) {\n const categories = getUniqueCategories(data, colorMapping.field);\n const colorMap = colorMapping.categoryColors || {};\n\n // Assign default colors to categories without explicit colors\n const categoryColorMap: Record<string, string> = {};\n categories.forEach((category, index) => {\n categoryColorMap[category] =\n colorMap[category] || DEFAULT_CATEGORY_COLORS[index % DEFAULT_CATEGORY_COLORS.length];\n });\n\n return data.map((point) => {\n const value = point.metadata?.[colorMapping.field!];\n return categoryColorMap[String(value)] || DEFAULT_CATEGORY_COLORS[0];\n });\n }\n\n return new Array(data.length).fill(COLORS.primary);\n}\n\n/**\n * Map shapes based on shape mapping configuration\n */\nexport function mapShapes(data: ScatterPoint[], shapeMapping?: ShapeMapping): string[] {\n if (!shapeMapping || shapeMapping.type === \"static\") {\n const shape = shapeMapping?.value || \"circle\";\n return new Array(data.length).fill(shape);\n }\n\n if (shapeMapping.type === \"categorical\" && shapeMapping.field) {\n const categories = getUniqueCategories(data, shapeMapping.field);\n const shapeMap = shapeMapping.categoryShapes || {};\n const defaultShapes = [\"circle\", \"square\", \"diamond\", \"cross\", \"x\", \"triangle-up\", \"triangle-down\", \"star\"];\n\n // Assign default shapes to categories without explicit shapes\n const categoryShapeMap: Record<string, string> = {};\n categories.forEach((category, index) => {\n categoryShapeMap[category] = shapeMap[category] || defaultShapes[index % defaultShapes.length];\n });\n\n return data.map((point) => {\n const value = point.metadata?.[shapeMapping.field!];\n return categoryShapeMap[String(value)] || \"circle\";\n });\n }\n\n return new Array(data.length).fill(\"circle\");\n}\n\n/**\n * Map sizes based on size mapping configuration\n */\nexport function mapSizes(data: ScatterPoint[], sizeMapping?: SizeMapping): number[] {\n if (!sizeMapping || sizeMapping.type === \"static\") {\n const size = sizeMapping?.value || DEFAULT_MARKER_SIZE;\n return new Array(data.length).fill(size);\n }\n\n if (sizeMapping.type === \"categorical\" && sizeMapping.field) {\n const categories = getUniqueCategories(data, sizeMapping.field);\n const sizeMap = sizeMapping.categorySizes || {};\n\n // Assign default sizes to categories without explicit sizes\n const categorySizeMap: Record<string, number> = {};\n categories.forEach((category, index) => {\n categorySizeMap[category] = sizeMap[category] || DEFAULT_MARKER_SIZE + index * 2;\n });\n\n return data.map((point) => {\n const value = point.metadata?.[sizeMapping.field!];\n return categorySizeMap[String(value)] || DEFAULT_MARKER_SIZE;\n });\n }\n\n if (sizeMapping.type === \"continuous\" && sizeMapping.field) {\n const range =\n sizeMapping.min !== undefined && sizeMapping.max !== undefined\n ? { min: sizeMapping.min, max: sizeMapping.max }\n : calculateRange(data, sizeMapping.field);\n\n const sizeRange = sizeMapping.sizeRange || DEFAULT_SIZE_RANGE;\n const [minSize, maxSize] = sizeRange;\n\n return data.map((point) => {\n const value = point.metadata?.[sizeMapping.field!];\n if (typeof value === \"number\" && Number.isFinite(value)) {\n // Normalize and map to size range\n const normalized = (value - range.min) / (range.max - range.min);\n return minSize + normalized * (maxSize - minSize);\n }\n return DEFAULT_MARKER_SIZE;\n });\n }\n\n return new Array(data.length).fill(DEFAULT_MARKER_SIZE);\n}\n\n/**\n * Downsample data using specified strategy\n */\nexport function downsampleData(data: ScatterPoint[], config: DownsamplingConfig): ScatterPoint[] {\n if (!config.enabled || data.length <= (config.maxPoints || DEFAULT_MAX_POINTS)) {\n return data;\n }\n\n const maxPoints = config.maxPoints || DEFAULT_MAX_POINTS;\n const strategy = config.strategy || \"lttb\";\n\n if (strategy === \"lttb\") {\n // Largest Triangle Three Buckets algorithm\n return lttbDownsample(data, maxPoints);\n }\n\n return data;\n}\n\n/**\n * Compute the (x, y) centroid of data[start..end).\n * Falls back to the point at clamp(start, 0, dataLength-1) when the range is\n * empty (only reachable under extreme floating-point drift) to prevent NaN.\n */\nfunction bucketCentroid(\n data: ScatterPoint[],\n start: number,\n end: number,\n dataLength: number,\n): { x: number; y: number } {\n const length = end - start;\n if (length > 0) {\n let sumX = 0;\n let sumY = 0;\n for (let j = start; j < end; j++) {\n sumX += data[j].x;\n sumY += data[j].y;\n }\n return { x: sumX / length, y: sumY / length };\n }\n const fallbackIdx = Math.max(0, Math.min(start, dataLength - 1));\n return { x: data[fallbackIdx].x, y: data[fallbackIdx].y };\n}\n\n/**\n * Largest Triangle Three Buckets (LTTB) downsampling algorithm.\n * Preserves the visual shape of the data by maximizing the triangle area\n * formed by adjacent bucket centroids and each candidate point.\n * Exported for unit testing\n */\nexport function lttbDownsample(data: ScatterPoint[], threshold: number): ScatterPoint[] {\n const dataLength = data.length;\n\n // --- Edge cases ---\n if (threshold <= 0 || dataLength === 0) return [];\n // No downsampling needed; return the original reference unchanged.\n if (threshold >= dataLength) return data;\n if (threshold === 1) return [data[0]];\n if (threshold === 2) return [data[0], data[dataLength - 1]];\n\n // At this point: 3 <= threshold < dataLength, so dataLength >= 4.\n // Spread (dataLength - 2) interior points across (threshold - 2) buckets,\n // keeping the first and last points fixed outside the buckets.\n // With threshold < dataLength, every > 1, so no bucket is ever empty.\n const every = (dataLength - 2) / (threshold - 2);\n\n const { floor, abs, min } = Math;\n const sampled: ScatterPoint[] = [data[0]];\n\n // Index of the previously selected point — left vertex A of the triangle.\n let a = 0;\n\n for (let i = 0; i < threshold - 2; i++) {\n // Centroid of the *next* bucket — right vertex C of the triangle.\n // Biases candidate selection toward points that preserve visual variance.\n const avgRangeStart = min(floor((i + 1) * every) + 1, dataLength - 1);\n const avgRangeEnd = min(floor((i + 2) * every) + 1, dataLength);\n const { x: avgX, y: avgY } = bucketCentroid(data, avgRangeStart, avgRangeEnd, dataLength);\n\n // Boundaries of the current bucket — middle vertex B candidates.\n // Clamped to valid index range to guard against floating-point drift.\n const rangeStart = min(floor(i * every) + 1, dataLength - 1);\n const rangeEnd = min(floor((i + 1) * every) + 1, dataLength - 1);\n\n const pointAX = data[a].x;\n const pointAY = data[a].y;\n\n // Safe fallback: first point in the bucket, used when the bucket is degenerate.\n let maxArea = -1;\n let maxAreaPoint: ScatterPoint = data[rangeStart];\n let nextA = rangeStart;\n\n for (let j = rangeStart; j < rangeEnd; j++) {\n // Area of the triangle formed by A (prev selected), B (candidate), C (next centroid).\n // The point maximising this area is the most visually significant in the bucket.\n const area = abs((pointAX - avgX) * (data[j].y - pointAY) - (pointAX - data[j].x) * (avgY - pointAY)) * 0.5;\n if (area > maxArea) {\n maxArea = area;\n maxAreaPoint = data[j];\n nextA = j;\n }\n }\n\n sampled.push(maxAreaPoint);\n a = nextA;\n }\n\n sampled.push(data[dataLength - 1]); // Always include the last point.\n\n return sampled;\n}\n\n/**\n * Generate default tooltip content\n */\nexport function generateTooltipContent(point: ScatterPoint, fields?: string[]): string {\n const lines: string[] = [];\n\n // Always include x, y\n lines.push(`X: ${point.x.toFixed(2)}`);\n lines.push(`Y: ${point.y.toFixed(2)}`);\n\n // Add label if present\n if (point.label) {\n lines.push(`Label: ${point.label}`);\n }\n\n // Add requested fields from metadata\n if (fields && point.metadata) {\n for (const field of fields) {\n if (field in point.metadata) {\n const value = point.metadata[field];\n lines.push(`${field}: ${value}`);\n }\n }\n } else if (point.metadata && !fields) {\n // If no fields specified, show all metadata\n for (const [key, value] of Object.entries(point.metadata)) {\n lines.push(`${key}: ${value}`);\n }\n }\n\n return lines.join(\"<br>\");\n}\n\n/**\n * Determine selection mode from keyboard event\n */\nexport function getSelectionMode(event: { shiftKey: boolean; ctrlKey: boolean; metaKey: boolean }): SelectionMode {\n const ctrlOrCmd = event.ctrlKey || event.metaKey;\n\n if (event.shiftKey && ctrlOrCmd) {\n return \"toggle\";\n }\n if (event.shiftKey) {\n return \"add\";\n }\n if (ctrlOrCmd) {\n return \"remove\";\n }\n return \"replace\";\n}\n\n/**\n * Calculate axis range with padding.\n *\n * When `scale` is `\"log\"`, the returned range is in log10 units (what Plotly\n * expects for `type: \"log\"` axes), and padding is applied in log-space so that\n * the visual margin is proportional on the logarithmic axis.\n */\nexport function calculateAxisRange(\n data: ScatterPoint[],\n axis: \"x\" | \"y\",\n padding = 0.1,\n scale: \"linear\" | \"log\" = \"linear\",\n): [number, number] {\n const isLog = scale === \"log\";\n let min = Infinity;\n let max = -Infinity;\n\n for (const point of data) {\n const v = point[axis];\n if (!Number.isFinite(v)) continue;\n // log10 is undefined for non-positive values — skip them silently\n if (isLog && v <= 0) continue;\n // Plotly log axes expect range bounds in log10 units\n const mapped = isLog ? Math.log10(v) : v;\n if (mapped < min) min = mapped;\n if (mapped > max) max = mapped;\n }\n\n if (!Number.isFinite(min)) {\n return [0, 1];\n }\n\n if (min === max) {\n return [min - 1, max + 1];\n }\n\n const range = max - min;\n return [min - range * padding, max + range * padding];\n}\n\n/**\n * Apply selection to a set of point IDs\n */\nexport function applySelection(\n currentSelection: Set<string | number>,\n newIds: Set<string | number>,\n mode: SelectionMode,\n): Set<string | number> {\n const result = new Set(currentSelection);\n\n switch (mode) {\n case \"replace\":\n return new Set(newIds);\n\n case \"add\":\n for (const id of newIds) {\n result.add(id);\n }\n return result;\n\n case \"remove\":\n for (const id of newIds) {\n result.delete(id);\n }\n return result;\n\n case \"toggle\":\n for (const id of newIds) {\n if (result.has(id)) {\n result.delete(id);\n } else {\n result.add(id);\n }\n }\n return result;\n\n default:\n return result;\n }\n}\n\nexport const getPlotlyLayoutConfig = ({\n title,\n xAxis,\n yAxis,\n width,\n height,\n xRange,\n yRange,\n enableLassoSelection,\n enableBoxSelection,\n theme,\n}: {\n title: string | undefined;\n xAxis: AxisConfig;\n yAxis: AxisConfig;\n width: number;\n height: number;\n xRange: [number, number] | undefined;\n yRange: [number, number] | undefined;\n enableLassoSelection: boolean;\n enableBoxSelection: boolean;\n theme: PlotlyThemeColors;\n}): Partial<Plotly.Layout> => ({\n autosize: false,\n width,\n height,\n title: title\n ? {\n text: title,\n font: {\n family: PLOT_CONSTANTS.FONT_FAMILY,\n size: PLOT_CONSTANTS.TITLE_FONT_SIZE,\n color: theme.textColor,\n },\n x: 0.5,\n xanchor: \"center\",\n }\n : undefined,\n margin: {\n l: PLOT_CONSTANTS.MARGIN_LEFT,\n r: PLOT_CONSTANTS.MARGIN_RIGHT,\n t: title ? PLOT_CONSTANTS.MARGIN_TOP : PLOT_CONSTANTS.MARGIN_TOP - PLOT_CONSTANTS.TITLE_FONT_SIZE,\n b: PLOT_CONSTANTS.MARGIN_BOTTOM,\n },\n xaxis: {\n title: {\n text: xAxis.title || \"\",\n font: {\n family: PLOT_CONSTANTS.FONT_FAMILY,\n size: PLOT_CONSTANTS.AXIS_TITLE_FONT_SIZE,\n color: theme.textSecondary,\n },\n },\n type: xAxis.scale === \"log\" ? \"log\" : \"linear\",\n range: xRange,\n autorange: !xRange,\n gridcolor: theme.gridColor,\n linecolor: theme.lineColor,\n linewidth: PLOT_CONSTANTS.AXIS_LINE_WIDTH,\n tickfont: {\n family: PLOT_CONSTANTS.FONT_FAMILY,\n size: PLOT_CONSTANTS.AXIS_TICK_FONT_SIZE,\n color: theme.textColor,\n },\n zeroline: false,\n },\n yaxis: {\n title: {\n text: yAxis.title || \"\",\n font: {\n family: PLOT_CONSTANTS.FONT_FAMILY,\n size: PLOT_CONSTANTS.AXIS_TITLE_FONT_SIZE,\n color: theme.textSecondary,\n },\n },\n type: yAxis.scale === \"log\" ? \"log\" : \"linear\",\n range: yRange,\n autorange: !yRange,\n gridcolor: theme.gridColor,\n linecolor: theme.lineColor,\n linewidth: PLOT_CONSTANTS.AXIS_LINE_WIDTH,\n tickfont: {\n family: PLOT_CONSTANTS.FONT_FAMILY,\n size: PLOT_CONSTANTS.AXIS_TICK_FONT_SIZE,\n color: theme.textColor,\n },\n zeroline: false,\n },\n paper_bgcolor: theme.paperBg,\n plot_bgcolor: theme.plotBg,\n font: {\n family: PLOT_CONSTANTS.FONT_FAMILY,\n color: theme.textColor,\n },\n hovermode: \"closest\",\n dragmode: enableLassoSelection ? \"lasso\" : enableBoxSelection ? \"select\" : false,\n});\n"],"names":["calculateRange","data","field","min","max","point","value","getUniqueCategories","uniqueCategories","mapColors","colorMapping","color","COLORS","categories","colorMap","categoryColorMap","category","index","DEFAULT_CATEGORY_COLORS","mapShapes","shapeMapping","shape","shapeMap","defaultShapes","categoryShapeMap","mapSizes","sizeMapping","size","DEFAULT_MARKER_SIZE","sizeMap","categorySizeMap","range","sizeRange","DEFAULT_SIZE_RANGE","minSize","maxSize","normalized","downsampleData","config","DEFAULT_MAX_POINTS","maxPoints","lttbDownsample","bucketCentroid","start","end","dataLength","length","sumX","sumY","j","fallbackIdx","threshold","every","floor","abs","sampled","a","i","avgRangeStart","avgRangeEnd","avgX","avgY","rangeStart","rangeEnd","pointAX","pointAY","maxArea","maxAreaPoint","nextA","area","generateTooltipContent","fields","lines","key","getSelectionMode","event","ctrlOrCmd","calculateAxisRange","axis","padding","scale","isLog","v","mapped","applySelection","currentSelection","newIds","mode","result","id","getPlotlyLayoutConfig","title","xAxis","yAxis","width","height","xRange","yRange","enableLassoSelection","enableBoxSelection","theme","PLOT_CONSTANTS"],"mappings":";AAuBO,SAASA,EAAeC,GAAsBC,GAA6C;AAChG,MAAIC,IAAM,OAAO,mBACbC,IAAM,OAAO;AAEjB,aAAWC,KAASJ,GAAM;AACxB,UAAMK,IAAQD,EAAM,WAAWH,CAAK;AACpC,IAAI,OAAOI,KAAU,YAAY,OAAO,SAASA,CAAK,MACpDH,IAAM,KAAK,IAAIA,GAAKG,CAAK,GACzBF,IAAM,KAAK,IAAIA,GAAKE,CAAK;AAAA,EAE7B;AAGA,SAAI,CAAC,OAAO,SAASH,CAAG,KAAK,CAAC,OAAO,SAASC,CAAG,IACxC,EAAE,KAAK,GAAG,KAAK,EAAA,IAIpBD,MAAQC,IACH,EAAE,KAAKD,IAAM,GAAG,KAAKC,IAAM,EAAA,IAG7B,EAAE,KAAAD,GAAK,KAAAC,EAAA;AAChB;AAKO,SAASG,EAAoBN,GAAsBC,GAAyB;AACjF,QAAMM,IAAmBP,EACtB,IAAI,CAACI,MAAUA,EAAM,WAAWH,CAAK,CAAC,EACtC,OAAO,CAACI,MAA2B,OAAOA,KAAU,QAAQ;AAE/D,SAAO,CAAC,GAAG,IAAI,IAAIE,CAAgB,CAAC,EAAE,KAAA;AACxC;AAKO,SAASC,EAAUR,GAAsBS,GAAuC;AACrF,MAAI,CAACA,KAAgBA,EAAa,SAAS,UAAU;AACnD,UAAMC,IAAQD,GAAc,SAASE,EAAO;AAC5C,WAAO,IAAI,MAAMX,EAAK,MAAM,EAAE,KAAKU,CAAK;AAAA,EAC1C;AAEA,MAAID,EAAa,SAAS,iBAAiBA,EAAa,OAAO;AAC7D,UAAMG,IAAaN,EAAoBN,GAAMS,EAAa,KAAK,GACzDI,IAAWJ,EAAa,kBAAkB,CAAA,GAG1CK,IAA2C,CAAA;AACjD,WAAAF,EAAW,QAAQ,CAACG,GAAUC,MAAU;AACtC,MAAAF,EAAiBC,CAAQ,IACvBF,EAASE,CAAQ,KAAKE,EAAwBD,IAAQC,EAAwB,MAAM;AAAA,IACxF,CAAC,GAEMjB,EAAK,IAAI,CAACI,MAAU;AACzB,YAAMC,IAAQD,EAAM,WAAWK,EAAa,KAAM;AAClD,aAAOK,EAAiB,OAAOT,CAAK,CAAC,KAAKY,EAAwB,CAAC;AAAA,IACrE,CAAC;AAAA,EACH;AAEA,SAAO,IAAI,MAAMjB,EAAK,MAAM,EAAE,KAAKW,EAAO,OAAO;AACnD;AAKO,SAASO,EAAUlB,GAAsBmB,GAAuC;AACrF,MAAI,CAACA,KAAgBA,EAAa,SAAS,UAAU;AACnD,UAAMC,IAAQD,GAAc,SAAS;AACrC,WAAO,IAAI,MAAMnB,EAAK,MAAM,EAAE,KAAKoB,CAAK;AAAA,EAC1C;AAEA,MAAID,EAAa,SAAS,iBAAiBA,EAAa,OAAO;AAC7D,UAAMP,IAAaN,EAAoBN,GAAMmB,EAAa,KAAK,GACzDE,IAAWF,EAAa,kBAAkB,CAAA,GAC1CG,IAAgB,CAAC,UAAU,UAAU,WAAW,SAAS,KAAK,eAAe,iBAAiB,MAAM,GAGpGC,IAA2C,CAAA;AACjD,WAAAX,EAAW,QAAQ,CAACG,GAAUC,MAAU;AACtC,MAAAO,EAAiBR,CAAQ,IAAIM,EAASN,CAAQ,KAAKO,EAAcN,IAAQM,EAAc,MAAM;AAAA,IAC/F,CAAC,GAEMtB,EAAK,IAAI,CAACI,MAAU;AACzB,YAAMC,IAAQD,EAAM,WAAWe,EAAa,KAAM;AAClD,aAAOI,EAAiB,OAAOlB,CAAK,CAAC,KAAK;AAAA,IAC5C,CAAC;AAAA,EACH;AAEA,SAAO,IAAI,MAAML,EAAK,MAAM,EAAE,KAAK,QAAQ;AAC7C;AAKO,SAASwB,EAASxB,GAAsByB,GAAqC;AAClF,MAAI,CAACA,KAAeA,EAAY,SAAS,UAAU;AACjD,UAAMC,IAAOD,GAAa,SAASE;AACnC,WAAO,IAAI,MAAM3B,EAAK,MAAM,EAAE,KAAK0B,CAAI;AAAA,EACzC;AAEA,MAAID,EAAY,SAAS,iBAAiBA,EAAY,OAAO;AAC3D,UAAMb,IAAaN,EAAoBN,GAAMyB,EAAY,KAAK,GACxDG,IAAUH,EAAY,iBAAiB,CAAA,GAGvCI,IAA0C,CAAA;AAChD,WAAAjB,EAAW,QAAQ,CAACG,GAAUC,MAAU;AACtC,MAAAa,EAAgBd,CAAQ,IAAIa,EAAQb,CAAQ,KAAKY,IAAsBX,IAAQ;AAAA,IACjF,CAAC,GAEMhB,EAAK,IAAI,CAACI,MAAU;AACzB,YAAMC,IAAQD,EAAM,WAAWqB,EAAY,KAAM;AACjD,aAAOI,EAAgB,OAAOxB,CAAK,CAAC,KAAKsB;AAAA,IAC3C,CAAC;AAAA,EACH;AAEA,MAAIF,EAAY,SAAS,gBAAgBA,EAAY,OAAO;AAC1D,UAAMK,IACJL,EAAY,QAAQ,UAAaA,EAAY,QAAQ,SACjD,EAAE,KAAKA,EAAY,KAAK,KAAKA,EAAY,IAAA,IACzC1B,EAAeC,GAAMyB,EAAY,KAAK,GAEtCM,IAAYN,EAAY,aAAaO,GACrC,CAACC,GAASC,CAAO,IAAIH;AAE3B,WAAO/B,EAAK,IAAI,CAACI,MAAU;AACzB,YAAMC,IAAQD,EAAM,WAAWqB,EAAY,KAAM;AACjD,UAAI,OAAOpB,KAAU,YAAY,OAAO,SAASA,CAAK,GAAG;AAEvD,cAAM8B,KAAc9B,IAAQyB,EAAM,QAAQA,EAAM,MAAMA,EAAM;AAC5D,eAAOG,IAAUE,KAAcD,IAAUD;AAAA,MAC3C;AACA,aAAON;AAAA,IACT,CAAC;AAAA,EACH;AAEA,SAAO,IAAI,MAAM3B,EAAK,MAAM,EAAE,KAAK2B,CAAmB;AACxD;AAKO,SAASS,EAAepC,GAAsBqC,GAA4C;AAC/F,MAAI,CAACA,EAAO,WAAWrC,EAAK,WAAWqC,EAAO,aAAaC;AACzD,WAAOtC;AAGT,QAAMuC,IAAYF,EAAO,aAAaC;AAGtC,UAFiBD,EAAO,YAAY,YAEnB,SAERG,EAAexC,GAAMuC,CAAS,IAGhCvC;AACT;AAOA,SAASyC,EACPzC,GACA0C,GACAC,GACAC,GAC0B;AAC1B,QAAMC,IAASF,IAAMD;AACrB,MAAIG,IAAS,GAAG;AACd,QAAIC,IAAO,GACPC,IAAO;AACX,aAASC,IAAIN,GAAOM,IAAIL,GAAKK;AAC3B,MAAAF,KAAQ9C,EAAKgD,CAAC,EAAE,GAChBD,KAAQ/C,EAAKgD,CAAC,EAAE;AAElB,WAAO,EAAE,GAAGF,IAAOD,GAAQ,GAAGE,IAAOF,EAAA;AAAA,EACvC;AACA,QAAMI,IAAc,KAAK,IAAI,GAAG,KAAK,IAAIP,GAAOE,IAAa,CAAC,CAAC;AAC/D,SAAO,EAAE,GAAG5C,EAAKiD,CAAW,EAAE,GAAG,GAAGjD,EAAKiD,CAAW,EAAE,EAAA;AACxD;AAQO,SAAST,EAAexC,GAAsBkD,GAAmC;AACtF,QAAMN,IAAa5C,EAAK;AAGxB,MAAIkD,KAAa,KAAKN,MAAe,UAAU,CAAA;AAE/C,MAAIM,KAAaN,EAAY,QAAO5C;AACpC,MAAIkD,MAAc,EAAG,QAAO,CAAClD,EAAK,CAAC,CAAC;AACpC,MAAIkD,MAAc,EAAG,QAAO,CAAClD,EAAK,CAAC,GAAGA,EAAK4C,IAAa,CAAC,CAAC;AAM1D,QAAMO,KAASP,IAAa,MAAMM,IAAY,IAExC,EAAE,OAAAE,GAAO,KAAAC,GAAK,KAAAnD,EAAA,IAAQ,MACtBoD,IAA0B,CAACtD,EAAK,CAAC,CAAC;AAGxC,MAAIuD,IAAI;AAER,WAASC,IAAI,GAAGA,IAAIN,IAAY,GAAGM,KAAK;AAGtC,UAAMC,IAAgBvD,EAAIkD,GAAOI,IAAI,KAAKL,CAAK,IAAI,GAAGP,IAAa,CAAC,GAC9Dc,IAAcxD,EAAIkD,GAAOI,IAAI,KAAKL,CAAK,IAAI,GAAGP,CAAU,GACxD,EAAE,GAAGe,GAAM,GAAGC,EAAA,IAASnB,EAAezC,GAAMyD,GAAeC,GAAad,CAAU,GAIlFiB,IAAa3D,EAAIkD,EAAMI,IAAIL,CAAK,IAAI,GAAGP,IAAa,CAAC,GACrDkB,IAAW5D,EAAIkD,GAAOI,IAAI,KAAKL,CAAK,IAAI,GAAGP,IAAa,CAAC,GAEzDmB,IAAU/D,EAAKuD,CAAC,EAAE,GAClBS,IAAUhE,EAAKuD,CAAC,EAAE;AAGxB,QAAIU,IAAU,IACVC,IAA6BlE,EAAK6D,CAAU,GAC5CM,IAAQN;AAEZ,aAASb,IAAIa,GAAYb,IAAIc,GAAUd,KAAK;AAG1C,YAAMoB,IAAOf,GAAKU,IAAUJ,MAAS3D,EAAKgD,CAAC,EAAE,IAAIgB,MAAYD,IAAU/D,EAAKgD,CAAC,EAAE,MAAMY,IAAOI,EAAQ,IAAI;AACxG,MAAII,IAAOH,MACTA,IAAUG,GACVF,IAAelE,EAAKgD,CAAC,GACrBmB,IAAQnB;AAAA,IAEZ;AAEA,IAAAM,EAAQ,KAAKY,CAAY,GACzBX,IAAIY;AAAA,EACN;AAEA,SAAAb,EAAQ,KAAKtD,EAAK4C,IAAa,CAAC,CAAC,GAE1BU;AACT;AAKO,SAASe,EAAuBjE,GAAqBkE,GAA2B;AACrF,QAAMC,IAAkB,CAAA;AAYxB,MATAA,EAAM,KAAK,MAAMnE,EAAM,EAAE,QAAQ,CAAC,CAAC,EAAE,GACrCmE,EAAM,KAAK,MAAMnE,EAAM,EAAE,QAAQ,CAAC,CAAC,EAAE,GAGjCA,EAAM,SACRmE,EAAM,KAAK,UAAUnE,EAAM,KAAK,EAAE,GAIhCkE,KAAUlE,EAAM;AAClB,eAAWH,KAASqE;AAClB,UAAIrE,KAASG,EAAM,UAAU;AAC3B,cAAMC,IAAQD,EAAM,SAASH,CAAK;AAClC,QAAAsE,EAAM,KAAK,GAAGtE,CAAK,KAAKI,CAAK,EAAE;AAAA,MACjC;AAAA,aAEOD,EAAM,YAAY,CAACkE;AAE5B,eAAW,CAACE,GAAKnE,CAAK,KAAK,OAAO,QAAQD,EAAM,QAAQ;AACtD,MAAAmE,EAAM,KAAK,GAAGC,CAAG,KAAKnE,CAAK,EAAE;AAIjC,SAAOkE,EAAM,KAAK,MAAM;AAC1B;AAKO,SAASE,EAAiBC,GAAiF;AAChH,QAAMC,IAAYD,EAAM,WAAWA,EAAM;AAEzC,SAAIA,EAAM,YAAYC,IACb,WAELD,EAAM,WACD,QAELC,IACK,WAEF;AACT;AASO,SAASC,EACd5E,GACA6E,GACAC,IAAU,KACVC,IAA0B,UACR;AAClB,QAAMC,IAAQD,MAAU;AACxB,MAAI7E,IAAM,OACNC,IAAM;AAEV,aAAWC,KAASJ,GAAM;AACxB,UAAMiF,IAAI7E,EAAMyE,CAAI;AAGpB,QAFI,CAAC,OAAO,SAASI,CAAC,KAElBD,KAASC,KAAK,EAAG;AAErB,UAAMC,IAASF,IAAQ,KAAK,MAAMC,CAAC,IAAIA;AACvC,IAAIC,IAAShF,MAAKA,IAAMgF,IACpBA,IAAS/E,MAAKA,IAAM+E;AAAA,EAC1B;AAEA,MAAI,CAAC,OAAO,SAAShF,CAAG;AACtB,WAAO,CAAC,GAAG,CAAC;AAGd,MAAIA,MAAQC;AACV,WAAO,CAACD,IAAM,GAAGC,IAAM,CAAC;AAG1B,QAAM2B,IAAQ3B,IAAMD;AACpB,SAAO,CAACA,IAAM4B,IAAQgD,GAAS3E,IAAM2B,IAAQgD,CAAO;AACtD;AAKO,SAASK,EACdC,GACAC,GACAC,GACsB;AACtB,QAAMC,IAAS,IAAI,IAAIH,CAAgB;AAEvC,UAAQE,GAAA;AAAA,IACN,KAAK;AACH,aAAO,IAAI,IAAID,CAAM;AAAA,IAEvB,KAAK;AACH,iBAAWG,KAAMH;AACf,QAAAE,EAAO,IAAIC,CAAE;AAEf,aAAOD;AAAA,IAET,KAAK;AACH,iBAAWC,KAAMH;AACf,QAAAE,EAAO,OAAOC,CAAE;AAElB,aAAOD;AAAA,IAET,KAAK;AACH,iBAAWC,KAAMH;AACf,QAAIE,EAAO,IAAIC,CAAE,IACfD,EAAO,OAAOC,CAAE,IAEhBD,EAAO,IAAIC,CAAE;AAGjB,aAAOD;AAAA,IAET;AACE,aAAOA;AAAA,EAAA;AAEb;AAEO,MAAME,IAAwB,CAAC;AAAA,EACpC,OAAAC;AAAA,EACA,OAAAC;AAAA,EACA,OAAAC;AAAA,EACA,OAAAC;AAAA,EACA,QAAAC;AAAA,EACA,QAAAC;AAAA,EACA,QAAAC;AAAA,EACA,sBAAAC;AAAA,EACA,oBAAAC;AAAA,EACA,OAAAC;AACF,OAW+B;AAAA,EAC7B,UAAU;AAAA,EACV,OAAAN;AAAA,EACA,QAAAC;AAAA,EACA,OAAOJ,IACH;AAAA,IACE,MAAMA;AAAA,IACN,MAAM;AAAA,MACJ,QAAQU,EAAe;AAAA,MACvB,MAAMA,EAAe;AAAA,MACrB,OAAOD,EAAM;AAAA,IAAA;AAAA,IAEf,GAAG;AAAA,IACH,SAAS;AAAA,EAAA,IAEX;AAAA,EACJ,QAAQ;AAAA,IACN,GAAGC,EAAe;AAAA,IAClB,GAAGA,EAAe;AAAA,IAClB,GAAGV,IAAQU,EAAe,aAAaA,EAAe,aAAaA,EAAe;AAAA,IAClF,GAAGA,EAAe;AAAA,EAAA;AAAA,EAEpB,OAAO;AAAA,IACL,OAAO;AAAA,MACL,MAAMT,EAAM,SAAS;AAAA,MACrB,MAAM;AAAA,QACJ,QAAQS,EAAe;AAAA,QACvB,MAAMA,EAAe;AAAA,QACrB,OAAOD,EAAM;AAAA,MAAA;AAAA,IACf;AAAA,IAEF,MAAMR,EAAM,UAAU,QAAQ,QAAQ;AAAA,IACtC,OAAOI;AAAA,IACP,WAAW,CAACA;AAAA,IACZ,WAAWI,EAAM;AAAA,IACjB,WAAWA,EAAM;AAAA,IACjB,WAAWC,EAAe;AAAA,IAC1B,UAAU;AAAA,MACR,QAAQA,EAAe;AAAA,MACvB,MAAMA,EAAe;AAAA,MACrB,OAAOD,EAAM;AAAA,IAAA;AAAA,IAEf,UAAU;AAAA,EAAA;AAAA,EAEZ,OAAO;AAAA,IACL,OAAO;AAAA,MACL,MAAMP,EAAM,SAAS;AAAA,MACrB,MAAM;AAAA,QACJ,QAAQQ,EAAe;AAAA,QACvB,MAAMA,EAAe;AAAA,QACrB,OAAOD,EAAM;AAAA,MAAA;AAAA,IACf;AAAA,IAEF,MAAMP,EAAM,UAAU,QAAQ,QAAQ;AAAA,IACtC,OAAOI;AAAA,IACP,WAAW,CAACA;AAAA,IACZ,WAAWG,EAAM;AAAA,IACjB,WAAWA,EAAM;AAAA,IACjB,WAAWC,EAAe;AAAA,IAC1B,UAAU;AAAA,MACR,QAAQA,EAAe;AAAA,MACvB,MAAMA,EAAe;AAAA,MACrB,OAAOD,EAAM;AAAA,IAAA;AAAA,IAEf,UAAU;AAAA,EAAA;AAAA,EAEZ,eAAeA,EAAM;AAAA,EACrB,cAAcA,EAAM;AAAA,EACpB,MAAM;AAAA,IACJ,QAAQC,EAAe;AAAA,IACvB,OAAOD,EAAM;AAAA,EAAA;AAAA,EAEf,WAAW;AAAA,EACX,UAAUF,IAAuB,UAAUC,IAAqB,WAAW;AAC7E;"}
@@ -0,0 +1,2 @@
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const u=require("react/jsx-runtime"),c=require("react"),g=require("../Chromatogram/Chromatogram.cjs"),S=require("./transforms.cjs");function f({series:r,stackingMode:o="overlay",stackOffset:t=0,stackingOrder:e="first-on-bottom",annotations:n,...a}){const{series:s,annotations:m,yRange:i}=c.useMemo(()=>S.applyStackingTransform(r,n,o,t,e),[r,n,o,t,e]);return u.jsx(g.Chromatogram,{...a,series:s,annotations:m,yRange:i})}exports.StackedChromatogram=f;
2
+ //# sourceMappingURL=StackedChromatogram.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"StackedChromatogram.cjs","sources":["../../../../src/components/charts/StackedChromatogram/StackedChromatogram.tsx"],"sourcesContent":["import { useMemo } from \"react\";\n\nimport { Chromatogram } from \"../Chromatogram\";\n\nimport { applyStackingTransform } from \"./transforms\";\n\nimport type { StackedChromatogramProps } from \"./types\";\n\nexport function StackedChromatogram({\n series,\n stackingMode = \"overlay\",\n stackOffset = 0,\n stackingOrder = \"first-on-bottom\",\n annotations,\n ...restProps\n}: StackedChromatogramProps) {\n const {\n series: transformedSeries,\n annotations: transformedAnnotations,\n yRange,\n } = useMemo(\n () =>\n applyStackingTransform(\n series,\n annotations,\n stackingMode,\n stackOffset,\n stackingOrder\n ),\n [series, annotations, stackingMode, stackOffset, stackingOrder]\n );\n\n return (\n <Chromatogram\n {...restProps}\n series={transformedSeries}\n annotations={transformedAnnotations}\n yRange={yRange}\n />\n );\n}\n\nexport default StackedChromatogram;\n"],"names":["StackedChromatogram","series","stackingMode","stackOffset","stackingOrder","annotations","restProps","transformedSeries","transformedAnnotations","yRange","useMemo","applyStackingTransform","jsx","Chromatogram"],"mappings":"oNAQO,SAASA,EAAoB,CAClC,OAAAC,EACA,aAAAC,EAAe,UACf,YAAAC,EAAc,EACd,cAAAC,EAAgB,kBAChB,YAAAC,EACA,GAAGC,CACL,EAA6B,CAC3B,KAAM,CACJ,OAAQC,EACR,YAAaC,EACb,OAAAC,CAAA,EACEC,EAAAA,QACF,IACEC,EAAAA,uBACEV,EACAI,EACAH,EACAC,EACAC,CAAA,EAEJ,CAACH,EAAQI,EAAaH,EAAcC,EAAaC,CAAa,CAAA,EAGhE,OACEQ,EAAAA,IAACC,EAAAA,aAAA,CACE,GAAGP,EACJ,OAAQC,EACR,YAAaC,EACb,OAAAC,CAAA,CAAA,CAGN"}
@@ -0,0 +1,40 @@
1
+ import { jsx as f } from "react/jsx-runtime";
2
+ import { useMemo as p } from "react";
3
+ import { Chromatogram as u } from "../Chromatogram/Chromatogram.js";
4
+ import { applyStackingTransform as y } from "./transforms.js";
5
+ function x({
6
+ series: o,
7
+ stackingMode: r = "overlay",
8
+ stackOffset: m = 0,
9
+ stackingOrder: t = "first-on-bottom",
10
+ annotations: n,
11
+ ...a
12
+ }) {
13
+ const {
14
+ series: e,
15
+ annotations: i,
16
+ yRange: s
17
+ } = p(
18
+ () => y(
19
+ o,
20
+ n,
21
+ r,
22
+ m,
23
+ t
24
+ ),
25
+ [o, n, r, m, t]
26
+ );
27
+ return /* @__PURE__ */ f(
28
+ u,
29
+ {
30
+ ...a,
31
+ series: e,
32
+ annotations: i,
33
+ yRange: s
34
+ }
35
+ );
36
+ }
37
+ export {
38
+ x as StackedChromatogram
39
+ };
40
+ //# sourceMappingURL=StackedChromatogram.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"StackedChromatogram.js","sources":["../../../../src/components/charts/StackedChromatogram/StackedChromatogram.tsx"],"sourcesContent":["import { useMemo } from \"react\";\n\nimport { Chromatogram } from \"../Chromatogram\";\n\nimport { applyStackingTransform } from \"./transforms\";\n\nimport type { StackedChromatogramProps } from \"./types\";\n\nexport function StackedChromatogram({\n series,\n stackingMode = \"overlay\",\n stackOffset = 0,\n stackingOrder = \"first-on-bottom\",\n annotations,\n ...restProps\n}: StackedChromatogramProps) {\n const {\n series: transformedSeries,\n annotations: transformedAnnotations,\n yRange,\n } = useMemo(\n () =>\n applyStackingTransform(\n series,\n annotations,\n stackingMode,\n stackOffset,\n stackingOrder\n ),\n [series, annotations, stackingMode, stackOffset, stackingOrder]\n );\n\n return (\n <Chromatogram\n {...restProps}\n series={transformedSeries}\n annotations={transformedAnnotations}\n yRange={yRange}\n />\n );\n}\n\nexport default StackedChromatogram;\n"],"names":["StackedChromatogram","series","stackingMode","stackOffset","stackingOrder","annotations","restProps","transformedSeries","transformedAnnotations","yRange","useMemo","applyStackingTransform","jsx","Chromatogram"],"mappings":";;;;AAQO,SAASA,EAAoB;AAAA,EAClC,QAAAC;AAAA,EACA,cAAAC,IAAe;AAAA,EACf,aAAAC,IAAc;AAAA,EACd,eAAAC,IAAgB;AAAA,EAChB,aAAAC;AAAA,EACA,GAAGC;AACL,GAA6B;AAC3B,QAAM;AAAA,IACJ,QAAQC;AAAA,IACR,aAAaC;AAAA,IACb,QAAAC;AAAA,EAAA,IACEC;AAAA,IACF,MACEC;AAAA,MACEV;AAAA,MACAI;AAAA,MACAH;AAAA,MACAC;AAAA,MACAC;AAAA,IAAA;AAAA,IAEJ,CAACH,GAAQI,GAAaH,GAAcC,GAAaC,CAAa;AAAA,EAAA;AAGhE,SACE,gBAAAQ;AAAA,IAACC;AAAA,IAAA;AAAA,MACE,GAAGP;AAAA,MACJ,QAAQC;AAAA,MACR,aAAaC;AAAA,MACb,QAAAC;AAAA,IAAA;AAAA,EAAA;AAGN;"}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"transforms.cjs","sources":["../../../../src/components/charts/StackedChromatogram/transforms.ts"],"sourcesContent":["import type { ChromatogramSeries, PeakAnnotation } from \"../Chromatogram\";\nimport type { StackingMode } from \"./types\";\n\ninterface TransformResult {\n series: ChromatogramSeries[];\n annotations: PeakAnnotation[];\n yRange: [number, number];\n}\n\nexport function applyStackingTransform(\n inputSeries: ChromatogramSeries[],\n inputAnnotations: PeakAnnotation[][] | undefined,\n mode: StackingMode,\n stackOffset: number,\n stackingOrder: \"first-on-bottom\" | \"first-on-top\" = \"first-on-bottom\"\n): TransformResult {\n const yValues = inputSeries.flatMap((s) => s.y);\n const yMin = Math.min(...yValues, 0);\n const yMax = Math.max(...yValues);\n const consistentYRange: [number, number] = [yMin, yMax];\n\n if (mode === \"overlay\") {\n return {\n series: inputSeries,\n annotations: inputAnnotations ? inputAnnotations.flat() : [],\n yRange: consistentYRange,\n };\n }\n\n // 'stack' mode: shift each series up by its index × stackOffset\n const N = inputSeries.length;\n const yShiftForIndex = (index: number): number =>\n stackingOrder === \"first-on-top\"\n ? (N - 1 - index) * stackOffset\n : index * stackOffset;\n\n const offsetSeries: ChromatogramSeries[] = inputSeries.map(\n (series, index) => ({\n ...series,\n y: series.y.map((yVal) => yVal + yShiftForIndex(index)),\n })\n );\n\n const offsetAnnotations: PeakAnnotation[] = [];\n if (inputAnnotations) {\n inputAnnotations.forEach((seriesAnnotations, seriesIndex) => {\n const yShift = yShiftForIndex(seriesIndex);\n seriesAnnotations.forEach((ann) => {\n offsetAnnotations.push({ ...ann, y: ann.y + yShift });\n });\n });\n }\n\n const allYValues = offsetSeries.flatMap((s) => s.y);\n const annotationYValues = offsetAnnotations.map((a) => a.y);\n const stackedYMin = Math.min(...allYValues, ...annotationYValues, 0);\n const stackedYMax = Math.max(...allYValues, ...annotationYValues);\n\n return {\n series: offsetSeries,\n annotations: offsetAnnotations,\n yRange: [stackedYMin, stackedYMax],\n };\n}\n"],"names":["applyStackingTransform","inputSeries","inputAnnotations","mode","stackOffset","stackingOrder","yValues","s","yMin","yMax","consistentYRange","N","yShiftForIndex","index","offsetSeries","series","yVal","offsetAnnotations","seriesAnnotations","seriesIndex","yShift","ann","allYValues","annotationYValues","a","stackedYMin","stackedYMax"],"mappings":"gFASO,SAASA,EACdC,EACAC,EACAC,EACAC,EACAC,EAAoD,kBACnC,CACjB,MAAMC,EAAUL,EAAY,QAASM,GAAMA,EAAE,CAAC,EACxCC,EAAO,KAAK,IAAI,GAAGF,EAAS,CAAC,EAC7BG,EAAO,KAAK,IAAI,GAAGH,CAAO,EAC1BI,EAAqC,CAACF,EAAMC,CAAI,EAEtD,GAAIN,IAAS,UACX,MAAO,CACL,OAAQF,EACR,YAAaC,EAAmBA,EAAiB,KAAA,EAAS,CAAA,EAC1D,OAAQQ,CAAA,EAKZ,MAAMC,EAAIV,EAAY,OAChBW,EAAkBC,GACtBR,IAAkB,gBACbM,EAAI,EAAIE,GAAST,EAClBS,EAAQT,EAERU,EAAqCb,EAAY,IACrD,CAACc,EAAQF,KAAW,CAClB,GAAGE,EACH,EAAGA,EAAO,EAAE,IAAKC,GAASA,EAAOJ,EAAeC,CAAK,CAAC,CAAA,EACxD,EAGII,EAAsC,CAAA,EACxCf,GACFA,EAAiB,QAAQ,CAACgB,EAAmBC,IAAgB,CAC3D,MAAMC,EAASR,EAAeO,CAAW,EACzCD,EAAkB,QAASG,GAAQ,CACjCJ,EAAkB,KAAK,CAAE,GAAGI,EAAK,EAAGA,EAAI,EAAID,EAAQ,CACtD,CAAC,CACH,CAAC,EAGH,MAAME,EAAaR,EAAa,QAASP,GAAMA,EAAE,CAAC,EAC5CgB,EAAoBN,EAAkB,IAAKO,GAAMA,EAAE,CAAC,EACpDC,EAAc,KAAK,IAAI,GAAGH,EAAY,GAAGC,EAAmB,CAAC,EAC7DG,EAAc,KAAK,IAAI,GAAGJ,EAAY,GAAGC,CAAiB,EAEhE,MAAO,CACL,OAAQT,EACR,YAAaG,EACb,OAAQ,CAACQ,EAAaC,CAAW,CAAA,CAErC"}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"transforms.js","sources":["../../../../src/components/charts/StackedChromatogram/transforms.ts"],"sourcesContent":["import type { ChromatogramSeries, PeakAnnotation } from \"../Chromatogram\";\nimport type { StackingMode } from \"./types\";\n\ninterface TransformResult {\n series: ChromatogramSeries[];\n annotations: PeakAnnotation[];\n yRange: [number, number];\n}\n\nexport function applyStackingTransform(\n inputSeries: ChromatogramSeries[],\n inputAnnotations: PeakAnnotation[][] | undefined,\n mode: StackingMode,\n stackOffset: number,\n stackingOrder: \"first-on-bottom\" | \"first-on-top\" = \"first-on-bottom\"\n): TransformResult {\n const yValues = inputSeries.flatMap((s) => s.y);\n const yMin = Math.min(...yValues, 0);\n const yMax = Math.max(...yValues);\n const consistentYRange: [number, number] = [yMin, yMax];\n\n if (mode === \"overlay\") {\n return {\n series: inputSeries,\n annotations: inputAnnotations ? inputAnnotations.flat() : [],\n yRange: consistentYRange,\n };\n }\n\n // 'stack' mode: shift each series up by its index × stackOffset\n const N = inputSeries.length;\n const yShiftForIndex = (index: number): number =>\n stackingOrder === \"first-on-top\"\n ? (N - 1 - index) * stackOffset\n : index * stackOffset;\n\n const offsetSeries: ChromatogramSeries[] = inputSeries.map(\n (series, index) => ({\n ...series,\n y: series.y.map((yVal) => yVal + yShiftForIndex(index)),\n })\n );\n\n const offsetAnnotations: PeakAnnotation[] = [];\n if (inputAnnotations) {\n inputAnnotations.forEach((seriesAnnotations, seriesIndex) => {\n const yShift = yShiftForIndex(seriesIndex);\n seriesAnnotations.forEach((ann) => {\n offsetAnnotations.push({ ...ann, y: ann.y + yShift });\n });\n });\n }\n\n const allYValues = offsetSeries.flatMap((s) => s.y);\n const annotationYValues = offsetAnnotations.map((a) => a.y);\n const stackedYMin = Math.min(...allYValues, ...annotationYValues, 0);\n const stackedYMax = Math.max(...allYValues, ...annotationYValues);\n\n return {\n series: offsetSeries,\n annotations: offsetAnnotations,\n yRange: [stackedYMin, stackedYMax],\n };\n}\n"],"names":["applyStackingTransform","inputSeries","inputAnnotations","mode","stackOffset","stackingOrder","yValues","s","yMin","yMax","consistentYRange","N","yShiftForIndex","index","offsetSeries","series","yVal","offsetAnnotations","seriesAnnotations","seriesIndex","yShift","ann","allYValues","annotationYValues","stackedYMin","stackedYMax"],"mappings":"AASO,SAASA,EACdC,GACAC,GACAC,GACAC,GACAC,IAAoD,mBACnC;AACjB,QAAMC,IAAUL,EAAY,QAAQ,CAACM,MAAMA,EAAE,CAAC,GACxCC,IAAO,KAAK,IAAI,GAAGF,GAAS,CAAC,GAC7BG,IAAO,KAAK,IAAI,GAAGH,CAAO,GAC1BI,IAAqC,CAACF,GAAMC,CAAI;AAEtD,MAAIN,MAAS;AACX,WAAO;AAAA,MACL,QAAQF;AAAA,MACR,aAAaC,IAAmBA,EAAiB,KAAA,IAAS,CAAA;AAAA,MAC1D,QAAQQ;AAAA,IAAA;AAKZ,QAAMC,IAAIV,EAAY,QAChBW,IAAiB,CAACC,MACtBR,MAAkB,kBACbM,IAAI,IAAIE,KAAST,IAClBS,IAAQT,GAERU,IAAqCb,EAAY;AAAA,IACrD,CAACc,GAAQF,OAAW;AAAA,MAClB,GAAGE;AAAA,MACH,GAAGA,EAAO,EAAE,IAAI,CAACC,MAASA,IAAOJ,EAAeC,CAAK,CAAC;AAAA,IAAA;AAAA,EACxD,GAGII,IAAsC,CAAA;AAC5C,EAAIf,KACFA,EAAiB,QAAQ,CAACgB,GAAmBC,MAAgB;AAC3D,UAAMC,IAASR,EAAeO,CAAW;AACzC,IAAAD,EAAkB,QAAQ,CAACG,MAAQ;AACjC,MAAAJ,EAAkB,KAAK,EAAE,GAAGI,GAAK,GAAGA,EAAI,IAAID,GAAQ;AAAA,IACtD,CAAC;AAAA,EACH,CAAC;AAGH,QAAME,IAAaR,EAAa,QAAQ,CAACP,MAAMA,EAAE,CAAC,GAC5CgB,IAAoBN,EAAkB,IAAI,CAAC,MAAM,EAAE,CAAC,GACpDO,IAAc,KAAK,IAAI,GAAGF,GAAY,GAAGC,GAAmB,CAAC,GAC7DE,IAAc,KAAK,IAAI,GAAGH,GAAY,GAAGC,CAAiB;AAEhE,SAAO;AAAA,IACL,QAAQT;AAAA,IACR,aAAaG;AAAA,IACb,QAAQ,CAACO,GAAaC,CAAW;AAAA,EAAA;AAErC;"}
@@ -0,0 +1,2 @@
1
+ "use strict";var c=Object.create;var d=Object.defineProperty;var s=Object.getOwnPropertyDescriptor;var y=Object.getOwnPropertyNames;var u=Object.getPrototypeOf,p=Object.prototype.hasOwnProperty;var P=(t,e,l,a)=>{if(e&&typeof e=="object"||typeof e=="function")for(let o of y(e))!p.call(t,o)&&o!==l&&d(t,o,{get:()=>e[o],enumerable:!(a=s(e,o))||a.enumerable});return t};var f=(t,e,l)=>(l=t!=null?c(u(t)):{},P(e||!t||!t.__esModule?d(l,"default",{value:t,enumerable:!0}):l,t));Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const i="Failed to load 'plotly.js-dist'. It is an optional peer dependency of @tetrascience-npm/tetrascience-react-ui required by the chart components — install it in your app (e.g. `yarn add plotly.js-dist`).";let r=null,n=null;function h(){return n??=import("plotly.js-dist").then(t=>{const e=t;return r=e.default??e,r}).catch(t=>{throw n=null,console.error(i,t),new Error(i)}),n}function w(){if(!r)throw new Error("Plotly accessed before loadPlotly() resolved. Call loadPlotly() and draw the plot first.");return r}exports.getLoadedPlotly=w;exports.loadPlotly=h;
2
+ //# sourceMappingURL=plotly-loader.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"plotly-loader.cjs","sources":["../../../src/components/charts/plotly-loader.ts"],"sourcesContent":["/**\n * Lazy Plotly loader (SW-2007).\n *\n * The kit ships preserved ES modules with all dependencies externalized, so a\n * static `import Plotly from \"plotly.js-dist\"` in any chart lands the full\n * ~4.7 MB Plotly dist in the consumer's main chunk — before any chart renders.\n * Loading it through this module's dynamic `import()` instead lets consumer\n * bundlers split Plotly into its own chunk, fetched only when a chart mounts.\n *\n * Chart components must call `loadPlotly()` before drawing. Code that only\n * runs after a plot exists (hover handlers, resize relayouts, unmount purges)\n * can use the synchronous `getLoadedPlotly()`.\n *\n * `plotly.js-dist` is an *optional* peer dependency (SW-2007): consumers that\n * use the kit's charts must add it to their own app; consumers that don't\n * never install its ~4.7 MB. A missing peer surfaces at build time as an\n * unresolved-import error from the consumer's bundler; the runtime guard below\n * covers the rarer case where the import resolves but fails to evaluate.\n */\n\ntype PlotlyModule = typeof import(\"plotly.js-dist\");\n\nconst MISSING_PLOTLY_MESSAGE =\n \"Failed to load 'plotly.js-dist'. It is an optional peer dependency of \" +\n \"@tetrascience-npm/tetrascience-react-ui required by the chart components — \" +\n \"install it in your app (e.g. `yarn add plotly.js-dist`).\";\n\nlet loadedPlotly: PlotlyModule | null = null;\nlet plotlyPromise: Promise<PlotlyModule> | null = null;\n\n/** Import Plotly on first use; subsequent calls reuse the same promise. */\nexport function loadPlotly(): Promise<PlotlyModule> {\n plotlyPromise ??= import(\"plotly.js-dist\")\n .then((mod) => {\n // plotly.js-dist is CJS; depending on the consumer's bundler interop the\n // API surface is either the namespace itself or its `default` export.\n const withDefault = mod as PlotlyModule & { default?: PlotlyModule };\n loadedPlotly = withDefault.default ?? withDefault;\n return loadedPlotly;\n })\n .catch((error: unknown) => {\n // Reset so a later mount can retry, and rethrow with install guidance.\n plotlyPromise = null;\n console.error(MISSING_PLOTLY_MESSAGE, error);\n throw new Error(MISSING_PLOTLY_MESSAGE);\n });\n return plotlyPromise;\n}\n\n/**\n * Synchronous access to the loaded Plotly module. Only valid after\n * `loadPlotly()` has resolved — i.e. in code paths that can only run once a\n * plot has been drawn (event handlers, cleanups, resize effects).\n */\nexport function getLoadedPlotly(): PlotlyModule {\n if (!loadedPlotly) {\n throw new Error(\n \"Plotly accessed before loadPlotly() resolved. Call loadPlotly() and draw the plot first.\",\n );\n }\n return loadedPlotly;\n}\n\nexport type { PlotlyModule };\n"],"names":["MISSING_PLOTLY_MESSAGE","loadedPlotly","plotlyPromise","loadPlotly","mod","withDefault","error","getLoadedPlotly"],"mappings":"2hBAsBA,MAAMA,EACJ,4MAIF,IAAIC,EAAoC,KACpCC,EAA8C,KAG3C,SAASC,GAAoC,CAClD,OAAAD,IAAkB,OAAO,gBAAgB,EACtC,KAAME,GAAQ,CAGb,MAAMC,EAAcD,EACpB,OAAAH,EAAeI,EAAY,SAAWA,EAC/BJ,CACT,CAAC,EACA,MAAOK,GAAmB,CAEzB,MAAAJ,EAAgB,KAChB,QAAQ,MAAMF,EAAwBM,CAAK,EACrC,IAAI,MAAMN,CAAsB,CACxC,CAAC,EACIE,CACT,CAOO,SAASK,GAAgC,CAC9C,GAAI,CAACN,EACH,MAAM,IAAI,MACR,0FAAA,EAGJ,OAAOA,CACT"}
@@ -0,0 +1,22 @@
1
+ const r = "Failed to load 'plotly.js-dist'. It is an optional peer dependency of @tetrascience-npm/tetrascience-react-ui required by the chart components — install it in your app (e.g. `yarn add plotly.js-dist`).";
2
+ let t = null, l = null;
3
+ function n() {
4
+ return l ??= import("plotly.js-dist").then((e) => {
5
+ const o = e;
6
+ return t = o.default ?? o, t;
7
+ }).catch((e) => {
8
+ throw l = null, console.error(r, e), new Error(r);
9
+ }), l;
10
+ }
11
+ function a() {
12
+ if (!t)
13
+ throw new Error(
14
+ "Plotly accessed before loadPlotly() resolved. Call loadPlotly() and draw the plot first."
15
+ );
16
+ return t;
17
+ }
18
+ export {
19
+ a as getLoadedPlotly,
20
+ n as loadPlotly
21
+ };
22
+ //# sourceMappingURL=plotly-loader.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"plotly-loader.js","sources":["../../../src/components/charts/plotly-loader.ts"],"sourcesContent":["/**\n * Lazy Plotly loader (SW-2007).\n *\n * The kit ships preserved ES modules with all dependencies externalized, so a\n * static `import Plotly from \"plotly.js-dist\"` in any chart lands the full\n * ~4.7 MB Plotly dist in the consumer's main chunk — before any chart renders.\n * Loading it through this module's dynamic `import()` instead lets consumer\n * bundlers split Plotly into its own chunk, fetched only when a chart mounts.\n *\n * Chart components must call `loadPlotly()` before drawing. Code that only\n * runs after a plot exists (hover handlers, resize relayouts, unmount purges)\n * can use the synchronous `getLoadedPlotly()`.\n *\n * `plotly.js-dist` is an *optional* peer dependency (SW-2007): consumers that\n * use the kit's charts must add it to their own app; consumers that don't\n * never install its ~4.7 MB. A missing peer surfaces at build time as an\n * unresolved-import error from the consumer's bundler; the runtime guard below\n * covers the rarer case where the import resolves but fails to evaluate.\n */\n\ntype PlotlyModule = typeof import(\"plotly.js-dist\");\n\nconst MISSING_PLOTLY_MESSAGE =\n \"Failed to load 'plotly.js-dist'. It is an optional peer dependency of \" +\n \"@tetrascience-npm/tetrascience-react-ui required by the chart components — \" +\n \"install it in your app (e.g. `yarn add plotly.js-dist`).\";\n\nlet loadedPlotly: PlotlyModule | null = null;\nlet plotlyPromise: Promise<PlotlyModule> | null = null;\n\n/** Import Plotly on first use; subsequent calls reuse the same promise. */\nexport function loadPlotly(): Promise<PlotlyModule> {\n plotlyPromise ??= import(\"plotly.js-dist\")\n .then((mod) => {\n // plotly.js-dist is CJS; depending on the consumer's bundler interop the\n // API surface is either the namespace itself or its `default` export.\n const withDefault = mod as PlotlyModule & { default?: PlotlyModule };\n loadedPlotly = withDefault.default ?? withDefault;\n return loadedPlotly;\n })\n .catch((error: unknown) => {\n // Reset so a later mount can retry, and rethrow with install guidance.\n plotlyPromise = null;\n console.error(MISSING_PLOTLY_MESSAGE, error);\n throw new Error(MISSING_PLOTLY_MESSAGE);\n });\n return plotlyPromise;\n}\n\n/**\n * Synchronous access to the loaded Plotly module. Only valid after\n * `loadPlotly()` has resolved — i.e. in code paths that can only run once a\n * plot has been drawn (event handlers, cleanups, resize effects).\n */\nexport function getLoadedPlotly(): PlotlyModule {\n if (!loadedPlotly) {\n throw new Error(\n \"Plotly accessed before loadPlotly() resolved. Call loadPlotly() and draw the plot first.\",\n );\n }\n return loadedPlotly;\n}\n\nexport type { PlotlyModule };\n"],"names":["MISSING_PLOTLY_MESSAGE","loadedPlotly","plotlyPromise","loadPlotly","mod","withDefault","error","getLoadedPlotly"],"mappings":"AAsBA,MAAMA,IACJ;AAIF,IAAIC,IAAoC,MACpCC,IAA8C;AAG3C,SAASC,IAAoC;AAClD,SAAAD,MAAkB,OAAO,gBAAgB,EACtC,KAAK,CAACE,MAAQ;AAGb,UAAMC,IAAcD;AACpB,WAAAH,IAAeI,EAAY,WAAWA,GAC/BJ;AAAA,EACT,CAAC,EACA,MAAM,CAACK,MAAmB;AAEzB,UAAAJ,IAAgB,MAChB,QAAQ,MAAMF,GAAwBM,CAAK,GACrC,IAAI,MAAMN,CAAsB;AAAA,EACxC,CAAC,GACIE;AACT;AAOO,SAASK,IAAgC;AAC9C,MAAI,CAACN;AACH,UAAM,IAAI;AAAA,MACR;AAAA,IAAA;AAGJ,SAAOA;AACT;"}
@@ -0,0 +1,2 @@
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const s=require("react/jsx-runtime"),j=require("lucide-react"),k=require("react"),p=require("./dockLayout.cjs"),D=require("../../ui/button.cjs"),x=require("../../ui/resizable.cjs"),u=require("../../../lib/utils.cjs");function L(n){const t=Object.create(null,{[Symbol.toStringTag]:{value:"Module"}});if(n){for(const e in n)if(e!=="default"){const o=Object.getOwnPropertyDescriptor(n,e);Object.defineProperty(t,e,o.get?o:{enumerable:!0,get:()=>n[e]})}}return t.default=n,Object.freeze(t)}const l=L(k),N=l.createContext(null);function I(n,t){if(typeof window>"u")return t;const e=window.localStorage.getItem(`${n}.dock`);return e==="right"||e==="bottom"||e==="left"?e:t}function C(n,t){if(typeof window>"u")return t;const e=Number(window.localStorage.getItem(`${n}.size`));return!Number.isFinite(e)||e<=0||e>=100?t:e}function R({children:n,storageKey:t="ts-ui.assistant",defaultDock:e="left",defaultSize:o=32,defaultVisible:f=!0,persist:i=!0}){const[a,c]=l.useState(()=>i?I(t,e):e),[m,r]=l.useState(()=>i?C(t,o):o),[h,S]=l.useState(f),w=l.useCallback(d=>{c(d),i&&typeof window<"u"&&window.localStorage.setItem(`${t}.dock`,d)},[t,i]),b=l.useCallback(d=>{r(d),i&&typeof window<"u"&&window.localStorage.setItem(`${t}.size`,String(Math.round(d)))},[t,i]),v=l.useMemo(()=>({dock:a,setDock:w,size:m,setSize:b,visible:h,setVisible:S}),[a,w,m,b,h]);return s.jsx(N.Provider,{value:v,children:n})}function y(){const n=l.useContext(N);if(!n)throw new Error("useAssistantLayout must be used within an AssistantLayoutProvider");return n}const O=[{value:"left",label:"Dock assistant left",Icon:j.PanelLeft},{value:"bottom",label:"Dock assistant bottom",Icon:j.PanelBottom},{value:"right",label:"Dock assistant right",Icon:j.PanelRight}];function _({label:n="AI Assistant",className:t}){const{dock:e,setDock:o,visible:f,setVisible:i}=y();return s.jsxs("div",{className:u.cn("flex items-center gap-2",t),children:[n!=null&&s.jsx("span",{className:"text-sm font-medium",children:n}),s.jsx("div",{className:"inline-flex overflow-hidden rounded-lg border border-border",children:O.map(({value:a,label:c,Icon:m})=>{const r=f&&e===a;return s.jsx(D.Button,{variant:r?"secondary":"ghost",size:"icon-sm",className:"rounded-none bg-clip-border","aria-label":r?"Hide AI Assistant":c,"aria-pressed":r,title:r?"Hide AI Assistant":c,onClick:()=>{r?i(!1):(o(a),i(!0))},children:s.jsx(m,{className:"size-4"})},a)})})]})}const A="flex min-h-0 min-w-0 p-2",g="flex h-full min-h-0 min-w-0 flex-1 flex-col overflow-hidden rounded-lg border border-border bg-card",z="assistant";function q({assistant:n,children:t,minSize:e=20,maxSize:o=70,className:f,assistantClassName:i,contentClassName:a}){const{dock:c,size:m,setSize:r,visible:h}=y(),{orientation:S,assistantFirst:w}=p.dockPanels(c);if(!h)return s.jsx("div",{"data-slot":"assistant-layout",className:u.cn("flex min-h-0 flex-1 overflow-hidden",f),children:s.jsx("div",{className:u.cn(A,"flex-1"),children:s.jsx("div",{"data-slot":"assistant-layout-content",className:u.cn(g,a),children:t})})});const b=s.jsx(x.ResizablePanel,{id:z,defaultSize:`${m}%`,minSize:`${e}%`,maxSize:`${o}%`,className:A,children:s.jsx("div",{"data-slot":"assistant-layout-assistant",className:u.cn(g,i),children:n})}),v=s.jsx(x.ResizablePanel,{id:"content",className:A,children:s.jsx("div",{"data-slot":"assistant-layout-content",className:u.cn(g,a),children:t})});return s.jsx(x.ResizablePanelGroup,{orientation:S,"data-slot":"assistant-layout",className:u.cn("min-h-0 flex-1 overflow-hidden",f),onLayoutChanged:d=>{const P=d[z];typeof P=="number"&&r(P)},children:w?s.jsxs(s.Fragment,{children:[b,s.jsx(x.ResizableHandle,{withHandle:!0}),v]}):s.jsxs(s.Fragment,{children:[v,s.jsx(x.ResizableHandle,{withHandle:!0}),b]})},c)}exports.AssistantDockControls=_;exports.AssistantLayout=q;exports.AssistantLayoutProvider=R;exports.useAssistantLayout=y;
2
+ //# sourceMappingURL=AssistantLayout.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AssistantLayout.cjs","sources":["../../../../src/components/composed/AssistantLayout/AssistantLayout.tsx"],"sourcesContent":["\"use client\"\n\nimport { PanelBottom, PanelLeft, PanelRight } from \"lucide-react\"\nimport * as React from \"react\"\n\nimport { dockPanels, type AssistantDock } from \"./dockLayout\"\n\nimport { Button } from \"@/components/ui/button\"\nimport {\n ResizableHandle,\n ResizablePanel,\n ResizablePanelGroup,\n} from \"@/components/ui/resizable\"\nimport { cn } from \"@/lib/utils\"\n\n// ---------------------------------------------------------------------------\n// Context + provider\n// ---------------------------------------------------------------------------\n\ninterface AssistantLayoutContextValue {\n /** Where the assistant docks. Persisted. */\n dock: AssistantDock\n setDock: (dock: AssistantDock) => void\n /** Assistant size as a percentage of the layout along the dock axis. Persisted. */\n size: number\n setSize: (size: number) => void\n /** Whether the assistant is shown. In-memory by default (resets to visible on reload). */\n visible: boolean\n setVisible: (visible: boolean) => void\n}\n\nconst AssistantLayoutContext = React.createContext<AssistantLayoutContextValue | null>(null)\n\nexport interface AssistantLayoutProviderProps {\n children: React.ReactNode\n /** localStorage key prefix for the persisted dock + size. */\n storageKey?: string\n /** Default dock when nothing is persisted. */\n defaultDock?: AssistantDock\n /** Default assistant size as a percentage (1–99) of the layout. */\n defaultSize?: number\n /** Whether the assistant starts visible. */\n defaultVisible?: boolean\n /** Persist dock + size to localStorage. Defaults to `true`. */\n persist?: boolean\n}\n\nfunction readDock(key: string, fallback: AssistantDock): AssistantDock {\n if (typeof window === \"undefined\") return fallback\n const v = window.localStorage.getItem(`${key}.dock`)\n return v === \"right\" || v === \"bottom\" || v === \"left\" ? v : fallback\n}\n\nfunction readSize(key: string, fallback: number): number {\n if (typeof window === \"undefined\") return fallback\n const v = Number(window.localStorage.getItem(`${key}.size`))\n // Persisted as a percentage; ignore anything outside the open (0, 100) range.\n if (!Number.isFinite(v) || v <= 0 || v >= 100) return fallback\n return v\n}\n\nexport function AssistantLayoutProvider({\n children,\n storageKey = \"ts-ui.assistant\",\n defaultDock = \"left\",\n defaultSize = 32,\n defaultVisible = true,\n persist = true,\n}: AssistantLayoutProviderProps) {\n const [dock, setDockState] = React.useState<AssistantDock>(() =>\n persist ? readDock(storageKey, defaultDock) : defaultDock\n )\n const [size, setSizeState] = React.useState<number>(() =>\n persist ? readSize(storageKey, defaultSize) : defaultSize\n )\n const [visible, setVisible] = React.useState(defaultVisible)\n\n const setDock = React.useCallback(\n (next: AssistantDock) => {\n setDockState(next)\n if (persist && typeof window !== \"undefined\")\n window.localStorage.setItem(`${storageKey}.dock`, next)\n },\n [storageKey, persist]\n )\n\n const setSize = React.useCallback(\n (next: number) => {\n setSizeState(next)\n if (persist && typeof window !== \"undefined\")\n window.localStorage.setItem(`${storageKey}.size`, String(Math.round(next)))\n },\n [storageKey, persist]\n )\n\n const value = React.useMemo(\n () => ({ dock, setDock, size, setSize, visible, setVisible }),\n [dock, setDock, size, setSize, visible]\n )\n\n return <AssistantLayoutContext.Provider value={value}>{children}</AssistantLayoutContext.Provider>\n}\n\nexport function useAssistantLayout(): AssistantLayoutContextValue {\n const ctx = React.useContext(AssistantLayoutContext)\n if (!ctx) throw new Error(\"useAssistantLayout must be used within an AssistantLayoutProvider\")\n return ctx\n}\n\n// ---------------------------------------------------------------------------\n// Dock controls (segmented icon control for a top bar)\n// ---------------------------------------------------------------------------\n\nconst DOCK_OPTIONS: { value: AssistantDock; label: string; Icon: typeof PanelLeft }[] = [\n { value: \"left\", label: \"Dock assistant left\", Icon: PanelLeft },\n { value: \"bottom\", label: \"Dock assistant bottom\", Icon: PanelBottom },\n { value: \"right\", label: \"Dock assistant right\", Icon: PanelRight },\n]\n\nexport interface AssistantDockControlsProps {\n /** Label shown before the icons. Pass `null` to hide it. */\n label?: React.ReactNode\n className?: string\n}\n\n/**\n * Segmented control of dock icons. Clicking an inactive icon docks + shows the\n * assistant there; clicking the active icon again hides it.\n */\nexport function AssistantDockControls({ label = \"AI Assistant\", className }: AssistantDockControlsProps) {\n const { dock, setDock, visible, setVisible } = useAssistantLayout()\n\n return (\n <div className={cn(\"flex items-center gap-2\", className)}>\n {label != null && <span className=\"text-sm font-medium\">{label}</span>}\n <div className=\"inline-flex overflow-hidden rounded-lg border border-border\">\n {DOCK_OPTIONS.map(({ value, label: optionLabel, Icon }) => {\n const active = visible && dock === value\n return (\n <Button\n key={value}\n variant={active ? \"secondary\" : \"ghost\"}\n size=\"icon-sm\"\n // bg-clip-border so the filled (active/hover) state reaches the\n // cell edge instead of leaving a 1px gap from the button's\n // transparent border + default bg-clip-padding.\n className=\"rounded-none bg-clip-border\"\n aria-label={active ? \"Hide AI Assistant\" : optionLabel}\n aria-pressed={active}\n title={active ? \"Hide AI Assistant\" : optionLabel}\n onClick={() => {\n if (active) setVisible(false)\n else {\n setDock(value)\n setVisible(true)\n }\n }}\n >\n <Icon className=\"size-4\" />\n </Button>\n )\n })}\n </div>\n </div>\n )\n}\n\n// ---------------------------------------------------------------------------\n// Layout body\n// ---------------------------------------------------------------------------\n\n// Each panel is padded so the resize handle sits in a comfortable gutter between\n// the cards rather than a hairline seam (SW-2096). The padding lives inside the\n// panel box, so react-resizable-panels' flex sizing is unaffected.\nconst PANEL_PAD = \"flex min-h-0 min-w-0 p-2\"\n// The visible card surface rendered inside each panel.\nconst CARD_CLASS =\n \"flex h-full min-h-0 min-w-0 flex-1 flex-col overflow-hidden rounded-lg border border-border bg-card\"\n\nconst ASSISTANT_PANEL_ID = \"assistant\"\n\nexport interface AssistantLayoutProps {\n /** The AI Assistant panel content (e.g. a `<Chat />`). */\n assistant: React.ReactNode\n /** The main content; fills the remaining space (and the whole body when the assistant is hidden). */\n children: React.ReactNode\n /** Min assistant size as a percentage of the layout. */\n minSize?: number\n /** Max assistant size as a percentage of the layout. */\n maxSize?: number\n className?: string\n assistantClassName?: string\n contentClassName?: string\n}\n\n/**\n * Docks the assistant left / right / bottom of the main content and resizes it\n * with the design-system `Resizable` (react-resizable-panels). Must be rendered\n * inside an `AssistantLayoutProvider`; pair with `AssistantDockControls`.\n *\n * The group is keyed by `dock`, so changing dock remounts the panels. The\n * assistant panel is therefore re-created on redock (its transient state is not\n * preserved across a dock change) — a deliberate trade-off for using the shared\n * resizable primitive rather than a bespoke splitter.\n */\nexport function AssistantLayout({\n assistant,\n children,\n minSize = 20,\n maxSize = 70,\n className,\n assistantClassName,\n contentClassName,\n}: AssistantLayoutProps) {\n const { dock, size, setSize, visible } = useAssistantLayout()\n const { orientation, assistantFirst } = dockPanels(dock)\n\n // Hidden: no resizable group, content fills the whole body.\n if (!visible) {\n return (\n <div\n data-slot=\"assistant-layout\"\n className={cn(\"flex min-h-0 flex-1 overflow-hidden\", className)}\n >\n {/* flex-1 so the lone content panel fills the width (the ResizablePanel\n self-sizes when visible; this plain div needs to be told to grow).\n Padded to match the inset the visible panels carry. */}\n <div className={cn(PANEL_PAD, \"flex-1\")}>\n <div data-slot=\"assistant-layout-content\" className={cn(CARD_CLASS, contentClassName)}>\n {children}\n </div>\n </div>\n </div>\n )\n }\n\n const assistantPanel = (\n <ResizablePanel\n id={ASSISTANT_PANEL_ID}\n defaultSize={`${size}%`}\n minSize={`${minSize}%`}\n maxSize={`${maxSize}%`}\n className={PANEL_PAD}\n >\n <div data-slot=\"assistant-layout-assistant\" className={cn(CARD_CLASS, assistantClassName)}>\n {assistant}\n </div>\n </ResizablePanel>\n )\n\n const contentPanel = (\n <ResizablePanel id=\"content\" className={PANEL_PAD}>\n <div data-slot=\"assistant-layout-content\" className={cn(CARD_CLASS, contentClassName)}>\n {children}\n </div>\n </ResizablePanel>\n )\n\n return (\n <ResizablePanelGroup\n key={dock}\n orientation={orientation}\n data-slot=\"assistant-layout\"\n className={cn(\"min-h-0 flex-1 overflow-hidden\", className)}\n onLayoutChanged={(layout) => {\n const pct = layout[ASSISTANT_PANEL_ID]\n if (typeof pct === \"number\") setSize(pct)\n }}\n >\n {assistantFirst ? (\n <>\n {assistantPanel}\n <ResizableHandle withHandle />\n {contentPanel}\n </>\n ) : (\n <>\n {contentPanel}\n <ResizableHandle withHandle />\n {assistantPanel}\n </>\n )}\n </ResizablePanelGroup>\n )\n}\n"],"names":["AssistantLayoutContext","React","readDock","key","fallback","v","readSize","AssistantLayoutProvider","children","storageKey","defaultDock","defaultSize","defaultVisible","persist","dock","setDockState","size","setSizeState","visible","setVisible","setDock","next","setSize","value","jsx","useAssistantLayout","ctx","DOCK_OPTIONS","PanelLeft","PanelBottom","PanelRight","AssistantDockControls","label","className","cn","optionLabel","Icon","active","Button","PANEL_PAD","CARD_CLASS","ASSISTANT_PANEL_ID","AssistantLayout","assistant","minSize","maxSize","assistantClassName","contentClassName","orientation","assistantFirst","dockPanels","assistantPanel","ResizablePanel","contentPanel","ResizablePanelGroup","layout","pct","jsxs","Fragment","ResizableHandle"],"mappings":"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"}
@@ -0,0 +1,142 @@
1
+ import { jsxs as N, jsx as n, Fragment as z } from "react/jsx-runtime";
2
+ import { PanelLeft as D, PanelBottom as C, PanelRight as L } from "lucide-react";
3
+ import * as l from "react";
4
+ import { dockPanels as $ } from "./dockLayout.js";
5
+ import { Button as R } from "../../ui/button.js";
6
+ import { ResizablePanel as P, ResizablePanelGroup as H, ResizableHandle as g } from "../../ui/resizable.js";
7
+ import { cn as d } from "../../../lib/utils.js";
8
+ const y = l.createContext(null);
9
+ function _(s, t) {
10
+ if (typeof window > "u") return t;
11
+ const e = window.localStorage.getItem(`${s}.dock`);
12
+ return e === "right" || e === "bottom" || e === "left" ? e : t;
13
+ }
14
+ function E(s, t) {
15
+ if (typeof window > "u") return t;
16
+ const e = Number(window.localStorage.getItem(`${s}.size`));
17
+ return !Number.isFinite(e) || e <= 0 || e >= 100 ? t : e;
18
+ }
19
+ function G({
20
+ children: s,
21
+ storageKey: t = "ts-ui.assistant",
22
+ defaultDock: e = "left",
23
+ defaultSize: u = 32,
24
+ defaultVisible: m = !0,
25
+ persist: o = !0
26
+ }) {
27
+ const [i, r] = l.useState(
28
+ () => o ? _(t, e) : e
29
+ ), [f, a] = l.useState(
30
+ () => o ? E(t, u) : u
31
+ ), [b, S] = l.useState(m), w = l.useCallback(
32
+ (c) => {
33
+ r(c), o && typeof window < "u" && window.localStorage.setItem(`${t}.dock`, c);
34
+ },
35
+ [t, o]
36
+ ), h = l.useCallback(
37
+ (c) => {
38
+ a(c), o && typeof window < "u" && window.localStorage.setItem(`${t}.size`, String(Math.round(c)));
39
+ },
40
+ [t, o]
41
+ ), v = l.useMemo(
42
+ () => ({ dock: i, setDock: w, size: f, setSize: h, visible: b, setVisible: S }),
43
+ [i, w, f, h, b]
44
+ );
45
+ return /* @__PURE__ */ n(y.Provider, { value: v, children: s });
46
+ }
47
+ function I() {
48
+ const s = l.useContext(y);
49
+ if (!s) throw new Error("useAssistantLayout must be used within an AssistantLayoutProvider");
50
+ return s;
51
+ }
52
+ const F = [
53
+ { value: "left", label: "Dock assistant left", Icon: D },
54
+ { value: "bottom", label: "Dock assistant bottom", Icon: C },
55
+ { value: "right", label: "Dock assistant right", Icon: L }
56
+ ];
57
+ function q({ label: s = "AI Assistant", className: t }) {
58
+ const { dock: e, setDock: u, visible: m, setVisible: o } = I();
59
+ return /* @__PURE__ */ N("div", { className: d("flex items-center gap-2", t), children: [
60
+ s != null && /* @__PURE__ */ n("span", { className: "text-sm font-medium", children: s }),
61
+ /* @__PURE__ */ n("div", { className: "inline-flex overflow-hidden rounded-lg border border-border", children: F.map(({ value: i, label: r, Icon: f }) => {
62
+ const a = m && e === i;
63
+ return /* @__PURE__ */ n(
64
+ R,
65
+ {
66
+ variant: a ? "secondary" : "ghost",
67
+ size: "icon-sm",
68
+ className: "rounded-none bg-clip-border",
69
+ "aria-label": a ? "Hide AI Assistant" : r,
70
+ "aria-pressed": a,
71
+ title: a ? "Hide AI Assistant" : r,
72
+ onClick: () => {
73
+ a ? o(!1) : (u(i), o(!0));
74
+ },
75
+ children: /* @__PURE__ */ n(f, { className: "size-4" })
76
+ },
77
+ i
78
+ );
79
+ }) })
80
+ ] });
81
+ }
82
+ const A = "flex min-h-0 min-w-0 p-2", x = "flex h-full min-h-0 min-w-0 flex-1 flex-col overflow-hidden rounded-lg border border-border bg-card", k = "assistant";
83
+ function J({
84
+ assistant: s,
85
+ children: t,
86
+ minSize: e = 20,
87
+ maxSize: u = 70,
88
+ className: m,
89
+ assistantClassName: o,
90
+ contentClassName: i
91
+ }) {
92
+ const { dock: r, size: f, setSize: a, visible: b } = I(), { orientation: S, assistantFirst: w } = $(r);
93
+ if (!b)
94
+ return /* @__PURE__ */ n(
95
+ "div",
96
+ {
97
+ "data-slot": "assistant-layout",
98
+ className: d("flex min-h-0 flex-1 overflow-hidden", m),
99
+ children: /* @__PURE__ */ n("div", { className: d(A, "flex-1"), children: /* @__PURE__ */ n("div", { "data-slot": "assistant-layout-content", className: d(x, i), children: t }) })
100
+ }
101
+ );
102
+ const h = /* @__PURE__ */ n(
103
+ P,
104
+ {
105
+ id: k,
106
+ defaultSize: `${f}%`,
107
+ minSize: `${e}%`,
108
+ maxSize: `${u}%`,
109
+ className: A,
110
+ children: /* @__PURE__ */ n("div", { "data-slot": "assistant-layout-assistant", className: d(x, o), children: s })
111
+ }
112
+ ), v = /* @__PURE__ */ n(P, { id: "content", className: A, children: /* @__PURE__ */ n("div", { "data-slot": "assistant-layout-content", className: d(x, i), children: t }) });
113
+ return /* @__PURE__ */ n(
114
+ H,
115
+ {
116
+ orientation: S,
117
+ "data-slot": "assistant-layout",
118
+ className: d("min-h-0 flex-1 overflow-hidden", m),
119
+ onLayoutChanged: (c) => {
120
+ const p = c[k];
121
+ typeof p == "number" && a(p);
122
+ },
123
+ children: w ? /* @__PURE__ */ N(z, { children: [
124
+ h,
125
+ /* @__PURE__ */ n(g, { withHandle: !0 }),
126
+ v
127
+ ] }) : /* @__PURE__ */ N(z, { children: [
128
+ v,
129
+ /* @__PURE__ */ n(g, { withHandle: !0 }),
130
+ h
131
+ ] })
132
+ },
133
+ r
134
+ );
135
+ }
136
+ export {
137
+ q as AssistantDockControls,
138
+ J as AssistantLayout,
139
+ G as AssistantLayoutProvider,
140
+ I as useAssistantLayout
141
+ };
142
+ //# sourceMappingURL=AssistantLayout.js.map