@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
@@ -1,76 +1,77 @@
1
- import { jsxs as p, jsx as o } from "react/jsx-runtime";
2
- import y from "plotly.js-dist";
3
- import N, { useRef as P, useMemo as R, useEffect as _ } from "react";
4
- import { useChartTooltip as k } from "../ChartTooltip/ChartTooltip.js";
5
- import { usePlotlyTheme as L } from "../../../hooks/use-plotly-theme.js";
6
- import { CHART_COLORS as T } from "../../../utils/colors.js";
7
- const w = T, F = ({
1
+ import { jsxs as u, jsx as t } from "react/jsx-runtime";
2
+ import N, { useRef as _, useMemo as L, useEffect as P } from "react";
3
+ import { useChartTooltip as R } from "../ChartTooltip/ChartTooltip.js";
4
+ import { loadPlotly as T, getLoadedPlotly as k } from "../plotly-loader.js";
5
+ import { usePlotlyTheme as O, CHART_FONT_FAMILY as y } from "../../../hooks/use-plotly-theme.js";
6
+ import { CHART_COLORS as z } from "../../../utils/colors.js";
7
+ const w = z, H = ({
8
8
  dataSeries: e,
9
- width: m = 400,
10
- height: u = 400,
11
- title: g,
12
- textInfo: h = "percent",
13
- hole: d = 0,
14
- rotation: x = 0
9
+ width: a = 400,
10
+ height: g = 400,
11
+ title: h,
12
+ textInfo: d = "percent",
13
+ hole: x = 0,
14
+ rotation: b = 0
15
15
  }) => {
16
- const s = P(null), i = L(), { bindTooltip: b, tooltipElement: C } = k({ followCursor: !0 }), a = R(() => {
16
+ const r = _(null), m = O(), { bindTooltip: v, tooltipElement: C } = R({ followCursor: !0 }), f = L(() => {
17
17
  if (e.colors && e.colors.length >= e.labels.length)
18
18
  return e.colors;
19
- const l = [...e.colors || []], r = e.labels.length - l.length;
20
- if (r <= 0) return l;
21
- for (let t = 0; t < r; t++)
22
- l.push(w[t % w.length]);
23
- return l;
19
+ const o = [...e.colors || []], s = e.labels.length - o.length;
20
+ if (s <= 0) return o;
21
+ for (let n = 0; n < s; n++)
22
+ o.push(w[n % w.length]);
23
+ return o;
24
24
  }, [e.colors, e.labels.length]);
25
- return _(() => {
26
- if (!s.current) return;
27
- const l = [
25
+ return P(() => {
26
+ if (!r.current) return;
27
+ const o = [
28
28
  {
29
29
  type: "pie",
30
30
  labels: e.labels,
31
31
  values: e.values,
32
32
  name: e.name,
33
33
  marker: {
34
- colors: a
34
+ colors: f
35
35
  },
36
- textinfo: h,
36
+ textinfo: d,
37
37
  hoverinfo: "none",
38
38
  insidetextfont: {
39
39
  size: 0,
40
- family: "Inter, sans-serif",
40
+ family: y,
41
41
  color: "transparent"
42
42
  },
43
- hole: d,
44
- rotation: x
43
+ hole: x,
44
+ rotation: b
45
45
  }
46
- ], r = {
47
- width: m,
48
- height: u,
46
+ ], s = {
47
+ width: a,
48
+ height: g,
49
49
  font: {
50
- family: "Inter, sans-serif",
51
- color: i.textColor
50
+ family: y,
51
+ color: m.textColor
52
52
  },
53
53
  showlegend: !1,
54
54
  margin: { l: 40, r: 40, b: 40, t: 40 },
55
- paper_bgcolor: i.paperBg,
56
- plot_bgcolor: i.plotBg
57
- }, t = {
55
+ paper_bgcolor: m.paperBg,
56
+ plot_bgcolor: m.plotBg
57
+ }, n = {
58
58
  responsive: !0,
59
59
  displayModeBar: !1,
60
60
  displaylogo: !1
61
61
  };
62
- y.newPlot(s.current, l, r, t), b(s.current);
63
- const c = s.current;
64
- return () => {
65
- c && y.purge(c);
62
+ let i = !1, c = null;
63
+ return T().then((l) => {
64
+ i || !r.current || (l.newPlot(r.current, o, s, n), v(r.current), c = r.current);
65
+ }), () => {
66
+ i = !0, c && k().purge(c);
66
67
  };
67
- }, [a, e.labels, e.name, e.values, m, u, h, d, x, i, b]), /* @__PURE__ */ p("div", { className: "relative", style: { width: m }, children: [
68
- /* @__PURE__ */ p("div", { className: "size-full", children: [
69
- g && /* @__PURE__ */ o("div", { className: "px-10 text-center", children: /* @__PURE__ */ o("h2", { className: "m-0 text-[32px] leading-tight font-semibold", children: g }) }),
70
- /* @__PURE__ */ o(
68
+ }, [f, e.labels, e.name, e.values, a, g, d, x, b, m, v]), /* @__PURE__ */ u("div", { className: "relative", style: { width: a }, children: [
69
+ /* @__PURE__ */ u("div", { className: "size-full", children: [
70
+ h && /* @__PURE__ */ t("div", { className: "px-10 text-center", children: /* @__PURE__ */ t("h2", { className: "m-0 text-[32px] leading-tight font-semibold", children: h }) }),
71
+ /* @__PURE__ */ t(
71
72
  "div",
72
73
  {
73
- ref: s,
74
+ ref: r,
74
75
  style: {
75
76
  width: "100%",
76
77
  height: "100%",
@@ -78,40 +79,40 @@ const w = T, F = ({
78
79
  }
79
80
  }
80
81
  ),
81
- /* @__PURE__ */ o(({
82
- labels: l,
83
- colors: r
82
+ /* @__PURE__ */ t(({
83
+ labels: o,
84
+ colors: s
84
85
  }) => {
85
- const t = l.map((n, f) => /* @__PURE__ */ o(N.Fragment, { children: /* @__PURE__ */ p("div", { className: "flex items-center text-[13px] leading-[18px] font-medium", children: [
86
- /* @__PURE__ */ o(
86
+ const n = o.map((l, p) => /* @__PURE__ */ t(N.Fragment, { children: /* @__PURE__ */ u("div", { className: "flex items-center text-[13px] leading-[18px] font-medium", children: [
87
+ /* @__PURE__ */ t(
87
88
  "span",
88
89
  {
89
90
  "data-slot": "pie-legend-swatch",
90
91
  className: "mr-1.5 inline-block size-3 rounded-[4px]",
91
- style: { background: r[f] }
92
+ style: { background: s[p] }
92
93
  }
93
94
  ),
94
- n,
95
- f < l.length - 1 && /* @__PURE__ */ o("span", { className: "mx-3 inline-block h-6 w-0.5 bg-border" })
96
- ] }) }, `${n}-${f}`)), c = 6, v = [];
97
- for (let n = 0; n < t.length; n += c)
98
- v.push(
99
- /* @__PURE__ */ o(
95
+ l,
96
+ p < o.length - 1 && /* @__PURE__ */ t("span", { className: "mx-3 inline-block h-6 w-0.5 bg-border" })
97
+ ] }) }, `${l}-${p}`)), i = 6, c = [];
98
+ for (let l = 0; l < n.length; l += i)
99
+ c.push(
100
+ /* @__PURE__ */ t(
100
101
  "div",
101
102
  {
102
103
  className: "mb-2 flex w-full max-w-full flex-wrap items-center justify-center gap-y-3 break-words px-10",
103
- children: t.slice(n, n + c)
104
+ children: n.slice(l, l + i)
104
105
  },
105
- n
106
+ l
106
107
  )
107
108
  );
108
- return /* @__PURE__ */ o("div", { "data-slot": "pie-legend", className: "flex w-full flex-wrap text-foreground", children: v });
109
- }, { labels: e.labels, colors: a })
109
+ return /* @__PURE__ */ t("div", { "data-slot": "pie-legend", className: "flex w-full flex-wrap text-foreground", children: c });
110
+ }, { labels: e.labels, colors: f })
110
111
  ] }),
111
112
  C
112
113
  ] });
113
114
  };
114
115
  export {
115
- F as PieChart
116
+ H as PieChart
116
117
  };
117
118
  //# sourceMappingURL=PieChart.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"PieChart.js","sources":["../../../../src/components/charts/PieChart/PieChart.tsx"],"sourcesContent":["import Plotly from \"plotly.js-dist\";\nimport React, { useEffect, useRef, useMemo } from \"react\";\n\nimport { useChartTooltip } from \"../ChartTooltip\";\n\nimport { usePlotlyTheme } from \"@/hooks/use-plotly-theme\";\nimport { CHART_COLORS } from \"@/utils/colors\";\n\ninterface PieDataSeries {\n labels: string[];\n values: number[];\n name: string;\n colors?: string[];\n}\n\ntype PieTextInfo =\n | \"none\"\n | \"label\"\n | \"percent\"\n | \"value\"\n | \"label+percent\"\n | \"label+value\"\n | \"value+percent\"\n | \"label+value+percent\";\n\ntype PieChartProps = {\n dataSeries: PieDataSeries;\n width?: number;\n height?: number;\n title?: string;\n textInfo?: PieTextInfo;\n hole?: number;\n rotation?: number;\n};\n\nconst DEFAULT_COLORS = CHART_COLORS;\n\nconst PieChart: React.FC<PieChartProps> = ({\n dataSeries,\n width = 400,\n height = 400,\n title,\n textInfo = \"percent\",\n hole = 0,\n rotation = 0,\n}) => {\n const plotRef = useRef<HTMLDivElement>(null);\n const theme = usePlotlyTheme();\n // Slices are large hover targets, so the tooltip tracks the cursor (clamped\n // to the viewport) rather than pinning to the slice centroid\n const { bindTooltip, tooltipElement } = useChartTooltip({ followCursor: true });\n\n const colors = useMemo(() => {\n if (\n dataSeries.colors &&\n dataSeries.colors.length >= dataSeries.labels.length\n ) {\n return dataSeries.colors;\n }\n\n const result = [...(dataSeries.colors || [])];\n const missingColors = dataSeries.labels.length - result.length;\n\n if (missingColors <= 0) return result;\n\n for (let i = 0; i < missingColors; i++) {\n result.push(DEFAULT_COLORS[i % DEFAULT_COLORS.length]);\n }\n\n return result;\n }, [dataSeries.colors, dataSeries.labels.length]);\n\n useEffect(() => {\n if (!plotRef.current) return;\n\n const plotData = [\n {\n type: \"pie\" as const,\n labels: dataSeries.labels,\n values: dataSeries.values,\n name: dataSeries.name,\n marker: {\n colors: colors,\n },\n textinfo: textInfo,\n hoverinfo: \"none\" as const,\n insidetextfont: {\n size: 0,\n family: \"Inter, sans-serif\",\n color: \"transparent\",\n },\n hole: hole,\n rotation: rotation,\n },\n ];\n\n const layout = {\n width,\n height,\n font: {\n family: \"Inter, sans-serif\",\n color: theme.textColor,\n },\n showlegend: false,\n margin: { l: 40, r: 40, b: 40, t: 40 },\n paper_bgcolor: theme.paperBg,\n plot_bgcolor: theme.plotBg,\n };\n\n const config = {\n responsive: true,\n displayModeBar: false,\n displaylogo: false,\n };\n\n Plotly.newPlot(plotRef.current, plotData, layout, config);\n bindTooltip(plotRef.current);\n\n // Capture ref value for cleanup\n const plotElement = plotRef.current;\n\n return () => {\n if (plotElement) {\n Plotly.purge(plotElement);\n }\n };\n }, [colors, dataSeries.labels, dataSeries.name, dataSeries.values, width, height, textInfo, hole, rotation, theme, bindTooltip]);\n\n const PieChartLegend: React.FC<{ labels: string[]; colors: string[] }> = ({\n labels,\n colors,\n }) => {\n const items = labels.map((label, i) => (\n <React.Fragment key={`${label}-${i}`}>\n <div className=\"flex items-center text-[13px] leading-[18px] font-medium\">\n <span\n data-slot=\"pie-legend-swatch\"\n className=\"mr-1.5 inline-block size-3 rounded-[4px]\"\n style={{ background: colors[i] }}\n />\n {label}\n {i < labels.length - 1 && (\n <span className=\"mx-3 inline-block h-6 w-0.5 bg-border\" />\n )}\n </div>\n </React.Fragment>\n ));\n\n const rowSize = 6;\n const rows = [];\n for (let i = 0; i < items.length; i += rowSize) {\n rows.push(\n <div\n className=\"mb-2 flex w-full max-w-full flex-wrap items-center justify-center gap-y-3 break-words px-10\"\n key={i}\n >\n {items.slice(i, i + rowSize)}\n </div>\n );\n }\n return (\n <div data-slot=\"pie-legend\" className=\"flex w-full flex-wrap text-foreground\">\n {rows}\n </div>\n );\n };\n\n return (\n <div className=\"relative\" style={{ width: width }}>\n <div className=\"size-full\">\n {title && (\n <div className=\"px-10 text-center\">\n <h2 className=\"m-0 text-[32px] leading-tight font-semibold\">{title}</h2>\n </div>\n )}\n <div\n ref={plotRef}\n style={{\n width: \"100%\",\n height: \"100%\",\n margin: \"0\",\n }}\n />\n <PieChartLegend labels={dataSeries.labels} colors={colors} />\n </div>\n {tooltipElement}\n </div>\n );\n};\n\nexport { PieChart };\nexport type { PieDataSeries, PieTextInfo, PieChartProps };\n"],"names":["DEFAULT_COLORS","CHART_COLORS","PieChart","dataSeries","width","height","title","textInfo","hole","rotation","plotRef","useRef","theme","usePlotlyTheme","bindTooltip","tooltipElement","useChartTooltip","colors","useMemo","result","missingColors","i","useEffect","plotData","layout","config","Plotly","plotElement","jsxs","jsx","labels","items","label","React","rowSize","rows"],"mappings":"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"}
1
+ {"version":3,"file":"PieChart.js","sources":["../../../../src/components/charts/PieChart/PieChart.tsx"],"sourcesContent":["import React, { useEffect, useRef, useMemo } from \"react\";\n\nimport { useChartTooltip } from \"../ChartTooltip\";\nimport { getLoadedPlotly, loadPlotly } from \"../plotly-loader\";\n\nimport { CHART_FONT_FAMILY, usePlotlyTheme } from \"@/hooks/use-plotly-theme\";\nimport { CHART_COLORS } from \"@/utils/colors\";\n\ninterface PieDataSeries {\n labels: string[];\n values: number[];\n name: string;\n colors?: string[];\n}\n\ntype PieTextInfo =\n | \"none\"\n | \"label\"\n | \"percent\"\n | \"value\"\n | \"label+percent\"\n | \"label+value\"\n | \"value+percent\"\n | \"label+value+percent\";\n\ntype PieChartProps = {\n dataSeries: PieDataSeries;\n width?: number;\n height?: number;\n title?: string;\n textInfo?: PieTextInfo;\n hole?: number;\n rotation?: number;\n};\n\nconst DEFAULT_COLORS = CHART_COLORS;\n\nconst PieChart: React.FC<PieChartProps> = ({\n dataSeries,\n width = 400,\n height = 400,\n title,\n textInfo = \"percent\",\n hole = 0,\n rotation = 0,\n}) => {\n const plotRef = useRef<HTMLDivElement>(null);\n const theme = usePlotlyTheme();\n // Slices are large hover targets, so the tooltip tracks the cursor (clamped\n // to the viewport) rather than pinning to the slice centroid\n const { bindTooltip, tooltipElement } = useChartTooltip({ followCursor: true });\n\n const colors = useMemo(() => {\n if (\n dataSeries.colors &&\n dataSeries.colors.length >= dataSeries.labels.length\n ) {\n return dataSeries.colors;\n }\n\n const result = [...(dataSeries.colors || [])];\n const missingColors = dataSeries.labels.length - result.length;\n\n if (missingColors <= 0) return result;\n\n for (let i = 0; i < missingColors; i++) {\n result.push(DEFAULT_COLORS[i % DEFAULT_COLORS.length]);\n }\n\n return result;\n }, [dataSeries.colors, dataSeries.labels.length]);\n\n useEffect(() => {\n if (!plotRef.current) return;\n\n const plotData = [\n {\n type: \"pie\" as const,\n labels: dataSeries.labels,\n values: dataSeries.values,\n name: dataSeries.name,\n marker: {\n colors: colors,\n },\n textinfo: textInfo,\n hoverinfo: \"none\" as const,\n insidetextfont: {\n size: 0,\n family: CHART_FONT_FAMILY,\n color: \"transparent\",\n },\n hole: hole,\n rotation: rotation,\n },\n ];\n\n const layout = {\n width,\n height,\n font: {\n family: CHART_FONT_FAMILY,\n color: theme.textColor,\n },\n showlegend: false,\n margin: { l: 40, r: 40, b: 40, t: 40 },\n paper_bgcolor: theme.paperBg,\n plot_bgcolor: theme.plotBg,\n };\n\n const config = {\n responsive: true,\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, plotData, layout, config);\n bindTooltip(plotRef.current);\n\n // Capture ref value for cleanup\n plotElement = plotRef.current;\n });\n\n return () => {\n cancelled = true;\n if (plotElement) {\n getLoadedPlotly().purge(plotElement);\n }\n };\n }, [colors, dataSeries.labels, dataSeries.name, dataSeries.values, width, height, textInfo, hole, rotation, theme, bindTooltip]);\n\n const PieChartLegend: React.FC<{ labels: string[]; colors: string[] }> = ({\n labels,\n colors,\n }) => {\n const items = labels.map((label, i) => (\n <React.Fragment key={`${label}-${i}`}>\n <div className=\"flex items-center text-[13px] leading-[18px] font-medium\">\n <span\n data-slot=\"pie-legend-swatch\"\n className=\"mr-1.5 inline-block size-3 rounded-[4px]\"\n style={{ background: colors[i] }}\n />\n {label}\n {i < labels.length - 1 && (\n <span className=\"mx-3 inline-block h-6 w-0.5 bg-border\" />\n )}\n </div>\n </React.Fragment>\n ));\n\n const rowSize = 6;\n const rows = [];\n for (let i = 0; i < items.length; i += rowSize) {\n rows.push(\n <div\n className=\"mb-2 flex w-full max-w-full flex-wrap items-center justify-center gap-y-3 break-words px-10\"\n key={i}\n >\n {items.slice(i, i + rowSize)}\n </div>\n );\n }\n return (\n <div data-slot=\"pie-legend\" className=\"flex w-full flex-wrap text-foreground\">\n {rows}\n </div>\n );\n };\n\n return (\n <div className=\"relative\" style={{ width: width }}>\n <div className=\"size-full\">\n {title && (\n <div className=\"px-10 text-center\">\n <h2 className=\"m-0 text-[32px] leading-tight font-semibold\">{title}</h2>\n </div>\n )}\n <div\n ref={plotRef}\n style={{\n width: \"100%\",\n height: \"100%\",\n margin: \"0\",\n }}\n />\n <PieChartLegend labels={dataSeries.labels} colors={colors} />\n </div>\n {tooltipElement}\n </div>\n );\n};\n\nexport { PieChart };\nexport type { PieDataSeries, PieTextInfo, PieChartProps };\n"],"names":["DEFAULT_COLORS","CHART_COLORS","PieChart","dataSeries","width","height","title","textInfo","hole","rotation","plotRef","useRef","theme","usePlotlyTheme","bindTooltip","tooltipElement","useChartTooltip","colors","useMemo","result","missingColors","i","useEffect","plotData","CHART_FONT_FAMILY","layout","config","cancelled","plotElement","loadPlotly","plotly","getLoadedPlotly","jsxs","jsx","labels","items","label","React","rowSize","rows"],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export { PieChart } from './PieChart';
2
+ export type { PieDataSeries, PieTextInfo, PieChartProps } from './PieChart';
@@ -1,2 +1,2 @@
1
- "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const s=require("react/jsx-runtime"),De=require("plotly.js-dist"),r=require("react");;/* empty css */const ot=require("../ChartTooltip/ChartTooltip.cjs"),n=require("./constants.cjs"),R=require("./types.cjs"),u=require("./utils.cjs"),lt=require("../../ui/button.cjs"),st=require("../../../hooks/use-plotly-theme.cjs"),rt=({data:h,layerConfigs:ce,initialLayerId:Ie,onLayerChange:je,plateFormat:ie=R.PLATE_FORMAT_96,rows:Fe,columns:ke,visualizationMode:Ge="heatmap",categoryColors:pe,regions:M,title:v,xTitle:ue,yTitle:w,xLabels:de,yLabels:me,colorScale:$e=n.DEFAULT_COLOR_SCALE,valueMin:Ue,valueMax:qe,emptyWellColor:y=n.COLORS.emptyWell,showColorBar:fe=!0,showLegend:Ve=!0,legendConfig:_,width:E=800,height:P=500,precision:J=0,markerShape:G="circle",onWellClick:ge})=>{const Ae=r.useRef(null),x=st.usePlotlyTheme(),K=r.useRef(ge);K.current=ge;const[Q,Be]=r.useState(Ie);let c,i;if(ie===R.PLATE_FORMAT_CUSTOM)c=Fe??8,i=ke??12;else{const e=n.PLATE_CONFIGS[ie];c=e.rows,i=e.columns}const ee=r.useMemo(()=>u.calculateMarkerSize(E,P,c,i,G,!!v,!!w),[E,P,c,i,G,v,w]),{bindTooltip:he,tooltipElement:Ze}=ot.useChartTooltip({hoverDistance:Math.ceil(ee/2)}),m=r.useMemo(()=>{if(Array.isArray(h)&&h.length>0&&"wellId"in h[0]){const e=h;if(u.hasMultiValueWells(e))return u.extractLayers(e,ce)}return null},[h,ce]),f=r.useMemo(()=>!m||m.length===0?null:Q?m.find(e=>e.id===Q)??m[0]:m[0],[m,Q]),b=f?.visualizationMode??Ge,C=f?.colorScale??$e,He=f?.valueMin??Ue,We=f?.valueMax??qe,$=f?.valueUnit?` ${f.valueUnit}`:"",U=r.useMemo(()=>({...n.DEFAULT_CATEGORY_COLORS,...pe,...f?.categoryColors}),[pe,f?.categoryColors]),_e=f?.id,{grid:S,categoriesGrid:te,allValuesMap:q,tooltipDataMap:V}=r.useMemo(()=>{let e,t=Array.from({length:c},()=>Array(i).fill(null)),o=new Map,l=new Map;if(Array.isArray(h)&&h.length>0){const a=u.wellDataToGrid(h,c,i,_e);e=a.grid,t=a.categories,o=a.allValues,l=a.tooltipData}else e=Array.from({length:c},()=>Array.from({length:i},()=>Math.random()*n.PLATEMAP_CONSTANTS.MAX_RANDOM_VALUE));return{grid:e,categoriesGrid:t,allValuesMap:o,tooltipDataMap:l}},[h,c,i,_e]),T=r.useMemo(()=>me??u.generateRowLabels(c),[me,c]),L=r.useMemo(()=>de??u.generateColumnLabels(i),[de,i]),xe=u.calculateValueRange(S),z=He??xe.min,D=We??xe.max,I=S.some(e=>e.includes(null)),N=z-(D-z)*n.PLATEMAP_CONSTANTS.SENTINEL_RATIO-1,Se=r.useMemo(()=>I?S.map(e=>e.map(t=>t===null?N:t)):S,[I,S,N]),Te=r.useMemo(()=>{if(!I)return C;let e;if(typeof C=="string"){const a=n.NAMED_COLORSCALES[C];if(a)e=a;else return C}else e=C;const t=D-N,o=(z-N)/t,l=[[0,y],[o*n.PLATEMAP_CONSTANTS.COLOR_SCALE_THRESHOLD,y]];for(const[a,d]of e){const g=o+a*(1-o);l.push([g,d])}return l},[C,I,z,D,N,y]),Me=I?N:z,ye=r.useMemo(()=>{const e=new Map;if(m)for(const t of m)e.set(t.id,t);return e},[m]),Le=r.useMemo(()=>S.map((e,t)=>e.map((o,l)=>{const a=`${T[t]}${L[l]}`,d=String(a).toUpperCase();return u.buildWellHoverText({wellId:a,value:o,allValues:q.get(d),tooltipExtra:V.get(d),activeLayerId:f?.id,layerConfigMap:ye,precision:J,valueUnit:$})})),[S,T,L,q,V,f?.id,ye,J,$]),{categoricalGrid:ae,categoricalColorScale:oe,uniqueTypes:le,catMax:Oe}=r.useMemo(()=>{if(b!=="categorical")return{categoricalGrid:null,categoricalColorScale:null,uniqueTypes:[],catMax:0};const e=new Set;let t=!1;for(const p of te)for(const A of p)A?e.add(A):t=!0;t&&e.add("empty");const o=[...e].sort(),l=new Map;o.forEach((p,A)=>l.set(p,A));const a=te.map(p=>p.map(A=>A===null?l.get("empty")??0:l.get(A)??l.get("empty")??0)),d=o.length,g=[];if(d===1){const p=U[o[0]]||y;g.push([0,p]),g.push([1,p])}else o.forEach((p,A)=>{const W=U[p]||y,Y=A/(d-1),X=.5/(d-1),k=Math.max(0,Y-X),re=Math.min(1,Y+X-n.PLATEMAP_CONSTANTS.COLOR_SCALE_EPSILON);g.push([k,W]),g.push([re,W])});return{categoricalGrid:a,categoricalColorScale:g,uniqueTypes:o,catMax:d-1}},[b,te,U,y]),ve=r.useMemo(()=>{if(!M||M.length===0)return[];const e=[];for(const t of M){const o=u.parseRegionWells(t.wells,T,L);if(!o)continue;const l=.49,a=o.minCol+1-l,d=o.maxCol+1+l,g=o.minRow-l,p=o.maxRow+l;e.push({type:"rect",xref:"x",yref:"y",x0:a,x1:d,y0:g,y1:p,line:{color:t.borderColor||n.COLORS.textDark,width:t.borderWidth??2},fillcolor:t.fillColor||"transparent",layer:"above"})}return e},[M,T,L]);r.useEffect(()=>{const e=Ae.current;if(!e)return;const t=b==="categorical",o=t&&ae?ae:Se,l=t&&oe?oe:Te,a=t?0:Me,d=t?Oe||1:D,g=t?!1:fe,{xData:p,yData:A,colorData:W,textData:Y}=u.flattenGridData(o,T,Le,c,i,a),X=[{x:p,y:A,mode:"markers",type:"scatter",marker:{symbol:G,size:ee,color:W,colorscale:l,cmin:a,cmax:d,showscale:g,colorbar:u.buildColorbarConfig(_?.position??"right",$,_?.title),line:{color:x.gridColor,width:1}},hoverinfo:"none",text:Y}],k=_?.position??"right",re={autosize:!1,title:v?{text:v,font:{family:"Inter, sans-serif",size:20,color:x.textSecondary},x:u.calculateTitleX(k),xanchor:"center",y:.98,yanchor:"top"}:void 0,width:E,height:P,margin:u.buildPlotMargins(k,!!v,!!w),xaxis:{title:{text:ue||"",font:{size:16,color:x.textSecondary,family:"Inter, sans-serif"},standoff:15},side:"top",fixedrange:!0,dtick:1,range:[.5,i+.5],automargin:!1,tickmode:"array",tickvals:Array.from({length:i},(ne,O)=>O+1),ticktext:L.map(String),tickangle:0,tickfont:{size:i>24?8:n.PLATEMAP_CONSTANTS.FONT_SIZE_LARGE},domain:u.calculateAxisDomain(k)},yaxis:{title:{text:w||"",font:{size:16,color:x.textSecondary,family:"Inter, sans-serif"},standoff:15},fixedrange:!0,dtick:1,range:[c+n.PLATEMAP_CONSTANTS.LABEL_CENTER_OFFSET,n.PLATEMAP_CONSTANTS.LABEL_CENTER_OFFSET],automargin:!1,tickmode:"array",tickvals:Array.from({length:c},(ne,O)=>O),ticktext:T.map(String),tickfont:{size:c>16?8:n.PLATEMAP_CONSTANTS.FONT_SIZE_LARGE}},paper_bgcolor:x.paperBg,plot_bgcolor:x.plotBg,font:{family:"Inter, sans-serif",color:x.textSecondary},shapes:ve},Qe={responsive:!0,displayModeBar:!1,displaylogo:!1};return De.newPlot(e,X,re,Qe),he(e),e.on("plotly_click",ne=>{if(!K.current)return;const O=ne.points[0];if(O){const Ne=T,Re=L,we=Ne.indexOf(O.y),Pe=Re.indexOf(O.x);if(we>=0&&Pe>=0){const be=`${Ne[we]}${Re[Pe]}`,ze=String(be).toUpperCase(),et=q.get(ze),tt=V.get(ze),at={wellId:be,values:et,tooltipData:tt};K.current?.(at)}}}),()=>{e&&De.purge(e)}},[Se,L,T,Te,fe,Me,D,$,v,ue,w,E,P,Le,J,V,q,S,b,ae,oe,le.length,Oe,ve,c,i,_,G,ee,x,he]);const Ye=()=>!m||m.length<=1?null:s.jsx("div",{className:"platemap-layer-selector",children:m.map(e=>{const t=f?.id===e.id;return s.jsx(lt.Button,{variant:t?"default":"outline",size:"sm",onClick:()=>{Be(e.id),je?.(e.id)},children:e.name},e.id)})}),j=_?.position??"right",se=_?.fontSize??12,Xe=_?.itemSpacing??4,B=_?.swatchSize??16,Ee=_?.title,Ce=120,F=j==="top"||j==="bottom",Je=()=>{const e=b==="categorical"&&le.length>0,t=M&&M.length>0;if(!Ve||!e&&!t)return F?null:s.jsx("div",{className:"platemap-legend-placeholder",style:{width:Ce}});const o=["platemap-legend"];F?o.push("platemap-legend--horizontal"):j==="left"?o.push("platemap-legend--left"):j==="right"&&o.push("platemap-legend--right");const l={gap:`${Xe}px`,width:F?void 0:Ce};return s.jsxs("div",{className:o.join(" "),style:l,children:[Ee&&s.jsx("div",{className:`platemap-legend__title${F?" platemap-legend__title--horizontal":""}`,style:{fontSize:`${se}px`},children:Ee}),e&&le.map(a=>s.jsxs("div",{className:"platemap-legend__item",children:[s.jsx("div",{className:"platemap-legend__swatch",style:{width:`${B}px`,height:`${B}px`,backgroundColor:U[a]||y}}),s.jsx("span",{className:"platemap-legend__label platemap-legend__label--capitalize",style:{fontSize:`${se}px`},children:a})]},a)),t&&M.map(a=>s.jsxs("div",{className:"platemap-legend__item",children:[s.jsx("div",{className:"platemap-legend__swatch platemap-legend__swatch--region",style:{width:`${B}px`,height:`${B}px`,backgroundColor:a.fillColor||"transparent",border:`${a.borderWidth||2}px solid ${a.borderColor||n.COLORS.regionBorder}`}}),s.jsx("span",{className:"platemap-legend__label",style:{fontSize:`${se}px`},children:a.name})]},a.id))]})},Z=s.jsxs("div",{className:"relative",children:[s.jsx("div",{ref:Ae,className:"platemap-plot",style:{width:E,height:P}}),Ze]}),H=Je(),Ke=()=>{switch(j){case"left":return s.jsxs("div",{className:"platemap-plot-wrapper platemap-plot-wrapper--vertical",children:[H,Z]});case"top":return s.jsxs("div",{className:"platemap-plot-wrapper platemap-plot-wrapper--horizontal",children:[H,Z]});case"bottom":return s.jsxs("div",{className:"platemap-plot-wrapper platemap-plot-wrapper--horizontal",children:[Z,H]});default:return s.jsxs("div",{className:"platemap-plot-wrapper platemap-plot-wrapper--vertical",children:[Z,H]})}};return s.jsxs("div",{className:"platemap-container",style:{width:F?void 0:E},children:[Ye(),Ke()]})};exports.DEFAULT_CATEGORY_COLORS=n.DEFAULT_CATEGORY_COLORS;exports.PLATE_FORMAT_1536=R.PLATE_FORMAT_1536;exports.PLATE_FORMAT_384=R.PLATE_FORMAT_384;exports.PLATE_FORMAT_96=R.PLATE_FORMAT_96;exports.PLATE_FORMAT_CUSTOM=R.PLATE_FORMAT_CUSTOM;exports.PlateMap=rt;
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const s=require("react/jsx-runtime"),r=require("react");;/* empty css */const nt=require("../ChartTooltip/ChartTooltip.cjs"),ke=require("../plotly-loader.cjs"),n=require("./constants.cjs"),w=require("./types.cjs"),u=require("./utils.cjs"),ct=require("../../../ui/button.cjs"),G=require("../../../hooks/use-plotly-theme.cjs"),it=({data:_,layerConfigs:de,initialLayerId:Ge,onLayerChange:$e,plateFormat:me=w.PLATE_FORMAT_96,rows:Ue,columns:qe,visualizationMode:Ve="heatmap",categoryColors:fe,regions:y,title:v,xTitle:ge,yTitle:P,xLabels:Ae,yLabels:_e,colorScale:He=n.DEFAULT_COLOR_SCALE,valueMin:Be,valueMax:Ye,emptyWellColor:L=n.COLORS.emptyWell,showColorBar:Te=!0,showLegend:Ze=!0,legendConfig:T,width:E=800,height:b=500,precision:K=0,markerShape:$="circle",onWellClick:he})=>{const U=r.useRef(null),h=G.usePlotlyTheme(),Q=r.useRef(he);Q.current=he;const[ee,We]=r.useState(Ge);let c,i;if(me===w.PLATE_FORMAT_CUSTOM)c=Ue??8,i=qe??12;else{const e=n.PLATE_CONFIGS[me];c=e.rows,i=e.columns}const te=r.useMemo(()=>u.calculateMarkerSize(E,b,c,i,$,!!v,!!P),[E,b,c,i,$,v,P]),{bindTooltip:xe,tooltipElement:Xe}=nt.useChartTooltip({hoverDistance:Math.ceil(te/2)}),m=r.useMemo(()=>{if(Array.isArray(_)&&_.length>0&&"wellId"in _[0]){const e=_;if(u.hasMultiValueWells(e))return u.extractLayers(e,de)}return null},[_,de]),f=r.useMemo(()=>!m||m.length===0?null:ee?m.find(e=>e.id===ee)??m[0]:m[0],[m,ee]),z=f?.visualizationMode??Ve,C=f?.colorScale??He,Je=f?.valueMin??Be,Ke=f?.valueMax??Ye,q=f?.valueUnit?` ${f.valueUnit}`:"",V=r.useMemo(()=>({...n.DEFAULT_CATEGORY_COLORS,...fe,...f?.categoryColors}),[fe,f?.categoryColors]),Me=f?.id,{grid:x,categoriesGrid:ae,allValuesMap:H,tooltipDataMap:B}=r.useMemo(()=>{let e,a=Array.from({length:c},()=>Array(i).fill(null)),l=new Map,o=new Map;if(Array.isArray(_)&&_.length>0){const t=u.wellDataToGrid(_,c,i,Me);e=t.grid,a=t.categories,l=t.allValues,o=t.tooltipData}else e=Array.from({length:c},()=>Array.from({length:i},()=>Math.random()*n.PLATEMAP_CONSTANTS.MAX_RANDOM_VALUE));return{grid:e,categoriesGrid:a,allValuesMap:l,tooltipDataMap:o}},[_,c,i,Me]),M=r.useMemo(()=>_e??u.generateRowLabels(c),[_e,c]),O=r.useMemo(()=>Ae??u.generateColumnLabels(i),[Ae,i]),Se=u.calculateValueRange(x),F=Je??Se.min,D=Ke??Se.max,I=x.some(e=>e.includes(null)),N=F-(D-F)*n.PLATEMAP_CONSTANTS.SENTINEL_RATIO-1,ye=r.useMemo(()=>I?x.map(e=>e.map(a=>a===null?N:a)):x,[I,x,N]),Le=r.useMemo(()=>{if(!I)return C;let e;if(typeof C=="string"){const t=n.NAMED_COLORSCALES[C];if(t)e=t;else return C}else e=C;const a=D-N,l=(F-N)/a,o=[[0,L],[l*n.PLATEMAP_CONSTANTS.COLOR_SCALE_THRESHOLD,L]];for(const[t,d]of e){const g=l+t*(1-l);o.push([g,d])}return o},[C,I,F,D,N,L]),Oe=I?N:F,ve=r.useMemo(()=>{const e=new Map;if(m)for(const a of m)e.set(a.id,a);return e},[m]),Ee=r.useMemo(()=>x.map((e,a)=>e.map((l,o)=>{const t=`${M[a]}${O[o]}`,d=String(t).toUpperCase();return u.buildWellHoverText({wellId:t,value:l,allValues:H.get(d),tooltipExtra:B.get(d),activeLayerId:f?.id,layerConfigMap:ve,precision:K,valueUnit:q})})),[x,M,O,H,B,f?.id,ve,K,q]),{categoricalGrid:le,categoricalColorScale:oe,uniqueTypes:se,catMax:Ce}=r.useMemo(()=>{if(z!=="categorical")return{categoricalGrid:null,categoricalColorScale:null,uniqueTypes:[],catMax:0};const e=new Set;let a=!1;for(const p of ae)for(const A of p)A?e.add(A):a=!0;a&&e.add("empty");const l=[...e].sort(),o=new Map;l.forEach((p,A)=>o.set(p,A));const t=ae.map(p=>p.map(A=>A===null?o.get("empty")??0:o.get(A)??o.get("empty")??0)),d=l.length,g=[];if(d===1){const p=V[l[0]]||L;g.push([0,p]),g.push([1,p])}else l.forEach((p,A)=>{const X=V[p]||L,J=A/(d-1),R=.5/(d-1),ne=Math.max(0,J-R),ce=Math.min(1,J+R-n.PLATEMAP_CONSTANTS.COLOR_SCALE_EPSILON);g.push([ne,X]),g.push([ce,X])});return{categoricalGrid:t,categoricalColorScale:g,uniqueTypes:l,catMax:d-1}},[z,ae,V,L]),Ne=r.useMemo(()=>{if(!y||y.length===0)return[];const e=[];for(const a of y){const l=u.parseRegionWells(a.wells,M,O);if(!l)continue;const o=.49,t=l.minCol+1-o,d=l.maxCol+1+o,g=l.minRow-o,p=l.maxRow+o;e.push({type:"rect",xref:"x",yref:"y",x0:t,x1:d,y0:g,y1:p,line:{color:a.borderColor||n.COLORS.textDark,width:a.borderWidth??2},fillcolor:a.fillColor||"transparent",layer:"above"})}return e},[y,M,O]);r.useEffect(()=>{if(!U.current)return;const e=z==="categorical",a=e&&le?le:ye,l=e&&oe?oe:Le,o=e?0:Oe,t=e?Ce||1:D,d=e?!1:Te,{xData:g,yData:p,colorData:A,textData:X}=u.flattenGridData(a,M,Ee,c,i,o),J=[{x:g,y:p,mode:"markers",type:"scatter",marker:{symbol:$,size:te,color:A,colorscale:l,cmin:o,cmax:t,showscale:d,colorbar:u.buildColorbarConfig(T?.position??"right",q,T?.title),line:{color:h.gridColor,width:1}},hoverinfo:"none",text:X}],R=T?.position??"right",ne={autosize:!1,title:v?{text:v,font:{family:G.CHART_FONT_FAMILY,size:20,color:h.textSecondary},x:u.calculateTitleX(R),xanchor:"center",y:.98,yanchor:"top"}:void 0,width:E,height:b,margin:u.buildPlotMargins(R,!!v,!!P),xaxis:{title:{text:ge||"",font:{size:16,color:h.textSecondary,family:G.CHART_FONT_FAMILY},standoff:15},side:"top",fixedrange:!0,dtick:1,range:[.5,i+.5],automargin:!1,tickmode:"array",tickvals:Array.from({length:i},(pe,S)=>S+1),ticktext:O.map(String),tickangle:0,tickfont:{size:i>24?8:n.PLATEMAP_CONSTANTS.FONT_SIZE_LARGE},domain:u.calculateAxisDomain(R)},yaxis:{title:{text:P||"",font:{size:16,color:h.textSecondary,family:G.CHART_FONT_FAMILY},standoff:15},fixedrange:!0,dtick:1,range:[c+n.PLATEMAP_CONSTANTS.LABEL_CENTER_OFFSET,n.PLATEMAP_CONSTANTS.LABEL_CENTER_OFFSET],automargin:!1,tickmode:"array",tickvals:Array.from({length:c},(pe,S)=>S),ticktext:M.map(String),tickfont:{size:c>16?8:n.PLATEMAP_CONSTANTS.FONT_SIZE_LARGE}},paper_bgcolor:h.paperBg,plot_bgcolor:h.plotBg,font:{family:G.CHART_FONT_FAMILY,color:h.textSecondary},shapes:Ne},ce={responsive:!0,displayModeBar:!1,displaylogo:!1};let Pe=!1,ie=null;return ke.loadPlotly().then(pe=>{if(Pe||!U.current)return;const S=U.current;pe.newPlot(S,J,ne,ce),xe(S),S.on("plotly_click",lt=>{if(!Q.current)return;const ue=lt.points[0];if(ue){const be=M,ze=O,Fe=be.indexOf(ue.y),De=ze.indexOf(ue.x);if(Fe>=0&&De>=0){const Ie=`${be[Fe]}${ze[De]}`,je=String(Ie).toUpperCase(),ot=H.get(je),st=B.get(je),rt={wellId:Ie,values:ot,tooltipData:st};Q.current?.(rt)}}}),ie=S}),()=>{Pe=!0,ie&&ke.getLoadedPlotly().purge(ie)}},[ye,O,M,Le,Te,Oe,D,q,v,ge,P,E,b,Ee,K,B,H,x,z,le,oe,se.length,Ce,Ne,c,i,T,$,te,h,xe]);const Qe=()=>!m||m.length<=1?null:s.jsx("div",{className:"platemap-layer-selector",children:m.map(e=>{const a=f?.id===e.id;return s.jsx(ct.Button,{variant:a?"default":"outline",size:"sm",onClick:()=>{We(e.id),$e?.(e.id)},children:e.name},e.id)})}),j=T?.position??"right",re=T?.fontSize??12,et=T?.itemSpacing??4,Y=T?.swatchSize??16,Re=T?.title,we=120,k=j==="top"||j==="bottom",tt=()=>{const e=z==="categorical"&&se.length>0,a=y&&y.length>0;if(!Ze||!e&&!a)return k?null:s.jsx("div",{className:"platemap-legend-placeholder",style:{width:we}});const l=["platemap-legend"];k?l.push("platemap-legend--horizontal"):j==="left"?l.push("platemap-legend--left"):j==="right"&&l.push("platemap-legend--right");const o={gap:`${et}px`,width:k?void 0:we};return s.jsxs("div",{className:l.join(" "),style:o,children:[Re&&s.jsx("div",{className:`platemap-legend__title${k?" platemap-legend__title--horizontal":""}`,style:{fontSize:`${re}px`},children:Re}),e&&se.map(t=>s.jsxs("div",{className:"platemap-legend__item",children:[s.jsx("div",{className:"platemap-legend__swatch",style:{width:`${Y}px`,height:`${Y}px`,backgroundColor:V[t]||L}}),s.jsx("span",{className:"platemap-legend__label platemap-legend__label--capitalize",style:{fontSize:`${re}px`},children:t})]},t)),a&&y.map(t=>s.jsxs("div",{className:"platemap-legend__item",children:[s.jsx("div",{className:"platemap-legend__swatch platemap-legend__swatch--region",style:{width:`${Y}px`,height:`${Y}px`,backgroundColor:t.fillColor||"transparent",border:`${t.borderWidth||2}px solid ${t.borderColor||n.COLORS.regionBorder}`}}),s.jsx("span",{className:"platemap-legend__label",style:{fontSize:`${re}px`},children:t.name})]},t.id))]})},Z=s.jsxs("div",{className:"relative",children:[s.jsx("div",{ref:U,className:"platemap-plot",style:{width:E,height:b}}),Xe]}),W=tt(),at=()=>{switch(j){case"left":return s.jsxs("div",{className:"platemap-plot-wrapper platemap-plot-wrapper--vertical",children:[W,Z]});case"top":return s.jsxs("div",{className:"platemap-plot-wrapper platemap-plot-wrapper--horizontal",children:[W,Z]});case"bottom":return s.jsxs("div",{className:"platemap-plot-wrapper platemap-plot-wrapper--horizontal",children:[Z,W]});default:return s.jsxs("div",{className:"platemap-plot-wrapper platemap-plot-wrapper--vertical",children:[Z,W]})}};return s.jsxs("div",{className:"platemap-container",style:{width:k?void 0:E},children:[Qe(),at()]})};exports.DEFAULT_CATEGORY_COLORS=n.DEFAULT_CATEGORY_COLORS;exports.PLATE_FORMAT_1536=w.PLATE_FORMAT_1536;exports.PLATE_FORMAT_384=w.PLATE_FORMAT_384;exports.PLATE_FORMAT_96=w.PLATE_FORMAT_96;exports.PLATE_FORMAT_CUSTOM=w.PLATE_FORMAT_CUSTOM;exports.PlateMap=it;
2
2
  //# sourceMappingURL=PlateMap.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"PlateMap.cjs","sources":["../../../../src/components/charts/PlateMap/PlateMap.tsx"],"sourcesContent":["import Plotly from \"plotly.js-dist\";\nimport React, { useEffect, useMemo, useRef, useState } from \"react\";\n\nimport \"./PlateMap.scss\";\nimport { useChartTooltip } from \"../ChartTooltip\";\n\nimport {\n PLATE_CONFIGS,\n DEFAULT_COLOR_SCALE,\n COLORS,\n DEFAULT_CATEGORY_COLORS,\n PLATEMAP_CONSTANTS,\n NAMED_COLORSCALES,\n} from \"./constants\";\nimport {\n PLATE_FORMAT_96,\n PLATE_FORMAT_CUSTOM,\n} from \"./types\";\nimport {\n generateRowLabels,\n generateColumnLabels,\n wellDataToGrid,\n calculateValueRange,\n hasMultiValueWells,\n extractLayers,\n parseRegionWells,\n buildWellHoverText,\n buildColorbarConfig,\n buildPlotMargins,\n calculateTitleX,\n calculateAxisDomain,\n flattenGridData,\n calculateMarkerSize,\n} from \"./utils\";\n\nimport type {\n PlateMapProps,\n LayerConfig,\n WellData,\n} from \"./types\";\n\n// Re-export types and constants for external consumers\nexport * from \"./types\";\nexport { DEFAULT_CATEGORY_COLORS } from \"./constants\";\n\nimport { Button } from \"@/components/ui/button\";\nimport { usePlotlyTheme } from \"@/hooks/use-plotly-theme\";\n\n/**\n * PlateMap component for visualizing well plate data as a heatmap or categorical display.\n *\n * **Supported Plate Formats:**\n * - 96-well (8 rows × 12 columns, wells A1-H12)\n * - 384-well (16 rows × 24 columns, wells A1-P24)\n * - 1536-well (32 rows × 48 columns, wells A1-AF48)\n * - Custom dimensions with user-specified rows/columns\n *\n * **Visualization Modes:**\n * - `\"heatmap\"`: Continuous color gradient for quantitative values\n * - `\"categorical\"`: Discrete colors for well types (sample, control, empty)\n *\n * **Features:**\n * - Multiple data layers with independent visualization settings\n * - Control region highlighting with borders and fill colors\n * - Configurable color scales, tooltips, and click interactions\n * - Support for WellData arrays with multi-layer visualization\n *\n * **Data Format:**\n * - **WellData array**: `[{ wellId: \"A1\", values: { RFU: 100 }, tooltipData: {...} }, ...]`\n *\n */\nconst PlateMap: React.FC<PlateMapProps> = ({\n data,\n layerConfigs,\n initialLayerId,\n onLayerChange,\n plateFormat = PLATE_FORMAT_96,\n rows: customRows,\n columns: customColumns,\n visualizationMode: propVisualizationMode = \"heatmap\",\n categoryColors: customCategoryColors,\n regions,\n title,\n xTitle,\n yTitle,\n xLabels: customXLabels,\n yLabels: customYLabels,\n colorScale: propColorScale = DEFAULT_COLOR_SCALE,\n valueMin: propValueMin,\n valueMax: propValueMax,\n emptyWellColor = COLORS.emptyWell,\n showColorBar = true,\n showLegend = true,\n legendConfig,\n width = 800,\n height = 500,\n precision = 0,\n markerShape = \"circle\",\n onWellClick,\n}) => {\n const plotRef = useRef<HTMLDivElement>(null);\n const theme = usePlotlyTheme();\n const onWellClickRef = useRef(onWellClick);\n onWellClickRef.current = onWellClick;\n\n // Internal state for layer toggling, initialized with initialLayerId\n const [activeLayerId, setActiveLayerId] = useState<string | undefined>(initialLayerId);\n\n // Determine plate dimensions\n let rows: number;\n let columns: number;\n\n if (plateFormat === PLATE_FORMAT_CUSTOM) {\n rows = customRows ?? 8;\n columns = customColumns ?? 12;\n } else {\n const config = PLATE_CONFIGS[plateFormat];\n rows = config.rows;\n columns = config.columns;\n }\n\n // Diameter (px) of each well marker; also drives the hover hit radius so the\n // whole circle is hoverable instead of just a small zone around its center\n const markerSize = useMemo(\n () => calculateMarkerSize(width, height, rows, columns, markerShape, !!title, !!yTitle),\n [width, height, rows, columns, markerShape, title, yTitle],\n );\n const { bindTooltip, tooltipElement } = useChartTooltip({\n hoverDistance: Math.ceil(markerSize / 2),\n });\n\n // Auto-generate layers from multi-value WellData\n const effectiveLayers = useMemo((): LayerConfig[] | null => {\n // Check if data contains multi-value wells\n if (Array.isArray(data) && data.length > 0 && \"wellId\" in (data[0] as WellData)) {\n const wellDataArray = data as WellData[];\n if (hasMultiValueWells(wellDataArray)) {\n return extractLayers(wellDataArray, layerConfigs);\n }\n }\n\n return null;\n }, [data, layerConfigs]);\n\n // Handle layer toggling - determine active layer\n const activeLayer = useMemo((): LayerConfig | null => {\n if (!effectiveLayers || effectiveLayers.length === 0) return null;\n if (activeLayerId) {\n return effectiveLayers.find((l) => l.id === activeLayerId) ?? effectiveLayers[0];\n }\n return effectiveLayers[0];\n }, [effectiveLayers, activeLayerId]);\n\n // Get effective props from active layer or default props\n // Data is always the same - we just change which layer is being visualized\n const visualizationMode = activeLayer?.visualizationMode ?? propVisualizationMode;\n const colorScale = activeLayer?.colorScale ?? propColorScale;\n const valueMin = activeLayer?.valueMin ?? propValueMin;\n const valueMax = activeLayer?.valueMax ?? propValueMax;\n // Derive valueUnit from layer config\n const valueUnit = activeLayer?.valueUnit ? ` ${activeLayer.valueUnit}` : \"\";\n\n // Merge custom category colors with defaults, including layer-specific colors\n const categoryColors = useMemo(\n () => ({ ...DEFAULT_CATEGORY_COLORS, ...customCategoryColors, ...activeLayer?.categoryColors }),\n [customCategoryColors, activeLayer?.categoryColors]\n );\n\n // Convert data to grid format - memoize to prevent re-render issues\n // Use activeLayer.id to extract the appropriate value from multi-value wells\n const activeLayerId_ = activeLayer?.id;\n const { grid, categoriesGrid, allValuesMap, tooltipDataMap } = useMemo(() => {\n let resultGrid: (number | null)[][];\n let resultCategories: (string | null)[][] = Array.from({ length: rows }, () =>\n Array(columns).fill(null)\n );\n let resultAllValues = new Map<string, Record<string, string | number | null>>();\n let resultTooltipData = new Map<string, Record<string, unknown>>();\n\n if (Array.isArray(data) && data.length > 0) {\n // WellData array format - pass activeLayerId to extract the right layer\n const result = wellDataToGrid(data, rows, columns, activeLayerId_);\n resultGrid = result.grid;\n resultCategories = result.categories;\n resultAllValues = result.allValues;\n resultTooltipData = result.tooltipData;\n } else {\n // Generate random data for demonstration when no data provided\n resultGrid = Array.from({ length: rows }, () =>\n Array.from({ length: columns }, () => Math.random() * PLATEMAP_CONSTANTS.MAX_RANDOM_VALUE)\n );\n }\n\n return { grid: resultGrid, categoriesGrid: resultCategories, allValuesMap: resultAllValues, tooltipDataMap: resultTooltipData };\n }, [data, rows, columns, activeLayerId_]);\n\n // Generate labels - use custom labels if provided, otherwise auto-generate.\n // Memoized so a tooltip-driven re-render doesn't change their identity and\n // needlessly rebuild the plot (which would clear the open tooltip).\n const rowLabels = useMemo(\n () => customYLabels ?? generateRowLabels(rows),\n [customYLabels, rows],\n );\n const colLabels = useMemo(\n () => customXLabels ?? generateColumnLabels(columns),\n [customXLabels, columns],\n );\n\n // Calculate value range if not provided\n const range = calculateValueRange(grid);\n const zMin = valueMin ?? range.min;\n const zMax = valueMax ?? range.max;\n\n // Check if grid has any null values\n const hasNullValues = grid.some(row => row.includes(null));\n\n // Create sentinel value for empty wells (below the data range)\n // This allows us to show emptyWellColor for null cells\n const sentinelValue = zMin - (zMax - zMin) * PLATEMAP_CONSTANTS.SENTINEL_RATIO - 1;\n\n // Replace null values with sentinel for Plotly rendering\n const displayGrid = useMemo(\n () =>\n hasNullValues\n ? grid.map((row) => row.map((val) => (val === null ? sentinelValue : val)))\n : grid,\n [hasNullValues, grid, sentinelValue],\n );\n\n // Extend colorscale to include emptyWellColor at the bottom for null values\n const effectiveColorScale = useMemo(() => {\n if (!hasNullValues) return colorScale;\n\n // Convert colorScale to array format if it's a named string scale\n let arrayColorScale: Array<[number, string]>;\n if (typeof colorScale === \"string\") {\n // Look up the named scale in our mapping\n const namedScale = NAMED_COLORSCALES[colorScale];\n if (namedScale) {\n arrayColorScale = namedScale;\n } else {\n // Unknown named scale - can't extend it, return as-is\n // This is a fallback for custom/unknown Plotly scale names\n return colorScale;\n }\n } else {\n arrayColorScale = colorScale;\n }\n\n // For array colorscales, prepend emptyWellColor at position 0\n // and shift all other positions proportionally\n const totalRange = zMax - sentinelValue;\n const dataStartRatio = (zMin - sentinelValue) / totalRange;\n\n // Create new colorscale with emptyWellColor at the bottom\n const extendedScale: Array<[number, string]> = [\n [0, emptyWellColor],\n [dataStartRatio * PLATEMAP_CONSTANTS.COLOR_SCALE_THRESHOLD, emptyWellColor], // Small band for empty wells\n ];\n\n // Remap original colorscale positions to the remaining range\n for (const [pos, color] of arrayColorScale) {\n const newPos = dataStartRatio + pos * (1 - dataStartRatio);\n extendedScale.push([newPos, color]);\n }\n\n return extendedScale;\n }, [colorScale, hasNullValues, zMin, zMax, sentinelValue, emptyWellColor]);\n\n // Effective zMin includes sentinel value if we have nulls\n const effectiveZMin = hasNullValues ? sentinelValue : zMin;\n\n // Create a lookup map for layer configs to get valueUnit for each layer\n const layerConfigMap = useMemo(() => {\n const map = new Map<string, LayerConfig>();\n if (effectiveLayers) {\n for (const layer of effectiveLayers) {\n map.set(layer.id, layer);\n }\n }\n return map;\n }, [effectiveLayers]);\n\n // Build custom hover text matrix - shows ALL values regardless of active layer.\n // Memoized so its identity is stable across tooltip-driven re-renders.\n const hoverText = useMemo<string[][]>(\n () =>\n grid.map((row, rowIdx) =>\n row.map((val, colIdx) => {\n const wellId = `${rowLabels[rowIdx]}${colLabels[colIdx]}`;\n const wellIdUpper = String(wellId).toUpperCase();\n return buildWellHoverText({\n wellId,\n value: val,\n allValues: allValuesMap.get(wellIdUpper),\n tooltipExtra: tooltipDataMap.get(wellIdUpper),\n activeLayerId: activeLayer?.id,\n layerConfigMap,\n precision,\n valueUnit,\n });\n })\n ),\n [grid, rowLabels, colLabels, allValuesMap, tooltipDataMap, activeLayer?.id, layerConfigMap, precision, valueUnit],\n );\n\n // Build categorical data for categorical mode\n const { categoricalGrid, categoricalColorScale, uniqueTypes, catMax } = useMemo(() => {\n if (visualizationMode !== \"categorical\") {\n return { categoricalGrid: null, categoricalColorScale: null, uniqueTypes: [], catMax: 0 };\n }\n\n // Collect unique categories from the categoriesGrid\n const typesSet = new Set<string>();\n let hasNullCategory = false;\n for (const row of categoriesGrid) {\n for (const category of row) {\n if (category) {\n typesSet.add(category);\n } else {\n hasNullCategory = true;\n }\n }\n }\n // Only include \"empty\" if there are actual null wells\n if (hasNullCategory) {\n typesSet.add(\"empty\");\n }\n const types = [...typesSet].sort();\n\n // Create numeric grid where each category maps to an index\n const typeToIndex = new Map<string, number>();\n types.forEach((type, idx) => typeToIndex.set(type, idx));\n\n const catGrid: number[][] = categoriesGrid.map((row) =>\n row.map((category) => {\n if (category === null) {\n return typeToIndex.get(\"empty\") ?? 0;\n }\n return typeToIndex.get(category) ?? typeToIndex.get(\"empty\") ?? 0;\n })\n );\n\n // Build discrete colorscale for categories\n // The grid contains integer indices 0, 1, 2, ... (numTypes - 1)\n // With cmin=0 and cmax=numTypes-1, Plotly maps:\n // index 0 -> normalized 0.0\n // index (numTypes-1) -> normalized 1.0\n // We need each index to map to a distinct color band\n const numTypes = types.length;\n const catColorScale: Array<[number, string]> = [];\n\n if (numTypes === 1) {\n // Single type: entire range is one color\n const color = categoryColors[types[0]] || emptyWellColor;\n catColorScale.push([0, color]);\n catColorScale.push([1, color]);\n } else {\n // Multiple types: create bands for each index\n // Index i maps to normalized value i / (numTypes - 1)\n types.forEach((type, idx) => {\n const color = categoryColors[type] || emptyWellColor;\n const normalizedPos = idx / (numTypes - 1);\n // Create a small band around each position\n const bandHalf = 0.5 / (numTypes - 1);\n const start = Math.max(0, normalizedPos - bandHalf);\n const end = Math.min(1, normalizedPos + bandHalf - PLATEMAP_CONSTANTS.COLOR_SCALE_EPSILON);\n catColorScale.push([start, color]);\n catColorScale.push([end, color]);\n });\n }\n\n // cmax should be numTypes - 1 to match the index range\n return { categoricalGrid: catGrid, categoricalColorScale: catColorScale, uniqueTypes: types, catMax: numTypes - 1 };\n }, [visualizationMode, categoriesGrid, categoryColors, emptyWellColor]);\n\n // Build Plotly shapes for highlighted regions\n const regionShapes = useMemo(() => {\n if (!regions || regions.length === 0) {\n return [];\n }\n\n const shapes: Array<Partial<Plotly.Shape>> = [];\n\n for (const region of regions) {\n const bounds = parseRegionWells(region.wells, rowLabels, colLabels);\n if (!bounds) continue;\n\n // Plotly heatmap uses the actual label values for positioning.\n // colLabels are 1-indexed (1, 2, 3, ...), so we need to convert from 0-indexed bounds.\n // Each cell is centered on its label, so we offset by inset to cover the cell.\n // For columns: bounds.minCol=0 means column label 1, so x0 = 1 - inset\n // For rows: bounds.minRow=0 means row index 0, which is correct for y-axis\n //\n // Use 0.49 inset to place boundary just inside cell edge,\n // avoiding line doubling when adjacent regions share a border\n const inset = 0.49;\n const x0 = (bounds.minCol + 1) - inset;\n const x1 = (bounds.maxCol + 1) + inset;\n const y0 = bounds.minRow - inset;\n const y1 = bounds.maxRow + inset;\n\n shapes.push({\n type: \"rect\",\n xref: \"x\",\n yref: \"y\",\n x0,\n x1,\n y0,\n y1,\n line: {\n color: region.borderColor || COLORS.textDark,\n width: region.borderWidth ?? 2,\n },\n fillcolor: region.fillColor || \"transparent\",\n layer: \"above\",\n });\n }\n\n return shapes;\n }, [regions, rowLabels, colLabels]);\n\n useEffect(() => {\n const currentRef = plotRef.current;\n if (!currentRef) return;\n\n // Determine which grid and colorscale to use based on mode\n const isCategorical = visualizationMode === \"categorical\";\n const plotZ = isCategorical && categoricalGrid ? categoricalGrid : displayGrid;\n const plotColorScale = isCategorical && categoricalColorScale ? categoricalColorScale : effectiveColorScale;\n const plotZMin = isCategorical ? 0 : effectiveZMin;\n const plotZMax = isCategorical ? (catMax || 1) : zMax;\n const plotShowScale = isCategorical ? false : showColorBar;\n\n // Flatten 2D grid data into arrays for scatter plot\n const { xData, yData, colorData, textData } = flattenGridData(\n plotZ,\n rowLabels,\n hoverText,\n rows,\n columns,\n plotZMin\n );\n\n // Create scatter plot with markers\n const plotData: Plotly.Data[] = [\n {\n x: xData,\n y: yData,\n mode: \"markers\" as const,\n type: \"scatter\" as const,\n marker: {\n symbol: markerShape,\n size: markerSize,\n color: colorData,\n colorscale: plotColorScale,\n cmin: plotZMin,\n cmax: plotZMax,\n showscale: plotShowScale,\n colorbar: buildColorbarConfig(\n legendConfig?.position ?? \"right\",\n valueUnit,\n legendConfig?.title\n ),\n line: {\n color: theme.gridColor,\n width: 1,\n },\n },\n hoverinfo: \"none\" as const,\n text: textData,\n },\n ];\n\n const legendPosition = legendConfig?.position ?? \"right\";\n\n const layout = {\n autosize: false, // Prevent auto-sizing to maintain consistent layout\n title: title\n ? {\n text: title,\n font: {\n family: \"Inter, sans-serif\",\n size: 20,\n color: theme.textSecondary,\n },\n x: calculateTitleX(legendPosition),\n xanchor: \"center\" as const,\n y: 0.98,\n yanchor: \"top\" as const,\n }\n : undefined,\n width,\n height,\n margin: buildPlotMargins(legendPosition, !!title, !!yTitle),\n xaxis: {\n title: {\n text: xTitle || \"\",\n font: {\n size: 16,\n color: theme.textSecondary,\n family: \"Inter, sans-serif\",\n },\n standoff: 15,\n },\n side: \"top\" as const,\n fixedrange: true,\n dtick: 1,\n range: [0.5, columns + 0.5], // Explicit range to prevent auto-padding\n automargin: false, // Prevent auto margin adjustment\n tickmode: \"array\" as const,\n tickvals: Array.from({ length: columns }, (_, i) => i + 1),\n ticktext: colLabels.map(String),\n tickangle: 0, // Keep labels horizontal\n tickfont: { size: columns > 24 ? 8 : PLATEMAP_CONSTANTS.FONT_SIZE_LARGE }, // Smaller font for high-density plates\n // Adjust domain based on legend position to prevent colorbar overlap\n domain: calculateAxisDomain(legendPosition),\n },\n yaxis: {\n title: {\n text: yTitle || \"\",\n font: {\n size: 16,\n color: theme.textSecondary,\n family: \"Inter, sans-serif\",\n },\n standoff: 15,\n },\n fixedrange: true,\n dtick: 1,\n range: [rows + PLATEMAP_CONSTANTS.LABEL_CENTER_OFFSET, PLATEMAP_CONSTANTS.LABEL_CENTER_OFFSET], // Reversed range: high to low puts row A at top\n automargin: false, // Prevent auto margin adjustment\n tickmode: \"array\" as const,\n tickvals: Array.from({ length: rows }, (_, i) => i),\n ticktext: rowLabels.map(String),\n tickfont: { size: rows > 16 ? 8 : PLATEMAP_CONSTANTS.FONT_SIZE_LARGE }, // Smaller font for high-density plates\n },\n paper_bgcolor: theme.paperBg,\n plot_bgcolor: theme.plotBg,\n font: {\n family: \"Inter, sans-serif\",\n color: theme.textSecondary,\n },\n shapes: regionShapes,\n };\n\n const config = {\n responsive: true,\n displayModeBar: false,\n displaylogo: false,\n };\n\n Plotly.newPlot(currentRef, plotData, layout, config);\n bindTooltip(currentRef);\n\n // Always attach click handler - check onWellClickRef.current inside callback\n // This ensures handler is registered even if onWellClick is provided after initial render\n (currentRef as unknown as Plotly.PlotlyHTMLElement).on(\"plotly_click\", (eventData: Plotly.PlotMouseEvent) => {\n if (!onWellClickRef.current) return;\n const point = eventData.points[0];\n if (point) {\n // Cast labels to handle union type\n const rowLabelsArr = rowLabels as (string | number)[];\n const colLabelsArr = colLabels as (string | number)[];\n const rowIdx = rowLabelsArr.indexOf(point.y as string | number);\n const colIdx = colLabelsArr.indexOf(point.x as string | number);\n if (rowIdx >= 0 && colIdx >= 0) {\n const wellId = `${rowLabelsArr[rowIdx]}${colLabelsArr[colIdx]}`;\n const wellIdUpper = String(wellId).toUpperCase();\n // Get all values and tooltipData for this well\n const allValues = allValuesMap.get(wellIdUpper);\n const tooltipData = tooltipDataMap.get(wellIdUpper);\n const wellData: WellData = {\n wellId,\n values: allValues,\n tooltipData,\n };\n onWellClickRef.current?.(wellData);\n }\n }\n });\n\n return () => {\n if (currentRef) {\n Plotly.purge(currentRef);\n }\n };\n }, [\n displayGrid,\n colLabels,\n rowLabels,\n effectiveColorScale,\n showColorBar,\n effectiveZMin,\n zMax,\n valueUnit,\n title,\n xTitle,\n yTitle,\n width,\n height,\n hoverText,\n precision,\n tooltipDataMap,\n allValuesMap,\n grid,\n visualizationMode,\n categoricalGrid,\n categoricalColorScale,\n uniqueTypes.length,\n catMax,\n regionShapes,\n rows,\n columns,\n legendConfig,\n markerShape,\n markerSize,\n theme,\n bindTooltip,\n ]);\n\n // Render layer selector tabs\n const renderLayerSelector = () => {\n if (!effectiveLayers || effectiveLayers.length <= 1) {\n return null;\n }\n\n return (\n <div className=\"platemap-layer-selector\">\n {effectiveLayers.map((layer) => {\n const isActive = activeLayer?.id === layer.id;\n return (\n <Button\n key={layer.id}\n variant={isActive ? \"default\" : \"outline\"}\n size=\"sm\"\n onClick={() => {\n setActiveLayerId(layer.id);\n onLayerChange?.(layer.id);\n }}\n >\n {layer.name}\n </Button>\n );\n })}\n </div>\n );\n };\n\n // Legend configuration with defaults\n const legendPosition = legendConfig?.position ?? \"right\";\n const legendFontSize = legendConfig?.fontSize ?? 12;\n const legendItemSpacing = legendConfig?.itemSpacing ?? 4;\n const legendSwatchSize = legendConfig?.swatchSize ?? 16;\n const legendTitle = legendConfig?.title;\n\n // Fixed width for categorical legend to prevent layout shift\n const legendWidth = 120;\n\n // Determine if legend is horizontal (top/bottom) or vertical (left/right)\n const isHorizontalLegend = legendPosition === \"top\" || legendPosition === \"bottom\";\n\n // Render legend (categorical types and/or regions)\n const renderLegend = () => {\n const hasCategoricalItems = visualizationMode === \"categorical\" && uniqueTypes.length > 0;\n const hasRegions = regions && regions.length > 0;\n\n if (!showLegend || (!hasCategoricalItems && !hasRegions)) {\n // Return empty placeholder to maintain consistent width (only for vertical legends)\n if (!isHorizontalLegend) {\n return <div className=\"platemap-legend-placeholder\" style={{ width: legendWidth }} />;\n }\n return null;\n }\n\n // Build legend class names\n const legendClassNames = [\"platemap-legend\"];\n if (isHorizontalLegend) {\n legendClassNames.push(\"platemap-legend--horizontal\");\n } else if (legendPosition === \"left\") {\n legendClassNames.push(\"platemap-legend--left\");\n } else if (legendPosition === \"right\") {\n legendClassNames.push(\"platemap-legend--right\");\n }\n\n // Dynamic styles that depend on props\n const legendStyle: React.CSSProperties = {\n gap: `${legendItemSpacing}px`,\n width: isHorizontalLegend ? undefined : legendWidth,\n };\n\n return (\n <div className={legendClassNames.join(\" \")} style={legendStyle}>\n {legendTitle && (\n <div\n className={`platemap-legend__title${isHorizontalLegend ? \" platemap-legend__title--horizontal\" : \"\"}`}\n style={{ fontSize: `${legendFontSize}px` }}\n >\n {legendTitle}\n </div>\n )}\n {/* Categorical type items */}\n {hasCategoricalItems &&\n uniqueTypes.map((type) => (\n <div key={type} className=\"platemap-legend__item\">\n <div\n className=\"platemap-legend__swatch\"\n style={{\n width: `${legendSwatchSize}px`,\n height: `${legendSwatchSize}px`,\n backgroundColor: categoryColors[type] || emptyWellColor,\n }}\n />\n <span\n className=\"platemap-legend__label platemap-legend__label--capitalize\"\n style={{ fontSize: `${legendFontSize}px` }}\n >\n {type}\n </span>\n </div>\n ))}\n {/* Region items */}\n {hasRegions &&\n regions.map((region) => (\n <div key={region.id} className=\"platemap-legend__item\">\n <div\n className=\"platemap-legend__swatch platemap-legend__swatch--region\"\n style={{\n width: `${legendSwatchSize}px`,\n height: `${legendSwatchSize}px`,\n backgroundColor: region.fillColor || \"transparent\",\n border: `${region.borderWidth || 2}px solid ${region.borderColor || COLORS.regionBorder}`,\n }}\n />\n <span\n className=\"platemap-legend__label\"\n style={{ fontSize: `${legendFontSize}px` }}\n >\n {region.name}\n </span>\n </div>\n ))}\n </div>\n );\n };\n\n // Build the plot content based on legend position\n const plotContent = (\n <div className=\"relative\">\n <div ref={plotRef} className=\"platemap-plot\" style={{ width, height }} />\n {tooltipElement}\n </div>\n );\n const legendContent = renderLegend();\n\n const renderPlotWithLegend = () => {\n switch (legendPosition) {\n case \"left\":\n return (\n <div className=\"platemap-plot-wrapper platemap-plot-wrapper--vertical\">\n {legendContent}\n {plotContent}\n </div>\n );\n case \"top\":\n return (\n <div className=\"platemap-plot-wrapper platemap-plot-wrapper--horizontal\">\n {legendContent}\n {plotContent}\n </div>\n );\n case \"bottom\":\n return (\n <div className=\"platemap-plot-wrapper platemap-plot-wrapper--horizontal\">\n {plotContent}\n {legendContent}\n </div>\n );\n case \"right\":\n default:\n return (\n <div className=\"platemap-plot-wrapper platemap-plot-wrapper--vertical\">\n {plotContent}\n {legendContent}\n </div>\n );\n }\n };\n\n return (\n <div className=\"platemap-container\" style={{ width: isHorizontalLegend ? undefined : width }}>\n {renderLayerSelector()}\n {renderPlotWithLegend()}\n </div>\n );\n};\n\nexport { PlateMap };"],"names":["PlateMap","data","layerConfigs","initialLayerId","onLayerChange","plateFormat","PLATE_FORMAT_96","customRows","customColumns","propVisualizationMode","customCategoryColors","regions","title","xTitle","yTitle","customXLabels","customYLabels","propColorScale","DEFAULT_COLOR_SCALE","propValueMin","propValueMax","emptyWellColor","COLORS","showColorBar","showLegend","legendConfig","width","height","precision","markerShape","onWellClick","plotRef","useRef","theme","usePlotlyTheme","onWellClickRef","activeLayerId","setActiveLayerId","useState","rows","columns","PLATE_FORMAT_CUSTOM","config","PLATE_CONFIGS","markerSize","useMemo","calculateMarkerSize","bindTooltip","tooltipElement","useChartTooltip","effectiveLayers","wellDataArray","hasMultiValueWells","extractLayers","activeLayer","l","visualizationMode","colorScale","valueMin","valueMax","valueUnit","categoryColors","DEFAULT_CATEGORY_COLORS","activeLayerId_","grid","categoriesGrid","allValuesMap","tooltipDataMap","resultGrid","resultCategories","resultAllValues","resultTooltipData","result","wellDataToGrid","PLATEMAP_CONSTANTS","rowLabels","generateRowLabels","colLabels","generateColumnLabels","range","calculateValueRange","zMin","zMax","hasNullValues","row","sentinelValue","displayGrid","val","effectiveColorScale","arrayColorScale","namedScale","NAMED_COLORSCALES","totalRange","dataStartRatio","extendedScale","pos","color","newPos","effectiveZMin","layerConfigMap","map","layer","hoverText","rowIdx","colIdx","wellId","wellIdUpper","buildWellHoverText","categoricalGrid","categoricalColorScale","uniqueTypes","catMax","typesSet","hasNullCategory","category","types","typeToIndex","type","idx","catGrid","numTypes","catColorScale","normalizedPos","bandHalf","start","end","regionShapes","shapes","region","bounds","parseRegionWells","inset","x0","x1","y0","y1","useEffect","currentRef","isCategorical","plotZ","plotColorScale","plotZMin","plotZMax","plotShowScale","xData","yData","colorData","textData","flattenGridData","plotData","buildColorbarConfig","legendPosition","layout","calculateTitleX","buildPlotMargins","_","i","calculateAxisDomain","Plotly","eventData","point","rowLabelsArr","colLabelsArr","allValues","tooltipData","wellData","renderLayerSelector","isActive","jsx","Button","legendFontSize","legendItemSpacing","legendSwatchSize","legendTitle","legendWidth","isHorizontalLegend","renderLegend","hasCategoricalItems","hasRegions","legendClassNames","legendStyle","jsxs","plotContent","legendContent","renderPlotWithLegend"],"mappings":"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"}
1
+ {"version":3,"file":"PlateMap.cjs","sources":["../../../../src/components/charts/PlateMap/PlateMap.tsx"],"sourcesContent":["import React, { useEffect, useMemo, useRef, useState } from \"react\";\n\nimport \"./PlateMap.scss\";\nimport { useChartTooltip } from \"../ChartTooltip\";\nimport { getLoadedPlotly, loadPlotly } from \"../plotly-loader\";\n\nimport {\n PLATE_CONFIGS,\n DEFAULT_COLOR_SCALE,\n COLORS,\n DEFAULT_CATEGORY_COLORS,\n PLATEMAP_CONSTANTS,\n NAMED_COLORSCALES,\n} from \"./constants\";\nimport {\n PLATE_FORMAT_96,\n PLATE_FORMAT_CUSTOM,\n} from \"./types\";\nimport {\n generateRowLabels,\n generateColumnLabels,\n wellDataToGrid,\n calculateValueRange,\n hasMultiValueWells,\n extractLayers,\n parseRegionWells,\n buildWellHoverText,\n buildColorbarConfig,\n buildPlotMargins,\n calculateTitleX,\n calculateAxisDomain,\n flattenGridData,\n calculateMarkerSize,\n} from \"./utils\";\n\nimport type {\n PlateMapProps,\n LayerConfig,\n WellData,\n} from \"./types\";\nimport type Plotly from \"plotly.js-dist\";\n\n// Re-export types and constants for external consumers\nexport * from \"./types\";\nexport { DEFAULT_CATEGORY_COLORS } from \"./constants\";\n\nimport { Button } from \"@/components/ui/button\";\nimport { CHART_FONT_FAMILY, usePlotlyTheme } from \"@/hooks/use-plotly-theme\";\n\n/**\n * PlateMap component for visualizing well plate data as a heatmap or categorical display.\n *\n * **Supported Plate Formats:**\n * - 96-well (8 rows × 12 columns, wells A1-H12)\n * - 384-well (16 rows × 24 columns, wells A1-P24)\n * - 1536-well (32 rows × 48 columns, wells A1-AF48)\n * - Custom dimensions with user-specified rows/columns\n *\n * **Visualization Modes:**\n * - `\"heatmap\"`: Continuous color gradient for quantitative values\n * - `\"categorical\"`: Discrete colors for well types (sample, control, empty)\n *\n * **Features:**\n * - Multiple data layers with independent visualization settings\n * - Control region highlighting with borders and fill colors\n * - Configurable color scales, tooltips, and click interactions\n * - Support for WellData arrays with multi-layer visualization\n *\n * **Data Format:**\n * - **WellData array**: `[{ wellId: \"A1\", values: { RFU: 100 }, tooltipData: {...} }, ...]`\n *\n */\nconst PlateMap: React.FC<PlateMapProps> = ({\n data,\n layerConfigs,\n initialLayerId,\n onLayerChange,\n plateFormat = PLATE_FORMAT_96,\n rows: customRows,\n columns: customColumns,\n visualizationMode: propVisualizationMode = \"heatmap\",\n categoryColors: customCategoryColors,\n regions,\n title,\n xTitle,\n yTitle,\n xLabels: customXLabels,\n yLabels: customYLabels,\n colorScale: propColorScale = DEFAULT_COLOR_SCALE,\n valueMin: propValueMin,\n valueMax: propValueMax,\n emptyWellColor = COLORS.emptyWell,\n showColorBar = true,\n showLegend = true,\n legendConfig,\n width = 800,\n height = 500,\n precision = 0,\n markerShape = \"circle\",\n onWellClick,\n}) => {\n const plotRef = useRef<HTMLDivElement>(null);\n const theme = usePlotlyTheme();\n const onWellClickRef = useRef(onWellClick);\n onWellClickRef.current = onWellClick;\n\n // Internal state for layer toggling, initialized with initialLayerId\n const [activeLayerId, setActiveLayerId] = useState<string | undefined>(initialLayerId);\n\n // Determine plate dimensions\n let rows: number;\n let columns: number;\n\n if (plateFormat === PLATE_FORMAT_CUSTOM) {\n rows = customRows ?? 8;\n columns = customColumns ?? 12;\n } else {\n const config = PLATE_CONFIGS[plateFormat];\n rows = config.rows;\n columns = config.columns;\n }\n\n // Diameter (px) of each well marker; also drives the hover hit radius so the\n // whole circle is hoverable instead of just a small zone around its center\n const markerSize = useMemo(\n () => calculateMarkerSize(width, height, rows, columns, markerShape, !!title, !!yTitle),\n [width, height, rows, columns, markerShape, title, yTitle],\n );\n const { bindTooltip, tooltipElement } = useChartTooltip({\n hoverDistance: Math.ceil(markerSize / 2),\n });\n\n // Auto-generate layers from multi-value WellData\n const effectiveLayers = useMemo((): LayerConfig[] | null => {\n // Check if data contains multi-value wells\n if (Array.isArray(data) && data.length > 0 && \"wellId\" in (data[0] as WellData)) {\n const wellDataArray = data as WellData[];\n if (hasMultiValueWells(wellDataArray)) {\n return extractLayers(wellDataArray, layerConfigs);\n }\n }\n\n return null;\n }, [data, layerConfigs]);\n\n // Handle layer toggling - determine active layer\n const activeLayer = useMemo((): LayerConfig | null => {\n if (!effectiveLayers || effectiveLayers.length === 0) return null;\n if (activeLayerId) {\n return effectiveLayers.find((l) => l.id === activeLayerId) ?? effectiveLayers[0];\n }\n return effectiveLayers[0];\n }, [effectiveLayers, activeLayerId]);\n\n // Get effective props from active layer or default props\n // Data is always the same - we just change which layer is being visualized\n const visualizationMode = activeLayer?.visualizationMode ?? propVisualizationMode;\n const colorScale = activeLayer?.colorScale ?? propColorScale;\n const valueMin = activeLayer?.valueMin ?? propValueMin;\n const valueMax = activeLayer?.valueMax ?? propValueMax;\n // Derive valueUnit from layer config\n const valueUnit = activeLayer?.valueUnit ? ` ${activeLayer.valueUnit}` : \"\";\n\n // Merge custom category colors with defaults, including layer-specific colors\n const categoryColors = useMemo(\n () => ({ ...DEFAULT_CATEGORY_COLORS, ...customCategoryColors, ...activeLayer?.categoryColors }),\n [customCategoryColors, activeLayer?.categoryColors]\n );\n\n // Convert data to grid format - memoize to prevent re-render issues\n // Use activeLayer.id to extract the appropriate value from multi-value wells\n const activeLayerId_ = activeLayer?.id;\n const { grid, categoriesGrid, allValuesMap, tooltipDataMap } = useMemo(() => {\n let resultGrid: (number | null)[][];\n let resultCategories: (string | null)[][] = Array.from({ length: rows }, () =>\n Array(columns).fill(null)\n );\n let resultAllValues = new Map<string, Record<string, string | number | null>>();\n let resultTooltipData = new Map<string, Record<string, unknown>>();\n\n if (Array.isArray(data) && data.length > 0) {\n // WellData array format - pass activeLayerId to extract the right layer\n const result = wellDataToGrid(data, rows, columns, activeLayerId_);\n resultGrid = result.grid;\n resultCategories = result.categories;\n resultAllValues = result.allValues;\n resultTooltipData = result.tooltipData;\n } else {\n // Generate random data for demonstration when no data provided\n resultGrid = Array.from({ length: rows }, () =>\n Array.from({ length: columns }, () => Math.random() * PLATEMAP_CONSTANTS.MAX_RANDOM_VALUE)\n );\n }\n\n return { grid: resultGrid, categoriesGrid: resultCategories, allValuesMap: resultAllValues, tooltipDataMap: resultTooltipData };\n }, [data, rows, columns, activeLayerId_]);\n\n // Generate labels - use custom labels if provided, otherwise auto-generate.\n // Memoized so a tooltip-driven re-render doesn't change their identity and\n // needlessly rebuild the plot (which would clear the open tooltip).\n const rowLabels = useMemo(\n () => customYLabels ?? generateRowLabels(rows),\n [customYLabels, rows],\n );\n const colLabels = useMemo(\n () => customXLabels ?? generateColumnLabels(columns),\n [customXLabels, columns],\n );\n\n // Calculate value range if not provided\n const range = calculateValueRange(grid);\n const zMin = valueMin ?? range.min;\n const zMax = valueMax ?? range.max;\n\n // Check if grid has any null values\n const hasNullValues = grid.some(row => row.includes(null));\n\n // Create sentinel value for empty wells (below the data range)\n // This allows us to show emptyWellColor for null cells\n const sentinelValue = zMin - (zMax - zMin) * PLATEMAP_CONSTANTS.SENTINEL_RATIO - 1;\n\n // Replace null values with sentinel for Plotly rendering\n const displayGrid = useMemo(\n () =>\n hasNullValues\n ? grid.map((row) => row.map((val) => (val === null ? sentinelValue : val)))\n : grid,\n [hasNullValues, grid, sentinelValue],\n );\n\n // Extend colorscale to include emptyWellColor at the bottom for null values\n const effectiveColorScale = useMemo(() => {\n if (!hasNullValues) return colorScale;\n\n // Convert colorScale to array format if it's a named string scale\n let arrayColorScale: Array<[number, string]>;\n if (typeof colorScale === \"string\") {\n // Look up the named scale in our mapping\n const namedScale = NAMED_COLORSCALES[colorScale];\n if (namedScale) {\n arrayColorScale = namedScale;\n } else {\n // Unknown named scale - can't extend it, return as-is\n // This is a fallback for custom/unknown Plotly scale names\n return colorScale;\n }\n } else {\n arrayColorScale = colorScale;\n }\n\n // For array colorscales, prepend emptyWellColor at position 0\n // and shift all other positions proportionally\n const totalRange = zMax - sentinelValue;\n const dataStartRatio = (zMin - sentinelValue) / totalRange;\n\n // Create new colorscale with emptyWellColor at the bottom\n const extendedScale: Array<[number, string]> = [\n [0, emptyWellColor],\n [dataStartRatio * PLATEMAP_CONSTANTS.COLOR_SCALE_THRESHOLD, emptyWellColor], // Small band for empty wells\n ];\n\n // Remap original colorscale positions to the remaining range\n for (const [pos, color] of arrayColorScale) {\n const newPos = dataStartRatio + pos * (1 - dataStartRatio);\n extendedScale.push([newPos, color]);\n }\n\n return extendedScale;\n }, [colorScale, hasNullValues, zMin, zMax, sentinelValue, emptyWellColor]);\n\n // Effective zMin includes sentinel value if we have nulls\n const effectiveZMin = hasNullValues ? sentinelValue : zMin;\n\n // Create a lookup map for layer configs to get valueUnit for each layer\n const layerConfigMap = useMemo(() => {\n const map = new Map<string, LayerConfig>();\n if (effectiveLayers) {\n for (const layer of effectiveLayers) {\n map.set(layer.id, layer);\n }\n }\n return map;\n }, [effectiveLayers]);\n\n // Build custom hover text matrix - shows ALL values regardless of active layer.\n // Memoized so its identity is stable across tooltip-driven re-renders.\n const hoverText = useMemo<string[][]>(\n () =>\n grid.map((row, rowIdx) =>\n row.map((val, colIdx) => {\n const wellId = `${rowLabels[rowIdx]}${colLabels[colIdx]}`;\n const wellIdUpper = String(wellId).toUpperCase();\n return buildWellHoverText({\n wellId,\n value: val,\n allValues: allValuesMap.get(wellIdUpper),\n tooltipExtra: tooltipDataMap.get(wellIdUpper),\n activeLayerId: activeLayer?.id,\n layerConfigMap,\n precision,\n valueUnit,\n });\n })\n ),\n [grid, rowLabels, colLabels, allValuesMap, tooltipDataMap, activeLayer?.id, layerConfigMap, precision, valueUnit],\n );\n\n // Build categorical data for categorical mode\n const { categoricalGrid, categoricalColorScale, uniqueTypes, catMax } = useMemo(() => {\n if (visualizationMode !== \"categorical\") {\n return { categoricalGrid: null, categoricalColorScale: null, uniqueTypes: [], catMax: 0 };\n }\n\n // Collect unique categories from the categoriesGrid\n const typesSet = new Set<string>();\n let hasNullCategory = false;\n for (const row of categoriesGrid) {\n for (const category of row) {\n if (category) {\n typesSet.add(category);\n } else {\n hasNullCategory = true;\n }\n }\n }\n // Only include \"empty\" if there are actual null wells\n if (hasNullCategory) {\n typesSet.add(\"empty\");\n }\n const types = [...typesSet].sort();\n\n // Create numeric grid where each category maps to an index\n const typeToIndex = new Map<string, number>();\n types.forEach((type, idx) => typeToIndex.set(type, idx));\n\n const catGrid: number[][] = categoriesGrid.map((row) =>\n row.map((category) => {\n if (category === null) {\n return typeToIndex.get(\"empty\") ?? 0;\n }\n return typeToIndex.get(category) ?? typeToIndex.get(\"empty\") ?? 0;\n })\n );\n\n // Build discrete colorscale for categories\n // The grid contains integer indices 0, 1, 2, ... (numTypes - 1)\n // With cmin=0 and cmax=numTypes-1, Plotly maps:\n // index 0 -> normalized 0.0\n // index (numTypes-1) -> normalized 1.0\n // We need each index to map to a distinct color band\n const numTypes = types.length;\n const catColorScale: Array<[number, string]> = [];\n\n if (numTypes === 1) {\n // Single type: entire range is one color\n const color = categoryColors[types[0]] || emptyWellColor;\n catColorScale.push([0, color]);\n catColorScale.push([1, color]);\n } else {\n // Multiple types: create bands for each index\n // Index i maps to normalized value i / (numTypes - 1)\n types.forEach((type, idx) => {\n const color = categoryColors[type] || emptyWellColor;\n const normalizedPos = idx / (numTypes - 1);\n // Create a small band around each position\n const bandHalf = 0.5 / (numTypes - 1);\n const start = Math.max(0, normalizedPos - bandHalf);\n const end = Math.min(1, normalizedPos + bandHalf - PLATEMAP_CONSTANTS.COLOR_SCALE_EPSILON);\n catColorScale.push([start, color]);\n catColorScale.push([end, color]);\n });\n }\n\n // cmax should be numTypes - 1 to match the index range\n return { categoricalGrid: catGrid, categoricalColorScale: catColorScale, uniqueTypes: types, catMax: numTypes - 1 };\n }, [visualizationMode, categoriesGrid, categoryColors, emptyWellColor]);\n\n // Build Plotly shapes for highlighted regions\n const regionShapes = useMemo(() => {\n if (!regions || regions.length === 0) {\n return [];\n }\n\n const shapes: Array<Partial<Plotly.Shape>> = [];\n\n for (const region of regions) {\n const bounds = parseRegionWells(region.wells, rowLabels, colLabels);\n if (!bounds) continue;\n\n // Plotly heatmap uses the actual label values for positioning.\n // colLabels are 1-indexed (1, 2, 3, ...), so we need to convert from 0-indexed bounds.\n // Each cell is centered on its label, so we offset by inset to cover the cell.\n // For columns: bounds.minCol=0 means column label 1, so x0 = 1 - inset\n // For rows: bounds.minRow=0 means row index 0, which is correct for y-axis\n //\n // Use 0.49 inset to place boundary just inside cell edge,\n // avoiding line doubling when adjacent regions share a border\n const inset = 0.49;\n const x0 = (bounds.minCol + 1) - inset;\n const x1 = (bounds.maxCol + 1) + inset;\n const y0 = bounds.minRow - inset;\n const y1 = bounds.maxRow + inset;\n\n shapes.push({\n type: \"rect\",\n xref: \"x\",\n yref: \"y\",\n x0,\n x1,\n y0,\n y1,\n line: {\n color: region.borderColor || COLORS.textDark,\n width: region.borderWidth ?? 2,\n },\n fillcolor: region.fillColor || \"transparent\",\n layer: \"above\",\n });\n }\n\n return shapes;\n }, [regions, rowLabels, colLabels]);\n\n useEffect(() => {\n if (!plotRef.current) return;\n\n // Determine which grid and colorscale to use based on mode\n const isCategorical = visualizationMode === \"categorical\";\n const plotZ = isCategorical && categoricalGrid ? categoricalGrid : displayGrid;\n const plotColorScale = isCategorical && categoricalColorScale ? categoricalColorScale : effectiveColorScale;\n const plotZMin = isCategorical ? 0 : effectiveZMin;\n const plotZMax = isCategorical ? (catMax || 1) : zMax;\n const plotShowScale = isCategorical ? false : showColorBar;\n\n // Flatten 2D grid data into arrays for scatter plot\n const { xData, yData, colorData, textData } = flattenGridData(\n plotZ,\n rowLabels,\n hoverText,\n rows,\n columns,\n plotZMin\n );\n\n // Create scatter plot with markers\n const plotData: Plotly.Data[] = [\n {\n x: xData,\n y: yData,\n mode: \"markers\" as const,\n type: \"scatter\" as const,\n marker: {\n symbol: markerShape,\n size: markerSize,\n color: colorData,\n colorscale: plotColorScale,\n cmin: plotZMin,\n cmax: plotZMax,\n showscale: plotShowScale,\n colorbar: buildColorbarConfig(\n legendConfig?.position ?? \"right\",\n valueUnit,\n legendConfig?.title\n ),\n line: {\n color: theme.gridColor,\n width: 1,\n },\n },\n hoverinfo: \"none\" as const,\n text: textData,\n },\n ];\n\n const legendPosition = legendConfig?.position ?? \"right\";\n\n const layout = {\n autosize: false, // Prevent auto-sizing to maintain consistent layout\n title: title\n ? {\n text: title,\n font: {\n family: CHART_FONT_FAMILY,\n size: 20,\n color: theme.textSecondary,\n },\n x: calculateTitleX(legendPosition),\n xanchor: \"center\" as const,\n y: 0.98,\n yanchor: \"top\" as const,\n }\n : undefined,\n width,\n height,\n margin: buildPlotMargins(legendPosition, !!title, !!yTitle),\n xaxis: {\n title: {\n text: xTitle || \"\",\n font: {\n size: 16,\n color: theme.textSecondary,\n family: CHART_FONT_FAMILY,\n },\n standoff: 15,\n },\n side: \"top\" as const,\n fixedrange: true,\n dtick: 1,\n range: [0.5, columns + 0.5], // Explicit range to prevent auto-padding\n automargin: false, // Prevent auto margin adjustment\n tickmode: \"array\" as const,\n tickvals: Array.from({ length: columns }, (_, i) => i + 1),\n ticktext: colLabels.map(String),\n tickangle: 0, // Keep labels horizontal\n tickfont: { size: columns > 24 ? 8 : PLATEMAP_CONSTANTS.FONT_SIZE_LARGE }, // Smaller font for high-density plates\n // Adjust domain based on legend position to prevent colorbar overlap\n domain: calculateAxisDomain(legendPosition),\n },\n yaxis: {\n title: {\n text: yTitle || \"\",\n font: {\n size: 16,\n color: theme.textSecondary,\n family: CHART_FONT_FAMILY,\n },\n standoff: 15,\n },\n fixedrange: true,\n dtick: 1,\n range: [rows + PLATEMAP_CONSTANTS.LABEL_CENTER_OFFSET, PLATEMAP_CONSTANTS.LABEL_CENTER_OFFSET], // Reversed range: high to low puts row A at top\n automargin: false, // Prevent auto margin adjustment\n tickmode: \"array\" as const,\n tickvals: Array.from({ length: rows }, (_, i) => i),\n ticktext: rowLabels.map(String),\n tickfont: { size: rows > 16 ? 8 : PLATEMAP_CONSTANTS.FONT_SIZE_LARGE }, // Smaller font for high-density plates\n },\n paper_bgcolor: theme.paperBg,\n plot_bgcolor: theme.plotBg,\n font: {\n family: CHART_FONT_FAMILY,\n color: theme.textSecondary,\n },\n shapes: regionShapes,\n };\n\n const config = {\n responsive: true,\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 const currentRef = plotRef.current;\n plotly.newPlot(currentRef, plotData, layout, config);\n bindTooltip(currentRef);\n\n // Always attach click handler - check onWellClickRef.current inside callback\n // This ensures handler is registered even if onWellClick is provided after initial render\n (currentRef as unknown as Plotly.PlotlyHTMLElement).on(\"plotly_click\", (eventData: Plotly.PlotMouseEvent) => {\n if (!onWellClickRef.current) return;\n const point = eventData.points[0];\n if (point) {\n // Cast labels to handle union type\n const rowLabelsArr = rowLabels as (string | number)[];\n const colLabelsArr = colLabels as (string | number)[];\n const rowIdx = rowLabelsArr.indexOf(point.y as string | number);\n const colIdx = colLabelsArr.indexOf(point.x as string | number);\n if (rowIdx >= 0 && colIdx >= 0) {\n const wellId = `${rowLabelsArr[rowIdx]}${colLabelsArr[colIdx]}`;\n const wellIdUpper = String(wellId).toUpperCase();\n // Get all values and tooltipData for this well\n const allValues = allValuesMap.get(wellIdUpper);\n const tooltipData = tooltipDataMap.get(wellIdUpper);\n const wellData: WellData = {\n wellId,\n values: allValues,\n tooltipData,\n };\n onWellClickRef.current?.(wellData);\n }\n }\n });\n\n plotElement = currentRef;\n });\n\n return () => {\n cancelled = true;\n if (plotElement) {\n getLoadedPlotly().purge(plotElement);\n }\n };\n }, [\n displayGrid,\n colLabels,\n rowLabels,\n effectiveColorScale,\n showColorBar,\n effectiveZMin,\n zMax,\n valueUnit,\n title,\n xTitle,\n yTitle,\n width,\n height,\n hoverText,\n precision,\n tooltipDataMap,\n allValuesMap,\n grid,\n visualizationMode,\n categoricalGrid,\n categoricalColorScale,\n uniqueTypes.length,\n catMax,\n regionShapes,\n rows,\n columns,\n legendConfig,\n markerShape,\n markerSize,\n theme,\n bindTooltip,\n ]);\n\n // Render layer selector tabs\n const renderLayerSelector = () => {\n if (!effectiveLayers || effectiveLayers.length <= 1) {\n return null;\n }\n\n return (\n <div className=\"platemap-layer-selector\">\n {effectiveLayers.map((layer) => {\n const isActive = activeLayer?.id === layer.id;\n return (\n <Button\n key={layer.id}\n variant={isActive ? \"default\" : \"outline\"}\n size=\"sm\"\n onClick={() => {\n setActiveLayerId(layer.id);\n onLayerChange?.(layer.id);\n }}\n >\n {layer.name}\n </Button>\n );\n })}\n </div>\n );\n };\n\n // Legend configuration with defaults\n const legendPosition = legendConfig?.position ?? \"right\";\n const legendFontSize = legendConfig?.fontSize ?? 12;\n const legendItemSpacing = legendConfig?.itemSpacing ?? 4;\n const legendSwatchSize = legendConfig?.swatchSize ?? 16;\n const legendTitle = legendConfig?.title;\n\n // Fixed width for categorical legend to prevent layout shift\n const legendWidth = 120;\n\n // Determine if legend is horizontal (top/bottom) or vertical (left/right)\n const isHorizontalLegend = legendPosition === \"top\" || legendPosition === \"bottom\";\n\n // Render legend (categorical types and/or regions)\n const renderLegend = () => {\n const hasCategoricalItems = visualizationMode === \"categorical\" && uniqueTypes.length > 0;\n const hasRegions = regions && regions.length > 0;\n\n if (!showLegend || (!hasCategoricalItems && !hasRegions)) {\n // Return empty placeholder to maintain consistent width (only for vertical legends)\n if (!isHorizontalLegend) {\n return <div className=\"platemap-legend-placeholder\" style={{ width: legendWidth }} />;\n }\n return null;\n }\n\n // Build legend class names\n const legendClassNames = [\"platemap-legend\"];\n if (isHorizontalLegend) {\n legendClassNames.push(\"platemap-legend--horizontal\");\n } else if (legendPosition === \"left\") {\n legendClassNames.push(\"platemap-legend--left\");\n } else if (legendPosition === \"right\") {\n legendClassNames.push(\"platemap-legend--right\");\n }\n\n // Dynamic styles that depend on props\n const legendStyle: React.CSSProperties = {\n gap: `${legendItemSpacing}px`,\n width: isHorizontalLegend ? undefined : legendWidth,\n };\n\n return (\n <div className={legendClassNames.join(\" \")} style={legendStyle}>\n {legendTitle && (\n <div\n className={`platemap-legend__title${isHorizontalLegend ? \" platemap-legend__title--horizontal\" : \"\"}`}\n style={{ fontSize: `${legendFontSize}px` }}\n >\n {legendTitle}\n </div>\n )}\n {/* Categorical type items */}\n {hasCategoricalItems &&\n uniqueTypes.map((type) => (\n <div key={type} className=\"platemap-legend__item\">\n <div\n className=\"platemap-legend__swatch\"\n style={{\n width: `${legendSwatchSize}px`,\n height: `${legendSwatchSize}px`,\n backgroundColor: categoryColors[type] || emptyWellColor,\n }}\n />\n <span\n className=\"platemap-legend__label platemap-legend__label--capitalize\"\n style={{ fontSize: `${legendFontSize}px` }}\n >\n {type}\n </span>\n </div>\n ))}\n {/* Region items */}\n {hasRegions &&\n regions.map((region) => (\n <div key={region.id} className=\"platemap-legend__item\">\n <div\n className=\"platemap-legend__swatch platemap-legend__swatch--region\"\n style={{\n width: `${legendSwatchSize}px`,\n height: `${legendSwatchSize}px`,\n backgroundColor: region.fillColor || \"transparent\",\n border: `${region.borderWidth || 2}px solid ${region.borderColor || COLORS.regionBorder}`,\n }}\n />\n <span\n className=\"platemap-legend__label\"\n style={{ fontSize: `${legendFontSize}px` }}\n >\n {region.name}\n </span>\n </div>\n ))}\n </div>\n );\n };\n\n // Build the plot content based on legend position\n const plotContent = (\n <div className=\"relative\">\n <div ref={plotRef} className=\"platemap-plot\" style={{ width, height }} />\n {tooltipElement}\n </div>\n );\n const legendContent = renderLegend();\n\n const renderPlotWithLegend = () => {\n switch (legendPosition) {\n case \"left\":\n return (\n <div className=\"platemap-plot-wrapper platemap-plot-wrapper--vertical\">\n {legendContent}\n {plotContent}\n </div>\n );\n case \"top\":\n return (\n <div className=\"platemap-plot-wrapper platemap-plot-wrapper--horizontal\">\n {legendContent}\n {plotContent}\n </div>\n );\n case \"bottom\":\n return (\n <div className=\"platemap-plot-wrapper platemap-plot-wrapper--horizontal\">\n {plotContent}\n {legendContent}\n </div>\n );\n case \"right\":\n default:\n return (\n <div className=\"platemap-plot-wrapper platemap-plot-wrapper--vertical\">\n {plotContent}\n {legendContent}\n </div>\n );\n }\n };\n\n return (\n <div className=\"platemap-container\" style={{ width: isHorizontalLegend ? undefined : width }}>\n {renderLayerSelector()}\n {renderPlotWithLegend()}\n </div>\n );\n};\n\nexport { PlateMap };"],"names":["PlateMap","data","layerConfigs","initialLayerId","onLayerChange","plateFormat","PLATE_FORMAT_96","customRows","customColumns","propVisualizationMode","customCategoryColors","regions","title","xTitle","yTitle","customXLabels","customYLabels","propColorScale","DEFAULT_COLOR_SCALE","propValueMin","propValueMax","emptyWellColor","COLORS","showColorBar","showLegend","legendConfig","width","height","precision","markerShape","onWellClick","plotRef","useRef","theme","usePlotlyTheme","onWellClickRef","activeLayerId","setActiveLayerId","useState","rows","columns","PLATE_FORMAT_CUSTOM","config","PLATE_CONFIGS","markerSize","useMemo","calculateMarkerSize","bindTooltip","tooltipElement","useChartTooltip","effectiveLayers","wellDataArray","hasMultiValueWells","extractLayers","activeLayer","l","visualizationMode","colorScale","valueMin","valueMax","valueUnit","categoryColors","DEFAULT_CATEGORY_COLORS","activeLayerId_","grid","categoriesGrid","allValuesMap","tooltipDataMap","resultGrid","resultCategories","resultAllValues","resultTooltipData","result","wellDataToGrid","PLATEMAP_CONSTANTS","rowLabels","generateRowLabels","colLabels","generateColumnLabels","range","calculateValueRange","zMin","zMax","hasNullValues","row","sentinelValue","displayGrid","val","effectiveColorScale","arrayColorScale","namedScale","NAMED_COLORSCALES","totalRange","dataStartRatio","extendedScale","pos","color","newPos","effectiveZMin","layerConfigMap","map","layer","hoverText","rowIdx","colIdx","wellId","wellIdUpper","buildWellHoverText","categoricalGrid","categoricalColorScale","uniqueTypes","catMax","typesSet","hasNullCategory","category","types","typeToIndex","type","idx","catGrid","numTypes","catColorScale","normalizedPos","bandHalf","start","end","regionShapes","shapes","region","bounds","parseRegionWells","inset","x0","x1","y0","y1","useEffect","isCategorical","plotZ","plotColorScale","plotZMin","plotZMax","plotShowScale","xData","yData","colorData","textData","flattenGridData","plotData","buildColorbarConfig","legendPosition","layout","CHART_FONT_FAMILY","calculateTitleX","buildPlotMargins","_","i","calculateAxisDomain","cancelled","plotElement","loadPlotly","plotly","currentRef","eventData","point","rowLabelsArr","colLabelsArr","allValues","tooltipData","wellData","getLoadedPlotly","renderLayerSelector","isActive","jsx","Button","legendFontSize","legendItemSpacing","legendSwatchSize","legendTitle","legendWidth","isHorizontalLegend","renderLegend","hasCategoricalItems","hasRegions","legendClassNames","legendStyle","jsxs","plotContent","legendContent","renderPlotWithLegend"],"mappings":"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"}
@@ -0,0 +1,29 @@
1
+ import { default as React } from 'react';
2
+ import { PlateMapProps } from './types';
3
+ export * from './types';
4
+ export { DEFAULT_CATEGORY_COLORS } from './constants';
5
+ /**
6
+ * PlateMap component for visualizing well plate data as a heatmap or categorical display.
7
+ *
8
+ * **Supported Plate Formats:**
9
+ * - 96-well (8 rows × 12 columns, wells A1-H12)
10
+ * - 384-well (16 rows × 24 columns, wells A1-P24)
11
+ * - 1536-well (32 rows × 48 columns, wells A1-AF48)
12
+ * - Custom dimensions with user-specified rows/columns
13
+ *
14
+ * **Visualization Modes:**
15
+ * - `"heatmap"`: Continuous color gradient for quantitative values
16
+ * - `"categorical"`: Discrete colors for well types (sample, control, empty)
17
+ *
18
+ * **Features:**
19
+ * - Multiple data layers with independent visualization settings
20
+ * - Control region highlighting with borders and fill colors
21
+ * - Configurable color scales, tooltips, and click interactions
22
+ * - Support for WellData arrays with multi-layer visualization
23
+ *
24
+ * **Data Format:**
25
+ * - **WellData array**: `[{ wellId: "A1", values: { RFU: 100 }, tooltipData: {...} }, ...]`
26
+ *
27
+ */
28
+ declare const PlateMap: React.FC<PlateMapProps>;
29
+ export { PlateMap };