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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (431) hide show
  1. package/README.md +2 -2
  2. package/dist/components/ai/chain-of-thought.cjs +1 -1
  3. package/dist/components/ai/chain-of-thought.cjs.map +1 -1
  4. package/dist/components/ai/chain-of-thought.js +1 -1
  5. package/dist/components/ai/chain-of-thought.js.map +1 -1
  6. package/dist/components/ai/confirmation.cjs +1 -1
  7. package/dist/components/ai/confirmation.cjs.map +1 -1
  8. package/dist/components/ai/confirmation.js +1 -1
  9. package/dist/components/ai/confirmation.js.map +1 -1
  10. package/dist/components/ai/context.cjs +1 -1
  11. package/dist/components/ai/context.cjs.map +1 -1
  12. package/dist/components/ai/context.js +36 -35
  13. package/dist/components/ai/context.js.map +1 -1
  14. package/dist/components/ai/message.cjs +1 -1
  15. package/dist/components/ai/message.cjs.map +1 -1
  16. package/dist/components/ai/message.js +68 -68
  17. package/dist/components/ai/message.js.map +1 -1
  18. package/dist/components/ai/prompt-input.cjs +1 -1
  19. package/dist/components/ai/prompt-input.cjs.map +1 -1
  20. package/dist/components/ai/prompt-input.js +4 -2
  21. package/dist/components/ai/prompt-input.js.map +1 -1
  22. package/dist/components/ai/queue.cjs +1 -1
  23. package/dist/components/ai/queue.cjs.map +1 -1
  24. package/dist/components/ai/queue.js +9 -9
  25. package/dist/components/ai/queue.js.map +1 -1
  26. package/dist/components/ai/reasoning.cjs +1 -1
  27. package/dist/components/ai/reasoning.cjs.map +1 -1
  28. package/dist/components/ai/reasoning.js +67 -67
  29. package/dist/components/ai/reasoning.js.map +1 -1
  30. package/dist/components/ai/stream-status.cjs +1 -1
  31. package/dist/components/ai/stream-status.cjs.map +1 -1
  32. package/dist/components/ai/stream-status.js +41 -39
  33. package/dist/components/ai/stream-status.js.map +1 -1
  34. package/dist/components/ai/streamdown-code-plugin.cjs +2 -0
  35. package/dist/components/ai/streamdown-code-plugin.cjs.map +1 -0
  36. package/dist/components/ai/streamdown-code-plugin.js +42 -0
  37. package/dist/components/ai/streamdown-code-plugin.js.map +1 -0
  38. package/dist/components/ai/streamdown-plugins.cjs +2 -0
  39. package/dist/components/ai/streamdown-plugins.cjs.map +1 -0
  40. package/dist/components/ai/streamdown-plugins.js +14 -0
  41. package/dist/components/ai/streamdown-plugins.js.map +1 -0
  42. package/dist/components/ai/task.cjs +1 -1
  43. package/dist/components/ai/task.cjs.map +1 -1
  44. package/dist/components/ai/task.js +18 -11
  45. package/dist/components/ai/task.js.map +1 -1
  46. package/dist/components/ai/tool.cjs +1 -1
  47. package/dist/components/ai/tool.cjs.map +1 -1
  48. package/dist/components/ai/tool.js +51 -55
  49. package/dist/components/ai/tool.js.map +1 -1
  50. package/dist/components/ai/use-streamdown-plugins.cjs +2 -0
  51. package/dist/components/ai/use-streamdown-plugins.cjs.map +1 -0
  52. package/dist/components/ai/use-streamdown-plugins.js +25 -0
  53. package/dist/components/ai/use-streamdown-plugins.js.map +1 -0
  54. package/dist/components/charts/AreaPlot/AreaPlot.cjs +2 -0
  55. package/dist/components/charts/AreaPlot/AreaPlot.cjs.map +1 -0
  56. package/dist/components/charts/AreaPlot/AreaPlot.js +270 -0
  57. package/dist/components/charts/AreaPlot/AreaPlot.js.map +1 -0
  58. package/dist/components/charts/BarChart/BarChart.cjs +2 -0
  59. package/dist/components/charts/BarChart/BarChart.cjs.map +1 -0
  60. package/dist/components/charts/BarChart/BarChart.js +219 -0
  61. package/dist/components/charts/BarChart/BarChart.js.map +1 -0
  62. package/dist/components/charts/BoxPlot/BoxPlot.cjs +2 -0
  63. package/dist/components/charts/BoxPlot/BoxPlot.cjs.map +1 -0
  64. package/dist/components/charts/{Boxplot/Boxplot.js → BoxPlot/BoxPlot.js} +78 -79
  65. package/dist/components/charts/BoxPlot/BoxPlot.js.map +1 -0
  66. package/dist/components/charts/ChartTooltip/ChartTooltip.cjs +1 -1
  67. package/dist/components/charts/ChartTooltip/ChartTooltip.cjs.map +1 -1
  68. package/dist/components/charts/ChartTooltip/ChartTooltip.js +22 -22
  69. package/dist/components/charts/ChartTooltip/ChartTooltip.js.map +1 -1
  70. package/dist/components/charts/Chromatogram/Chromatogram.cjs +1 -1
  71. package/dist/components/charts/Chromatogram/Chromatogram.cjs.map +1 -1
  72. package/dist/components/charts/Chromatogram/Chromatogram.js +232 -170
  73. package/dist/components/charts/Chromatogram/Chromatogram.js.map +1 -1
  74. package/dist/components/charts/Chromatogram/annotations.cjs +2 -0
  75. package/dist/components/charts/Chromatogram/annotations.cjs.map +1 -0
  76. package/dist/components/charts/Chromatogram/annotations.js +137 -0
  77. package/dist/components/charts/Chromatogram/annotations.js.map +1 -0
  78. package/dist/components/charts/Chromatogram/boundaryMarkers.cjs +2 -0
  79. package/dist/components/charts/Chromatogram/boundaryMarkers.cjs.map +1 -0
  80. package/dist/components/charts/Chromatogram/boundaryMarkers.js +34 -0
  81. package/dist/components/charts/Chromatogram/boundaryMarkers.js.map +1 -0
  82. package/dist/components/charts/{ChromatogramChart → Chromatogram}/constants.cjs +1 -1
  83. package/dist/components/charts/Chromatogram/constants.cjs.map +1 -0
  84. package/dist/components/charts/{ChromatogramChart → Chromatogram}/constants.js +11 -5
  85. package/dist/components/charts/Chromatogram/constants.js.map +1 -0
  86. package/dist/components/charts/Chromatogram/dataProcessing.cjs +2 -0
  87. package/dist/components/charts/Chromatogram/dataProcessing.cjs.map +1 -0
  88. package/dist/components/charts/Chromatogram/dataProcessing.js +90 -0
  89. package/dist/components/charts/Chromatogram/dataProcessing.js.map +1 -0
  90. package/dist/components/charts/Chromatogram/peakDetection.cjs.map +1 -0
  91. package/dist/components/charts/Chromatogram/peakDetection.js.map +1 -0
  92. package/dist/components/charts/Chromatogram/plotBuilder.cjs +2 -0
  93. package/dist/components/charts/Chromatogram/plotBuilder.cjs.map +1 -0
  94. package/dist/components/charts/Chromatogram/plotBuilder.js +216 -0
  95. package/dist/components/charts/Chromatogram/plotBuilder.js.map +1 -0
  96. package/dist/components/charts/Chromatogram/regionOverlays.cjs +2 -0
  97. package/dist/components/charts/Chromatogram/regionOverlays.cjs.map +1 -0
  98. package/dist/components/charts/Chromatogram/regionOverlays.js +26 -0
  99. package/dist/components/charts/Chromatogram/regionOverlays.js.map +1 -0
  100. package/dist/components/charts/Electropherogram/Electropherogram.cjs +2 -0
  101. package/dist/components/charts/Electropherogram/Electropherogram.cjs.map +1 -0
  102. package/dist/components/charts/Electropherogram/Electropherogram.js +180 -0
  103. package/dist/components/charts/Electropherogram/Electropherogram.js.map +1 -0
  104. package/dist/components/charts/Histogram/Histogram.cjs +1 -1
  105. package/dist/components/charts/Histogram/Histogram.cjs.map +1 -1
  106. package/dist/components/charts/Histogram/Histogram.js +107 -108
  107. package/dist/components/charts/Histogram/Histogram.js.map +1 -1
  108. package/dist/components/charts/LinePlot/LinePlot.cjs +2 -0
  109. package/dist/components/charts/LinePlot/LinePlot.cjs.map +1 -0
  110. package/dist/components/charts/LinePlot/LinePlot.js +224 -0
  111. package/dist/components/charts/LinePlot/LinePlot.js.map +1 -0
  112. package/dist/components/charts/PieChart/PieChart.cjs +1 -1
  113. package/dist/components/charts/PieChart/PieChart.cjs.map +1 -1
  114. package/dist/components/charts/PieChart/PieChart.js +62 -61
  115. package/dist/components/charts/PieChart/PieChart.js.map +1 -1
  116. package/dist/components/charts/PlateMap/PlateMap.cjs +1 -1
  117. package/dist/components/charts/PlateMap/PlateMap.cjs.map +1 -1
  118. package/dist/components/charts/PlateMap/PlateMap.js +246 -242
  119. package/dist/components/charts/PlateMap/PlateMap.js.map +1 -1
  120. package/dist/components/charts/ScatterPlot/ScatterPlot.cjs +2 -0
  121. package/dist/components/charts/ScatterPlot/ScatterPlot.cjs.map +1 -0
  122. package/dist/components/charts/ScatterPlot/ScatterPlot.js +252 -0
  123. package/dist/components/charts/ScatterPlot/ScatterPlot.js.map +1 -0
  124. package/dist/components/charts/ScatterPlotInteractive/ScatterPlotInteractive.cjs +2 -0
  125. package/dist/components/charts/ScatterPlotInteractive/ScatterPlotInteractive.cjs.map +1 -0
  126. package/dist/components/charts/ScatterPlotInteractive/ScatterPlotInteractive.js +215 -0
  127. package/dist/components/charts/ScatterPlotInteractive/ScatterPlotInteractive.js.map +1 -0
  128. package/dist/components/charts/ScatterPlotInteractive/constants.cjs +2 -0
  129. package/dist/components/charts/ScatterPlotInteractive/constants.cjs.map +1 -0
  130. package/dist/components/charts/ScatterPlotInteractive/constants.js +38 -0
  131. package/dist/components/charts/ScatterPlotInteractive/constants.js.map +1 -0
  132. package/dist/components/charts/ScatterPlotInteractive/utils.cjs +2 -0
  133. package/dist/components/charts/ScatterPlotInteractive/utils.cjs.map +1 -0
  134. package/dist/components/charts/ScatterPlotInteractive/utils.js +261 -0
  135. package/dist/components/charts/ScatterPlotInteractive/utils.js.map +1 -0
  136. package/dist/components/charts/StackedChromatogram/StackedChromatogram.cjs +2 -0
  137. package/dist/components/charts/StackedChromatogram/StackedChromatogram.cjs.map +1 -0
  138. package/dist/components/charts/StackedChromatogram/StackedChromatogram.js +40 -0
  139. package/dist/components/charts/StackedChromatogram/StackedChromatogram.js.map +1 -0
  140. package/dist/components/charts/StackedChromatogram/transforms.cjs +2 -0
  141. package/dist/components/charts/StackedChromatogram/transforms.cjs.map +1 -0
  142. package/dist/components/charts/StackedChromatogram/transforms.js +31 -0
  143. package/dist/components/charts/StackedChromatogram/transforms.js.map +1 -0
  144. package/dist/components/charts/plotly-loader.cjs +2 -0
  145. package/dist/components/charts/plotly-loader.cjs.map +1 -0
  146. package/dist/components/charts/plotly-loader.js +22 -0
  147. package/dist/components/charts/plotly-loader.js.map +1 -0
  148. package/dist/components/composed/AssistantLayout/AssistantLayout.cjs +2 -0
  149. package/dist/components/composed/AssistantLayout/AssistantLayout.cjs.map +1 -0
  150. package/dist/components/composed/AssistantLayout/AssistantLayout.js +142 -0
  151. package/dist/components/composed/AssistantLayout/AssistantLayout.js.map +1 -0
  152. package/dist/components/composed/AssistantLayout/dockLayout.cjs +2 -0
  153. package/dist/components/composed/AssistantLayout/dockLayout.cjs.map +1 -0
  154. package/dist/components/composed/AssistantLayout/dockLayout.js +10 -0
  155. package/dist/components/composed/AssistantLayout/dockLayout.js.map +1 -0
  156. package/dist/components/composed/Chat/Chat.cjs +1 -1
  157. package/dist/components/composed/Chat/Chat.cjs.map +1 -1
  158. package/dist/components/composed/Chat/Chat.js +23 -23
  159. package/dist/components/composed/Chat/Chat.js.map +1 -1
  160. package/dist/components/composed/ConfirmDialog/ConfirmDialog.cjs +1 -1
  161. package/dist/components/composed/ConfirmDialog/ConfirmDialog.cjs.map +1 -1
  162. package/dist/components/composed/ConfirmDialog/ConfirmDialog.js +33 -29
  163. package/dist/components/composed/ConfirmDialog/ConfirmDialog.js.map +1 -1
  164. package/dist/components/composed/DataAppShell/CollapseButton.cjs +2 -0
  165. package/dist/components/composed/DataAppShell/CollapseButton.cjs.map +1 -0
  166. package/dist/components/composed/DataAppShell/CollapseButton.js +42 -0
  167. package/dist/components/composed/DataAppShell/CollapseButton.js.map +1 -0
  168. package/dist/components/composed/DataAppShell/DataAppShell.cjs +1 -1
  169. package/dist/components/composed/DataAppShell/DataAppShell.cjs.map +1 -1
  170. package/dist/components/composed/DataAppShell/DataAppShell.js +349 -313
  171. package/dist/components/composed/DataAppShell/DataAppShell.js.map +1 -1
  172. package/dist/components/composed/DataAppShell/PrimaryNav.cjs +2 -0
  173. package/dist/components/composed/DataAppShell/PrimaryNav.cjs.map +1 -0
  174. package/dist/components/composed/DataAppShell/PrimaryNav.js +268 -0
  175. package/dist/components/composed/DataAppShell/PrimaryNav.js.map +1 -0
  176. package/dist/components/composed/DataAppShell/RightPanel.cjs +2 -0
  177. package/dist/components/composed/DataAppShell/RightPanel.cjs.map +1 -0
  178. package/dist/components/composed/DataAppShell/RightPanel.js +282 -0
  179. package/dist/components/composed/DataAppShell/RightPanel.js.map +1 -0
  180. package/dist/components/composed/DataAppShell/SecondaryNav.cjs +2 -0
  181. package/dist/components/composed/DataAppShell/SecondaryNav.cjs.map +1 -0
  182. package/dist/components/composed/DataAppShell/SecondaryNav.js +364 -0
  183. package/dist/components/composed/DataAppShell/SecondaryNav.js.map +1 -0
  184. package/dist/components/composed/DataAppShell/ShellContext.cjs +2 -0
  185. package/dist/components/composed/DataAppShell/ShellContext.cjs.map +1 -0
  186. package/dist/components/composed/DataAppShell/ShellContext.js +23 -0
  187. package/dist/components/composed/DataAppShell/ShellContext.js.map +1 -0
  188. package/dist/components/composed/MoleculeStructure/MoleculeStructure.cjs +2 -0
  189. package/dist/components/composed/MoleculeStructure/MoleculeStructure.cjs.map +1 -0
  190. package/dist/components/composed/MoleculeStructure/MoleculeStructure.js +87 -0
  191. package/dist/components/composed/MoleculeStructure/MoleculeStructure.js.map +1 -0
  192. package/dist/components/composed/MoleculeStructure/rdkit-loader.cjs +2 -0
  193. package/dist/components/composed/MoleculeStructure/rdkit-loader.cjs.map +1 -0
  194. package/dist/components/composed/MoleculeStructure/rdkit-loader.js +89 -0
  195. package/dist/components/composed/MoleculeStructure/rdkit-loader.js.map +1 -0
  196. package/dist/components/composed/MoleculeStructure/use-rdkit.cjs +2 -0
  197. package/dist/components/composed/MoleculeStructure/use-rdkit.cjs.map +1 -0
  198. package/dist/components/composed/MoleculeStructure/use-rdkit.js +19 -0
  199. package/dist/components/composed/MoleculeStructure/use-rdkit.js.map +1 -0
  200. package/dist/components/composed/PlateMapEditor/ManifestFilterPopover.cjs +1 -1
  201. package/dist/components/composed/PlateMapEditor/ManifestFilterPopover.cjs.map +1 -1
  202. package/dist/components/composed/PlateMapEditor/ManifestFilterPopover.js +17 -17
  203. package/dist/components/composed/PlateMapEditor/ManifestFilterPopover.js.map +1 -1
  204. package/dist/components/composed/PlateMapEditor/PlateMapActionsMenu.cjs +1 -1
  205. package/dist/components/composed/PlateMapEditor/PlateMapActionsMenu.cjs.map +1 -1
  206. package/dist/components/composed/PlateMapEditor/PlateMapActionsMenu.js +33 -33
  207. package/dist/components/composed/PlateMapEditor/PlateMapActionsMenu.js.map +1 -1
  208. package/dist/components/composed/PlateMapEditor/PlateMapPlateSelector.cjs +1 -1
  209. package/dist/components/composed/PlateMapEditor/PlateMapPlateSelector.cjs.map +1 -1
  210. package/dist/components/composed/PlateMapEditor/PlateMapPlateSelector.js +7 -7
  211. package/dist/components/composed/PlateMapEditor/PlateMapPlateSelector.js.map +1 -1
  212. package/dist/components/composed/PlateMapEditor/PlatePaintGrid.cjs +1 -1
  213. package/dist/components/composed/PlateMapEditor/PlatePaintGrid.cjs.map +1 -1
  214. package/dist/components/composed/PlateMapEditor/PlatePaintGrid.js +1 -1
  215. package/dist/components/composed/PlateMapEditor/PlatePaintGrid.js.map +1 -1
  216. package/dist/components/composed/PlateMapEditor/WellLegend.cjs +1 -1
  217. package/dist/components/composed/PlateMapEditor/WellLegend.cjs.map +1 -1
  218. package/dist/components/composed/PlateMapEditor/WellLegend.js +24 -12
  219. package/dist/components/composed/PlateMapEditor/WellLegend.js.map +1 -1
  220. package/dist/components/composed/PlateMapEditor/WellManifestTable.cjs +1 -1
  221. package/dist/components/composed/PlateMapEditor/WellManifestTable.cjs.map +1 -1
  222. package/dist/components/composed/PlateMapEditor/WellManifestTable.js +1 -1
  223. package/dist/components/composed/PlateMapEditor/WellManifestTable.js.map +1 -1
  224. package/dist/components/composed/TdpSearch/components/DefaultFilters.cjs +1 -1
  225. package/dist/components/composed/TdpSearch/components/DefaultFilters.cjs.map +1 -1
  226. package/dist/components/composed/TdpSearch/components/DefaultFilters.js +3 -3
  227. package/dist/components/composed/TdpSearch/components/DefaultFilters.js.map +1 -1
  228. package/dist/components/composed/TopBar/TopBar.cjs +2 -0
  229. package/dist/components/composed/TopBar/TopBar.cjs.map +1 -0
  230. package/dist/components/composed/TopBar/TopBar.js +56 -0
  231. package/dist/components/composed/TopBar/TopBar.js.map +1 -0
  232. package/dist/components/composed/UserMenu/UserMenu.cjs +2 -0
  233. package/dist/components/composed/UserMenu/UserMenu.cjs.map +1 -0
  234. package/dist/components/composed/UserMenu/UserMenu.js +99 -0
  235. package/dist/components/composed/UserMenu/UserMenu.js.map +1 -0
  236. package/dist/components/composed/tdp-link.cjs +1 -1
  237. package/dist/components/composed/tdp-link.cjs.map +1 -1
  238. package/dist/components/composed/tdp-link.js +5 -5
  239. package/dist/components/composed/tdp-link.js.map +1 -1
  240. package/dist/components/ui/alert.cjs +1 -1
  241. package/dist/components/ui/alert.cjs.map +1 -1
  242. package/dist/components/ui/alert.js +12 -12
  243. package/dist/components/ui/alert.js.map +1 -1
  244. package/dist/components/ui/badge.cjs +1 -1
  245. package/dist/components/ui/badge.cjs.map +1 -1
  246. package/dist/components/ui/badge.js +14 -14
  247. package/dist/components/ui/badge.js.map +1 -1
  248. package/dist/components/ui/banner.cjs +1 -1
  249. package/dist/components/ui/banner.cjs.map +1 -1
  250. package/dist/components/ui/banner.js +17 -17
  251. package/dist/components/ui/banner.js.map +1 -1
  252. package/dist/components/ui/button.cjs +1 -1
  253. package/dist/components/ui/button.cjs.map +1 -1
  254. package/dist/components/ui/button.js +16 -16
  255. package/dist/components/ui/button.js.map +1 -1
  256. package/dist/components/ui/calendar.cjs +1 -1
  257. package/dist/components/ui/calendar.cjs.map +1 -1
  258. package/dist/components/ui/calendar.js +3 -3
  259. package/dist/components/ui/calendar.js.map +1 -1
  260. package/dist/components/ui/code-block.cjs +3 -3
  261. package/dist/components/ui/code-block.cjs.map +1 -1
  262. package/dist/components/ui/code-block.js +136 -118
  263. package/dist/components/ui/code-block.js.map +1 -1
  264. package/dist/components/ui/code-editor.cjs +1 -1
  265. package/dist/components/ui/code-editor.cjs.map +1 -1
  266. package/dist/components/ui/code-editor.js +14 -12
  267. package/dist/components/ui/code-editor.js.map +1 -1
  268. package/dist/components/ui/combobox.cjs +1 -1
  269. package/dist/components/ui/combobox.cjs.map +1 -1
  270. package/dist/components/ui/combobox.js +33 -29
  271. package/dist/components/ui/combobox.js.map +1 -1
  272. package/dist/components/ui/command.cjs +1 -1
  273. package/dist/components/ui/command.cjs.map +1 -1
  274. package/dist/components/ui/command.js +81 -77
  275. package/dist/components/ui/command.js.map +1 -1
  276. package/dist/components/ui/context-menu.cjs +1 -1
  277. package/dist/components/ui/context-menu.cjs.map +1 -1
  278. package/dist/components/ui/context-menu.js +13 -13
  279. package/dist/components/ui/context-menu.js.map +1 -1
  280. package/dist/components/ui/data-table/data-table-column-toggle.cjs +1 -1
  281. package/dist/components/ui/data-table/data-table-column-toggle.cjs.map +1 -1
  282. package/dist/components/ui/data-table/data-table-column-toggle.js +70 -62
  283. package/dist/components/ui/data-table/data-table-column-toggle.js.map +1 -1
  284. package/dist/components/ui/data-table/data-table-filter.cjs +1 -1
  285. package/dist/components/ui/data-table/data-table-filter.cjs.map +1 -1
  286. package/dist/components/ui/data-table/data-table-filter.js +24 -23
  287. package/dist/components/ui/data-table/data-table-filter.js.map +1 -1
  288. package/dist/components/ui/data-table/data-table-group.cjs +1 -1
  289. package/dist/components/ui/data-table/data-table-group.cjs.map +1 -1
  290. package/dist/components/ui/data-table/data-table-group.js +17 -16
  291. package/dist/components/ui/data-table/data-table-group.js.map +1 -1
  292. package/dist/components/ui/data-table/data-table-pagination.cjs +1 -1
  293. package/dist/components/ui/data-table/data-table-pagination.cjs.map +1 -1
  294. package/dist/components/ui/data-table/data-table-pagination.js +15 -15
  295. package/dist/components/ui/data-table/data-table-pagination.js.map +1 -1
  296. package/dist/components/ui/data-table/data-table.cjs +1 -1
  297. package/dist/components/ui/data-table/data-table.cjs.map +1 -1
  298. package/dist/components/ui/data-table/data-table.js +191 -190
  299. package/dist/components/ui/data-table/data-table.js.map +1 -1
  300. package/dist/components/ui/dialog.cjs +1 -1
  301. package/dist/components/ui/dialog.cjs.map +1 -1
  302. package/dist/components/ui/dialog.js +1 -1
  303. package/dist/components/ui/dialog.js.map +1 -1
  304. package/dist/components/ui/dropdown-menu.cjs +1 -1
  305. package/dist/components/ui/dropdown-menu.cjs.map +1 -1
  306. package/dist/components/ui/dropdown-menu.js +12 -4
  307. package/dist/components/ui/dropdown-menu.js.map +1 -1
  308. package/dist/components/ui/hover-card.cjs +1 -1
  309. package/dist/components/ui/hover-card.cjs.map +1 -1
  310. package/dist/components/ui/hover-card.js +3 -3
  311. package/dist/components/ui/hover-card.js.map +1 -1
  312. package/dist/components/ui/item.cjs +1 -1
  313. package/dist/components/ui/item.cjs.map +1 -1
  314. package/dist/components/ui/item.js +44 -36
  315. package/dist/components/ui/item.js.map +1 -1
  316. package/dist/components/ui/menubar.cjs +1 -1
  317. package/dist/components/ui/menubar.cjs.map +1 -1
  318. package/dist/components/ui/menubar.js +2 -2
  319. package/dist/components/ui/menubar.js.map +1 -1
  320. package/dist/components/ui/navigation-menu.cjs +1 -1
  321. package/dist/components/ui/navigation-menu.cjs.map +1 -1
  322. package/dist/components/ui/navigation-menu.js +1 -1
  323. package/dist/components/ui/navigation-menu.js.map +1 -1
  324. package/dist/components/ui/popover.cjs +1 -1
  325. package/dist/components/ui/popover.cjs.map +1 -1
  326. package/dist/components/ui/popover.js +1 -1
  327. package/dist/components/ui/popover.js.map +1 -1
  328. package/dist/components/ui/scroll-area.cjs +1 -1
  329. package/dist/components/ui/scroll-area.cjs.map +1 -1
  330. package/dist/components/ui/scroll-area.js +1 -0
  331. package/dist/components/ui/scroll-area.js.map +1 -1
  332. package/dist/components/ui/select.cjs +1 -1
  333. package/dist/components/ui/select.cjs.map +1 -1
  334. package/dist/components/ui/select.js +1 -1
  335. package/dist/components/ui/select.js.map +1 -1
  336. package/dist/components/ui/sheet.cjs +1 -1
  337. package/dist/components/ui/sheet.cjs.map +1 -1
  338. package/dist/components/ui/sheet.js +5 -5
  339. package/dist/components/ui/sheet.js.map +1 -1
  340. package/dist/components/ui/sidebar.cjs +1 -1
  341. package/dist/components/ui/sidebar.cjs.map +1 -1
  342. package/dist/components/ui/sidebar.js +2 -2
  343. package/dist/components/ui/sidebar.js.map +1 -1
  344. package/dist/components/ui/slider.cjs +1 -1
  345. package/dist/components/ui/slider.cjs.map +1 -1
  346. package/dist/components/ui/slider.js +10 -9
  347. package/dist/components/ui/slider.js.map +1 -1
  348. package/dist/components/ui/sonner.cjs +1 -1
  349. package/dist/components/ui/sonner.cjs.map +1 -1
  350. package/dist/components/ui/sonner.js +25 -10
  351. package/dist/components/ui/sonner.js.map +1 -1
  352. package/dist/components/ui/table.cjs +1 -1
  353. package/dist/components/ui/table.cjs.map +1 -1
  354. package/dist/components/ui/table.js +1 -0
  355. package/dist/components/ui/table.js.map +1 -1
  356. package/dist/components/ui/tabs.cjs +1 -1
  357. package/dist/components/ui/tabs.cjs.map +1 -1
  358. package/dist/components/ui/tabs.js +18 -18
  359. package/dist/components/ui/tabs.js.map +1 -1
  360. package/dist/components/ui/tetra-molecule-icon.cjs +2 -0
  361. package/dist/components/ui/tetra-molecule-icon.cjs.map +1 -0
  362. package/dist/components/ui/tetra-molecule-icon.js +49 -0
  363. package/dist/components/ui/tetra-molecule-icon.js.map +1 -0
  364. package/dist/components/ui/toggle-group.cjs +1 -1
  365. package/dist/components/ui/toggle-group.cjs.map +1 -1
  366. package/dist/components/ui/toggle-group.js +35 -31
  367. package/dist/components/ui/toggle-group.js.map +1 -1
  368. package/dist/hooks/use-plotly-theme.cjs +1 -1
  369. package/dist/hooks/use-plotly-theme.cjs.map +1 -1
  370. package/dist/hooks/use-plotly-theme.js +4 -3
  371. package/dist/hooks/use-plotly-theme.js.map +1 -1
  372. package/dist/index.cjs +1 -1
  373. package/dist/index.css +1 -1
  374. package/dist/index.d.ts +1210 -132
  375. package/dist/index.js +694 -639
  376. package/dist/index.js.map +1 -1
  377. package/dist/index.tailwind.css +1 -1
  378. package/dist/lib/shiki.cjs +2 -0
  379. package/dist/lib/shiki.cjs.map +1 -0
  380. package/dist/lib/shiki.js +72 -0
  381. package/dist/lib/shiki.js.map +1 -0
  382. package/package.json +23 -12
  383. package/dist/components/charts/AreaGraph/AreaGraph.cjs +0 -2
  384. package/dist/components/charts/AreaGraph/AreaGraph.cjs.map +0 -1
  385. package/dist/components/charts/AreaGraph/AreaGraph.js +0 -271
  386. package/dist/components/charts/AreaGraph/AreaGraph.js.map +0 -1
  387. package/dist/components/charts/BarGraph/BarGraph.cjs +0 -2
  388. package/dist/components/charts/BarGraph/BarGraph.cjs.map +0 -1
  389. package/dist/components/charts/BarGraph/BarGraph.js +0 -220
  390. package/dist/components/charts/BarGraph/BarGraph.js.map +0 -1
  391. package/dist/components/charts/Boxplot/Boxplot.cjs +0 -2
  392. package/dist/components/charts/Boxplot/Boxplot.cjs.map +0 -1
  393. package/dist/components/charts/Boxplot/Boxplot.js.map +0 -1
  394. package/dist/components/charts/ChromatogramChart/ChromatogramChart.cjs +0 -2
  395. package/dist/components/charts/ChromatogramChart/ChromatogramChart.cjs.map +0 -1
  396. package/dist/components/charts/ChromatogramChart/ChromatogramChart.js +0 -227
  397. package/dist/components/charts/ChromatogramChart/ChromatogramChart.js.map +0 -1
  398. package/dist/components/charts/ChromatogramChart/annotations.cjs +0 -2
  399. package/dist/components/charts/ChromatogramChart/annotations.cjs.map +0 -1
  400. package/dist/components/charts/ChromatogramChart/annotations.js +0 -73
  401. package/dist/components/charts/ChromatogramChart/annotations.js.map +0 -1
  402. package/dist/components/charts/ChromatogramChart/boundaryMarkers.cjs +0 -2
  403. package/dist/components/charts/ChromatogramChart/boundaryMarkers.cjs.map +0 -1
  404. package/dist/components/charts/ChromatogramChart/boundaryMarkers.js +0 -34
  405. package/dist/components/charts/ChromatogramChart/boundaryMarkers.js.map +0 -1
  406. package/dist/components/charts/ChromatogramChart/constants.cjs.map +0 -1
  407. package/dist/components/charts/ChromatogramChart/constants.js.map +0 -1
  408. package/dist/components/charts/ChromatogramChart/dataProcessing.cjs +0 -2
  409. package/dist/components/charts/ChromatogramChart/dataProcessing.cjs.map +0 -1
  410. package/dist/components/charts/ChromatogramChart/dataProcessing.js +0 -79
  411. package/dist/components/charts/ChromatogramChart/dataProcessing.js.map +0 -1
  412. package/dist/components/charts/ChromatogramChart/peakDetection.cjs.map +0 -1
  413. package/dist/components/charts/ChromatogramChart/peakDetection.js.map +0 -1
  414. package/dist/components/charts/DotPlot/DotPlot.cjs +0 -2
  415. package/dist/components/charts/DotPlot/DotPlot.cjs.map +0 -1
  416. package/dist/components/charts/DotPlot/DotPlot.js +0 -208
  417. package/dist/components/charts/DotPlot/DotPlot.js.map +0 -1
  418. package/dist/components/charts/Heatmap/Heatmap.cjs +0 -2
  419. package/dist/components/charts/Heatmap/Heatmap.cjs.map +0 -1
  420. package/dist/components/charts/Heatmap/Heatmap.js +0 -67
  421. package/dist/components/charts/Heatmap/Heatmap.js.map +0 -1
  422. package/dist/components/charts/LineGraph/LineGraph.cjs +0 -2
  423. package/dist/components/charts/LineGraph/LineGraph.cjs.map +0 -1
  424. package/dist/components/charts/LineGraph/LineGraph.js +0 -225
  425. package/dist/components/charts/LineGraph/LineGraph.js.map +0 -1
  426. package/dist/components/charts/ScatterGraph/ScatterGraph.cjs +0 -2
  427. package/dist/components/charts/ScatterGraph/ScatterGraph.cjs.map +0 -1
  428. package/dist/components/charts/ScatterGraph/ScatterGraph.js +0 -234
  429. package/dist/components/charts/ScatterGraph/ScatterGraph.js.map +0 -1
  430. /package/dist/components/charts/{ChromatogramChart → Chromatogram}/peakDetection.cjs +0 -0
  431. /package/dist/components/charts/{ChromatogramChart → Chromatogram}/peakDetection.js +0 -0
@@ -1 +1 @@
1
- {"version":3,"file":"code-block.cjs","sources":["../../../src/components/ui/code-block.tsx"],"sourcesContent":["import { CheckIcon, CopyIcon } from \"lucide-react\";\nimport {\n createContext,\n memo,\n useCallback,\n useContext,\n useEffect,\n useMemo,\n useRef,\n useState,\n} from \"react\";\nimport { createHighlighter } from \"shiki\";\n\nimport type { ComponentProps, CSSProperties, HTMLAttributes } from \"react\";\nimport type {\n BundledLanguage,\n BundledTheme,\n HighlighterGeneric,\n ThemedToken,\n} from \"shiki\";\n\nimport { Button } from \"@/components/ui/button\";\nimport {\n Select,\n SelectContent,\n SelectItem,\n SelectTrigger,\n SelectValue,\n} from \"@/components/ui/select\";\nimport { cn } from \"@/lib/utils\";\n\n\n\n\n// Shiki uses bitflags for font styles: 1=italic, 2=bold, 4=underline\n// oxlint-disable-next-line eslint(no-bitwise)\nconst isItalic = (fontStyle: number | undefined) => fontStyle && fontStyle & 1;\n// oxlint-disable-next-line eslint(no-bitwise)\nconst isBold = (fontStyle: number | undefined) => fontStyle && fontStyle & 2;\nconst isUnderline = (fontStyle: number | undefined) =>\n // oxlint-disable-next-line eslint(no-bitwise)\n fontStyle && fontStyle & 4;\n\n// Transform tokens to include pre-computed keys to avoid noArrayIndexKey lint\ninterface KeyedToken {\n token: ThemedToken;\n key: string;\n}\ninterface KeyedLine {\n tokens: KeyedToken[];\n key: string;\n}\n\nconst addKeysToTokens = (lines: ThemedToken[][]): KeyedLine[] =>\n lines.map((line, lineIdx) => ({\n key: `line-${lineIdx}`,\n tokens: line.map((token, tokenIdx) => ({\n key: `line-${lineIdx}-${tokenIdx}`,\n token,\n })),\n }));\n\n// Token rendering component\nconst TokenSpan = ({ token }: { token: ThemedToken }) => (\n <span\n className=\"dark:!bg-[var(--shiki-dark-bg)] dark:!text-[var(--shiki-dark)]\"\n style={\n {\n backgroundColor: token.bgColor,\n color: token.color,\n fontStyle: isItalic(token.fontStyle) ? \"italic\" : undefined,\n fontWeight: isBold(token.fontStyle) ? \"bold\" : undefined,\n textDecoration: isUnderline(token.fontStyle) ? \"underline\" : undefined,\n ...token.htmlStyle,\n } as CSSProperties\n }\n >\n {token.content}\n </span>\n);\n\n// Line number styles using CSS counters\nconst LINE_NUMBER_CLASSES = cn(\n \"block\",\n \"before:content-[counter(line)]\",\n \"before:inline-block\",\n \"before:[counter-increment:line]\",\n \"before:w-8\",\n \"before:mr-4\",\n \"before:text-right\",\n \"before:text-muted-foreground/50\",\n \"before:font-mono\",\n \"before:select-none\"\n);\n\n// Line rendering component\nconst LineSpan = ({\n keyedLine,\n showLineNumbers,\n}: {\n keyedLine: KeyedLine;\n showLineNumbers: boolean;\n}) => (\n <span className={showLineNumbers ? LINE_NUMBER_CLASSES : \"block\"}>\n {keyedLine.tokens.length === 0\n ? \"\\n\"\n : keyedLine.tokens.map(({ token, key }) => (\n <TokenSpan key={key} token={token} />\n ))}\n </span>\n);\n\n// Types\ntype CodeBlockProps = HTMLAttributes<HTMLDivElement> & {\n code: string;\n language: BundledLanguage;\n showLineNumbers?: boolean;\n};\n\ninterface TokenizedCode {\n tokens: ThemedToken[][];\n fg: string;\n bg: string;\n}\n\ninterface CodeBlockContextType {\n code: string;\n}\n\n// Context\nconst CodeBlockContext = createContext<CodeBlockContextType>({\n code: \"\",\n});\n\n// Highlighter cache (singleton per language)\nconst highlighterCache = new Map<\n string,\n Promise<HighlighterGeneric<BundledLanguage, BundledTheme>>\n>();\n\n// Token cache\nconst tokensCache = new Map<string, TokenizedCode>();\n\n// Subscribers for async token updates\nconst subscribers = new Map<string, Set<(result: TokenizedCode) => void>>();\n\nconst CACHE_KEY_SLICE_LENGTH = 100;\n\nconst getTokensCacheKey = (code: string, language: BundledLanguage) => {\n const start = code.slice(0, CACHE_KEY_SLICE_LENGTH);\n const end = code.length > CACHE_KEY_SLICE_LENGTH ? code.slice(-CACHE_KEY_SLICE_LENGTH) : \"\";\n return `${language}:${code.length}:${start}:${end}`;\n};\n\nconst getHighlighter = (\n language: BundledLanguage\n): Promise<HighlighterGeneric<BundledLanguage, BundledTheme>> => {\n const cached = highlighterCache.get(language);\n if (cached) {\n return cached;\n }\n\n const highlighterPromise = createHighlighter({\n langs: [language],\n themes: [\"github-light\", \"github-dark\"],\n });\n\n highlighterCache.set(language, highlighterPromise);\n return highlighterPromise;\n};\n\n// Create raw tokens for immediate display while highlighting loads\nconst createRawTokens = (code: string): TokenizedCode => ({\n bg: \"transparent\",\n fg: \"inherit\",\n tokens: code.split(\"\\n\").map((line) =>\n line === \"\"\n ? []\n : [\n {\n color: \"inherit\",\n content: line,\n } as ThemedToken,\n ]\n ),\n});\n\n// Synchronous highlight with callback for async results\nexport const highlightCode = (\n code: string,\n language: BundledLanguage,\n // oxlint-disable-next-line eslint-plugin-promise(prefer-await-to-callbacks)\n callback?: (result: TokenizedCode) => void\n): TokenizedCode | null => {\n const tokensCacheKey = getTokensCacheKey(code, language);\n\n // Return cached result if available\n const cached = tokensCache.get(tokensCacheKey);\n if (cached) {\n return cached;\n }\n\n // Subscribe callback if provided\n if (callback) {\n if (!subscribers.has(tokensCacheKey)) {\n subscribers.set(tokensCacheKey, new Set());\n }\n subscribers.get(tokensCacheKey)?.add(callback);\n }\n\n // Start highlighting in background - fire-and-forget async pattern\n getHighlighter(language)\n // oxlint-disable-next-line eslint-plugin-promise(prefer-await-to-then)\n .then((highlighter) => {\n const availableLangs = highlighter.getLoadedLanguages();\n const langToUse = availableLangs.includes(language) ? language : \"text\";\n\n const result = highlighter.codeToTokens(code, {\n lang: langToUse,\n themes: {\n dark: \"github-dark\",\n light: \"github-light\",\n },\n });\n\n const tokenized: TokenizedCode = {\n bg: result.bg ?? \"transparent\",\n fg: result.fg ?? \"inherit\",\n tokens: result.tokens,\n };\n\n // Cache the result\n tokensCache.set(tokensCacheKey, tokenized);\n\n // Notify all subscribers\n const subs = subscribers.get(tokensCacheKey);\n if (subs) {\n for (const sub of subs) {\n sub(tokenized);\n }\n subscribers.delete(tokensCacheKey);\n }\n })\n // oxlint-disable-next-line eslint-plugin-promise(prefer-await-to-then), eslint-plugin-promise(prefer-await-to-callbacks)\n .catch((error) => {\n console.error(\"Failed to highlight code:\", error);\n subscribers.delete(tokensCacheKey);\n });\n\n return null;\n};\n\nconst CodeBlockBody = memo(\n ({\n tokenized,\n showLineNumbers,\n className,\n }: {\n tokenized: TokenizedCode;\n showLineNumbers: boolean;\n className?: string;\n }) => {\n const preStyle = useMemo(\n () => ({\n backgroundColor: tokenized.bg,\n color: tokenized.fg,\n }),\n [tokenized.bg, tokenized.fg]\n );\n\n const keyedLines = useMemo(\n () => addKeysToTokens(tokenized.tokens),\n [tokenized.tokens]\n );\n\n return (\n <pre\n className={cn(\n \"dark:!bg-[var(--shiki-dark-bg)] dark:!text-[var(--shiki-dark)] m-0 p-4 text-sm\",\n className\n )}\n style={preStyle}\n >\n <code\n className={cn(\n \"font-mono text-sm\",\n showLineNumbers && \"[counter-increment:line_0] [counter-reset:line]\"\n )}\n >\n {keyedLines.map((keyedLine) => (\n <LineSpan\n key={keyedLine.key}\n keyedLine={keyedLine}\n showLineNumbers={showLineNumbers}\n />\n ))}\n </code>\n </pre>\n );\n },\n (prevProps, nextProps) =>\n prevProps.tokenized === nextProps.tokenized &&\n prevProps.showLineNumbers === nextProps.showLineNumbers &&\n prevProps.className === nextProps.className\n);\n\nCodeBlockBody.displayName = \"CodeBlockBody\";\n\nexport const CodeBlockContainer = ({\n className,\n language,\n style,\n ...props\n}: HTMLAttributes<HTMLDivElement> & { language: string }) => (\n <div\n className={cn(\n \"group relative w-full overflow-hidden rounded-md border bg-background text-foreground\",\n className\n )}\n data-language={language}\n style={{\n containIntrinsicSize: \"auto 200px\",\n contentVisibility: \"auto\",\n ...style,\n }}\n {...props}\n />\n);\n\nexport const CodeBlockHeader = ({\n children,\n className,\n ...props\n}: HTMLAttributes<HTMLDivElement>) => (\n <div\n className={cn(\n \"flex items-center justify-between border-b bg-muted/80 px-3 py-2 text-muted-foreground text-xs\",\n className\n )}\n {...props}\n >\n {children}\n </div>\n);\n\nexport const CodeBlockTitle = ({\n children,\n className,\n ...props\n}: HTMLAttributes<HTMLDivElement>) => (\n <div className={cn(\"flex items-center gap-2\", className)} {...props}>\n {children}\n </div>\n);\n\nexport const CodeBlockFilename = ({\n children,\n className,\n ...props\n}: HTMLAttributes<HTMLSpanElement>) => (\n <span className={cn(\"font-mono\", className)} {...props}>\n {children}\n </span>\n);\n\nexport const CodeBlockActions = ({\n children,\n className,\n ...props\n}: HTMLAttributes<HTMLDivElement>) => (\n <div\n className={cn(\"-my-1 -mr-1 flex items-center gap-2\", className)}\n {...props}\n >\n {children}\n </div>\n);\n\nexport const CodeBlockContent = ({\n code,\n language,\n showLineNumbers = false,\n}: {\n code: string;\n language: BundledLanguage;\n showLineNumbers?: boolean;\n}) => {\n // Memoized raw tokens for immediate display\n const rawTokens = useMemo(() => createRawTokens(code), [code]);\n\n // Synchronous cache lookup — avoids setState in effect for cached results\n const syncTokens = useMemo(\n () => highlightCode(code, language) ?? rawTokens,\n [code, language, rawTokens]\n );\n\n // Async highlighting result (populated after shiki loads)\n const [asyncTokens, setAsyncTokens] = useState<TokenizedCode | null>(null);\n const asyncKeyRef = useRef({ code, language });\n\n // Invalidate stale async tokens synchronously during render\n if (\n asyncKeyRef.current.code !== code ||\n asyncKeyRef.current.language !== language\n ) {\n asyncKeyRef.current = { code, language };\n setAsyncTokens(null);\n }\n\n useEffect(() => {\n let cancelled = false;\n\n highlightCode(code, language, (result) => {\n if (!cancelled) {\n setAsyncTokens(result);\n }\n });\n\n return () => {\n cancelled = true;\n };\n }, [code, language]);\n\n const tokenized = asyncTokens ?? syncTokens;\n\n return (\n <div className=\"relative overflow-auto\">\n <CodeBlockBody showLineNumbers={showLineNumbers} tokenized={tokenized} />\n </div>\n );\n};\n\nexport const CodeBlock = ({\n code,\n language,\n showLineNumbers = false,\n className,\n children,\n ...props\n}: CodeBlockProps) => {\n const contextValue = useMemo(() => ({ code }), [code]);\n\n return (\n <CodeBlockContext.Provider value={contextValue}>\n <CodeBlockContainer className={className} language={language} {...props}>\n {children}\n <CodeBlockContent\n code={code}\n language={language}\n showLineNumbers={showLineNumbers}\n />\n </CodeBlockContainer>\n </CodeBlockContext.Provider>\n );\n};\n\nexport type CodeBlockCopyButtonProps = ComponentProps<typeof Button> & {\n onCopy?: () => void;\n onError?: (error: Error) => void;\n timeout?: number;\n};\n\nexport const CodeBlockCopyButton = ({\n onCopy,\n onError,\n timeout = 2000,\n children,\n className,\n ...props\n}: CodeBlockCopyButtonProps) => {\n const [isCopied, setIsCopied] = useState(false);\n const timeoutRef = useRef<number>(0);\n const { code } = useContext(CodeBlockContext);\n\n const copyToClipboard = useCallback(async () => {\n if (typeof window === \"undefined\" || !navigator?.clipboard?.writeText) {\n onError?.(new Error(\"Clipboard API not available\"));\n return;\n }\n\n try {\n if (!isCopied) {\n await navigator.clipboard.writeText(code);\n setIsCopied(true);\n onCopy?.();\n timeoutRef.current = window.setTimeout(\n () => setIsCopied(false),\n timeout\n );\n }\n } catch (error) {\n onError?.(error as Error);\n }\n }, [code, onCopy, onError, timeout, isCopied]);\n\n useEffect(\n () => () => {\n window.clearTimeout(timeoutRef.current);\n },\n []\n );\n\n const Icon = isCopied ? CheckIcon : CopyIcon;\n\n return (\n <Button\n className={cn(\"shrink-0\", className)}\n onClick={copyToClipboard}\n size=\"icon\"\n variant=\"ghost\"\n {...props}\n >\n {children ?? <Icon size={14} />}\n </Button>\n );\n};\n\nexport type CodeBlockLanguageSelectorProps = ComponentProps<typeof Select>;\n\nexport const CodeBlockLanguageSelector = (\n props: CodeBlockLanguageSelectorProps\n) => <Select {...props} />;\n\nexport type CodeBlockLanguageSelectorTriggerProps = ComponentProps<\n typeof SelectTrigger\n>;\n\nexport const CodeBlockLanguageSelectorTrigger = ({\n className,\n ...props\n}: CodeBlockLanguageSelectorTriggerProps) => (\n <SelectTrigger\n className={cn(\n \"h-7 border-none bg-transparent px-2 text-xs shadow-none\",\n className\n )}\n size=\"sm\"\n {...props}\n />\n);\n\nexport type CodeBlockLanguageSelectorValueProps = ComponentProps<\n typeof SelectValue\n>;\n\nexport const CodeBlockLanguageSelectorValue = (\n props: CodeBlockLanguageSelectorValueProps\n) => <SelectValue {...props} />;\n\nexport type CodeBlockLanguageSelectorContentProps = ComponentProps<\n typeof SelectContent\n>;\n\nexport const CodeBlockLanguageSelectorContent = ({\n align = \"end\",\n ...props\n}: CodeBlockLanguageSelectorContentProps) => (\n <SelectContent align={align} {...props} />\n);\n\nexport type CodeBlockLanguageSelectorItemProps = ComponentProps<\n typeof SelectItem\n>;\n\nexport const CodeBlockLanguageSelectorItem = (\n props: CodeBlockLanguageSelectorItemProps\n) => <SelectItem {...props} />;\n"],"names":["isItalic","fontStyle","isBold","isUnderline","addKeysToTokens","lines","line","lineIdx","token","tokenIdx","TokenSpan","jsx","LINE_NUMBER_CLASSES","cn","LineSpan","keyedLine","showLineNumbers","key","CodeBlockContext","createContext","highlighterCache","tokensCache","subscribers","CACHE_KEY_SLICE_LENGTH","getTokensCacheKey","code","language","start","end","getHighlighter","cached","highlighterPromise","createHighlighter","createRawTokens","highlightCode","callback","tokensCacheKey","highlighter","langToUse","result","tokenized","subs","sub","error","CodeBlockBody","memo","className","preStyle","useMemo","keyedLines","prevProps","nextProps","CodeBlockContainer","style","props","CodeBlockHeader","children","CodeBlockTitle","CodeBlockFilename","CodeBlockActions","CodeBlockContent","rawTokens","syncTokens","asyncTokens","setAsyncTokens","useState","asyncKeyRef","useRef","useEffect","cancelled","CodeBlock","contextValue","jsxs","CodeBlockCopyButton","onCopy","onError","timeout","isCopied","setIsCopied","timeoutRef","useContext","copyToClipboard","useCallback","Icon","CheckIcon","CopyIcon","Button","CodeBlockLanguageSelector","Select","CodeBlockLanguageSelectorTrigger","SelectTrigger","CodeBlockLanguageSelectorValue","SelectValue","CodeBlockLanguageSelectorContent","align","SelectContent","CodeBlockLanguageSelectorItem","SelectItem"],"mappings":"0QAoCMA,EAAYC,GAAkCA,GAAaA,EAAY,EAEvEC,EAAUD,GAAkCA,GAAaA,EAAY,EACrEE,EAAeF,GAEnBA,GAAaA,EAAY,EAYrBG,EAAmBC,GACvBA,EAAM,IAAI,CAACC,EAAMC,KAAa,CAC5B,IAAK,QAAQA,CAAO,GACpB,OAAQD,EAAK,IAAI,CAACE,EAAOC,KAAc,CACrC,IAAK,QAAQF,CAAO,IAAIE,CAAQ,GAChC,MAAAD,CAAA,EACA,CACJ,EAAE,EAGEE,EAAY,CAAC,CAAE,MAAAF,CAAA,IACnBG,EAAAA,IAAC,OAAA,CACC,UAAU,iEACV,MACE,CACE,gBAAiBH,EAAM,QACvB,MAAOA,EAAM,MACb,UAAWR,EAASQ,EAAM,SAAS,EAAI,SAAW,OAClD,WAAYN,EAAOM,EAAM,SAAS,EAAI,OAAS,OAC/C,eAAgBL,EAAYK,EAAM,SAAS,EAAI,YAAc,OAC7D,GAAGA,EAAM,SAAA,EAIZ,SAAAA,EAAM,OAAA,CACT,EAIII,EAAsBC,EAAAA,GAC1B,QACA,iCACA,sBACA,kCACA,aACA,cACA,oBACA,kCACA,mBACA,oBACF,EAGMC,EAAW,CAAC,CAChB,UAAAC,EACA,gBAAAC,CACF,IAIEL,MAAC,OAAA,CAAK,UAAWK,EAAkBJ,EAAsB,QACtD,SAAAG,EAAU,OAAO,SAAW,EACzB;AAAA,EACAA,EAAU,OAAO,IAAI,CAAC,CAAE,MAAAP,EAAO,IAAAS,CAAA,UAC5BP,EAAA,CAAoB,MAAAF,CAAA,EAALS,CAAmB,CACpC,CAAA,CACP,EAqBIC,EAAmBC,EAAAA,cAAoC,CAC3D,KAAM,EACR,CAAC,EAGKC,MAAuB,IAMvBC,MAAkB,IAGlBC,MAAkB,IAElBC,EAAyB,IAEzBC,EAAoB,CAACC,EAAcC,IAA8B,CACrE,MAAMC,EAAQF,EAAK,MAAM,EAAGF,CAAsB,EAC5CK,EAAMH,EAAK,OAASF,EAAyBE,EAAK,MAAM,CAACF,CAAsB,EAAI,GACzF,MAAO,GAAGG,CAAQ,IAAID,EAAK,MAAM,IAAIE,CAAK,IAAIC,CAAG,EACnD,EAEMC,EACJH,GAC+D,CAC/D,MAAMI,EAASV,EAAiB,IAAIM,CAAQ,EAC5C,GAAII,EACF,OAAOA,EAGT,MAAMC,EAAqBC,EAAAA,kBAAkB,CAC3C,MAAO,CAACN,CAAQ,EAChB,OAAQ,CAAC,eAAgB,aAAa,CAAA,CACvC,EAED,OAAAN,EAAiB,IAAIM,EAAUK,CAAkB,EAC1CA,CACT,EAGME,EAAmBR,IAAiC,CACxD,GAAI,cACJ,GAAI,UACJ,OAAQA,EAAK,MAAM;AAAA,CAAI,EAAE,IAAKnB,GAC5BA,IAAS,GACL,GACA,CACE,CACE,MAAO,UACP,QAASA,CAAA,CACX,CACF,CAER,GAGa4B,EAAgB,CAC3BT,EACAC,EAEAS,IACyB,CACzB,MAAMC,EAAiBZ,EAAkBC,EAAMC,CAAQ,EAGjDI,EAAST,EAAY,IAAIe,CAAc,EAC7C,OAAIN,IAKAK,IACGb,EAAY,IAAIc,CAAc,GACjCd,EAAY,IAAIc,EAAgB,IAAI,GAAK,EAE3Cd,EAAY,IAAIc,CAAc,GAAG,IAAID,CAAQ,GAI/CN,EAAeH,CAAQ,EAEpB,KAAMW,GAAgB,CAErB,MAAMC,EADiBD,EAAY,mBAAA,EACF,SAASX,CAAQ,EAAIA,EAAW,OAE3Da,EAASF,EAAY,aAAaZ,EAAM,CAC5C,KAAMa,EACN,OAAQ,CACN,KAAM,cACN,MAAO,cAAA,CACT,CACD,EAEKE,EAA2B,CAC/B,GAAID,EAAO,IAAM,cACjB,GAAIA,EAAO,IAAM,UACjB,OAAQA,EAAO,MAAA,EAIjBlB,EAAY,IAAIe,EAAgBI,CAAS,EAGzC,MAAMC,EAAOnB,EAAY,IAAIc,CAAc,EAC3C,GAAIK,EAAM,CACR,UAAWC,KAAOD,EAChBC,EAAIF,CAAS,EAEflB,EAAY,OAAOc,CAAc,CACnC,CACF,CAAC,EAEA,MAAOO,GAAU,CAChB,QAAQ,MAAM,4BAA6BA,CAAK,EAChDrB,EAAY,OAAOc,CAAc,CACnC,CAAC,EAEI,KACT,EAEMQ,EAAgBC,EAAAA,KACpB,CAAC,CACC,UAAAL,EACA,gBAAAxB,EACA,UAAA8B,CAAA,IAKI,CACJ,MAAMC,EAAWC,EAAAA,QACf,KAAO,CACL,gBAAiBR,EAAU,GAC3B,MAAOA,EAAU,EAAA,GAEnB,CAACA,EAAU,GAAIA,EAAU,EAAE,CAAA,EAGvBS,EAAaD,EAAAA,QACjB,IAAM5C,EAAgBoC,EAAU,MAAM,EACtC,CAACA,EAAU,MAAM,CAAA,EAGnB,OACE7B,EAAAA,IAAC,MAAA,CACC,UAAWE,EAAAA,GACT,iFACAiC,CAAA,EAEF,MAAOC,EAEP,SAAApC,EAAAA,IAAC,OAAA,CACC,UAAWE,EAAAA,GACT,oBACAG,GAAmB,iDAAA,EAGpB,SAAAiC,EAAW,IAAKlC,GACfJ,EAAAA,IAACG,EAAA,CAEC,UAAAC,EACA,gBAAAC,CAAA,EAFKD,EAAU,GAAA,CAIlB,CAAA,CAAA,CACH,CAAA,CAGN,EACA,CAACmC,EAAWC,IACVD,EAAU,YAAcC,EAAU,WAClCD,EAAU,kBAAoBC,EAAU,iBACxCD,EAAU,YAAcC,EAAU,SACtC,EAEAP,EAAc,YAAc,gBAErB,MAAMQ,EAAqB,CAAC,CACjC,UAAAN,EACA,SAAApB,EACA,MAAA2B,EACA,GAAGC,CACL,IACE3C,EAAAA,IAAC,MAAA,CACC,UAAWE,EAAAA,GACT,wFACAiC,CAAA,EAEF,gBAAepB,EACf,MAAO,CACL,qBAAsB,aACtB,kBAAmB,OACnB,GAAG2B,CAAA,EAEJ,GAAGC,CAAA,CACN,EAGWC,EAAkB,CAAC,CAC9B,SAAAC,EACA,UAAAV,EACA,GAAGQ,CACL,IACE3C,EAAAA,IAAC,MAAA,CACC,UAAWE,EAAAA,GACT,iGACAiC,CAAA,EAED,GAAGQ,EAEH,SAAAE,CAAA,CACH,EAGWC,EAAiB,CAAC,CAC7B,SAAAD,EACA,UAAAV,EACA,GAAGQ,CACL,IACE3C,EAAAA,IAAC,OAAI,UAAWE,EAAAA,GAAG,0BAA2BiC,CAAS,EAAI,GAAGQ,EAC3D,SAAAE,CAAA,CACH,EAGWE,EAAoB,CAAC,CAChC,SAAAF,EACA,UAAAV,EACA,GAAGQ,CACL,IACE3C,EAAAA,IAAC,QAAK,UAAWE,EAAAA,GAAG,YAAaiC,CAAS,EAAI,GAAGQ,EAC9C,SAAAE,CAAA,CACH,EAGWG,EAAmB,CAAC,CAC/B,SAAAH,EACA,UAAAV,EACA,GAAGQ,CACL,IACE3C,EAAAA,IAAC,MAAA,CACC,UAAWE,EAAAA,GAAG,sCAAuCiC,CAAS,EAC7D,GAAGQ,EAEH,SAAAE,CAAA,CACH,EAGWI,EAAmB,CAAC,CAC/B,KAAAnC,EACA,SAAAC,EACA,gBAAAV,EAAkB,EACpB,IAIM,CAEJ,MAAM6C,EAAYb,EAAAA,QAAQ,IAAMf,EAAgBR,CAAI,EAAG,CAACA,CAAI,CAAC,EAGvDqC,EAAad,EAAAA,QACjB,IAAMd,EAAcT,EAAMC,CAAQ,GAAKmC,EACvC,CAACpC,EAAMC,EAAUmC,CAAS,CAAA,EAItB,CAACE,EAAaC,CAAc,EAAIC,EAAAA,SAA+B,IAAI,EACnEC,EAAcC,EAAAA,OAAO,CAAE,KAAA1C,EAAM,SAAAC,EAAU,GAI3CwC,EAAY,QAAQ,OAASzC,GAC7ByC,EAAY,QAAQ,WAAaxC,KAEjCwC,EAAY,QAAU,CAAE,KAAAzC,EAAM,SAAAC,CAAA,EAC9BsC,EAAe,IAAI,GAGrBI,EAAAA,UAAU,IAAM,CACd,IAAIC,EAAY,GAEhB,OAAAnC,EAAcT,EAAMC,EAAWa,GAAW,CACnC8B,GACHL,EAAezB,CAAM,CAEzB,CAAC,EAEM,IAAM,CACX8B,EAAY,EACd,CACF,EAAG,CAAC5C,EAAMC,CAAQ,CAAC,EAEnB,MAAMc,EAAYuB,GAAeD,EAEjC,OACEnD,MAAC,OAAI,UAAU,yBACb,eAACiC,EAAA,CAAc,gBAAA5B,EAAkC,UAAAwB,EAAsB,CAAA,CACzE,CAEJ,EAEa8B,EAAY,CAAC,CACxB,KAAA7C,EACA,SAAAC,EACA,gBAAAV,EAAkB,GAClB,UAAA8B,EACA,SAAAU,EACA,GAAGF,CACL,IAAsB,CACpB,MAAMiB,EAAevB,EAAAA,QAAQ,KAAO,CAAE,KAAAvB,IAAS,CAACA,CAAI,CAAC,EAErD,OACEd,EAAAA,IAACO,EAAiB,SAAjB,CAA0B,MAAOqD,EAChC,SAAAC,EAAAA,KAACpB,EAAA,CAAmB,UAAAN,EAAsB,SAAApB,EAAqB,GAAG4B,EAC/D,SAAA,CAAAE,EACD7C,EAAAA,IAACiD,EAAA,CACC,KAAAnC,EACA,SAAAC,EACA,gBAAAV,CAAA,CAAA,CACF,CAAA,CACF,CAAA,CACF,CAEJ,EAQayD,EAAsB,CAAC,CAClC,OAAAC,EACA,QAAAC,EACA,QAAAC,EAAU,IACV,SAAApB,EACA,UAAAV,EACA,GAAGQ,CACL,IAAgC,CAC9B,KAAM,CAACuB,EAAUC,CAAW,EAAIb,EAAAA,SAAS,EAAK,EACxCc,EAAaZ,EAAAA,OAAe,CAAC,EAC7B,CAAE,KAAA1C,CAAA,EAASuD,EAAAA,WAAW9D,CAAgB,EAEtC+D,EAAkBC,EAAAA,YAAY,SAAY,CAC9C,GAAI,OAAO,OAAW,KAAe,CAAC,WAAW,WAAW,UAAW,CACrEP,IAAU,IAAI,MAAM,6BAA6B,CAAC,EAClD,MACF,CAEA,GAAI,CACGE,IACH,MAAM,UAAU,UAAU,UAAUpD,CAAI,EACxCqD,EAAY,EAAI,EAChBJ,IAAA,EACAK,EAAW,QAAU,OAAO,WAC1B,IAAMD,EAAY,EAAK,EACvBF,CAAA,EAGN,OAASjC,EAAO,CACdgC,IAAUhC,CAAc,CAC1B,CACF,EAAG,CAAClB,EAAMiD,EAAQC,EAASC,EAASC,CAAQ,CAAC,EAE7CT,EAAAA,UACE,IAAM,IAAM,CACV,OAAO,aAAaW,EAAW,OAAO,CACxC,EACA,CAAA,CAAC,EAGH,MAAMI,EAAON,EAAWO,EAAAA,UAAYC,EAAAA,SAEpC,OACE1E,EAAAA,IAAC2E,EAAAA,OAAA,CACC,UAAWzE,EAAAA,GAAG,WAAYiC,CAAS,EACnC,QAASmC,EACT,KAAK,OACL,QAAQ,QACP,GAAG3B,EAEH,SAAAE,GAAY7C,EAAAA,IAACwE,EAAA,CAAK,KAAM,EAAA,CAAI,CAAA,CAAA,CAGnC,EAIaI,EACXjC,GACG3C,EAAAA,IAAC6E,EAAAA,OAAA,CAAQ,GAAGlC,CAAA,CAAO,EAMXmC,EAAmC,CAAC,CAC/C,UAAA3C,EACA,GAAGQ,CACL,IACE3C,EAAAA,IAAC+E,EAAAA,cAAA,CACC,UAAW7E,EAAAA,GACT,0DACAiC,CAAA,EAEF,KAAK,KACJ,GAAGQ,CAAA,CACN,EAOWqC,EACXrC,GACG3C,EAAAA,IAACiF,EAAAA,YAAA,CAAa,GAAGtC,CAAA,CAAO,EAMhBuC,EAAmC,CAAC,CAC/C,MAAAC,EAAQ,MACR,GAAGxC,CACL,IACE3C,EAAAA,IAACoF,EAAAA,cAAA,CAAc,MAAAD,EAAe,GAAGxC,CAAA,CAAO,EAO7B0C,EACX1C,GACG3C,EAAAA,IAACsF,EAAAA,WAAA,CAAY,GAAG3C,CAAA,CAAO"}
1
+ {"version":3,"file":"code-block.cjs","sources":["../../../src/components/ui/code-block.tsx"],"sourcesContent":["import { CheckIcon, CopyIcon } from \"lucide-react\";\nimport {\n createContext,\n memo,\n useCallback,\n useContext,\n useEffect,\n useMemo,\n useRef,\n useState,\n} from \"react\";\n\nimport type { ComponentProps, CSSProperties, HTMLAttributes } from \"react\";\nimport type { BundledLanguage, ThemedToken } from \"shiki\";\n\nimport { Button } from \"@/components/ui/button\";\nimport {\n Select,\n SelectContent,\n SelectItem,\n SelectTrigger,\n SelectValue,\n} from \"@/components/ui/select\";\nimport { getCodeBlockHighlighter } from \"@/lib/shiki\";\nimport { cn } from \"@/lib/utils\";\n\n\n\n\n// Shiki uses bitflags for font styles: 1=italic, 2=bold, 4=underline\n// oxlint-disable-next-line eslint(no-bitwise)\nconst isItalic = (fontStyle: number | undefined) => fontStyle && fontStyle & 1;\n// oxlint-disable-next-line eslint(no-bitwise)\nconst isBold = (fontStyle: number | undefined) => fontStyle && fontStyle & 2;\nconst isUnderline = (fontStyle: number | undefined) =>\n // oxlint-disable-next-line eslint(no-bitwise)\n fontStyle && fontStyle & 4;\n\n// Transform tokens to include pre-computed keys to avoid noArrayIndexKey lint\ninterface KeyedToken {\n token: ThemedToken;\n key: string;\n}\ninterface KeyedLine {\n tokens: KeyedToken[];\n key: string;\n}\n\nconst addKeysToTokens = (lines: ThemedToken[][]): KeyedLine[] =>\n lines.map((line, lineIdx) => ({\n key: `line-${lineIdx}`,\n tokens: line.map((token, tokenIdx) => ({\n key: `line-${lineIdx}-${tokenIdx}`,\n token,\n })),\n }));\n\n// Token rendering component\nconst TokenSpan = ({ token }: { token: ThemedToken }) => (\n <span\n className=\"dark:!bg-[var(--shiki-dark-bg)] dark:!text-[var(--shiki-dark)]\"\n style={\n {\n backgroundColor: token.bgColor,\n color: token.color,\n fontStyle: isItalic(token.fontStyle) ? \"italic\" : undefined,\n fontWeight: isBold(token.fontStyle) ? \"bold\" : undefined,\n textDecoration: isUnderline(token.fontStyle) ? \"underline\" : undefined,\n ...token.htmlStyle,\n } as CSSProperties\n }\n >\n {token.content}\n </span>\n);\n\n// Line number styles using CSS counters\nconst LINE_NUMBER_CLASSES = cn(\n \"block\",\n \"before:content-[counter(line)]\",\n \"before:inline-block\",\n \"before:[counter-increment:line]\",\n \"before:w-8\",\n \"before:mr-4\",\n \"before:text-right\",\n \"before:text-muted-foreground/50\",\n \"before:font-mono\",\n \"before:select-none\"\n);\n\n// Line rendering component\nconst LineSpan = ({\n keyedLine,\n showLineNumbers,\n}: {\n keyedLine: KeyedLine;\n showLineNumbers: boolean;\n}) => (\n <span className={showLineNumbers ? LINE_NUMBER_CLASSES : \"block\"}>\n {keyedLine.tokens.length === 0\n ? \"\\n\"\n : keyedLine.tokens.map(({ token, key }) => (\n <TokenSpan key={key} token={token} />\n ))}\n </span>\n);\n\n// Types\ntype CodeBlockProps = HTMLAttributes<HTMLDivElement> & {\n code: string;\n language: BundledLanguage;\n showLineNumbers?: boolean;\n};\n\ninterface TokenizedCode {\n tokens: ThemedToken[][];\n fg: string;\n bg: string;\n}\n\ninterface CodeBlockContextType {\n code: string;\n}\n\n// Context\nconst CodeBlockContext = createContext<CodeBlockContextType>({\n code: \"\",\n});\n\n// Maps every github-light/github-dark token color onto a --shiki-* CSS\n// variable backed by the design-token palette (defined in index.tailwind.css\n// for :root and .dark), so code colors follow the active theme and meet\n// WCAG AA contrast on --shiki-bg in both modes.\nconst SHIKI_COLOR_REPLACEMENTS: Record<string, Record<string, string>> = {\n \"github-light\": {\n \"#24292e\": \"var(--shiki-fg)\",\n \"#6a737d\": \"var(--shiki-comment)\",\n \"#586069\": \"var(--shiki-comment)\",\n \"#d73a49\": \"var(--shiki-keyword)\",\n \"#b31d28\": \"var(--shiki-keyword)\",\n \"#005cc5\": \"var(--shiki-constant)\",\n \"#6f42c1\": \"var(--shiki-entity)\",\n \"#22863a\": \"var(--shiki-tag)\",\n \"#032f62\": \"var(--shiki-string)\",\n \"#e36209\": \"var(--shiki-variable)\",\n },\n \"github-dark\": {\n \"#e1e4e8\": \"var(--shiki-fg)\",\n \"#6a737d\": \"var(--shiki-comment)\",\n \"#d1d5da\": \"var(--shiki-comment)\",\n \"#f97583\": \"var(--shiki-keyword)\",\n \"#fdaeb7\": \"var(--shiki-keyword)\",\n \"#79b8ff\": \"var(--shiki-constant)\",\n \"#b392f0\": \"var(--shiki-entity)\",\n \"#85e89d\": \"var(--shiki-tag)\",\n \"#9ecbff\": \"var(--shiki-string)\",\n \"#dbedff\": \"var(--shiki-string)\",\n \"#ffab70\": \"var(--shiki-variable)\",\n },\n};\n\n// Token cache\nconst tokensCache = new Map<string, TokenizedCode>();\n\n// Subscribers for async token updates\nconst subscribers = new Map<string, Set<(result: TokenizedCode) => void>>();\n\nconst CACHE_KEY_SLICE_LENGTH = 100;\n\nconst getTokensCacheKey = (code: string, language: BundledLanguage) => {\n const start = code.slice(0, CACHE_KEY_SLICE_LENGTH);\n const end = code.length > CACHE_KEY_SLICE_LENGTH ? code.slice(-CACHE_KEY_SLICE_LENGTH) : \"\";\n return `${language}:${code.length}:${start}:${end}`;\n};\n\n// Create raw tokens for immediate display while highlighting loads\nconst createRawTokens = (code: string): TokenizedCode => ({\n bg: \"transparent\",\n fg: \"inherit\",\n tokens: code.split(\"\\n\").map((line) =>\n line === \"\"\n ? []\n : [\n {\n color: \"inherit\",\n content: line,\n } as ThemedToken,\n ]\n ),\n});\n\n// Synchronous highlight with callback for async results\nexport const highlightCode = (\n code: string,\n language: BundledLanguage,\n // oxlint-disable-next-line eslint-plugin-promise(prefer-await-to-callbacks)\n callback?: (result: TokenizedCode) => void\n): TokenizedCode | null => {\n const tokensCacheKey = getTokensCacheKey(code, language);\n\n // Return cached result if available\n const cached = tokensCache.get(tokensCacheKey);\n if (cached) {\n return cached;\n }\n\n // Subscribe callback if provided\n if (callback) {\n if (!subscribers.has(tokensCacheKey)) {\n subscribers.set(tokensCacheKey, new Set());\n }\n subscribers.get(tokensCacheKey)?.add(callback);\n }\n\n // Start highlighting in background - fire-and-forget async pattern.\n // The shared slim highlighter (SW-2007) loads shiki/core, the grammar, and\n // the themes through dynamic imports; unsupported languages fall back to\n // plaintext via the resolved `lang`.\n getCodeBlockHighlighter(language)\n // oxlint-disable-next-line eslint-plugin-promise(prefer-await-to-then)\n .then(({ highlighter, lang }) => {\n const result = highlighter.codeToTokens(code, {\n colorReplacements: SHIKI_COLOR_REPLACEMENTS,\n lang,\n themes: {\n dark: \"github-dark\",\n light: \"github-light\",\n },\n });\n\n const tokenized: TokenizedCode = {\n bg: result.bg ?? \"transparent\",\n fg: result.fg ?? \"inherit\",\n tokens: result.tokens,\n };\n\n // Cache the result\n tokensCache.set(tokensCacheKey, tokenized);\n\n // Notify all subscribers\n const subs = subscribers.get(tokensCacheKey);\n if (subs) {\n for (const sub of subs) {\n sub(tokenized);\n }\n subscribers.delete(tokensCacheKey);\n }\n })\n // oxlint-disable-next-line eslint-plugin-promise(prefer-await-to-then), eslint-plugin-promise(prefer-await-to-callbacks)\n .catch((error) => {\n console.error(\"Failed to highlight code:\", error);\n subscribers.delete(tokensCacheKey);\n });\n\n return null;\n};\n\nconst CodeBlockBody = memo(\n ({\n tokenized,\n showLineNumbers,\n className,\n }: {\n tokenized: TokenizedCode;\n showLineNumbers: boolean;\n className?: string;\n }) => {\n const keyedLines = useMemo(\n () => addKeysToTokens(tokenized.tokens),\n [tokenized.tokens]\n );\n\n return (\n <pre\n className={cn(\n // Shiki's dual-theme codeToTokens() returns \"transparent\"/\"inherit\"\n // for the top-level bg/fg in multi-theme mode — the real per-theme\n // colors only exist per-token (read via CSS vars in TokenSpan).\n // --shiki-bg/--shiki-fg re-resolve under .dark, so no dark: variant\n // is needed here.\n \"!bg-[var(--shiki-bg)] !text-[var(--shiki-fg)] m-0 p-4 text-sm\",\n className\n )}\n >\n <code\n className={cn(\n \"font-mono text-sm\",\n showLineNumbers && \"[counter-increment:line_0] [counter-reset:line]\"\n )}\n >\n {keyedLines.map((keyedLine) => (\n <LineSpan\n key={keyedLine.key}\n keyedLine={keyedLine}\n showLineNumbers={showLineNumbers}\n />\n ))}\n </code>\n </pre>\n );\n },\n (prevProps, nextProps) =>\n prevProps.tokenized === nextProps.tokenized &&\n prevProps.showLineNumbers === nextProps.showLineNumbers &&\n prevProps.className === nextProps.className\n);\n\nCodeBlockBody.displayName = \"CodeBlockBody\";\n\nexport const CodeBlockContainer = ({\n className,\n language,\n style,\n ...props\n}: HTMLAttributes<HTMLDivElement> & { language: string }) => (\n <div\n className={cn(\n \"group relative w-full overflow-hidden rounded-md border bg-background text-foreground\",\n className\n )}\n data-language={language}\n style={{\n containIntrinsicSize: \"auto 200px\",\n contentVisibility: \"auto\",\n ...style,\n }}\n {...props}\n />\n);\n\nexport const CodeBlockHeader = ({\n children,\n className,\n ...props\n}: HTMLAttributes<HTMLDivElement>) => (\n <div\n className={cn(\n \"flex items-center justify-between border-b bg-muted/80 px-3 py-2 text-muted-foreground text-xs\",\n className\n )}\n {...props}\n >\n {children}\n </div>\n);\n\nexport const CodeBlockTitle = ({\n children,\n className,\n ...props\n}: HTMLAttributes<HTMLDivElement>) => (\n <div className={cn(\"flex items-center gap-2\", className)} {...props}>\n {children}\n </div>\n);\n\nexport const CodeBlockFilename = ({\n children,\n className,\n ...props\n}: HTMLAttributes<HTMLSpanElement>) => (\n <span className={cn(\"font-mono\", className)} {...props}>\n {children}\n </span>\n);\n\nexport const CodeBlockActions = ({\n children,\n className,\n ...props\n}: HTMLAttributes<HTMLDivElement>) => (\n <div\n className={cn(\"-my-1 -mr-1 flex items-center gap-2\", className)}\n {...props}\n >\n {children}\n </div>\n);\n\nexport const CodeBlockContent = ({\n code,\n language,\n showLineNumbers = false,\n}: {\n code: string;\n language: BundledLanguage;\n showLineNumbers?: boolean;\n}) => {\n // Memoized raw tokens for immediate display\n const rawTokens = useMemo(() => createRawTokens(code), [code]);\n\n // Synchronous cache lookup — avoids setState in effect for cached results\n const syncTokens = useMemo(\n () => highlightCode(code, language) ?? rawTokens,\n [code, language, rawTokens]\n );\n\n // Async highlighting result (populated after shiki loads)\n const [asyncTokens, setAsyncTokens] = useState<TokenizedCode | null>(null);\n const asyncKeyRef = useRef({ code, language });\n\n // Invalidate stale async tokens synchronously during render\n if (\n asyncKeyRef.current.code !== code ||\n asyncKeyRef.current.language !== language\n ) {\n asyncKeyRef.current = { code, language };\n setAsyncTokens(null);\n }\n\n useEffect(() => {\n let cancelled = false;\n\n highlightCode(code, language, (result) => {\n if (!cancelled) {\n setAsyncTokens(result);\n }\n });\n\n return () => {\n cancelled = true;\n };\n }, [code, language]);\n\n const tokenized = asyncTokens ?? syncTokens;\n\n return (\n <div className=\"relative overflow-auto\" tabIndex={0}>\n <CodeBlockBody showLineNumbers={showLineNumbers} tokenized={tokenized} />\n </div>\n );\n};\n\nexport const CodeBlock = ({\n code,\n language,\n showLineNumbers = false,\n className,\n children,\n ...props\n}: CodeBlockProps) => {\n const contextValue = useMemo(() => ({ code }), [code]);\n\n return (\n <CodeBlockContext.Provider value={contextValue}>\n <CodeBlockContainer className={className} language={language} {...props}>\n {children}\n <CodeBlockContent\n code={code}\n language={language}\n showLineNumbers={showLineNumbers}\n />\n </CodeBlockContainer>\n </CodeBlockContext.Provider>\n );\n};\n\nexport type CodeBlockCopyButtonProps = ComponentProps<typeof Button> & {\n onCopy?: () => void;\n onError?: (error: Error) => void;\n timeout?: number;\n};\n\nexport const CodeBlockCopyButton = ({\n onCopy,\n onError,\n timeout = 2000,\n children,\n className,\n ...props\n}: CodeBlockCopyButtonProps) => {\n const [isCopied, setIsCopied] = useState(false);\n const timeoutRef = useRef<number>(0);\n const { code } = useContext(CodeBlockContext);\n\n const copyToClipboard = useCallback(async () => {\n if (typeof window === \"undefined\" || !navigator?.clipboard?.writeText) {\n onError?.(new Error(\"Clipboard API not available\"));\n return;\n }\n\n try {\n if (!isCopied) {\n await navigator.clipboard.writeText(code);\n setIsCopied(true);\n onCopy?.();\n timeoutRef.current = window.setTimeout(\n () => setIsCopied(false),\n timeout\n );\n }\n } catch (error) {\n onError?.(error as Error);\n }\n }, [code, onCopy, onError, timeout, isCopied]);\n\n useEffect(\n () => () => {\n window.clearTimeout(timeoutRef.current);\n },\n []\n );\n\n const Icon = isCopied ? CheckIcon : CopyIcon;\n\n return (\n <Button\n aria-label=\"Copy code\"\n className={cn(\"shrink-0\", className)}\n onClick={copyToClipboard}\n size=\"icon\"\n variant=\"ghost\"\n {...props}\n >\n {children ?? <Icon size={14} />}\n </Button>\n );\n};\n\nexport type CodeBlockLanguageSelectorProps = ComponentProps<typeof Select>;\n\nexport const CodeBlockLanguageSelector = (\n props: CodeBlockLanguageSelectorProps\n) => <Select {...props} />;\n\nexport type CodeBlockLanguageSelectorTriggerProps = ComponentProps<\n typeof SelectTrigger\n>;\n\nexport const CodeBlockLanguageSelectorTrigger = ({\n className,\n ...props\n}: CodeBlockLanguageSelectorTriggerProps) => (\n <SelectTrigger\n aria-label=\"Select language\"\n className={cn(\n \"h-7 border-none bg-transparent px-2 text-xs shadow-none\",\n className\n )}\n size=\"sm\"\n {...props}\n />\n);\n\nexport type CodeBlockLanguageSelectorValueProps = ComponentProps<\n typeof SelectValue\n>;\n\nexport const CodeBlockLanguageSelectorValue = (\n props: CodeBlockLanguageSelectorValueProps\n) => <SelectValue {...props} />;\n\nexport type CodeBlockLanguageSelectorContentProps = ComponentProps<\n typeof SelectContent\n>;\n\nexport const CodeBlockLanguageSelectorContent = ({\n align = \"end\",\n ...props\n}: CodeBlockLanguageSelectorContentProps) => (\n <SelectContent align={align} {...props} />\n);\n\nexport type CodeBlockLanguageSelectorItemProps = ComponentProps<\n typeof SelectItem\n>;\n\nexport const CodeBlockLanguageSelectorItem = (\n props: CodeBlockLanguageSelectorItemProps\n) => <SelectItem {...props} />;\n"],"names":["isItalic","fontStyle","isBold","isUnderline","addKeysToTokens","lines","line","lineIdx","token","tokenIdx","TokenSpan","jsx","LINE_NUMBER_CLASSES","cn","LineSpan","keyedLine","showLineNumbers","key","CodeBlockContext","createContext","SHIKI_COLOR_REPLACEMENTS","tokensCache","subscribers","CACHE_KEY_SLICE_LENGTH","getTokensCacheKey","code","language","start","end","createRawTokens","highlightCode","callback","tokensCacheKey","cached","getCodeBlockHighlighter","highlighter","lang","result","tokenized","subs","sub","error","CodeBlockBody","memo","className","keyedLines","useMemo","prevProps","nextProps","CodeBlockContainer","style","props","CodeBlockHeader","children","CodeBlockTitle","CodeBlockFilename","CodeBlockActions","CodeBlockContent","rawTokens","syncTokens","asyncTokens","setAsyncTokens","useState","asyncKeyRef","useRef","useEffect","cancelled","CodeBlock","contextValue","jsxs","CodeBlockCopyButton","onCopy","onError","timeout","isCopied","setIsCopied","timeoutRef","useContext","copyToClipboard","useCallback","Icon","CheckIcon","CopyIcon","Button","CodeBlockLanguageSelector","Select","CodeBlockLanguageSelectorTrigger","SelectTrigger","CodeBlockLanguageSelectorValue","SelectValue","CodeBlockLanguageSelectorContent","align","SelectContent","CodeBlockLanguageSelectorItem","SelectItem"],"mappings":"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"}
@@ -1,34 +1,34 @@
1
- import { jsx as s, jsxs as T } from "react/jsx-runtime";
2
- import { CheckIcon as N, CopyIcon as L } from "lucide-react";
3
- import { createContext as I, memo as E, useMemo as h, useState as y, useRef as x, useEffect as w, useContext as $, useCallback as _ } from "react";
4
- import { createHighlighter as A } from "shiki";
5
- import { Button as H } from "./button.js";
6
- import { Select as K, SelectContent as M, SelectItem as R, SelectTrigger as z, SelectValue as V } from "./select.js";
7
- import { cn as i } from "../../lib/utils.js";
8
- const j = (e) => e && e & 1, U = (e) => e && e & 2, F = (e) => (
1
+ import { jsx as s, jsxs as B } from "react/jsx-runtime";
2
+ import { CheckIcon as T, CopyIcon as N } from "lucide-react";
3
+ import { createContext as I, memo as L, useMemo as f, useState as C, useRef as v, useEffect as p, useContext as E, useCallback as z } from "react";
4
+ import { Button as R } from "./button.js";
5
+ import { Select as _, SelectContent as $, SelectItem as A, SelectTrigger as K, SelectValue as H } from "./select.js";
6
+ import { getCodeBlockHighlighter as M } from "../../lib/shiki.js";
7
+ import { cn as a } from "../../lib/utils.js";
8
+ const V = (e) => e && e & 1, j = (e) => e && e & 2, F = (e) => (
9
9
  // oxlint-disable-next-line eslint(no-bitwise)
10
10
  e && e & 4
11
- ), D = (e) => e.map((t, o) => ({
11
+ ), O = (e) => e.map((t, o) => ({
12
12
  key: `line-${o}`,
13
- tokens: t.map((n, c) => ({
14
- key: `line-${o}-${c}`,
13
+ tokens: t.map((n, r) => ({
14
+ key: `line-${o}-${r}`,
15
15
  token: n
16
16
  }))
17
- })), G = ({ token: e }) => /* @__PURE__ */ s(
17
+ })), U = ({ token: e }) => /* @__PURE__ */ s(
18
18
  "span",
19
19
  {
20
20
  className: "dark:!bg-[var(--shiki-dark-bg)] dark:!text-[var(--shiki-dark)]",
21
21
  style: {
22
22
  backgroundColor: e.bgColor,
23
23
  color: e.color,
24
- fontStyle: j(e.fontStyle) ? "italic" : void 0,
25
- fontWeight: U(e.fontStyle) ? "bold" : void 0,
24
+ fontStyle: V(e.fontStyle) ? "italic" : void 0,
25
+ fontWeight: j(e.fontStyle) ? "bold" : void 0,
26
26
  textDecoration: F(e.fontStyle) ? "underline" : void 0,
27
27
  ...e.htmlStyle
28
28
  },
29
29
  children: e.content
30
30
  }
31
- ), W = i(
31
+ ), D = a(
32
32
  "block",
33
33
  "before:content-[counter(line)]",
34
34
  "before:inline-block",
@@ -39,25 +39,42 @@ const j = (e) => e && e & 1, U = (e) => e && e & 2, F = (e) => (
39
39
  "before:text-muted-foreground/50",
40
40
  "before:font-mono",
41
41
  "before:select-none"
42
- ), Y = ({
42
+ ), G = ({
43
43
  keyedLine: e,
44
44
  showLineNumbers: t
45
- }) => /* @__PURE__ */ s("span", { className: t ? W : "block", children: e.tokens.length === 0 ? `
46
- ` : e.tokens.map(({ token: o, key: n }) => /* @__PURE__ */ s(G, { token: o }, n)) }), v = I({
45
+ }) => /* @__PURE__ */ s("span", { className: t ? D : "block", children: e.tokens.length === 0 ? `
46
+ ` : e.tokens.map(({ token: o, key: n }) => /* @__PURE__ */ s(U, { token: o }, n)) }), y = I({
47
47
  code: ""
48
- }), b = /* @__PURE__ */ new Map(), C = /* @__PURE__ */ new Map(), g = /* @__PURE__ */ new Map(), k = 100, q = (e, t) => {
49
- const o = e.slice(0, k), n = e.length > k ? e.slice(-k) : "";
48
+ }), W = {
49
+ "github-light": {
50
+ "#24292e": "var(--shiki-fg)",
51
+ "#6a737d": "var(--shiki-comment)",
52
+ "#586069": "var(--shiki-comment)",
53
+ "#d73a49": "var(--shiki-keyword)",
54
+ "#b31d28": "var(--shiki-keyword)",
55
+ "#005cc5": "var(--shiki-constant)",
56
+ "#6f42c1": "var(--shiki-entity)",
57
+ "#22863a": "var(--shiki-tag)",
58
+ "#032f62": "var(--shiki-string)",
59
+ "#e36209": "var(--shiki-variable)"
60
+ },
61
+ "github-dark": {
62
+ "#e1e4e8": "var(--shiki-fg)",
63
+ "#6a737d": "var(--shiki-comment)",
64
+ "#d1d5da": "var(--shiki-comment)",
65
+ "#f97583": "var(--shiki-keyword)",
66
+ "#fdaeb7": "var(--shiki-keyword)",
67
+ "#79b8ff": "var(--shiki-constant)",
68
+ "#b392f0": "var(--shiki-entity)",
69
+ "#85e89d": "var(--shiki-tag)",
70
+ "#9ecbff": "var(--shiki-string)",
71
+ "#dbedff": "var(--shiki-string)",
72
+ "#ffab70": "var(--shiki-variable)"
73
+ }
74
+ }, g = /* @__PURE__ */ new Map(), h = /* @__PURE__ */ new Map(), u = 100, Y = (e, t) => {
75
+ const o = e.slice(0, u), n = e.length > u ? e.slice(-u) : "";
50
76
  return `${t}:${e.length}:${o}:${n}`;
51
- }, J = (e) => {
52
- const t = b.get(e);
53
- if (t)
54
- return t;
55
- const o = A({
56
- langs: [e],
57
- themes: ["github-light", "github-dark"]
58
- });
59
- return b.set(e, o), o;
60
- }, O = (e) => ({
77
+ }, q = (e) => ({
61
78
  bg: "transparent",
62
79
  fg: "inherit",
63
80
  tokens: e.split(`
@@ -69,63 +86,62 @@ const j = (e) => e && e & 1, U = (e) => e && e & 2, F = (e) => (
69
86
  }
70
87
  ]
71
88
  )
72
- }), p = (e, t, o) => {
73
- const n = q(e, t), c = C.get(n);
74
- return c || (o && (g.has(n) || g.set(n, /* @__PURE__ */ new Set()), g.get(n)?.add(o)), J(t).then((r) => {
75
- const l = r.getLoadedLanguages().includes(t) ? t : "text", m = r.codeToTokens(e, {
76
- lang: l,
89
+ }), b = (e, t, o) => {
90
+ const n = Y(e, t), r = g.get(n);
91
+ return r || (o && (h.has(n) || h.set(n, /* @__PURE__ */ new Set()), h.get(n)?.add(o)), M(t).then(({ highlighter: l, lang: i }) => {
92
+ const c = l.codeToTokens(e, {
93
+ colorReplacements: W,
94
+ lang: i,
77
95
  themes: {
78
96
  dark: "github-dark",
79
97
  light: "github-light"
80
98
  }
81
- }), d = {
82
- bg: m.bg ?? "transparent",
83
- fg: m.fg ?? "inherit",
84
- tokens: m.tokens
99
+ }), k = {
100
+ bg: c.bg ?? "transparent",
101
+ fg: c.fg ?? "inherit",
102
+ tokens: c.tokens
85
103
  };
86
- C.set(n, d);
87
- const u = g.get(n);
88
- if (u) {
89
- for (const f of u)
90
- f(d);
91
- g.delete(n);
104
+ g.set(n, k);
105
+ const d = h.get(n);
106
+ if (d) {
107
+ for (const m of d)
108
+ m(k);
109
+ h.delete(n);
92
110
  }
93
- }).catch((r) => {
94
- console.error("Failed to highlight code:", r), g.delete(n);
111
+ }).catch((l) => {
112
+ console.error("Failed to highlight code:", l), h.delete(n);
95
113
  }), null);
96
- }, B = E(
114
+ }, w = L(
97
115
  ({
98
116
  tokenized: e,
99
117
  showLineNumbers: t,
100
118
  className: o
101
119
  }) => {
102
- const n = h(
103
- () => ({
104
- backgroundColor: e.bg,
105
- color: e.fg
106
- }),
107
- [e.bg, e.fg]
108
- ), c = h(
109
- () => D(e.tokens),
120
+ const n = f(
121
+ () => O(e.tokens),
110
122
  [e.tokens]
111
123
  );
112
124
  return /* @__PURE__ */ s(
113
125
  "pre",
114
126
  {
115
- className: i(
116
- "dark:!bg-[var(--shiki-dark-bg)] dark:!text-[var(--shiki-dark)] m-0 p-4 text-sm",
127
+ className: a(
128
+ // Shiki's dual-theme codeToTokens() returns "transparent"/"inherit"
129
+ // for the top-level bg/fg in multi-theme mode — the real per-theme
130
+ // colors only exist per-token (read via CSS vars in TokenSpan).
131
+ // --shiki-bg/--shiki-fg re-resolve under .dark, so no dark: variant
132
+ // is needed here.
133
+ "!bg-[var(--shiki-bg)] !text-[var(--shiki-fg)] m-0 p-4 text-sm",
117
134
  o
118
135
  ),
119
- style: n,
120
136
  children: /* @__PURE__ */ s(
121
137
  "code",
122
138
  {
123
- className: i(
139
+ className: a(
124
140
  "font-mono text-sm",
125
141
  t && "[counter-increment:line_0] [counter-reset:line]"
126
142
  ),
127
- children: c.map((r) => /* @__PURE__ */ s(
128
- Y,
143
+ children: n.map((r) => /* @__PURE__ */ s(
144
+ G,
129
145
  {
130
146
  keyedLine: r,
131
147
  showLineNumbers: t
@@ -139,8 +155,8 @@ const j = (e) => e && e & 1, U = (e) => e && e & 2, F = (e) => (
139
155
  },
140
156
  (e, t) => e.tokenized === t.tokenized && e.showLineNumbers === t.showLineNumbers && e.className === t.className
141
157
  );
142
- B.displayName = "CodeBlockBody";
143
- const Q = ({
158
+ w.displayName = "CodeBlockBody";
159
+ const J = ({
144
160
  className: e,
145
161
  language: t,
146
162
  style: o,
@@ -148,7 +164,7 @@ const Q = ({
148
164
  }) => /* @__PURE__ */ s(
149
165
  "div",
150
166
  {
151
- className: i(
167
+ className: a(
152
168
  "group relative w-full overflow-hidden rounded-md border bg-background text-foreground",
153
169
  e
154
170
  ),
@@ -160,69 +176,69 @@ const Q = ({
160
176
  },
161
177
  ...n
162
178
  }
163
- ), re = ({
179
+ ), se = ({
164
180
  children: e,
165
181
  className: t,
166
182
  ...o
167
183
  }) => /* @__PURE__ */ s(
168
184
  "div",
169
185
  {
170
- className: i(
186
+ className: a(
171
187
  "flex items-center justify-between border-b bg-muted/80 px-3 py-2 text-muted-foreground text-xs",
172
188
  t
173
189
  ),
174
190
  ...o,
175
191
  children: e
176
192
  }
177
- ), ce = ({
193
+ ), re = ({
178
194
  children: e,
179
195
  className: t,
180
196
  ...o
181
- }) => /* @__PURE__ */ s("div", { className: i("flex items-center gap-2", t), ...o, children: e }), ie = ({
197
+ }) => /* @__PURE__ */ s("div", { className: a("flex items-center gap-2", t), ...o, children: e }), ie = ({
182
198
  children: e,
183
199
  className: t,
184
200
  ...o
185
- }) => /* @__PURE__ */ s("span", { className: i("font-mono", t), ...o, children: e }), ae = ({
201
+ }) => /* @__PURE__ */ s("span", { className: a("font-mono", t), ...o, children: e }), ce = ({
186
202
  children: e,
187
203
  className: t,
188
204
  ...o
189
205
  }) => /* @__PURE__ */ s(
190
206
  "div",
191
207
  {
192
- className: i("-my-1 -mr-1 flex items-center gap-2", t),
208
+ className: a("-my-1 -mr-1 flex items-center gap-2", t),
193
209
  ...o,
194
210
  children: e
195
211
  }
196
- ), X = ({
212
+ ), Q = ({
197
213
  code: e,
198
214
  language: t,
199
215
  showLineNumbers: o = !1
200
216
  }) => {
201
- const n = h(() => O(e), [e]), c = h(
202
- () => p(e, t) ?? n,
217
+ const n = f(() => q(e), [e]), r = f(
218
+ () => b(e, t) ?? n,
203
219
  [e, t, n]
204
- ), [r, a] = y(null), l = x({ code: e, language: t });
205
- return (l.current.code !== e || l.current.language !== t) && (l.current = { code: e, language: t }, a(null)), w(() => {
220
+ ), [l, i] = C(null), c = v({ code: e, language: t });
221
+ return (c.current.code !== e || c.current.language !== t) && (c.current = { code: e, language: t }, i(null)), p(() => {
206
222
  let d = !1;
207
- return p(e, t, (u) => {
208
- d || a(u);
223
+ return b(e, t, (m) => {
224
+ d || i(m);
209
225
  }), () => {
210
226
  d = !0;
211
227
  };
212
- }, [e, t]), /* @__PURE__ */ s("div", { className: "relative overflow-auto", children: /* @__PURE__ */ s(B, { showLineNumbers: o, tokenized: r ?? c }) });
213
- }, le = ({
228
+ }, [e, t]), /* @__PURE__ */ s("div", { className: "relative overflow-auto", tabIndex: 0, children: /* @__PURE__ */ s(w, { showLineNumbers: o, tokenized: l ?? r }) });
229
+ }, ae = ({
214
230
  code: e,
215
231
  language: t,
216
232
  showLineNumbers: o = !1,
217
233
  className: n,
218
- children: c,
219
- ...r
234
+ children: r,
235
+ ...l
220
236
  }) => {
221
- const a = h(() => ({ code: e }), [e]);
222
- return /* @__PURE__ */ s(v.Provider, { value: a, children: /* @__PURE__ */ T(Q, { className: n, language: t, ...r, children: [
223
- c,
237
+ const i = f(() => ({ code: e }), [e]);
238
+ return /* @__PURE__ */ s(y.Provider, { value: i, children: /* @__PURE__ */ B(J, { className: n, language: t, ...l, children: [
239
+ r,
224
240
  /* @__PURE__ */ s(
225
- X,
241
+ Q,
226
242
  {
227
243
  code: e,
228
244
  language: t,
@@ -230,77 +246,79 @@ const Q = ({
230
246
  }
231
247
  )
232
248
  ] }) });
233
- }, de = ({
249
+ }, le = ({
234
250
  onCopy: e,
235
251
  onError: t,
236
252
  timeout: o = 2e3,
237
253
  children: n,
238
- className: c,
239
- ...r
254
+ className: r,
255
+ ...l
240
256
  }) => {
241
- const [a, l] = y(!1), m = x(0), { code: d } = $(v), u = _(async () => {
257
+ const [i, c] = C(!1), k = v(0), { code: d } = E(y), m = z(async () => {
242
258
  if (typeof window > "u" || !navigator?.clipboard?.writeText) {
243
259
  t?.(new Error("Clipboard API not available"));
244
260
  return;
245
261
  }
246
262
  try {
247
- a || (await navigator.clipboard.writeText(d), l(!0), e?.(), m.current = window.setTimeout(
248
- () => l(!1),
263
+ i || (await navigator.clipboard.writeText(d), c(!0), e?.(), k.current = window.setTimeout(
264
+ () => c(!1),
249
265
  o
250
266
  ));
251
267
  } catch (S) {
252
268
  t?.(S);
253
269
  }
254
- }, [d, e, t, o, a]);
255
- w(
270
+ }, [d, e, t, o, i]);
271
+ p(
256
272
  () => () => {
257
- window.clearTimeout(m.current);
273
+ window.clearTimeout(k.current);
258
274
  },
259
275
  []
260
276
  );
261
- const f = a ? N : L;
277
+ const x = i ? T : N;
262
278
  return /* @__PURE__ */ s(
263
- H,
279
+ R,
264
280
  {
265
- className: i("shrink-0", c),
266
- onClick: u,
281
+ "aria-label": "Copy code",
282
+ className: a("shrink-0", r),
283
+ onClick: m,
267
284
  size: "icon",
268
285
  variant: "ghost",
269
- ...r,
270
- children: n ?? /* @__PURE__ */ s(f, { size: 14 })
286
+ ...l,
287
+ children: n ?? /* @__PURE__ */ s(x, { size: 14 })
271
288
  }
272
289
  );
273
- }, me = (e) => /* @__PURE__ */ s(K, { ...e }), ue = ({
290
+ }, de = (e) => /* @__PURE__ */ s(_, { ...e }), ke = ({
274
291
  className: e,
275
292
  ...t
276
293
  }) => /* @__PURE__ */ s(
277
- z,
294
+ K,
278
295
  {
279
- className: i(
296
+ "aria-label": "Select language",
297
+ className: a(
280
298
  "h-7 border-none bg-transparent px-2 text-xs shadow-none",
281
299
  e
282
300
  ),
283
301
  size: "sm",
284
302
  ...t
285
303
  }
286
- ), ge = (e) => /* @__PURE__ */ s(V, { ...e }), he = ({
304
+ ), he = (e) => /* @__PURE__ */ s(H, { ...e }), me = ({
287
305
  align: e = "end",
288
306
  ...t
289
- }) => /* @__PURE__ */ s(M, { align: e, ...t }), fe = (e) => /* @__PURE__ */ s(R, { ...e });
307
+ }) => /* @__PURE__ */ s($, { align: e, ...t }), fe = (e) => /* @__PURE__ */ s(A, { ...e });
290
308
  export {
291
- le as CodeBlock,
292
- ae as CodeBlockActions,
293
- Q as CodeBlockContainer,
294
- X as CodeBlockContent,
295
- de as CodeBlockCopyButton,
309
+ ae as CodeBlock,
310
+ ce as CodeBlockActions,
311
+ J as CodeBlockContainer,
312
+ Q as CodeBlockContent,
313
+ le as CodeBlockCopyButton,
296
314
  ie as CodeBlockFilename,
297
- re as CodeBlockHeader,
298
- me as CodeBlockLanguageSelector,
299
- he as CodeBlockLanguageSelectorContent,
315
+ se as CodeBlockHeader,
316
+ de as CodeBlockLanguageSelector,
317
+ me as CodeBlockLanguageSelectorContent,
300
318
  fe as CodeBlockLanguageSelectorItem,
301
- ue as CodeBlockLanguageSelectorTrigger,
302
- ge as CodeBlockLanguageSelectorValue,
303
- ce as CodeBlockTitle,
304
- p as highlightCode
319
+ ke as CodeBlockLanguageSelectorTrigger,
320
+ he as CodeBlockLanguageSelectorValue,
321
+ re as CodeBlockTitle,
322
+ b as highlightCode
305
323
  };
306
324
  //# sourceMappingURL=code-block.js.map