@tetrascience-npm/tetrascience-react-ui 0.7.0-beta.129.1 → 0.7.0-beta.131.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 (1042) hide show
  1. package/README.md +49 -0
  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.d.ts +2 -0
  142. package/dist/components/ai/streamdown-plugins.d.ts +2 -0
  143. package/dist/components/ai/suggestion.d.ts +9 -0
  144. package/dist/components/ai/task.d.ts +16 -0
  145. package/dist/components/ai/tool.d.ts +33 -0
  146. package/dist/components/ai/use-streamdown-plugins.d.ts +8 -0
  147. package/dist/components/charts/AreaPlot/AreaPlot.cjs +1 -1
  148. package/dist/components/charts/AreaPlot/AreaPlot.d.ts +39 -0
  149. package/dist/components/charts/AreaPlot/index.d.ts +2 -0
  150. package/dist/components/charts/BarChart/BarChart.cjs +1 -1
  151. package/dist/components/charts/BarChart/BarChart.d.ts +44 -0
  152. package/dist/components/charts/BarChart/index.d.ts +2 -0
  153. package/dist/components/charts/BoxPlot/BoxPlot.cjs +1 -1
  154. package/dist/components/charts/BoxPlot/BoxPlot.d.ts +33 -0
  155. package/dist/components/charts/BoxPlot/index.d.ts +2 -0
  156. package/dist/components/charts/ChartTooltip/ChartTooltip.d.ts +71 -0
  157. package/dist/components/charts/ChartTooltip/index.d.ts +2 -0
  158. package/dist/components/charts/ChartTooltip/lines.d.ts +54 -0
  159. package/dist/components/charts/Chromatogram/Chromatogram.d.ts +5 -0
  160. package/dist/components/charts/Chromatogram/annotations.cjs +1 -1
  161. package/dist/components/charts/Chromatogram/annotations.d.ts +50 -0
  162. package/dist/components/charts/Chromatogram/boundaryMarkers.cjs +1 -1
  163. package/dist/components/charts/Chromatogram/boundaryMarkers.d.ts +14 -0
  164. package/dist/components/charts/Chromatogram/constants.d.ts +46 -0
  165. package/dist/components/charts/Chromatogram/dataProcessing.d.ts +49 -0
  166. package/dist/components/charts/Chromatogram/index.d.ts +2 -0
  167. package/dist/components/charts/Chromatogram/peakDetection.d.ts +33 -0
  168. package/dist/components/charts/Chromatogram/plotBuilder.d.ts +58 -0
  169. package/dist/components/charts/Chromatogram/regionOverlays.cjs +1 -1
  170. package/dist/components/charts/Chromatogram/regionOverlays.d.ts +9 -0
  171. package/dist/components/charts/Chromatogram/types.d.ts +258 -0
  172. package/dist/components/charts/Electropherogram/Electropherogram.cjs +1 -1
  173. package/dist/components/charts/Electropherogram/Electropherogram.d.ts +22 -0
  174. package/dist/components/charts/Electropherogram/index.d.ts +2 -0
  175. package/dist/components/charts/Histogram/Histogram.cjs +1 -1
  176. package/dist/components/charts/Histogram/Histogram.d.ts +36 -0
  177. package/dist/components/charts/Histogram/index.d.ts +2 -0
  178. package/dist/components/charts/LinePlot/LinePlot.cjs +1 -1
  179. package/dist/components/charts/LinePlot/LinePlot.d.ts +45 -0
  180. package/dist/components/charts/LinePlot/index.d.ts +2 -0
  181. package/dist/components/charts/PieChart/PieChart.d.ts +20 -0
  182. package/dist/components/charts/PieChart/index.d.ts +2 -0
  183. package/dist/components/charts/PlateMap/PlateMap.cjs +1 -1
  184. package/dist/components/charts/PlateMap/PlateMap.cjs.map +1 -1
  185. package/dist/components/charts/PlateMap/PlateMap.d.ts +29 -0
  186. package/dist/components/charts/PlateMap/PlateMap.js +1 -1
  187. package/dist/components/charts/PlateMap/constants.d.ts +75 -0
  188. package/dist/components/charts/PlateMap/index.d.ts +2 -0
  189. package/dist/components/charts/PlateMap/types.d.ts +322 -0
  190. package/dist/components/charts/PlateMap/utils.d.ts +133 -0
  191. package/dist/components/charts/ScatterPlot/ScatterPlot.cjs +1 -1
  192. package/dist/components/charts/ScatterPlot/ScatterPlot.d.ts +43 -0
  193. package/dist/components/charts/ScatterPlot/index.d.ts +2 -0
  194. package/dist/components/charts/ScatterPlotInteractive/ScatterPlotInteractive.d.ts +25 -0
  195. package/dist/components/charts/ScatterPlotInteractive/constants.d.ts +50 -0
  196. package/dist/components/charts/ScatterPlotInteractive/index.d.ts +3 -0
  197. package/dist/components/charts/ScatterPlotInteractive/types.d.ts +226 -0
  198. package/dist/components/charts/ScatterPlotInteractive/utils.d.ts +72 -0
  199. package/dist/components/charts/StackedChromatogram/StackedChromatogram.d.ts +3 -0
  200. package/dist/components/charts/StackedChromatogram/index.d.ts +3 -0
  201. package/dist/components/charts/StackedChromatogram/transforms.d.ts +9 -0
  202. package/dist/components/charts/StackedChromatogram/types.d.ts +26 -0
  203. package/dist/components/charts/plotly-loader.cjs +1 -1
  204. package/dist/components/charts/plotly-loader.cjs.map +1 -1
  205. package/dist/components/charts/plotly-loader.d.ts +29 -0
  206. package/dist/components/composed/AssistantLayout/AssistantLayout.cjs +1 -1
  207. package/dist/components/composed/AssistantLayout/AssistantLayout.cjs.map +1 -1
  208. package/dist/components/composed/AssistantLayout/AssistantLayout.d.ts +63 -0
  209. package/dist/components/composed/AssistantLayout/AssistantLayout.js +2 -2
  210. package/dist/components/composed/AssistantLayout/dockLayout.d.ts +15 -0
  211. package/dist/components/composed/AssistantLayout/index.d.ts +3 -0
  212. package/dist/components/composed/Chat/Chat.cjs +1 -1
  213. package/dist/components/composed/Chat/Chat.cjs.map +1 -1
  214. package/dist/components/composed/Chat/Chat.d.ts +35 -0
  215. package/dist/components/composed/Chat/Chat.js +7 -7
  216. package/dist/components/composed/Chat/index.d.ts +2 -0
  217. package/dist/components/composed/ConfirmDialog/ConfirmDialog.cjs +1 -1
  218. package/dist/components/composed/ConfirmDialog/ConfirmDialog.cjs.map +1 -1
  219. package/dist/components/composed/ConfirmDialog/ConfirmDialog.d.ts +23 -0
  220. package/dist/components/composed/ConfirmDialog/ConfirmDialog.js +4 -4
  221. package/dist/components/composed/ConfirmDialog/index.d.ts +1 -0
  222. package/dist/components/composed/DataAppShell/CollapseButton.cjs +1 -1
  223. package/dist/components/composed/DataAppShell/CollapseButton.cjs.map +1 -1
  224. package/dist/components/composed/DataAppShell/CollapseButton.d.ts +23 -0
  225. package/dist/components/composed/DataAppShell/CollapseButton.js +2 -2
  226. package/dist/components/composed/DataAppShell/DataAppShell.cjs +1 -1
  227. package/dist/components/composed/DataAppShell/DataAppShell.cjs.map +1 -1
  228. package/dist/components/composed/DataAppShell/DataAppShell.d.ts +88 -0
  229. package/dist/components/composed/DataAppShell/DataAppShell.js +5 -5
  230. package/dist/components/composed/DataAppShell/PrimaryNav.cjs +1 -1
  231. package/dist/components/composed/DataAppShell/PrimaryNav.cjs.map +1 -1
  232. package/dist/components/composed/DataAppShell/PrimaryNav.d.ts +64 -0
  233. package/dist/components/composed/DataAppShell/PrimaryNav.js +2 -2
  234. package/dist/components/composed/DataAppShell/RightPanel.cjs +1 -1
  235. package/dist/components/composed/DataAppShell/RightPanel.cjs.map +1 -1
  236. package/dist/components/composed/DataAppShell/RightPanel.d.ts +95 -0
  237. package/dist/components/composed/DataAppShell/RightPanel.js +2 -2
  238. package/dist/components/composed/DataAppShell/SecondaryNav.cjs +1 -1
  239. package/dist/components/composed/DataAppShell/SecondaryNav.cjs.map +1 -1
  240. package/dist/components/composed/DataAppShell/SecondaryNav.d.ts +63 -0
  241. package/dist/components/composed/DataAppShell/SecondaryNav.js +3 -3
  242. package/dist/components/composed/DataAppShell/ShellContext.d.ts +20 -0
  243. package/dist/components/composed/DataAppShell/index.d.ts +12 -0
  244. package/dist/components/composed/EmptyState/EmptyState.d.ts +12 -0
  245. package/dist/components/composed/EmptyState/index.d.ts +2 -0
  246. package/dist/components/composed/FormPatterns/FormSection.cjs +1 -1
  247. package/dist/components/composed/FormPatterns/FormSection.cjs.map +1 -1
  248. package/dist/components/composed/FormPatterns/FormSection.d.ts +7 -0
  249. package/dist/components/composed/FormPatterns/FormSection.js +2 -2
  250. package/dist/components/composed/FormPatterns/index.d.ts +1 -0
  251. package/dist/components/composed/MoleculeStructure/MoleculeStructure.cjs +1 -1
  252. package/dist/components/composed/MoleculeStructure/MoleculeStructure.cjs.map +1 -1
  253. package/dist/components/composed/MoleculeStructure/MoleculeStructure.d.ts +43 -0
  254. package/dist/components/composed/MoleculeStructure/MoleculeStructure.js +1 -1
  255. package/dist/components/composed/MoleculeStructure/index.d.ts +3 -0
  256. package/dist/components/composed/MoleculeStructure/rdkit-loader.cjs +1 -1
  257. package/dist/components/composed/MoleculeStructure/rdkit-loader.cjs.map +1 -1
  258. package/dist/components/composed/MoleculeStructure/rdkit-loader.d.ts +104 -0
  259. package/dist/components/composed/MoleculeStructure/use-rdkit.d.ts +29 -0
  260. package/dist/components/composed/PlateMapEditor/ManifestFilterPopover.cjs +1 -1
  261. package/dist/components/composed/PlateMapEditor/ManifestFilterPopover.cjs.map +1 -1
  262. package/dist/components/composed/PlateMapEditor/ManifestFilterPopover.d.ts +12 -0
  263. package/dist/components/composed/PlateMapEditor/ManifestFilterPopover.js +4 -4
  264. package/dist/components/composed/PlateMapEditor/PlateMapActionsMenu.cjs +1 -1
  265. package/dist/components/composed/PlateMapEditor/PlateMapActionsMenu.cjs.map +1 -1
  266. package/dist/components/composed/PlateMapEditor/PlateMapActionsMenu.d.ts +22 -0
  267. package/dist/components/composed/PlateMapEditor/PlateMapActionsMenu.js +2 -2
  268. package/dist/components/composed/PlateMapEditor/PlateMapEditor.cjs +1 -1
  269. package/dist/components/composed/PlateMapEditor/PlateMapEditor.cjs.map +1 -1
  270. package/dist/components/composed/PlateMapEditor/PlateMapEditor.d.ts +106 -0
  271. package/dist/components/composed/PlateMapEditor/PlateMapEditor.js +2 -2
  272. package/dist/components/composed/PlateMapEditor/PlateMapForm.cjs +1 -1
  273. package/dist/components/composed/PlateMapEditor/PlateMapForm.cjs.map +1 -1
  274. package/dist/components/composed/PlateMapEditor/PlateMapForm.d.ts +30 -0
  275. package/dist/components/composed/PlateMapEditor/PlateMapForm.js +1 -1
  276. package/dist/components/composed/PlateMapEditor/PlateMapGrid.cjs +1 -1
  277. package/dist/components/composed/PlateMapEditor/PlateMapGrid.cjs.map +1 -1
  278. package/dist/components/composed/PlateMapEditor/PlateMapGrid.d.ts +64 -0
  279. package/dist/components/composed/PlateMapEditor/PlateMapGrid.js +1 -1
  280. package/dist/components/composed/PlateMapEditor/PlateMapManifest.d.ts +29 -0
  281. package/dist/components/composed/PlateMapEditor/PlateMapPlateSelector.cjs +1 -1
  282. package/dist/components/composed/PlateMapEditor/PlateMapPlateSelector.cjs.map +1 -1
  283. package/dist/components/composed/PlateMapEditor/PlateMapPlateSelector.d.ts +19 -0
  284. package/dist/components/composed/PlateMapEditor/PlateMapPlateSelector.js +4 -4
  285. package/dist/components/composed/PlateMapEditor/PlatePaintGrid.d.ts +73 -0
  286. package/dist/components/composed/PlateMapEditor/PlateZoomControl.cjs +1 -1
  287. package/dist/components/composed/PlateMapEditor/PlateZoomControl.cjs.map +1 -1
  288. package/dist/components/composed/PlateMapEditor/PlateZoomControl.d.ts +12 -0
  289. package/dist/components/composed/PlateMapEditor/PlateZoomControl.js +2 -2
  290. package/dist/components/composed/PlateMapEditor/TemplateIOPanel.cjs +1 -1
  291. package/dist/components/composed/PlateMapEditor/TemplateIOPanel.cjs.map +1 -1
  292. package/dist/components/composed/PlateMapEditor/TemplateIOPanel.d.ts +13 -0
  293. package/dist/components/composed/PlateMapEditor/TemplateIOPanel.js +4 -4
  294. package/dist/components/composed/PlateMapEditor/WellLegend.cjs +1 -1
  295. package/dist/components/composed/PlateMapEditor/WellLegend.cjs.map +1 -1
  296. package/dist/components/composed/PlateMapEditor/WellLegend.d.ts +21 -0
  297. package/dist/components/composed/PlateMapEditor/WellLegend.js +2 -2
  298. package/dist/components/composed/PlateMapEditor/WellManifestTable.cjs +1 -1
  299. package/dist/components/composed/PlateMapEditor/WellManifestTable.cjs.map +1 -1
  300. package/dist/components/composed/PlateMapEditor/WellManifestTable.d.ts +46 -0
  301. package/dist/components/composed/PlateMapEditor/WellManifestTable.js +9 -9
  302. package/dist/components/composed/PlateMapEditor/WellMetadataForm.cjs +1 -1
  303. package/dist/components/composed/PlateMapEditor/WellMetadataForm.cjs.map +1 -1
  304. package/dist/components/composed/PlateMapEditor/WellMetadataForm.d.ts +17 -0
  305. package/dist/components/composed/PlateMapEditor/WellMetadataForm.js +7 -7
  306. package/dist/components/composed/PlateMapEditor/autoFill.d.ts +26 -0
  307. package/dist/components/composed/PlateMapEditor/csvPlateTriage.d.ts +4 -0
  308. package/dist/components/composed/PlateMapEditor/helpers.d.ts +2 -0
  309. package/dist/components/composed/PlateMapEditor/index.d.ts +31 -0
  310. package/dist/components/composed/PlateMapEditor/types.d.ts +137 -0
  311. package/dist/components/composed/PlateMapEditor/wellGrid.d.ts +12 -0
  312. package/dist/components/composed/ProcessFlow/ProcessFlow.d.ts +32 -0
  313. package/dist/components/composed/ProcessFlow/ProcessFlow.utils.d.ts +86 -0
  314. package/dist/components/composed/ProcessFlow/index.d.ts +1 -0
  315. package/dist/components/composed/RichListItem/RichListItem.cjs +1 -1
  316. package/dist/components/composed/RichListItem/RichListItem.cjs.map +1 -1
  317. package/dist/components/composed/RichListItem/RichListItem.d.ts +22 -0
  318. package/dist/components/composed/RichListItem/RichListItem.js +2 -2
  319. package/dist/components/composed/RichListItem/index.d.ts +2 -0
  320. package/dist/components/composed/StatCard/StatCard.cjs +1 -1
  321. package/dist/components/composed/StatCard/StatCard.cjs.map +1 -1
  322. package/dist/components/composed/StatCard/StatCard.d.ts +11 -0
  323. package/dist/components/composed/StatCard/StatCard.js +1 -1
  324. package/dist/components/composed/StatCard/index.d.ts +1 -0
  325. package/dist/components/composed/TdpSearch/TdpSearch.cjs +1 -1
  326. package/dist/components/composed/TdpSearch/TdpSearch.cjs.map +1 -1
  327. package/dist/components/composed/TdpSearch/TdpSearch.d.ts +21 -0
  328. package/dist/components/composed/TdpSearch/TdpSearch.js +14 -13
  329. package/dist/components/composed/TdpSearch/TdpSearch.mocks.d.ts +5 -0
  330. package/dist/components/composed/TdpSearch/components/DefaultFilters.cjs +1 -1
  331. package/dist/components/composed/TdpSearch/components/DefaultFilters.cjs.map +1 -1
  332. package/dist/components/composed/TdpSearch/components/DefaultFilters.d.ts +3 -0
  333. package/dist/components/composed/TdpSearch/components/DefaultFilters.js +1 -1
  334. package/dist/components/composed/TdpSearch/components/DefaultResults.cjs +1 -1
  335. package/dist/components/composed/TdpSearch/components/DefaultResults.cjs.map +1 -1
  336. package/dist/components/composed/TdpSearch/components/DefaultResults.d.ts +3 -0
  337. package/dist/components/composed/TdpSearch/components/DefaultResults.js +2 -2
  338. package/dist/components/composed/TdpSearch/components/DefaultSearchBar.cjs +1 -1
  339. package/dist/components/composed/TdpSearch/components/DefaultSearchBar.cjs.map +1 -1
  340. package/dist/components/composed/TdpSearch/components/DefaultSearchBar.d.ts +3 -0
  341. package/dist/components/composed/TdpSearch/components/DefaultSearchBar.js +2 -2
  342. package/dist/components/composed/TdpSearch/constants.d.ts +3 -0
  343. package/dist/components/composed/TdpSearch/hooks/useSearch.d.ts +2 -0
  344. package/dist/components/composed/TdpSearch/hooks/useTdpCredentials.d.ts +14 -0
  345. package/dist/components/composed/TdpSearch/index.d.ts +3 -0
  346. package/dist/components/composed/TdpSearch/types.d.ts +128 -0
  347. package/dist/components/composed/TdpSearch/utils.d.ts +3 -0
  348. package/dist/components/composed/TopBar/TopBar.d.ts +25 -0
  349. package/dist/components/composed/TopBar/index.d.ts +2 -0
  350. package/dist/components/composed/UserMenu/UserMenu.cjs +1 -1
  351. package/dist/components/composed/UserMenu/UserMenu.cjs.map +1 -1
  352. package/dist/components/composed/UserMenu/UserMenu.d.ts +53 -0
  353. package/dist/components/composed/UserMenu/UserMenu.js +2 -2
  354. package/dist/components/composed/UserMenu/index.d.ts +2 -0
  355. package/dist/components/composed/tdp-link.d.ts +110 -0
  356. package/dist/components/composed/tdp-url.d.ts +68 -0
  357. package/dist/components/ui/accordion.d.ts +7 -0
  358. package/dist/components/ui/alert-dialog.d.ts +18 -0
  359. package/dist/components/ui/alert.d.ts +10 -0
  360. package/dist/components/ui/aspect-ratio.d.ts +3 -0
  361. package/dist/components/ui/avatar.d.ts +11 -0
  362. package/dist/components/ui/badge.d.ts +9 -0
  363. package/dist/components/ui/banner.d.ts +19 -0
  364. package/dist/components/ui/breadcrumb.d.ts +11 -0
  365. package/dist/components/ui/button-group.d.ts +11 -0
  366. package/dist/components/ui/button.d.ts +10 -0
  367. package/dist/components/ui/calendar.d.ts +10 -0
  368. package/dist/components/ui/card.d.ts +11 -0
  369. package/dist/components/ui/carousel.d.ts +28 -0
  370. package/dist/components/ui/checkbox.d.ts +4 -0
  371. package/dist/components/ui/code-block.d.ts +45 -0
  372. package/dist/components/ui/code-editor.d.ts +18 -0
  373. package/dist/components/ui/collapsible.d.ts +5 -0
  374. package/dist/components/ui/combobox.d.ts +24 -0
  375. package/dist/components/ui/command.d.ts +18 -0
  376. package/dist/components/ui/context-menu.d.ts +31 -0
  377. package/dist/components/ui/data-table/data-table-column-toggle.cjs +1 -1
  378. package/dist/components/ui/data-table/data-table-column-toggle.cjs.map +1 -1
  379. package/dist/components/ui/data-table/data-table-column-toggle.d.ts +6 -0
  380. package/dist/components/ui/data-table/data-table-column-toggle.js +1 -1
  381. package/dist/components/ui/data-table/data-table-filter.cjs +1 -1
  382. package/dist/components/ui/data-table/data-table-filter.cjs.map +1 -1
  383. package/dist/components/ui/data-table/data-table-filter.d.ts +9 -0
  384. package/dist/components/ui/data-table/data-table-filter.js +3 -3
  385. package/dist/components/ui/data-table/data-table-group.cjs +1 -1
  386. package/dist/components/ui/data-table/data-table-group.cjs.map +1 -1
  387. package/dist/components/ui/data-table/data-table-group.d.ts +9 -0
  388. package/dist/components/ui/data-table/data-table-group.js +2 -2
  389. package/dist/components/ui/data-table/data-table-pagination.cjs +1 -1
  390. package/dist/components/ui/data-table/data-table-pagination.cjs.map +1 -1
  391. package/dist/components/ui/data-table/data-table-pagination.d.ts +7 -0
  392. package/dist/components/ui/data-table/data-table-pagination.js +2 -2
  393. package/dist/components/ui/data-table/data-table.cjs +1 -1
  394. package/dist/components/ui/data-table/data-table.cjs.map +1 -1
  395. package/dist/components/ui/data-table/data-table.d.ts +82 -0
  396. package/dist/components/ui/data-table/data-table.js +1 -1
  397. package/dist/components/ui/data-table/index.d.ts +5 -0
  398. package/dist/components/ui/dialog.d.ts +18 -0
  399. package/dist/components/ui/dropdown-menu.d.ts +29 -0
  400. package/dist/components/ui/field.d.ts +24 -0
  401. package/dist/components/ui/hover-card.d.ts +6 -0
  402. package/dist/components/ui/input-group.d.ts +16 -0
  403. package/dist/components/ui/input.d.ts +3 -0
  404. package/dist/components/ui/item.d.ts +23 -0
  405. package/dist/components/ui/kbd.d.ts +3 -0
  406. package/dist/components/ui/label.d.ts +4 -0
  407. package/dist/components/ui/menubar.d.ts +30 -0
  408. package/dist/components/ui/navigation-menu.d.ts +14 -0
  409. package/dist/components/ui/popover.d.ts +7 -0
  410. package/dist/components/ui/progress.d.ts +4 -0
  411. package/dist/components/ui/radio-group.d.ts +5 -0
  412. package/dist/components/ui/resizable.d.ts +25 -0
  413. package/dist/components/ui/scroll-area.d.ts +5 -0
  414. package/dist/components/ui/select.d.ts +15 -0
  415. package/dist/components/ui/separator.d.ts +4 -0
  416. package/dist/components/ui/sheet.d.ts +14 -0
  417. package/dist/components/ui/sidebar.d.ts +69 -0
  418. package/dist/components/ui/skeleton.d.ts +2 -0
  419. package/dist/components/ui/slider.d.ts +4 -0
  420. package/dist/components/ui/snippet.d.ts +18 -0
  421. package/dist/components/ui/sonner.d.ts +3 -0
  422. package/dist/components/ui/spinner.d.ts +6 -0
  423. package/dist/components/ui/switch.d.ts +6 -0
  424. package/dist/components/ui/table.d.ts +22 -0
  425. package/dist/components/ui/tabs.d.ts +11 -0
  426. package/dist/components/ui/tetra-molecule-icon.d.ts +11 -0
  427. package/dist/components/ui/tetrascience-icon.d.ts +7 -0
  428. package/dist/components/ui/textarea.d.ts +3 -0
  429. package/dist/components/ui/toggle-group.d.ts +10 -0
  430. package/dist/components/ui/toggle.d.ts +9 -0
  431. package/dist/components/ui/tooltip.d.ts +7 -0
  432. package/dist/composed/AssistantLayout.cjs +2 -0
  433. package/dist/composed/AssistantLayout.cjs.map +1 -0
  434. package/dist/composed/AssistantLayout.js +10 -0
  435. package/dist/composed/AssistantLayout.js.map +1 -0
  436. package/dist/composed/Chat.cjs +2 -0
  437. package/dist/composed/Chat.cjs.map +1 -0
  438. package/dist/composed/Chat.js +5 -0
  439. package/dist/composed/Chat.js.map +1 -0
  440. package/dist/composed/ConfirmDialog.cjs +2 -0
  441. package/dist/composed/ConfirmDialog.cjs.map +1 -0
  442. package/dist/composed/ConfirmDialog.js +5 -0
  443. package/dist/composed/ConfirmDialog.js.map +1 -0
  444. package/dist/composed/DataAppShell.cjs +2 -0
  445. package/dist/composed/DataAppShell.cjs.map +1 -0
  446. package/dist/composed/DataAppShell.js +22 -0
  447. package/dist/composed/DataAppShell.js.map +1 -0
  448. package/dist/composed/EmptyState.cjs +2 -0
  449. package/dist/composed/EmptyState.cjs.map +1 -0
  450. package/dist/composed/EmptyState.js +5 -0
  451. package/dist/composed/EmptyState.js.map +1 -0
  452. package/dist/composed/FormPatterns.cjs +2 -0
  453. package/dist/composed/FormPatterns.cjs.map +1 -0
  454. package/dist/composed/FormPatterns.js +5 -0
  455. package/dist/composed/FormPatterns.js.map +1 -0
  456. package/dist/composed/MoleculeStructure.cjs +2 -0
  457. package/dist/composed/MoleculeStructure.cjs.map +1 -0
  458. package/dist/composed/MoleculeStructure.js +11 -0
  459. package/dist/composed/MoleculeStructure.js.map +1 -0
  460. package/dist/composed/PlateMapEditor.cjs +2 -0
  461. package/dist/composed/PlateMapEditor.cjs.map +1 -0
  462. package/dist/composed/PlateMapEditor.js +45 -0
  463. package/dist/composed/PlateMapEditor.js.map +1 -0
  464. package/dist/composed/ProcessFlow.cjs +2 -0
  465. package/dist/composed/ProcessFlow.cjs.map +1 -0
  466. package/dist/composed/ProcessFlow.js +7 -0
  467. package/dist/composed/ProcessFlow.js.map +1 -0
  468. package/dist/composed/RichListItem.cjs +2 -0
  469. package/dist/composed/RichListItem.cjs.map +1 -0
  470. package/dist/composed/RichListItem.js +6 -0
  471. package/dist/composed/RichListItem.js.map +1 -0
  472. package/dist/composed/StatCard.cjs +2 -0
  473. package/dist/composed/StatCard.cjs.map +1 -0
  474. package/dist/composed/StatCard.js +5 -0
  475. package/dist/composed/StatCard.js.map +1 -0
  476. package/dist/composed/TdpSearch.cjs +2 -0
  477. package/dist/composed/TdpSearch.cjs.map +1 -0
  478. package/dist/composed/TdpSearch.js +8 -0
  479. package/dist/composed/TdpSearch.js.map +1 -0
  480. package/dist/composed/TopBar.cjs +2 -0
  481. package/dist/composed/TopBar.cjs.map +1 -0
  482. package/dist/composed/TopBar.js +6 -0
  483. package/dist/composed/TopBar.js.map +1 -0
  484. package/dist/composed/UserMenu.cjs +2 -0
  485. package/dist/composed/UserMenu.cjs.map +1 -0
  486. package/dist/composed/UserMenu.js +7 -0
  487. package/dist/composed/UserMenu.js.map +1 -0
  488. package/dist/composed/tdp-link.cjs +2 -0
  489. package/dist/composed/tdp-link.cjs.map +1 -0
  490. package/dist/composed/tdp-link.js.map +1 -0
  491. package/dist/composed/tdp-url.cjs.map +1 -0
  492. package/dist/composed/tdp-url.js.map +1 -0
  493. package/dist/hooks/use-code-editor-theme.d.ts +34 -0
  494. package/dist/hooks/use-element-size.d.ts +25 -0
  495. package/dist/hooks/use-is-dark.d.ts +12 -0
  496. package/dist/hooks/use-mobile.d.ts +1 -0
  497. package/dist/hooks/use-plotly-theme.d.ts +49 -0
  498. package/dist/index.cjs +1 -1
  499. package/dist/index.css +1 -1
  500. package/dist/index.d.ts +102 -5448
  501. package/dist/index.js +72 -72
  502. package/dist/jest-setup.cjs +4 -0
  503. package/dist/jest-setup.cjs.map +1 -0
  504. package/dist/jest-setup.d.ts +106 -0
  505. package/dist/jest-setup.js +218 -0
  506. package/dist/jest-setup.js.map +1 -0
  507. package/dist/lib/shiki.cjs +1 -1
  508. package/dist/lib/shiki.cjs.map +1 -1
  509. package/dist/lib/shiki.d.ts +32 -0
  510. package/dist/lib/utils.d.ts +2 -0
  511. package/dist/server/auth/JwtTokenManager.cjs +1 -1
  512. package/dist/server/auth/JwtTokenManager.cjs.map +1 -1
  513. package/dist/server/auth/JwtTokenManager.d.ts +113 -0
  514. package/dist/server/auth/JwtTokenManager.js +44 -21
  515. package/dist/server/auth/JwtTokenManager.js.map +1 -1
  516. package/dist/server/auth/index.d.ts +5 -0
  517. package/dist/server/index.d.ts +8 -0
  518. package/dist/server/providers/AthenaProvider.cjs +1 -1
  519. package/dist/server/providers/AthenaProvider.cjs.map +1 -1
  520. package/dist/server/providers/AthenaProvider.d.ts +75 -0
  521. package/dist/server/providers/DatabricksProvider.cjs +1 -1
  522. package/dist/server/providers/DatabricksProvider.cjs.map +1 -1
  523. package/dist/server/providers/DatabricksProvider.d.ts +38 -0
  524. package/dist/server/providers/SnowflakeProvider.cjs +1 -1
  525. package/dist/server/providers/SnowflakeProvider.cjs.map +1 -1
  526. package/dist/server/providers/SnowflakeProvider.d.ts +36 -0
  527. package/dist/server/providers/buildProvider.d.ts +39 -0
  528. package/dist/server/providers/entries/athena.d.ts +24 -0
  529. package/dist/server/providers/entries/databricks.d.ts +25 -0
  530. package/dist/server/providers/entries/snowflake.d.ts +25 -0
  531. package/dist/server/providers/exceptions.d.ts +36 -0
  532. package/dist/server/providers/getProviderConfigurations.d.ts +45 -0
  533. package/dist/server/providers/index.d.ts +31 -0
  534. package/dist/server/providers/providerDiscovery.d.ts +81 -0
  535. package/dist/server/providers/types.d.ts +145 -0
  536. package/dist/server/search/TdpSearchManager.d.ts +40 -0
  537. package/dist/server/search/index.d.ts +5 -0
  538. package/dist/server.d.ts +17 -540
  539. package/dist/ui/accordion.cjs +2 -0
  540. package/dist/ui/accordion.cjs.map +1 -0
  541. package/dist/ui/accordion.js +83 -0
  542. package/dist/ui/accordion.js.map +1 -0
  543. package/dist/ui/alert-dialog.cjs +2 -0
  544. package/dist/ui/alert-dialog.cjs.map +1 -0
  545. package/dist/ui/alert-dialog.js +181 -0
  546. package/dist/ui/alert-dialog.js.map +1 -0
  547. package/dist/ui/alert.cjs +2 -0
  548. package/dist/ui/alert.cjs.map +1 -0
  549. package/dist/ui/alert.js +81 -0
  550. package/dist/ui/alert.js.map +1 -0
  551. package/dist/ui/aspect-ratio.cjs.map +1 -0
  552. package/dist/ui/aspect-ratio.js.map +1 -0
  553. package/dist/ui/avatar.cjs +2 -0
  554. package/dist/ui/avatar.cjs.map +1 -0
  555. package/dist/ui/avatar.js +107 -0
  556. package/dist/ui/avatar.js.map +1 -0
  557. package/dist/ui/badge.cjs +2 -0
  558. package/dist/ui/badge.cjs.map +1 -0
  559. package/dist/ui/badge.js +47 -0
  560. package/dist/ui/badge.js.map +1 -0
  561. package/dist/ui/banner.cjs +2 -0
  562. package/dist/ui/banner.cjs.map +1 -0
  563. package/dist/ui/banner.js +80 -0
  564. package/dist/ui/banner.js.map +1 -0
  565. package/dist/ui/breadcrumb.cjs +2 -0
  566. package/dist/ui/breadcrumb.cjs.map +1 -0
  567. package/dist/ui/breadcrumb.js +118 -0
  568. package/dist/ui/breadcrumb.js.map +1 -0
  569. package/dist/ui/button-group.cjs +2 -0
  570. package/dist/ui/button-group.cjs.map +1 -0
  571. package/dist/ui/button-group.js +77 -0
  572. package/dist/ui/button-group.js.map +1 -0
  573. package/dist/ui/button.cjs +2 -0
  574. package/dist/ui/button.cjs.map +1 -0
  575. package/dist/ui/button.js +57 -0
  576. package/dist/ui/button.js.map +1 -0
  577. package/dist/ui/calendar.cjs +2 -0
  578. package/dist/ui/calendar.cjs.map +1 -0
  579. package/dist/ui/calendar.js +174 -0
  580. package/dist/ui/calendar.js.map +1 -0
  581. package/dist/ui/card.cjs +2 -0
  582. package/dist/ui/card.cjs.map +1 -0
  583. package/dist/ui/card.js +102 -0
  584. package/dist/ui/card.js.map +1 -0
  585. package/dist/ui/carousel.cjs +2 -0
  586. package/dist/ui/carousel.cjs.map +1 -0
  587. package/dist/ui/carousel.js +179 -0
  588. package/dist/ui/carousel.js.map +1 -0
  589. package/dist/ui/checkbox.cjs +2 -0
  590. package/dist/ui/checkbox.cjs.map +1 -0
  591. package/dist/ui/checkbox.js +35 -0
  592. package/dist/ui/checkbox.js.map +1 -0
  593. package/dist/ui/code-block.cjs +4 -0
  594. package/dist/ui/code-block.cjs.map +1 -0
  595. package/dist/ui/code-block.js +324 -0
  596. package/dist/ui/code-block.js.map +1 -0
  597. package/dist/ui/code-editor.cjs +2 -0
  598. package/dist/ui/code-editor.cjs.map +1 -0
  599. package/dist/ui/code-editor.js +106 -0
  600. package/dist/ui/code-editor.js.map +1 -0
  601. package/dist/ui/collapsible.cjs.map +1 -0
  602. package/dist/ui/collapsible.js.map +1 -0
  603. package/dist/ui/combobox.cjs +2 -0
  604. package/dist/ui/combobox.cjs.map +1 -0
  605. package/dist/ui/combobox.js +285 -0
  606. package/dist/ui/combobox.js.map +1 -0
  607. package/dist/ui/command.cjs +2 -0
  608. package/dist/ui/command.cjs.map +1 -0
  609. package/dist/ui/command.js +178 -0
  610. package/dist/ui/command.js.map +1 -0
  611. package/dist/ui/context-menu.cjs +2 -0
  612. package/dist/ui/context-menu.cjs.map +1 -0
  613. package/dist/ui/context-menu.js +236 -0
  614. package/dist/ui/context-menu.js.map +1 -0
  615. package/dist/ui/data-table.cjs +2 -0
  616. package/dist/ui/data-table.cjs.map +1 -0
  617. package/dist/ui/data-table.js +16 -0
  618. package/dist/ui/data-table.js.map +1 -0
  619. package/dist/ui/dialog.cjs +2 -0
  620. package/dist/ui/dialog.cjs.map +1 -0
  621. package/dist/ui/dialog.js +165 -0
  622. package/dist/ui/dialog.js.map +1 -0
  623. package/dist/ui/dropdown-menu.cjs +2 -0
  624. package/dist/ui/dropdown-menu.cjs.map +1 -0
  625. package/dist/ui/dropdown-menu.js +260 -0
  626. package/dist/ui/dropdown-menu.js.map +1 -0
  627. package/dist/ui/field.cjs +2 -0
  628. package/dist/ui/field.cjs.map +1 -0
  629. package/dist/ui/field.js +210 -0
  630. package/dist/ui/field.js.map +1 -0
  631. package/dist/ui/hover-card.cjs +2 -0
  632. package/dist/ui/hover-card.cjs.map +1 -0
  633. package/dist/ui/hover-card.js +39 -0
  634. package/dist/ui/hover-card.js.map +1 -0
  635. package/dist/ui/input-group.cjs +2 -0
  636. package/dist/ui/input-group.cjs.map +1 -0
  637. package/dist/ui/input-group.js +145 -0
  638. package/dist/ui/input-group.js.map +1 -0
  639. package/dist/ui/input.cjs +2 -0
  640. package/dist/ui/input.cjs.map +1 -0
  641. package/dist/ui/input.js +20 -0
  642. package/dist/ui/input.js.map +1 -0
  643. package/dist/ui/item.cjs +2 -0
  644. package/dist/ui/item.cjs.map +1 -0
  645. package/dist/ui/item.js +199 -0
  646. package/dist/ui/item.js.map +1 -0
  647. package/dist/ui/kbd.cjs +2 -0
  648. package/dist/ui/kbd.cjs.map +1 -0
  649. package/dist/ui/kbd.js +30 -0
  650. package/dist/ui/kbd.js.map +1 -0
  651. package/dist/ui/label.cjs +2 -0
  652. package/dist/ui/label.cjs.map +1 -0
  653. package/dist/ui/label.js +23 -0
  654. package/dist/ui/label.js.map +1 -0
  655. package/dist/ui/menubar.cjs +2 -0
  656. package/dist/ui/menubar.cjs.map +1 -0
  657. package/dist/ui/menubar.js +256 -0
  658. package/dist/ui/menubar.js.map +1 -0
  659. package/dist/ui/navigation-menu.cjs +2 -0
  660. package/dist/ui/navigation-menu.cjs.map +1 -0
  661. package/dist/ui/navigation-menu.js +164 -0
  662. package/dist/ui/navigation-menu.js.map +1 -0
  663. package/dist/ui/popover.cjs +2 -0
  664. package/dist/ui/popover.cjs.map +1 -0
  665. package/dist/ui/popover.js +45 -0
  666. package/dist/ui/popover.js.map +1 -0
  667. package/dist/ui/radio-group.cjs +2 -0
  668. package/dist/ui/radio-group.cjs.map +1 -0
  669. package/dist/ui/radio-group.js +45 -0
  670. package/dist/ui/radio-group.js.map +1 -0
  671. package/dist/ui/resizable.cjs +2 -0
  672. package/dist/ui/resizable.cjs.map +1 -0
  673. package/dist/ui/resizable.js +58 -0
  674. package/dist/ui/resizable.js.map +1 -0
  675. package/dist/ui/scroll-area.cjs +2 -0
  676. package/dist/ui/scroll-area.cjs.map +1 -0
  677. package/dist/ui/scroll-area.js +61 -0
  678. package/dist/ui/scroll-area.js.map +1 -0
  679. package/dist/ui/select.cjs +2 -0
  680. package/dist/ui/select.cjs.map +1 -0
  681. package/dist/ui/select.js +184 -0
  682. package/dist/ui/select.js.map +1 -0
  683. package/dist/ui/separator.cjs +2 -0
  684. package/dist/ui/separator.cjs.map +1 -0
  685. package/dist/ui/separator.js +27 -0
  686. package/dist/ui/separator.js.map +1 -0
  687. package/dist/ui/sheet.cjs +2 -0
  688. package/dist/ui/sheet.cjs.map +1 -0
  689. package/dist/ui/sheet.js +137 -0
  690. package/dist/ui/sheet.js.map +1 -0
  691. package/dist/ui/sidebar.cjs +2 -0
  692. package/dist/ui/sidebar.cjs.map +1 -0
  693. package/dist/ui/sidebar.js +579 -0
  694. package/dist/ui/sidebar.js.map +1 -0
  695. package/dist/ui/skeleton.cjs +2 -0
  696. package/dist/ui/skeleton.cjs.map +1 -0
  697. package/dist/ui/skeleton.js +24 -0
  698. package/dist/ui/skeleton.js.map +1 -0
  699. package/dist/ui/slider.cjs +2 -0
  700. package/dist/ui/slider.cjs.map +1 -0
  701. package/dist/ui/slider.js +61 -0
  702. package/dist/ui/slider.js.map +1 -0
  703. package/dist/ui/sonner.cjs +2 -0
  704. package/dist/ui/sonner.cjs.map +1 -0
  705. package/dist/ui/sonner.js +52 -0
  706. package/dist/ui/sonner.js.map +1 -0
  707. package/dist/ui/spinner.cjs +2 -0
  708. package/dist/ui/spinner.cjs.map +1 -0
  709. package/dist/ui/spinner.js +39 -0
  710. package/dist/ui/spinner.js.map +1 -0
  711. package/dist/ui/switch.cjs +2 -0
  712. package/dist/ui/switch.cjs.map +1 -0
  713. package/dist/ui/switch.js +32 -0
  714. package/dist/ui/switch.js.map +1 -0
  715. package/dist/ui/table.cjs +2 -0
  716. package/dist/ui/table.cjs.map +1 -0
  717. package/dist/ui/table.js +153 -0
  718. package/dist/ui/table.js.map +1 -0
  719. package/dist/ui/tabs.cjs +2 -0
  720. package/dist/ui/tabs.cjs.map +1 -0
  721. package/dist/ui/tabs.js +92 -0
  722. package/dist/ui/tabs.js.map +1 -0
  723. package/dist/ui/tetra-molecule-icon.cjs +2 -0
  724. package/dist/ui/tetra-molecule-icon.cjs.map +1 -0
  725. package/dist/ui/tetra-molecule-icon.js +50 -0
  726. package/dist/ui/tetra-molecule-icon.js.map +1 -0
  727. package/dist/ui/tetrascience-icon.cjs +2 -0
  728. package/dist/ui/tetrascience-icon.cjs.map +1 -0
  729. package/dist/ui/tetrascience-icon.js +47 -0
  730. package/dist/ui/tetrascience-icon.js.map +1 -0
  731. package/dist/ui/textarea.cjs +2 -0
  732. package/dist/ui/textarea.cjs.map +1 -0
  733. package/dist/ui/textarea.js +19 -0
  734. package/dist/ui/textarea.js.map +1 -0
  735. package/dist/ui/toggle-group.cjs +2 -0
  736. package/dist/ui/toggle-group.cjs.map +1 -0
  737. package/dist/ui/toggle-group.js +81 -0
  738. package/dist/ui/toggle-group.js.map +1 -0
  739. package/dist/ui/toggle.cjs +2 -0
  740. package/dist/ui/toggle.cjs.map +1 -0
  741. package/dist/ui/toggle.js +44 -0
  742. package/dist/ui/toggle.js.map +1 -0
  743. package/dist/ui/tooltip.cjs +2 -0
  744. package/dist/ui/tooltip.cjs.map +1 -0
  745. package/dist/ui/tooltip.js +56 -0
  746. package/dist/ui/tooltip.js.map +1 -0
  747. package/dist/utils/colors.d.ts +50 -0
  748. package/package.json +113 -10
  749. package/dist/athena.d.ts +0 -167
  750. package/dist/components/ai/attachments.cjs +0 -2
  751. package/dist/components/ai/attachments.cjs.map +0 -1
  752. package/dist/components/ai/attachments.js +0 -224
  753. package/dist/components/ai/attachments.js.map +0 -1
  754. package/dist/components/ai/chain-of-thought.cjs +0 -2
  755. package/dist/components/ai/chain-of-thought.cjs.map +0 -1
  756. package/dist/components/ai/chain-of-thought.js +0 -145
  757. package/dist/components/ai/chain-of-thought.js.map +0 -1
  758. package/dist/components/ai/confirmation.cjs +0 -2
  759. package/dist/components/ai/confirmation.cjs.map +0 -1
  760. package/dist/components/ai/confirmation.js +0 -109
  761. package/dist/components/ai/confirmation.js.map +0 -1
  762. package/dist/components/ai/context.cjs +0 -2
  763. package/dist/components/ai/context.cjs.map +0 -1
  764. package/dist/components/ai/context.js +0 -267
  765. package/dist/components/ai/context.js.map +0 -1
  766. package/dist/components/ai/conversation.cjs +0 -4
  767. package/dist/components/ai/conversation.cjs.map +0 -1
  768. package/dist/components/ai/conversation.js +0 -108
  769. package/dist/components/ai/conversation.js.map +0 -1
  770. package/dist/components/ai/inline-citation.cjs +0 -2
  771. package/dist/components/ai/inline-citation.cjs.map +0 -1
  772. package/dist/components/ai/inline-citation.js +0 -182
  773. package/dist/components/ai/inline-citation.js.map +0 -1
  774. package/dist/components/ai/message.cjs +0 -2
  775. package/dist/components/ai/message.cjs.map +0 -1
  776. package/dist/components/ai/message.js +0 -237
  777. package/dist/components/ai/message.js.map +0 -1
  778. package/dist/components/ai/model-selector.cjs +0 -2
  779. package/dist/components/ai/model-selector.cjs.map +0 -1
  780. package/dist/components/ai/model-selector.js +0 -77
  781. package/dist/components/ai/model-selector.js.map +0 -1
  782. package/dist/components/ai/prompt-input.cjs +0 -2
  783. package/dist/components/ai/prompt-input.cjs.map +0 -1
  784. package/dist/components/ai/prompt-input.js +0 -776
  785. package/dist/components/ai/prompt-input.js.map +0 -1
  786. package/dist/components/ai/queue.cjs +0 -2
  787. package/dist/components/ai/queue.cjs.map +0 -1
  788. package/dist/components/ai/queue.js +0 -209
  789. package/dist/components/ai/queue.js.map +0 -1
  790. package/dist/components/ai/reasoning.cjs +0 -2
  791. package/dist/components/ai/reasoning.cjs.map +0 -1
  792. package/dist/components/ai/reasoning.js +0 -129
  793. package/dist/components/ai/reasoning.js.map +0 -1
  794. package/dist/components/ai/shimmer.cjs +0 -2
  795. package/dist/components/ai/shimmer.cjs.map +0 -1
  796. package/dist/components/ai/shimmer.js +0 -49
  797. package/dist/components/ai/shimmer.js.map +0 -1
  798. package/dist/components/ai/sources.cjs +0 -2
  799. package/dist/components/ai/sources.cjs.map +0 -1
  800. package/dist/components/ai/sources.js +0 -54
  801. package/dist/components/ai/sources.js.map +0 -1
  802. package/dist/components/ai/speech-input.cjs +0 -2
  803. package/dist/components/ai/speech-input.cjs.map +0 -1
  804. package/dist/components/ai/speech-input.js +0 -123
  805. package/dist/components/ai/speech-input.js.map +0 -1
  806. package/dist/components/ai/stream-status.cjs +0 -2
  807. package/dist/components/ai/stream-status.cjs.map +0 -1
  808. package/dist/components/ai/stream-status.js +0 -108
  809. package/dist/components/ai/stream-status.js.map +0 -1
  810. package/dist/components/ai/suggestion.cjs +0 -2
  811. package/dist/components/ai/suggestion.cjs.map +0 -1
  812. package/dist/components/ai/suggestion.js +0 -38
  813. package/dist/components/ai/suggestion.js.map +0 -1
  814. package/dist/components/ai/task.cjs +0 -2
  815. package/dist/components/ai/task.cjs.map +0 -1
  816. package/dist/components/ai/task.js +0 -101
  817. package/dist/components/ai/task.js.map +0 -1
  818. package/dist/components/ai/tool.cjs +0 -2
  819. package/dist/components/ai/tool.cjs.map +0 -1
  820. package/dist/components/ai/tool.js +0 -139
  821. package/dist/components/ai/tool.js.map +0 -1
  822. package/dist/components/composed/tdp-link.cjs +0 -2
  823. package/dist/components/composed/tdp-link.cjs.map +0 -1
  824. package/dist/components/composed/tdp-link.js.map +0 -1
  825. package/dist/components/composed/tdp-url.cjs.map +0 -1
  826. package/dist/components/composed/tdp-url.js.map +0 -1
  827. package/dist/components/ui/accordion.cjs +0 -2
  828. package/dist/components/ui/accordion.cjs.map +0 -1
  829. package/dist/components/ui/accordion.js +0 -83
  830. package/dist/components/ui/accordion.js.map +0 -1
  831. package/dist/components/ui/alert-dialog.cjs +0 -2
  832. package/dist/components/ui/alert-dialog.cjs.map +0 -1
  833. package/dist/components/ui/alert-dialog.js +0 -181
  834. package/dist/components/ui/alert-dialog.js.map +0 -1
  835. package/dist/components/ui/alert.cjs +0 -2
  836. package/dist/components/ui/alert.cjs.map +0 -1
  837. package/dist/components/ui/alert.js +0 -81
  838. package/dist/components/ui/alert.js.map +0 -1
  839. package/dist/components/ui/aspect-ratio.cjs.map +0 -1
  840. package/dist/components/ui/aspect-ratio.js.map +0 -1
  841. package/dist/components/ui/avatar.cjs +0 -2
  842. package/dist/components/ui/avatar.cjs.map +0 -1
  843. package/dist/components/ui/avatar.js +0 -107
  844. package/dist/components/ui/avatar.js.map +0 -1
  845. package/dist/components/ui/badge.cjs +0 -2
  846. package/dist/components/ui/badge.cjs.map +0 -1
  847. package/dist/components/ui/badge.js +0 -47
  848. package/dist/components/ui/badge.js.map +0 -1
  849. package/dist/components/ui/banner.cjs +0 -2
  850. package/dist/components/ui/banner.cjs.map +0 -1
  851. package/dist/components/ui/banner.js +0 -80
  852. package/dist/components/ui/banner.js.map +0 -1
  853. package/dist/components/ui/breadcrumb.cjs +0 -2
  854. package/dist/components/ui/breadcrumb.cjs.map +0 -1
  855. package/dist/components/ui/breadcrumb.js +0 -118
  856. package/dist/components/ui/breadcrumb.js.map +0 -1
  857. package/dist/components/ui/button-group.cjs +0 -2
  858. package/dist/components/ui/button-group.cjs.map +0 -1
  859. package/dist/components/ui/button-group.js +0 -77
  860. package/dist/components/ui/button-group.js.map +0 -1
  861. package/dist/components/ui/button.cjs +0 -2
  862. package/dist/components/ui/button.cjs.map +0 -1
  863. package/dist/components/ui/button.js +0 -57
  864. package/dist/components/ui/button.js.map +0 -1
  865. package/dist/components/ui/calendar.cjs +0 -2
  866. package/dist/components/ui/calendar.cjs.map +0 -1
  867. package/dist/components/ui/calendar.js +0 -174
  868. package/dist/components/ui/calendar.js.map +0 -1
  869. package/dist/components/ui/card.cjs +0 -2
  870. package/dist/components/ui/card.cjs.map +0 -1
  871. package/dist/components/ui/card.js +0 -102
  872. package/dist/components/ui/card.js.map +0 -1
  873. package/dist/components/ui/carousel.cjs +0 -2
  874. package/dist/components/ui/carousel.cjs.map +0 -1
  875. package/dist/components/ui/carousel.js +0 -179
  876. package/dist/components/ui/carousel.js.map +0 -1
  877. package/dist/components/ui/checkbox.cjs +0 -2
  878. package/dist/components/ui/checkbox.cjs.map +0 -1
  879. package/dist/components/ui/checkbox.js +0 -35
  880. package/dist/components/ui/checkbox.js.map +0 -1
  881. package/dist/components/ui/code-block.cjs +0 -4
  882. package/dist/components/ui/code-block.cjs.map +0 -1
  883. package/dist/components/ui/code-block.js +0 -324
  884. package/dist/components/ui/code-block.js.map +0 -1
  885. package/dist/components/ui/code-editor.cjs +0 -2
  886. package/dist/components/ui/code-editor.cjs.map +0 -1
  887. package/dist/components/ui/code-editor.js +0 -105
  888. package/dist/components/ui/code-editor.js.map +0 -1
  889. package/dist/components/ui/collapsible.cjs.map +0 -1
  890. package/dist/components/ui/collapsible.js.map +0 -1
  891. package/dist/components/ui/combobox.cjs +0 -2
  892. package/dist/components/ui/combobox.cjs.map +0 -1
  893. package/dist/components/ui/combobox.js +0 -285
  894. package/dist/components/ui/combobox.js.map +0 -1
  895. package/dist/components/ui/command.cjs +0 -2
  896. package/dist/components/ui/command.cjs.map +0 -1
  897. package/dist/components/ui/command.js +0 -178
  898. package/dist/components/ui/command.js.map +0 -1
  899. package/dist/components/ui/context-menu.cjs +0 -2
  900. package/dist/components/ui/context-menu.cjs.map +0 -1
  901. package/dist/components/ui/context-menu.js +0 -236
  902. package/dist/components/ui/context-menu.js.map +0 -1
  903. package/dist/components/ui/dialog.cjs +0 -2
  904. package/dist/components/ui/dialog.cjs.map +0 -1
  905. package/dist/components/ui/dialog.js +0 -165
  906. package/dist/components/ui/dialog.js.map +0 -1
  907. package/dist/components/ui/dropdown-menu.cjs +0 -2
  908. package/dist/components/ui/dropdown-menu.cjs.map +0 -1
  909. package/dist/components/ui/dropdown-menu.js +0 -260
  910. package/dist/components/ui/dropdown-menu.js.map +0 -1
  911. package/dist/components/ui/field.cjs +0 -2
  912. package/dist/components/ui/field.cjs.map +0 -1
  913. package/dist/components/ui/field.js +0 -210
  914. package/dist/components/ui/field.js.map +0 -1
  915. package/dist/components/ui/hover-card.cjs +0 -2
  916. package/dist/components/ui/hover-card.cjs.map +0 -1
  917. package/dist/components/ui/hover-card.js +0 -39
  918. package/dist/components/ui/hover-card.js.map +0 -1
  919. package/dist/components/ui/input-group.cjs +0 -2
  920. package/dist/components/ui/input-group.cjs.map +0 -1
  921. package/dist/components/ui/input-group.js +0 -145
  922. package/dist/components/ui/input-group.js.map +0 -1
  923. package/dist/components/ui/input.cjs +0 -2
  924. package/dist/components/ui/input.cjs.map +0 -1
  925. package/dist/components/ui/input.js +0 -20
  926. package/dist/components/ui/input.js.map +0 -1
  927. package/dist/components/ui/item.cjs +0 -2
  928. package/dist/components/ui/item.cjs.map +0 -1
  929. package/dist/components/ui/item.js +0 -199
  930. package/dist/components/ui/item.js.map +0 -1
  931. package/dist/components/ui/kbd.cjs +0 -2
  932. package/dist/components/ui/kbd.cjs.map +0 -1
  933. package/dist/components/ui/kbd.js +0 -30
  934. package/dist/components/ui/kbd.js.map +0 -1
  935. package/dist/components/ui/label.cjs +0 -2
  936. package/dist/components/ui/label.cjs.map +0 -1
  937. package/dist/components/ui/label.js +0 -23
  938. package/dist/components/ui/label.js.map +0 -1
  939. package/dist/components/ui/menubar.cjs +0 -2
  940. package/dist/components/ui/menubar.cjs.map +0 -1
  941. package/dist/components/ui/menubar.js +0 -256
  942. package/dist/components/ui/menubar.js.map +0 -1
  943. package/dist/components/ui/navigation-menu.cjs +0 -2
  944. package/dist/components/ui/navigation-menu.cjs.map +0 -1
  945. package/dist/components/ui/navigation-menu.js +0 -164
  946. package/dist/components/ui/navigation-menu.js.map +0 -1
  947. package/dist/components/ui/popover.cjs +0 -2
  948. package/dist/components/ui/popover.cjs.map +0 -1
  949. package/dist/components/ui/popover.js +0 -45
  950. package/dist/components/ui/popover.js.map +0 -1
  951. package/dist/components/ui/radio-group.cjs +0 -2
  952. package/dist/components/ui/radio-group.cjs.map +0 -1
  953. package/dist/components/ui/radio-group.js +0 -45
  954. package/dist/components/ui/radio-group.js.map +0 -1
  955. package/dist/components/ui/resizable.cjs +0 -2
  956. package/dist/components/ui/resizable.cjs.map +0 -1
  957. package/dist/components/ui/resizable.js +0 -58
  958. package/dist/components/ui/resizable.js.map +0 -1
  959. package/dist/components/ui/scroll-area.cjs +0 -2
  960. package/dist/components/ui/scroll-area.cjs.map +0 -1
  961. package/dist/components/ui/scroll-area.js +0 -61
  962. package/dist/components/ui/scroll-area.js.map +0 -1
  963. package/dist/components/ui/select.cjs +0 -2
  964. package/dist/components/ui/select.cjs.map +0 -1
  965. package/dist/components/ui/select.js +0 -184
  966. package/dist/components/ui/select.js.map +0 -1
  967. package/dist/components/ui/separator.cjs +0 -2
  968. package/dist/components/ui/separator.cjs.map +0 -1
  969. package/dist/components/ui/separator.js +0 -27
  970. package/dist/components/ui/separator.js.map +0 -1
  971. package/dist/components/ui/sheet.cjs +0 -2
  972. package/dist/components/ui/sheet.cjs.map +0 -1
  973. package/dist/components/ui/sheet.js +0 -137
  974. package/dist/components/ui/sheet.js.map +0 -1
  975. package/dist/components/ui/sidebar.cjs +0 -2
  976. package/dist/components/ui/sidebar.cjs.map +0 -1
  977. package/dist/components/ui/sidebar.js +0 -579
  978. package/dist/components/ui/sidebar.js.map +0 -1
  979. package/dist/components/ui/skeleton.cjs +0 -2
  980. package/dist/components/ui/skeleton.cjs.map +0 -1
  981. package/dist/components/ui/skeleton.js +0 -24
  982. package/dist/components/ui/skeleton.js.map +0 -1
  983. package/dist/components/ui/slider.cjs +0 -2
  984. package/dist/components/ui/slider.cjs.map +0 -1
  985. package/dist/components/ui/slider.js +0 -61
  986. package/dist/components/ui/slider.js.map +0 -1
  987. package/dist/components/ui/sonner.cjs +0 -2
  988. package/dist/components/ui/sonner.cjs.map +0 -1
  989. package/dist/components/ui/sonner.js +0 -52
  990. package/dist/components/ui/sonner.js.map +0 -1
  991. package/dist/components/ui/spinner.cjs +0 -2
  992. package/dist/components/ui/spinner.cjs.map +0 -1
  993. package/dist/components/ui/spinner.js +0 -39
  994. package/dist/components/ui/spinner.js.map +0 -1
  995. package/dist/components/ui/switch.cjs +0 -2
  996. package/dist/components/ui/switch.cjs.map +0 -1
  997. package/dist/components/ui/switch.js +0 -32
  998. package/dist/components/ui/switch.js.map +0 -1
  999. package/dist/components/ui/table.cjs +0 -2
  1000. package/dist/components/ui/table.cjs.map +0 -1
  1001. package/dist/components/ui/table.js +0 -153
  1002. package/dist/components/ui/table.js.map +0 -1
  1003. package/dist/components/ui/tabs.cjs +0 -2
  1004. package/dist/components/ui/tabs.cjs.map +0 -1
  1005. package/dist/components/ui/tabs.js +0 -92
  1006. package/dist/components/ui/tabs.js.map +0 -1
  1007. package/dist/components/ui/tetra-molecule-icon.cjs +0 -2
  1008. package/dist/components/ui/tetra-molecule-icon.cjs.map +0 -1
  1009. package/dist/components/ui/tetra-molecule-icon.js +0 -49
  1010. package/dist/components/ui/tetra-molecule-icon.js.map +0 -1
  1011. package/dist/components/ui/tetrascience-icon.cjs +0 -2
  1012. package/dist/components/ui/tetrascience-icon.cjs.map +0 -1
  1013. package/dist/components/ui/tetrascience-icon.js +0 -46
  1014. package/dist/components/ui/tetrascience-icon.js.map +0 -1
  1015. package/dist/components/ui/textarea.cjs +0 -2
  1016. package/dist/components/ui/textarea.cjs.map +0 -1
  1017. package/dist/components/ui/textarea.js +0 -19
  1018. package/dist/components/ui/textarea.js.map +0 -1
  1019. package/dist/components/ui/toggle-group.cjs +0 -2
  1020. package/dist/components/ui/toggle-group.cjs.map +0 -1
  1021. package/dist/components/ui/toggle-group.js +0 -81
  1022. package/dist/components/ui/toggle-group.js.map +0 -1
  1023. package/dist/components/ui/toggle.cjs +0 -2
  1024. package/dist/components/ui/toggle.cjs.map +0 -1
  1025. package/dist/components/ui/toggle.js +0 -44
  1026. package/dist/components/ui/toggle.js.map +0 -1
  1027. package/dist/components/ui/tooltip.cjs +0 -2
  1028. package/dist/components/ui/tooltip.cjs.map +0 -1
  1029. package/dist/components/ui/tooltip.js +0 -56
  1030. package/dist/components/ui/tooltip.js.map +0 -1
  1031. package/dist/databricks.d.ts +0 -129
  1032. package/dist/providers/athena.d.ts +0 -9
  1033. package/dist/providers/databricks.d.ts +0 -9
  1034. package/dist/providers/snowflake.d.ts +0 -9
  1035. package/dist/snowflake.d.ts +0 -125
  1036. /package/dist/{components/composed → composed}/tdp-link.js +0 -0
  1037. /package/dist/{components/composed → composed}/tdp-url.cjs +0 -0
  1038. /package/dist/{components/composed → composed}/tdp-url.js +0 -0
  1039. /package/dist/{components/ui → ui}/aspect-ratio.cjs +0 -0
  1040. /package/dist/{components/ui → ui}/aspect-ratio.js +0 -0
  1041. /package/dist/{components/ui → ui}/collapsible.cjs +0 -0
  1042. /package/dist/{components/ui → ui}/collapsible.js +0 -0
@@ -1,2 +1,2 @@
1
- "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const a=require("react/jsx-runtime"),B=require("class-variance-authority"),R=require("lucide-react"),_=require("react"),v=require("./CollapseButton.cjs"),F=require("./ShellContext.cjs"),A=require("../../ui/badge.cjs"),c=require("../../ui/select.cjs"),m=require("../../ui/tooltip.cjs"),s=require("../../../lib/utils.cjs");function E(n){const l=Object.create(null,{[Symbol.toStringTag]:{value:"Module"}});if(n){for(const r in n)if(r!=="default"){const i=Object.getOwnPropertyDescriptor(n,r);Object.defineProperty(l,r,i.get?i:{enumerable:!0,get:()=>n[r]})}}return l.default=n,Object.freeze(l)}const C=E(_),k=B.cva("shrink-0",{variants:{orientation:{vertical:"flex flex-col bg-sidebar border-r border-sidebar-border overflow-hidden",horizontal:"flex flex-row items-center min-w-0"}},defaultVariants:{orientation:"vertical"}}),g=B.cva("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",{variants:{orientation:{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",rail:"flex justify-center items-center py-3.5 w-full border-l-[5px] border-r-0 border-t-0 border-b-0",horizontal:"flex items-center gap-2 h-7 px-2.5 text-sm rounded-md whitespace-nowrap border-none focus-visible:ring-inset"},status:{done:"",active:"",todo:""}},compoundVariants:[{orientation:"vertical",status:"active",class:"border-l-sidebar-primary bg-sidebar-accent font-semibold text-sidebar-foreground shadow-sm"},{orientation:"vertical",status:"done",class:"border-l-sidebar-border text-foreground hover:bg-sidebar-accent/50"},{orientation:"vertical",status:"todo",class:"border-l-sidebar-border text-muted-foreground hover:bg-sidebar-accent/50"},{orientation:"rail",status:"active",class:"border-l-primary"},{orientation:"rail",status:"done",class:"border-l-border"},{orientation:"rail",status:"todo",class:"border-l-border"},{orientation:"horizontal",status:"active",class:"bg-primary/10 text-primary font-medium"},{orientation:"horizontal",status:"done",class:"text-foreground hover:bg-accent"},{orientation:"horizontal",status:"todo",class:"text-muted-foreground hover:bg-accent hover:text-foreground"}],defaultVariants:{orientation:"vertical",status:"todo"}});function G(n){return n.flatMap(l=>[l,...l.steps??[]])}function H(n,l,r){return n.status?n.status:r<0?"todo":l===r?"active":l<r?"done":"todo"}function N({step:n,status:l,className:r}){const i=n.icon;return l==="done"?a.jsx(R.Check,{className:s.cn("w-4 h-4 text-positive",r)}):i?a.jsx(i,{className:s.cn("w-4 h-4",l==="active"?"text-primary":"text-muted-foreground",r)}):a.jsx("div",{className:s.cn("w-2.5 h-2.5 rounded-full",l==="active"?"bg-primary":"bg-muted-foreground/40",r)})}function J({orientation:n,steps:l,activeKey:r,onSelect:i,title:z,collapsible:u=!1,collapsed:j,defaultCollapsed:T=!1,onCollapsedChange:I,className:b,...h}){const y=n??"vertical",p=F.useOptionalDataAppShell(),q=j===void 0&&p!=null&&p.hideNavOnCollapse,[D,M]=C.useState(T),O=j??(q?p.collapsed:D),f=e=>{j===void 0&&(q?p.setCollapsed(e):M(e)),I?.(e)},d=G(l),S=new Map(d.map((e,t)=>[e.id,t])),P=r==null?-1:S.get(r)??-1,w=e=>H(e,S.get(e.id)??-1,P),x=e=>{e.disabled||i?.(e.id,e)};if(y==="vertical"&&O)return a.jsx("nav",{"data-slot":"data-app-shell-secondary-nav","data-orientation":"vertical","data-collapsed":"true",className:s.cn("flex flex-col shrink-0 w-[46px] bg-sidebar border-r border-sidebar-border",b),...h,children:a.jsxs(m.TooltipProvider,{children:[a.jsx("div",{className:"flex justify-center items-center h-11 shrink-0 border-b border-sidebar-border",children:a.jsx(v.ShellCollapseButton,{"data-slot":"data-app-shell-secondary-nav-toggle",direction:"right",label:"Expand",onClick:()=>f(!1)})}),a.jsx("div",{"data-slot":"data-app-shell-secondary-nav-items",className:"flex flex-col overflow-y-auto",children:d.map(e=>{const t=w(e);return a.jsxs(m.Tooltip,{children:[a.jsx(m.TooltipTrigger,{asChild:!0,children:a.jsx("button",{type:"button","data-slot":"data-app-shell-secondary-nav-item","data-status":t,"aria-label":e.label,"aria-current":t==="active"?"step":void 0,"aria-disabled":e.disabled||void 0,className:s.cn(g({orientation:"rail",status:t}),e.disabled&&"opacity-45 cursor-not-allowed"),onClick:()=>x(e),children:a.jsx(N,{step:e,status:t})})}),a.jsx(m.TooltipContent,{side:"right",children:e.disabled?e.disabledReason??e.label:e.label})]},e.id)})})]})});if(y==="horizontal"&&u&&O){const e=r==null?void 0:d.find(t=>t.id===r);return a.jsxs("nav",{"data-slot":"data-app-shell-secondary-nav","data-orientation":"horizontal","data-collapsed":"true",className:s.cn("flex items-center gap-1.5 min-w-0",b),...h,children:[a.jsxs(c.Select,{value:r,onValueChange:t=>{const o=d.find($=>$.id===t);o&&x(o)},children:[a.jsx(c.SelectTrigger,{"data-slot":"data-app-shell-secondary-nav-step-select",size:"sm","aria-label":"Current step",className:"h-7 min-w-0",children:a.jsx(c.SelectValue,{placeholder:"Select step",children:e?`Step ${(S.get(e.id)??0)+1} · ${e.label}`:"Select step"})}),a.jsx(c.SelectContent,{children:d.map((t,o)=>a.jsx(c.SelectItem,{value:t.id,disabled:t.disabled,children:`Step ${o+1} · ${t.label}`},t.id))})]}),a.jsx(v.ShellCollapseButton,{"data-slot":"data-app-shell-secondary-nav-toggle",direction:"down",label:"Show steps",tooltipSide:"bottom",onClick:()=>f(!1)})]})}if(y==="horizontal")return a.jsxs("nav",{"data-slot":"data-app-shell-secondary-nav","data-orientation":"horizontal","data-collapsed":"false",className:s.cn(k({orientation:"horizontal"}),b),...h,children:[a.jsx("div",{"data-slot":"data-app-shell-secondary-nav-items",className:"flex flex-row items-center gap-1 min-w-0 overflow-x-auto flex-1",children:d.map((e,t)=>{const o=w(e);return a.jsxs(C.Fragment,{children:[t>0&&a.jsx(R.ChevronRight,{"aria-hidden":"true",className:"w-4 h-4 shrink-0 text-muted-foreground/50"}),a.jsxs("button",{type:"button","data-slot":"data-app-shell-secondary-nav-item","data-status":o,"aria-current":o==="active"?"step":void 0,title:e.disabled?e.disabledReason??e.label:void 0,className:s.cn(g({orientation:"horizontal",status:o})),onClick:()=>x(e),disabled:e.disabled,children:[a.jsx(N,{step:e,status:o,className:"shrink-0"}),a.jsx("span",{children:e.label}),e.badge!=null&&a.jsx(A.Badge,{variant:"secondary",className:"h-4 px-1.5 text-[10px]",children:e.badge})]})]},e.id)})}),u&&a.jsx(v.ShellCollapseButton,{"data-slot":"data-app-shell-secondary-nav-toggle",direction:"up",label:"Collapse steps",tooltipSide:"bottom",className:"ml-2",onClick:()=>f(!0)})]});const V=(e,t)=>{const o=w(e);return a.jsxs("button",{type:"button","data-slot":"data-app-shell-secondary-nav-item","data-status":o,"aria-current":o==="active"?"step":void 0,title:e.disabled?e.disabledReason??e.label:void 0,className:s.cn(g({orientation:"vertical",status:o}),t&&"pl-8"),onClick:()=>x(e),disabled:e.disabled,children:[a.jsx("span",{className:"flex items-center justify-center w-6 h-6 shrink-0",children:a.jsx(N,{step:e,status:o})}),a.jsx("span",{className:s.cn("text-sm truncate min-w-0",o==="todo"&&"font-light"),children:e.label}),e.badge!=null&&a.jsx(A.Badge,{variant:"secondary",className:"ml-auto h-4 px-1.5 text-[10px]",children:e.badge})]},e.id)};return a.jsxs("nav",{"data-slot":"data-app-shell-secondary-nav","data-orientation":"vertical","data-collapsed":"false",className:s.cn(k({orientation:"vertical"}),"w-[180px]",b),...h,children:[(z!=null||u)&&a.jsxs("div",{"data-slot":"data-app-shell-secondary-nav-header",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",children:[a.jsx("span",{className:"flex-1 truncate",children:z}),u&&a.jsx(v.ShellCollapseButton,{"data-slot":"data-app-shell-secondary-nav-toggle",direction:"left",label:"Collapse",onClick:()=>f(!0)})]}),a.jsx("div",{"data-slot":"data-app-shell-secondary-nav-items",className:"flex flex-col overflow-y-auto",children:l.map(e=>a.jsxs(C.Fragment,{children:[V(e,!1),e.steps?.map(t=>V(t,!0))]},e.id))})]})}exports.DataAppShellSecondaryNav=J;exports.dataAppShellSecondaryNavItemVariants=g;exports.dataAppShellSecondaryNavVariants=k;
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const a=require("react/jsx-runtime"),B=require("class-variance-authority"),R=require("lucide-react"),$=require("react"),v=require("./CollapseButton.cjs"),F=require("./ShellContext.cjs"),A=require("../../../ui/badge.cjs"),c=require("../../../ui/select.cjs"),m=require("../../../ui/tooltip.cjs"),s=require("../../../lib/utils.cjs");function E(n){const l=Object.create(null,{[Symbol.toStringTag]:{value:"Module"}});if(n){for(const r in n)if(r!=="default"){const i=Object.getOwnPropertyDescriptor(n,r);Object.defineProperty(l,r,i.get?i:{enumerable:!0,get:()=>n[r]})}}return l.default=n,Object.freeze(l)}const C=E($),k=B.cva("shrink-0",{variants:{orientation:{vertical:"flex flex-col bg-sidebar border-r border-sidebar-border overflow-hidden",horizontal:"flex flex-row items-center min-w-0"}},defaultVariants:{orientation:"vertical"}}),g=B.cva("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",{variants:{orientation:{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",rail:"flex justify-center items-center py-3.5 w-full border-l-[5px] border-r-0 border-t-0 border-b-0",horizontal:"flex items-center gap-2 h-7 px-2.5 text-sm rounded-md whitespace-nowrap border-none focus-visible:ring-inset"},status:{done:"",active:"",todo:""}},compoundVariants:[{orientation:"vertical",status:"active",class:"border-l-sidebar-primary bg-sidebar-accent font-semibold text-sidebar-foreground shadow-sm"},{orientation:"vertical",status:"done",class:"border-l-sidebar-border text-foreground hover:bg-sidebar-accent/50"},{orientation:"vertical",status:"todo",class:"border-l-sidebar-border text-muted-foreground hover:bg-sidebar-accent/50"},{orientation:"rail",status:"active",class:"border-l-primary"},{orientation:"rail",status:"done",class:"border-l-border"},{orientation:"rail",status:"todo",class:"border-l-border"},{orientation:"horizontal",status:"active",class:"bg-primary/10 text-primary font-medium"},{orientation:"horizontal",status:"done",class:"text-foreground hover:bg-accent"},{orientation:"horizontal",status:"todo",class:"text-muted-foreground hover:bg-accent hover:text-foreground"}],defaultVariants:{orientation:"vertical",status:"todo"}});function G(n){return n.flatMap(l=>[l,...l.steps??[]])}function H(n,l,r){return n.status?n.status:r<0?"todo":l===r?"active":l<r?"done":"todo"}function N({step:n,status:l,className:r}){const i=n.icon;return l==="done"?a.jsx(R.Check,{className:s.cn("w-4 h-4 text-positive",r)}):i?a.jsx(i,{className:s.cn("w-4 h-4",l==="active"?"text-primary":"text-muted-foreground",r)}):a.jsx("div",{className:s.cn("w-2.5 h-2.5 rounded-full",l==="active"?"bg-primary":"bg-muted-foreground/40",r)})}function J({orientation:n,steps:l,activeKey:r,onSelect:i,title:z,collapsible:u=!1,collapsed:j,defaultCollapsed:T=!1,onCollapsedChange:I,className:b,...h}){const y=n??"vertical",p=F.useOptionalDataAppShell(),q=j===void 0&&p!=null&&p.hideNavOnCollapse,[_,D]=C.useState(T),O=j??(q?p.collapsed:_),f=e=>{j===void 0&&(q?p.setCollapsed(e):D(e)),I?.(e)},d=G(l),S=new Map(d.map((e,t)=>[e.id,t])),M=r==null?-1:S.get(r)??-1,w=e=>H(e,S.get(e.id)??-1,M),x=e=>{e.disabled||i?.(e.id,e)};if(y==="vertical"&&O)return a.jsx("nav",{"data-slot":"data-app-shell-secondary-nav","data-orientation":"vertical","data-collapsed":"true",className:s.cn("flex flex-col shrink-0 w-[46px] bg-sidebar border-r border-sidebar-border",b),...h,children:a.jsxs(m.TooltipProvider,{children:[a.jsx("div",{className:"flex justify-center items-center h-11 shrink-0 border-b border-sidebar-border",children:a.jsx(v.ShellCollapseButton,{"data-slot":"data-app-shell-secondary-nav-toggle",direction:"right",label:"Expand",onClick:()=>f(!1)})}),a.jsx("div",{"data-slot":"data-app-shell-secondary-nav-items",className:"flex flex-col overflow-y-auto",children:d.map(e=>{const t=w(e);return a.jsxs(m.Tooltip,{children:[a.jsx(m.TooltipTrigger,{asChild:!0,children:a.jsx("button",{type:"button","data-slot":"data-app-shell-secondary-nav-item","data-status":t,"aria-label":e.label,"aria-current":t==="active"?"step":void 0,"aria-disabled":e.disabled||void 0,className:s.cn(g({orientation:"rail",status:t}),e.disabled&&"opacity-45 cursor-not-allowed"),onClick:()=>x(e),children:a.jsx(N,{step:e,status:t})})}),a.jsx(m.TooltipContent,{side:"right",children:e.disabled?e.disabledReason??e.label:e.label})]},e.id)})})]})});if(y==="horizontal"&&u&&O){const e=r==null?void 0:d.find(t=>t.id===r);return a.jsxs("nav",{"data-slot":"data-app-shell-secondary-nav","data-orientation":"horizontal","data-collapsed":"true",className:s.cn("flex items-center gap-1.5 min-w-0",b),...h,children:[a.jsxs(c.Select,{value:r,onValueChange:t=>{const o=d.find(P=>P.id===t);o&&x(o)},children:[a.jsx(c.SelectTrigger,{"data-slot":"data-app-shell-secondary-nav-step-select",size:"sm","aria-label":"Current step",className:"h-7 min-w-0",children:a.jsx(c.SelectValue,{placeholder:"Select step",children:e?`Step ${(S.get(e.id)??0)+1} · ${e.label}`:"Select step"})}),a.jsx(c.SelectContent,{children:d.map((t,o)=>a.jsx(c.SelectItem,{value:t.id,disabled:t.disabled,children:`Step ${o+1} · ${t.label}`},t.id))})]}),a.jsx(v.ShellCollapseButton,{"data-slot":"data-app-shell-secondary-nav-toggle",direction:"down",label:"Show steps",tooltipSide:"bottom",onClick:()=>f(!1)})]})}if(y==="horizontal")return a.jsxs("nav",{"data-slot":"data-app-shell-secondary-nav","data-orientation":"horizontal","data-collapsed":"false",className:s.cn(k({orientation:"horizontal"}),b),...h,children:[a.jsx("div",{"data-slot":"data-app-shell-secondary-nav-items",className:"flex flex-row items-center gap-1 min-w-0 overflow-x-auto flex-1",children:d.map((e,t)=>{const o=w(e);return a.jsxs(C.Fragment,{children:[t>0&&a.jsx(R.ChevronRight,{"aria-hidden":"true",className:"w-4 h-4 shrink-0 text-muted-foreground/50"}),a.jsxs("button",{type:"button","data-slot":"data-app-shell-secondary-nav-item","data-status":o,"aria-current":o==="active"?"step":void 0,title:e.disabled?e.disabledReason??e.label:void 0,className:s.cn(g({orientation:"horizontal",status:o})),onClick:()=>x(e),disabled:e.disabled,children:[a.jsx(N,{step:e,status:o,className:"shrink-0"}),a.jsx("span",{children:e.label}),e.badge!=null&&a.jsx(A.Badge,{variant:"secondary",className:"h-4 px-1.5 text-[10px]",children:e.badge})]})]},e.id)})}),u&&a.jsx(v.ShellCollapseButton,{"data-slot":"data-app-shell-secondary-nav-toggle",direction:"up",label:"Collapse steps",tooltipSide:"bottom",className:"ml-2",onClick:()=>f(!0)})]});const V=(e,t)=>{const o=w(e);return a.jsxs("button",{type:"button","data-slot":"data-app-shell-secondary-nav-item","data-status":o,"aria-current":o==="active"?"step":void 0,title:e.disabled?e.disabledReason??e.label:void 0,className:s.cn(g({orientation:"vertical",status:o}),t&&"pl-8"),onClick:()=>x(e),disabled:e.disabled,children:[a.jsx("span",{className:"flex items-center justify-center w-6 h-6 shrink-0",children:a.jsx(N,{step:e,status:o})}),a.jsx("span",{className:s.cn("text-sm truncate min-w-0",o==="todo"&&"font-light"),children:e.label}),e.badge!=null&&a.jsx(A.Badge,{variant:"secondary",className:"ml-auto h-4 px-1.5 text-[10px]",children:e.badge})]},e.id)};return a.jsxs("nav",{"data-slot":"data-app-shell-secondary-nav","data-orientation":"vertical","data-collapsed":"false",className:s.cn(k({orientation:"vertical"}),"w-[180px]",b),...h,children:[(z!=null||u)&&a.jsxs("div",{"data-slot":"data-app-shell-secondary-nav-header",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",children:[a.jsx("span",{className:"flex-1 truncate",children:z}),u&&a.jsx(v.ShellCollapseButton,{"data-slot":"data-app-shell-secondary-nav-toggle",direction:"left",label:"Collapse",onClick:()=>f(!0)})]}),a.jsx("div",{"data-slot":"data-app-shell-secondary-nav-items",className:"flex flex-col overflow-y-auto",children:l.map(e=>a.jsxs(C.Fragment,{children:[V(e,!1),e.steps?.map(t=>V(t,!0))]},e.id))})]})}exports.DataAppShellSecondaryNav=J;exports.dataAppShellSecondaryNavItemVariants=g;exports.dataAppShellSecondaryNavVariants=k;
2
2
  //# sourceMappingURL=SecondaryNav.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"SecondaryNav.cjs","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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"}
1
+ {"version":3,"file":"SecondaryNav.cjs","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,63 @@
1
+ import { VariantProps } from 'class-variance-authority';
2
+ import { LucideIcon } from 'lucide-react';
3
+ import * as React from "react";
4
+ export type NavStepStatus = "done" | "active" | "todo";
5
+ export interface NavStep {
6
+ /** Unique identifier */
7
+ id: string;
8
+ /** Display label */
9
+ label: string;
10
+ /** Lucide icon or custom React SVG component */
11
+ icon?: LucideIcon | React.FC<React.SVGProps<SVGSVGElement>>;
12
+ /** Optional count/status badge */
13
+ badge?: React.ReactNode;
14
+ /** Explicit status — overrides the linear derivation from `activeKey` */
15
+ status?: NavStepStatus;
16
+ /** Disables the step */
17
+ disabled?: boolean;
18
+ /** Tooltip/title text explaining why the step is disabled */
19
+ disabledReason?: string;
20
+ /** One level of nesting — child steps rendered indented under this step */
21
+ steps?: NavStep[];
22
+ }
23
+ export type DataAppShellSecondaryNavOrientation = "vertical" | "horizontal";
24
+ declare const dataAppShellSecondaryNavVariants: (props?: ({
25
+ orientation?: "horizontal" | "vertical" | null | undefined;
26
+ } & import('class-variance-authority/types').ClassProp) | undefined) => string;
27
+ declare const dataAppShellSecondaryNavItemVariants: (props?: ({
28
+ orientation?: "horizontal" | "vertical" | "rail" | null | undefined;
29
+ status?: "done" | "active" | "todo" | null | undefined;
30
+ } & import('class-variance-authority/types').ClassProp) | undefined) => string;
31
+ export interface DataAppShellSecondaryNavProps extends Omit<React.ComponentProps<"nav">, "onSelect" | "title">, VariantProps<typeof dataAppShellSecondaryNavVariants> {
32
+ /** Step entries; one level of nesting via `steps` on a step */
33
+ steps: NavStep[];
34
+ /** Controlled active step id — steps before it derive `done`, after it `todo` */
35
+ activeKey?: string;
36
+ /** Called with the selected step id after the step resolves as enabled */
37
+ onSelect?: (key: string, step: NavStep) => void;
38
+ /** Panel title shown in the vertical header (e.g. "Steps") */
39
+ title?: React.ReactNode;
40
+ /** Renders the collapse toggle. Vertical collapses to an icon rail;
41
+ * horizontal collapses to a compact step dropdown. */
42
+ collapsible?: boolean;
43
+ /** Controlled collapsed state. When omitted inside a `DataAppShell`, the
44
+ * shell's single collapse state drives it (one toggle for all zones). */
45
+ collapsed?: boolean;
46
+ /** Uncontrolled initial collapsed state */
47
+ defaultCollapsed?: boolean;
48
+ /** Called when the collapse toggle flips the state */
49
+ onCollapsedChange?: (collapsed: boolean) => void;
50
+ }
51
+ /**
52
+ * The Data App Shell's secondary (per-page/step) nav — one `steps` model
53
+ * rendered on either axis via `orientation`:
54
+ *
55
+ * - **vertical** — collapsible left panel; collapses to an icon-only rail
56
+ * with tooltips and a ▸ expand toggle
57
+ * - **horizontal** — wizard/stepper row above the main content
58
+ *
59
+ * Step status (`done` / `active` / `todo`) is derived linearly from
60
+ * `activeKey`, or set explicitly per step. Supports one level of nesting.
61
+ */
62
+ declare function DataAppShellSecondaryNav({ orientation, steps, activeKey, onSelect, title, collapsible, collapsed, defaultCollapsed, onCollapsedChange, className, ...props }: DataAppShellSecondaryNavProps): import("react/jsx-runtime").JSX.Element;
63
+ export { DataAppShellSecondaryNav, dataAppShellSecondaryNavVariants, dataAppShellSecondaryNavItemVariants, };
@@ -4,9 +4,9 @@ import { ChevronRight as M, Check as E } from "lucide-react";
4
4
  import * as S from "react";
5
5
  import { ShellCollapseButton as v } from "./CollapseButton.js";
6
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";
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
10
  import { cn as i } from "../../../lib/utils.js";
11
11
  const I = R("shrink-0", {
12
12
  variants: {
@@ -0,0 +1,20 @@
1
+ import * as React from "react";
2
+ export type DataAppShellNavVariant = "vertical" | "horizontal";
3
+ export interface DataAppShellContextValue {
4
+ /** Which axis the primary nav renders on. */
5
+ navVariant: DataAppShellNavVariant;
6
+ /** The shell's single collapse state — primary + secondary collapse together. */
7
+ collapsed: boolean;
8
+ /** Flip the shell collapse state (no-op when the shell is not collapsible). */
9
+ setCollapsed: (collapsed: boolean) => void;
10
+ /** When true, collapsing hides the primary rail so one icon rail remains. */
11
+ hideNavOnCollapse: boolean;
12
+ }
13
+ export declare function DataAppShellProvider({ value, children, }: {
14
+ value: DataAppShellContextValue;
15
+ children: React.ReactNode;
16
+ }): import("react/jsx-runtime").JSX.Element;
17
+ /** Shell layout state; throws outside a `DataAppShell`. */
18
+ export declare function useDataAppShell(): DataAppShellContextValue;
19
+ /** Shell layout state, or `null` when rendered outside a `DataAppShell`. */
20
+ export declare function useOptionalDataAppShell(): DataAppShellContextValue | null;
@@ -0,0 +1,12 @@
1
+ export { DataAppShell } from './DataAppShell';
2
+ export { DataAppShellPrimaryNav, dataAppShellPrimaryNavVariants, dataAppShellPrimaryNavItemVariants, } from './PrimaryNav';
3
+ export { DataAppShellRightPanel, DataAppShellRightPanelTrigger, dataAppShellRightPanelTriggerVariants, } from './RightPanel';
4
+ export type { DataAppShellProps, BreadcrumbItemConfig } from './DataAppShell';
5
+ export type { DataAppShellRightPanelProps, DataAppShellRightPanelTriggerProps, DataAppShellRightPanelVariant, } from './RightPanel';
6
+ export type { DataAppShellPrimaryNavProps, DataAppShellPrimaryNavVariant, NavPage, NavGroup, } from './PrimaryNav';
7
+ export { DataAppShellSecondaryNav, dataAppShellSecondaryNavVariants, dataAppShellSecondaryNavItemVariants, } from './SecondaryNav';
8
+ export type { DataAppShellSecondaryNavProps, DataAppShellSecondaryNavOrientation, NavStep, NavStepStatus, } from './SecondaryNav';
9
+ export { useDataAppShell, useOptionalDataAppShell } from './ShellContext';
10
+ export type { DataAppShellContextValue, DataAppShellNavVariant } from './ShellContext';
11
+ export { ShellCollapseButton } from './CollapseButton';
12
+ export type { ShellCollapseButtonProps } from './CollapseButton';
@@ -0,0 +1,12 @@
1
+ import { LucideIcon } from 'lucide-react';
2
+ import * as React from "react";
3
+ export type EmptyStateVariant = "no-data" | "no-results" | "no-access" | "empty-folder" | "server-error";
4
+ export interface EmptyStateProps extends React.ComponentProps<"div"> {
5
+ variant?: EmptyStateVariant;
6
+ title?: string;
7
+ description?: string;
8
+ icon?: LucideIcon | React.FC<React.SVGProps<SVGSVGElement>>;
9
+ action?: React.ReactNode;
10
+ }
11
+ declare function EmptyState({ variant, title, description, icon, action, className, ...props }: EmptyStateProps): import("react/jsx-runtime").JSX.Element;
12
+ export { EmptyState };
@@ -0,0 +1,2 @@
1
+ export { EmptyState } from './EmptyState';
2
+ export type { EmptyStateProps, EmptyStateVariant } from './EmptyState';
@@ -1,2 +1,2 @@
1
- "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("react/jsx-runtime"),i=require("../../ui/field.cjs"),l=require("../../ui/separator.cjs"),n=require("../../../lib/utils.cjs");function a({heading:t,description:s,children:r,className:o,...c}){return e.jsxs("div",{"data-slot":"form-section",className:n.cn("flex flex-col gap-4",o),...c,children:[e.jsxs("div",{className:"space-y-0.5",children:[e.jsx("p",{className:"text-sm font-semibold",children:t}),s&&e.jsx("p",{className:"text-sm text-muted-foreground",children:s})]}),e.jsx(l.Separator,{}),e.jsx(i.FieldGroup,{children:r})]})}exports.FormSection=a;
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("react/jsx-runtime"),c=require("../../../ui/field.cjs"),l=require("../../../ui/separator.cjs"),n=require("../../../lib/utils.cjs");function a({heading:t,description:s,children:r,className:o,...i}){return e.jsxs("div",{"data-slot":"form-section",className:n.cn("flex flex-col gap-4",o),...i,children:[e.jsxs("div",{className:"space-y-0.5",children:[e.jsx("p",{className:"text-sm font-semibold",children:t}),s&&e.jsx("p",{className:"text-sm text-muted-foreground",children:s})]}),e.jsx(l.Separator,{}),e.jsx(c.FieldGroup,{children:r})]})}exports.FormSection=a;
2
2
  //# sourceMappingURL=FormSection.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"FormSection.cjs","sources":["../../../../src/components/composed/FormPatterns/FormSection.tsx"],"sourcesContent":["import * as React from \"react\"\n\nimport { FieldGroup } from \"@/components/ui/field\"\nimport { Separator } from \"@/components/ui/separator\"\nimport { cn } from \"@/lib/utils\"\n\nexport interface FormSectionProps extends React.ComponentProps<\"div\"> {\n heading: string\n description?: string\n children: React.ReactNode\n}\n\nexport function FormSection({\n heading,\n description,\n children,\n className,\n ...props\n}: FormSectionProps) {\n return (\n <div\n data-slot=\"form-section\"\n className={cn(\"flex flex-col gap-4\", className)}\n {...props}\n >\n <div className=\"space-y-0.5\">\n <p className=\"text-sm font-semibold\">{heading}</p>\n {description && (\n <p className=\"text-sm text-muted-foreground\">{description}</p>\n )}\n </div>\n <Separator />\n <FieldGroup>{children}</FieldGroup>\n </div>\n )\n}\n"],"names":["FormSection","heading","description","children","className","props","jsxs","cn","jsx","Separator","FieldGroup"],"mappings":"6NAYO,SAASA,EAAY,CAC1B,QAAAC,EACA,YAAAC,EACA,SAAAC,EACA,UAAAC,EACA,GAAGC,CACL,EAAqB,CACnB,OACEC,EAAAA,KAAC,MAAA,CACC,YAAU,eACV,UAAWC,EAAAA,GAAG,sBAAuBH,CAAS,EAC7C,GAAGC,EAEJ,SAAA,CAAAC,EAAAA,KAAC,MAAA,CAAI,UAAU,cACb,SAAA,CAAAE,EAAAA,IAAC,IAAA,CAAE,UAAU,wBAAyB,SAAAP,EAAQ,EAC7CC,GACCM,EAAAA,IAAC,IAAA,CAAE,UAAU,gCAAiC,SAAAN,CAAA,CAAY,CAAA,EAE9D,QACCO,EAAAA,UAAA,EAAU,EACXD,MAACE,EAAAA,YAAY,SAAAP,CAAA,CAAS,CAAA,CAAA,CAAA,CAG5B"}
1
+ {"version":3,"file":"FormSection.cjs","sources":["../../../../src/components/composed/FormPatterns/FormSection.tsx"],"sourcesContent":["import * as React from \"react\"\n\nimport { FieldGroup } from \"@/components/ui/field\"\nimport { Separator } from \"@/components/ui/separator\"\nimport { cn } from \"@/lib/utils\"\n\nexport interface FormSectionProps extends React.ComponentProps<\"div\"> {\n heading: string\n description?: string\n children: React.ReactNode\n}\n\nexport function FormSection({\n heading,\n description,\n children,\n className,\n ...props\n}: FormSectionProps) {\n return (\n <div\n data-slot=\"form-section\"\n className={cn(\"flex flex-col gap-4\", className)}\n {...props}\n >\n <div className=\"space-y-0.5\">\n <p className=\"text-sm font-semibold\">{heading}</p>\n {description && (\n <p className=\"text-sm text-muted-foreground\">{description}</p>\n )}\n </div>\n <Separator />\n <FieldGroup>{children}</FieldGroup>\n </div>\n )\n}\n"],"names":["FormSection","heading","description","children","className","props","jsxs","cn","jsx","Separator","FieldGroup"],"mappings":"mOAYO,SAASA,EAAY,CAC1B,QAAAC,EACA,YAAAC,EACA,SAAAC,EACA,UAAAC,EACA,GAAGC,CACL,EAAqB,CACnB,OACEC,EAAAA,KAAC,MAAA,CACC,YAAU,eACV,UAAWC,EAAAA,GAAG,sBAAuBH,CAAS,EAC7C,GAAGC,EAEJ,SAAA,CAAAC,EAAAA,KAAC,MAAA,CAAI,UAAU,cACb,SAAA,CAAAE,EAAAA,IAAC,IAAA,CAAE,UAAU,wBAAyB,SAAAP,EAAQ,EAC7CC,GACCM,EAAAA,IAAC,IAAA,CAAE,UAAU,gCAAiC,SAAAN,CAAA,CAAY,CAAA,EAE9D,QACCO,EAAAA,UAAA,EAAU,EACXD,MAACE,EAAAA,YAAY,SAAAP,CAAA,CAAS,CAAA,CAAA,CAAA,CAG5B"}
@@ -0,0 +1,7 @@
1
+ import * as React from "react";
2
+ export interface FormSectionProps extends React.ComponentProps<"div"> {
3
+ heading: string;
4
+ description?: string;
5
+ children: React.ReactNode;
6
+ }
7
+ export declare function FormSection({ heading, description, children, className, ...props }: FormSectionProps): import("react/jsx-runtime").JSX.Element;
@@ -1,6 +1,6 @@
1
1
  import { jsxs as r, jsx as e } from "react/jsx-runtime";
2
- import { FieldGroup as l } from "../../ui/field.js";
3
- import { Separator as c } from "../../ui/separator.js";
2
+ import { FieldGroup as l } from "../../../ui/field.js";
3
+ import { Separator as c } from "../../../ui/separator.js";
4
4
  import { cn as i } from "../../../lib/utils.js";
5
5
  function x({
6
6
  heading: t,
@@ -0,0 +1 @@
1
+ export * from './FormSection';
@@ -1,2 +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;
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"),_=require("../../../hooks/use-is-dark.cjs"),z=require("../../../lib/utils.cjs");function I(e){const t=Object.create(null,{[Symbol.toStringTag]:{value:"Module"}});if(e){for(const r in e)if(r!=="default"){const u=Object.getOwnPropertyDescriptor(e,r);Object.defineProperty(t,r,u.get?u:{enumerable:!0,get:()=>e[r]})}}return t.default=e,Object.freeze(t)}const c=I(S),h=300;function M(e){return e.replace(/width=(['"])[^'"]*\1/,"width='100%'").replace(/height=(['"])[^'"]*\1/,"height='100%'")}function O({smiles:e,label:t,dark:r,alt:u,drawOptions:d,loadingContent:j,errorContent:k,onError:f,className:x,...p}){const{rdkit:a,status:s}=D.useRDKit(),v=_.useIsDark(),g=r??v,l=u??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:M(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:z.cn("relative flex items-center justify-center",x),title:l,"aria-busy":s==="loading",...p,children:[s==="loading"&&(j??n.jsx(N.Skeleton,{role:"img","aria-label":`Loading structure: ${l}`,className:"size-full rounded-md"})),y&&(k??n.jsxs("div",{role:"img","aria-label":`Unable to render structure: ${l}`,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":l,className:"size-full [&>svg]:size-full",dangerouslySetInnerHTML:{__html:i}})]})}exports.MoleculeStructure=O;
2
2
  //# sourceMappingURL=MoleculeStructure.cjs.map
@@ -1 +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"}
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":"+mBA4CMA,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,43 @@
1
+ import * as React from "react";
2
+ export interface MoleculeStructureProps extends Omit<React.ComponentProps<"div">, "children" | "onError"> {
3
+ /** SMILES string to render as a 2D structure. */
4
+ smiles: string;
5
+ /** Optional caption drawn beneath the structure by RDKit. */
6
+ label?: string;
7
+ /**
8
+ * Force dark/light drawing colours. Defaults to following the active theme
9
+ * (the `.dark` class on the document root).
10
+ */
11
+ dark?: boolean;
12
+ /**
13
+ * Accessible label for the structure. Defaults to the SMILES string.
14
+ * Rendered as the SVG group's `aria-label` and the wrapper's title.
15
+ */
16
+ alt?: string;
17
+ /**
18
+ * Extra RDKit MolDraw2D options. Pass a stable (memoised or module-level)
19
+ * reference — a new object each render re-parses the SMILES through RDKit.
20
+ */
21
+ drawOptions?: Record<string, unknown>;
22
+ /** Rendered while the WASM module and structure are being prepared. */
23
+ loadingContent?: React.ReactNode;
24
+ /** Rendered when the SMILES is invalid or RDKit fails to load. */
25
+ errorContent?: React.ReactNode;
26
+ /** Called once when the SMILES cannot be parsed into a valid molecule. */
27
+ onError?: (smiles: string) => void;
28
+ }
29
+ /**
30
+ * Core cheminformatics primitive: render a 2D chemical structure from a SMILES
31
+ * string. RDKit's WASM module is loaded lazily on first mount (see
32
+ * {@link loadRDKit}), so pages that never render a molecule pay nothing for it.
33
+ *
34
+ * The output is a vector SVG that fills this component's box — size it with
35
+ * `className` (e.g. `className="size-32"`). Invalid SMILES render a fallback
36
+ * rather than throwing.
37
+ *
38
+ * @example
39
+ * ```tsx
40
+ * <MoleculeStructure smiles="CC(=O)Oc1ccccc1C(=O)O" className="size-40" />
41
+ * ```
42
+ */
43
+ export declare function MoleculeStructure({ smiles, label, dark, alt, drawOptions, loadingContent, errorContent, onError, className, ...props }: MoleculeStructureProps): import("react/jsx-runtime").JSX.Element;
@@ -3,7 +3,7 @@ import { AlertTriangleIcon as z } from "lucide-react";
3
3
  import * as a from "react";
4
4
  import { moleculeToSvg as D } from "./rdkit-loader.js";
5
5
  import { useRDKit as I } from "./use-rdkit.js";
6
- import { Skeleton as S } from "../../ui/skeleton.js";
6
+ import { Skeleton as S } from "../../../ui/skeleton.js";
7
7
  import { useIsDark as j } from "../../../hooks/use-is-dark.js";
8
8
  import { cn as w } from "../../../lib/utils.js";
9
9
  const h = 300;
@@ -0,0 +1,3 @@
1
+ export { MoleculeStructure, type MoleculeStructureProps } from './MoleculeStructure';
2
+ export { useRDKit, type RDKitStatus, type UseRDKitResult } from './use-rdkit';
3
+ export { loadRDKit, configureRDKit, moleculeToSvg, type RDKitLoaderConfig, type MoleculeSvgOptions, } from './rdkit-loader';
@@ -1,2 +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;
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});function g(e){const t=Object.create(null,{[Symbol.toStringTag]:{value:"Module"}});if(e){for(const n in e)if(n!=="default"){const i=Object.getOwnPropertyDescriptor(e,n);Object.defineProperty(t,n,i.get?i:{enumerable:!0,get:()=>e[n]})}}return t.default=e,Object.freeze(t)}const o={};function m(e){r||Object.assign(o,e)}let r=null;async function b(){const e=await Promise.resolve().then(()=>g(require("@rdkit/rdkit")));return e.default??e}function p(){return o.instance?Promise.resolve(o.instance):r||(r=(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??b)()}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)})})(),r.catch(()=>{r=null}),r)}function y(e,t,n={}){const{width:i=250,height:s=200,dark:u=!1,legend:a,drawOptions:d}=n,c=e.get_mol(t);if(!c)return null;try{if(!c.is_valid())return null;const f={width:i,height:s,backgroundColour:[0,0,0,0],...a?{legend:a}:{},...u?{atomColourPalette:O}:{},...d};return c.get_svg_with_highlights(JSON.stringify(f)).replace(/^\s*<\?xml[^>]*\?>\s*/i,"")}finally{c.delete()}}const l=255;function w(e){return[parseInt(e.slice(1,3),16)/l,parseInt(e.slice(3,5),16)/l,parseInt(e.slice(5,7),16)/l]}const D={"-1":"#e5e5e5",6:"#e5e5e5",7:"#75a1ff",8:"#ff7575",9:"#8ceb99",15:"#ff9e59",16:"#f2cc59",17:"#8ceb99",35:"#e69e73",53:"#c499f2"},O=Object.fromEntries(Object.entries(D).map(([e,t])=>[e,w(t)]));exports.configureRDKit=m;exports.loadRDKit=p;exports.moleculeToSvg=y;
2
2
  //# sourceMappingURL=rdkit-loader.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"rdkit-loader.cjs","sources":["../../../../src/components/composed/MoleculeStructure/rdkit-loader.ts"],"sourcesContent":["import type { RDKitModule } from \"@rdkit/rdkit\"\n\n/**\n * Loader for the RDKit.js WebAssembly module.\n *\n * RDKit ships a ~6.6 MB `.wasm` blob, so it must never be part of the main\n * bundle. It is loaded lazily, once per page, the first time a molecule\n * actually needs rendering.\n *\n * **Air-gapped by default, no CDN.** The loader dynamically imports the\n * `@rdkit/rdkit` package the consumer has installed — nothing is fetched from a\n * public CDN. Molecule rendering is opt-in: `@rdkit/rdkit` is an optional\n * peer dependency, so a consumer that never renders a structure needn't install\n * it, and one that does simply adds it to their own dependencies.\n *\n * **Bundled apps should set `wasmSrc`.** Without it, RDKit resolves\n * `RDKit_minimal.wasm` relative to the glue script, which a bundler (Vite,\n * webpack, …) usually does not emit next to the output — so the fetch 404s at\n * runtime and the first molecule silently fails to load. Copy the WASM into a\n * served path (or resolve it via your bundler, e.g. Vite's `?url`) and pass it\n * to {@link configureRDKit} once at startup. Alternatively hand the loader a\n * module you initialised yourself (`instance`).\n *\n * @see https://www.rdkitjs.com\n */\n\n/** The `initRDKitModule` factory exported by `@rdkit/rdkit`. */\ntype RDKitFactory = (options?: {\n locateFile?: () => string\n print?: (msg: string) => void\n printErr?: (msg: string) => void\n}) => Promise<RDKitModule>\n\n/** Options controlling how the RDKit module is located and loaded. */\nexport interface RDKitLoaderConfig {\n /**\n * URL of the `RDKit_minimal.wasm` binary, passed to RDKit as `locateFile`.\n * Set this when your bundler doesn't serve the WASM next to the glue script\n * (e.g. copy it into your app's public dir and point here). When omitted,\n * RDKit's own default resolution is used.\n */\n wasmSrc?: string\n /**\n * A module already initialised by the consumer (e.g. shared with other parts\n * of the app). When provided, no import or network work is done.\n */\n instance?: RDKitModule\n /**\n * Override how the `initRDKitModule` factory is obtained. Defaults to\n * `import(\"@rdkit/rdkit\")`. Provide this only for unusual setups (custom\n * bundler resolution, a vendored copy, etc.).\n */\n importFactory?: () => Promise<RDKitFactory>\n}\n\nconst defaultConfig: RDKitLoaderConfig = {}\n\n/**\n * Set process-wide defaults for how RDKit is loaded. Call once, before the\n * first molecule renders — typically at app startup. Later calls are ignored\n * once loading has begun.\n *\n * Bundled apps should set `wasmSrc` — see the module doc above for why.\n *\n * @example\n * ```ts\n * // Serve the WASM yourself (e.g. copied into /public) — no CDN, air-gapped.\n * configureRDKit({ wasmSrc: \"/assets/RDKit_minimal.wasm\" })\n * // …or resolve it from the installed package via your bundler (Vite):\n * import wasmSrc from \"@rdkit/rdkit/dist/RDKit_minimal.wasm?url\"\n * configureRDKit({ wasmSrc })\n * ```\n */\nexport function configureRDKit(config: RDKitLoaderConfig): void {\n if (loadPromise) return\n Object.assign(defaultConfig, config)\n}\n\nlet loadPromise: Promise<RDKitModule> | null = null\n\n/** Dynamically import the installed `@rdkit/rdkit` and return its factory. */\nasync function importRDKitFactory(): Promise<RDKitFactory> {\n const mod = (await import(\"@rdkit/rdkit\")) as unknown as {\n default?: RDKitFactory\n } & RDKitFactory\n // The package exports the factory as both `module.exports` and `.default`.\n return mod.default ?? (mod as RDKitFactory)\n}\n\n/**\n * Load and initialise the RDKit module, memoised so the WASM is fetched and\n * compiled only once per page. Safe to call from many components concurrently;\n * they all await the same promise.\n *\n * @throws if run outside a browser, if `@rdkit/rdkit` isn't installed, or if\n * the WASM cannot be loaded.\n */\nexport function loadRDKit(): Promise<RDKitModule> {\n if (defaultConfig.instance) {\n return Promise.resolve(defaultConfig.instance)\n }\n if (loadPromise) return loadPromise\n\n loadPromise = (async () => {\n if (typeof window === \"undefined\" || typeof document === \"undefined\") {\n throw new Error(\"RDKit can only be loaded in a browser environment\")\n }\n\n let initRDKitModule: RDKitFactory\n try {\n initRDKitModule = await (defaultConfig.importFactory ?? importRDKitFactory)()\n } catch (cause) {\n const detail = cause instanceof Error ? ` (${cause.message})` : \"\"\n throw new Error(\n `Failed to load @rdkit/rdkit${detail}. Install it as a dependency to ` +\n \"render molecule structures: `yarn add @rdkit/rdkit`.\",\n )\n }\n\n // RDKit is an Emscripten module: its C++ stdout/stderr (including the noisy\n // \"SMILES Parse Error\" it emits for invalid input we handle gracefully)\n // flow through `print`/`printErr`, which default to console.log/error.\n // Route them to console.debug so a bad SMILES never spams the host app's\n // console — invalid input is surfaced through the renderer's fallback UI.\n return initRDKitModule({\n ...(defaultConfig.wasmSrc\n ? { locateFile: () => defaultConfig.wasmSrc as string }\n : {}),\n print: (msg: string) => console.debug(\"[RDKit]\", msg),\n printErr: (msg: string) => console.debug(\"[RDKit]\", msg),\n })\n })()\n\n // Let a failed attempt be retried on the next call rather than caching the\n // rejection forever.\n loadPromise.catch(() => {\n loadPromise = null\n })\n\n return loadPromise\n}\n\n/** Drawing options for {@link moleculeToSvg}. */\nexport interface MoleculeSvgOptions {\n /** Rendered width in pixels. @default 250 */\n width?: number\n /** Rendered height in pixels. @default 200 */\n height?: number\n /** Lighten carbons/bonds so the structure is legible on dark surfaces. */\n dark?: boolean\n /** Optional caption drawn beneath the structure by RDKit. */\n legend?: string\n /**\n * Extra RDKit MolDraw2D options, merged last. See\n * https://www.rdkitjs.com/#drawing-molecules-all-options\n */\n drawOptions?: Record<string, unknown>\n}\n\n/**\n * Render a SMILES string to an SVG string using an initialised RDKit module.\n * Returns `null` when the SMILES cannot be parsed. Frees the underlying C++\n * molecule before returning, so callers never need to.\n *\n * Synchronous by design so it can feed render callbacks that must return a\n * string (e.g. the interactive scatter's `tooltip.content`) — load RDKit ahead\n * of time with {@link loadRDKit} or {@link useRDKit}, then call this.\n */\nexport function moleculeToSvg(\n rdkit: RDKitModule,\n smiles: string,\n options: MoleculeSvgOptions = {},\n): string | null {\n const { width = 250, height = 200, dark = false, legend, drawOptions } = options\n\n const mol = rdkit.get_mol(smiles)\n if (!mol) return null\n\n try {\n if (!mol.is_valid()) return null\n\n const details: Record<string, unknown> = {\n width,\n height,\n // Transparent background so the structure sits on the kit's surface\n // tokens in both light and dark mode.\n backgroundColour: [0, 0, 0, 0],\n ...(legend ? { legend } : {}),\n ...(dark ? { atomColourPalette: DARK_ATOM_PALETTE } : {}),\n ...drawOptions,\n }\n\n // RDKit prefixes an XML prolog (`<?xml …?>`) which is invalid inside inline\n // HTML; strip it so the SVG embeds cleanly whether injected via\n // dangerouslySetInnerHTML or dropped into a chart tooltip string.\n return mol\n .get_svg_with_highlights(JSON.stringify(details))\n .replace(/^\\s*<\\?xml[^>]*\\?>\\s*/i, \"\")\n } finally {\n mol.delete()\n }\n}\n\nconst RGB_MAX = 255\n\n/** Parse a `#rrggbb` string into RDKit's 0–1 RGB triple. */\nfunction hexToRgb01(hex: string): [number, number, number] {\n return [\n parseInt(hex.slice(1, 3), 16) / RGB_MAX,\n parseInt(hex.slice(3, 5), 16) / RGB_MAX,\n parseInt(hex.slice(5, 7), 16) / RGB_MAX,\n ]\n}\n\n/**\n * Atom colours for dark surfaces. RDKit's stock CPK palette (dark blue N, etc.)\n * is too dim on a dark background, so carbons/default are lightened and the\n * common heteroatoms shifted to brighter, higher-contrast hues. Keys are atomic\n * numbers; `-1` is the default for anything unlisted.\n */\nconst DARK_ATOM_HEX: Record<string, string> = {\n \"-1\": \"#e5e5e5\", // default (carbon skeleton)\n \"6\": \"#e5e5e5\", // C\n \"7\": \"#75a1ff\", // N — soft blue (was hard-to-read dark blue)\n \"8\": \"#ff7575\", // O — soft red\n \"9\": \"#8ceb99\", // F\n \"15\": \"#ff9e59\", // P\n \"16\": \"#f2cc59\", // S\n \"17\": \"#8ceb99\", // Cl\n \"35\": \"#e69e73\", // Br\n \"53\": \"#c499f2\", // I\n}\n\nconst DARK_ATOM_PALETTE = Object.fromEntries(\n Object.entries(DARK_ATOM_HEX).map(([key, hex]) => [key, hexToRgb01(hex)]),\n) as Record<string, [number, number, number]>\n"],"names":["defaultConfig","configureRDKit","config","loadPromise","importRDKitFactory","mod","loadRDKit","initRDKitModule","cause","detail","msg","moleculeToSvg","rdkit","smiles","options","width","height","dark","legend","drawOptions","mol","details","DARK_ATOM_PALETTE","RGB_MAX","hexToRgb01","hex","DARK_ATOM_HEX","key"],"mappings":"2hBAuDA,MAAMA,EAAmC,CAAA,EAkBlC,SAASC,EAAeC,EAAiC,CAC1DC,GACJ,OAAO,OAAOH,EAAeE,CAAM,CACrC,CAEA,IAAIC,EAA2C,KAG/C,eAAeC,GAA4C,CACzD,MAAMC,EAAO,KAAM,QAAO,cAAc,EAIxC,OAAOA,EAAI,SAAYA,CACzB,CAUO,SAASC,GAAkC,CAChD,OAAIN,EAAc,SACT,QAAQ,QAAQA,EAAc,QAAQ,EAE3CG,IAEJA,GAAe,SAAY,CACzB,GAAI,OAAO,OAAW,KAAe,OAAO,SAAa,IACvD,MAAM,IAAI,MAAM,mDAAmD,EAGrE,IAAII,EACJ,GAAI,CACFA,EAAkB,MAAOP,EAAc,eAAiBI,GAAA,CAC1D,OAASI,EAAO,CACd,MAAMC,EAASD,aAAiB,MAAQ,KAAKA,EAAM,OAAO,IAAM,GAChE,MAAM,IAAI,MACR,8BAA8BC,CAAM,wFAAA,CAGxC,CAOA,OAAOF,EAAgB,CACrB,GAAIP,EAAc,QACd,CAAE,WAAY,IAAMA,EAAc,OAAA,EAClC,CAAA,EACJ,MAAQU,GAAgB,QAAQ,MAAM,UAAWA,CAAG,EACpD,SAAWA,GAAgB,QAAQ,MAAM,UAAWA,CAAG,CAAA,CACxD,CACH,GAAA,EAIAP,EAAY,MAAM,IAAM,CACtBA,EAAc,IAChB,CAAC,EAEMA,EACT,CA4BO,SAASQ,EACdC,EACAC,EACAC,EAA8B,CAAA,EACf,CACf,KAAM,CAAE,MAAAC,EAAQ,IAAK,OAAAC,EAAS,IAAK,KAAAC,EAAO,GAAO,OAAAC,EAAQ,YAAAC,CAAA,EAAgBL,EAEnEM,EAAMR,EAAM,QAAQC,CAAM,EAChC,GAAI,CAACO,EAAK,OAAO,KAEjB,GAAI,CACF,GAAI,CAACA,EAAI,SAAA,EAAY,OAAO,KAE5B,MAAMC,EAAmC,CACvC,MAAAN,EACA,OAAAC,EAGA,iBAAkB,CAAC,EAAG,EAAG,EAAG,CAAC,EAC7B,GAAIE,EAAS,CAAE,OAAAA,CAAA,EAAW,CAAA,EAC1B,GAAID,EAAO,CAAE,kBAAmBK,CAAA,EAAsB,CAAA,EACtD,GAAGH,CAAA,EAML,OAAOC,EACJ,wBAAwB,KAAK,UAAUC,CAAO,CAAC,EAC/C,QAAQ,yBAA0B,EAAE,CACzC,QAAA,CACED,EAAI,OAAA,CACN,CACF,CAEA,MAAMG,EAAU,IAGhB,SAASC,EAAWC,EAAuC,CACzD,MAAO,CACL,SAASA,EAAI,MAAM,EAAG,CAAC,EAAG,EAAE,EAAIF,EAChC,SAASE,EAAI,MAAM,EAAG,CAAC,EAAG,EAAE,EAAIF,EAChC,SAASE,EAAI,MAAM,EAAG,CAAC,EAAG,EAAE,EAAIF,CAAA,CAEpC,CAQA,MAAMG,EAAwC,CAC5C,KAAM,UACN,EAAK,UACL,EAAK,UACL,EAAK,UACL,EAAK,UACL,GAAM,UACN,GAAM,UACN,GAAM,UACN,GAAM,UACN,GAAM,SACR,EAEMJ,EAAoB,OAAO,YAC/B,OAAO,QAAQI,CAAa,EAAE,IAAI,CAAC,CAACC,EAAKF,CAAG,IAAM,CAACE,EAAKH,EAAWC,CAAG,CAAC,CAAC,CAC1E"}
1
+ {"version":3,"file":"rdkit-loader.cjs","sources":["../../../../src/components/composed/MoleculeStructure/rdkit-loader.ts"],"sourcesContent":["import type { RDKitModule } from \"@rdkit/rdkit\"\n\n/**\n * Loader for the RDKit.js WebAssembly module.\n *\n * RDKit ships a ~6.6 MB `.wasm` blob, so it must never be part of the main\n * bundle. It is loaded lazily, once per page, the first time a molecule\n * actually needs rendering.\n *\n * **Air-gapped by default, no CDN.** The loader dynamically imports the\n * `@rdkit/rdkit` package the consumer has installed — nothing is fetched from a\n * public CDN. Molecule rendering is opt-in: `@rdkit/rdkit` is an optional\n * peer dependency, so a consumer that never renders a structure needn't install\n * it, and one that does simply adds it to their own dependencies.\n *\n * **Bundled apps should set `wasmSrc`.** Without it, RDKit resolves\n * `RDKit_minimal.wasm` relative to the glue script, which a bundler (Vite,\n * webpack, …) usually does not emit next to the output — so the fetch 404s at\n * runtime and the first molecule silently fails to load. Copy the WASM into a\n * served path (or resolve it via your bundler, e.g. Vite's `?url`) and pass it\n * to {@link configureRDKit} once at startup. Alternatively hand the loader a\n * module you initialised yourself (`instance`).\n *\n * @see https://www.rdkitjs.com\n */\n\n/** The `initRDKitModule` factory exported by `@rdkit/rdkit`. */\ntype RDKitFactory = (options?: {\n locateFile?: () => string\n print?: (msg: string) => void\n printErr?: (msg: string) => void\n}) => Promise<RDKitModule>\n\n/** Options controlling how the RDKit module is located and loaded. */\nexport interface RDKitLoaderConfig {\n /**\n * URL of the `RDKit_minimal.wasm` binary, passed to RDKit as `locateFile`.\n * Set this when your bundler doesn't serve the WASM next to the glue script\n * (e.g. copy it into your app's public dir and point here). When omitted,\n * RDKit's own default resolution is used.\n */\n wasmSrc?: string\n /**\n * A module already initialised by the consumer (e.g. shared with other parts\n * of the app). When provided, no import or network work is done.\n */\n instance?: RDKitModule\n /**\n * Override how the `initRDKitModule` factory is obtained. Defaults to\n * `import(\"@rdkit/rdkit\")`. Provide this only for unusual setups (custom\n * bundler resolution, a vendored copy, etc.).\n */\n importFactory?: () => Promise<RDKitFactory>\n}\n\nconst defaultConfig: RDKitLoaderConfig = {}\n\n/**\n * Set process-wide defaults for how RDKit is loaded. Call once, before the\n * first molecule renders — typically at app startup. Later calls are ignored\n * once loading has begun.\n *\n * Bundled apps should set `wasmSrc` — see the module doc above for why.\n *\n * @example\n * ```ts\n * // Serve the WASM yourself (e.g. copied into /public) — no CDN, air-gapped.\n * configureRDKit({ wasmSrc: \"/assets/RDKit_minimal.wasm\" })\n * // …or resolve it from the installed package via your bundler (Vite):\n * import wasmSrc from \"@rdkit/rdkit/dist/RDKit_minimal.wasm?url\"\n * configureRDKit({ wasmSrc })\n * ```\n */\nexport function configureRDKit(config: RDKitLoaderConfig): void {\n if (loadPromise) return\n Object.assign(defaultConfig, config)\n}\n\nlet loadPromise: Promise<RDKitModule> | null = null\n\n/** Dynamically import the installed `@rdkit/rdkit` and return its factory. */\nasync function importRDKitFactory(): Promise<RDKitFactory> {\n const mod = (await import(\"@rdkit/rdkit\")) as unknown as {\n default?: RDKitFactory\n } & RDKitFactory\n // The package exports the factory as both `module.exports` and `.default`.\n return mod.default ?? (mod as RDKitFactory)\n}\n\n/**\n * Load and initialise the RDKit module, memoised so the WASM is fetched and\n * compiled only once per page. Safe to call from many components concurrently;\n * they all await the same promise.\n *\n * @throws if run outside a browser, if `@rdkit/rdkit` isn't installed, or if\n * the WASM cannot be loaded.\n */\nexport function loadRDKit(): Promise<RDKitModule> {\n if (defaultConfig.instance) {\n return Promise.resolve(defaultConfig.instance)\n }\n if (loadPromise) return loadPromise\n\n loadPromise = (async () => {\n if (typeof window === \"undefined\" || typeof document === \"undefined\") {\n throw new Error(\"RDKit can only be loaded in a browser environment\")\n }\n\n let initRDKitModule: RDKitFactory\n try {\n initRDKitModule = await (defaultConfig.importFactory ?? importRDKitFactory)()\n } catch (cause) {\n const detail = cause instanceof Error ? ` (${cause.message})` : \"\"\n throw new Error(\n `Failed to load @rdkit/rdkit${detail}. Install it as a dependency to ` +\n \"render molecule structures: `yarn add @rdkit/rdkit`.\",\n )\n }\n\n // RDKit is an Emscripten module: its C++ stdout/stderr (including the noisy\n // \"SMILES Parse Error\" it emits for invalid input we handle gracefully)\n // flow through `print`/`printErr`, which default to console.log/error.\n // Route them to console.debug so a bad SMILES never spams the host app's\n // console — invalid input is surfaced through the renderer's fallback UI.\n return initRDKitModule({\n ...(defaultConfig.wasmSrc\n ? { locateFile: () => defaultConfig.wasmSrc as string }\n : {}),\n print: (msg: string) => console.debug(\"[RDKit]\", msg),\n printErr: (msg: string) => console.debug(\"[RDKit]\", msg),\n })\n })()\n\n // Let a failed attempt be retried on the next call rather than caching the\n // rejection forever.\n loadPromise.catch(() => {\n loadPromise = null\n })\n\n return loadPromise\n}\n\n/** Drawing options for {@link moleculeToSvg}. */\nexport interface MoleculeSvgOptions {\n /** Rendered width in pixels. @default 250 */\n width?: number\n /** Rendered height in pixels. @default 200 */\n height?: number\n /** Lighten carbons/bonds so the structure is legible on dark surfaces. */\n dark?: boolean\n /** Optional caption drawn beneath the structure by RDKit. */\n legend?: string\n /**\n * Extra RDKit MolDraw2D options, merged last. See\n * https://www.rdkitjs.com/#drawing-molecules-all-options\n */\n drawOptions?: Record<string, unknown>\n}\n\n/**\n * Render a SMILES string to an SVG string using an initialised RDKit module.\n * Returns `null` when the SMILES cannot be parsed. Frees the underlying C++\n * molecule before returning, so callers never need to.\n *\n * Synchronous by design so it can feed render callbacks that must return a\n * string (e.g. the interactive scatter's `tooltip.content`) — load RDKit ahead\n * of time with {@link loadRDKit} or {@link useRDKit}, then call this.\n */\nexport function moleculeToSvg(\n rdkit: RDKitModule,\n smiles: string,\n options: MoleculeSvgOptions = {},\n): string | null {\n const { width = 250, height = 200, dark = false, legend, drawOptions } = options\n\n const mol = rdkit.get_mol(smiles)\n if (!mol) return null\n\n try {\n if (!mol.is_valid()) return null\n\n const details: Record<string, unknown> = {\n width,\n height,\n // Transparent background so the structure sits on the kit's surface\n // tokens in both light and dark mode.\n backgroundColour: [0, 0, 0, 0],\n ...(legend ? { legend } : {}),\n ...(dark ? { atomColourPalette: DARK_ATOM_PALETTE } : {}),\n ...drawOptions,\n }\n\n // RDKit prefixes an XML prolog (`<?xml …?>`) which is invalid inside inline\n // HTML; strip it so the SVG embeds cleanly whether injected via\n // dangerouslySetInnerHTML or dropped into a chart tooltip string.\n return mol\n .get_svg_with_highlights(JSON.stringify(details))\n .replace(/^\\s*<\\?xml[^>]*\\?>\\s*/i, \"\")\n } finally {\n mol.delete()\n }\n}\n\nconst RGB_MAX = 255\n\n/** Parse a `#rrggbb` string into RDKit's 0–1 RGB triple. */\nfunction hexToRgb01(hex: string): [number, number, number] {\n return [\n parseInt(hex.slice(1, 3), 16) / RGB_MAX,\n parseInt(hex.slice(3, 5), 16) / RGB_MAX,\n parseInt(hex.slice(5, 7), 16) / RGB_MAX,\n ]\n}\n\n/**\n * Atom colours for dark surfaces. RDKit's stock CPK palette (dark blue N, etc.)\n * is too dim on a dark background, so carbons/default are lightened and the\n * common heteroatoms shifted to brighter, higher-contrast hues. Keys are atomic\n * numbers; `-1` is the default for anything unlisted.\n */\nconst DARK_ATOM_HEX: Record<string, string> = {\n \"-1\": \"#e5e5e5\", // default (carbon skeleton)\n \"6\": \"#e5e5e5\", // C\n \"7\": \"#75a1ff\", // N — soft blue (was hard-to-read dark blue)\n \"8\": \"#ff7575\", // O — soft red\n \"9\": \"#8ceb99\", // F\n \"15\": \"#ff9e59\", // P\n \"16\": \"#f2cc59\", // S\n \"17\": \"#8ceb99\", // Cl\n \"35\": \"#e69e73\", // Br\n \"53\": \"#c499f2\", // I\n}\n\nconst DARK_ATOM_PALETTE = Object.fromEntries(\n Object.entries(DARK_ATOM_HEX).map(([key, hex]) => [key, hexToRgb01(hex)]),\n) as Record<string, [number, number, number]>\n"],"names":["defaultConfig","configureRDKit","config","loadPromise","importRDKitFactory","mod","_interopNamespaceDefault","loadRDKit","initRDKitModule","cause","detail","msg","moleculeToSvg","rdkit","smiles","options","width","height","dark","legend","drawOptions","mol","details","DARK_ATOM_PALETTE","RGB_MAX","hexToRgb01","hex","DARK_ATOM_HEX","key"],"mappings":"6VAuDA,MAAMA,EAAmC,CAAA,EAkBlC,SAASC,EAAeC,EAAiC,CAC1DC,GACJ,OAAO,OAAOH,EAAeE,CAAM,CACrC,CAEA,IAAIC,EAA2C,KAG/C,eAAeC,GAA4C,CACzD,MAAMC,EAAO,MAAM,QAAA,QAAA,EAAA,KAAA,IAAAC,EAAA,QAAO,cAAc,CAAA,CAAA,EAIxC,OAAOD,EAAI,SAAYA,CACzB,CAUO,SAASE,GAAkC,CAChD,OAAIP,EAAc,SACT,QAAQ,QAAQA,EAAc,QAAQ,EAE3CG,IAEJA,GAAe,SAAY,CACzB,GAAI,OAAO,OAAW,KAAe,OAAO,SAAa,IACvD,MAAM,IAAI,MAAM,mDAAmD,EAGrE,IAAIK,EACJ,GAAI,CACFA,EAAkB,MAAOR,EAAc,eAAiBI,GAAA,CAC1D,OAASK,EAAO,CACd,MAAMC,EAASD,aAAiB,MAAQ,KAAKA,EAAM,OAAO,IAAM,GAChE,MAAM,IAAI,MACR,8BAA8BC,CAAM,wFAAA,CAGxC,CAOA,OAAOF,EAAgB,CACrB,GAAIR,EAAc,QACd,CAAE,WAAY,IAAMA,EAAc,OAAA,EAClC,CAAA,EACJ,MAAQW,GAAgB,QAAQ,MAAM,UAAWA,CAAG,EACpD,SAAWA,GAAgB,QAAQ,MAAM,UAAWA,CAAG,CAAA,CACxD,CACH,GAAA,EAIAR,EAAY,MAAM,IAAM,CACtBA,EAAc,IAChB,CAAC,EAEMA,EACT,CA4BO,SAASS,EACdC,EACAC,EACAC,EAA8B,CAAA,EACf,CACf,KAAM,CAAE,MAAAC,EAAQ,IAAK,OAAAC,EAAS,IAAK,KAAAC,EAAO,GAAO,OAAAC,EAAQ,YAAAC,CAAA,EAAgBL,EAEnEM,EAAMR,EAAM,QAAQC,CAAM,EAChC,GAAI,CAACO,EAAK,OAAO,KAEjB,GAAI,CACF,GAAI,CAACA,EAAI,SAAA,EAAY,OAAO,KAE5B,MAAMC,EAAmC,CACvC,MAAAN,EACA,OAAAC,EAGA,iBAAkB,CAAC,EAAG,EAAG,EAAG,CAAC,EAC7B,GAAIE,EAAS,CAAE,OAAAA,CAAA,EAAW,CAAA,EAC1B,GAAID,EAAO,CAAE,kBAAmBK,CAAA,EAAsB,CAAA,EACtD,GAAGH,CAAA,EAML,OAAOC,EACJ,wBAAwB,KAAK,UAAUC,CAAO,CAAC,EAC/C,QAAQ,yBAA0B,EAAE,CACzC,QAAA,CACED,EAAI,OAAA,CACN,CACF,CAEA,MAAMG,EAAU,IAGhB,SAASC,EAAWC,EAAuC,CACzD,MAAO,CACL,SAASA,EAAI,MAAM,EAAG,CAAC,EAAG,EAAE,EAAIF,EAChC,SAASE,EAAI,MAAM,EAAG,CAAC,EAAG,EAAE,EAAIF,EAChC,SAASE,EAAI,MAAM,EAAG,CAAC,EAAG,EAAE,EAAIF,CAAA,CAEpC,CAQA,MAAMG,EAAwC,CAC5C,KAAM,UACN,EAAK,UACL,EAAK,UACL,EAAK,UACL,EAAK,UACL,GAAM,UACN,GAAM,UACN,GAAM,UACN,GAAM,UACN,GAAM,SACR,EAEMJ,EAAoB,OAAO,YAC/B,OAAO,QAAQI,CAAa,EAAE,IAAI,CAAC,CAACC,EAAKF,CAAG,IAAM,CAACE,EAAKH,EAAWC,CAAG,CAAC,CAAC,CAC1E"}