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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (439) hide show
  1. package/README.md +2 -2
  2. package/dist/components/ai/chain-of-thought.cjs +1 -1
  3. package/dist/components/ai/chain-of-thought.cjs.map +1 -1
  4. package/dist/components/ai/chain-of-thought.js +1 -1
  5. package/dist/components/ai/chain-of-thought.js.map +1 -1
  6. package/dist/components/ai/confirmation.cjs +1 -1
  7. package/dist/components/ai/confirmation.cjs.map +1 -1
  8. package/dist/components/ai/confirmation.js +1 -1
  9. package/dist/components/ai/confirmation.js.map +1 -1
  10. package/dist/components/ai/context.cjs +1 -1
  11. package/dist/components/ai/context.cjs.map +1 -1
  12. package/dist/components/ai/context.js +36 -35
  13. package/dist/components/ai/context.js.map +1 -1
  14. package/dist/components/ai/message.cjs +1 -1
  15. package/dist/components/ai/message.cjs.map +1 -1
  16. package/dist/components/ai/message.js +68 -68
  17. package/dist/components/ai/message.js.map +1 -1
  18. package/dist/components/ai/prompt-input.cjs +1 -1
  19. package/dist/components/ai/prompt-input.cjs.map +1 -1
  20. package/dist/components/ai/prompt-input.js +4 -2
  21. package/dist/components/ai/prompt-input.js.map +1 -1
  22. package/dist/components/ai/queue.cjs +1 -1
  23. package/dist/components/ai/queue.cjs.map +1 -1
  24. package/dist/components/ai/queue.js +9 -9
  25. package/dist/components/ai/queue.js.map +1 -1
  26. package/dist/components/ai/reasoning.cjs +1 -1
  27. package/dist/components/ai/reasoning.cjs.map +1 -1
  28. package/dist/components/ai/reasoning.js +67 -67
  29. package/dist/components/ai/reasoning.js.map +1 -1
  30. package/dist/components/ai/stream-status.cjs +1 -1
  31. package/dist/components/ai/stream-status.cjs.map +1 -1
  32. package/dist/components/ai/stream-status.js +41 -39
  33. package/dist/components/ai/stream-status.js.map +1 -1
  34. package/dist/components/ai/streamdown-code-plugin.cjs +2 -0
  35. package/dist/components/ai/streamdown-code-plugin.cjs.map +1 -0
  36. package/dist/components/ai/streamdown-code-plugin.js +42 -0
  37. package/dist/components/ai/streamdown-code-plugin.js.map +1 -0
  38. package/dist/components/ai/streamdown-plugins.cjs +2 -0
  39. package/dist/components/ai/streamdown-plugins.cjs.map +1 -0
  40. package/dist/components/ai/streamdown-plugins.js +14 -0
  41. package/dist/components/ai/streamdown-plugins.js.map +1 -0
  42. package/dist/components/ai/task.cjs +1 -1
  43. package/dist/components/ai/task.cjs.map +1 -1
  44. package/dist/components/ai/task.js +18 -11
  45. package/dist/components/ai/task.js.map +1 -1
  46. package/dist/components/ai/tool.cjs +1 -1
  47. package/dist/components/ai/tool.cjs.map +1 -1
  48. package/dist/components/ai/tool.js +51 -55
  49. package/dist/components/ai/tool.js.map +1 -1
  50. package/dist/components/ai/use-streamdown-plugins.cjs +2 -0
  51. package/dist/components/ai/use-streamdown-plugins.cjs.map +1 -0
  52. package/dist/components/ai/use-streamdown-plugins.js +25 -0
  53. package/dist/components/ai/use-streamdown-plugins.js.map +1 -0
  54. package/dist/components/charts/AreaPlot/AreaPlot.cjs +2 -0
  55. package/dist/components/charts/AreaPlot/AreaPlot.cjs.map +1 -0
  56. package/dist/components/charts/AreaPlot/AreaPlot.js +270 -0
  57. package/dist/components/charts/AreaPlot/AreaPlot.js.map +1 -0
  58. package/dist/components/charts/BarChart/BarChart.cjs +2 -0
  59. package/dist/components/charts/BarChart/BarChart.cjs.map +1 -0
  60. package/dist/components/charts/BarChart/BarChart.js +219 -0
  61. package/dist/components/charts/BarChart/BarChart.js.map +1 -0
  62. package/dist/components/charts/BoxPlot/BoxPlot.cjs +2 -0
  63. package/dist/components/charts/BoxPlot/BoxPlot.cjs.map +1 -0
  64. package/dist/components/charts/{Boxplot/Boxplot.js → BoxPlot/BoxPlot.js} +78 -79
  65. package/dist/components/charts/BoxPlot/BoxPlot.js.map +1 -0
  66. package/dist/components/charts/ChartTooltip/ChartTooltip.cjs +1 -1
  67. package/dist/components/charts/ChartTooltip/ChartTooltip.cjs.map +1 -1
  68. package/dist/components/charts/ChartTooltip/ChartTooltip.js +22 -22
  69. package/dist/components/charts/ChartTooltip/ChartTooltip.js.map +1 -1
  70. package/dist/components/charts/Chromatogram/Chromatogram.cjs +1 -1
  71. package/dist/components/charts/Chromatogram/Chromatogram.cjs.map +1 -1
  72. package/dist/components/charts/Chromatogram/Chromatogram.js +232 -170
  73. package/dist/components/charts/Chromatogram/Chromatogram.js.map +1 -1
  74. package/dist/components/charts/Chromatogram/annotations.cjs +2 -0
  75. package/dist/components/charts/Chromatogram/annotations.cjs.map +1 -0
  76. package/dist/components/charts/Chromatogram/annotations.js +137 -0
  77. package/dist/components/charts/Chromatogram/annotations.js.map +1 -0
  78. package/dist/components/charts/Chromatogram/boundaryMarkers.cjs.map +1 -0
  79. package/dist/components/charts/Chromatogram/boundaryMarkers.js.map +1 -0
  80. package/dist/components/charts/Chromatogram/constants.cjs.map +1 -0
  81. package/dist/components/charts/Chromatogram/constants.js.map +1 -0
  82. package/dist/components/charts/Chromatogram/dataProcessing.cjs.map +1 -0
  83. package/dist/components/charts/Chromatogram/dataProcessing.js.map +1 -0
  84. package/dist/components/charts/Chromatogram/peakDetection.cjs.map +1 -0
  85. package/dist/components/charts/Chromatogram/peakDetection.js.map +1 -0
  86. package/dist/components/charts/Chromatogram/plotBuilder.cjs +2 -0
  87. package/dist/components/charts/Chromatogram/plotBuilder.cjs.map +1 -0
  88. package/dist/components/charts/Chromatogram/plotBuilder.js +216 -0
  89. package/dist/components/charts/Chromatogram/plotBuilder.js.map +1 -0
  90. package/dist/components/charts/Chromatogram/regionOverlays.cjs.map +1 -0
  91. package/dist/components/charts/Chromatogram/regionOverlays.js.map +1 -0
  92. package/dist/components/charts/Electropherogram/Electropherogram.cjs +2 -0
  93. package/dist/components/charts/Electropherogram/Electropherogram.cjs.map +1 -0
  94. package/dist/components/charts/Electropherogram/Electropherogram.js +180 -0
  95. package/dist/components/charts/Electropherogram/Electropherogram.js.map +1 -0
  96. package/dist/components/charts/Histogram/Histogram.cjs +1 -1
  97. package/dist/components/charts/Histogram/Histogram.cjs.map +1 -1
  98. package/dist/components/charts/Histogram/Histogram.js +107 -108
  99. package/dist/components/charts/Histogram/Histogram.js.map +1 -1
  100. package/dist/components/charts/LinePlot/LinePlot.cjs +2 -0
  101. package/dist/components/charts/LinePlot/LinePlot.cjs.map +1 -0
  102. package/dist/components/charts/LinePlot/LinePlot.js +224 -0
  103. package/dist/components/charts/LinePlot/LinePlot.js.map +1 -0
  104. package/dist/components/charts/PieChart/PieChart.cjs +1 -1
  105. package/dist/components/charts/PieChart/PieChart.cjs.map +1 -1
  106. package/dist/components/charts/PieChart/PieChart.js +62 -61
  107. package/dist/components/charts/PieChart/PieChart.js.map +1 -1
  108. package/dist/components/charts/PlateMap/PlateMap.cjs +1 -1
  109. package/dist/components/charts/PlateMap/PlateMap.cjs.map +1 -1
  110. package/dist/components/charts/PlateMap/PlateMap.js +246 -242
  111. package/dist/components/charts/PlateMap/PlateMap.js.map +1 -1
  112. package/dist/components/charts/ScatterPlot/ScatterPlot.cjs +2 -0
  113. package/dist/components/charts/ScatterPlot/ScatterPlot.cjs.map +1 -0
  114. package/dist/components/charts/ScatterPlot/ScatterPlot.js +252 -0
  115. package/dist/components/charts/ScatterPlot/ScatterPlot.js.map +1 -0
  116. package/dist/components/charts/ScatterPlotInteractive/ScatterPlotInteractive.cjs +2 -0
  117. package/dist/components/charts/ScatterPlotInteractive/ScatterPlotInteractive.cjs.map +1 -0
  118. package/dist/components/charts/ScatterPlotInteractive/ScatterPlotInteractive.js +215 -0
  119. package/dist/components/charts/ScatterPlotInteractive/ScatterPlotInteractive.js.map +1 -0
  120. package/dist/components/charts/ScatterPlotInteractive/constants.cjs +2 -0
  121. package/dist/components/charts/ScatterPlotInteractive/constants.cjs.map +1 -0
  122. package/dist/components/charts/ScatterPlotInteractive/constants.js +38 -0
  123. package/dist/components/charts/ScatterPlotInteractive/constants.js.map +1 -0
  124. package/dist/components/charts/ScatterPlotInteractive/utils.cjs +2 -0
  125. package/dist/components/charts/ScatterPlotInteractive/utils.cjs.map +1 -0
  126. package/dist/components/charts/ScatterPlotInteractive/utils.js +261 -0
  127. package/dist/components/charts/ScatterPlotInteractive/utils.js.map +1 -0
  128. package/dist/components/charts/StackedChromatogram/StackedChromatogram.cjs +2 -0
  129. package/dist/components/charts/StackedChromatogram/StackedChromatogram.cjs.map +1 -0
  130. package/dist/components/charts/StackedChromatogram/StackedChromatogram.js +40 -0
  131. package/dist/components/charts/StackedChromatogram/StackedChromatogram.js.map +1 -0
  132. package/dist/components/charts/StackedChromatogram/transforms.cjs.map +1 -0
  133. package/dist/components/charts/StackedChromatogram/transforms.js.map +1 -0
  134. package/dist/components/charts/plotly-loader.cjs +2 -0
  135. package/dist/components/charts/plotly-loader.cjs.map +1 -0
  136. package/dist/components/charts/plotly-loader.js +22 -0
  137. package/dist/components/charts/plotly-loader.js.map +1 -0
  138. package/dist/components/composed/AssistantLayout/AssistantLayout.cjs +2 -0
  139. package/dist/components/composed/AssistantLayout/AssistantLayout.cjs.map +1 -0
  140. package/dist/components/composed/AssistantLayout/AssistantLayout.js +142 -0
  141. package/dist/components/composed/AssistantLayout/AssistantLayout.js.map +1 -0
  142. package/dist/components/composed/AssistantLayout/dockLayout.cjs +2 -0
  143. package/dist/components/composed/AssistantLayout/dockLayout.cjs.map +1 -0
  144. package/dist/components/composed/AssistantLayout/dockLayout.js +10 -0
  145. package/dist/components/composed/AssistantLayout/dockLayout.js.map +1 -0
  146. package/dist/components/composed/Chat/Chat.cjs +1 -1
  147. package/dist/components/composed/Chat/Chat.cjs.map +1 -1
  148. package/dist/components/composed/Chat/Chat.js +23 -23
  149. package/dist/components/composed/Chat/Chat.js.map +1 -1
  150. package/dist/components/composed/ConfirmDialog/ConfirmDialog.cjs +1 -1
  151. package/dist/components/composed/ConfirmDialog/ConfirmDialog.cjs.map +1 -1
  152. package/dist/components/composed/ConfirmDialog/ConfirmDialog.js +33 -29
  153. package/dist/components/composed/ConfirmDialog/ConfirmDialog.js.map +1 -1
  154. package/dist/components/composed/DataAppShell/CollapseButton.cjs +2 -0
  155. package/dist/components/composed/DataAppShell/CollapseButton.cjs.map +1 -0
  156. package/dist/components/composed/DataAppShell/CollapseButton.js +42 -0
  157. package/dist/components/composed/DataAppShell/CollapseButton.js.map +1 -0
  158. package/dist/components/composed/DataAppShell/DataAppShell.cjs +1 -1
  159. package/dist/components/composed/DataAppShell/DataAppShell.cjs.map +1 -1
  160. package/dist/components/composed/DataAppShell/DataAppShell.js +349 -313
  161. package/dist/components/composed/DataAppShell/DataAppShell.js.map +1 -1
  162. package/dist/components/composed/DataAppShell/PrimaryNav.cjs +2 -0
  163. package/dist/components/composed/DataAppShell/PrimaryNav.cjs.map +1 -0
  164. package/dist/components/composed/DataAppShell/PrimaryNav.js +268 -0
  165. package/dist/components/composed/DataAppShell/PrimaryNav.js.map +1 -0
  166. package/dist/components/composed/DataAppShell/RightPanel.cjs +2 -0
  167. package/dist/components/composed/DataAppShell/RightPanel.cjs.map +1 -0
  168. package/dist/components/composed/DataAppShell/RightPanel.js +282 -0
  169. package/dist/components/composed/DataAppShell/RightPanel.js.map +1 -0
  170. package/dist/components/composed/DataAppShell/SecondaryNav.cjs +2 -0
  171. package/dist/components/composed/DataAppShell/SecondaryNav.cjs.map +1 -0
  172. package/dist/components/composed/DataAppShell/SecondaryNav.js +364 -0
  173. package/dist/components/composed/DataAppShell/SecondaryNav.js.map +1 -0
  174. package/dist/components/composed/DataAppShell/ShellContext.cjs +2 -0
  175. package/dist/components/composed/DataAppShell/ShellContext.cjs.map +1 -0
  176. package/dist/components/composed/DataAppShell/ShellContext.js +23 -0
  177. package/dist/components/composed/DataAppShell/ShellContext.js.map +1 -0
  178. package/dist/components/composed/MoleculeStructure/MoleculeStructure.cjs +2 -0
  179. package/dist/components/composed/MoleculeStructure/MoleculeStructure.cjs.map +1 -0
  180. package/dist/components/composed/MoleculeStructure/MoleculeStructure.js +87 -0
  181. package/dist/components/composed/MoleculeStructure/MoleculeStructure.js.map +1 -0
  182. package/dist/components/composed/MoleculeStructure/rdkit-loader.cjs +2 -0
  183. package/dist/components/composed/MoleculeStructure/rdkit-loader.cjs.map +1 -0
  184. package/dist/components/composed/MoleculeStructure/rdkit-loader.js +89 -0
  185. package/dist/components/composed/MoleculeStructure/rdkit-loader.js.map +1 -0
  186. package/dist/components/composed/MoleculeStructure/use-rdkit.cjs +2 -0
  187. package/dist/components/composed/MoleculeStructure/use-rdkit.cjs.map +1 -0
  188. package/dist/components/composed/MoleculeStructure/use-rdkit.js +19 -0
  189. package/dist/components/composed/MoleculeStructure/use-rdkit.js.map +1 -0
  190. package/dist/components/composed/PlateMapEditor/ManifestFilterPopover.cjs +1 -1
  191. package/dist/components/composed/PlateMapEditor/ManifestFilterPopover.cjs.map +1 -1
  192. package/dist/components/composed/PlateMapEditor/ManifestFilterPopover.js +17 -17
  193. package/dist/components/composed/PlateMapEditor/ManifestFilterPopover.js.map +1 -1
  194. package/dist/components/composed/PlateMapEditor/PlateMapActionsMenu.cjs +1 -1
  195. package/dist/components/composed/PlateMapEditor/PlateMapActionsMenu.cjs.map +1 -1
  196. package/dist/components/composed/PlateMapEditor/PlateMapActionsMenu.js +33 -33
  197. package/dist/components/composed/PlateMapEditor/PlateMapActionsMenu.js.map +1 -1
  198. package/dist/components/composed/PlateMapEditor/PlateMapPlateSelector.cjs +1 -1
  199. package/dist/components/composed/PlateMapEditor/PlateMapPlateSelector.cjs.map +1 -1
  200. package/dist/components/composed/PlateMapEditor/PlateMapPlateSelector.js +7 -7
  201. package/dist/components/composed/PlateMapEditor/PlateMapPlateSelector.js.map +1 -1
  202. package/dist/components/composed/PlateMapEditor/PlatePaintGrid.cjs +1 -1
  203. package/dist/components/composed/PlateMapEditor/PlatePaintGrid.cjs.map +1 -1
  204. package/dist/components/composed/PlateMapEditor/PlatePaintGrid.js +1 -1
  205. package/dist/components/composed/PlateMapEditor/PlatePaintGrid.js.map +1 -1
  206. package/dist/components/composed/PlateMapEditor/WellLegend.cjs +1 -1
  207. package/dist/components/composed/PlateMapEditor/WellLegend.cjs.map +1 -1
  208. package/dist/components/composed/PlateMapEditor/WellLegend.js +24 -12
  209. package/dist/components/composed/PlateMapEditor/WellLegend.js.map +1 -1
  210. package/dist/components/composed/PlateMapEditor/WellManifestTable.cjs +1 -1
  211. package/dist/components/composed/PlateMapEditor/WellManifestTable.cjs.map +1 -1
  212. package/dist/components/composed/PlateMapEditor/WellManifestTable.js +1 -1
  213. package/dist/components/composed/PlateMapEditor/WellManifestTable.js.map +1 -1
  214. package/dist/components/composed/TdpSearch/components/DefaultFilters.cjs +1 -1
  215. package/dist/components/composed/TdpSearch/components/DefaultFilters.cjs.map +1 -1
  216. package/dist/components/composed/TdpSearch/components/DefaultFilters.js +3 -3
  217. package/dist/components/composed/TdpSearch/components/DefaultFilters.js.map +1 -1
  218. package/dist/components/composed/TopBar/TopBar.cjs +2 -0
  219. package/dist/components/composed/TopBar/TopBar.cjs.map +1 -0
  220. package/dist/components/composed/TopBar/TopBar.js +56 -0
  221. package/dist/components/composed/TopBar/TopBar.js.map +1 -0
  222. package/dist/components/composed/UserMenu/UserMenu.cjs +2 -0
  223. package/dist/components/composed/UserMenu/UserMenu.cjs.map +1 -0
  224. package/dist/components/composed/UserMenu/UserMenu.js +99 -0
  225. package/dist/components/composed/UserMenu/UserMenu.js.map +1 -0
  226. package/dist/components/composed/tdp-link.cjs +1 -1
  227. package/dist/components/composed/tdp-link.cjs.map +1 -1
  228. package/dist/components/composed/tdp-link.js +5 -5
  229. package/dist/components/composed/tdp-link.js.map +1 -1
  230. package/dist/components/ui/alert.cjs +1 -1
  231. package/dist/components/ui/alert.cjs.map +1 -1
  232. package/dist/components/ui/alert.js +12 -12
  233. package/dist/components/ui/alert.js.map +1 -1
  234. package/dist/components/ui/badge.cjs +1 -1
  235. package/dist/components/ui/badge.cjs.map +1 -1
  236. package/dist/components/ui/badge.js +14 -14
  237. package/dist/components/ui/badge.js.map +1 -1
  238. package/dist/components/ui/banner.cjs +1 -1
  239. package/dist/components/ui/banner.cjs.map +1 -1
  240. package/dist/components/ui/banner.js +17 -17
  241. package/dist/components/ui/banner.js.map +1 -1
  242. package/dist/components/ui/button.cjs +1 -1
  243. package/dist/components/ui/button.cjs.map +1 -1
  244. package/dist/components/ui/button.js +16 -16
  245. package/dist/components/ui/button.js.map +1 -1
  246. package/dist/components/ui/calendar.cjs +1 -1
  247. package/dist/components/ui/calendar.cjs.map +1 -1
  248. package/dist/components/ui/calendar.js +3 -3
  249. package/dist/components/ui/calendar.js.map +1 -1
  250. package/dist/components/ui/code-block.cjs +3 -3
  251. package/dist/components/ui/code-block.cjs.map +1 -1
  252. package/dist/components/ui/code-block.js +136 -118
  253. package/dist/components/ui/code-block.js.map +1 -1
  254. package/dist/components/ui/code-editor.cjs +1 -1
  255. package/dist/components/ui/code-editor.cjs.map +1 -1
  256. package/dist/components/ui/code-editor.js +14 -12
  257. package/dist/components/ui/code-editor.js.map +1 -1
  258. package/dist/components/ui/combobox.cjs +1 -1
  259. package/dist/components/ui/combobox.cjs.map +1 -1
  260. package/dist/components/ui/combobox.js +33 -29
  261. package/dist/components/ui/combobox.js.map +1 -1
  262. package/dist/components/ui/command.cjs +1 -1
  263. package/dist/components/ui/command.cjs.map +1 -1
  264. package/dist/components/ui/command.js +81 -77
  265. package/dist/components/ui/command.js.map +1 -1
  266. package/dist/components/ui/context-menu.cjs +1 -1
  267. package/dist/components/ui/context-menu.cjs.map +1 -1
  268. package/dist/components/ui/context-menu.js +13 -13
  269. package/dist/components/ui/context-menu.js.map +1 -1
  270. package/dist/components/ui/data-table/data-table-column-toggle.cjs +1 -1
  271. package/dist/components/ui/data-table/data-table-column-toggle.cjs.map +1 -1
  272. package/dist/components/ui/data-table/data-table-column-toggle.js +70 -62
  273. package/dist/components/ui/data-table/data-table-column-toggle.js.map +1 -1
  274. package/dist/components/ui/data-table/data-table-filter.cjs +1 -1
  275. package/dist/components/ui/data-table/data-table-filter.cjs.map +1 -1
  276. package/dist/components/ui/data-table/data-table-filter.js +24 -23
  277. package/dist/components/ui/data-table/data-table-filter.js.map +1 -1
  278. package/dist/components/ui/data-table/data-table-group.cjs +1 -1
  279. package/dist/components/ui/data-table/data-table-group.cjs.map +1 -1
  280. package/dist/components/ui/data-table/data-table-group.js +17 -16
  281. package/dist/components/ui/data-table/data-table-group.js.map +1 -1
  282. package/dist/components/ui/data-table/data-table-pagination.cjs +1 -1
  283. package/dist/components/ui/data-table/data-table-pagination.cjs.map +1 -1
  284. package/dist/components/ui/data-table/data-table-pagination.js +15 -15
  285. package/dist/components/ui/data-table/data-table-pagination.js.map +1 -1
  286. package/dist/components/ui/data-table/data-table.cjs +1 -1
  287. package/dist/components/ui/data-table/data-table.cjs.map +1 -1
  288. package/dist/components/ui/data-table/data-table.js +191 -190
  289. package/dist/components/ui/data-table/data-table.js.map +1 -1
  290. package/dist/components/ui/dialog.cjs +1 -1
  291. package/dist/components/ui/dialog.cjs.map +1 -1
  292. package/dist/components/ui/dialog.js +1 -1
  293. package/dist/components/ui/dialog.js.map +1 -1
  294. package/dist/components/ui/dropdown-menu.cjs +1 -1
  295. package/dist/components/ui/dropdown-menu.cjs.map +1 -1
  296. package/dist/components/ui/dropdown-menu.js +12 -4
  297. package/dist/components/ui/dropdown-menu.js.map +1 -1
  298. package/dist/components/ui/hover-card.cjs +1 -1
  299. package/dist/components/ui/hover-card.cjs.map +1 -1
  300. package/dist/components/ui/hover-card.js +3 -3
  301. package/dist/components/ui/hover-card.js.map +1 -1
  302. package/dist/components/ui/item.cjs +1 -1
  303. package/dist/components/ui/item.cjs.map +1 -1
  304. package/dist/components/ui/item.js +44 -36
  305. package/dist/components/ui/item.js.map +1 -1
  306. package/dist/components/ui/menubar.cjs +1 -1
  307. package/dist/components/ui/menubar.cjs.map +1 -1
  308. package/dist/components/ui/menubar.js +2 -2
  309. package/dist/components/ui/menubar.js.map +1 -1
  310. package/dist/components/ui/navigation-menu.cjs +1 -1
  311. package/dist/components/ui/navigation-menu.cjs.map +1 -1
  312. package/dist/components/ui/navigation-menu.js +1 -1
  313. package/dist/components/ui/navigation-menu.js.map +1 -1
  314. package/dist/components/ui/popover.cjs +1 -1
  315. package/dist/components/ui/popover.cjs.map +1 -1
  316. package/dist/components/ui/popover.js +1 -1
  317. package/dist/components/ui/popover.js.map +1 -1
  318. package/dist/components/ui/scroll-area.cjs +1 -1
  319. package/dist/components/ui/scroll-area.cjs.map +1 -1
  320. package/dist/components/ui/scroll-area.js +1 -0
  321. package/dist/components/ui/scroll-area.js.map +1 -1
  322. package/dist/components/ui/select.cjs +1 -1
  323. package/dist/components/ui/select.cjs.map +1 -1
  324. package/dist/components/ui/select.js +1 -1
  325. package/dist/components/ui/select.js.map +1 -1
  326. package/dist/components/ui/sheet.cjs +1 -1
  327. package/dist/components/ui/sheet.cjs.map +1 -1
  328. package/dist/components/ui/sheet.js +5 -5
  329. package/dist/components/ui/sheet.js.map +1 -1
  330. package/dist/components/ui/sidebar.cjs +1 -1
  331. package/dist/components/ui/sidebar.cjs.map +1 -1
  332. package/dist/components/ui/sidebar.js +2 -2
  333. package/dist/components/ui/sidebar.js.map +1 -1
  334. package/dist/components/ui/slider.cjs +1 -1
  335. package/dist/components/ui/slider.cjs.map +1 -1
  336. package/dist/components/ui/slider.js +10 -9
  337. package/dist/components/ui/slider.js.map +1 -1
  338. package/dist/components/ui/sonner.cjs +1 -1
  339. package/dist/components/ui/sonner.cjs.map +1 -1
  340. package/dist/components/ui/sonner.js +25 -10
  341. package/dist/components/ui/sonner.js.map +1 -1
  342. package/dist/components/ui/table.cjs +1 -1
  343. package/dist/components/ui/table.cjs.map +1 -1
  344. package/dist/components/ui/table.js +1 -0
  345. package/dist/components/ui/table.js.map +1 -1
  346. package/dist/components/ui/tabs.cjs +1 -1
  347. package/dist/components/ui/tabs.cjs.map +1 -1
  348. package/dist/components/ui/tabs.js +18 -18
  349. package/dist/components/ui/tabs.js.map +1 -1
  350. package/dist/components/ui/tetra-molecule-icon.cjs +2 -0
  351. package/dist/components/ui/tetra-molecule-icon.cjs.map +1 -0
  352. package/dist/components/ui/tetra-molecule-icon.js +49 -0
  353. package/dist/components/ui/tetra-molecule-icon.js.map +1 -0
  354. package/dist/components/ui/toggle-group.cjs +1 -1
  355. package/dist/components/ui/toggle-group.cjs.map +1 -1
  356. package/dist/components/ui/toggle-group.js +35 -31
  357. package/dist/components/ui/toggle-group.js.map +1 -1
  358. package/dist/hooks/use-plotly-theme.cjs +1 -1
  359. package/dist/hooks/use-plotly-theme.cjs.map +1 -1
  360. package/dist/hooks/use-plotly-theme.js +4 -3
  361. package/dist/hooks/use-plotly-theme.js.map +1 -1
  362. package/dist/index.cjs +1 -1
  363. package/dist/index.css +1 -1
  364. package/dist/index.d.ts +1073 -136
  365. package/dist/index.js +698 -647
  366. package/dist/index.js.map +1 -1
  367. package/dist/index.tailwind.css +1 -1
  368. package/dist/lib/shiki.cjs +2 -0
  369. package/dist/lib/shiki.cjs.map +1 -0
  370. package/dist/lib/shiki.js +72 -0
  371. package/dist/lib/shiki.js.map +1 -0
  372. package/package.json +23 -12
  373. package/dist/components/charts/AreaGraph/AreaGraph.cjs +0 -2
  374. package/dist/components/charts/AreaGraph/AreaGraph.cjs.map +0 -1
  375. package/dist/components/charts/AreaGraph/AreaGraph.js +0 -271
  376. package/dist/components/charts/AreaGraph/AreaGraph.js.map +0 -1
  377. package/dist/components/charts/BarGraph/BarGraph.cjs +0 -2
  378. package/dist/components/charts/BarGraph/BarGraph.cjs.map +0 -1
  379. package/dist/components/charts/BarGraph/BarGraph.js +0 -220
  380. package/dist/components/charts/BarGraph/BarGraph.js.map +0 -1
  381. package/dist/components/charts/Boxplot/Boxplot.cjs +0 -2
  382. package/dist/components/charts/Boxplot/Boxplot.cjs.map +0 -1
  383. package/dist/components/charts/Boxplot/Boxplot.js.map +0 -1
  384. package/dist/components/charts/ChromatogramChart/ChromatogramChart.cjs +0 -2
  385. package/dist/components/charts/ChromatogramChart/ChromatogramChart.cjs.map +0 -1
  386. package/dist/components/charts/ChromatogramChart/ChromatogramChart.js +0 -241
  387. package/dist/components/charts/ChromatogramChart/ChromatogramChart.js.map +0 -1
  388. package/dist/components/charts/ChromatogramChart/annotations.cjs +0 -2
  389. package/dist/components/charts/ChromatogramChart/annotations.cjs.map +0 -1
  390. package/dist/components/charts/ChromatogramChart/annotations.js +0 -136
  391. package/dist/components/charts/ChromatogramChart/annotations.js.map +0 -1
  392. package/dist/components/charts/ChromatogramChart/boundaryMarkers.cjs.map +0 -1
  393. package/dist/components/charts/ChromatogramChart/boundaryMarkers.js.map +0 -1
  394. package/dist/components/charts/ChromatogramChart/constants.cjs.map +0 -1
  395. package/dist/components/charts/ChromatogramChart/constants.js.map +0 -1
  396. package/dist/components/charts/ChromatogramChart/dataProcessing.cjs.map +0 -1
  397. package/dist/components/charts/ChromatogramChart/dataProcessing.js.map +0 -1
  398. package/dist/components/charts/ChromatogramChart/peakDetection.cjs.map +0 -1
  399. package/dist/components/charts/ChromatogramChart/peakDetection.js.map +0 -1
  400. package/dist/components/charts/ChromatogramChart/plotBuilder.cjs +0 -2
  401. package/dist/components/charts/ChromatogramChart/plotBuilder.cjs.map +0 -1
  402. package/dist/components/charts/ChromatogramChart/plotBuilder.js +0 -207
  403. package/dist/components/charts/ChromatogramChart/plotBuilder.js.map +0 -1
  404. package/dist/components/charts/ChromatogramChart/regionOverlays.cjs.map +0 -1
  405. package/dist/components/charts/ChromatogramChart/regionOverlays.js.map +0 -1
  406. package/dist/components/charts/DotPlot/DotPlot.cjs +0 -2
  407. package/dist/components/charts/DotPlot/DotPlot.cjs.map +0 -1
  408. package/dist/components/charts/DotPlot/DotPlot.js +0 -208
  409. package/dist/components/charts/DotPlot/DotPlot.js.map +0 -1
  410. package/dist/components/charts/Heatmap/Heatmap.cjs +0 -2
  411. package/dist/components/charts/Heatmap/Heatmap.cjs.map +0 -1
  412. package/dist/components/charts/Heatmap/Heatmap.js +0 -67
  413. package/dist/components/charts/Heatmap/Heatmap.js.map +0 -1
  414. package/dist/components/charts/LineGraph/LineGraph.cjs +0 -2
  415. package/dist/components/charts/LineGraph/LineGraph.cjs.map +0 -1
  416. package/dist/components/charts/LineGraph/LineGraph.js +0 -225
  417. package/dist/components/charts/LineGraph/LineGraph.js.map +0 -1
  418. package/dist/components/charts/ScatterGraph/ScatterGraph.cjs +0 -2
  419. package/dist/components/charts/ScatterGraph/ScatterGraph.cjs.map +0 -1
  420. package/dist/components/charts/ScatterGraph/ScatterGraph.js +0 -234
  421. package/dist/components/charts/ScatterGraph/ScatterGraph.js.map +0 -1
  422. package/dist/components/charts/StackedChromatogramChart/StackedChromatogramChart.cjs +0 -2
  423. package/dist/components/charts/StackedChromatogramChart/StackedChromatogramChart.cjs.map +0 -1
  424. package/dist/components/charts/StackedChromatogramChart/StackedChromatogramChart.js +0 -40
  425. package/dist/components/charts/StackedChromatogramChart/StackedChromatogramChart.js.map +0 -1
  426. package/dist/components/charts/StackedChromatogramChart/transforms.cjs.map +0 -1
  427. package/dist/components/charts/StackedChromatogramChart/transforms.js.map +0 -1
  428. /package/dist/components/charts/{ChromatogramChart → Chromatogram}/boundaryMarkers.cjs +0 -0
  429. /package/dist/components/charts/{ChromatogramChart → Chromatogram}/boundaryMarkers.js +0 -0
  430. /package/dist/components/charts/{ChromatogramChart → Chromatogram}/constants.cjs +0 -0
  431. /package/dist/components/charts/{ChromatogramChart → Chromatogram}/constants.js +0 -0
  432. /package/dist/components/charts/{ChromatogramChart → Chromatogram}/dataProcessing.cjs +0 -0
  433. /package/dist/components/charts/{ChromatogramChart → Chromatogram}/dataProcessing.js +0 -0
  434. /package/dist/components/charts/{ChromatogramChart → Chromatogram}/peakDetection.cjs +0 -0
  435. /package/dist/components/charts/{ChromatogramChart → Chromatogram}/peakDetection.js +0 -0
  436. /package/dist/components/charts/{ChromatogramChart → Chromatogram}/regionOverlays.cjs +0 -0
  437. /package/dist/components/charts/{ChromatogramChart → Chromatogram}/regionOverlays.js +0 -0
  438. /package/dist/components/charts/{StackedChromatogramChart → StackedChromatogram}/transforms.cjs +0 -0
  439. /package/dist/components/charts/{StackedChromatogramChart → StackedChromatogram}/transforms.js +0 -0
@@ -0,0 +1,364 @@
1
+ import { jsx as a, jsxs as n } from "react/jsx-runtime";
2
+ import { cva as R } from "class-variance-authority";
3
+ import { ChevronRight as M, Check as E } from "lucide-react";
4
+ import * as S from "react";
5
+ import { ShellCollapseButton as v } from "./CollapseButton.js";
6
+ import { useOptionalDataAppShell as P } from "./ShellContext.js";
7
+ import { Badge as j } from "../../ui/badge.js";
8
+ import { Select as q, SelectTrigger as G, SelectValue as H, SelectContent as J, SelectItem as L } from "../../ui/select.js";
9
+ import { TooltipProvider as Q, Tooltip as U, TooltipTrigger as W, TooltipContent as X } from "../../ui/tooltip.js";
10
+ import { cn as i } from "../../../lib/utils.js";
11
+ const I = R("shrink-0", {
12
+ variants: {
13
+ orientation: {
14
+ /** Collapsible left panel; collapses to an icon-only rail */
15
+ vertical: "flex flex-col bg-sidebar border-r border-sidebar-border overflow-hidden",
16
+ /** Wizard/stepper row rendered above the main content */
17
+ horizontal: "flex flex-row items-center min-w-0"
18
+ }
19
+ },
20
+ defaultVariants: { orientation: "vertical" }
21
+ }), C = R(
22
+ "cursor-pointer bg-transparent transition-colors duration-150 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring disabled:opacity-45 disabled:cursor-not-allowed",
23
+ {
24
+ variants: {
25
+ orientation: {
26
+ vertical: "flex items-center gap-2 py-2 px-2.5 w-full text-left whitespace-nowrap leading-tight border-l-[5px] border-r-0 border-t-0 border-b-0",
27
+ /** Icon-only row in the collapsed rail */
28
+ rail: "flex justify-center items-center py-3.5 w-full border-l-[5px] border-r-0 border-t-0 border-b-0",
29
+ // ring-inset — the steps row is an overflow-x-auto scroll container,
30
+ // which would clip an outset ring at the row's edges
31
+ horizontal: "flex items-center gap-2 h-7 px-2.5 text-sm rounded-md whitespace-nowrap border-none focus-visible:ring-inset"
32
+ },
33
+ status: {
34
+ done: "",
35
+ active: "",
36
+ todo: ""
37
+ }
38
+ },
39
+ compoundVariants: [
40
+ {
41
+ orientation: "vertical",
42
+ status: "active",
43
+ class: "border-l-sidebar-primary bg-sidebar-accent font-semibold text-sidebar-foreground shadow-sm"
44
+ },
45
+ {
46
+ orientation: "vertical",
47
+ status: "done",
48
+ class: "border-l-sidebar-border text-foreground hover:bg-sidebar-accent/50"
49
+ },
50
+ {
51
+ orientation: "vertical",
52
+ status: "todo",
53
+ class: "border-l-sidebar-border text-muted-foreground hover:bg-sidebar-accent/50"
54
+ },
55
+ { orientation: "rail", status: "active", class: "border-l-primary" },
56
+ { orientation: "rail", status: "done", class: "border-l-border" },
57
+ { orientation: "rail", status: "todo", class: "border-l-border" },
58
+ {
59
+ orientation: "horizontal",
60
+ status: "active",
61
+ class: "bg-primary/10 text-primary font-medium"
62
+ },
63
+ {
64
+ orientation: "horizontal",
65
+ status: "done",
66
+ class: "text-foreground hover:bg-accent"
67
+ },
68
+ {
69
+ orientation: "horizontal",
70
+ status: "todo",
71
+ class: "text-muted-foreground hover:bg-accent hover:text-foreground"
72
+ }
73
+ ],
74
+ defaultVariants: { orientation: "vertical", status: "todo" }
75
+ }
76
+ );
77
+ function Y(d) {
78
+ return d.flatMap((l) => [l, ...l.steps ?? []]);
79
+ }
80
+ function Z(d, l, o) {
81
+ return d.status ? d.status : o < 0 ? "todo" : l === o ? "active" : l < o ? "done" : "todo";
82
+ }
83
+ function N({
84
+ step: d,
85
+ status: l,
86
+ className: o
87
+ }) {
88
+ const c = d.icon;
89
+ return l === "done" ? /* @__PURE__ */ a(E, { className: i("w-4 h-4 text-positive", o) }) : c ? /* @__PURE__ */ a(
90
+ c,
91
+ {
92
+ className: i(
93
+ "w-4 h-4",
94
+ l === "active" ? "text-primary" : "text-muted-foreground",
95
+ o
96
+ )
97
+ }
98
+ ) : /* @__PURE__ */ a(
99
+ "div",
100
+ {
101
+ className: i(
102
+ "w-2.5 h-2.5 rounded-full",
103
+ l === "active" ? "bg-primary" : "bg-muted-foreground/40",
104
+ o
105
+ )
106
+ }
107
+ );
108
+ }
109
+ function ie({
110
+ orientation: d,
111
+ steps: l,
112
+ activeKey: o,
113
+ onSelect: c,
114
+ title: k,
115
+ collapsible: u = !1,
116
+ collapsed: g,
117
+ defaultCollapsed: A = !1,
118
+ onCollapsedChange: O,
119
+ className: b,
120
+ ...h
121
+ }) {
122
+ const x = d ?? "vertical", m = P(), z = g === void 0 && m != null && m.hideNavOnCollapse, [$, B] = S.useState(A), V = g ?? (z ? m.collapsed : $), f = (e) => {
123
+ g === void 0 && (z ? m.setCollapsed(e) : B(e)), O?.(e);
124
+ }, s = Y(l), y = new Map(s.map((e, t) => [e.id, t])), D = o == null ? -1 : y.get(o) ?? -1, w = (e) => Z(e, y.get(e.id) ?? -1, D), p = (e) => {
125
+ e.disabled || c?.(e.id, e);
126
+ };
127
+ if (x === "vertical" && V)
128
+ return /* @__PURE__ */ a(
129
+ "nav",
130
+ {
131
+ "data-slot": "data-app-shell-secondary-nav",
132
+ "data-orientation": "vertical",
133
+ "data-collapsed": "true",
134
+ className: i(
135
+ "flex flex-col shrink-0 w-[46px] bg-sidebar border-r border-sidebar-border",
136
+ b
137
+ ),
138
+ ...h,
139
+ children: /* @__PURE__ */ n(Q, { children: [
140
+ /* @__PURE__ */ a("div", { className: "flex justify-center items-center h-11 shrink-0 border-b border-sidebar-border", children: /* @__PURE__ */ a(
141
+ v,
142
+ {
143
+ "data-slot": "data-app-shell-secondary-nav-toggle",
144
+ direction: "right",
145
+ label: "Expand",
146
+ onClick: () => f(!1)
147
+ }
148
+ ) }),
149
+ /* @__PURE__ */ a(
150
+ "div",
151
+ {
152
+ "data-slot": "data-app-shell-secondary-nav-items",
153
+ className: "flex flex-col overflow-y-auto",
154
+ children: s.map((e) => {
155
+ const t = w(e);
156
+ return /* @__PURE__ */ n(U, { children: [
157
+ /* @__PURE__ */ a(W, { asChild: !0, children: /* @__PURE__ */ a(
158
+ "button",
159
+ {
160
+ type: "button",
161
+ "data-slot": "data-app-shell-secondary-nav-item",
162
+ "data-status": t,
163
+ "aria-label": e.label,
164
+ "aria-current": t === "active" ? "step" : void 0,
165
+ "aria-disabled": e.disabled || void 0,
166
+ className: i(
167
+ C({ orientation: "rail", status: t }),
168
+ e.disabled && "opacity-45 cursor-not-allowed"
169
+ ),
170
+ onClick: () => p(e),
171
+ children: /* @__PURE__ */ a(N, { step: e, status: t })
172
+ }
173
+ ) }),
174
+ /* @__PURE__ */ a(X, { side: "right", children: e.disabled ? e.disabledReason ?? e.label : e.label })
175
+ ] }, e.id);
176
+ })
177
+ }
178
+ )
179
+ ] })
180
+ }
181
+ );
182
+ if (x === "horizontal" && u && V) {
183
+ const e = o == null ? void 0 : s.find((t) => t.id === o);
184
+ return /* @__PURE__ */ n(
185
+ "nav",
186
+ {
187
+ "data-slot": "data-app-shell-secondary-nav",
188
+ "data-orientation": "horizontal",
189
+ "data-collapsed": "true",
190
+ className: i("flex items-center gap-1.5 min-w-0", b),
191
+ ...h,
192
+ children: [
193
+ /* @__PURE__ */ n(
194
+ q,
195
+ {
196
+ value: o,
197
+ onValueChange: (t) => {
198
+ const r = s.find((F) => F.id === t);
199
+ r && p(r);
200
+ },
201
+ children: [
202
+ /* @__PURE__ */ a(
203
+ G,
204
+ {
205
+ "data-slot": "data-app-shell-secondary-nav-step-select",
206
+ size: "sm",
207
+ "aria-label": "Current step",
208
+ className: "h-7 min-w-0",
209
+ children: /* @__PURE__ */ a(H, { placeholder: "Select step", children: e ? `Step ${(y.get(e.id) ?? 0) + 1} · ${e.label}` : "Select step" })
210
+ }
211
+ ),
212
+ /* @__PURE__ */ a(J, { children: s.map((t, r) => /* @__PURE__ */ a(L, { value: t.id, disabled: t.disabled, children: `Step ${r + 1} · ${t.label}` }, t.id)) })
213
+ ]
214
+ }
215
+ ),
216
+ /* @__PURE__ */ a(
217
+ v,
218
+ {
219
+ "data-slot": "data-app-shell-secondary-nav-toggle",
220
+ direction: "down",
221
+ label: "Show steps",
222
+ tooltipSide: "bottom",
223
+ onClick: () => f(!1)
224
+ }
225
+ )
226
+ ]
227
+ }
228
+ );
229
+ }
230
+ if (x === "horizontal")
231
+ return /* @__PURE__ */ n(
232
+ "nav",
233
+ {
234
+ "data-slot": "data-app-shell-secondary-nav",
235
+ "data-orientation": "horizontal",
236
+ "data-collapsed": "false",
237
+ className: i(I({ orientation: "horizontal" }), b),
238
+ ...h,
239
+ children: [
240
+ /* @__PURE__ */ a(
241
+ "div",
242
+ {
243
+ "data-slot": "data-app-shell-secondary-nav-items",
244
+ className: "flex flex-row items-center gap-1 min-w-0 overflow-x-auto flex-1",
245
+ children: s.map((e, t) => {
246
+ const r = w(e);
247
+ return /* @__PURE__ */ n(S.Fragment, { children: [
248
+ t > 0 && /* @__PURE__ */ a(M, { "aria-hidden": "true", className: "w-4 h-4 shrink-0 text-muted-foreground/50" }),
249
+ /* @__PURE__ */ n(
250
+ "button",
251
+ {
252
+ type: "button",
253
+ "data-slot": "data-app-shell-secondary-nav-item",
254
+ "data-status": r,
255
+ "aria-current": r === "active" ? "step" : void 0,
256
+ title: e.disabled ? e.disabledReason ?? e.label : void 0,
257
+ className: i(
258
+ C({ orientation: "horizontal", status: r })
259
+ ),
260
+ onClick: () => p(e),
261
+ disabled: e.disabled,
262
+ children: [
263
+ /* @__PURE__ */ a(N, { step: e, status: r, className: "shrink-0" }),
264
+ /* @__PURE__ */ a("span", { children: e.label }),
265
+ e.badge != null && /* @__PURE__ */ a(j, { variant: "secondary", className: "h-4 px-1.5 text-[10px]", children: e.badge })
266
+ ]
267
+ }
268
+ )
269
+ ] }, e.id);
270
+ })
271
+ }
272
+ ),
273
+ u && /* @__PURE__ */ a(
274
+ v,
275
+ {
276
+ "data-slot": "data-app-shell-secondary-nav-toggle",
277
+ direction: "up",
278
+ label: "Collapse steps",
279
+ tooltipSide: "bottom",
280
+ className: "ml-2",
281
+ onClick: () => f(!0)
282
+ }
283
+ )
284
+ ]
285
+ }
286
+ );
287
+ const T = (e, t) => {
288
+ const r = w(e);
289
+ return /* @__PURE__ */ n(
290
+ "button",
291
+ {
292
+ type: "button",
293
+ "data-slot": "data-app-shell-secondary-nav-item",
294
+ "data-status": r,
295
+ "aria-current": r === "active" ? "step" : void 0,
296
+ title: e.disabled ? e.disabledReason ?? e.label : void 0,
297
+ className: i(
298
+ C({ orientation: "vertical", status: r }),
299
+ t && "pl-8"
300
+ ),
301
+ onClick: () => p(e),
302
+ disabled: e.disabled,
303
+ children: [
304
+ /* @__PURE__ */ a("span", { className: "flex items-center justify-center w-6 h-6 shrink-0", children: /* @__PURE__ */ a(N, { step: e, status: r }) }),
305
+ /* @__PURE__ */ a("span", { className: i("text-sm truncate min-w-0", r === "todo" && "font-light"), children: e.label }),
306
+ e.badge != null && /* @__PURE__ */ a(j, { variant: "secondary", className: "ml-auto h-4 px-1.5 text-[10px]", children: e.badge })
307
+ ]
308
+ },
309
+ e.id
310
+ );
311
+ };
312
+ return /* @__PURE__ */ n(
313
+ "nav",
314
+ {
315
+ "data-slot": "data-app-shell-secondary-nav",
316
+ "data-orientation": "vertical",
317
+ "data-collapsed": "false",
318
+ className: i(
319
+ I({ orientation: "vertical" }),
320
+ "w-[180px]",
321
+ b
322
+ ),
323
+ ...h,
324
+ children: [
325
+ (k != null || u) && /* @__PURE__ */ n(
326
+ "div",
327
+ {
328
+ "data-slot": "data-app-shell-secondary-nav-header",
329
+ className: "flex items-center gap-1.5 h-11 px-2.5 pl-4 shrink-0 text-xs font-medium text-muted-foreground whitespace-nowrap border-b border-sidebar-border",
330
+ children: [
331
+ /* @__PURE__ */ a("span", { className: "flex-1 truncate", children: k }),
332
+ u && /* @__PURE__ */ a(
333
+ v,
334
+ {
335
+ "data-slot": "data-app-shell-secondary-nav-toggle",
336
+ direction: "left",
337
+ label: "Collapse",
338
+ onClick: () => f(!0)
339
+ }
340
+ )
341
+ ]
342
+ }
343
+ ),
344
+ /* @__PURE__ */ a(
345
+ "div",
346
+ {
347
+ "data-slot": "data-app-shell-secondary-nav-items",
348
+ className: "flex flex-col overflow-y-auto",
349
+ children: l.map((e) => /* @__PURE__ */ n(S.Fragment, { children: [
350
+ T(e, !1),
351
+ e.steps?.map((t) => T(t, !0))
352
+ ] }, e.id))
353
+ }
354
+ )
355
+ ]
356
+ }
357
+ );
358
+ }
359
+ export {
360
+ ie as DataAppShellSecondaryNav,
361
+ C as dataAppShellSecondaryNavItemVariants,
362
+ I as dataAppShellSecondaryNavVariants
363
+ };
364
+ //# sourceMappingURL=SecondaryNav.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SecondaryNav.js","sources":["../../../../src/components/composed/DataAppShell/SecondaryNav.tsx"],"sourcesContent":["import { cva, type VariantProps } from \"class-variance-authority\";\nimport { Check, ChevronRight, type LucideIcon } from \"lucide-react\";\nimport * as React from \"react\";\n\nimport { ShellCollapseButton } from \"./CollapseButton\";\nimport { useOptionalDataAppShell } from \"./ShellContext\";\n\nimport { Badge } from \"@/components/ui/badge\";\nimport {\n Select,\n SelectContent,\n SelectItem,\n SelectTrigger,\n SelectValue,\n} from \"@/components/ui/select\";\nimport {\n Tooltip,\n TooltipContent,\n TooltipProvider,\n TooltipTrigger,\n} from \"@/components/ui/tooltip\";\nimport { cn } from \"@/lib/utils\";\n\n// =============================================================================\n// Types\n// =============================================================================\n\nexport type NavStepStatus = \"done\" | \"active\" | \"todo\";\n\nexport interface NavStep {\n /** Unique identifier */\n id: string;\n /** Display label */\n label: string;\n /** Lucide icon or custom React SVG component */\n icon?: LucideIcon | React.FC<React.SVGProps<SVGSVGElement>>;\n /** Optional count/status badge */\n badge?: React.ReactNode;\n /** Explicit status — overrides the linear derivation from `activeKey` */\n status?: NavStepStatus;\n /** Disables the step */\n disabled?: boolean;\n /** Tooltip/title text explaining why the step is disabled */\n disabledReason?: string;\n /** One level of nesting — child steps rendered indented under this step */\n steps?: NavStep[];\n}\n\nexport type DataAppShellSecondaryNavOrientation = \"vertical\" | \"horizontal\";\n\n// =============================================================================\n// CVA variants\n// =============================================================================\n\nconst dataAppShellSecondaryNavVariants = cva(\"shrink-0\", {\n variants: {\n orientation: {\n /** Collapsible left panel; collapses to an icon-only rail */\n vertical: \"flex flex-col bg-sidebar border-r border-sidebar-border overflow-hidden\",\n /** Wizard/stepper row rendered above the main content */\n horizontal: \"flex flex-row items-center min-w-0\",\n },\n },\n defaultVariants: { orientation: \"vertical\" },\n});\n\nconst dataAppShellSecondaryNavItemVariants = cva(\n \"cursor-pointer bg-transparent transition-colors duration-150 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring disabled:opacity-45 disabled:cursor-not-allowed\",\n {\n variants: {\n orientation: {\n vertical:\n \"flex items-center gap-2 py-2 px-2.5 w-full text-left whitespace-nowrap leading-tight border-l-[5px] border-r-0 border-t-0 border-b-0\",\n /** Icon-only row in the collapsed rail */\n rail: \"flex justify-center items-center py-3.5 w-full border-l-[5px] border-r-0 border-t-0 border-b-0\",\n // ring-inset — the steps row is an overflow-x-auto scroll container,\n // which would clip an outset ring at the row's edges\n horizontal:\n \"flex items-center gap-2 h-7 px-2.5 text-sm rounded-md whitespace-nowrap border-none focus-visible:ring-inset\",\n },\n status: {\n done: \"\",\n active: \"\",\n todo: \"\",\n },\n },\n compoundVariants: [\n {\n orientation: \"vertical\",\n status: \"active\",\n class: \"border-l-sidebar-primary bg-sidebar-accent font-semibold text-sidebar-foreground shadow-sm\",\n },\n {\n orientation: \"vertical\",\n status: \"done\",\n class: \"border-l-sidebar-border text-foreground hover:bg-sidebar-accent/50\",\n },\n {\n orientation: \"vertical\",\n status: \"todo\",\n class: \"border-l-sidebar-border text-muted-foreground hover:bg-sidebar-accent/50\",\n },\n { orientation: \"rail\", status: \"active\", class: \"border-l-primary\" },\n { orientation: \"rail\", status: \"done\", class: \"border-l-border\" },\n { orientation: \"rail\", status: \"todo\", class: \"border-l-border\" },\n {\n orientation: \"horizontal\",\n status: \"active\",\n class: \"bg-primary/10 text-primary font-medium\",\n },\n {\n orientation: \"horizontal\",\n status: \"done\",\n class: \"text-foreground hover:bg-accent\",\n },\n {\n orientation: \"horizontal\",\n status: \"todo\",\n class: \"text-muted-foreground hover:bg-accent hover:text-foreground\",\n },\n ],\n defaultVariants: { orientation: \"vertical\", status: \"todo\" },\n }\n);\n\n// =============================================================================\n// Props\n// =============================================================================\n\nexport interface DataAppShellSecondaryNavProps\n extends Omit<React.ComponentProps<\"nav\">, \"onSelect\" | \"title\">,\n VariantProps<typeof dataAppShellSecondaryNavVariants> {\n /** Step entries; one level of nesting via `steps` on a step */\n steps: NavStep[];\n /** Controlled active step id — steps before it derive `done`, after it `todo` */\n activeKey?: string;\n /** Called with the selected step id after the step resolves as enabled */\n onSelect?: (key: string, step: NavStep) => void;\n /** Panel title shown in the vertical header (e.g. \"Steps\") */\n title?: React.ReactNode;\n /** Renders the collapse toggle. Vertical collapses to an icon rail;\n * horizontal collapses to a compact step dropdown. */\n collapsible?: boolean;\n /** Controlled collapsed state. When omitted inside a `DataAppShell`, the\n * shell's single collapse state drives it (one toggle for all zones). */\n collapsed?: boolean;\n /** Uncontrolled initial collapsed state */\n defaultCollapsed?: boolean;\n /** Called when the collapse toggle flips the state */\n onCollapsedChange?: (collapsed: boolean) => void;\n}\n\n// =============================================================================\n// Status derivation\n// =============================================================================\n\n/** Depth-first flatten — parents immediately followed by their children. */\nfunction flattenSteps(steps: NavStep[]): NavStep[] {\n return steps.flatMap((step) => [step, ...(step.steps ?? [])]);\n}\n\n/**\n * Explicit `status` wins; otherwise derived linearly from `activeKey`:\n * before the active step → `done`, after it (or no active step) → `todo`.\n */\nfunction resolveStatus(step: NavStep, index: number, activeIndex: number): NavStepStatus {\n if (step.status) return step.status;\n if (activeIndex < 0) return \"todo\";\n if (index === activeIndex) return \"active\";\n return index < activeIndex ? \"done\" : \"todo\";\n}\n\n// =============================================================================\n// Step icon — status-aware (done → check)\n// =============================================================================\n\nfunction StepIcon({\n step,\n status,\n className,\n}: {\n step: NavStep;\n status: NavStepStatus;\n className?: string;\n}) {\n const Icon = step.icon;\n if (status === \"done\") {\n return <Check className={cn(\"w-4 h-4 text-positive\", className)} />;\n }\n if (Icon) {\n return (\n <Icon\n className={cn(\n \"w-4 h-4\",\n status === \"active\" ? \"text-primary\" : \"text-muted-foreground\",\n className\n )}\n />\n );\n }\n return (\n <div\n className={cn(\n \"w-2.5 h-2.5 rounded-full\",\n status === \"active\" ? \"bg-primary\" : \"bg-muted-foreground/40\",\n className\n )}\n />\n );\n}\n\n// =============================================================================\n// DataAppShellSecondaryNav\n// =============================================================================\n\n/**\n * The Data App Shell's secondary (per-page/step) nav — one `steps` model\n * rendered on either axis via `orientation`:\n *\n * - **vertical** — collapsible left panel; collapses to an icon-only rail\n * with tooltips and a ▸ expand toggle\n * - **horizontal** — wizard/stepper row above the main content\n *\n * Step status (`done` / `active` / `todo`) is derived linearly from\n * `activeKey`, or set explicitly per step. Supports one level of nesting.\n */\nfunction DataAppShellSecondaryNav({\n orientation,\n steps,\n activeKey,\n onSelect,\n title,\n collapsible = false,\n collapsed,\n defaultCollapsed = false,\n onCollapsedChange,\n className,\n ...props\n}: DataAppShellSecondaryNavProps) {\n const resolvedOrientation: DataAppShellSecondaryNavOrientation = orientation ?? \"vertical\";\n\n // Inside a DataAppShell with `hideNavOnCollapse`, the shell's single collapse\n // toggle drives this zone too (nav rail + secondary collapse together into\n // one icon rail). Otherwise the zone owns its collapse — unless explicitly\n // controlled via the `collapsed` prop, which always wins.\n const shell = useOptionalDataAppShell();\n const followShell = collapsed === undefined && shell != null && shell.hideNavOnCollapse;\n const [internalCollapsed, setInternalCollapsed] = React.useState(defaultCollapsed);\n const isCollapsed = collapsed ?? (followShell ? shell.collapsed : internalCollapsed);\n const setCollapsed = (next: boolean) => {\n if (collapsed === undefined) {\n if (followShell) shell.setCollapsed(next);\n else setInternalCollapsed(next);\n }\n onCollapsedChange?.(next);\n };\n\n const flat = flattenSteps(steps);\n const indexById = new Map(flat.map((step, index) => [step.id, index] as const));\n const activeIndex = activeKey == null ? -1 : (indexById.get(activeKey) ?? -1);\n const statusOf = (step: NavStep) =>\n resolveStatus(step, indexById.get(step.id) ?? -1, activeIndex);\n\n const handleSelect = (step: NavStep) => {\n if (step.disabled) return;\n onSelect?.(step.id, step);\n };\n\n // ── Collapsed icon rail (vertical) ───────────────────────────────────────\n if (resolvedOrientation === \"vertical\" && isCollapsed) {\n return (\n <nav\n data-slot=\"data-app-shell-secondary-nav\"\n data-orientation=\"vertical\"\n data-collapsed=\"true\"\n className={cn(\n \"flex flex-col shrink-0 w-[46px] bg-sidebar border-r border-sidebar-border\",\n className\n )}\n {...props}\n >\n <TooltipProvider>\n <div className=\"flex justify-center items-center h-11 shrink-0 border-b border-sidebar-border\">\n <ShellCollapseButton\n data-slot=\"data-app-shell-secondary-nav-toggle\"\n direction=\"right\"\n label=\"Expand\"\n onClick={() => setCollapsed(false)}\n />\n </div>\n <div\n data-slot=\"data-app-shell-secondary-nav-items\"\n className=\"flex flex-col overflow-y-auto\"\n >\n {flat.map((step) => {\n const status = statusOf(step);\n return (\n <Tooltip key={step.id}>\n <TooltipTrigger asChild>\n {/* aria-disabled (not disabled) — a disabled button gets no\n pointer/focus events, which would make the tooltip carrying\n the label/disabledReason unreachable in the icon-only rail */}\n <button\n type=\"button\"\n data-slot=\"data-app-shell-secondary-nav-item\"\n data-status={status}\n aria-label={step.label}\n aria-current={status === \"active\" ? \"step\" : undefined}\n aria-disabled={step.disabled || undefined}\n className={cn(\n dataAppShellSecondaryNavItemVariants({ orientation: \"rail\", status }),\n step.disabled && \"opacity-45 cursor-not-allowed\"\n )}\n onClick={() => handleSelect(step)}\n >\n <StepIcon step={step} status={status} />\n </button>\n </TooltipTrigger>\n <TooltipContent side=\"right\">\n {step.disabled ? (step.disabledReason ?? step.label) : step.label}\n </TooltipContent>\n </Tooltip>\n );\n })}\n </div>\n </TooltipProvider>\n </nav>\n );\n }\n\n // ── Collapsed horizontal — compact step dropdown (place in the top bar) ───\n if (resolvedOrientation === \"horizontal\" && collapsible && isCollapsed) {\n const active = activeKey == null ? undefined : flat.find((s) => s.id === activeKey);\n return (\n <nav\n data-slot=\"data-app-shell-secondary-nav\"\n data-orientation=\"horizontal\"\n data-collapsed=\"true\"\n className={cn(\"flex items-center gap-1.5 min-w-0\", className)}\n {...props}\n >\n <Select\n value={activeKey}\n onValueChange={(id) => {\n const step = flat.find((s) => s.id === id);\n if (step) handleSelect(step);\n }}\n >\n <SelectTrigger\n data-slot=\"data-app-shell-secondary-nav-step-select\"\n size=\"sm\"\n aria-label=\"Current step\"\n className=\"h-7 min-w-0\"\n >\n <SelectValue placeholder=\"Select step\">\n {active\n ? `Step ${(indexById.get(active.id) ?? 0) + 1} · ${active.label}`\n : \"Select step\"}\n </SelectValue>\n </SelectTrigger>\n <SelectContent>\n {flat.map((step, index) => (\n <SelectItem key={step.id} value={step.id} disabled={step.disabled}>\n {`Step ${index + 1} · ${step.label}`}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n <ShellCollapseButton\n data-slot=\"data-app-shell-secondary-nav-toggle\"\n direction=\"down\"\n label=\"Show steps\"\n tooltipSide=\"bottom\"\n onClick={() => setCollapsed(false)}\n />\n </nav>\n );\n }\n\n // ── Horizontal stepper ───────────────────────────────────────────────────\n if (resolvedOrientation === \"horizontal\") {\n return (\n <nav\n data-slot=\"data-app-shell-secondary-nav\"\n data-orientation=\"horizontal\"\n data-collapsed=\"false\"\n className={cn(dataAppShellSecondaryNavVariants({ orientation: \"horizontal\" }), className)}\n {...props}\n >\n <div\n data-slot=\"data-app-shell-secondary-nav-items\"\n className=\"flex flex-row items-center gap-1 min-w-0 overflow-x-auto flex-1\"\n >\n {flat.map((step, index) => {\n const status = statusOf(step);\n return (\n <React.Fragment key={step.id}>\n {index > 0 && (\n <ChevronRight aria-hidden=\"true\" className=\"w-4 h-4 shrink-0 text-muted-foreground/50\" />\n )}\n <button\n type=\"button\"\n data-slot=\"data-app-shell-secondary-nav-item\"\n data-status={status}\n aria-current={status === \"active\" ? \"step\" : undefined}\n title={step.disabled ? (step.disabledReason ?? step.label) : undefined}\n className={cn(\n dataAppShellSecondaryNavItemVariants({ orientation: \"horizontal\", status })\n )}\n onClick={() => handleSelect(step)}\n disabled={step.disabled}\n >\n <StepIcon step={step} status={status} className=\"shrink-0\" />\n <span>{step.label}</span>\n {step.badge != null && (\n <Badge variant=\"secondary\" className=\"h-4 px-1.5 text-[10px]\">\n {step.badge}\n </Badge>\n )}\n </button>\n </React.Fragment>\n );\n })}\n </div>\n {collapsible && (\n <ShellCollapseButton\n data-slot=\"data-app-shell-secondary-nav-toggle\"\n direction=\"up\"\n label=\"Collapse steps\"\n tooltipSide=\"bottom\"\n className=\"ml-2\"\n onClick={() => setCollapsed(true)}\n />\n )}\n </nav>\n );\n }\n\n // ── Vertical expanded panel ──────────────────────────────────────────────\n const renderStep = (step: NavStep, nested: boolean) => {\n const status = statusOf(step);\n return (\n <button\n type=\"button\"\n key={step.id}\n data-slot=\"data-app-shell-secondary-nav-item\"\n data-status={status}\n aria-current={status === \"active\" ? \"step\" : undefined}\n title={step.disabled ? (step.disabledReason ?? step.label) : undefined}\n className={cn(\n dataAppShellSecondaryNavItemVariants({ orientation: \"vertical\", status }),\n nested && \"pl-8\"\n )}\n onClick={() => handleSelect(step)}\n disabled={step.disabled}\n >\n <span className=\"flex items-center justify-center w-6 h-6 shrink-0\">\n <StepIcon step={step} status={status} />\n </span>\n <span className={cn(\"text-sm truncate min-w-0\", status === \"todo\" && \"font-light\")}>\n {step.label}\n </span>\n {step.badge != null && (\n <Badge variant=\"secondary\" className=\"ml-auto h-4 px-1.5 text-[10px]\">\n {step.badge}\n </Badge>\n )}\n </button>\n );\n };\n\n return (\n <nav\n data-slot=\"data-app-shell-secondary-nav\"\n data-orientation=\"vertical\"\n data-collapsed=\"false\"\n className={cn(\n dataAppShellSecondaryNavVariants({ orientation: \"vertical\" }),\n \"w-[180px]\",\n className\n )}\n {...props}\n >\n {(title != null || collapsible) && (\n <div\n data-slot=\"data-app-shell-secondary-nav-header\"\n className=\"flex items-center gap-1.5 h-11 px-2.5 pl-4 shrink-0 text-xs font-medium text-muted-foreground whitespace-nowrap border-b border-sidebar-border\"\n >\n <span className=\"flex-1 truncate\">{title}</span>\n {collapsible && (\n <ShellCollapseButton\n data-slot=\"data-app-shell-secondary-nav-toggle\"\n direction=\"left\"\n label=\"Collapse\"\n onClick={() => setCollapsed(true)}\n />\n )}\n </div>\n )}\n <div\n data-slot=\"data-app-shell-secondary-nav-items\"\n className=\"flex flex-col overflow-y-auto\"\n >\n {steps.map((step) => (\n <React.Fragment key={step.id}>\n {renderStep(step, false)}\n {step.steps?.map((child) => renderStep(child, true))}\n </React.Fragment>\n ))}\n </div>\n </nav>\n );\n}\n\nexport {\n DataAppShellSecondaryNav,\n dataAppShellSecondaryNavVariants,\n dataAppShellSecondaryNavItemVariants,\n};\n"],"names":["dataAppShellSecondaryNavVariants","cva","dataAppShellSecondaryNavItemVariants","flattenSteps","steps","step","resolveStatus","index","activeIndex","StepIcon","status","className","Icon","Check","cn","jsx","DataAppShellSecondaryNav","orientation","activeKey","onSelect","title","collapsible","collapsed","defaultCollapsed","onCollapsedChange","props","resolvedOrientation","shell","useOptionalDataAppShell","followShell","internalCollapsed","setInternalCollapsed","React","isCollapsed","setCollapsed","next","flat","indexById","statusOf","handleSelect","TooltipProvider","ShellCollapseButton","Tooltip","TooltipTrigger","TooltipContent","active","s","jsxs","Select","id","SelectTrigger","SelectValue","SelectContent","SelectItem","ChevronRight","Badge","renderStep","nested","child"],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const l=require("react/jsx-runtime"),u=require("react");function p(e){const t=Object.create(null,{[Symbol.toStringTag]:{value:"Module"}});if(e){for(const n in e)if(n!=="default"){const o=Object.getOwnPropertyDescriptor(e,n);Object.defineProperty(t,n,o.get?o:{enumerable:!0,get:()=>e[n]})}}return t.default=e,Object.freeze(t)}const r=p(u),a=r.createContext(null);function c({value:e,children:t}){return l.jsx(a.Provider,{value:e,children:t})}function i(){const e=r.useContext(a);if(!e)throw new Error("useDataAppShell must be used within a DataAppShell");return e}function s(){return r.useContext(a)}exports.DataAppShellProvider=c;exports.useDataAppShell=i;exports.useOptionalDataAppShell=s;
2
+ //# sourceMappingURL=ShellContext.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ShellContext.cjs","sources":["../../../../src/components/composed/DataAppShell/ShellContext.tsx"],"sourcesContent":["\"use client\";\n\nimport * as React from \"react\";\n\n// =============================================================================\n// ShellContext — the AppShell publishes layout state; zone children consume it\n// =============================================================================\n\nexport type DataAppShellNavVariant = \"vertical\" | \"horizontal\";\n\nexport interface DataAppShellContextValue {\n /** Which axis the primary nav renders on. */\n navVariant: DataAppShellNavVariant;\n /** The shell's single collapse state — primary + secondary collapse together. */\n collapsed: boolean;\n /** Flip the shell collapse state (no-op when the shell is not collapsible). */\n setCollapsed: (collapsed: boolean) => void;\n /** When true, collapsing hides the primary rail so one icon rail remains. */\n hideNavOnCollapse: boolean;\n}\n\nconst DataAppShellContext = React.createContext<DataAppShellContextValue | null>(null);\n\nexport function DataAppShellProvider({\n value,\n children,\n}: {\n value: DataAppShellContextValue;\n children: React.ReactNode;\n}) {\n return <DataAppShellContext.Provider value={value}>{children}</DataAppShellContext.Provider>;\n}\n\n/** Shell layout state; throws outside a `DataAppShell`. */\nexport function useDataAppShell(): DataAppShellContextValue {\n const ctx = React.useContext(DataAppShellContext);\n if (!ctx) throw new Error(\"useDataAppShell must be used within a DataAppShell\");\n return ctx;\n}\n\n/** Shell layout state, or `null` when rendered outside a `DataAppShell`. */\nexport function useOptionalDataAppShell(): DataAppShellContextValue | null {\n return React.useContext(DataAppShellContext);\n}\n"],"names":["DataAppShellContext","React","DataAppShellProvider","value","children","jsx","useDataAppShell","ctx","useOptionalDataAppShell"],"mappings":"kaAqBMA,EAAsBC,EAAM,cAA+C,IAAI,EAE9E,SAASC,EAAqB,CACnC,MAAAC,EACA,SAAAC,CACF,EAGG,CACD,OAAOC,EAAAA,IAACL,EAAoB,SAApB,CAA6B,MAAAG,EAAe,SAAAC,CAAA,CAAS,CAC/D,CAGO,SAASE,GAA4C,CAC1D,MAAMC,EAAMN,EAAM,WAAWD,CAAmB,EAChD,GAAI,CAACO,EAAK,MAAM,IAAI,MAAM,oDAAoD,EAC9E,OAAOA,CACT,CAGO,SAASC,GAA2D,CACzE,OAAOP,EAAM,WAAWD,CAAmB,CAC7C"}
@@ -0,0 +1,23 @@
1
+ import { jsx as o } from "react/jsx-runtime";
2
+ import * as e from "react";
3
+ const r = e.createContext(null);
4
+ function p({
5
+ value: t,
6
+ children: n
7
+ }) {
8
+ return /* @__PURE__ */ o(r.Provider, { value: t, children: n });
9
+ }
10
+ function l() {
11
+ const t = e.useContext(r);
12
+ if (!t) throw new Error("useDataAppShell must be used within a DataAppShell");
13
+ return t;
14
+ }
15
+ function u() {
16
+ return e.useContext(r);
17
+ }
18
+ export {
19
+ p as DataAppShellProvider,
20
+ l as useDataAppShell,
21
+ u as useOptionalDataAppShell
22
+ };
23
+ //# sourceMappingURL=ShellContext.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ShellContext.js","sources":["../../../../src/components/composed/DataAppShell/ShellContext.tsx"],"sourcesContent":["\"use client\";\n\nimport * as React from \"react\";\n\n// =============================================================================\n// ShellContext — the AppShell publishes layout state; zone children consume it\n// =============================================================================\n\nexport type DataAppShellNavVariant = \"vertical\" | \"horizontal\";\n\nexport interface DataAppShellContextValue {\n /** Which axis the primary nav renders on. */\n navVariant: DataAppShellNavVariant;\n /** The shell's single collapse state — primary + secondary collapse together. */\n collapsed: boolean;\n /** Flip the shell collapse state (no-op when the shell is not collapsible). */\n setCollapsed: (collapsed: boolean) => void;\n /** When true, collapsing hides the primary rail so one icon rail remains. */\n hideNavOnCollapse: boolean;\n}\n\nconst DataAppShellContext = React.createContext<DataAppShellContextValue | null>(null);\n\nexport function DataAppShellProvider({\n value,\n children,\n}: {\n value: DataAppShellContextValue;\n children: React.ReactNode;\n}) {\n return <DataAppShellContext.Provider value={value}>{children}</DataAppShellContext.Provider>;\n}\n\n/** Shell layout state; throws outside a `DataAppShell`. */\nexport function useDataAppShell(): DataAppShellContextValue {\n const ctx = React.useContext(DataAppShellContext);\n if (!ctx) throw new Error(\"useDataAppShell must be used within a DataAppShell\");\n return ctx;\n}\n\n/** Shell layout state, or `null` when rendered outside a `DataAppShell`. */\nexport function useOptionalDataAppShell(): DataAppShellContextValue | null {\n return React.useContext(DataAppShellContext);\n}\n"],"names":["DataAppShellContext","React","DataAppShellProvider","value","children","jsx","useDataAppShell","ctx","useOptionalDataAppShell"],"mappings":";;AAqBA,MAAMA,IAAsBC,EAAM,cAA+C,IAAI;AAE9E,SAASC,EAAqB;AAAA,EACnC,OAAAC;AAAA,EACA,UAAAC;AACF,GAGG;AACD,SAAO,gBAAAC,EAACL,EAAoB,UAApB,EAA6B,OAAAG,GAAe,UAAAC,EAAA,CAAS;AAC/D;AAGO,SAASE,IAA4C;AAC1D,QAAMC,IAAMN,EAAM,WAAWD,CAAmB;AAChD,MAAI,CAACO,EAAK,OAAM,IAAI,MAAM,oDAAoD;AAC9E,SAAOA;AACT;AAGO,SAASC,IAA2D;AACzE,SAAOP,EAAM,WAAWD,CAAmB;AAC7C;"}
@@ -0,0 +1,2 @@
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const n=require("react/jsx-runtime"),R=require("lucide-react"),S=require("react"),q=require("./rdkit-loader.cjs"),D=require("./use-rdkit.cjs"),N=require("../../ui/skeleton.cjs"),z=require("../../../hooks/use-is-dark.cjs"),I=require("../../../lib/utils.cjs");function M(e){const t=Object.create(null,{[Symbol.toStringTag]:{value:"Module"}});if(e){for(const r in e)if(r!=="default"){const l=Object.getOwnPropertyDescriptor(e,r);Object.defineProperty(t,r,l.get?l:{enumerable:!0,get:()=>e[r]})}}return t.default=e,Object.freeze(t)}const c=M(S),h=300;function _(e){return e.replace(/width=(['"])[^'"]*\1/,"width='100%'").replace(/height=(['"])[^'"]*\1/,"height='100%'")}function O({smiles:e,label:t,dark:r,alt:l,drawOptions:d,loadingContent:j,errorContent:k,onError:f,className:x,...p}){const{rdkit:a,status:s}=D.useRDKit(),v=z.useIsDark(),g=r??v,u=l??t??e,m=c.useRef(f);c.useEffect(()=>{m.current=f});const i=c.useMemo(()=>{if(!a)return null;const b=q.moleculeToSvg(a,e,{width:h,height:h,dark:g,legend:t,drawOptions:d});return b===null?null:_(b)},[a,e,g,t,d]),o=s==="ready"&&i===null,y=s==="error"||o;return c.useEffect(()=>{o&&m.current?.(e)},[o,e]),n.jsxs("div",{"data-slot":"molecule-structure",className:I.cn("relative flex items-center justify-center",x),title:u,"aria-busy":s==="loading",...p,children:[s==="loading"&&(j??n.jsx(N.Skeleton,{role:"img","aria-label":`Loading structure: ${u}`,className:"size-full rounded-md"})),y&&(k??n.jsxs("div",{role:"img","aria-label":`Unable to render structure: ${u}`,className:"flex size-full flex-col items-center justify-center gap-1 rounded-md border border-dashed border-border p-2 text-center text-muted-foreground",children:[n.jsx(R.AlertTriangleIcon,{className:"size-4 shrink-0","aria-hidden":!0}),n.jsx("span",{className:"text-2xs leading-tight break-all",children:"Invalid structure"})]})),s==="ready"&&i!==null&&n.jsx("div",{role:"img","aria-label":u,className:"size-full [&>svg]:size-full",dangerouslySetInnerHTML:{__html:i}})]})}exports.MoleculeStructure=O;
2
+ //# sourceMappingURL=MoleculeStructure.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"MoleculeStructure.cjs","sources":["../../../../src/components/composed/MoleculeStructure/MoleculeStructure.tsx"],"sourcesContent":["import { AlertTriangleIcon } from \"lucide-react\"\nimport * as React from \"react\"\n\nimport { moleculeToSvg } from \"./rdkit-loader\"\nimport { useRDKit } from \"./use-rdkit\"\n\nimport { Skeleton } from \"@/components/ui/skeleton\"\nimport { useIsDark } from \"@/hooks/use-is-dark\"\nimport { cn } from \"@/lib/utils\"\n\nexport interface MoleculeStructureProps\n extends Omit<React.ComponentProps<\"div\">, \"children\" | \"onError\"> {\n /** SMILES string to render as a 2D structure. */\n smiles: string\n /** Optional caption drawn beneath the structure by RDKit. */\n label?: string\n /**\n * Force dark/light drawing colours. Defaults to following the active theme\n * (the `.dark` class on the document root).\n */\n dark?: boolean\n /**\n * Accessible label for the structure. Defaults to the SMILES string.\n * Rendered as the SVG group's `aria-label` and the wrapper's title.\n */\n alt?: string\n /**\n * Extra RDKit MolDraw2D options. Pass a stable (memoised or module-level)\n * reference — a new object each render re-parses the SMILES through RDKit.\n */\n drawOptions?: Record<string, unknown>\n /** Rendered while the WASM module and structure are being prepared. */\n loadingContent?: React.ReactNode\n /** Rendered when the SMILES is invalid or RDKit fails to load. */\n errorContent?: React.ReactNode\n /** Called once when the SMILES cannot be parsed into a valid molecule. */\n onError?: (smiles: string) => void\n}\n\n/**\n * Internal draw resolution. The structure is vector and scales to fill the\n * wrapper (see {@link makeResponsive}); a square viewBox keeps it centred in\n * containers of any shape without distortion.\n */\nconst DRAW_SIZE = 300\n\n/** Make an RDKit SVG fluid: fill the wrapper and scale with its aspect ratio. */\nfunction makeResponsive(svg: string): string {\n return svg\n .replace(/width=(['\"])[^'\"]*\\1/, `width='100%'`)\n .replace(/height=(['\"])[^'\"]*\\1/, `height='100%'`)\n}\n\n/**\n * Core cheminformatics primitive: render a 2D chemical structure from a SMILES\n * string. RDKit's WASM module is loaded lazily on first mount (see\n * {@link loadRDKit}), so pages that never render a molecule pay nothing for it.\n *\n * The output is a vector SVG that fills this component's box — size it with\n * `className` (e.g. `className=\"size-32\"`). Invalid SMILES render a fallback\n * rather than throwing.\n *\n * @example\n * ```tsx\n * <MoleculeStructure smiles=\"CC(=O)Oc1ccccc1C(=O)O\" className=\"size-40\" />\n * ```\n */\nexport function MoleculeStructure({\n smiles,\n label,\n dark,\n alt,\n drawOptions,\n loadingContent,\n errorContent,\n onError,\n className,\n ...props\n}: MoleculeStructureProps) {\n const { rdkit, status } = useRDKit()\n const isDark = useIsDark()\n const useDark = dark ?? isDark\n\n const accessibleName = alt ?? label ?? smiles\n const onErrorRef = React.useRef(onError)\n React.useEffect(() => {\n onErrorRef.current = onError\n })\n\n // Kept pure: the memo only computes the SVG (or null on a parse failure) and\n // never has side effects, so a render React discards (concurrent / offscreen)\n // can't fire onError.\n const svg = React.useMemo(() => {\n if (!rdkit) return null\n const drawn = moleculeToSvg(rdkit, smiles, {\n width: DRAW_SIZE,\n height: DRAW_SIZE,\n dark: useDark,\n legend: label,\n drawOptions,\n })\n return drawn === null ? null : makeResponsive(drawn)\n }, [rdkit, smiles, useDark, label, drawOptions])\n\n const parseFailed = status === \"ready\" && svg === null\n const failed = status === \"error\" || parseFailed\n\n // Report a parse failure as an effect keyed on the outcome, so onError fires\n // once per bad input rather than on every (possibly discarded) render.\n React.useEffect(() => {\n if (parseFailed) onErrorRef.current?.(smiles)\n }, [parseFailed, smiles])\n\n return (\n <div\n data-slot=\"molecule-structure\"\n className={cn(\"relative flex items-center justify-center\", className)}\n title={accessibleName}\n aria-busy={status === \"loading\"}\n {...props}\n >\n {status === \"loading\" &&\n (loadingContent ?? (\n <Skeleton\n role=\"img\"\n aria-label={`Loading structure: ${accessibleName}`}\n className=\"size-full rounded-md\"\n />\n ))}\n\n {failed &&\n (errorContent ?? (\n <div\n role=\"img\"\n aria-label={`Unable to render structure: ${accessibleName}`}\n className=\"flex size-full flex-col items-center justify-center gap-1 rounded-md border border-dashed border-border p-2 text-center text-muted-foreground\"\n >\n <AlertTriangleIcon className=\"size-4 shrink-0\" aria-hidden />\n <span className=\"text-2xs leading-tight break-all\">\n Invalid structure\n </span>\n </div>\n ))}\n\n {status === \"ready\" && svg !== null && (\n <div\n // RDKit emits the SVG markup itself; the SMILES is only ever parsed\n // into a molecule, never echoed into the DOM. The consumer-supplied\n // `label` is drawn by RDKit as vector glyph paths (not live text), so\n // it can't carry markup into the DOM either — this is trusted.\n role=\"img\"\n aria-label={accessibleName}\n className=\"size-full [&>svg]:size-full\"\n dangerouslySetInnerHTML={{ __html: svg }}\n />\n )}\n </div>\n )\n}\n"],"names":["DRAW_SIZE","makeResponsive","svg","MoleculeStructure","smiles","label","dark","alt","drawOptions","loadingContent","errorContent","onError","className","props","rdkit","status","useRDKit","isDark","useIsDark","useDark","accessibleName","onErrorRef","React","drawn","moleculeToSvg","parseFailed","failed","jsxs","cn","jsx","Skeleton","AlertTriangleIcon"],"mappings":"4mBA4CMA,EAAY,IAGlB,SAASC,EAAeC,EAAqB,CAC3C,OAAOA,EACJ,QAAQ,uBAAwB,cAAc,EAC9C,QAAQ,wBAAyB,eAAe,CACrD,CAgBO,SAASC,EAAkB,CAChC,OAAAC,EACA,MAAAC,EACA,KAAAC,EACA,IAAAC,EACA,YAAAC,EACA,eAAAC,EACA,aAAAC,EACA,QAAAC,EACA,UAAAC,EACA,GAAGC,CACL,EAA2B,CACzB,KAAM,CAAE,MAAAC,EAAO,OAAAC,CAAA,EAAWC,WAAA,EACpBC,EAASC,EAAAA,UAAA,EACTC,EAAUb,GAAQW,EAElBG,EAAiBb,GAAOF,GAASD,EACjCiB,EAAaC,EAAM,OAAOX,CAAO,EACvCW,EAAM,UAAU,IAAM,CACpBD,EAAW,QAAUV,CACvB,CAAC,EAKD,MAAMT,EAAMoB,EAAM,QAAQ,IAAM,CAC9B,GAAI,CAACR,EAAO,OAAO,KACnB,MAAMS,EAAQC,EAAAA,cAAcV,EAAOV,EAAQ,CACzC,MAAOJ,EACP,OAAQA,EACR,KAAMmB,EACN,OAAQd,EACR,YAAAG,CAAA,CACD,EACD,OAAOe,IAAU,KAAO,KAAOtB,EAAesB,CAAK,CACrD,EAAG,CAACT,EAAOV,EAAQe,EAASd,EAAOG,CAAW,CAAC,EAEzCiB,EAAcV,IAAW,SAAWb,IAAQ,KAC5CwB,EAASX,IAAW,SAAWU,EAIrCH,OAAAA,EAAM,UAAU,IAAM,CAChBG,GAAaJ,EAAW,UAAUjB,CAAM,CAC9C,EAAG,CAACqB,EAAarB,CAAM,CAAC,EAGtBuB,EAAAA,KAAC,MAAA,CACC,YAAU,qBACV,UAAWC,EAAAA,GAAG,4CAA6ChB,CAAS,EACpE,MAAOQ,EACP,YAAWL,IAAW,UACrB,GAAGF,EAEH,SAAA,CAAAE,IAAW,YACTN,GACCoB,EAAAA,IAACC,EAAAA,SAAA,CACC,KAAK,MACL,aAAY,sBAAsBV,CAAc,GAChD,UAAU,sBAAA,CAAA,GAIfM,IACEhB,GACCiB,EAAAA,KAAC,MAAA,CACC,KAAK,MACL,aAAY,+BAA+BP,CAAc,GACzD,UAAU,gJAEV,SAAA,CAAAS,EAAAA,IAACE,EAAAA,kBAAA,CAAkB,UAAU,kBAAkB,cAAW,GAAC,EAC3DF,EAAAA,IAAC,OAAA,CAAK,UAAU,mCAAmC,SAAA,mBAAA,CAEnD,CAAA,CAAA,CAAA,GAILd,IAAW,SAAWb,IAAQ,MAC7B2B,EAAAA,IAAC,MAAA,CAKC,KAAK,MACL,aAAYT,EACZ,UAAU,8BACV,wBAAyB,CAAE,OAAQlB,CAAA,CAAI,CAAA,CACzC,CAAA,CAAA,CAIR"}
@@ -0,0 +1,87 @@
1
+ import { jsxs as g, jsx as l } from "react/jsx-runtime";
2
+ import { AlertTriangleIcon as z } from "lucide-react";
3
+ import * as a from "react";
4
+ import { moleculeToSvg as D } from "./rdkit-loader.js";
5
+ import { useRDKit as I } from "./use-rdkit.js";
6
+ import { Skeleton as S } from "../../ui/skeleton.js";
7
+ import { useIsDark as j } from "../../../hooks/use-is-dark.js";
8
+ import { cn as w } from "../../../lib/utils.js";
9
+ const h = 300;
10
+ function E(e) {
11
+ return e.replace(/width=(['"])[^'"]*\1/, "width='100%'").replace(/height=(['"])[^'"]*\1/, "height='100%'");
12
+ }
13
+ function H({
14
+ smiles: e,
15
+ label: n,
16
+ dark: p,
17
+ alt: x,
18
+ drawOptions: u,
19
+ loadingContent: b,
20
+ errorContent: k,
21
+ onError: c,
22
+ className: v,
23
+ ...N
24
+ }) {
25
+ const { rdkit: o, status: r } = I(), y = j(), d = p ?? y, t = x ?? n ?? e, m = a.useRef(c);
26
+ a.useEffect(() => {
27
+ m.current = c;
28
+ });
29
+ const s = a.useMemo(() => {
30
+ if (!o) return null;
31
+ const f = D(o, e, {
32
+ width: h,
33
+ height: h,
34
+ dark: d,
35
+ legend: n,
36
+ drawOptions: u
37
+ });
38
+ return f === null ? null : E(f);
39
+ }, [o, e, d, n, u]), i = r === "ready" && s === null, R = r === "error" || i;
40
+ return a.useEffect(() => {
41
+ i && m.current?.(e);
42
+ }, [i, e]), /* @__PURE__ */ g(
43
+ "div",
44
+ {
45
+ "data-slot": "molecule-structure",
46
+ className: w("relative flex items-center justify-center", v),
47
+ title: t,
48
+ "aria-busy": r === "loading",
49
+ ...N,
50
+ children: [
51
+ r === "loading" && (b ?? /* @__PURE__ */ l(
52
+ S,
53
+ {
54
+ role: "img",
55
+ "aria-label": `Loading structure: ${t}`,
56
+ className: "size-full rounded-md"
57
+ }
58
+ )),
59
+ R && (k ?? /* @__PURE__ */ g(
60
+ "div",
61
+ {
62
+ role: "img",
63
+ "aria-label": `Unable to render structure: ${t}`,
64
+ className: "flex size-full flex-col items-center justify-center gap-1 rounded-md border border-dashed border-border p-2 text-center text-muted-foreground",
65
+ children: [
66
+ /* @__PURE__ */ l(z, { className: "size-4 shrink-0", "aria-hidden": !0 }),
67
+ /* @__PURE__ */ l("span", { className: "text-2xs leading-tight break-all", children: "Invalid structure" })
68
+ ]
69
+ }
70
+ )),
71
+ r === "ready" && s !== null && /* @__PURE__ */ l(
72
+ "div",
73
+ {
74
+ role: "img",
75
+ "aria-label": t,
76
+ className: "size-full [&>svg]:size-full",
77
+ dangerouslySetInnerHTML: { __html: s }
78
+ }
79
+ )
80
+ ]
81
+ }
82
+ );
83
+ }
84
+ export {
85
+ H as MoleculeStructure
86
+ };
87
+ //# sourceMappingURL=MoleculeStructure.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"MoleculeStructure.js","sources":["../../../../src/components/composed/MoleculeStructure/MoleculeStructure.tsx"],"sourcesContent":["import { AlertTriangleIcon } from \"lucide-react\"\nimport * as React from \"react\"\n\nimport { moleculeToSvg } from \"./rdkit-loader\"\nimport { useRDKit } from \"./use-rdkit\"\n\nimport { Skeleton } from \"@/components/ui/skeleton\"\nimport { useIsDark } from \"@/hooks/use-is-dark\"\nimport { cn } from \"@/lib/utils\"\n\nexport interface MoleculeStructureProps\n extends Omit<React.ComponentProps<\"div\">, \"children\" | \"onError\"> {\n /** SMILES string to render as a 2D structure. */\n smiles: string\n /** Optional caption drawn beneath the structure by RDKit. */\n label?: string\n /**\n * Force dark/light drawing colours. Defaults to following the active theme\n * (the `.dark` class on the document root).\n */\n dark?: boolean\n /**\n * Accessible label for the structure. Defaults to the SMILES string.\n * Rendered as the SVG group's `aria-label` and the wrapper's title.\n */\n alt?: string\n /**\n * Extra RDKit MolDraw2D options. Pass a stable (memoised or module-level)\n * reference — a new object each render re-parses the SMILES through RDKit.\n */\n drawOptions?: Record<string, unknown>\n /** Rendered while the WASM module and structure are being prepared. */\n loadingContent?: React.ReactNode\n /** Rendered when the SMILES is invalid or RDKit fails to load. */\n errorContent?: React.ReactNode\n /** Called once when the SMILES cannot be parsed into a valid molecule. */\n onError?: (smiles: string) => void\n}\n\n/**\n * Internal draw resolution. The structure is vector and scales to fill the\n * wrapper (see {@link makeResponsive}); a square viewBox keeps it centred in\n * containers of any shape without distortion.\n */\nconst DRAW_SIZE = 300\n\n/** Make an RDKit SVG fluid: fill the wrapper and scale with its aspect ratio. */\nfunction makeResponsive(svg: string): string {\n return svg\n .replace(/width=(['\"])[^'\"]*\\1/, `width='100%'`)\n .replace(/height=(['\"])[^'\"]*\\1/, `height='100%'`)\n}\n\n/**\n * Core cheminformatics primitive: render a 2D chemical structure from a SMILES\n * string. RDKit's WASM module is loaded lazily on first mount (see\n * {@link loadRDKit}), so pages that never render a molecule pay nothing for it.\n *\n * The output is a vector SVG that fills this component's box — size it with\n * `className` (e.g. `className=\"size-32\"`). Invalid SMILES render a fallback\n * rather than throwing.\n *\n * @example\n * ```tsx\n * <MoleculeStructure smiles=\"CC(=O)Oc1ccccc1C(=O)O\" className=\"size-40\" />\n * ```\n */\nexport function MoleculeStructure({\n smiles,\n label,\n dark,\n alt,\n drawOptions,\n loadingContent,\n errorContent,\n onError,\n className,\n ...props\n}: MoleculeStructureProps) {\n const { rdkit, status } = useRDKit()\n const isDark = useIsDark()\n const useDark = dark ?? isDark\n\n const accessibleName = alt ?? label ?? smiles\n const onErrorRef = React.useRef(onError)\n React.useEffect(() => {\n onErrorRef.current = onError\n })\n\n // Kept pure: the memo only computes the SVG (or null on a parse failure) and\n // never has side effects, so a render React discards (concurrent / offscreen)\n // can't fire onError.\n const svg = React.useMemo(() => {\n if (!rdkit) return null\n const drawn = moleculeToSvg(rdkit, smiles, {\n width: DRAW_SIZE,\n height: DRAW_SIZE,\n dark: useDark,\n legend: label,\n drawOptions,\n })\n return drawn === null ? null : makeResponsive(drawn)\n }, [rdkit, smiles, useDark, label, drawOptions])\n\n const parseFailed = status === \"ready\" && svg === null\n const failed = status === \"error\" || parseFailed\n\n // Report a parse failure as an effect keyed on the outcome, so onError fires\n // once per bad input rather than on every (possibly discarded) render.\n React.useEffect(() => {\n if (parseFailed) onErrorRef.current?.(smiles)\n }, [parseFailed, smiles])\n\n return (\n <div\n data-slot=\"molecule-structure\"\n className={cn(\"relative flex items-center justify-center\", className)}\n title={accessibleName}\n aria-busy={status === \"loading\"}\n {...props}\n >\n {status === \"loading\" &&\n (loadingContent ?? (\n <Skeleton\n role=\"img\"\n aria-label={`Loading structure: ${accessibleName}`}\n className=\"size-full rounded-md\"\n />\n ))}\n\n {failed &&\n (errorContent ?? (\n <div\n role=\"img\"\n aria-label={`Unable to render structure: ${accessibleName}`}\n className=\"flex size-full flex-col items-center justify-center gap-1 rounded-md border border-dashed border-border p-2 text-center text-muted-foreground\"\n >\n <AlertTriangleIcon className=\"size-4 shrink-0\" aria-hidden />\n <span className=\"text-2xs leading-tight break-all\">\n Invalid structure\n </span>\n </div>\n ))}\n\n {status === \"ready\" && svg !== null && (\n <div\n // RDKit emits the SVG markup itself; the SMILES is only ever parsed\n // into a molecule, never echoed into the DOM. The consumer-supplied\n // `label` is drawn by RDKit as vector glyph paths (not live text), so\n // it can't carry markup into the DOM either — this is trusted.\n role=\"img\"\n aria-label={accessibleName}\n className=\"size-full [&>svg]:size-full\"\n dangerouslySetInnerHTML={{ __html: svg }}\n />\n )}\n </div>\n )\n}\n"],"names":["DRAW_SIZE","makeResponsive","svg","MoleculeStructure","smiles","label","dark","alt","drawOptions","loadingContent","errorContent","onError","className","props","rdkit","status","useRDKit","isDark","useIsDark","useDark","accessibleName","onErrorRef","React","drawn","moleculeToSvg","parseFailed","failed","jsxs","cn","jsx","Skeleton","AlertTriangleIcon"],"mappings":";;;;;;;;AA4CA,MAAMA,IAAY;AAGlB,SAASC,EAAeC,GAAqB;AAC3C,SAAOA,EACJ,QAAQ,wBAAwB,cAAc,EAC9C,QAAQ,yBAAyB,eAAe;AACrD;AAgBO,SAASC,EAAkB;AAAA,EAChC,QAAAC;AAAA,EACA,OAAAC;AAAA,EACA,MAAAC;AAAA,EACA,KAAAC;AAAA,EACA,aAAAC;AAAA,EACA,gBAAAC;AAAA,EACA,cAAAC;AAAA,EACA,SAAAC;AAAA,EACA,WAAAC;AAAA,EACA,GAAGC;AACL,GAA2B;AACzB,QAAM,EAAE,OAAAC,GAAO,QAAAC,EAAA,IAAWC,EAAA,GACpBC,IAASC,EAAA,GACTC,IAAUb,KAAQW,GAElBG,IAAiBb,KAAOF,KAASD,GACjCiB,IAAaC,EAAM,OAAOX,CAAO;AACvC,EAAAW,EAAM,UAAU,MAAM;AACpB,IAAAD,EAAW,UAAUV;AAAA,EACvB,CAAC;AAKD,QAAMT,IAAMoB,EAAM,QAAQ,MAAM;AAC9B,QAAI,CAACR,EAAO,QAAO;AACnB,UAAMS,IAAQC,EAAcV,GAAOV,GAAQ;AAAA,MACzC,OAAOJ;AAAA,MACP,QAAQA;AAAA,MACR,MAAMmB;AAAA,MACN,QAAQd;AAAA,MACR,aAAAG;AAAA,IAAA,CACD;AACD,WAAOe,MAAU,OAAO,OAAOtB,EAAesB,CAAK;AAAA,EACrD,GAAG,CAACT,GAAOV,GAAQe,GAASd,GAAOG,CAAW,CAAC,GAEzCiB,IAAcV,MAAW,WAAWb,MAAQ,MAC5CwB,IAASX,MAAW,WAAWU;AAIrC,SAAAH,EAAM,UAAU,MAAM;AACpB,IAAIG,KAAaJ,EAAW,UAAUjB,CAAM;AAAA,EAC9C,GAAG,CAACqB,GAAarB,CAAM,CAAC,GAGtB,gBAAAuB;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,aAAU;AAAA,MACV,WAAWC,EAAG,6CAA6ChB,CAAS;AAAA,MACpE,OAAOQ;AAAA,MACP,aAAWL,MAAW;AAAA,MACrB,GAAGF;AAAA,MAEH,UAAA;AAAA,QAAAE,MAAW,cACTN,KACC,gBAAAoB;AAAA,UAACC;AAAA,UAAA;AAAA,YACC,MAAK;AAAA,YACL,cAAY,sBAAsBV,CAAc;AAAA,YAChD,WAAU;AAAA,UAAA;AAAA,QAAA;AAAA,QAIfM,MACEhB,KACC,gBAAAiB;AAAA,UAAC;AAAA,UAAA;AAAA,YACC,MAAK;AAAA,YACL,cAAY,+BAA+BP,CAAc;AAAA,YACzD,WAAU;AAAA,YAEV,UAAA;AAAA,cAAA,gBAAAS,EAACE,GAAA,EAAkB,WAAU,mBAAkB,eAAW,IAAC;AAAA,cAC3D,gBAAAF,EAAC,QAAA,EAAK,WAAU,oCAAmC,UAAA,oBAAA,CAEnD;AAAA,YAAA;AAAA,UAAA;AAAA,QAAA;AAAA,QAILd,MAAW,WAAWb,MAAQ,QAC7B,gBAAA2B;AAAA,UAAC;AAAA,UAAA;AAAA,YAKC,MAAK;AAAA,YACL,cAAYT;AAAA,YACZ,WAAU;AAAA,YACV,yBAAyB,EAAE,QAAQlB,EAAA;AAAA,UAAI;AAAA,QAAA;AAAA,MACzC;AAAA,IAAA;AAAA,EAAA;AAIR;"}
@@ -0,0 +1,2 @@
1
+ "use strict";var m=Object.create;var u=Object.defineProperty;var p=Object.getOwnPropertyDescriptor;var y=Object.getOwnPropertyNames;var w=Object.getPrototypeOf,b=Object.prototype.hasOwnProperty;var R=(e,t,n,c)=>{if(t&&typeof t=="object"||typeof t=="function")for(let r of y(t))!b.call(e,r)&&r!==n&&u(e,r,{get:()=>t[r],enumerable:!(c=p(t,r))||c.enumerable});return e};var D=(e,t,n)=>(n=e!=null?m(w(e)):{},R(t||!e||!e.__esModule?u(n,"default",{value:e,enumerable:!0}):n,e));Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const o={};function K(e){i||Object.assign(o,e)}let i=null;async function h(){const e=await import("@rdkit/rdkit");return e.default??e}function _(){return o.instance?Promise.resolve(o.instance):i||(i=(async()=>{if(typeof window>"u"||typeof document>"u")throw new Error("RDKit can only be loaded in a browser environment");let e;try{e=await(o.importFactory??h)()}catch(t){const n=t instanceof Error?` (${t.message})`:"";throw new Error(`Failed to load @rdkit/rdkit${n}. Install it as a dependency to render molecule structures: \`yarn add @rdkit/rdkit\`.`)}return e({...o.wasmSrc?{locateFile:()=>o.wasmSrc}:{},print:t=>console.debug("[RDKit]",t),printErr:t=>console.debug("[RDKit]",t)})})(),i.catch(()=>{i=null}),i)}function E(e,t,n={}){const{width:c=250,height:r=200,dark:d=!1,legend:s,drawOptions:f}=n,l=e.get_mol(t);if(!l)return null;try{if(!l.is_valid())return null;const g={width:c,height:r,backgroundColour:[0,0,0,0],...s?{legend:s}:{},...d?{atomColourPalette:v}:{},...f};return l.get_svg_with_highlights(JSON.stringify(g)).replace(/^\s*<\?xml[^>]*\?>\s*/i,"")}finally{l.delete()}}const a=255;function O(e){return[parseInt(e.slice(1,3),16)/a,parseInt(e.slice(3,5),16)/a,parseInt(e.slice(5,7),16)/a]}const T={"-1":"#e5e5e5",6:"#e5e5e5",7:"#75a1ff",8:"#ff7575",9:"#8ceb99",15:"#ff9e59",16:"#f2cc59",17:"#8ceb99",35:"#e69e73",53:"#c499f2"},v=Object.fromEntries(Object.entries(T).map(([e,t])=>[e,O(t)]));exports.configureRDKit=K;exports.loadRDKit=_;exports.moleculeToSvg=E;
2
+ //# sourceMappingURL=rdkit-loader.cjs.map