@tetrascience-npm/tetrascience-react-ui 0.7.0 → 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (1241) hide show
  1. package/README.md +58 -4
  2. package/dist/ai/attachments.cjs +2 -0
  3. package/dist/ai/attachments.cjs.map +1 -0
  4. package/dist/ai/attachments.js +224 -0
  5. package/dist/ai/attachments.js.map +1 -0
  6. package/dist/ai/chain-of-thought.cjs +2 -0
  7. package/dist/ai/chain-of-thought.cjs.map +1 -0
  8. package/dist/ai/chain-of-thought.js +145 -0
  9. package/dist/ai/chain-of-thought.js.map +1 -0
  10. package/dist/ai/confirmation.cjs +2 -0
  11. package/dist/ai/confirmation.cjs.map +1 -0
  12. package/dist/ai/confirmation.js +109 -0
  13. package/dist/ai/confirmation.js.map +1 -0
  14. package/dist/ai/context.cjs +2 -0
  15. package/dist/ai/context.cjs.map +1 -0
  16. package/dist/ai/context.js +267 -0
  17. package/dist/ai/context.js.map +1 -0
  18. package/dist/ai/conversation.cjs +4 -0
  19. package/dist/ai/conversation.cjs.map +1 -0
  20. package/dist/ai/conversation.js +108 -0
  21. package/dist/ai/conversation.js.map +1 -0
  22. package/dist/ai/inline-citation.cjs +2 -0
  23. package/dist/ai/inline-citation.cjs.map +1 -0
  24. package/dist/ai/inline-citation.js +182 -0
  25. package/dist/ai/inline-citation.js.map +1 -0
  26. package/dist/ai/message.cjs +2 -0
  27. package/dist/ai/message.cjs.map +1 -0
  28. package/dist/ai/message.js +237 -0
  29. package/dist/ai/message.js.map +1 -0
  30. package/dist/ai/model-selector.cjs +2 -0
  31. package/dist/ai/model-selector.cjs.map +1 -0
  32. package/dist/ai/model-selector.js +77 -0
  33. package/dist/ai/model-selector.js.map +1 -0
  34. package/dist/ai/prompt-input.cjs +2 -0
  35. package/dist/ai/prompt-input.cjs.map +1 -0
  36. package/dist/ai/prompt-input.js +776 -0
  37. package/dist/ai/prompt-input.js.map +1 -0
  38. package/dist/ai/queue.cjs +2 -0
  39. package/dist/ai/queue.cjs.map +1 -0
  40. package/dist/ai/queue.js +209 -0
  41. package/dist/ai/queue.js.map +1 -0
  42. package/dist/ai/reasoning.cjs +2 -0
  43. package/dist/ai/reasoning.cjs.map +1 -0
  44. package/dist/ai/reasoning.js +129 -0
  45. package/dist/ai/reasoning.js.map +1 -0
  46. package/dist/ai/shimmer.cjs +2 -0
  47. package/dist/ai/shimmer.cjs.map +1 -0
  48. package/dist/ai/shimmer.js +49 -0
  49. package/dist/ai/shimmer.js.map +1 -0
  50. package/dist/ai/sources.cjs +2 -0
  51. package/dist/ai/sources.cjs.map +1 -0
  52. package/dist/ai/sources.js +54 -0
  53. package/dist/ai/sources.js.map +1 -0
  54. package/dist/ai/speech-input.cjs +2 -0
  55. package/dist/ai/speech-input.cjs.map +1 -0
  56. package/dist/ai/speech-input.js +123 -0
  57. package/dist/ai/speech-input.js.map +1 -0
  58. package/dist/ai/stream-status.cjs +2 -0
  59. package/dist/ai/stream-status.cjs.map +1 -0
  60. package/dist/ai/stream-status.js +108 -0
  61. package/dist/ai/stream-status.js.map +1 -0
  62. package/dist/ai/suggestion.cjs +2 -0
  63. package/dist/ai/suggestion.cjs.map +1 -0
  64. package/dist/ai/suggestion.js +38 -0
  65. package/dist/ai/suggestion.js.map +1 -0
  66. package/dist/ai/task.cjs +2 -0
  67. package/dist/ai/task.cjs.map +1 -0
  68. package/dist/ai/task.js +101 -0
  69. package/dist/ai/task.js.map +1 -0
  70. package/dist/ai/tool.cjs +2 -0
  71. package/dist/ai/tool.cjs.map +1 -0
  72. package/dist/ai/tool.js +139 -0
  73. package/dist/ai/tool.js.map +1 -0
  74. package/dist/charts/AreaPlot.cjs +2 -0
  75. package/dist/charts/AreaPlot.cjs.map +1 -0
  76. package/dist/charts/AreaPlot.js +5 -0
  77. package/dist/charts/AreaPlot.js.map +1 -0
  78. package/dist/charts/BarChart.cjs +2 -0
  79. package/dist/charts/BarChart.cjs.map +1 -0
  80. package/dist/charts/BarChart.js +5 -0
  81. package/dist/charts/BarChart.js.map +1 -0
  82. package/dist/charts/BoxPlot.cjs +2 -0
  83. package/dist/charts/BoxPlot.cjs.map +1 -0
  84. package/dist/charts/BoxPlot.js +5 -0
  85. package/dist/charts/BoxPlot.js.map +1 -0
  86. package/dist/charts/ChartTooltip.cjs +2 -0
  87. package/dist/charts/ChartTooltip.cjs.map +1 -0
  88. package/dist/charts/ChartTooltip.js +8 -0
  89. package/dist/charts/ChartTooltip.js.map +1 -0
  90. package/dist/charts/Chromatogram.cjs +2 -0
  91. package/dist/charts/Chromatogram.cjs.map +1 -0
  92. package/dist/charts/Chromatogram.js +5 -0
  93. package/dist/charts/Chromatogram.js.map +1 -0
  94. package/dist/charts/Electropherogram.cjs +2 -0
  95. package/dist/charts/Electropherogram.cjs.map +1 -0
  96. package/dist/charts/Electropherogram.js +5 -0
  97. package/dist/charts/Electropherogram.js.map +1 -0
  98. package/dist/charts/Histogram.cjs +2 -0
  99. package/dist/charts/Histogram.cjs.map +1 -0
  100. package/dist/charts/Histogram.js +5 -0
  101. package/dist/charts/Histogram.js.map +1 -0
  102. package/dist/charts/LinePlot.cjs +2 -0
  103. package/dist/charts/LinePlot.cjs.map +1 -0
  104. package/dist/charts/LinePlot.js +5 -0
  105. package/dist/charts/LinePlot.js.map +1 -0
  106. package/dist/charts/PieChart.cjs +2 -0
  107. package/dist/charts/PieChart.cjs.map +1 -0
  108. package/dist/charts/PieChart.js +5 -0
  109. package/dist/charts/PieChart.js.map +1 -0
  110. package/dist/charts/PlateMap.cjs +2 -0
  111. package/dist/charts/PlateMap.cjs.map +1 -0
  112. package/dist/charts/PlateMap.js +5 -0
  113. package/dist/charts/PlateMap.js.map +1 -0
  114. package/dist/charts/ScatterPlot.cjs +2 -0
  115. package/dist/charts/ScatterPlot.cjs.map +1 -0
  116. package/dist/charts/ScatterPlot.js +5 -0
  117. package/dist/charts/ScatterPlot.js.map +1 -0
  118. package/dist/charts/ScatterPlotInteractive.cjs +2 -0
  119. package/dist/charts/ScatterPlotInteractive.cjs.map +1 -0
  120. package/dist/charts/ScatterPlotInteractive.js +14 -0
  121. package/dist/charts/ScatterPlotInteractive.js.map +1 -0
  122. package/dist/charts/StackedChromatogram.cjs +2 -0
  123. package/dist/charts/StackedChromatogram.cjs.map +1 -0
  124. package/dist/charts/StackedChromatogram.js +7 -0
  125. package/dist/charts/StackedChromatogram.js.map +1 -0
  126. package/dist/components/ai/attachments.d.ts +54 -0
  127. package/dist/components/ai/chain-of-thought.d.ts +56 -0
  128. package/dist/components/ai/confirmation.d.ts +47 -0
  129. package/dist/components/ai/context.d.ts +40 -0
  130. package/dist/components/ai/conversation.d.ts +23 -0
  131. package/dist/components/ai/inline-citation.d.ts +38 -0
  132. package/dist/components/ai/message.d.ts +37 -0
  133. package/dist/components/ai/model-selector.d.ts +36 -0
  134. package/dist/components/ai/prompt-input.d.ts +158 -0
  135. package/dist/components/ai/queue.d.ts +72 -0
  136. package/dist/components/ai/reasoning.d.ts +26 -0
  137. package/dist/components/ai/shimmer.d.ts +17 -0
  138. package/dist/components/ai/sources.d.ts +12 -0
  139. package/dist/components/ai/speech-input.d.ts +54 -0
  140. package/dist/components/ai/stream-status.d.ts +66 -0
  141. package/dist/components/ai/streamdown-code-plugin.cjs +2 -0
  142. package/dist/components/ai/streamdown-code-plugin.cjs.map +1 -0
  143. package/dist/components/ai/streamdown-code-plugin.d.ts +2 -0
  144. package/dist/components/ai/streamdown-code-plugin.js +42 -0
  145. package/dist/components/ai/streamdown-code-plugin.js.map +1 -0
  146. package/dist/components/ai/streamdown-plugins.cjs +2 -0
  147. package/dist/components/ai/streamdown-plugins.cjs.map +1 -0
  148. package/dist/components/ai/streamdown-plugins.d.ts +2 -0
  149. package/dist/components/ai/streamdown-plugins.js +14 -0
  150. package/dist/components/ai/streamdown-plugins.js.map +1 -0
  151. package/dist/components/ai/suggestion.d.ts +9 -0
  152. package/dist/components/ai/task.d.ts +16 -0
  153. package/dist/components/ai/tool.d.ts +33 -0
  154. package/dist/components/ai/use-streamdown-plugins.cjs +2 -0
  155. package/dist/components/ai/use-streamdown-plugins.cjs.map +1 -0
  156. package/dist/components/ai/use-streamdown-plugins.d.ts +8 -0
  157. package/dist/components/ai/use-streamdown-plugins.js +25 -0
  158. package/dist/components/ai/use-streamdown-plugins.js.map +1 -0
  159. package/dist/components/charts/AreaPlot/AreaPlot.cjs +2 -0
  160. package/dist/components/charts/AreaPlot/AreaPlot.cjs.map +1 -0
  161. package/dist/components/charts/AreaPlot/AreaPlot.d.ts +39 -0
  162. package/dist/components/charts/AreaPlot/AreaPlot.js +270 -0
  163. package/dist/components/charts/AreaPlot/AreaPlot.js.map +1 -0
  164. package/dist/components/charts/AreaPlot/index.d.ts +2 -0
  165. package/dist/components/charts/BarChart/BarChart.cjs +2 -0
  166. package/dist/components/charts/BarChart/BarChart.cjs.map +1 -0
  167. package/dist/components/charts/BarChart/BarChart.d.ts +44 -0
  168. package/dist/components/charts/BarChart/BarChart.js +219 -0
  169. package/dist/components/charts/BarChart/BarChart.js.map +1 -0
  170. package/dist/components/charts/BarChart/index.d.ts +2 -0
  171. package/dist/components/charts/BoxPlot/BoxPlot.cjs +2 -0
  172. package/dist/components/charts/BoxPlot/BoxPlot.cjs.map +1 -0
  173. package/dist/components/charts/BoxPlot/BoxPlot.d.ts +33 -0
  174. package/dist/components/charts/BoxPlot/BoxPlot.js +208 -0
  175. package/dist/components/charts/BoxPlot/BoxPlot.js.map +1 -0
  176. package/dist/components/charts/BoxPlot/index.d.ts +2 -0
  177. package/dist/components/charts/ChartTooltip/ChartTooltip.cjs +1 -1
  178. package/dist/components/charts/ChartTooltip/ChartTooltip.cjs.map +1 -1
  179. package/dist/components/charts/ChartTooltip/ChartTooltip.d.ts +71 -0
  180. package/dist/components/charts/ChartTooltip/ChartTooltip.js +22 -22
  181. package/dist/components/charts/ChartTooltip/ChartTooltip.js.map +1 -1
  182. package/dist/components/charts/ChartTooltip/index.d.ts +2 -0
  183. package/dist/components/charts/ChartTooltip/lines.d.ts +54 -0
  184. package/dist/components/charts/Chromatogram/Chromatogram.cjs +1 -1
  185. package/dist/components/charts/Chromatogram/Chromatogram.cjs.map +1 -1
  186. package/dist/components/charts/Chromatogram/Chromatogram.d.ts +5 -0
  187. package/dist/components/charts/Chromatogram/Chromatogram.js +232 -170
  188. package/dist/components/charts/Chromatogram/Chromatogram.js.map +1 -1
  189. package/dist/components/charts/Chromatogram/annotations.cjs +2 -0
  190. package/dist/components/charts/Chromatogram/annotations.cjs.map +1 -0
  191. package/dist/components/charts/Chromatogram/annotations.d.ts +50 -0
  192. package/dist/components/charts/Chromatogram/annotations.js +137 -0
  193. package/dist/components/charts/Chromatogram/annotations.js.map +1 -0
  194. package/dist/components/charts/Chromatogram/boundaryMarkers.cjs +2 -0
  195. package/dist/components/charts/Chromatogram/boundaryMarkers.cjs.map +1 -0
  196. package/dist/components/charts/Chromatogram/boundaryMarkers.d.ts +14 -0
  197. package/dist/components/charts/Chromatogram/boundaryMarkers.js +34 -0
  198. package/dist/components/charts/Chromatogram/boundaryMarkers.js.map +1 -0
  199. package/dist/components/charts/Chromatogram/constants.cjs +2 -0
  200. package/dist/components/charts/Chromatogram/constants.cjs.map +1 -0
  201. package/dist/components/charts/Chromatogram/constants.d.ts +46 -0
  202. package/dist/components/charts/Chromatogram/constants.js +36 -0
  203. package/dist/components/charts/Chromatogram/constants.js.map +1 -0
  204. package/dist/components/charts/Chromatogram/dataProcessing.cjs +2 -0
  205. package/dist/components/charts/Chromatogram/dataProcessing.cjs.map +1 -0
  206. package/dist/components/charts/Chromatogram/dataProcessing.d.ts +49 -0
  207. package/dist/components/charts/Chromatogram/dataProcessing.js +90 -0
  208. package/dist/components/charts/Chromatogram/dataProcessing.js.map +1 -0
  209. package/dist/components/charts/Chromatogram/index.d.ts +2 -0
  210. package/dist/components/charts/Chromatogram/peakDetection.cjs.map +1 -0
  211. package/dist/components/charts/Chromatogram/peakDetection.d.ts +33 -0
  212. package/dist/components/charts/Chromatogram/peakDetection.js.map +1 -0
  213. package/dist/components/charts/Chromatogram/plotBuilder.cjs +2 -0
  214. package/dist/components/charts/Chromatogram/plotBuilder.cjs.map +1 -0
  215. package/dist/components/charts/Chromatogram/plotBuilder.d.ts +58 -0
  216. package/dist/components/charts/Chromatogram/plotBuilder.js +216 -0
  217. package/dist/components/charts/Chromatogram/plotBuilder.js.map +1 -0
  218. package/dist/components/charts/Chromatogram/regionOverlays.cjs +2 -0
  219. package/dist/components/charts/Chromatogram/regionOverlays.cjs.map +1 -0
  220. package/dist/components/charts/Chromatogram/regionOverlays.d.ts +9 -0
  221. package/dist/components/charts/Chromatogram/regionOverlays.js +26 -0
  222. package/dist/components/charts/Chromatogram/regionOverlays.js.map +1 -0
  223. package/dist/components/charts/Chromatogram/types.d.ts +258 -0
  224. package/dist/components/charts/Electropherogram/Electropherogram.cjs +2 -0
  225. package/dist/components/charts/Electropherogram/Electropherogram.cjs.map +1 -0
  226. package/dist/components/charts/Electropherogram/Electropherogram.d.ts +22 -0
  227. package/dist/components/charts/Electropherogram/Electropherogram.js +180 -0
  228. package/dist/components/charts/Electropherogram/Electropherogram.js.map +1 -0
  229. package/dist/components/charts/Electropherogram/index.d.ts +2 -0
  230. package/dist/components/charts/Histogram/Histogram.cjs +1 -1
  231. package/dist/components/charts/Histogram/Histogram.cjs.map +1 -1
  232. package/dist/components/charts/Histogram/Histogram.d.ts +36 -0
  233. package/dist/components/charts/Histogram/Histogram.js +107 -108
  234. package/dist/components/charts/Histogram/Histogram.js.map +1 -1
  235. package/dist/components/charts/Histogram/index.d.ts +2 -0
  236. package/dist/components/charts/LinePlot/LinePlot.cjs +2 -0
  237. package/dist/components/charts/LinePlot/LinePlot.cjs.map +1 -0
  238. package/dist/components/charts/LinePlot/LinePlot.d.ts +45 -0
  239. package/dist/components/charts/LinePlot/LinePlot.js +224 -0
  240. package/dist/components/charts/LinePlot/LinePlot.js.map +1 -0
  241. package/dist/components/charts/LinePlot/index.d.ts +2 -0
  242. package/dist/components/charts/PieChart/PieChart.cjs +1 -1
  243. package/dist/components/charts/PieChart/PieChart.cjs.map +1 -1
  244. package/dist/components/charts/PieChart/PieChart.d.ts +20 -0
  245. package/dist/components/charts/PieChart/PieChart.js +62 -61
  246. package/dist/components/charts/PieChart/PieChart.js.map +1 -1
  247. package/dist/components/charts/PieChart/index.d.ts +2 -0
  248. package/dist/components/charts/PlateMap/PlateMap.cjs +1 -1
  249. package/dist/components/charts/PlateMap/PlateMap.cjs.map +1 -1
  250. package/dist/components/charts/PlateMap/PlateMap.d.ts +29 -0
  251. package/dist/components/charts/PlateMap/PlateMap.js +246 -242
  252. package/dist/components/charts/PlateMap/PlateMap.js.map +1 -1
  253. package/dist/components/charts/PlateMap/constants.d.ts +75 -0
  254. package/dist/components/charts/PlateMap/index.d.ts +2 -0
  255. package/dist/components/charts/PlateMap/types.d.ts +322 -0
  256. package/dist/components/charts/PlateMap/utils.d.ts +133 -0
  257. package/dist/components/charts/ScatterPlot/ScatterPlot.cjs +2 -0
  258. package/dist/components/charts/ScatterPlot/ScatterPlot.cjs.map +1 -0
  259. package/dist/components/charts/ScatterPlot/ScatterPlot.d.ts +43 -0
  260. package/dist/components/charts/ScatterPlot/ScatterPlot.js +252 -0
  261. package/dist/components/charts/ScatterPlot/ScatterPlot.js.map +1 -0
  262. package/dist/components/charts/ScatterPlot/index.d.ts +2 -0
  263. package/dist/components/charts/ScatterPlotInteractive/ScatterPlotInteractive.cjs +2 -0
  264. package/dist/components/charts/ScatterPlotInteractive/ScatterPlotInteractive.cjs.map +1 -0
  265. package/dist/components/charts/ScatterPlotInteractive/ScatterPlotInteractive.d.ts +25 -0
  266. package/dist/components/charts/ScatterPlotInteractive/ScatterPlotInteractive.js +215 -0
  267. package/dist/components/charts/ScatterPlotInteractive/ScatterPlotInteractive.js.map +1 -0
  268. package/dist/components/charts/ScatterPlotInteractive/constants.cjs +2 -0
  269. package/dist/components/charts/ScatterPlotInteractive/constants.cjs.map +1 -0
  270. package/dist/components/charts/ScatterPlotInteractive/constants.d.ts +50 -0
  271. package/dist/components/charts/ScatterPlotInteractive/constants.js +38 -0
  272. package/dist/components/charts/ScatterPlotInteractive/constants.js.map +1 -0
  273. package/dist/components/charts/ScatterPlotInteractive/index.d.ts +3 -0
  274. package/dist/components/charts/ScatterPlotInteractive/types.d.ts +226 -0
  275. package/dist/components/charts/ScatterPlotInteractive/utils.cjs +2 -0
  276. package/dist/components/charts/ScatterPlotInteractive/utils.cjs.map +1 -0
  277. package/dist/components/charts/ScatterPlotInteractive/utils.d.ts +72 -0
  278. package/dist/components/charts/ScatterPlotInteractive/utils.js +261 -0
  279. package/dist/components/charts/ScatterPlotInteractive/utils.js.map +1 -0
  280. package/dist/components/charts/StackedChromatogram/StackedChromatogram.cjs +2 -0
  281. package/dist/components/charts/StackedChromatogram/StackedChromatogram.cjs.map +1 -0
  282. package/dist/components/charts/StackedChromatogram/StackedChromatogram.d.ts +3 -0
  283. package/dist/components/charts/StackedChromatogram/StackedChromatogram.js +40 -0
  284. package/dist/components/charts/StackedChromatogram/StackedChromatogram.js.map +1 -0
  285. package/dist/components/charts/StackedChromatogram/index.d.ts +3 -0
  286. package/dist/components/charts/StackedChromatogram/transforms.cjs +2 -0
  287. package/dist/components/charts/StackedChromatogram/transforms.cjs.map +1 -0
  288. package/dist/components/charts/StackedChromatogram/transforms.d.ts +9 -0
  289. package/dist/components/charts/StackedChromatogram/transforms.js +31 -0
  290. package/dist/components/charts/StackedChromatogram/transforms.js.map +1 -0
  291. package/dist/components/charts/StackedChromatogram/types.d.ts +26 -0
  292. package/dist/components/charts/plotly-loader.cjs +2 -0
  293. package/dist/components/charts/plotly-loader.cjs.map +1 -0
  294. package/dist/components/charts/plotly-loader.d.ts +29 -0
  295. package/dist/components/charts/plotly-loader.js +22 -0
  296. package/dist/components/charts/plotly-loader.js.map +1 -0
  297. package/dist/components/composed/AssistantLayout/AssistantLayout.cjs +2 -0
  298. package/dist/components/composed/AssistantLayout/AssistantLayout.cjs.map +1 -0
  299. package/dist/components/composed/AssistantLayout/AssistantLayout.d.ts +63 -0
  300. package/dist/components/composed/AssistantLayout/AssistantLayout.js +142 -0
  301. package/dist/components/composed/AssistantLayout/AssistantLayout.js.map +1 -0
  302. package/dist/components/composed/AssistantLayout/dockLayout.cjs +2 -0
  303. package/dist/components/composed/AssistantLayout/dockLayout.cjs.map +1 -0
  304. package/dist/components/composed/AssistantLayout/dockLayout.d.ts +15 -0
  305. package/dist/components/composed/AssistantLayout/dockLayout.js +10 -0
  306. package/dist/components/composed/AssistantLayout/dockLayout.js.map +1 -0
  307. package/dist/components/composed/AssistantLayout/index.d.ts +3 -0
  308. package/dist/components/composed/Chat/Chat.cjs +1 -1
  309. package/dist/components/composed/Chat/Chat.cjs.map +1 -1
  310. package/dist/components/composed/Chat/Chat.d.ts +35 -0
  311. package/dist/components/composed/Chat/Chat.js +28 -28
  312. package/dist/components/composed/Chat/Chat.js.map +1 -1
  313. package/dist/components/composed/Chat/index.d.ts +2 -0
  314. package/dist/components/composed/ConfirmDialog/ConfirmDialog.cjs +1 -1
  315. package/dist/components/composed/ConfirmDialog/ConfirmDialog.cjs.map +1 -1
  316. package/dist/components/composed/ConfirmDialog/ConfirmDialog.d.ts +23 -0
  317. package/dist/components/composed/ConfirmDialog/ConfirmDialog.js +33 -29
  318. package/dist/components/composed/ConfirmDialog/ConfirmDialog.js.map +1 -1
  319. package/dist/components/composed/ConfirmDialog/index.d.ts +1 -0
  320. package/dist/components/composed/DataAppShell/CollapseButton.cjs +2 -0
  321. package/dist/components/composed/DataAppShell/CollapseButton.cjs.map +1 -0
  322. package/dist/components/composed/DataAppShell/CollapseButton.d.ts +23 -0
  323. package/dist/components/composed/DataAppShell/CollapseButton.js +42 -0
  324. package/dist/components/composed/DataAppShell/CollapseButton.js.map +1 -0
  325. package/dist/components/composed/DataAppShell/DataAppShell.cjs +1 -1
  326. package/dist/components/composed/DataAppShell/DataAppShell.cjs.map +1 -1
  327. package/dist/components/composed/DataAppShell/DataAppShell.d.ts +88 -0
  328. package/dist/components/composed/DataAppShell/DataAppShell.js +350 -328
  329. package/dist/components/composed/DataAppShell/DataAppShell.js.map +1 -1
  330. package/dist/components/composed/DataAppShell/PrimaryNav.cjs +2 -0
  331. package/dist/components/composed/DataAppShell/PrimaryNav.cjs.map +1 -0
  332. package/dist/components/composed/DataAppShell/PrimaryNav.d.ts +64 -0
  333. package/dist/components/composed/DataAppShell/PrimaryNav.js +268 -0
  334. package/dist/components/composed/DataAppShell/PrimaryNav.js.map +1 -0
  335. package/dist/components/composed/DataAppShell/RightPanel.cjs +2 -0
  336. package/dist/components/composed/DataAppShell/RightPanel.cjs.map +1 -0
  337. package/dist/components/composed/DataAppShell/RightPanel.d.ts +95 -0
  338. package/dist/components/composed/DataAppShell/RightPanel.js +282 -0
  339. package/dist/components/composed/DataAppShell/RightPanel.js.map +1 -0
  340. package/dist/components/composed/DataAppShell/SecondaryNav.cjs +2 -0
  341. package/dist/components/composed/DataAppShell/SecondaryNav.cjs.map +1 -0
  342. package/dist/components/composed/DataAppShell/SecondaryNav.d.ts +63 -0
  343. package/dist/components/composed/DataAppShell/SecondaryNav.js +364 -0
  344. package/dist/components/composed/DataAppShell/SecondaryNav.js.map +1 -0
  345. package/dist/components/composed/DataAppShell/ShellContext.cjs +2 -0
  346. package/dist/components/composed/DataAppShell/ShellContext.cjs.map +1 -0
  347. package/dist/components/composed/DataAppShell/ShellContext.d.ts +20 -0
  348. package/dist/components/composed/DataAppShell/ShellContext.js +23 -0
  349. package/dist/components/composed/DataAppShell/ShellContext.js.map +1 -0
  350. package/dist/components/composed/DataAppShell/index.d.ts +12 -0
  351. package/dist/components/composed/EmptyState/EmptyState.d.ts +12 -0
  352. package/dist/components/composed/EmptyState/index.d.ts +2 -0
  353. package/dist/components/composed/FormPatterns/FormSection.cjs +1 -1
  354. package/dist/components/composed/FormPatterns/FormSection.cjs.map +1 -1
  355. package/dist/components/composed/FormPatterns/FormSection.d.ts +7 -0
  356. package/dist/components/composed/FormPatterns/FormSection.js +2 -2
  357. package/dist/components/composed/FormPatterns/index.d.ts +1 -0
  358. package/dist/components/composed/MoleculeStructure/MoleculeStructure.cjs +2 -0
  359. package/dist/components/composed/MoleculeStructure/MoleculeStructure.cjs.map +1 -0
  360. package/dist/components/composed/MoleculeStructure/MoleculeStructure.d.ts +43 -0
  361. package/dist/components/composed/MoleculeStructure/MoleculeStructure.js +87 -0
  362. package/dist/components/composed/MoleculeStructure/MoleculeStructure.js.map +1 -0
  363. package/dist/components/composed/MoleculeStructure/index.d.ts +3 -0
  364. package/dist/components/composed/MoleculeStructure/rdkit-loader.cjs +2 -0
  365. package/dist/components/composed/MoleculeStructure/rdkit-loader.cjs.map +1 -0
  366. package/dist/components/composed/MoleculeStructure/rdkit-loader.d.ts +104 -0
  367. package/dist/components/composed/MoleculeStructure/rdkit-loader.js +89 -0
  368. package/dist/components/composed/MoleculeStructure/rdkit-loader.js.map +1 -0
  369. package/dist/components/composed/MoleculeStructure/use-rdkit.cjs +2 -0
  370. package/dist/components/composed/MoleculeStructure/use-rdkit.cjs.map +1 -0
  371. package/dist/components/composed/MoleculeStructure/use-rdkit.d.ts +29 -0
  372. package/dist/components/composed/MoleculeStructure/use-rdkit.js +19 -0
  373. package/dist/components/composed/MoleculeStructure/use-rdkit.js.map +1 -0
  374. package/dist/components/composed/PlateMapEditor/ManifestFilterPopover.cjs +1 -1
  375. package/dist/components/composed/PlateMapEditor/ManifestFilterPopover.cjs.map +1 -1
  376. package/dist/components/composed/PlateMapEditor/ManifestFilterPopover.d.ts +12 -0
  377. package/dist/components/composed/PlateMapEditor/ManifestFilterPopover.js +21 -21
  378. package/dist/components/composed/PlateMapEditor/ManifestFilterPopover.js.map +1 -1
  379. package/dist/components/composed/PlateMapEditor/PlateMapActionsMenu.cjs +1 -1
  380. package/dist/components/composed/PlateMapEditor/PlateMapActionsMenu.cjs.map +1 -1
  381. package/dist/components/composed/PlateMapEditor/PlateMapActionsMenu.d.ts +22 -0
  382. package/dist/components/composed/PlateMapEditor/PlateMapActionsMenu.js +34 -34
  383. package/dist/components/composed/PlateMapEditor/PlateMapActionsMenu.js.map +1 -1
  384. package/dist/components/composed/PlateMapEditor/PlateMapEditor.cjs +1 -1
  385. package/dist/components/composed/PlateMapEditor/PlateMapEditor.cjs.map +1 -1
  386. package/dist/components/composed/PlateMapEditor/PlateMapEditor.d.ts +106 -0
  387. package/dist/components/composed/PlateMapEditor/PlateMapEditor.js +2 -2
  388. package/dist/components/composed/PlateMapEditor/PlateMapForm.cjs +1 -1
  389. package/dist/components/composed/PlateMapEditor/PlateMapForm.cjs.map +1 -1
  390. package/dist/components/composed/PlateMapEditor/PlateMapForm.d.ts +30 -0
  391. package/dist/components/composed/PlateMapEditor/PlateMapForm.js +1 -1
  392. package/dist/components/composed/PlateMapEditor/PlateMapGrid.cjs +1 -1
  393. package/dist/components/composed/PlateMapEditor/PlateMapGrid.cjs.map +1 -1
  394. package/dist/components/composed/PlateMapEditor/PlateMapGrid.d.ts +64 -0
  395. package/dist/components/composed/PlateMapEditor/PlateMapGrid.js +1 -1
  396. package/dist/components/composed/PlateMapEditor/PlateMapManifest.d.ts +29 -0
  397. package/dist/components/composed/PlateMapEditor/PlateMapPlateSelector.cjs +1 -1
  398. package/dist/components/composed/PlateMapEditor/PlateMapPlateSelector.cjs.map +1 -1
  399. package/dist/components/composed/PlateMapEditor/PlateMapPlateSelector.d.ts +19 -0
  400. package/dist/components/composed/PlateMapEditor/PlateMapPlateSelector.js +11 -11
  401. package/dist/components/composed/PlateMapEditor/PlateMapPlateSelector.js.map +1 -1
  402. package/dist/components/composed/PlateMapEditor/PlatePaintGrid.cjs +1 -1
  403. package/dist/components/composed/PlateMapEditor/PlatePaintGrid.cjs.map +1 -1
  404. package/dist/components/composed/PlateMapEditor/PlatePaintGrid.d.ts +73 -0
  405. package/dist/components/composed/PlateMapEditor/PlatePaintGrid.js +1 -1
  406. package/dist/components/composed/PlateMapEditor/PlatePaintGrid.js.map +1 -1
  407. package/dist/components/composed/PlateMapEditor/PlateZoomControl.cjs +1 -1
  408. package/dist/components/composed/PlateMapEditor/PlateZoomControl.cjs.map +1 -1
  409. package/dist/components/composed/PlateMapEditor/PlateZoomControl.d.ts +12 -0
  410. package/dist/components/composed/PlateMapEditor/PlateZoomControl.js +2 -2
  411. package/dist/components/composed/PlateMapEditor/TemplateIOPanel.cjs +1 -1
  412. package/dist/components/composed/PlateMapEditor/TemplateIOPanel.cjs.map +1 -1
  413. package/dist/components/composed/PlateMapEditor/TemplateIOPanel.d.ts +13 -0
  414. package/dist/components/composed/PlateMapEditor/TemplateIOPanel.js +4 -4
  415. package/dist/components/composed/PlateMapEditor/WellLegend.cjs +1 -1
  416. package/dist/components/composed/PlateMapEditor/WellLegend.cjs.map +1 -1
  417. package/dist/components/composed/PlateMapEditor/WellLegend.d.ts +21 -0
  418. package/dist/components/composed/PlateMapEditor/WellLegend.js +24 -12
  419. package/dist/components/composed/PlateMapEditor/WellLegend.js.map +1 -1
  420. package/dist/components/composed/PlateMapEditor/WellManifestTable.cjs +1 -1
  421. package/dist/components/composed/PlateMapEditor/WellManifestTable.cjs.map +1 -1
  422. package/dist/components/composed/PlateMapEditor/WellManifestTable.d.ts +46 -0
  423. package/dist/components/composed/PlateMapEditor/WellManifestTable.js +10 -10
  424. package/dist/components/composed/PlateMapEditor/WellManifestTable.js.map +1 -1
  425. package/dist/components/composed/PlateMapEditor/WellMetadataForm.cjs +1 -1
  426. package/dist/components/composed/PlateMapEditor/WellMetadataForm.cjs.map +1 -1
  427. package/dist/components/composed/PlateMapEditor/WellMetadataForm.d.ts +17 -0
  428. package/dist/components/composed/PlateMapEditor/WellMetadataForm.js +7 -7
  429. package/dist/components/composed/PlateMapEditor/autoFill.d.ts +26 -0
  430. package/dist/components/composed/PlateMapEditor/csvPlateTriage.d.ts +4 -0
  431. package/dist/components/composed/PlateMapEditor/helpers.d.ts +2 -0
  432. package/dist/components/composed/PlateMapEditor/index.d.ts +31 -0
  433. package/dist/components/composed/PlateMapEditor/types.d.ts +137 -0
  434. package/dist/components/composed/PlateMapEditor/wellGrid.d.ts +12 -0
  435. package/dist/components/composed/ProcessFlow/ProcessFlow.d.ts +32 -0
  436. package/dist/components/composed/ProcessFlow/ProcessFlow.utils.d.ts +86 -0
  437. package/dist/components/composed/ProcessFlow/index.d.ts +1 -0
  438. package/dist/components/composed/RichListItem/RichListItem.cjs +1 -1
  439. package/dist/components/composed/RichListItem/RichListItem.cjs.map +1 -1
  440. package/dist/components/composed/RichListItem/RichListItem.d.ts +22 -0
  441. package/dist/components/composed/RichListItem/RichListItem.js +2 -2
  442. package/dist/components/composed/RichListItem/index.d.ts +2 -0
  443. package/dist/components/composed/StatCard/StatCard.cjs +1 -1
  444. package/dist/components/composed/StatCard/StatCard.cjs.map +1 -1
  445. package/dist/components/composed/StatCard/StatCard.d.ts +11 -0
  446. package/dist/components/composed/StatCard/StatCard.js +1 -1
  447. package/dist/components/composed/StatCard/index.d.ts +1 -0
  448. package/dist/components/composed/TdpSearch/TdpSearch.cjs +1 -1
  449. package/dist/components/composed/TdpSearch/TdpSearch.cjs.map +1 -1
  450. package/dist/components/composed/TdpSearch/TdpSearch.d.ts +21 -0
  451. package/dist/components/composed/TdpSearch/TdpSearch.js +14 -13
  452. package/dist/components/composed/TdpSearch/TdpSearch.mocks.d.ts +5 -0
  453. package/dist/components/composed/TdpSearch/components/DefaultFilters.cjs +1 -1
  454. package/dist/components/composed/TdpSearch/components/DefaultFilters.cjs.map +1 -1
  455. package/dist/components/composed/TdpSearch/components/DefaultFilters.d.ts +3 -0
  456. package/dist/components/composed/TdpSearch/components/DefaultFilters.js +4 -4
  457. package/dist/components/composed/TdpSearch/components/DefaultFilters.js.map +1 -1
  458. package/dist/components/composed/TdpSearch/components/DefaultResults.cjs +1 -1
  459. package/dist/components/composed/TdpSearch/components/DefaultResults.cjs.map +1 -1
  460. package/dist/components/composed/TdpSearch/components/DefaultResults.d.ts +3 -0
  461. package/dist/components/composed/TdpSearch/components/DefaultResults.js +2 -2
  462. package/dist/components/composed/TdpSearch/components/DefaultSearchBar.cjs +1 -1
  463. package/dist/components/composed/TdpSearch/components/DefaultSearchBar.cjs.map +1 -1
  464. package/dist/components/composed/TdpSearch/components/DefaultSearchBar.d.ts +3 -0
  465. package/dist/components/composed/TdpSearch/components/DefaultSearchBar.js +2 -2
  466. package/dist/components/composed/TdpSearch/constants.d.ts +3 -0
  467. package/dist/components/composed/TdpSearch/hooks/useSearch.d.ts +2 -0
  468. package/dist/components/composed/TdpSearch/hooks/useTdpCredentials.d.ts +14 -0
  469. package/dist/components/composed/TdpSearch/index.d.ts +3 -0
  470. package/dist/components/composed/TdpSearch/types.d.ts +128 -0
  471. package/dist/components/composed/TdpSearch/utils.d.ts +3 -0
  472. package/dist/components/composed/TopBar/TopBar.cjs +2 -0
  473. package/dist/components/composed/TopBar/TopBar.cjs.map +1 -0
  474. package/dist/components/composed/TopBar/TopBar.d.ts +25 -0
  475. package/dist/components/composed/TopBar/TopBar.js +56 -0
  476. package/dist/components/composed/TopBar/TopBar.js.map +1 -0
  477. package/dist/components/composed/TopBar/index.d.ts +2 -0
  478. package/dist/components/composed/UserMenu/UserMenu.cjs +2 -0
  479. package/dist/components/composed/UserMenu/UserMenu.cjs.map +1 -0
  480. package/dist/components/composed/UserMenu/UserMenu.d.ts +53 -0
  481. package/dist/components/composed/UserMenu/UserMenu.js +99 -0
  482. package/dist/components/composed/UserMenu/UserMenu.js.map +1 -0
  483. package/dist/components/composed/UserMenu/index.d.ts +2 -0
  484. package/dist/components/composed/tdp-link.d.ts +110 -0
  485. package/dist/components/composed/tdp-url.d.ts +68 -0
  486. package/dist/components/ui/accordion.d.ts +7 -0
  487. package/dist/components/ui/alert-dialog.d.ts +18 -0
  488. package/dist/components/ui/alert.d.ts +10 -0
  489. package/dist/components/ui/aspect-ratio.d.ts +3 -0
  490. package/dist/components/ui/avatar.d.ts +11 -0
  491. package/dist/components/ui/badge.d.ts +9 -0
  492. package/dist/components/ui/banner.d.ts +19 -0
  493. package/dist/components/ui/breadcrumb.d.ts +11 -0
  494. package/dist/components/ui/button-group.d.ts +11 -0
  495. package/dist/components/ui/button.d.ts +10 -0
  496. package/dist/components/ui/calendar.d.ts +10 -0
  497. package/dist/components/ui/card.d.ts +11 -0
  498. package/dist/components/ui/carousel.d.ts +28 -0
  499. package/dist/components/ui/checkbox.d.ts +4 -0
  500. package/dist/components/ui/code-block.d.ts +45 -0
  501. package/dist/components/ui/code-editor.d.ts +18 -0
  502. package/dist/components/ui/collapsible.d.ts +5 -0
  503. package/dist/components/ui/combobox.d.ts +24 -0
  504. package/dist/components/ui/command.d.ts +18 -0
  505. package/dist/components/ui/context-menu.d.ts +31 -0
  506. package/dist/components/ui/data-table/data-table-column-toggle.cjs +1 -1
  507. package/dist/components/ui/data-table/data-table-column-toggle.cjs.map +1 -1
  508. package/dist/components/ui/data-table/data-table-column-toggle.d.ts +6 -0
  509. package/dist/components/ui/data-table/data-table-column-toggle.js +71 -63
  510. package/dist/components/ui/data-table/data-table-column-toggle.js.map +1 -1
  511. package/dist/components/ui/data-table/data-table-filter.cjs +1 -1
  512. package/dist/components/ui/data-table/data-table-filter.cjs.map +1 -1
  513. package/dist/components/ui/data-table/data-table-filter.d.ts +9 -0
  514. package/dist/components/ui/data-table/data-table-filter.js +26 -25
  515. package/dist/components/ui/data-table/data-table-filter.js.map +1 -1
  516. package/dist/components/ui/data-table/data-table-group.cjs +1 -1
  517. package/dist/components/ui/data-table/data-table-group.cjs.map +1 -1
  518. package/dist/components/ui/data-table/data-table-group.d.ts +9 -0
  519. package/dist/components/ui/data-table/data-table-group.js +18 -17
  520. package/dist/components/ui/data-table/data-table-group.js.map +1 -1
  521. package/dist/components/ui/data-table/data-table-pagination.cjs +1 -1
  522. package/dist/components/ui/data-table/data-table-pagination.cjs.map +1 -1
  523. package/dist/components/ui/data-table/data-table-pagination.d.ts +7 -0
  524. package/dist/components/ui/data-table/data-table-pagination.js +16 -16
  525. package/dist/components/ui/data-table/data-table-pagination.js.map +1 -1
  526. package/dist/components/ui/data-table/data-table.cjs +1 -1
  527. package/dist/components/ui/data-table/data-table.cjs.map +1 -1
  528. package/dist/components/ui/data-table/data-table.d.ts +82 -0
  529. package/dist/components/ui/data-table/data-table.js +191 -190
  530. package/dist/components/ui/data-table/data-table.js.map +1 -1
  531. package/dist/components/ui/data-table/index.d.ts +5 -0
  532. package/dist/components/ui/dialog.d.ts +18 -0
  533. package/dist/components/ui/dropdown-menu.d.ts +29 -0
  534. package/dist/components/ui/field.d.ts +24 -0
  535. package/dist/components/ui/hover-card.d.ts +6 -0
  536. package/dist/components/ui/input-group.d.ts +16 -0
  537. package/dist/components/ui/input.d.ts +3 -0
  538. package/dist/components/ui/item.d.ts +23 -0
  539. package/dist/components/ui/kbd.d.ts +3 -0
  540. package/dist/components/ui/label.d.ts +4 -0
  541. package/dist/components/ui/menubar.d.ts +30 -0
  542. package/dist/components/ui/navigation-menu.d.ts +14 -0
  543. package/dist/components/ui/popover.d.ts +7 -0
  544. package/dist/components/ui/progress.d.ts +4 -0
  545. package/dist/components/ui/radio-group.d.ts +5 -0
  546. package/dist/components/ui/resizable.d.ts +25 -0
  547. package/dist/components/ui/scroll-area.d.ts +5 -0
  548. package/dist/components/ui/select.d.ts +15 -0
  549. package/dist/components/ui/separator.d.ts +4 -0
  550. package/dist/components/ui/sheet.d.ts +14 -0
  551. package/dist/components/ui/sidebar.d.ts +69 -0
  552. package/dist/components/ui/skeleton.d.ts +2 -0
  553. package/dist/components/ui/slider.d.ts +4 -0
  554. package/dist/components/ui/snippet.d.ts +18 -0
  555. package/dist/components/ui/sonner.d.ts +3 -0
  556. package/dist/components/ui/spinner.d.ts +6 -0
  557. package/dist/components/ui/switch.d.ts +6 -0
  558. package/dist/components/ui/table.d.ts +22 -0
  559. package/dist/components/ui/tabs.d.ts +11 -0
  560. package/dist/components/ui/tetra-molecule-icon.d.ts +11 -0
  561. package/dist/components/ui/tetrascience-icon.d.ts +7 -0
  562. package/dist/components/ui/textarea.d.ts +3 -0
  563. package/dist/components/ui/toggle-group.d.ts +10 -0
  564. package/dist/components/ui/toggle.d.ts +9 -0
  565. package/dist/components/ui/tooltip.d.ts +7 -0
  566. package/dist/composed/AssistantLayout.cjs +2 -0
  567. package/dist/composed/AssistantLayout.cjs.map +1 -0
  568. package/dist/composed/AssistantLayout.js +10 -0
  569. package/dist/composed/AssistantLayout.js.map +1 -0
  570. package/dist/composed/Chat.cjs +2 -0
  571. package/dist/composed/Chat.cjs.map +1 -0
  572. package/dist/composed/Chat.js +5 -0
  573. package/dist/composed/Chat.js.map +1 -0
  574. package/dist/composed/ConfirmDialog.cjs +2 -0
  575. package/dist/composed/ConfirmDialog.cjs.map +1 -0
  576. package/dist/composed/ConfirmDialog.js +5 -0
  577. package/dist/composed/ConfirmDialog.js.map +1 -0
  578. package/dist/composed/DataAppShell.cjs +2 -0
  579. package/dist/composed/DataAppShell.cjs.map +1 -0
  580. package/dist/composed/DataAppShell.js +22 -0
  581. package/dist/composed/DataAppShell.js.map +1 -0
  582. package/dist/composed/EmptyState.cjs +2 -0
  583. package/dist/composed/EmptyState.cjs.map +1 -0
  584. package/dist/composed/EmptyState.js +5 -0
  585. package/dist/composed/EmptyState.js.map +1 -0
  586. package/dist/composed/FormPatterns.cjs +2 -0
  587. package/dist/composed/FormPatterns.cjs.map +1 -0
  588. package/dist/composed/FormPatterns.js +5 -0
  589. package/dist/composed/FormPatterns.js.map +1 -0
  590. package/dist/composed/MoleculeStructure.cjs +2 -0
  591. package/dist/composed/MoleculeStructure.cjs.map +1 -0
  592. package/dist/composed/MoleculeStructure.js +11 -0
  593. package/dist/composed/MoleculeStructure.js.map +1 -0
  594. package/dist/composed/PlateMapEditor.cjs +2 -0
  595. package/dist/composed/PlateMapEditor.cjs.map +1 -0
  596. package/dist/composed/PlateMapEditor.js +45 -0
  597. package/dist/composed/PlateMapEditor.js.map +1 -0
  598. package/dist/composed/ProcessFlow.cjs +2 -0
  599. package/dist/composed/ProcessFlow.cjs.map +1 -0
  600. package/dist/composed/ProcessFlow.js +7 -0
  601. package/dist/composed/ProcessFlow.js.map +1 -0
  602. package/dist/composed/RichListItem.cjs +2 -0
  603. package/dist/composed/RichListItem.cjs.map +1 -0
  604. package/dist/composed/RichListItem.js +6 -0
  605. package/dist/composed/RichListItem.js.map +1 -0
  606. package/dist/composed/StatCard.cjs +2 -0
  607. package/dist/composed/StatCard.cjs.map +1 -0
  608. package/dist/composed/StatCard.js +5 -0
  609. package/dist/composed/StatCard.js.map +1 -0
  610. package/dist/composed/TdpSearch.cjs +2 -0
  611. package/dist/composed/TdpSearch.cjs.map +1 -0
  612. package/dist/composed/TdpSearch.js +8 -0
  613. package/dist/composed/TdpSearch.js.map +1 -0
  614. package/dist/composed/TopBar.cjs +2 -0
  615. package/dist/composed/TopBar.cjs.map +1 -0
  616. package/dist/composed/TopBar.js +6 -0
  617. package/dist/composed/TopBar.js.map +1 -0
  618. package/dist/composed/UserMenu.cjs +2 -0
  619. package/dist/composed/UserMenu.cjs.map +1 -0
  620. package/dist/composed/UserMenu.js +7 -0
  621. package/dist/composed/UserMenu.js.map +1 -0
  622. package/dist/composed/tdp-link.cjs +2 -0
  623. package/dist/composed/tdp-link.cjs.map +1 -0
  624. package/dist/composed/tdp-link.js +84 -0
  625. package/dist/composed/tdp-link.js.map +1 -0
  626. package/dist/composed/tdp-url.cjs.map +1 -0
  627. package/dist/composed/tdp-url.js.map +1 -0
  628. package/dist/hooks/use-code-editor-theme.d.ts +34 -0
  629. package/dist/hooks/use-element-size.d.ts +25 -0
  630. package/dist/hooks/use-is-dark.d.ts +12 -0
  631. package/dist/hooks/use-mobile.d.ts +1 -0
  632. package/dist/hooks/use-plotly-theme.cjs +1 -1
  633. package/dist/hooks/use-plotly-theme.cjs.map +1 -1
  634. package/dist/hooks/use-plotly-theme.d.ts +49 -0
  635. package/dist/hooks/use-plotly-theme.js +4 -3
  636. package/dist/hooks/use-plotly-theme.js.map +1 -1
  637. package/dist/index.cjs +1 -1
  638. package/dist/index.css +1 -1
  639. package/dist/index.d.ts +102 -4404
  640. package/dist/index.js +698 -659
  641. package/dist/index.js.map +1 -1
  642. package/dist/index.tailwind.css +1 -1
  643. package/dist/jest-setup.cjs +4 -0
  644. package/dist/jest-setup.cjs.map +1 -0
  645. package/dist/jest-setup.d.ts +106 -0
  646. package/dist/jest-setup.js +218 -0
  647. package/dist/jest-setup.js.map +1 -0
  648. package/dist/lib/shiki.cjs +2 -0
  649. package/dist/lib/shiki.cjs.map +1 -0
  650. package/dist/lib/shiki.d.ts +32 -0
  651. package/dist/lib/shiki.js +72 -0
  652. package/dist/lib/shiki.js.map +1 -0
  653. package/dist/lib/utils.d.ts +2 -0
  654. package/dist/server/auth/JwtTokenManager.cjs +1 -1
  655. package/dist/server/auth/JwtTokenManager.cjs.map +1 -1
  656. package/dist/server/auth/JwtTokenManager.d.ts +113 -0
  657. package/dist/server/auth/JwtTokenManager.js +44 -21
  658. package/dist/server/auth/JwtTokenManager.js.map +1 -1
  659. package/dist/server/auth/index.d.ts +5 -0
  660. package/dist/server/index.d.ts +8 -0
  661. package/dist/server/providers/AthenaProvider.cjs +1 -1
  662. package/dist/server/providers/AthenaProvider.cjs.map +1 -1
  663. package/dist/server/providers/AthenaProvider.d.ts +75 -0
  664. package/dist/server/providers/DatabricksProvider.cjs +1 -1
  665. package/dist/server/providers/DatabricksProvider.cjs.map +1 -1
  666. package/dist/server/providers/DatabricksProvider.d.ts +38 -0
  667. package/dist/server/providers/SnowflakeProvider.cjs +1 -1
  668. package/dist/server/providers/SnowflakeProvider.cjs.map +1 -1
  669. package/dist/server/providers/SnowflakeProvider.d.ts +36 -0
  670. package/dist/server/providers/buildProvider.d.ts +39 -0
  671. package/dist/server/providers/entries/athena.d.ts +24 -0
  672. package/dist/server/providers/entries/databricks.d.ts +25 -0
  673. package/dist/server/providers/entries/snowflake.d.ts +25 -0
  674. package/dist/server/providers/exceptions.d.ts +36 -0
  675. package/dist/server/providers/getProviderConfigurations.d.ts +45 -0
  676. package/dist/server/providers/index.d.ts +31 -0
  677. package/dist/server/providers/providerDiscovery.d.ts +81 -0
  678. package/dist/server/providers/types.d.ts +145 -0
  679. package/dist/server/search/TdpSearchManager.d.ts +40 -0
  680. package/dist/server/search/index.d.ts +5 -0
  681. package/dist/server.d.ts +17 -540
  682. package/dist/ui/accordion.cjs +2 -0
  683. package/dist/ui/accordion.cjs.map +1 -0
  684. package/dist/ui/accordion.js +83 -0
  685. package/dist/ui/accordion.js.map +1 -0
  686. package/dist/ui/alert-dialog.cjs +2 -0
  687. package/dist/ui/alert-dialog.cjs.map +1 -0
  688. package/dist/ui/alert-dialog.js +181 -0
  689. package/dist/ui/alert-dialog.js.map +1 -0
  690. package/dist/ui/alert.cjs +2 -0
  691. package/dist/ui/alert.cjs.map +1 -0
  692. package/dist/ui/alert.js +81 -0
  693. package/dist/ui/alert.js.map +1 -0
  694. package/dist/ui/aspect-ratio.cjs.map +1 -0
  695. package/dist/ui/aspect-ratio.js.map +1 -0
  696. package/dist/ui/avatar.cjs +2 -0
  697. package/dist/ui/avatar.cjs.map +1 -0
  698. package/dist/ui/avatar.js +107 -0
  699. package/dist/ui/avatar.js.map +1 -0
  700. package/dist/ui/badge.cjs +2 -0
  701. package/dist/ui/badge.cjs.map +1 -0
  702. package/dist/ui/badge.js +47 -0
  703. package/dist/ui/badge.js.map +1 -0
  704. package/dist/ui/banner.cjs +2 -0
  705. package/dist/ui/banner.cjs.map +1 -0
  706. package/dist/ui/banner.js +80 -0
  707. package/dist/ui/banner.js.map +1 -0
  708. package/dist/ui/breadcrumb.cjs +2 -0
  709. package/dist/ui/breadcrumb.cjs.map +1 -0
  710. package/dist/ui/breadcrumb.js +118 -0
  711. package/dist/ui/breadcrumb.js.map +1 -0
  712. package/dist/ui/button-group.cjs +2 -0
  713. package/dist/ui/button-group.cjs.map +1 -0
  714. package/dist/ui/button-group.js +77 -0
  715. package/dist/ui/button-group.js.map +1 -0
  716. package/dist/ui/button.cjs +2 -0
  717. package/dist/ui/button.cjs.map +1 -0
  718. package/dist/ui/button.js +57 -0
  719. package/dist/ui/button.js.map +1 -0
  720. package/dist/ui/calendar.cjs +2 -0
  721. package/dist/ui/calendar.cjs.map +1 -0
  722. package/dist/ui/calendar.js +174 -0
  723. package/dist/ui/calendar.js.map +1 -0
  724. package/dist/ui/card.cjs +2 -0
  725. package/dist/ui/card.cjs.map +1 -0
  726. package/dist/ui/card.js +102 -0
  727. package/dist/ui/card.js.map +1 -0
  728. package/dist/ui/carousel.cjs +2 -0
  729. package/dist/ui/carousel.cjs.map +1 -0
  730. package/dist/ui/carousel.js +179 -0
  731. package/dist/ui/carousel.js.map +1 -0
  732. package/dist/ui/checkbox.cjs +2 -0
  733. package/dist/ui/checkbox.cjs.map +1 -0
  734. package/dist/ui/checkbox.js +35 -0
  735. package/dist/ui/checkbox.js.map +1 -0
  736. package/dist/ui/code-block.cjs +4 -0
  737. package/dist/ui/code-block.cjs.map +1 -0
  738. package/dist/ui/code-block.js +324 -0
  739. package/dist/ui/code-block.js.map +1 -0
  740. package/dist/ui/code-editor.cjs +2 -0
  741. package/dist/ui/code-editor.cjs.map +1 -0
  742. package/dist/ui/code-editor.js +106 -0
  743. package/dist/ui/code-editor.js.map +1 -0
  744. package/dist/ui/collapsible.cjs.map +1 -0
  745. package/dist/ui/collapsible.js.map +1 -0
  746. package/dist/ui/combobox.cjs +2 -0
  747. package/dist/ui/combobox.cjs.map +1 -0
  748. package/dist/ui/combobox.js +285 -0
  749. package/dist/ui/combobox.js.map +1 -0
  750. package/dist/ui/command.cjs +2 -0
  751. package/dist/ui/command.cjs.map +1 -0
  752. package/dist/ui/command.js +178 -0
  753. package/dist/ui/command.js.map +1 -0
  754. package/dist/ui/context-menu.cjs +2 -0
  755. package/dist/ui/context-menu.cjs.map +1 -0
  756. package/dist/ui/context-menu.js +236 -0
  757. package/dist/ui/context-menu.js.map +1 -0
  758. package/dist/ui/data-table.cjs +2 -0
  759. package/dist/ui/data-table.cjs.map +1 -0
  760. package/dist/ui/data-table.js +16 -0
  761. package/dist/ui/data-table.js.map +1 -0
  762. package/dist/ui/dialog.cjs +2 -0
  763. package/dist/ui/dialog.cjs.map +1 -0
  764. package/dist/ui/dialog.js +165 -0
  765. package/dist/ui/dialog.js.map +1 -0
  766. package/dist/ui/dropdown-menu.cjs +2 -0
  767. package/dist/ui/dropdown-menu.cjs.map +1 -0
  768. package/dist/ui/dropdown-menu.js +260 -0
  769. package/dist/ui/dropdown-menu.js.map +1 -0
  770. package/dist/ui/field.cjs +2 -0
  771. package/dist/ui/field.cjs.map +1 -0
  772. package/dist/ui/field.js +210 -0
  773. package/dist/ui/field.js.map +1 -0
  774. package/dist/ui/hover-card.cjs +2 -0
  775. package/dist/ui/hover-card.cjs.map +1 -0
  776. package/dist/ui/hover-card.js +39 -0
  777. package/dist/ui/hover-card.js.map +1 -0
  778. package/dist/ui/input-group.cjs +2 -0
  779. package/dist/ui/input-group.cjs.map +1 -0
  780. package/dist/ui/input-group.js +145 -0
  781. package/dist/ui/input-group.js.map +1 -0
  782. package/dist/ui/input.cjs +2 -0
  783. package/dist/ui/input.cjs.map +1 -0
  784. package/dist/ui/input.js +20 -0
  785. package/dist/ui/input.js.map +1 -0
  786. package/dist/ui/item.cjs +2 -0
  787. package/dist/ui/item.cjs.map +1 -0
  788. package/dist/ui/item.js +199 -0
  789. package/dist/ui/item.js.map +1 -0
  790. package/dist/ui/kbd.cjs +2 -0
  791. package/dist/ui/kbd.cjs.map +1 -0
  792. package/dist/ui/kbd.js +30 -0
  793. package/dist/ui/kbd.js.map +1 -0
  794. package/dist/ui/label.cjs +2 -0
  795. package/dist/ui/label.cjs.map +1 -0
  796. package/dist/ui/label.js +23 -0
  797. package/dist/ui/label.js.map +1 -0
  798. package/dist/ui/menubar.cjs +2 -0
  799. package/dist/ui/menubar.cjs.map +1 -0
  800. package/dist/ui/menubar.js +256 -0
  801. package/dist/ui/menubar.js.map +1 -0
  802. package/dist/ui/navigation-menu.cjs +2 -0
  803. package/dist/ui/navigation-menu.cjs.map +1 -0
  804. package/dist/ui/navigation-menu.js +164 -0
  805. package/dist/ui/navigation-menu.js.map +1 -0
  806. package/dist/ui/popover.cjs +2 -0
  807. package/dist/ui/popover.cjs.map +1 -0
  808. package/dist/ui/popover.js +45 -0
  809. package/dist/ui/popover.js.map +1 -0
  810. package/dist/ui/radio-group.cjs +2 -0
  811. package/dist/ui/radio-group.cjs.map +1 -0
  812. package/dist/ui/radio-group.js +45 -0
  813. package/dist/ui/radio-group.js.map +1 -0
  814. package/dist/ui/resizable.cjs +2 -0
  815. package/dist/ui/resizable.cjs.map +1 -0
  816. package/dist/ui/resizable.js +58 -0
  817. package/dist/ui/resizable.js.map +1 -0
  818. package/dist/ui/scroll-area.cjs +2 -0
  819. package/dist/ui/scroll-area.cjs.map +1 -0
  820. package/dist/ui/scroll-area.js +61 -0
  821. package/dist/ui/scroll-area.js.map +1 -0
  822. package/dist/ui/select.cjs +2 -0
  823. package/dist/ui/select.cjs.map +1 -0
  824. package/dist/ui/select.js +184 -0
  825. package/dist/ui/select.js.map +1 -0
  826. package/dist/ui/separator.cjs +2 -0
  827. package/dist/ui/separator.cjs.map +1 -0
  828. package/dist/ui/separator.js +27 -0
  829. package/dist/ui/separator.js.map +1 -0
  830. package/dist/ui/sheet.cjs +2 -0
  831. package/dist/ui/sheet.cjs.map +1 -0
  832. package/dist/ui/sheet.js +137 -0
  833. package/dist/ui/sheet.js.map +1 -0
  834. package/dist/ui/sidebar.cjs +2 -0
  835. package/dist/ui/sidebar.cjs.map +1 -0
  836. package/dist/ui/sidebar.js +579 -0
  837. package/dist/ui/sidebar.js.map +1 -0
  838. package/dist/ui/skeleton.cjs +2 -0
  839. package/dist/ui/skeleton.cjs.map +1 -0
  840. package/dist/ui/skeleton.js +24 -0
  841. package/dist/ui/skeleton.js.map +1 -0
  842. package/dist/ui/slider.cjs +2 -0
  843. package/dist/ui/slider.cjs.map +1 -0
  844. package/dist/ui/slider.js +61 -0
  845. package/dist/ui/slider.js.map +1 -0
  846. package/dist/ui/sonner.cjs +2 -0
  847. package/dist/ui/sonner.cjs.map +1 -0
  848. package/dist/ui/sonner.js +52 -0
  849. package/dist/ui/sonner.js.map +1 -0
  850. package/dist/ui/spinner.cjs +2 -0
  851. package/dist/ui/spinner.cjs.map +1 -0
  852. package/dist/ui/spinner.js +39 -0
  853. package/dist/ui/spinner.js.map +1 -0
  854. package/dist/ui/switch.cjs +2 -0
  855. package/dist/ui/switch.cjs.map +1 -0
  856. package/dist/ui/switch.js +32 -0
  857. package/dist/ui/switch.js.map +1 -0
  858. package/dist/ui/table.cjs +2 -0
  859. package/dist/ui/table.cjs.map +1 -0
  860. package/dist/ui/table.js +153 -0
  861. package/dist/ui/table.js.map +1 -0
  862. package/dist/ui/tabs.cjs +2 -0
  863. package/dist/ui/tabs.cjs.map +1 -0
  864. package/dist/ui/tabs.js +92 -0
  865. package/dist/ui/tabs.js.map +1 -0
  866. package/dist/ui/tetra-molecule-icon.cjs +2 -0
  867. package/dist/ui/tetra-molecule-icon.cjs.map +1 -0
  868. package/dist/ui/tetra-molecule-icon.js +50 -0
  869. package/dist/ui/tetra-molecule-icon.js.map +1 -0
  870. package/dist/ui/tetrascience-icon.cjs +2 -0
  871. package/dist/ui/tetrascience-icon.cjs.map +1 -0
  872. package/dist/ui/tetrascience-icon.js +47 -0
  873. package/dist/ui/tetrascience-icon.js.map +1 -0
  874. package/dist/ui/textarea.cjs +2 -0
  875. package/dist/ui/textarea.cjs.map +1 -0
  876. package/dist/ui/textarea.js +19 -0
  877. package/dist/ui/textarea.js.map +1 -0
  878. package/dist/ui/toggle-group.cjs +2 -0
  879. package/dist/ui/toggle-group.cjs.map +1 -0
  880. package/dist/ui/toggle-group.js +81 -0
  881. package/dist/ui/toggle-group.js.map +1 -0
  882. package/dist/ui/toggle.cjs +2 -0
  883. package/dist/ui/toggle.cjs.map +1 -0
  884. package/dist/ui/toggle.js +44 -0
  885. package/dist/ui/toggle.js.map +1 -0
  886. package/dist/ui/tooltip.cjs +2 -0
  887. package/dist/ui/tooltip.cjs.map +1 -0
  888. package/dist/ui/tooltip.js +56 -0
  889. package/dist/ui/tooltip.js.map +1 -0
  890. package/dist/utils/colors.d.ts +50 -0
  891. package/package.json +137 -24
  892. package/dist/athena.d.ts +0 -167
  893. package/dist/components/ai/attachments.cjs +0 -2
  894. package/dist/components/ai/attachments.cjs.map +0 -1
  895. package/dist/components/ai/attachments.js +0 -224
  896. package/dist/components/ai/attachments.js.map +0 -1
  897. package/dist/components/ai/chain-of-thought.cjs +0 -2
  898. package/dist/components/ai/chain-of-thought.cjs.map +0 -1
  899. package/dist/components/ai/chain-of-thought.js +0 -145
  900. package/dist/components/ai/chain-of-thought.js.map +0 -1
  901. package/dist/components/ai/confirmation.cjs +0 -2
  902. package/dist/components/ai/confirmation.cjs.map +0 -1
  903. package/dist/components/ai/confirmation.js +0 -109
  904. package/dist/components/ai/confirmation.js.map +0 -1
  905. package/dist/components/ai/context.cjs +0 -2
  906. package/dist/components/ai/context.cjs.map +0 -1
  907. package/dist/components/ai/context.js +0 -266
  908. package/dist/components/ai/context.js.map +0 -1
  909. package/dist/components/ai/conversation.cjs +0 -4
  910. package/dist/components/ai/conversation.cjs.map +0 -1
  911. package/dist/components/ai/conversation.js +0 -108
  912. package/dist/components/ai/conversation.js.map +0 -1
  913. package/dist/components/ai/inline-citation.cjs +0 -2
  914. package/dist/components/ai/inline-citation.cjs.map +0 -1
  915. package/dist/components/ai/inline-citation.js +0 -182
  916. package/dist/components/ai/inline-citation.js.map +0 -1
  917. package/dist/components/ai/message.cjs +0 -2
  918. package/dist/components/ai/message.cjs.map +0 -1
  919. package/dist/components/ai/message.js +0 -237
  920. package/dist/components/ai/message.js.map +0 -1
  921. package/dist/components/ai/model-selector.cjs +0 -2
  922. package/dist/components/ai/model-selector.cjs.map +0 -1
  923. package/dist/components/ai/model-selector.js +0 -77
  924. package/dist/components/ai/model-selector.js.map +0 -1
  925. package/dist/components/ai/prompt-input.cjs +0 -2
  926. package/dist/components/ai/prompt-input.cjs.map +0 -1
  927. package/dist/components/ai/prompt-input.js +0 -774
  928. package/dist/components/ai/prompt-input.js.map +0 -1
  929. package/dist/components/ai/queue.cjs +0 -2
  930. package/dist/components/ai/queue.cjs.map +0 -1
  931. package/dist/components/ai/queue.js +0 -209
  932. package/dist/components/ai/queue.js.map +0 -1
  933. package/dist/components/ai/reasoning.cjs +0 -2
  934. package/dist/components/ai/reasoning.cjs.map +0 -1
  935. package/dist/components/ai/reasoning.js +0 -129
  936. package/dist/components/ai/reasoning.js.map +0 -1
  937. package/dist/components/ai/shimmer.cjs +0 -2
  938. package/dist/components/ai/shimmer.cjs.map +0 -1
  939. package/dist/components/ai/shimmer.js +0 -49
  940. package/dist/components/ai/shimmer.js.map +0 -1
  941. package/dist/components/ai/sources.cjs +0 -2
  942. package/dist/components/ai/sources.cjs.map +0 -1
  943. package/dist/components/ai/sources.js +0 -54
  944. package/dist/components/ai/sources.js.map +0 -1
  945. package/dist/components/ai/speech-input.cjs +0 -2
  946. package/dist/components/ai/speech-input.cjs.map +0 -1
  947. package/dist/components/ai/speech-input.js +0 -123
  948. package/dist/components/ai/speech-input.js.map +0 -1
  949. package/dist/components/ai/stream-status.cjs +0 -2
  950. package/dist/components/ai/stream-status.cjs.map +0 -1
  951. package/dist/components/ai/stream-status.js +0 -106
  952. package/dist/components/ai/stream-status.js.map +0 -1
  953. package/dist/components/ai/suggestion.cjs +0 -2
  954. package/dist/components/ai/suggestion.cjs.map +0 -1
  955. package/dist/components/ai/suggestion.js +0 -38
  956. package/dist/components/ai/suggestion.js.map +0 -1
  957. package/dist/components/ai/task.cjs +0 -2
  958. package/dist/components/ai/task.cjs.map +0 -1
  959. package/dist/components/ai/task.js +0 -94
  960. package/dist/components/ai/task.js.map +0 -1
  961. package/dist/components/ai/tool.cjs +0 -2
  962. package/dist/components/ai/tool.cjs.map +0 -1
  963. package/dist/components/ai/tool.js +0 -143
  964. package/dist/components/ai/tool.js.map +0 -1
  965. package/dist/components/charts/AreaGraph/AreaGraph.cjs +0 -2
  966. package/dist/components/charts/AreaGraph/AreaGraph.cjs.map +0 -1
  967. package/dist/components/charts/AreaGraph/AreaGraph.js +0 -271
  968. package/dist/components/charts/AreaGraph/AreaGraph.js.map +0 -1
  969. package/dist/components/charts/BarGraph/BarGraph.cjs +0 -2
  970. package/dist/components/charts/BarGraph/BarGraph.cjs.map +0 -1
  971. package/dist/components/charts/BarGraph/BarGraph.js +0 -220
  972. package/dist/components/charts/BarGraph/BarGraph.js.map +0 -1
  973. package/dist/components/charts/Boxplot/Boxplot.cjs +0 -2
  974. package/dist/components/charts/Boxplot/Boxplot.cjs.map +0 -1
  975. package/dist/components/charts/Boxplot/Boxplot.js +0 -209
  976. package/dist/components/charts/Boxplot/Boxplot.js.map +0 -1
  977. package/dist/components/charts/ChromatogramChart/ChromatogramChart.cjs +0 -2
  978. package/dist/components/charts/ChromatogramChart/ChromatogramChart.cjs.map +0 -1
  979. package/dist/components/charts/ChromatogramChart/ChromatogramChart.js +0 -227
  980. package/dist/components/charts/ChromatogramChart/ChromatogramChart.js.map +0 -1
  981. package/dist/components/charts/ChromatogramChart/annotations.cjs +0 -2
  982. package/dist/components/charts/ChromatogramChart/annotations.cjs.map +0 -1
  983. package/dist/components/charts/ChromatogramChart/annotations.js +0 -73
  984. package/dist/components/charts/ChromatogramChart/annotations.js.map +0 -1
  985. package/dist/components/charts/ChromatogramChart/boundaryMarkers.cjs +0 -2
  986. package/dist/components/charts/ChromatogramChart/boundaryMarkers.cjs.map +0 -1
  987. package/dist/components/charts/ChromatogramChart/boundaryMarkers.js +0 -34
  988. package/dist/components/charts/ChromatogramChart/boundaryMarkers.js.map +0 -1
  989. package/dist/components/charts/ChromatogramChart/constants.cjs +0 -2
  990. package/dist/components/charts/ChromatogramChart/constants.cjs.map +0 -1
  991. package/dist/components/charts/ChromatogramChart/constants.js +0 -30
  992. package/dist/components/charts/ChromatogramChart/constants.js.map +0 -1
  993. package/dist/components/charts/ChromatogramChart/dataProcessing.cjs +0 -2
  994. package/dist/components/charts/ChromatogramChart/dataProcessing.cjs.map +0 -1
  995. package/dist/components/charts/ChromatogramChart/dataProcessing.js +0 -79
  996. package/dist/components/charts/ChromatogramChart/dataProcessing.js.map +0 -1
  997. package/dist/components/charts/ChromatogramChart/peakDetection.cjs.map +0 -1
  998. package/dist/components/charts/ChromatogramChart/peakDetection.js.map +0 -1
  999. package/dist/components/charts/DotPlot/DotPlot.cjs +0 -2
  1000. package/dist/components/charts/DotPlot/DotPlot.cjs.map +0 -1
  1001. package/dist/components/charts/DotPlot/DotPlot.js +0 -208
  1002. package/dist/components/charts/DotPlot/DotPlot.js.map +0 -1
  1003. package/dist/components/charts/Heatmap/Heatmap.cjs +0 -2
  1004. package/dist/components/charts/Heatmap/Heatmap.cjs.map +0 -1
  1005. package/dist/components/charts/Heatmap/Heatmap.js +0 -67
  1006. package/dist/components/charts/Heatmap/Heatmap.js.map +0 -1
  1007. package/dist/components/charts/LineGraph/LineGraph.cjs +0 -2
  1008. package/dist/components/charts/LineGraph/LineGraph.cjs.map +0 -1
  1009. package/dist/components/charts/LineGraph/LineGraph.js +0 -225
  1010. package/dist/components/charts/LineGraph/LineGraph.js.map +0 -1
  1011. package/dist/components/charts/ScatterGraph/ScatterGraph.cjs +0 -2
  1012. package/dist/components/charts/ScatterGraph/ScatterGraph.cjs.map +0 -1
  1013. package/dist/components/charts/ScatterGraph/ScatterGraph.js +0 -234
  1014. package/dist/components/charts/ScatterGraph/ScatterGraph.js.map +0 -1
  1015. package/dist/components/composed/tdp-link.cjs +0 -2
  1016. package/dist/components/composed/tdp-link.cjs.map +0 -1
  1017. package/dist/components/composed/tdp-link.js +0 -84
  1018. package/dist/components/composed/tdp-link.js.map +0 -1
  1019. package/dist/components/composed/tdp-url.cjs.map +0 -1
  1020. package/dist/components/composed/tdp-url.js.map +0 -1
  1021. package/dist/components/ui/accordion.cjs +0 -2
  1022. package/dist/components/ui/accordion.cjs.map +0 -1
  1023. package/dist/components/ui/accordion.js +0 -83
  1024. package/dist/components/ui/accordion.js.map +0 -1
  1025. package/dist/components/ui/alert-dialog.cjs +0 -2
  1026. package/dist/components/ui/alert-dialog.cjs.map +0 -1
  1027. package/dist/components/ui/alert-dialog.js +0 -181
  1028. package/dist/components/ui/alert-dialog.js.map +0 -1
  1029. package/dist/components/ui/alert.cjs +0 -2
  1030. package/dist/components/ui/alert.cjs.map +0 -1
  1031. package/dist/components/ui/alert.js +0 -81
  1032. package/dist/components/ui/alert.js.map +0 -1
  1033. package/dist/components/ui/aspect-ratio.cjs.map +0 -1
  1034. package/dist/components/ui/aspect-ratio.js.map +0 -1
  1035. package/dist/components/ui/avatar.cjs +0 -2
  1036. package/dist/components/ui/avatar.cjs.map +0 -1
  1037. package/dist/components/ui/avatar.js +0 -107
  1038. package/dist/components/ui/avatar.js.map +0 -1
  1039. package/dist/components/ui/badge.cjs +0 -2
  1040. package/dist/components/ui/badge.cjs.map +0 -1
  1041. package/dist/components/ui/badge.js +0 -47
  1042. package/dist/components/ui/badge.js.map +0 -1
  1043. package/dist/components/ui/banner.cjs +0 -2
  1044. package/dist/components/ui/banner.cjs.map +0 -1
  1045. package/dist/components/ui/banner.js +0 -80
  1046. package/dist/components/ui/banner.js.map +0 -1
  1047. package/dist/components/ui/breadcrumb.cjs +0 -2
  1048. package/dist/components/ui/breadcrumb.cjs.map +0 -1
  1049. package/dist/components/ui/breadcrumb.js +0 -118
  1050. package/dist/components/ui/breadcrumb.js.map +0 -1
  1051. package/dist/components/ui/button-group.cjs +0 -2
  1052. package/dist/components/ui/button-group.cjs.map +0 -1
  1053. package/dist/components/ui/button-group.js +0 -77
  1054. package/dist/components/ui/button-group.js.map +0 -1
  1055. package/dist/components/ui/button.cjs +0 -2
  1056. package/dist/components/ui/button.cjs.map +0 -1
  1057. package/dist/components/ui/button.js +0 -57
  1058. package/dist/components/ui/button.js.map +0 -1
  1059. package/dist/components/ui/calendar.cjs +0 -2
  1060. package/dist/components/ui/calendar.cjs.map +0 -1
  1061. package/dist/components/ui/calendar.js +0 -174
  1062. package/dist/components/ui/calendar.js.map +0 -1
  1063. package/dist/components/ui/card.cjs +0 -2
  1064. package/dist/components/ui/card.cjs.map +0 -1
  1065. package/dist/components/ui/card.js +0 -102
  1066. package/dist/components/ui/card.js.map +0 -1
  1067. package/dist/components/ui/carousel.cjs +0 -2
  1068. package/dist/components/ui/carousel.cjs.map +0 -1
  1069. package/dist/components/ui/carousel.js +0 -179
  1070. package/dist/components/ui/carousel.js.map +0 -1
  1071. package/dist/components/ui/checkbox.cjs +0 -2
  1072. package/dist/components/ui/checkbox.cjs.map +0 -1
  1073. package/dist/components/ui/checkbox.js +0 -35
  1074. package/dist/components/ui/checkbox.js.map +0 -1
  1075. package/dist/components/ui/code-block.cjs +0 -4
  1076. package/dist/components/ui/code-block.cjs.map +0 -1
  1077. package/dist/components/ui/code-block.js +0 -306
  1078. package/dist/components/ui/code-block.js.map +0 -1
  1079. package/dist/components/ui/code-editor.cjs +0 -2
  1080. package/dist/components/ui/code-editor.cjs.map +0 -1
  1081. package/dist/components/ui/code-editor.js +0 -103
  1082. package/dist/components/ui/code-editor.js.map +0 -1
  1083. package/dist/components/ui/collapsible.cjs.map +0 -1
  1084. package/dist/components/ui/collapsible.js.map +0 -1
  1085. package/dist/components/ui/combobox.cjs +0 -2
  1086. package/dist/components/ui/combobox.cjs.map +0 -1
  1087. package/dist/components/ui/combobox.js +0 -281
  1088. package/dist/components/ui/combobox.js.map +0 -1
  1089. package/dist/components/ui/command.cjs +0 -2
  1090. package/dist/components/ui/command.cjs.map +0 -1
  1091. package/dist/components/ui/command.js +0 -174
  1092. package/dist/components/ui/command.js.map +0 -1
  1093. package/dist/components/ui/context-menu.cjs +0 -2
  1094. package/dist/components/ui/context-menu.cjs.map +0 -1
  1095. package/dist/components/ui/context-menu.js +0 -236
  1096. package/dist/components/ui/context-menu.js.map +0 -1
  1097. package/dist/components/ui/dialog.cjs +0 -2
  1098. package/dist/components/ui/dialog.cjs.map +0 -1
  1099. package/dist/components/ui/dialog.js +0 -165
  1100. package/dist/components/ui/dialog.js.map +0 -1
  1101. package/dist/components/ui/drawer.cjs +0 -2
  1102. package/dist/components/ui/drawer.cjs.map +0 -1
  1103. package/dist/components/ui/drawer.js +0 -125
  1104. package/dist/components/ui/drawer.js.map +0 -1
  1105. package/dist/components/ui/dropdown-menu.cjs +0 -2
  1106. package/dist/components/ui/dropdown-menu.cjs.map +0 -1
  1107. package/dist/components/ui/dropdown-menu.js +0 -252
  1108. package/dist/components/ui/dropdown-menu.js.map +0 -1
  1109. package/dist/components/ui/field.cjs +0 -2
  1110. package/dist/components/ui/field.cjs.map +0 -1
  1111. package/dist/components/ui/field.js +0 -210
  1112. package/dist/components/ui/field.js.map +0 -1
  1113. package/dist/components/ui/hover-card.cjs +0 -2
  1114. package/dist/components/ui/hover-card.cjs.map +0 -1
  1115. package/dist/components/ui/hover-card.js +0 -39
  1116. package/dist/components/ui/hover-card.js.map +0 -1
  1117. package/dist/components/ui/input-group.cjs +0 -2
  1118. package/dist/components/ui/input-group.cjs.map +0 -1
  1119. package/dist/components/ui/input-group.js +0 -145
  1120. package/dist/components/ui/input-group.js.map +0 -1
  1121. package/dist/components/ui/input-otp.cjs +0 -2
  1122. package/dist/components/ui/input-otp.cjs.map +0 -1
  1123. package/dist/components/ui/input-otp.js +0 -82
  1124. package/dist/components/ui/input-otp.js.map +0 -1
  1125. package/dist/components/ui/input.cjs +0 -2
  1126. package/dist/components/ui/input.cjs.map +0 -1
  1127. package/dist/components/ui/input.js +0 -20
  1128. package/dist/components/ui/input.js.map +0 -1
  1129. package/dist/components/ui/item.cjs +0 -2
  1130. package/dist/components/ui/item.cjs.map +0 -1
  1131. package/dist/components/ui/item.js +0 -191
  1132. package/dist/components/ui/item.js.map +0 -1
  1133. package/dist/components/ui/kbd.cjs +0 -2
  1134. package/dist/components/ui/kbd.cjs.map +0 -1
  1135. package/dist/components/ui/kbd.js +0 -30
  1136. package/dist/components/ui/kbd.js.map +0 -1
  1137. package/dist/components/ui/label.cjs +0 -2
  1138. package/dist/components/ui/label.cjs.map +0 -1
  1139. package/dist/components/ui/label.js +0 -23
  1140. package/dist/components/ui/label.js.map +0 -1
  1141. package/dist/components/ui/menubar.cjs +0 -2
  1142. package/dist/components/ui/menubar.cjs.map +0 -1
  1143. package/dist/components/ui/menubar.js +0 -256
  1144. package/dist/components/ui/menubar.js.map +0 -1
  1145. package/dist/components/ui/navigation-menu.cjs +0 -2
  1146. package/dist/components/ui/navigation-menu.cjs.map +0 -1
  1147. package/dist/components/ui/navigation-menu.js +0 -164
  1148. package/dist/components/ui/navigation-menu.js.map +0 -1
  1149. package/dist/components/ui/popover.cjs +0 -2
  1150. package/dist/components/ui/popover.cjs.map +0 -1
  1151. package/dist/components/ui/popover.js +0 -45
  1152. package/dist/components/ui/popover.js.map +0 -1
  1153. package/dist/components/ui/radio-group.cjs +0 -2
  1154. package/dist/components/ui/radio-group.cjs.map +0 -1
  1155. package/dist/components/ui/radio-group.js +0 -45
  1156. package/dist/components/ui/radio-group.js.map +0 -1
  1157. package/dist/components/ui/resizable.cjs +0 -2
  1158. package/dist/components/ui/resizable.cjs.map +0 -1
  1159. package/dist/components/ui/resizable.js +0 -58
  1160. package/dist/components/ui/resizable.js.map +0 -1
  1161. package/dist/components/ui/scroll-area.cjs +0 -2
  1162. package/dist/components/ui/scroll-area.cjs.map +0 -1
  1163. package/dist/components/ui/scroll-area.js +0 -60
  1164. package/dist/components/ui/scroll-area.js.map +0 -1
  1165. package/dist/components/ui/select.cjs +0 -2
  1166. package/dist/components/ui/select.cjs.map +0 -1
  1167. package/dist/components/ui/select.js +0 -184
  1168. package/dist/components/ui/select.js.map +0 -1
  1169. package/dist/components/ui/separator.cjs +0 -2
  1170. package/dist/components/ui/separator.cjs.map +0 -1
  1171. package/dist/components/ui/separator.js +0 -27
  1172. package/dist/components/ui/separator.js.map +0 -1
  1173. package/dist/components/ui/sheet.cjs +0 -2
  1174. package/dist/components/ui/sheet.cjs.map +0 -1
  1175. package/dist/components/ui/sheet.js +0 -137
  1176. package/dist/components/ui/sheet.js.map +0 -1
  1177. package/dist/components/ui/sidebar.cjs +0 -2
  1178. package/dist/components/ui/sidebar.cjs.map +0 -1
  1179. package/dist/components/ui/sidebar.js +0 -579
  1180. package/dist/components/ui/sidebar.js.map +0 -1
  1181. package/dist/components/ui/skeleton.cjs +0 -2
  1182. package/dist/components/ui/skeleton.cjs.map +0 -1
  1183. package/dist/components/ui/skeleton.js +0 -24
  1184. package/dist/components/ui/skeleton.js.map +0 -1
  1185. package/dist/components/ui/slider.cjs +0 -2
  1186. package/dist/components/ui/slider.cjs.map +0 -1
  1187. package/dist/components/ui/slider.js +0 -60
  1188. package/dist/components/ui/slider.js.map +0 -1
  1189. package/dist/components/ui/sonner.cjs +0 -2
  1190. package/dist/components/ui/sonner.cjs.map +0 -1
  1191. package/dist/components/ui/sonner.js +0 -37
  1192. package/dist/components/ui/sonner.js.map +0 -1
  1193. package/dist/components/ui/spinner.cjs +0 -2
  1194. package/dist/components/ui/spinner.cjs.map +0 -1
  1195. package/dist/components/ui/spinner.js +0 -39
  1196. package/dist/components/ui/spinner.js.map +0 -1
  1197. package/dist/components/ui/switch.cjs +0 -2
  1198. package/dist/components/ui/switch.cjs.map +0 -1
  1199. package/dist/components/ui/switch.js +0 -32
  1200. package/dist/components/ui/switch.js.map +0 -1
  1201. package/dist/components/ui/table.cjs +0 -2
  1202. package/dist/components/ui/table.cjs.map +0 -1
  1203. package/dist/components/ui/table.js +0 -152
  1204. package/dist/components/ui/table.js.map +0 -1
  1205. package/dist/components/ui/tabs.cjs +0 -2
  1206. package/dist/components/ui/tabs.cjs.map +0 -1
  1207. package/dist/components/ui/tabs.js +0 -92
  1208. package/dist/components/ui/tabs.js.map +0 -1
  1209. package/dist/components/ui/tetrascience-icon.cjs +0 -2
  1210. package/dist/components/ui/tetrascience-icon.cjs.map +0 -1
  1211. package/dist/components/ui/tetrascience-icon.js +0 -46
  1212. package/dist/components/ui/tetrascience-icon.js.map +0 -1
  1213. package/dist/components/ui/textarea.cjs +0 -2
  1214. package/dist/components/ui/textarea.cjs.map +0 -1
  1215. package/dist/components/ui/textarea.js +0 -19
  1216. package/dist/components/ui/textarea.js.map +0 -1
  1217. package/dist/components/ui/toggle-group.cjs +0 -2
  1218. package/dist/components/ui/toggle-group.cjs.map +0 -1
  1219. package/dist/components/ui/toggle-group.js +0 -77
  1220. package/dist/components/ui/toggle-group.js.map +0 -1
  1221. package/dist/components/ui/toggle.cjs +0 -2
  1222. package/dist/components/ui/toggle.cjs.map +0 -1
  1223. package/dist/components/ui/toggle.js +0 -44
  1224. package/dist/components/ui/toggle.js.map +0 -1
  1225. package/dist/components/ui/tooltip.cjs +0 -2
  1226. package/dist/components/ui/tooltip.cjs.map +0 -1
  1227. package/dist/components/ui/tooltip.js +0 -56
  1228. package/dist/components/ui/tooltip.js.map +0 -1
  1229. package/dist/databricks.d.ts +0 -129
  1230. package/dist/providers/athena.d.ts +0 -9
  1231. package/dist/providers/databricks.d.ts +0 -9
  1232. package/dist/providers/snowflake.d.ts +0 -9
  1233. package/dist/snowflake.d.ts +0 -125
  1234. /package/dist/components/charts/{ChromatogramChart → Chromatogram}/peakDetection.cjs +0 -0
  1235. /package/dist/components/charts/{ChromatogramChart → Chromatogram}/peakDetection.js +0 -0
  1236. /package/dist/{components/composed → composed}/tdp-url.cjs +0 -0
  1237. /package/dist/{components/composed → composed}/tdp-url.js +0 -0
  1238. /package/dist/{components/ui → ui}/aspect-ratio.cjs +0 -0
  1239. /package/dist/{components/ui → ui}/aspect-ratio.js +0 -0
  1240. /package/dist/{components/ui → ui}/collapsible.cjs +0 -0
  1241. /package/dist/{components/ui → ui}/collapsible.js +0 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"BarChart.js","sources":["../../../../src/components/charts/BarChart/BarChart.tsx"],"sourcesContent":["import React, { useEffect, useRef, useMemo } from \"react\";\n\nimport { useChartTooltip } from \"../ChartTooltip\";\nimport { getLoadedPlotly, loadPlotly } from \"../plotly-loader\";\n\nimport { useElementSize } from \"@/hooks/use-element-size\";\nimport { CHART_FONT_FAMILY, usePlotlyTheme } from \"@/hooks/use-plotly-theme\";\nimport { cn } from \"@/lib/utils\";\nimport { seriesColor } from \"@/utils/colors\";\n\ninterface BarDataSeries {\n x: number[];\n y: number[];\n name: string;\n /** Optional color override (auto-assigned from CHART_COLORS if not provided) */\n color?: string;\n error_y?: {\n type: \"data\";\n array: number[];\n visible: boolean;\n };\n}\n\ntype BarChartVariant = \"group\" | \"stack\" | \"overlay\";\n\n/** Top margin reserving room for the 32px title; reduced when no title is set */\nconst TITLE_MARGIN_TOP = 60;\nconst NO_TITLE_MARGIN_TOP = 30;\n\ninterface BarChartProps {\n dataSeries: BarDataSeries[];\n /**\n * Fixed width in pixels. When omitted, the chart fills its container and\n * tracks the container's width via a `ResizeObserver`.\n */\n width?: number;\n /**\n * Fixed height in pixels. When omitted, the chart fills its container and\n * tracks the container's height via a `ResizeObserver`.\n */\n height?: number;\n xRange?: [number, number];\n yRange?: [number, number];\n variant?: BarChartVariant;\n xTitle?: string;\n yTitle?: string;\n title?: string;\n barWidth?: number;\n /**\n * Categorical labels for the x-axis ticks. When provided, the x data values\n * still drive bar positioning but the displayed tick labels match these\n * strings in order (e.g. [\"Mon\", \"Tue\", …]). Should align 1:1 with the\n * unique, ordered x values across all series.\n */\n xTickText?: string[];\n}\n\nconst BarChart: React.FC<BarChartProps> = ({\n dataSeries,\n width,\n height,\n xRange,\n yRange,\n variant = \"group\",\n xTitle,\n yTitle,\n title,\n barWidth = 24,\n xTickText,\n}) => {\n const plotRef = useRef<HTMLDivElement>(null);\n const theme = usePlotlyTheme();\n const { bindTooltip, tooltipElement } = useChartTooltip({ xLabel: xTitle, yLabel: yTitle });\n\n // Omitted width/height → fill the container and track its measured size;\n // explicit pixel values override. See AreaPlot for the reference pattern.\n const [containerRef, measured] = useElementSize<HTMLDivElement>();\n const resolvedWidth = width ?? measured.width;\n const resolvedHeight = height ?? measured.height;\n const hasSize = resolvedWidth > 0 && resolvedHeight > 0;\n // Fill is per-dimension: omit width to fill the container width, omit height\n // to fill its height (so e.g. a fixed width with a container-driven height works).\n const fillWidth = width === undefined;\n const fillHeight = height === undefined;\n const sizeRef = useRef({ width: resolvedWidth, height: resolvedHeight });\n sizeRef.current = { width: resolvedWidth, height: resolvedHeight };\n const plotInitedRef = useRef(false);\n // Size last applied to the plot, so the resize effect can skip a redundant\n // relayout right after newPlot already drew at that size.\n const appliedSizeRef = useRef({ width: 0, height: 0 });\n\n const { yMin, yMax } = useMemo(() => {\n let minX = Number.MAX_VALUE;\n let maxX = Number.MIN_VALUE;\n let minY = Number.MAX_VALUE;\n let maxY = Number.MIN_VALUE;\n\n dataSeries.forEach((series) => {\n series.x.forEach((x) => {\n minX = Math.min(minX, x);\n maxX = Math.max(maxX, x);\n });\n series.y.forEach((y) => {\n minY = Math.min(minY, y);\n maxY = Math.max(maxY, y);\n });\n });\n\n const xPadding = (maxX - minX) * 0.1;\n const yPadding = (maxY - minY) * 0.1;\n\n return {\n xMin: minX - xPadding,\n xMax: maxX + xPadding,\n yMin: variant === \"stack\" ? 0 : minY - yPadding,\n yMax: maxY + yPadding,\n };\n }, [dataSeries, variant]);\n\n const effectiveYRange = useMemo(\n () => yRange || [yMin, yMax],\n [yRange, yMin, yMax],\n );\n\n const xTicks = useMemo(\n () => [...new Set(dataSeries.flatMap((s) => s.x))].sort((a, b) => a - b),\n [dataSeries],\n );\n\n // Only apply categorical labels when they align 1:1 with the tick positions;\n // a mismatch would silently mis-label ticks, so fall back to numeric ticks.\n const useCategoricalX = !!xTickText && xTickText.length === xTicks.length;\n\n const yTicks = useMemo(() => {\n const range = effectiveYRange[1] - effectiveYRange[0];\n let step = Math.pow(10, Math.floor(Math.log10(range)));\n\n if (range / step > 10) step = step * 2;\n if (range / step < 4) step = step / 2;\n\n const ticks = [];\n let current = Math.ceil(effectiveYRange[0] / step) * step;\n while (current <= effectiveYRange[1]) {\n ticks.push(current);\n current += step;\n }\n return ticks;\n }, [effectiveYRange]);\n\n const barMode = useMemo((): \"group\" | \"stack\" | \"overlay\" => {\n switch (variant) {\n case \"stack\":\n return \"stack\";\n case \"overlay\":\n return \"overlay\";\n case \"group\":\n default:\n return \"group\";\n }\n }, [variant]);\n\n const tickOptions = useMemo(\n () => ({\n tickcolor: theme.tickColor,\n ticklen: 12,\n tickwidth: 1,\n ticks: \"outside\" as const,\n tickfont: {\n size: 16,\n color: theme.textColor,\n family: CHART_FONT_FAMILY,\n weight: 400,\n },\n linecolor: theme.lineColor,\n linewidth: 1,\n position: 0,\n zeroline: false,\n }),\n [theme],\n );\n\n useEffect(() => {\n if (!plotRef.current || !hasSize) return;\n\n const data = dataSeries.map((series, index) => ({\n x: series.x,\n y: series.y,\n type: \"bar\" as const,\n name: series.name,\n hoverinfo: \"none\" as const,\n marker: {\n color: seriesColor(index, series.color),\n },\n width: barWidth,\n error_y: series.error_y,\n }));\n\n const layout = {\n ...(title\n ? {\n title: {\n text: title,\n font: {\n size: 32,\n family: CHART_FONT_FAMILY,\n color: theme.textColor,\n },\n },\n }\n : {}),\n width: sizeRef.current.width,\n height: sizeRef.current.height,\n margin: {\n l: 80,\n r: 30,\n // Reserve room for tick labels, the x-axis title, and the\n // container-anchored bottom legend stacked beneath them.\n b: 96,\n t: title ? TITLE_MARGIN_TOP : NO_TITLE_MARGIN_TOP,\n pad: 0,\n },\n paper_bgcolor: theme.paperBg,\n plot_bgcolor: theme.plotBg,\n font: {\n family: CHART_FONT_FAMILY,\n },\n barmode: barMode,\n bargap: 0.15,\n dragmode: false as const,\n xaxis: {\n title: {\n text: xTitle,\n font: {\n size: 16,\n color: theme.textSecondary,\n family: CHART_FONT_FAMILY,\n weight: 400,\n },\n standoff: 32,\n },\n gridcolor: theme.gridColor,\n range: xRange,\n autorange: !xRange,\n tickmode: \"array\" as const,\n tickvals: xTicks,\n ...(useCategoricalX ? { ticktext: xTickText } : {}),\n showgrid: true,\n // Reserve space for tick labels + the axis title so the bottom legend\n // can't overlap them at small sizes (SW-2157).\n automargin: true,\n ...tickOptions,\n },\n yaxis: {\n title: {\n text: yTitle,\n font: {\n size: 16,\n color: theme.textSecondary,\n family: CHART_FONT_FAMILY,\n weight: 400,\n },\n standoff: 30,\n },\n gridcolor: theme.gridColor,\n range: yRange,\n autorange: !yRange,\n tickmode: \"array\" as const,\n tickvals: yTicks,\n showgrid: true,\n automargin: true,\n ...tickOptions,\n },\n legend: {\n // Anchor to the bottom of the container (not the plot area) so the\n // legend always clears the x-axis tick labels + title — a paper-relative\n // fractional offset collapses into the ticks at small heights (SW-2157).\n x: 0.5,\n y: 0,\n xanchor: \"center\" as const,\n yanchor: \"bottom\" as const,\n yref: \"container\" as const,\n orientation: \"h\" as const,\n font: {\n size: 16,\n color: theme.legendColor,\n family: CHART_FONT_FAMILY,\n weight: 500,\n },\n },\n showlegend: dataSeries.length > 1,\n };\n\n const config = {\n // Sizing is driven from the measured container; disable Plotly's own\n // window-resize responsiveness (it can't see container resizes).\n responsive: false,\n displayModeBar: false,\n displaylogo: false,\n };\n\n // Plotly is loaded lazily so it stays out of the consumer's main chunk\n // (SW-2007); the draw is skipped if the effect re-runs or unmounts first.\n let cancelled = false;\n let plotElement: HTMLDivElement | null = null;\n void loadPlotly().then((plotly) => {\n if (cancelled || !plotRef.current) return;\n plotly.newPlot(plotRef.current, data, layout, config);\n bindTooltip(plotRef.current);\n\n // Capture ref value for cleanup\n plotElement = plotRef.current;\n plotInitedRef.current = true;\n appliedSizeRef.current = { ...sizeRef.current };\n });\n\n return () => {\n cancelled = true;\n if (plotElement) {\n getLoadedPlotly().purge(plotElement);\n plotInitedRef.current = false;\n }\n };\n }, [dataSeries, hasSize, xRange, yRange, xTitle, yTitle, title, barWidth, barMode, tickOptions, xTicks, yTicks, useCategoricalX, xTickText, theme, bindTooltip]);\n\n // Resize in place when the measured/overridden size changes — cheaper than\n // recreating the plot, and it preserves tooltip/event bindings.\n useEffect(() => {\n const plotElement = plotRef.current;\n if (!plotElement || !plotInitedRef.current || resolvedWidth <= 0 || resolvedHeight <= 0) {\n return;\n }\n // newPlot already drew at the current size; skip the redundant relayout\n // (it would queue an automargin redraw that can reject if we unmount first).\n if (\n appliedSizeRef.current.width === resolvedWidth &&\n appliedSizeRef.current.height === resolvedHeight\n ) {\n return;\n }\n appliedSizeRef.current = { width: resolvedWidth, height: resolvedHeight };\n // Swallow rejections from a relayout that races an unmount/purge.\n // plotInitedRef guarantees Plotly finished loading, so sync access is safe.\n void getLoadedPlotly()\n .relayout(plotElement, { width: resolvedWidth, height: resolvedHeight })\n .catch(() => {});\n }, [resolvedWidth, resolvedHeight]);\n\n return (\n <div\n ref={containerRef}\n className={cn(\"bar-graph-container relative\", fillWidth && \"w-full\", fillHeight && \"h-full\")}\n >\n <div ref={plotRef} style={{ width: \"100%\", height: \"100%\" }} />\n {tooltipElement}\n </div>\n );\n};\n\nexport { BarChart };\nexport type { BarDataSeries, BarChartVariant, BarChartProps };\n"],"names":["TITLE_MARGIN_TOP","NO_TITLE_MARGIN_TOP","BarChart","dataSeries","width","height","xRange","yRange","variant","xTitle","yTitle","title","barWidth","xTickText","plotRef","useRef","theme","usePlotlyTheme","bindTooltip","tooltipElement","useChartTooltip","containerRef","measured","useElementSize","resolvedWidth","resolvedHeight","hasSize","fillWidth","fillHeight","sizeRef","plotInitedRef","appliedSizeRef","yMin","yMax","useMemo","minX","maxX","minY","maxY","series","x","y","xPadding","yPadding","effectiveYRange","xTicks","s","a","b","useCategoricalX","yTicks","range","step","ticks","current","barMode","tickOptions","CHART_FONT_FAMILY","useEffect","data","index","seriesColor","layout","config","cancelled","plotElement","loadPlotly","plotly","getLoadedPlotly","jsxs","cn","jsx"],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export { BarChart } from './BarChart';
2
+ export type { BarDataSeries, BarChartVariant, BarChartProps } from './BarChart';
@@ -0,0 +1,2 @@
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const z=require("react/jsx-runtime"),r=require("react"),B=require("../ChartTooltip/ChartTooltip.cjs"),A=require("../plotly-loader.cjs"),S=require("../../../hooks/use-element-size.cjs"),h=require("../../../hooks/use-plotly-theme.cjs"),U=require("../../../lib/utils.cjs"),W=require("../../../utils/colors.cjs"),V=-1.8,D=({dataSeries:p,width:C,height:b,xRange:x,yRange:g,xTitle:M,yTitle:w,title:v="Box Plot",showPoints:L=!1})=>{const s=r.useRef(null),e=h.usePlotlyTheme(),{bindTooltip:F,tooltipElement:I}=B.useChartTooltip({xLabel:M,yLabel:w}),[Y,k]=S.useElementSize(),i=C??k.width,l=b??k.height,E=i>0&&l>0,q=C===void 0,H=b===void 0,m=r.useRef({width:i,height:l});m.current={width:i,height:l};const _=r.useRef(!1),y=r.useRef({width:0,height:0}),{yMin:N,yMax:O}=r.useMemo(()=>{let o=Number.MAX_VALUE,t=Number.MIN_VALUE;p.forEach(c=>{c.y.forEach(d=>{o=Math.min(o,d),t=Math.max(t,d)})});const a=(t-o)*.1;return{yMin:o-a,yMax:t+a}},[p]),f=r.useMemo(()=>g||[N,O],[g,N,O]),P=r.useMemo(()=>{const o=f[1]-f[0];let t=Math.pow(10,Math.floor(Math.log10(o)));o/t>10&&(t=t*2),o/t<4&&(t=t/2);const a=[];let c=Math.ceil(f[0]/t)*t;for(;c<=f[1];)a.push(c),c+=t;return a},[f]),T=r.useMemo(()=>({tickcolor:e.tickColor,ticklen:12,tickwidth:1,ticks:"outside",tickfont:{size:16,color:e.textColor,family:h.CHART_FONT_FAMILY,weight:400},linecolor:e.lineColor,linewidth:1,position:0,zeroline:!1}),[e]),R=r.useMemo(()=>({text:v,x:.5,y:.95,xanchor:"center",yanchor:"top",font:{size:32,weight:600,family:h.CHART_FONT_FAMILY,color:e.textColor,lineheight:1.2,standoff:30}}),[v,e]);return r.useEffect(()=>{if(!s.current||!E)return;const o=p.map((n,j)=>{const u=W.seriesColor(j,n.color);return{y:n.y,x:n.x,type:"box",name:n.name,hoverinfo:"none",marker:{color:u},line:{color:u},fillcolor:typeof u=="string"&&u.startsWith("#")&&u.length===7?`${u}40`:u,boxpoints:L?n.boxpoints||"outliers":!1,jitter:n.jitter||.3,pointpos:n.pointpos||V}}),t={width:m.current.width,height:m.current.height,title:R,margin:{l:80,r:40,b:96,t:80,pad:0},paper_bgcolor:e.paperBg,plot_bgcolor:e.plotBg,font:{family:h.CHART_FONT_FAMILY},dragmode:!1,xaxis:{title:{text:M,font:{size:16,color:e.textSecondary,family:h.CHART_FONT_FAMILY,weight:400},standoff:15},gridcolor:e.gridColor,range:x,autorange:!x,showgrid:!0,automargin:!0,...T},yaxis:{title:{text:w,font:{size:16,color:e.textSecondary,family:h.CHART_FONT_FAMILY,weight:400},standoff:15},gridcolor:e.gridColor,range:g,autorange:!g,tickmode:"array",tickvals:P,showgrid:!0,automargin:!0,...T},legend:{x:.5,y:0,xanchor:"center",yanchor:"bottom",yref:"container",orientation:"h",font:{size:13,color:e.legendColor,family:h.CHART_FONT_FAMILY,weight:500,lineheight:18}},showlegend:!0},a={responsive:!1,displayModeBar:!1,displaylogo:!1};let c=!1,d=null;return A.loadPlotly().then(n=>{c||!s.current||(n.newPlot(s.current,o,t,a),F(s.current),d=s.current,_.current=!0,y.current={...m.current})}),()=>{c=!0,d&&(A.getLoadedPlotly().purge(d),_.current=!1)}},[p,E,x,g,f,M,w,L,R,T,P,e,F]),r.useEffect(()=>{const o=s.current;!o||!_.current||i<=0||l<=0||y.current.width===i&&y.current.height===l||(y.current={width:i,height:l},A.getLoadedPlotly().relayout(o,{width:i,height:l}).catch(()=>{}))},[i,l]),z.jsxs("div",{ref:Y,className:U.cn("boxplot-container relative",q&&"w-full",H&&"h-full"),children:[z.jsx("div",{ref:s,style:{width:"100%",height:"100%"}}),I]})};exports.BoxPlot=D;
2
+ //# sourceMappingURL=BoxPlot.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"BoxPlot.cjs","sources":["../../../../src/components/charts/BoxPlot/BoxPlot.tsx"],"sourcesContent":["import React, { useEffect, useRef, useMemo } from \"react\";\n\nimport { useChartTooltip } from \"../ChartTooltip\";\nimport { getLoadedPlotly, loadPlotly } from \"../plotly-loader\";\n\nimport { useElementSize } from \"@/hooks/use-element-size\";\nimport { CHART_FONT_FAMILY, usePlotlyTheme } from \"@/hooks/use-plotly-theme\";\nimport { cn } from \"@/lib/utils\";\nimport { seriesColor } from \"@/utils/colors\";\n\n/** Default point position offset from the box edge */\nconst DEFAULT_POINT_POSITION = -1.8;\n\ninterface BoxDataSeries {\n y: number[];\n name: string;\n /** Optional color override (auto-assigned from CHART_COLORS if not provided) */\n color?: string;\n x?: string[] | number[];\n boxpoints?: \"all\" | \"outliers\" | \"suspectedoutliers\" | false;\n jitter?: number;\n pointpos?: number;\n}\n\ninterface BoxPlotProps {\n dataSeries: BoxDataSeries[];\n /**\n * Fixed width in pixels. When omitted, the chart fills its container and\n * tracks the container's width via a `ResizeObserver`.\n */\n width?: number;\n /**\n * Fixed height in pixels. When omitted, the chart fills its container and\n * tracks the container's height via a `ResizeObserver`.\n */\n height?: number;\n xRange?: [number, number];\n yRange?: [number, number];\n xTitle?: string;\n yTitle?: string;\n title?: string;\n showPoints?: boolean;\n}\n\nconst BoxPlot: React.FC<BoxPlotProps> = ({\n dataSeries,\n width,\n height,\n xRange,\n yRange,\n xTitle,\n yTitle,\n title = \"Box Plot\",\n showPoints = false,\n}) => {\n const plotRef = useRef<HTMLDivElement>(null);\n const theme = usePlotlyTheme();\n const { bindTooltip, tooltipElement } = useChartTooltip({ xLabel: xTitle, yLabel: yTitle });\n\n // Omitted width/height → fill the container and track its measured size;\n // explicit pixel values override. See AreaPlot for the reference pattern.\n const [containerRef, measured] = useElementSize<HTMLDivElement>();\n const resolvedWidth = width ?? measured.width;\n const resolvedHeight = height ?? measured.height;\n const hasSize = resolvedWidth > 0 && resolvedHeight > 0;\n // Fill is per-dimension: omit width to fill the container width, omit height\n // to fill its height (so e.g. a fixed width with a container-driven height works).\n const fillWidth = width === undefined;\n const fillHeight = height === undefined;\n const sizeRef = useRef({ width: resolvedWidth, height: resolvedHeight });\n sizeRef.current = { width: resolvedWidth, height: resolvedHeight };\n const plotInitedRef = useRef(false);\n // Size last applied to the plot, so the resize effect can skip a redundant\n // relayout right after newPlot already drew at that size.\n const appliedSizeRef = useRef({ width: 0, height: 0 });\n\n const { yMin, yMax } = useMemo(() => {\n let minY = Number.MAX_VALUE;\n let maxY = Number.MIN_VALUE;\n\n dataSeries.forEach((series) => {\n series.y.forEach((y) => {\n minY = Math.min(minY, y);\n maxY = Math.max(maxY, y);\n });\n });\n\n const yPadding = (maxY - minY) * 0.1;\n\n return {\n yMin: minY - yPadding,\n yMax: maxY + yPadding,\n };\n }, [dataSeries]);\n\n const effectiveYRange = useMemo(\n () => yRange || [yMin, yMax],\n [yRange, yMin, yMax],\n );\n\n const yTicks = useMemo(() => {\n const range = effectiveYRange[1] - effectiveYRange[0];\n let step = Math.pow(10, Math.floor(Math.log10(range)));\n\n if (range / step > 10) step = step * 2;\n if (range / step < 4) step = step / 2;\n\n const ticks = [];\n let current = Math.ceil(effectiveYRange[0] / step) * step;\n while (current <= effectiveYRange[1]) {\n ticks.push(current);\n current += step;\n }\n return ticks;\n }, [effectiveYRange]);\n\n const tickOptions = useMemo(\n () => ({\n tickcolor: theme.tickColor,\n ticklen: 12,\n tickwidth: 1,\n ticks: \"outside\" as const,\n tickfont: {\n size: 16,\n color: theme.textColor,\n family: CHART_FONT_FAMILY,\n weight: 400,\n },\n linecolor: theme.lineColor,\n linewidth: 1,\n position: 0,\n zeroline: false,\n }),\n [theme],\n );\n\n const titleOptions = useMemo(\n () => ({\n text: title,\n x: 0.5,\n y: 0.95,\n xanchor: \"center\" as const,\n yanchor: \"top\" as const,\n font: {\n size: 32,\n weight: 600,\n family: CHART_FONT_FAMILY,\n color: theme.textColor,\n lineheight: 1.2,\n standoff: 30,\n },\n }),\n [title, theme],\n );\n\n useEffect(() => {\n if (!plotRef.current || !hasSize) return;\n\n const data = dataSeries.map((series, index) => {\n const color = seriesColor(index, series.color);\n return {\n y: series.y,\n x: series.x,\n type: \"box\" as const,\n name: series.name,\n hoverinfo: \"none\" as const,\n marker: {\n color,\n },\n line: {\n color,\n },\n fillcolor:\n typeof color === \"string\" && color.startsWith(\"#\") && color.length === 7\n ? `${color}40`\n : color, // Add transparency for hex colors only\n boxpoints: showPoints\n ? series.boxpoints || \"outliers\"\n : (false as const),\n jitter: series.jitter || 0.3,\n pointpos: series.pointpos || DEFAULT_POINT_POSITION,\n };\n });\n\n const layout = {\n width: sizeRef.current.width,\n height: sizeRef.current.height,\n title: titleOptions,\n // Bottom margin reserves room for tick labels, the x-axis title, and the\n // container-anchored bottom legend stacked beneath them.\n margin: { l: 80, r: 40, b: 96, t: 80, pad: 0 },\n paper_bgcolor: theme.paperBg,\n plot_bgcolor: theme.plotBg,\n font: {\n family: CHART_FONT_FAMILY,\n },\n dragmode: false as const,\n xaxis: {\n title: {\n text: xTitle,\n font: {\n size: 16,\n color: theme.textSecondary,\n family: CHART_FONT_FAMILY,\n weight: 400,\n },\n standoff: 15,\n },\n gridcolor: theme.gridColor,\n range: xRange,\n autorange: !xRange,\n showgrid: true,\n // Reserve space for tick labels + the axis title so the bottom legend\n // can't overlap them at small sizes (SW-2157).\n automargin: true,\n ...tickOptions,\n },\n yaxis: {\n title: {\n text: yTitle,\n font: {\n size: 16,\n color: theme.textSecondary,\n family: CHART_FONT_FAMILY,\n weight: 400,\n },\n standoff: 15,\n },\n gridcolor: theme.gridColor,\n range: yRange,\n autorange: !yRange,\n tickmode: \"array\" as const,\n tickvals: yTicks,\n showgrid: true,\n automargin: true,\n ...tickOptions,\n },\n legend: {\n // Anchor to the bottom of the container (not the plot area) so the\n // legend always clears the x-axis tick labels + title — a paper-relative\n // fractional offset collapses into the ticks at small heights (SW-2157).\n x: 0.5,\n y: 0,\n xanchor: \"center\" as const,\n yanchor: \"bottom\" as const,\n yref: \"container\" as const,\n orientation: \"h\" as const,\n font: {\n size: 13,\n color: theme.legendColor,\n family: CHART_FONT_FAMILY,\n weight: 500,\n lineheight: 18,\n },\n },\n showlegend: true,\n };\n\n const config = {\n // Sizing is driven from the measured container; disable Plotly's own\n // window-resize responsiveness (it can't see container resizes).\n responsive: false,\n displayModeBar: false,\n displaylogo: false,\n };\n\n // Plotly is loaded lazily so it stays out of the consumer's main chunk\n // (SW-2007); the draw is skipped if the effect re-runs or unmounts first.\n let cancelled = false;\n let plotElement: HTMLDivElement | null = null;\n void loadPlotly().then((plotly) => {\n if (cancelled || !plotRef.current) return;\n plotly.newPlot(plotRef.current, data, layout, config);\n bindTooltip(plotRef.current);\n\n // Capture ref value for cleanup\n plotElement = plotRef.current;\n plotInitedRef.current = true;\n appliedSizeRef.current = { ...sizeRef.current };\n });\n\n return () => {\n cancelled = true;\n if (plotElement) {\n getLoadedPlotly().purge(plotElement);\n plotInitedRef.current = false;\n }\n };\n }, [dataSeries, hasSize, xRange, yRange, effectiveYRange, xTitle, yTitle, showPoints, titleOptions, tickOptions, yTicks, theme, bindTooltip]);\n\n // Resize in place when the measured/overridden size changes — cheaper than\n // recreating the plot, and it preserves tooltip/event bindings.\n useEffect(() => {\n const plotElement = plotRef.current;\n if (!plotElement || !plotInitedRef.current || resolvedWidth <= 0 || resolvedHeight <= 0) {\n return;\n }\n // newPlot already drew at the current size; skip the redundant relayout\n // (it would queue an automargin redraw that can reject if we unmount first).\n if (\n appliedSizeRef.current.width === resolvedWidth &&\n appliedSizeRef.current.height === resolvedHeight\n ) {\n return;\n }\n appliedSizeRef.current = { width: resolvedWidth, height: resolvedHeight };\n // Swallow rejections from a relayout that races an unmount/purge.\n // plotInitedRef guarantees Plotly finished loading, so sync access is safe.\n void getLoadedPlotly()\n .relayout(plotElement, { width: resolvedWidth, height: resolvedHeight })\n .catch(() => {});\n }, [resolvedWidth, resolvedHeight]);\n\n return (\n <div\n ref={containerRef}\n className={cn(\"boxplot-container relative\", fillWidth && \"w-full\", fillHeight && \"h-full\")}\n >\n <div ref={plotRef} style={{ width: \"100%\", height: \"100%\" }} />\n {tooltipElement}\n </div>\n );\n};\n\nexport { BoxPlot };\nexport type { BoxDataSeries, BoxPlotProps };\n"],"names":["DEFAULT_POINT_POSITION","BoxPlot","dataSeries","width","height","xRange","yRange","xTitle","yTitle","title","showPoints","plotRef","useRef","theme","usePlotlyTheme","bindTooltip","tooltipElement","useChartTooltip","containerRef","measured","useElementSize","resolvedWidth","resolvedHeight","hasSize","fillWidth","fillHeight","sizeRef","plotInitedRef","appliedSizeRef","yMin","yMax","useMemo","minY","maxY","series","y","yPadding","effectiveYRange","yTicks","range","step","ticks","current","tickOptions","CHART_FONT_FAMILY","titleOptions","useEffect","data","index","color","seriesColor","layout","config","cancelled","plotElement","loadPlotly","plotly","getLoadedPlotly","jsxs","cn","jsx"],"mappings":"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"}
@@ -0,0 +1,33 @@
1
+ import { default as React } from 'react';
2
+ interface BoxDataSeries {
3
+ y: number[];
4
+ name: string;
5
+ /** Optional color override (auto-assigned from CHART_COLORS if not provided) */
6
+ color?: string;
7
+ x?: string[] | number[];
8
+ boxpoints?: "all" | "outliers" | "suspectedoutliers" | false;
9
+ jitter?: number;
10
+ pointpos?: number;
11
+ }
12
+ interface BoxPlotProps {
13
+ dataSeries: BoxDataSeries[];
14
+ /**
15
+ * Fixed width in pixels. When omitted, the chart fills its container and
16
+ * tracks the container's width via a `ResizeObserver`.
17
+ */
18
+ width?: number;
19
+ /**
20
+ * Fixed height in pixels. When omitted, the chart fills its container and
21
+ * tracks the container's height via a `ResizeObserver`.
22
+ */
23
+ height?: number;
24
+ xRange?: [number, number];
25
+ yRange?: [number, number];
26
+ xTitle?: string;
27
+ yTitle?: string;
28
+ title?: string;
29
+ showPoints?: boolean;
30
+ }
31
+ declare const BoxPlot: React.FC<BoxPlotProps>;
32
+ export { BoxPlot };
33
+ export type { BoxDataSeries, BoxPlotProps };
@@ -0,0 +1,208 @@
1
+ import { jsxs as W, jsx as R } from "react/jsx-runtime";
2
+ import { useRef as x, useMemo as m, useEffect as T } from "react";
3
+ import { useChartTooltip as V } from "../ChartTooltip/ChartTooltip.js";
4
+ import { loadPlotly as D, getLoadedPlotly as j } from "../plotly-loader.js";
5
+ import { useElementSize as X } from "../../../hooks/use-element-size.js";
6
+ import { usePlotlyTheme as $, CHART_FONT_FAMILY as u } from "../../../hooks/use-plotly-theme.js";
7
+ import { cn as q } from "../../../lib/utils.js";
8
+ import { seriesColor as G } from "../../../utils/colors.js";
9
+ const J = -1.8, nt = ({
10
+ dataSeries: p,
11
+ width: z,
12
+ height: C,
13
+ xRange: w,
14
+ yRange: d,
15
+ xTitle: M,
16
+ yTitle: b,
17
+ title: E = "Box Plot",
18
+ showPoints: P = !1
19
+ }) => {
20
+ const c = x(null), o = $(), { bindTooltip: _, tooltipElement: Y } = V({ xLabel: M, yLabel: b }), [F, L] = X(), i = z ?? L.width, n = C ?? L.height, N = i > 0 && n > 0, H = z === void 0, S = C === void 0, g = x({ width: i, height: n });
21
+ g.current = { width: i, height: n };
22
+ const v = x(!1), y = x({ width: 0, height: 0 }), { yMin: A, yMax: I } = m(() => {
23
+ let e = Number.MAX_VALUE, t = Number.MIN_VALUE;
24
+ p.forEach((l) => {
25
+ l.y.forEach((f) => {
26
+ e = Math.min(e, f), t = Math.max(t, f);
27
+ });
28
+ });
29
+ const a = (t - e) * 0.1;
30
+ return {
31
+ yMin: e - a,
32
+ yMax: t + a
33
+ };
34
+ }, [p]), h = m(
35
+ () => d || [A, I],
36
+ [d, A, I]
37
+ ), O = m(() => {
38
+ const e = h[1] - h[0];
39
+ let t = Math.pow(10, Math.floor(Math.log10(e)));
40
+ e / t > 10 && (t = t * 2), e / t < 4 && (t = t / 2);
41
+ const a = [];
42
+ let l = Math.ceil(h[0] / t) * t;
43
+ for (; l <= h[1]; )
44
+ a.push(l), l += t;
45
+ return a;
46
+ }, [h]), k = m(
47
+ () => ({
48
+ tickcolor: o.tickColor,
49
+ ticklen: 12,
50
+ tickwidth: 1,
51
+ ticks: "outside",
52
+ tickfont: {
53
+ size: 16,
54
+ color: o.textColor,
55
+ family: u,
56
+ weight: 400
57
+ },
58
+ linecolor: o.lineColor,
59
+ linewidth: 1,
60
+ position: 0,
61
+ zeroline: !1
62
+ }),
63
+ [o]
64
+ ), B = m(
65
+ () => ({
66
+ text: E,
67
+ x: 0.5,
68
+ y: 0.95,
69
+ xanchor: "center",
70
+ yanchor: "top",
71
+ font: {
72
+ size: 32,
73
+ weight: 600,
74
+ family: u,
75
+ color: o.textColor,
76
+ lineheight: 1.2,
77
+ standoff: 30
78
+ }
79
+ }),
80
+ [E, o]
81
+ );
82
+ return T(() => {
83
+ if (!c.current || !N) return;
84
+ const e = p.map((r, U) => {
85
+ const s = G(U, r.color);
86
+ return {
87
+ y: r.y,
88
+ x: r.x,
89
+ type: "box",
90
+ name: r.name,
91
+ hoverinfo: "none",
92
+ marker: {
93
+ color: s
94
+ },
95
+ line: {
96
+ color: s
97
+ },
98
+ fillcolor: typeof s == "string" && s.startsWith("#") && s.length === 7 ? `${s}40` : s,
99
+ // Add transparency for hex colors only
100
+ boxpoints: P ? r.boxpoints || "outliers" : !1,
101
+ jitter: r.jitter || 0.3,
102
+ pointpos: r.pointpos || J
103
+ };
104
+ }), t = {
105
+ width: g.current.width,
106
+ height: g.current.height,
107
+ title: B,
108
+ // Bottom margin reserves room for tick labels, the x-axis title, and the
109
+ // container-anchored bottom legend stacked beneath them.
110
+ margin: { l: 80, r: 40, b: 96, t: 80, pad: 0 },
111
+ paper_bgcolor: o.paperBg,
112
+ plot_bgcolor: o.plotBg,
113
+ font: {
114
+ family: u
115
+ },
116
+ dragmode: !1,
117
+ xaxis: {
118
+ title: {
119
+ text: M,
120
+ font: {
121
+ size: 16,
122
+ color: o.textSecondary,
123
+ family: u,
124
+ weight: 400
125
+ },
126
+ standoff: 15
127
+ },
128
+ gridcolor: o.gridColor,
129
+ range: w,
130
+ autorange: !w,
131
+ showgrid: !0,
132
+ // Reserve space for tick labels + the axis title so the bottom legend
133
+ // can't overlap them at small sizes (SW-2157).
134
+ automargin: !0,
135
+ ...k
136
+ },
137
+ yaxis: {
138
+ title: {
139
+ text: b,
140
+ font: {
141
+ size: 16,
142
+ color: o.textSecondary,
143
+ family: u,
144
+ weight: 400
145
+ },
146
+ standoff: 15
147
+ },
148
+ gridcolor: o.gridColor,
149
+ range: d,
150
+ autorange: !d,
151
+ tickmode: "array",
152
+ tickvals: O,
153
+ showgrid: !0,
154
+ automargin: !0,
155
+ ...k
156
+ },
157
+ legend: {
158
+ // Anchor to the bottom of the container (not the plot area) so the
159
+ // legend always clears the x-axis tick labels + title — a paper-relative
160
+ // fractional offset collapses into the ticks at small heights (SW-2157).
161
+ x: 0.5,
162
+ y: 0,
163
+ xanchor: "center",
164
+ yanchor: "bottom",
165
+ yref: "container",
166
+ orientation: "h",
167
+ font: {
168
+ size: 13,
169
+ color: o.legendColor,
170
+ family: u,
171
+ weight: 500,
172
+ lineheight: 18
173
+ }
174
+ },
175
+ showlegend: !0
176
+ }, a = {
177
+ // Sizing is driven from the measured container; disable Plotly's own
178
+ // window-resize responsiveness (it can't see container resizes).
179
+ responsive: !1,
180
+ displayModeBar: !1,
181
+ displaylogo: !1
182
+ };
183
+ let l = !1, f = null;
184
+ return D().then((r) => {
185
+ l || !c.current || (r.newPlot(c.current, e, t, a), _(c.current), f = c.current, v.current = !0, y.current = { ...g.current });
186
+ }), () => {
187
+ l = !0, f && (j().purge(f), v.current = !1);
188
+ };
189
+ }, [p, N, w, d, h, M, b, P, B, k, O, o, _]), T(() => {
190
+ const e = c.current;
191
+ !e || !v.current || i <= 0 || n <= 0 || y.current.width === i && y.current.height === n || (y.current = { width: i, height: n }, j().relayout(e, { width: i, height: n }).catch(() => {
192
+ }));
193
+ }, [i, n]), /* @__PURE__ */ W(
194
+ "div",
195
+ {
196
+ ref: F,
197
+ className: q("boxplot-container relative", H && "w-full", S && "h-full"),
198
+ children: [
199
+ /* @__PURE__ */ R("div", { ref: c, style: { width: "100%", height: "100%" } }),
200
+ Y
201
+ ]
202
+ }
203
+ );
204
+ };
205
+ export {
206
+ nt as BoxPlot
207
+ };
208
+ //# sourceMappingURL=BoxPlot.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"BoxPlot.js","sources":["../../../../src/components/charts/BoxPlot/BoxPlot.tsx"],"sourcesContent":["import React, { useEffect, useRef, useMemo } from \"react\";\n\nimport { useChartTooltip } from \"../ChartTooltip\";\nimport { getLoadedPlotly, loadPlotly } from \"../plotly-loader\";\n\nimport { useElementSize } from \"@/hooks/use-element-size\";\nimport { CHART_FONT_FAMILY, usePlotlyTheme } from \"@/hooks/use-plotly-theme\";\nimport { cn } from \"@/lib/utils\";\nimport { seriesColor } from \"@/utils/colors\";\n\n/** Default point position offset from the box edge */\nconst DEFAULT_POINT_POSITION = -1.8;\n\ninterface BoxDataSeries {\n y: number[];\n name: string;\n /** Optional color override (auto-assigned from CHART_COLORS if not provided) */\n color?: string;\n x?: string[] | number[];\n boxpoints?: \"all\" | \"outliers\" | \"suspectedoutliers\" | false;\n jitter?: number;\n pointpos?: number;\n}\n\ninterface BoxPlotProps {\n dataSeries: BoxDataSeries[];\n /**\n * Fixed width in pixels. When omitted, the chart fills its container and\n * tracks the container's width via a `ResizeObserver`.\n */\n width?: number;\n /**\n * Fixed height in pixels. When omitted, the chart fills its container and\n * tracks the container's height via a `ResizeObserver`.\n */\n height?: number;\n xRange?: [number, number];\n yRange?: [number, number];\n xTitle?: string;\n yTitle?: string;\n title?: string;\n showPoints?: boolean;\n}\n\nconst BoxPlot: React.FC<BoxPlotProps> = ({\n dataSeries,\n width,\n height,\n xRange,\n yRange,\n xTitle,\n yTitle,\n title = \"Box Plot\",\n showPoints = false,\n}) => {\n const plotRef = useRef<HTMLDivElement>(null);\n const theme = usePlotlyTheme();\n const { bindTooltip, tooltipElement } = useChartTooltip({ xLabel: xTitle, yLabel: yTitle });\n\n // Omitted width/height → fill the container and track its measured size;\n // explicit pixel values override. See AreaPlot for the reference pattern.\n const [containerRef, measured] = useElementSize<HTMLDivElement>();\n const resolvedWidth = width ?? measured.width;\n const resolvedHeight = height ?? measured.height;\n const hasSize = resolvedWidth > 0 && resolvedHeight > 0;\n // Fill is per-dimension: omit width to fill the container width, omit height\n // to fill its height (so e.g. a fixed width with a container-driven height works).\n const fillWidth = width === undefined;\n const fillHeight = height === undefined;\n const sizeRef = useRef({ width: resolvedWidth, height: resolvedHeight });\n sizeRef.current = { width: resolvedWidth, height: resolvedHeight };\n const plotInitedRef = useRef(false);\n // Size last applied to the plot, so the resize effect can skip a redundant\n // relayout right after newPlot already drew at that size.\n const appliedSizeRef = useRef({ width: 0, height: 0 });\n\n const { yMin, yMax } = useMemo(() => {\n let minY = Number.MAX_VALUE;\n let maxY = Number.MIN_VALUE;\n\n dataSeries.forEach((series) => {\n series.y.forEach((y) => {\n minY = Math.min(minY, y);\n maxY = Math.max(maxY, y);\n });\n });\n\n const yPadding = (maxY - minY) * 0.1;\n\n return {\n yMin: minY - yPadding,\n yMax: maxY + yPadding,\n };\n }, [dataSeries]);\n\n const effectiveYRange = useMemo(\n () => yRange || [yMin, yMax],\n [yRange, yMin, yMax],\n );\n\n const yTicks = useMemo(() => {\n const range = effectiveYRange[1] - effectiveYRange[0];\n let step = Math.pow(10, Math.floor(Math.log10(range)));\n\n if (range / step > 10) step = step * 2;\n if (range / step < 4) step = step / 2;\n\n const ticks = [];\n let current = Math.ceil(effectiveYRange[0] / step) * step;\n while (current <= effectiveYRange[1]) {\n ticks.push(current);\n current += step;\n }\n return ticks;\n }, [effectiveYRange]);\n\n const tickOptions = useMemo(\n () => ({\n tickcolor: theme.tickColor,\n ticklen: 12,\n tickwidth: 1,\n ticks: \"outside\" as const,\n tickfont: {\n size: 16,\n color: theme.textColor,\n family: CHART_FONT_FAMILY,\n weight: 400,\n },\n linecolor: theme.lineColor,\n linewidth: 1,\n position: 0,\n zeroline: false,\n }),\n [theme],\n );\n\n const titleOptions = useMemo(\n () => ({\n text: title,\n x: 0.5,\n y: 0.95,\n xanchor: \"center\" as const,\n yanchor: \"top\" as const,\n font: {\n size: 32,\n weight: 600,\n family: CHART_FONT_FAMILY,\n color: theme.textColor,\n lineheight: 1.2,\n standoff: 30,\n },\n }),\n [title, theme],\n );\n\n useEffect(() => {\n if (!plotRef.current || !hasSize) return;\n\n const data = dataSeries.map((series, index) => {\n const color = seriesColor(index, series.color);\n return {\n y: series.y,\n x: series.x,\n type: \"box\" as const,\n name: series.name,\n hoverinfo: \"none\" as const,\n marker: {\n color,\n },\n line: {\n color,\n },\n fillcolor:\n typeof color === \"string\" && color.startsWith(\"#\") && color.length === 7\n ? `${color}40`\n : color, // Add transparency for hex colors only\n boxpoints: showPoints\n ? series.boxpoints || \"outliers\"\n : (false as const),\n jitter: series.jitter || 0.3,\n pointpos: series.pointpos || DEFAULT_POINT_POSITION,\n };\n });\n\n const layout = {\n width: sizeRef.current.width,\n height: sizeRef.current.height,\n title: titleOptions,\n // Bottom margin reserves room for tick labels, the x-axis title, and the\n // container-anchored bottom legend stacked beneath them.\n margin: { l: 80, r: 40, b: 96, t: 80, pad: 0 },\n paper_bgcolor: theme.paperBg,\n plot_bgcolor: theme.plotBg,\n font: {\n family: CHART_FONT_FAMILY,\n },\n dragmode: false as const,\n xaxis: {\n title: {\n text: xTitle,\n font: {\n size: 16,\n color: theme.textSecondary,\n family: CHART_FONT_FAMILY,\n weight: 400,\n },\n standoff: 15,\n },\n gridcolor: theme.gridColor,\n range: xRange,\n autorange: !xRange,\n showgrid: true,\n // Reserve space for tick labels + the axis title so the bottom legend\n // can't overlap them at small sizes (SW-2157).\n automargin: true,\n ...tickOptions,\n },\n yaxis: {\n title: {\n text: yTitle,\n font: {\n size: 16,\n color: theme.textSecondary,\n family: CHART_FONT_FAMILY,\n weight: 400,\n },\n standoff: 15,\n },\n gridcolor: theme.gridColor,\n range: yRange,\n autorange: !yRange,\n tickmode: \"array\" as const,\n tickvals: yTicks,\n showgrid: true,\n automargin: true,\n ...tickOptions,\n },\n legend: {\n // Anchor to the bottom of the container (not the plot area) so the\n // legend always clears the x-axis tick labels + title — a paper-relative\n // fractional offset collapses into the ticks at small heights (SW-2157).\n x: 0.5,\n y: 0,\n xanchor: \"center\" as const,\n yanchor: \"bottom\" as const,\n yref: \"container\" as const,\n orientation: \"h\" as const,\n font: {\n size: 13,\n color: theme.legendColor,\n family: CHART_FONT_FAMILY,\n weight: 500,\n lineheight: 18,\n },\n },\n showlegend: true,\n };\n\n const config = {\n // Sizing is driven from the measured container; disable Plotly's own\n // window-resize responsiveness (it can't see container resizes).\n responsive: false,\n displayModeBar: false,\n displaylogo: false,\n };\n\n // Plotly is loaded lazily so it stays out of the consumer's main chunk\n // (SW-2007); the draw is skipped if the effect re-runs or unmounts first.\n let cancelled = false;\n let plotElement: HTMLDivElement | null = null;\n void loadPlotly().then((plotly) => {\n if (cancelled || !plotRef.current) return;\n plotly.newPlot(plotRef.current, data, layout, config);\n bindTooltip(plotRef.current);\n\n // Capture ref value for cleanup\n plotElement = plotRef.current;\n plotInitedRef.current = true;\n appliedSizeRef.current = { ...sizeRef.current };\n });\n\n return () => {\n cancelled = true;\n if (plotElement) {\n getLoadedPlotly().purge(plotElement);\n plotInitedRef.current = false;\n }\n };\n }, [dataSeries, hasSize, xRange, yRange, effectiveYRange, xTitle, yTitle, showPoints, titleOptions, tickOptions, yTicks, theme, bindTooltip]);\n\n // Resize in place when the measured/overridden size changes — cheaper than\n // recreating the plot, and it preserves tooltip/event bindings.\n useEffect(() => {\n const plotElement = plotRef.current;\n if (!plotElement || !plotInitedRef.current || resolvedWidth <= 0 || resolvedHeight <= 0) {\n return;\n }\n // newPlot already drew at the current size; skip the redundant relayout\n // (it would queue an automargin redraw that can reject if we unmount first).\n if (\n appliedSizeRef.current.width === resolvedWidth &&\n appliedSizeRef.current.height === resolvedHeight\n ) {\n return;\n }\n appliedSizeRef.current = { width: resolvedWidth, height: resolvedHeight };\n // Swallow rejections from a relayout that races an unmount/purge.\n // plotInitedRef guarantees Plotly finished loading, so sync access is safe.\n void getLoadedPlotly()\n .relayout(plotElement, { width: resolvedWidth, height: resolvedHeight })\n .catch(() => {});\n }, [resolvedWidth, resolvedHeight]);\n\n return (\n <div\n ref={containerRef}\n className={cn(\"boxplot-container relative\", fillWidth && \"w-full\", fillHeight && \"h-full\")}\n >\n <div ref={plotRef} style={{ width: \"100%\", height: \"100%\" }} />\n {tooltipElement}\n </div>\n );\n};\n\nexport { BoxPlot };\nexport type { BoxDataSeries, BoxPlotProps };\n"],"names":["DEFAULT_POINT_POSITION","BoxPlot","dataSeries","width","height","xRange","yRange","xTitle","yTitle","title","showPoints","plotRef","useRef","theme","usePlotlyTheme","bindTooltip","tooltipElement","useChartTooltip","containerRef","measured","useElementSize","resolvedWidth","resolvedHeight","hasSize","fillWidth","fillHeight","sizeRef","plotInitedRef","appliedSizeRef","yMin","yMax","useMemo","minY","maxY","series","y","yPadding","effectiveYRange","yTicks","range","step","ticks","current","tickOptions","CHART_FONT_FAMILY","titleOptions","useEffect","data","index","color","seriesColor","layout","config","cancelled","plotElement","loadPlotly","plotly","getLoadedPlotly","jsxs","cn","jsx"],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export { BoxPlot } from './BoxPlot';
2
+ export type { BoxDataSeries, BoxPlotProps } from './BoxPlot';
@@ -1,2 +1,2 @@
1
- "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const m=require("react/jsx-runtime"),j=require("plotly.js-dist"),u=require("react"),O=require("react-dom"),A=require("./lines.cjs"),L=require("../../../lib/utils.cjs"),X=20,q=150,H=200,y=8,W=10,I={top:"bottom",bottom:"top",left:"right",right:"left"},z={top:{wrapper:"-translate-x-1/2 -translate-y-[calc(100%+10px)]",arrow:"-bottom-1 left-1/2 -translate-x-1/2"},bottom:{wrapper:"-translate-x-1/2 translate-y-[10px]",arrow:"-top-1 left-1/2 -translate-x-1/2"},left:{wrapper:"-translate-y-1/2 -translate-x-[calc(100%+10px)]",arrow:"-right-1 top-1/2 -translate-y-1/2"},right:{wrapper:"-translate-y-1/2 translate-x-[10px]",arrow:"-left-1 top-1/2 -translate-y-1/2"}},k=(t,o,n,r)=>{const e=y,s=W,i={top:o.top-s-r>=e,bottom:o.top+s+r<=window.innerHeight-e,left:o.left-s-n>=e,right:o.left+s+n<=window.innerWidth-e};return!i[t]&&i[I[t]]?I[t]:t};function N({anchor:t,bubbleRef:o}){const n=u.useRef(null),r=t?.side??"top",[e,s]=u.useState(r),i=u.useCallback(l=>{n.current=l,typeof o=="function"?o(l):o&&(o.current=l)},[o]);if(u.useLayoutEffect(()=>{const l=n.current;if(!t||!l)return;const c=k(r,t,l.offsetWidth,l.offsetHeight);s(x=>x===c?x:c)},[t,r]),!t)return null;const p=z[e];return O.createPortal(m.jsx("div",{"data-slot":"chart-tooltip-anchor",className:"pointer-events-none fixed z-50",style:{left:t.left,top:t.top},children:m.jsx("div",{ref:i,className:L.cn("w-max",p.wrapper),children:m.jsxs("div",{role:"tooltip","data-slot":"tooltip-content","data-side":e,className:L.cn("relative w-fit max-w-xs rounded-md bg-foreground px-3 py-1.5 text-xs text-background",t.closing?"animate-out fade-out zoom-out-95 fill-mode-forwards":"animate-in fade-in-0 zoom-in-95"),children:[t.lines.map((l,c)=>m.jsx("div",{children:l},`${c}-${l}`)),m.jsx("span",{"aria-hidden":!0,className:L.cn("absolute size-2.5 rotate-45 rounded-[2px] bg-foreground",p.arrow)})]})})}),document.body)}const G=(t,o,n,r)=>{const e=n/2,s=Math.min(Math.max(t,e+y),window.innerWidth-e-y),i=Math.min(Math.max(o,r+10+y),window.innerHeight-y);return{left:s,top:i}};function Y(t={}){const[o,n]=u.useState(null),r=u.useRef(void 0),e=u.useRef(t);e.current=t;const s=u.useRef(null),i=u.useRef(null),p=u.useRef(null);return{bindTooltip:u.useCallback(c=>{if(!c)return;p.current?.(),p.current=null,n(null),i.current=null,j.relayout(c,{hoverdistance:e.current.hoverDistance??X});const x=c,M=(a,f,w)=>{const T=s.current,{left:v,top:R}=G(f,w,T?.offsetWidth??0,T?.offsetHeight??0);n({left:v,top:R,lines:a,side:e.current.side})};x.on("plotly_hover",a=>{const f=a.points??[],{getLines:w,xLabel:T,yLabel:v,followCursor:R}=e.current,g=w?w(f):A.chartTooltipLines(f,{xLabel:T,yLabel:v});if(g.length===0)return;clearTimeout(r.current);const h=a.event;if(R){i.current=g,M(g,h?.clientX??0,h?.clientY??0);return}const b=f[0],d=b?.bbox;let E=0,S=0;if(d){const C=c.getBoundingClientRect();E=C.left+(d.x0+d.x1)/2;const _=b?.yaxis;d.y0===d.y1&&typeof b?.y=="number"&&typeof _?.l2p=="function"&&typeof _._offset=="number"?S=C.top+_._offset+_.l2p(b.y):S=C.top+Math.min(d.y0,d.y1)}else h&&(E=h.clientX,S=h.clientY);n({left:E,top:S,lines:g,side:e.current.side})});const P=a=>{if(!e.current.followCursor)return;const f=i.current;f&&M(f,a.clientX,a.clientY)};c.addEventListener("mousemove",P),p.current=()=>c.removeEventListener("mousemove",P),x.on("plotly_unhover",()=>{clearTimeout(r.current),i.current=null,r.current=setTimeout(()=>{n(a=>a&&{...a,closing:!0}),r.current=setTimeout(()=>n(null),H)},q)})},[]),tooltipElement:m.jsx(N,{anchor:o,bubbleRef:s})}}exports.chartTooltipLines=A.chartTooltipLines;exports.ChartTooltip=N;exports.useChartTooltip=Y;
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const m=require("react/jsx-runtime"),u=require("react"),j=require("react-dom"),O=require("../plotly-loader.cjs"),A=require("./lines.cjs"),C=require("../../../lib/utils.cjs"),X=20,q=150,H=200,y=8,W=10,I={top:"bottom",bottom:"top",left:"right",right:"left"},z={top:{wrapper:"-translate-x-1/2 -translate-y-[calc(100%+10px)]",arrow:"-bottom-1 left-1/2 -translate-x-1/2"},bottom:{wrapper:"-translate-x-1/2 translate-y-[10px]",arrow:"-top-1 left-1/2 -translate-x-1/2"},left:{wrapper:"-translate-y-1/2 -translate-x-[calc(100%+10px)]",arrow:"-right-1 top-1/2 -translate-y-1/2"},right:{wrapper:"-translate-y-1/2 translate-x-[10px]",arrow:"-left-1 top-1/2 -translate-y-1/2"}},k=(t,o,n,r)=>{const e=y,s=W,i={top:o.top-s-r>=e,bottom:o.top+s+r<=window.innerHeight-e,left:o.left-s-n>=e,right:o.left+s+n<=window.innerWidth-e};return!i[t]&&i[I[t]]?I[t]:t};function N({anchor:t,bubbleRef:o}){const n=u.useRef(null),r=t?.side??"top",[e,s]=u.useState(r),i=u.useCallback(l=>{n.current=l,typeof o=="function"?o(l):o&&(o.current=l)},[o]);if(u.useLayoutEffect(()=>{const l=n.current;if(!t||!l)return;const c=k(r,t,l.offsetWidth,l.offsetHeight);s(x=>x===c?x:c)},[t,r]),!t)return null;const p=z[e];return j.createPortal(m.jsx("div",{"data-slot":"chart-tooltip-anchor",className:"pointer-events-none fixed z-50",style:{left:t.left,top:t.top},children:m.jsx("div",{ref:i,className:C.cn("w-max",p.wrapper),children:m.jsxs("div",{role:"tooltip","data-slot":"tooltip-content","data-side":e,className:C.cn("relative w-fit max-w-xs rounded-md bg-foreground px-3 py-1.5 text-xs text-background",t.closing?"animate-out fade-out zoom-out-95 fill-mode-forwards":"animate-in fade-in-0 zoom-in-95"),children:[t.lines.map((l,c)=>m.jsx("div",{children:l},`${c}-${l}`)),m.jsx("span",{"aria-hidden":!0,className:C.cn("absolute size-2.5 rotate-45 rounded-[2px] bg-foreground",p.arrow)})]})})}),document.body)}const G=(t,o,n,r)=>{const e=n/2,s=Math.min(Math.max(t,e+y),window.innerWidth-e-y),i=Math.min(Math.max(o,r+10+y),window.innerHeight-y);return{left:s,top:i}};function Y(t={}){const[o,n]=u.useState(null),r=u.useRef(void 0),e=u.useRef(t);e.current=t;const s=u.useRef(null),i=u.useRef(null),p=u.useRef(null);return{bindTooltip:u.useCallback(c=>{if(!c)return;p.current?.(),p.current=null,n(null),i.current=null,O.getLoadedPlotly().relayout(c,{hoverdistance:e.current.hoverDistance??X});const x=c,M=(a,f,w)=>{const T=s.current,{left:v,top:L}=G(f,w,T?.offsetWidth??0,T?.offsetHeight??0);n({left:v,top:L,lines:a,side:e.current.side})};x.on("plotly_hover",a=>{const f=a.points??[],{getLines:w,xLabel:T,yLabel:v,followCursor:L}=e.current,g=w?w(f):A.chartTooltipLines(f,{xLabel:T,yLabel:v});if(g.length===0)return;clearTimeout(r.current);const h=a.event;if(L){i.current=g,M(g,h?.clientX??0,h?.clientY??0);return}const b=f[0],d=b?.bbox;let R=0,S=0;if(d){const E=c.getBoundingClientRect();R=E.left+(d.x0+d.x1)/2;const _=b?.yaxis;d.y0===d.y1&&typeof b?.y=="number"&&typeof _?.l2p=="function"&&typeof _._offset=="number"?S=E.top+_._offset+_.l2p(b.y):S=E.top+Math.min(d.y0,d.y1)}else h&&(R=h.clientX,S=h.clientY);n({left:R,top:S,lines:g,side:e.current.side})});const P=a=>{if(!e.current.followCursor)return;const f=i.current;f&&M(f,a.clientX,a.clientY)};c.addEventListener("mousemove",P),p.current=()=>c.removeEventListener("mousemove",P),x.on("plotly_unhover",()=>{clearTimeout(r.current),i.current=null,r.current=setTimeout(()=>{n(a=>a&&{...a,closing:!0}),r.current=setTimeout(()=>n(null),H)},q)})},[]),tooltipElement:m.jsx(N,{anchor:o,bubbleRef:s})}}exports.chartTooltipLines=A.chartTooltipLines;exports.ChartTooltip=N;exports.useChartTooltip=Y;
2
2
  //# sourceMappingURL=ChartTooltip.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"ChartTooltip.cjs","sources":["../../../../src/components/charts/ChartTooltip/ChartTooltip.tsx"],"sourcesContent":["import Plotly from \"plotly.js-dist\";\nimport { useCallback, useLayoutEffect, useRef, useState } from \"react\";\nimport { createPortal } from \"react-dom\";\n\nimport { chartTooltipLines } from \"./lines\";\n\nimport type { ChartTooltipHoverPoint } from \"./lines\";\nimport type { Ref } from \"react\";\n\nimport { cn } from \"@/lib/utils\";\n\nexport { chartTooltipLines } from \"./lines\";\nexport type { ChartTooltipHoverPoint } from \"./lines\";\n\n/**\n * How far (px) from a point Plotly still reports a hover. Matches Plotly's\n * default — a larger radius makes tooltips snap to neighbors in dense plots\n */\nconst HOVER_DISTANCE_PX = 20;\n/** Grace period before hiding, so the tooltip survives gaps between points */\nconst HIDE_GRACE_MS = 150;\n/** How long the exit animation plays before the tooltip unmounts */\nconst EXIT_ANIMATION_MS = 200;\n\n/** Which edge of the point the tooltip is placed against (matches Radix). */\nexport type ChartTooltipSide = \"top\" | \"bottom\" | \"left\" | \"right\";\n\nexport interface ChartTooltipAnchor {\n left: number;\n top: number;\n lines: string[];\n /** Preferred placement side; auto-flips to the opposite when it won't fit */\n side?: ChartTooltipSide;\n /** Plays the exit animation before the tooltip unmounts */\n closing?: boolean;\n}\n\n/** Keep an anchor point this far from the viewport edges when clamping */\nconst VIEWPORT_PADDING_PX = 8;\n/** Gap (px) between the anchor point and the bubble on every side */\nconst TOOLTIP_GAP_PX = 10;\n\n/** The opposite side to flip to when the preferred one has no room */\nconst OPPOSITE_SIDE: Record<ChartTooltipSide, ChartTooltipSide> = {\n top: \"bottom\",\n bottom: \"top\",\n left: \"right\",\n right: \"left\",\n};\n\n/**\n * Per-side transforms. The wrapper carries positioning transforms (kept off\n * the bubble so they don't clobber the entry/exit animation), and the arrow\n * sits on the edge facing the point.\n */\nconst SIDE_CLASSES: Record<ChartTooltipSide, { wrapper: string; arrow: string }> = {\n top: {\n wrapper: \"-translate-x-1/2 -translate-y-[calc(100%+10px)]\",\n arrow: \"-bottom-1 left-1/2 -translate-x-1/2\",\n },\n bottom: {\n wrapper: \"-translate-x-1/2 translate-y-[10px]\",\n arrow: \"-top-1 left-1/2 -translate-x-1/2\",\n },\n left: {\n wrapper: \"-translate-y-1/2 -translate-x-[calc(100%+10px)]\",\n arrow: \"-right-1 top-1/2 -translate-y-1/2\",\n },\n right: {\n wrapper: \"-translate-y-1/2 translate-x-[10px]\",\n arrow: \"-left-1 top-1/2 -translate-y-1/2\",\n },\n};\n\ninterface ChartTooltipEmitter {\n on: (event: string, handler: (data: ChartTooltipHoverEvent) => void) => void;\n}\n\ninterface ChartTooltipHoverEvent {\n points?: ChartTooltipHoverPoint[];\n event?: MouseEvent;\n}\n\nexport interface ChartTooltipProps {\n /** Anchor position (viewport coordinates) and content lines */\n anchor: ChartTooltipAnchor | null;\n /** Ref to the bubble node, used by cursor-following charts to clamp it on-screen */\n bubbleRef?: Ref<HTMLDivElement>;\n}\n\n/**\n * Resolve the side the bubble actually renders on: keep the preferred side\n * when it fits in the viewport, otherwise flip to the opposite side.\n */\nconst resolveSide = (\n preferred: ChartTooltipSide,\n anchor: { left: number; top: number },\n width: number,\n height: number,\n): ChartTooltipSide => {\n const pad = VIEWPORT_PADDING_PX;\n const reach = TOOLTIP_GAP_PX;\n const fits: Record<ChartTooltipSide, boolean> = {\n top: anchor.top - reach - height >= pad,\n bottom: anchor.top + reach + height <= window.innerHeight - pad,\n left: anchor.left - reach - width >= pad,\n right: anchor.left + reach + width <= window.innerWidth - pad,\n };\n // Flip only when the preferred side overflows and the opposite has room\n if (!fits[preferred] && fits[OPPOSITE_SIDE[preferred]]) {\n return OPPOSITE_SIDE[preferred];\n }\n return preferred;\n};\n\n/**\n * The design-system tooltip anchored at a chart position; drive it with\n * `useChartTooltip`.\n *\n * Renders the same visual as the ui `TooltipContent` (bubble + arrow) but\n * positions it directly from the anchor coordinates — Radix's popper\n * repositions asynchronously and mis-measures animated content, which made\n * tooltips drift on charts. Placement supports all four sides with\n * Radix-style collision flipping.\n */\nexport function ChartTooltip({ anchor, bubbleRef }: ChartTooltipProps) {\n const wrapperRef = useRef<HTMLDivElement>(null);\n const preferredSide = anchor?.side ?? \"top\";\n const [resolvedSide, setResolvedSide] = useState<ChartTooltipSide>(preferredSide);\n\n // Forward the wrapper node to both the internal measure ref and the\n // optional external ref (used by cursor-following charts to clamp it)\n const setBubbleNode = useCallback(\n (node: HTMLDivElement | null) => {\n wrapperRef.current = node;\n if (typeof bubbleRef === \"function\") bubbleRef(node);\n else if (bubbleRef) {\n (bubbleRef as { current: HTMLDivElement | null }).current = node;\n }\n },\n [bubbleRef],\n );\n\n // Measure before paint and flip to the opposite side if needed\n useLayoutEffect(() => {\n const node = wrapperRef.current;\n if (!anchor || !node) return;\n const next = resolveSide(\n preferredSide,\n anchor,\n node.offsetWidth,\n node.offsetHeight,\n );\n setResolvedSide((current) => (current === next ? current : next));\n }, [anchor, preferredSide]);\n\n if (!anchor) return null;\n const side = SIDE_CLASSES[resolvedSide];\n return createPortal(\n <div\n data-slot=\"chart-tooltip-anchor\"\n className=\"pointer-events-none fixed z-50\"\n style={{ left: anchor.left, top: anchor.top }}\n >\n {/* Positioning transforms live on this node; animations (which also\n drive `transform`) live on the bubble below so they can't clobber\n each other */}\n <div ref={setBubbleNode} className={cn(\"w-max\", side.wrapper)}>\n <div\n role=\"tooltip\"\n data-slot=\"tooltip-content\"\n data-side={resolvedSide}\n className={cn(\n \"relative w-fit max-w-xs rounded-md bg-foreground px-3 py-1.5 text-xs text-background\",\n anchor.closing\n ? \"animate-out fade-out zoom-out-95 fill-mode-forwards\"\n : \"animate-in fade-in-0 zoom-in-95\",\n )}\n >\n {anchor.lines.map((line, index) => (\n <div key={`${index}-${line}`}>{line}</div>\n ))}\n <span\n aria-hidden\n className={cn(\n \"absolute size-2.5 rotate-45 rounded-[2px] bg-foreground\",\n side.arrow,\n )}\n />\n </div>\n </div>\n </div>,\n document.body,\n );\n}\n\nexport interface UseChartTooltipOptions {\n /** Axis label used for the default x line (falls back to \"X\") */\n xLabel?: string;\n /** Axis label used for the default y line (falls back to \"Y\") */\n yLabel?: string;\n /** Override the default line builder entirely */\n getLines?: (points: ChartTooltipHoverPoint[]) => string[];\n /**\n * Track the cursor instead of anchoring to the hovered point's bounds, and\n * keep the tooltip clamped inside the viewport. Use for traces with large\n * hover targets (e.g. pie slices) where a fixed anchor feels disconnected.\n */\n followCursor?: boolean;\n /**\n * Override Plotly's hover hit radius (px). A larger radius makes big markers\n * (e.g. heatmap circles) hoverable across their whole face.\n */\n hoverDistance?: number;\n /**\n * Preferred side to place the tooltip on relative to the point. Auto-flips to\n * the opposite side when there isn't room (Radix-style). Defaults to \"top\".\n */\n side?: ChartTooltipSide;\n}\n\n/** Clamp an anchor point so a bubble of `width`×`height` stays on-screen */\nconst clampAnchor = (\n left: number,\n top: number,\n width: number,\n height: number,\n): { left: number; top: number } => {\n const halfWidth = width / 2;\n const clampedLeft = Math.min(\n Math.max(left, halfWidth + VIEWPORT_PADDING_PX),\n window.innerWidth - halfWidth - VIEWPORT_PADDING_PX,\n );\n // The bubble sits above the anchor; keep its top edge inside the viewport\n const clampedTop = Math.min(\n Math.max(top, height + 10 + VIEWPORT_PADDING_PX),\n window.innerHeight - VIEWPORT_PADDING_PX,\n );\n return { left: clampedLeft, top: clampedTop };\n};\n\n/**\n * Drives the design-system tooltip from Plotly hover events.\n *\n * ```tsx\n * const { bindTooltip, tooltipElement } = useChartTooltip({ xLabel, yLabel });\n * // after Plotly.newPlot(...): set trace hoverinfo to \"none\", then\n * bindTooltip(plotRef.current);\n * // anywhere in the chart markup:\n * {tooltipElement}\n * ```\n */\nexport function useChartTooltip(options: UseChartTooltipOptions = {}) {\n const [anchor, setAnchor] = useState<ChartTooltipAnchor | null>(null);\n const hideTimerRef = useRef<ReturnType<typeof setTimeout>>(undefined);\n const optionsRef = useRef(options);\n optionsRef.current = options;\n // Measured bubble node, used to clamp the cursor-following tooltip on-screen\n const bubbleRef = useRef<HTMLDivElement>(null);\n // Active lines while a cursor-following tooltip is shown; null when hidden\n const cursorLinesRef = useRef<string[] | null>(null);\n // Removes the mousemove listener registered by the previous bindTooltip call\n const detachMouseMoveRef = useRef<(() => void) | null>(null);\n\n const bindTooltip = useCallback((plotDiv: HTMLElement | null) => {\n if (!plotDiv) return;\n // The chart effect can re-run (size/theme/props changes) and call this\n // again on the same node; drop the prior mousemove listener so they don't\n // accumulate. (Plotly's own hover/unhover handlers are cleared by newPlot.)\n detachMouseMoveRef.current?.();\n detachMouseMoveRef.current = null;\n setAnchor(null);\n cursorLinesRef.current = null;\n\n // A larger hover radius makes the tooltip easier to acquire and keep\n void Plotly.relayout(plotDiv, {\n hoverdistance: optionsRef.current.hoverDistance ?? HOVER_DISTANCE_PX,\n });\n\n const emitter = plotDiv as unknown as ChartTooltipEmitter;\n\n // Place the cursor-following tooltip at the (clamped) cursor position\n const positionAtCursor = (lines: string[], clientX: number, clientY: number) => {\n const bubble = bubbleRef.current;\n const { left, top } = clampAnchor(\n clientX,\n clientY,\n bubble?.offsetWidth ?? 0,\n bubble?.offsetHeight ?? 0,\n );\n setAnchor({ left, top, lines, side: optionsRef.current.side });\n };\n\n emitter.on(\"plotly_hover\", (eventData) => {\n const points = eventData.points ?? [];\n const { getLines, xLabel, yLabel, followCursor } = optionsRef.current;\n const lines = getLines\n ? getLines(points)\n : chartTooltipLines(points, { xLabel, yLabel });\n if (lines.length === 0) return;\n\n clearTimeout(hideTimerRef.current);\n\n const mouse = eventData.event;\n if (followCursor) {\n cursorLinesRef.current = lines;\n positionAtCursor(lines, mouse?.clientX ?? 0, mouse?.clientY ?? 0);\n return;\n }\n\n // Anchor to the hovered point's bounds (in plot-div pixels) when\n // Plotly provides them; fall back to the mouse position. The anchor\n // is position:fixed, so viewport coordinates are used directly.\n const point = points[0];\n const bbox = point?.bbox;\n let left = 0;\n let top = 0;\n if (bbox) {\n const rect = plotDiv.getBoundingClientRect();\n left = rect.left + (bbox.x0 + bbox.x1) / 2;\n // Bars report a zero-height bbox that sits below their visual top;\n // anchor to the bar's true top via the axis projection instead.\n const yaxis = point?.yaxis;\n if (\n bbox.y0 === bbox.y1 &&\n typeof point?.y === \"number\" &&\n typeof yaxis?.l2p === \"function\" &&\n typeof yaxis._offset === \"number\"\n ) {\n top = rect.top + yaxis._offset + yaxis.l2p(point.y);\n } else {\n top = rect.top + Math.min(bbox.y0, bbox.y1);\n }\n } else if (mouse) {\n left = mouse.clientX;\n top = mouse.clientY;\n }\n setAnchor({ left, top, lines, side: optionsRef.current.side });\n });\n\n // While following the cursor, keep the tooltip glued to the pointer even\n // when Plotly does not re-fire hover within the same point (e.g. a slice)\n const handleMouseMove = (event: MouseEvent) => {\n if (!optionsRef.current.followCursor) return;\n const lines = cursorLinesRef.current;\n if (!lines) return;\n positionAtCursor(lines, event.clientX, event.clientY);\n };\n plotDiv.addEventListener(\"mousemove\", handleMouseMove);\n detachMouseMoveRef.current = () =>\n plotDiv.removeEventListener(\"mousemove\", handleMouseMove);\n\n emitter.on(\"plotly_unhover\", () => {\n clearTimeout(hideTimerRef.current);\n cursorLinesRef.current = null;\n // After the grace period, play the exit animation, then unmount\n hideTimerRef.current = setTimeout(() => {\n setAnchor((previous) =>\n previous ? { ...previous, closing: true } : previous,\n );\n hideTimerRef.current = setTimeout(() => setAnchor(null), EXIT_ANIMATION_MS);\n }, HIDE_GRACE_MS);\n });\n }, []);\n\n return {\n bindTooltip,\n tooltipElement: <ChartTooltip anchor={anchor} bubbleRef={bubbleRef} />,\n };\n}\n"],"names":["HOVER_DISTANCE_PX","HIDE_GRACE_MS","EXIT_ANIMATION_MS","VIEWPORT_PADDING_PX","TOOLTIP_GAP_PX","OPPOSITE_SIDE","SIDE_CLASSES","resolveSide","preferred","anchor","width","height","pad","reach","fits","ChartTooltip","bubbleRef","wrapperRef","useRef","preferredSide","resolvedSide","setResolvedSide","useState","setBubbleNode","useCallback","node","useLayoutEffect","next","current","side","createPortal","jsx","cn","jsxs","line","index","clampAnchor","left","top","halfWidth","clampedLeft","clampedTop","useChartTooltip","options","setAnchor","hideTimerRef","optionsRef","cursorLinesRef","detachMouseMoveRef","plotDiv","Plotly","emitter","positionAtCursor","lines","clientX","clientY","bubble","eventData","points","getLines","xLabel","yLabel","followCursor","chartTooltipLines","mouse","point","bbox","rect","yaxis","handleMouseMove","event","previous"],"mappings":"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"}
1
+ {"version":3,"file":"ChartTooltip.cjs","sources":["../../../../src/components/charts/ChartTooltip/ChartTooltip.tsx"],"sourcesContent":["import { useCallback, useLayoutEffect, useRef, useState } from \"react\";\nimport { createPortal } from \"react-dom\";\n\nimport { getLoadedPlotly } from \"../plotly-loader\";\n\nimport { chartTooltipLines } from \"./lines\";\n\nimport type { ChartTooltipHoverPoint } from \"./lines\";\nimport type { Ref } from \"react\";\n\nimport { cn } from \"@/lib/utils\";\n\nexport { chartTooltipLines } from \"./lines\";\nexport type { ChartTooltipHoverPoint } from \"./lines\";\n\n/**\n * How far (px) from a point Plotly still reports a hover. Matches Plotly's\n * default — a larger radius makes tooltips snap to neighbors in dense plots\n */\nconst HOVER_DISTANCE_PX = 20;\n/** Grace period before hiding, so the tooltip survives gaps between points */\nconst HIDE_GRACE_MS = 150;\n/** How long the exit animation plays before the tooltip unmounts */\nconst EXIT_ANIMATION_MS = 200;\n\n/** Which edge of the point the tooltip is placed against (matches Radix). */\nexport type ChartTooltipSide = \"top\" | \"bottom\" | \"left\" | \"right\";\n\nexport interface ChartTooltipAnchor {\n left: number;\n top: number;\n lines: string[];\n /** Preferred placement side; auto-flips to the opposite when it won't fit */\n side?: ChartTooltipSide;\n /** Plays the exit animation before the tooltip unmounts */\n closing?: boolean;\n}\n\n/** Keep an anchor point this far from the viewport edges when clamping */\nconst VIEWPORT_PADDING_PX = 8;\n/** Gap (px) between the anchor point and the bubble on every side */\nconst TOOLTIP_GAP_PX = 10;\n\n/** The opposite side to flip to when the preferred one has no room */\nconst OPPOSITE_SIDE: Record<ChartTooltipSide, ChartTooltipSide> = {\n top: \"bottom\",\n bottom: \"top\",\n left: \"right\",\n right: \"left\",\n};\n\n/**\n * Per-side transforms. The wrapper carries positioning transforms (kept off\n * the bubble so they don't clobber the entry/exit animation), and the arrow\n * sits on the edge facing the point.\n */\nconst SIDE_CLASSES: Record<ChartTooltipSide, { wrapper: string; arrow: string }> = {\n top: {\n wrapper: \"-translate-x-1/2 -translate-y-[calc(100%+10px)]\",\n arrow: \"-bottom-1 left-1/2 -translate-x-1/2\",\n },\n bottom: {\n wrapper: \"-translate-x-1/2 translate-y-[10px]\",\n arrow: \"-top-1 left-1/2 -translate-x-1/2\",\n },\n left: {\n wrapper: \"-translate-y-1/2 -translate-x-[calc(100%+10px)]\",\n arrow: \"-right-1 top-1/2 -translate-y-1/2\",\n },\n right: {\n wrapper: \"-translate-y-1/2 translate-x-[10px]\",\n arrow: \"-left-1 top-1/2 -translate-y-1/2\",\n },\n};\n\ninterface ChartTooltipEmitter {\n on: (event: string, handler: (data: ChartTooltipHoverEvent) => void) => void;\n}\n\ninterface ChartTooltipHoverEvent {\n points?: ChartTooltipHoverPoint[];\n event?: MouseEvent;\n}\n\nexport interface ChartTooltipProps {\n /** Anchor position (viewport coordinates) and content lines */\n anchor: ChartTooltipAnchor | null;\n /** Ref to the bubble node, used by cursor-following charts to clamp it on-screen */\n bubbleRef?: Ref<HTMLDivElement>;\n}\n\n/**\n * Resolve the side the bubble actually renders on: keep the preferred side\n * when it fits in the viewport, otherwise flip to the opposite side.\n */\nconst resolveSide = (\n preferred: ChartTooltipSide,\n anchor: { left: number; top: number },\n width: number,\n height: number,\n): ChartTooltipSide => {\n const pad = VIEWPORT_PADDING_PX;\n const reach = TOOLTIP_GAP_PX;\n const fits: Record<ChartTooltipSide, boolean> = {\n top: anchor.top - reach - height >= pad,\n bottom: anchor.top + reach + height <= window.innerHeight - pad,\n left: anchor.left - reach - width >= pad,\n right: anchor.left + reach + width <= window.innerWidth - pad,\n };\n // Flip only when the preferred side overflows and the opposite has room\n if (!fits[preferred] && fits[OPPOSITE_SIDE[preferred]]) {\n return OPPOSITE_SIDE[preferred];\n }\n return preferred;\n};\n\n/**\n * The design-system tooltip anchored at a chart position; drive it with\n * `useChartTooltip`.\n *\n * Renders the same visual as the ui `TooltipContent` (bubble + arrow) but\n * positions it directly from the anchor coordinates — Radix's popper\n * repositions asynchronously and mis-measures animated content, which made\n * tooltips drift on charts. Placement supports all four sides with\n * Radix-style collision flipping.\n */\nexport function ChartTooltip({ anchor, bubbleRef }: ChartTooltipProps) {\n const wrapperRef = useRef<HTMLDivElement>(null);\n const preferredSide = anchor?.side ?? \"top\";\n const [resolvedSide, setResolvedSide] = useState<ChartTooltipSide>(preferredSide);\n\n // Forward the wrapper node to both the internal measure ref and the\n // optional external ref (used by cursor-following charts to clamp it)\n const setBubbleNode = useCallback(\n (node: HTMLDivElement | null) => {\n wrapperRef.current = node;\n if (typeof bubbleRef === \"function\") bubbleRef(node);\n else if (bubbleRef) {\n (bubbleRef as { current: HTMLDivElement | null }).current = node;\n }\n },\n [bubbleRef],\n );\n\n // Measure before paint and flip to the opposite side if needed\n useLayoutEffect(() => {\n const node = wrapperRef.current;\n if (!anchor || !node) return;\n const next = resolveSide(\n preferredSide,\n anchor,\n node.offsetWidth,\n node.offsetHeight,\n );\n setResolvedSide((current) => (current === next ? current : next));\n }, [anchor, preferredSide]);\n\n if (!anchor) return null;\n const side = SIDE_CLASSES[resolvedSide];\n return createPortal(\n <div\n data-slot=\"chart-tooltip-anchor\"\n className=\"pointer-events-none fixed z-50\"\n style={{ left: anchor.left, top: anchor.top }}\n >\n {/* Positioning transforms live on this node; animations (which also\n drive `transform`) live on the bubble below so they can't clobber\n each other */}\n <div ref={setBubbleNode} className={cn(\"w-max\", side.wrapper)}>\n <div\n role=\"tooltip\"\n data-slot=\"tooltip-content\"\n data-side={resolvedSide}\n className={cn(\n \"relative w-fit max-w-xs rounded-md bg-foreground px-3 py-1.5 text-xs text-background\",\n anchor.closing\n ? \"animate-out fade-out zoom-out-95 fill-mode-forwards\"\n : \"animate-in fade-in-0 zoom-in-95\",\n )}\n >\n {anchor.lines.map((line, index) => (\n <div key={`${index}-${line}`}>{line}</div>\n ))}\n <span\n aria-hidden\n className={cn(\n \"absolute size-2.5 rotate-45 rounded-[2px] bg-foreground\",\n side.arrow,\n )}\n />\n </div>\n </div>\n </div>,\n document.body,\n );\n}\n\nexport interface UseChartTooltipOptions {\n /** Axis label used for the default x line (falls back to \"X\") */\n xLabel?: string;\n /** Axis label used for the default y line (falls back to \"Y\") */\n yLabel?: string;\n /** Override the default line builder entirely */\n getLines?: (points: ChartTooltipHoverPoint[]) => string[];\n /**\n * Track the cursor instead of anchoring to the hovered point's bounds, and\n * keep the tooltip clamped inside the viewport. Use for traces with large\n * hover targets (e.g. pie slices) where a fixed anchor feels disconnected.\n */\n followCursor?: boolean;\n /**\n * Override Plotly's hover hit radius (px). A larger radius makes big markers\n * (e.g. heatmap circles) hoverable across their whole face.\n */\n hoverDistance?: number;\n /**\n * Preferred side to place the tooltip on relative to the point. Auto-flips to\n * the opposite side when there isn't room (Radix-style). Defaults to \"top\".\n */\n side?: ChartTooltipSide;\n}\n\n/** Clamp an anchor point so a bubble of `width`×`height` stays on-screen */\nconst clampAnchor = (\n left: number,\n top: number,\n width: number,\n height: number,\n): { left: number; top: number } => {\n const halfWidth = width / 2;\n const clampedLeft = Math.min(\n Math.max(left, halfWidth + VIEWPORT_PADDING_PX),\n window.innerWidth - halfWidth - VIEWPORT_PADDING_PX,\n );\n // The bubble sits above the anchor; keep its top edge inside the viewport\n const clampedTop = Math.min(\n Math.max(top, height + 10 + VIEWPORT_PADDING_PX),\n window.innerHeight - VIEWPORT_PADDING_PX,\n );\n return { left: clampedLeft, top: clampedTop };\n};\n\n/**\n * Drives the design-system tooltip from Plotly hover events.\n *\n * ```tsx\n * const { bindTooltip, tooltipElement } = useChartTooltip({ xLabel, yLabel });\n * // after Plotly.newPlot(...): set trace hoverinfo to \"none\", then\n * bindTooltip(plotRef.current);\n * // anywhere in the chart markup:\n * {tooltipElement}\n * ```\n */\nexport function useChartTooltip(options: UseChartTooltipOptions = {}) {\n const [anchor, setAnchor] = useState<ChartTooltipAnchor | null>(null);\n const hideTimerRef = useRef<ReturnType<typeof setTimeout>>(undefined);\n const optionsRef = useRef(options);\n optionsRef.current = options;\n // Measured bubble node, used to clamp the cursor-following tooltip on-screen\n const bubbleRef = useRef<HTMLDivElement>(null);\n // Active lines while a cursor-following tooltip is shown; null when hidden\n const cursorLinesRef = useRef<string[] | null>(null);\n // Removes the mousemove listener registered by the previous bindTooltip call\n const detachMouseMoveRef = useRef<(() => void) | null>(null);\n\n const bindTooltip = useCallback((plotDiv: HTMLElement | null) => {\n if (!plotDiv) return;\n // The chart effect can re-run (size/theme/props changes) and call this\n // again on the same node; drop the prior mousemove listener so they don't\n // accumulate. (Plotly's own hover/unhover handlers are cleared by newPlot.)\n detachMouseMoveRef.current?.();\n detachMouseMoveRef.current = null;\n setAnchor(null);\n cursorLinesRef.current = null;\n\n // A larger hover radius makes the tooltip easier to acquire and keep.\n // bindTooltip is documented as \"call after Plotly.newPlot(...)\", so the\n // lazily-loaded Plotly module is guaranteed to be available here.\n void getLoadedPlotly().relayout(plotDiv, {\n hoverdistance: optionsRef.current.hoverDistance ?? HOVER_DISTANCE_PX,\n });\n\n const emitter = plotDiv as unknown as ChartTooltipEmitter;\n\n // Place the cursor-following tooltip at the (clamped) cursor position\n const positionAtCursor = (lines: string[], clientX: number, clientY: number) => {\n const bubble = bubbleRef.current;\n const { left, top } = clampAnchor(\n clientX,\n clientY,\n bubble?.offsetWidth ?? 0,\n bubble?.offsetHeight ?? 0,\n );\n setAnchor({ left, top, lines, side: optionsRef.current.side });\n };\n\n emitter.on(\"plotly_hover\", (eventData) => {\n const points = eventData.points ?? [];\n const { getLines, xLabel, yLabel, followCursor } = optionsRef.current;\n const lines = getLines\n ? getLines(points)\n : chartTooltipLines(points, { xLabel, yLabel });\n if (lines.length === 0) return;\n\n clearTimeout(hideTimerRef.current);\n\n const mouse = eventData.event;\n if (followCursor) {\n cursorLinesRef.current = lines;\n positionAtCursor(lines, mouse?.clientX ?? 0, mouse?.clientY ?? 0);\n return;\n }\n\n // Anchor to the hovered point's bounds (in plot-div pixels) when\n // Plotly provides them; fall back to the mouse position. The anchor\n // is position:fixed, so viewport coordinates are used directly.\n const point = points[0];\n const bbox = point?.bbox;\n let left = 0;\n let top = 0;\n if (bbox) {\n const rect = plotDiv.getBoundingClientRect();\n left = rect.left + (bbox.x0 + bbox.x1) / 2;\n // Bars report a zero-height bbox that sits below their visual top;\n // anchor to the bar's true top via the axis projection instead.\n const yaxis = point?.yaxis;\n if (\n bbox.y0 === bbox.y1 &&\n typeof point?.y === \"number\" &&\n typeof yaxis?.l2p === \"function\" &&\n typeof yaxis._offset === \"number\"\n ) {\n top = rect.top + yaxis._offset + yaxis.l2p(point.y);\n } else {\n top = rect.top + Math.min(bbox.y0, bbox.y1);\n }\n } else if (mouse) {\n left = mouse.clientX;\n top = mouse.clientY;\n }\n setAnchor({ left, top, lines, side: optionsRef.current.side });\n });\n\n // While following the cursor, keep the tooltip glued to the pointer even\n // when Plotly does not re-fire hover within the same point (e.g. a slice)\n const handleMouseMove = (event: MouseEvent) => {\n if (!optionsRef.current.followCursor) return;\n const lines = cursorLinesRef.current;\n if (!lines) return;\n positionAtCursor(lines, event.clientX, event.clientY);\n };\n plotDiv.addEventListener(\"mousemove\", handleMouseMove);\n detachMouseMoveRef.current = () =>\n plotDiv.removeEventListener(\"mousemove\", handleMouseMove);\n\n emitter.on(\"plotly_unhover\", () => {\n clearTimeout(hideTimerRef.current);\n cursorLinesRef.current = null;\n // After the grace period, play the exit animation, then unmount\n hideTimerRef.current = setTimeout(() => {\n setAnchor((previous) =>\n previous ? { ...previous, closing: true } : previous,\n );\n hideTimerRef.current = setTimeout(() => setAnchor(null), EXIT_ANIMATION_MS);\n }, HIDE_GRACE_MS);\n });\n }, []);\n\n return {\n bindTooltip,\n tooltipElement: <ChartTooltip anchor={anchor} bubbleRef={bubbleRef} />,\n };\n}\n"],"names":["HOVER_DISTANCE_PX","HIDE_GRACE_MS","EXIT_ANIMATION_MS","VIEWPORT_PADDING_PX","TOOLTIP_GAP_PX","OPPOSITE_SIDE","SIDE_CLASSES","resolveSide","preferred","anchor","width","height","pad","reach","fits","ChartTooltip","bubbleRef","wrapperRef","useRef","preferredSide","resolvedSide","setResolvedSide","useState","setBubbleNode","useCallback","node","useLayoutEffect","next","current","side","createPortal","jsx","cn","jsxs","line","index","clampAnchor","left","top","halfWidth","clampedLeft","clampedTop","useChartTooltip","options","setAnchor","hideTimerRef","optionsRef","cursorLinesRef","detachMouseMoveRef","plotDiv","getLoadedPlotly","emitter","positionAtCursor","lines","clientX","clientY","bubble","eventData","points","getLines","xLabel","yLabel","followCursor","chartTooltipLines","mouse","point","bbox","rect","yaxis","handleMouseMove","event","previous"],"mappings":"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"}
@@ -0,0 +1,71 @@
1
+ import { ChartTooltipHoverPoint } from './lines';
2
+ import { Ref } from 'react';
3
+ export { chartTooltipLines } from './lines';
4
+ export type { ChartTooltipHoverPoint } from './lines';
5
+ /** Which edge of the point the tooltip is placed against (matches Radix). */
6
+ export type ChartTooltipSide = "top" | "bottom" | "left" | "right";
7
+ export interface ChartTooltipAnchor {
8
+ left: number;
9
+ top: number;
10
+ lines: string[];
11
+ /** Preferred placement side; auto-flips to the opposite when it won't fit */
12
+ side?: ChartTooltipSide;
13
+ /** Plays the exit animation before the tooltip unmounts */
14
+ closing?: boolean;
15
+ }
16
+ export interface ChartTooltipProps {
17
+ /** Anchor position (viewport coordinates) and content lines */
18
+ anchor: ChartTooltipAnchor | null;
19
+ /** Ref to the bubble node, used by cursor-following charts to clamp it on-screen */
20
+ bubbleRef?: Ref<HTMLDivElement>;
21
+ }
22
+ /**
23
+ * The design-system tooltip anchored at a chart position; drive it with
24
+ * `useChartTooltip`.
25
+ *
26
+ * Renders the same visual as the ui `TooltipContent` (bubble + arrow) but
27
+ * positions it directly from the anchor coordinates — Radix's popper
28
+ * repositions asynchronously and mis-measures animated content, which made
29
+ * tooltips drift on charts. Placement supports all four sides with
30
+ * Radix-style collision flipping.
31
+ */
32
+ export declare function ChartTooltip({ anchor, bubbleRef }: ChartTooltipProps): import('react').ReactPortal | null;
33
+ export interface UseChartTooltipOptions {
34
+ /** Axis label used for the default x line (falls back to "X") */
35
+ xLabel?: string;
36
+ /** Axis label used for the default y line (falls back to "Y") */
37
+ yLabel?: string;
38
+ /** Override the default line builder entirely */
39
+ getLines?: (points: ChartTooltipHoverPoint[]) => string[];
40
+ /**
41
+ * Track the cursor instead of anchoring to the hovered point's bounds, and
42
+ * keep the tooltip clamped inside the viewport. Use for traces with large
43
+ * hover targets (e.g. pie slices) where a fixed anchor feels disconnected.
44
+ */
45
+ followCursor?: boolean;
46
+ /**
47
+ * Override Plotly's hover hit radius (px). A larger radius makes big markers
48
+ * (e.g. heatmap circles) hoverable across their whole face.
49
+ */
50
+ hoverDistance?: number;
51
+ /**
52
+ * Preferred side to place the tooltip on relative to the point. Auto-flips to
53
+ * the opposite side when there isn't room (Radix-style). Defaults to "top".
54
+ */
55
+ side?: ChartTooltipSide;
56
+ }
57
+ /**
58
+ * Drives the design-system tooltip from Plotly hover events.
59
+ *
60
+ * ```tsx
61
+ * const { bindTooltip, tooltipElement } = useChartTooltip({ xLabel, yLabel });
62
+ * // after Plotly.newPlot(...): set trace hoverinfo to "none", then
63
+ * bindTooltip(plotRef.current);
64
+ * // anywhere in the chart markup:
65
+ * {tooltipElement}
66
+ * ```
67
+ */
68
+ export declare function useChartTooltip(options?: UseChartTooltipOptions): {
69
+ bindTooltip: (plotDiv: HTMLElement | null) => void;
70
+ tooltipElement: import("react/jsx-runtime").JSX.Element;
71
+ };