@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.
- package/README.md +2 -2
- package/dist/components/ai/chain-of-thought.cjs +1 -1
- package/dist/components/ai/chain-of-thought.cjs.map +1 -1
- package/dist/components/ai/chain-of-thought.js +1 -1
- package/dist/components/ai/chain-of-thought.js.map +1 -1
- package/dist/components/ai/confirmation.cjs +1 -1
- package/dist/components/ai/confirmation.cjs.map +1 -1
- package/dist/components/ai/confirmation.js +1 -1
- package/dist/components/ai/confirmation.js.map +1 -1
- package/dist/components/ai/context.cjs +1 -1
- package/dist/components/ai/context.cjs.map +1 -1
- package/dist/components/ai/context.js +36 -35
- package/dist/components/ai/context.js.map +1 -1
- package/dist/components/ai/message.cjs +1 -1
- package/dist/components/ai/message.cjs.map +1 -1
- package/dist/components/ai/message.js +68 -68
- package/dist/components/ai/message.js.map +1 -1
- package/dist/components/ai/prompt-input.cjs +1 -1
- package/dist/components/ai/prompt-input.cjs.map +1 -1
- package/dist/components/ai/prompt-input.js +4 -2
- package/dist/components/ai/prompt-input.js.map +1 -1
- package/dist/components/ai/queue.cjs +1 -1
- package/dist/components/ai/queue.cjs.map +1 -1
- package/dist/components/ai/queue.js +9 -9
- package/dist/components/ai/queue.js.map +1 -1
- package/dist/components/ai/reasoning.cjs +1 -1
- package/dist/components/ai/reasoning.cjs.map +1 -1
- package/dist/components/ai/reasoning.js +67 -67
- package/dist/components/ai/reasoning.js.map +1 -1
- package/dist/components/ai/stream-status.cjs +1 -1
- package/dist/components/ai/stream-status.cjs.map +1 -1
- package/dist/components/ai/stream-status.js +41 -39
- package/dist/components/ai/stream-status.js.map +1 -1
- package/dist/components/ai/streamdown-code-plugin.cjs +2 -0
- package/dist/components/ai/streamdown-code-plugin.cjs.map +1 -0
- package/dist/components/ai/streamdown-code-plugin.js +42 -0
- package/dist/components/ai/streamdown-code-plugin.js.map +1 -0
- package/dist/components/ai/streamdown-plugins.cjs +2 -0
- package/dist/components/ai/streamdown-plugins.cjs.map +1 -0
- package/dist/components/ai/streamdown-plugins.js +14 -0
- package/dist/components/ai/streamdown-plugins.js.map +1 -0
- package/dist/components/ai/task.cjs +1 -1
- package/dist/components/ai/task.cjs.map +1 -1
- package/dist/components/ai/task.js +18 -11
- package/dist/components/ai/task.js.map +1 -1
- package/dist/components/ai/tool.cjs +1 -1
- package/dist/components/ai/tool.cjs.map +1 -1
- package/dist/components/ai/tool.js +51 -55
- package/dist/components/ai/tool.js.map +1 -1
- package/dist/components/ai/use-streamdown-plugins.cjs +2 -0
- package/dist/components/ai/use-streamdown-plugins.cjs.map +1 -0
- package/dist/components/ai/use-streamdown-plugins.js +25 -0
- package/dist/components/ai/use-streamdown-plugins.js.map +1 -0
- package/dist/components/charts/AreaPlot/AreaPlot.cjs +2 -0
- package/dist/components/charts/AreaPlot/AreaPlot.cjs.map +1 -0
- package/dist/components/charts/AreaPlot/AreaPlot.js +270 -0
- package/dist/components/charts/AreaPlot/AreaPlot.js.map +1 -0
- package/dist/components/charts/BarChart/BarChart.cjs +2 -0
- package/dist/components/charts/BarChart/BarChart.cjs.map +1 -0
- package/dist/components/charts/BarChart/BarChart.js +219 -0
- package/dist/components/charts/BarChart/BarChart.js.map +1 -0
- package/dist/components/charts/BoxPlot/BoxPlot.cjs +2 -0
- package/dist/components/charts/BoxPlot/BoxPlot.cjs.map +1 -0
- package/dist/components/charts/{Boxplot/Boxplot.js → BoxPlot/BoxPlot.js} +78 -79
- package/dist/components/charts/BoxPlot/BoxPlot.js.map +1 -0
- package/dist/components/charts/ChartTooltip/ChartTooltip.cjs +1 -1
- package/dist/components/charts/ChartTooltip/ChartTooltip.cjs.map +1 -1
- package/dist/components/charts/ChartTooltip/ChartTooltip.js +22 -22
- package/dist/components/charts/ChartTooltip/ChartTooltip.js.map +1 -1
- package/dist/components/charts/Chromatogram/Chromatogram.cjs +1 -1
- package/dist/components/charts/Chromatogram/Chromatogram.cjs.map +1 -1
- package/dist/components/charts/Chromatogram/Chromatogram.js +232 -170
- package/dist/components/charts/Chromatogram/Chromatogram.js.map +1 -1
- package/dist/components/charts/Chromatogram/annotations.cjs +2 -0
- package/dist/components/charts/Chromatogram/annotations.cjs.map +1 -0
- package/dist/components/charts/Chromatogram/annotations.js +137 -0
- package/dist/components/charts/Chromatogram/annotations.js.map +1 -0
- package/dist/components/charts/Chromatogram/boundaryMarkers.cjs +2 -0
- package/dist/components/charts/Chromatogram/boundaryMarkers.cjs.map +1 -0
- package/dist/components/charts/Chromatogram/boundaryMarkers.js +34 -0
- package/dist/components/charts/Chromatogram/boundaryMarkers.js.map +1 -0
- package/dist/components/charts/{ChromatogramChart → Chromatogram}/constants.cjs +1 -1
- package/dist/components/charts/Chromatogram/constants.cjs.map +1 -0
- package/dist/components/charts/{ChromatogramChart → Chromatogram}/constants.js +11 -5
- package/dist/components/charts/Chromatogram/constants.js.map +1 -0
- package/dist/components/charts/Chromatogram/dataProcessing.cjs +2 -0
- package/dist/components/charts/Chromatogram/dataProcessing.cjs.map +1 -0
- package/dist/components/charts/Chromatogram/dataProcessing.js +90 -0
- package/dist/components/charts/Chromatogram/dataProcessing.js.map +1 -0
- package/dist/components/charts/Chromatogram/peakDetection.cjs.map +1 -0
- package/dist/components/charts/Chromatogram/peakDetection.js.map +1 -0
- package/dist/components/charts/Chromatogram/plotBuilder.cjs +2 -0
- package/dist/components/charts/Chromatogram/plotBuilder.cjs.map +1 -0
- package/dist/components/charts/Chromatogram/plotBuilder.js +216 -0
- package/dist/components/charts/Chromatogram/plotBuilder.js.map +1 -0
- package/dist/components/charts/Chromatogram/regionOverlays.cjs +2 -0
- package/dist/components/charts/Chromatogram/regionOverlays.cjs.map +1 -0
- package/dist/components/charts/Chromatogram/regionOverlays.js +26 -0
- package/dist/components/charts/Chromatogram/regionOverlays.js.map +1 -0
- package/dist/components/charts/Electropherogram/Electropherogram.cjs +2 -0
- package/dist/components/charts/Electropherogram/Electropherogram.cjs.map +1 -0
- package/dist/components/charts/Electropherogram/Electropherogram.js +180 -0
- package/dist/components/charts/Electropherogram/Electropherogram.js.map +1 -0
- package/dist/components/charts/Histogram/Histogram.cjs +1 -1
- package/dist/components/charts/Histogram/Histogram.cjs.map +1 -1
- package/dist/components/charts/Histogram/Histogram.js +107 -108
- package/dist/components/charts/Histogram/Histogram.js.map +1 -1
- package/dist/components/charts/LinePlot/LinePlot.cjs +2 -0
- package/dist/components/charts/LinePlot/LinePlot.cjs.map +1 -0
- package/dist/components/charts/LinePlot/LinePlot.js +224 -0
- package/dist/components/charts/LinePlot/LinePlot.js.map +1 -0
- package/dist/components/charts/PieChart/PieChart.cjs +1 -1
- package/dist/components/charts/PieChart/PieChart.cjs.map +1 -1
- package/dist/components/charts/PieChart/PieChart.js +62 -61
- package/dist/components/charts/PieChart/PieChart.js.map +1 -1
- package/dist/components/charts/PlateMap/PlateMap.cjs +1 -1
- package/dist/components/charts/PlateMap/PlateMap.cjs.map +1 -1
- package/dist/components/charts/PlateMap/PlateMap.js +246 -242
- package/dist/components/charts/PlateMap/PlateMap.js.map +1 -1
- package/dist/components/charts/ScatterPlot/ScatterPlot.cjs +2 -0
- package/dist/components/charts/ScatterPlot/ScatterPlot.cjs.map +1 -0
- package/dist/components/charts/ScatterPlot/ScatterPlot.js +252 -0
- package/dist/components/charts/ScatterPlot/ScatterPlot.js.map +1 -0
- package/dist/components/charts/ScatterPlotInteractive/ScatterPlotInteractive.cjs +2 -0
- package/dist/components/charts/ScatterPlotInteractive/ScatterPlotInteractive.cjs.map +1 -0
- package/dist/components/charts/ScatterPlotInteractive/ScatterPlotInteractive.js +215 -0
- package/dist/components/charts/ScatterPlotInteractive/ScatterPlotInteractive.js.map +1 -0
- package/dist/components/charts/ScatterPlotInteractive/constants.cjs +2 -0
- package/dist/components/charts/ScatterPlotInteractive/constants.cjs.map +1 -0
- package/dist/components/charts/ScatterPlotInteractive/constants.js +38 -0
- package/dist/components/charts/ScatterPlotInteractive/constants.js.map +1 -0
- package/dist/components/charts/ScatterPlotInteractive/utils.cjs +2 -0
- package/dist/components/charts/ScatterPlotInteractive/utils.cjs.map +1 -0
- package/dist/components/charts/ScatterPlotInteractive/utils.js +261 -0
- package/dist/components/charts/ScatterPlotInteractive/utils.js.map +1 -0
- package/dist/components/charts/StackedChromatogram/StackedChromatogram.cjs +2 -0
- package/dist/components/charts/StackedChromatogram/StackedChromatogram.cjs.map +1 -0
- package/dist/components/charts/StackedChromatogram/StackedChromatogram.js +40 -0
- package/dist/components/charts/StackedChromatogram/StackedChromatogram.js.map +1 -0
- package/dist/components/charts/StackedChromatogram/transforms.cjs +2 -0
- package/dist/components/charts/StackedChromatogram/transforms.cjs.map +1 -0
- package/dist/components/charts/StackedChromatogram/transforms.js +31 -0
- package/dist/components/charts/StackedChromatogram/transforms.js.map +1 -0
- package/dist/components/charts/plotly-loader.cjs +2 -0
- package/dist/components/charts/plotly-loader.cjs.map +1 -0
- package/dist/components/charts/plotly-loader.js +22 -0
- package/dist/components/charts/plotly-loader.js.map +1 -0
- package/dist/components/composed/AssistantLayout/AssistantLayout.cjs +2 -0
- package/dist/components/composed/AssistantLayout/AssistantLayout.cjs.map +1 -0
- package/dist/components/composed/AssistantLayout/AssistantLayout.js +142 -0
- package/dist/components/composed/AssistantLayout/AssistantLayout.js.map +1 -0
- package/dist/components/composed/AssistantLayout/dockLayout.cjs +2 -0
- package/dist/components/composed/AssistantLayout/dockLayout.cjs.map +1 -0
- package/dist/components/composed/AssistantLayout/dockLayout.js +10 -0
- package/dist/components/composed/AssistantLayout/dockLayout.js.map +1 -0
- package/dist/components/composed/Chat/Chat.cjs +1 -1
- package/dist/components/composed/Chat/Chat.cjs.map +1 -1
- package/dist/components/composed/Chat/Chat.js +23 -23
- package/dist/components/composed/Chat/Chat.js.map +1 -1
- package/dist/components/composed/ConfirmDialog/ConfirmDialog.cjs +1 -1
- package/dist/components/composed/ConfirmDialog/ConfirmDialog.cjs.map +1 -1
- package/dist/components/composed/ConfirmDialog/ConfirmDialog.js +33 -29
- package/dist/components/composed/ConfirmDialog/ConfirmDialog.js.map +1 -1
- package/dist/components/composed/DataAppShell/CollapseButton.cjs +2 -0
- package/dist/components/composed/DataAppShell/CollapseButton.cjs.map +1 -0
- package/dist/components/composed/DataAppShell/CollapseButton.js +42 -0
- package/dist/components/composed/DataAppShell/CollapseButton.js.map +1 -0
- package/dist/components/composed/DataAppShell/DataAppShell.cjs +1 -1
- package/dist/components/composed/DataAppShell/DataAppShell.cjs.map +1 -1
- package/dist/components/composed/DataAppShell/DataAppShell.js +349 -313
- package/dist/components/composed/DataAppShell/DataAppShell.js.map +1 -1
- package/dist/components/composed/DataAppShell/PrimaryNav.cjs +2 -0
- package/dist/components/composed/DataAppShell/PrimaryNav.cjs.map +1 -0
- package/dist/components/composed/DataAppShell/PrimaryNav.js +268 -0
- package/dist/components/composed/DataAppShell/PrimaryNav.js.map +1 -0
- package/dist/components/composed/DataAppShell/RightPanel.cjs +2 -0
- package/dist/components/composed/DataAppShell/RightPanel.cjs.map +1 -0
- package/dist/components/composed/DataAppShell/RightPanel.js +282 -0
- package/dist/components/composed/DataAppShell/RightPanel.js.map +1 -0
- package/dist/components/composed/DataAppShell/SecondaryNav.cjs +2 -0
- package/dist/components/composed/DataAppShell/SecondaryNav.cjs.map +1 -0
- package/dist/components/composed/DataAppShell/SecondaryNav.js +364 -0
- package/dist/components/composed/DataAppShell/SecondaryNav.js.map +1 -0
- package/dist/components/composed/DataAppShell/ShellContext.cjs +2 -0
- package/dist/components/composed/DataAppShell/ShellContext.cjs.map +1 -0
- package/dist/components/composed/DataAppShell/ShellContext.js +23 -0
- package/dist/components/composed/DataAppShell/ShellContext.js.map +1 -0
- package/dist/components/composed/MoleculeStructure/MoleculeStructure.cjs +2 -0
- package/dist/components/composed/MoleculeStructure/MoleculeStructure.cjs.map +1 -0
- package/dist/components/composed/MoleculeStructure/MoleculeStructure.js +87 -0
- package/dist/components/composed/MoleculeStructure/MoleculeStructure.js.map +1 -0
- package/dist/components/composed/MoleculeStructure/rdkit-loader.cjs +2 -0
- package/dist/components/composed/MoleculeStructure/rdkit-loader.cjs.map +1 -0
- package/dist/components/composed/MoleculeStructure/rdkit-loader.js +89 -0
- package/dist/components/composed/MoleculeStructure/rdkit-loader.js.map +1 -0
- package/dist/components/composed/MoleculeStructure/use-rdkit.cjs +2 -0
- package/dist/components/composed/MoleculeStructure/use-rdkit.cjs.map +1 -0
- package/dist/components/composed/MoleculeStructure/use-rdkit.js +19 -0
- package/dist/components/composed/MoleculeStructure/use-rdkit.js.map +1 -0
- package/dist/components/composed/PlateMapEditor/ManifestFilterPopover.cjs +1 -1
- package/dist/components/composed/PlateMapEditor/ManifestFilterPopover.cjs.map +1 -1
- package/dist/components/composed/PlateMapEditor/ManifestFilterPopover.js +17 -17
- package/dist/components/composed/PlateMapEditor/ManifestFilterPopover.js.map +1 -1
- package/dist/components/composed/PlateMapEditor/PlateMapActionsMenu.cjs +1 -1
- package/dist/components/composed/PlateMapEditor/PlateMapActionsMenu.cjs.map +1 -1
- package/dist/components/composed/PlateMapEditor/PlateMapActionsMenu.js +33 -33
- package/dist/components/composed/PlateMapEditor/PlateMapActionsMenu.js.map +1 -1
- package/dist/components/composed/PlateMapEditor/PlateMapPlateSelector.cjs +1 -1
- package/dist/components/composed/PlateMapEditor/PlateMapPlateSelector.cjs.map +1 -1
- package/dist/components/composed/PlateMapEditor/PlateMapPlateSelector.js +7 -7
- package/dist/components/composed/PlateMapEditor/PlateMapPlateSelector.js.map +1 -1
- package/dist/components/composed/PlateMapEditor/PlatePaintGrid.cjs +1 -1
- package/dist/components/composed/PlateMapEditor/PlatePaintGrid.cjs.map +1 -1
- package/dist/components/composed/PlateMapEditor/PlatePaintGrid.js +1 -1
- package/dist/components/composed/PlateMapEditor/PlatePaintGrid.js.map +1 -1
- package/dist/components/composed/PlateMapEditor/WellLegend.cjs +1 -1
- package/dist/components/composed/PlateMapEditor/WellLegend.cjs.map +1 -1
- package/dist/components/composed/PlateMapEditor/WellLegend.js +24 -12
- package/dist/components/composed/PlateMapEditor/WellLegend.js.map +1 -1
- package/dist/components/composed/PlateMapEditor/WellManifestTable.cjs +1 -1
- package/dist/components/composed/PlateMapEditor/WellManifestTable.cjs.map +1 -1
- package/dist/components/composed/PlateMapEditor/WellManifestTable.js +1 -1
- package/dist/components/composed/PlateMapEditor/WellManifestTable.js.map +1 -1
- package/dist/components/composed/TdpSearch/components/DefaultFilters.cjs +1 -1
- package/dist/components/composed/TdpSearch/components/DefaultFilters.cjs.map +1 -1
- package/dist/components/composed/TdpSearch/components/DefaultFilters.js +3 -3
- package/dist/components/composed/TdpSearch/components/DefaultFilters.js.map +1 -1
- package/dist/components/composed/TopBar/TopBar.cjs +2 -0
- package/dist/components/composed/TopBar/TopBar.cjs.map +1 -0
- package/dist/components/composed/TopBar/TopBar.js +56 -0
- package/dist/components/composed/TopBar/TopBar.js.map +1 -0
- package/dist/components/composed/UserMenu/UserMenu.cjs +2 -0
- package/dist/components/composed/UserMenu/UserMenu.cjs.map +1 -0
- package/dist/components/composed/UserMenu/UserMenu.js +99 -0
- package/dist/components/composed/UserMenu/UserMenu.js.map +1 -0
- package/dist/components/composed/tdp-link.cjs +1 -1
- package/dist/components/composed/tdp-link.cjs.map +1 -1
- package/dist/components/composed/tdp-link.js +5 -5
- package/dist/components/composed/tdp-link.js.map +1 -1
- package/dist/components/ui/alert.cjs +1 -1
- package/dist/components/ui/alert.cjs.map +1 -1
- package/dist/components/ui/alert.js +12 -12
- package/dist/components/ui/alert.js.map +1 -1
- package/dist/components/ui/badge.cjs +1 -1
- package/dist/components/ui/badge.cjs.map +1 -1
- package/dist/components/ui/badge.js +14 -14
- package/dist/components/ui/badge.js.map +1 -1
- package/dist/components/ui/banner.cjs +1 -1
- package/dist/components/ui/banner.cjs.map +1 -1
- package/dist/components/ui/banner.js +17 -17
- package/dist/components/ui/banner.js.map +1 -1
- package/dist/components/ui/button.cjs +1 -1
- package/dist/components/ui/button.cjs.map +1 -1
- package/dist/components/ui/button.js +16 -16
- package/dist/components/ui/button.js.map +1 -1
- package/dist/components/ui/calendar.cjs +1 -1
- package/dist/components/ui/calendar.cjs.map +1 -1
- package/dist/components/ui/calendar.js +3 -3
- package/dist/components/ui/calendar.js.map +1 -1
- package/dist/components/ui/code-block.cjs +3 -3
- package/dist/components/ui/code-block.cjs.map +1 -1
- package/dist/components/ui/code-block.js +136 -118
- package/dist/components/ui/code-block.js.map +1 -1
- package/dist/components/ui/code-editor.cjs +1 -1
- package/dist/components/ui/code-editor.cjs.map +1 -1
- package/dist/components/ui/code-editor.js +14 -12
- package/dist/components/ui/code-editor.js.map +1 -1
- package/dist/components/ui/combobox.cjs +1 -1
- package/dist/components/ui/combobox.cjs.map +1 -1
- package/dist/components/ui/combobox.js +33 -29
- package/dist/components/ui/combobox.js.map +1 -1
- package/dist/components/ui/command.cjs +1 -1
- package/dist/components/ui/command.cjs.map +1 -1
- package/dist/components/ui/command.js +81 -77
- package/dist/components/ui/command.js.map +1 -1
- package/dist/components/ui/context-menu.cjs +1 -1
- package/dist/components/ui/context-menu.cjs.map +1 -1
- package/dist/components/ui/context-menu.js +13 -13
- package/dist/components/ui/context-menu.js.map +1 -1
- package/dist/components/ui/data-table/data-table-column-toggle.cjs +1 -1
- package/dist/components/ui/data-table/data-table-column-toggle.cjs.map +1 -1
- package/dist/components/ui/data-table/data-table-column-toggle.js +70 -62
- package/dist/components/ui/data-table/data-table-column-toggle.js.map +1 -1
- package/dist/components/ui/data-table/data-table-filter.cjs +1 -1
- package/dist/components/ui/data-table/data-table-filter.cjs.map +1 -1
- package/dist/components/ui/data-table/data-table-filter.js +24 -23
- package/dist/components/ui/data-table/data-table-filter.js.map +1 -1
- package/dist/components/ui/data-table/data-table-group.cjs +1 -1
- package/dist/components/ui/data-table/data-table-group.cjs.map +1 -1
- package/dist/components/ui/data-table/data-table-group.js +17 -16
- package/dist/components/ui/data-table/data-table-group.js.map +1 -1
- package/dist/components/ui/data-table/data-table-pagination.cjs +1 -1
- package/dist/components/ui/data-table/data-table-pagination.cjs.map +1 -1
- package/dist/components/ui/data-table/data-table-pagination.js +15 -15
- package/dist/components/ui/data-table/data-table-pagination.js.map +1 -1
- package/dist/components/ui/data-table/data-table.cjs +1 -1
- package/dist/components/ui/data-table/data-table.cjs.map +1 -1
- package/dist/components/ui/data-table/data-table.js +191 -190
- package/dist/components/ui/data-table/data-table.js.map +1 -1
- package/dist/components/ui/dialog.cjs +1 -1
- package/dist/components/ui/dialog.cjs.map +1 -1
- package/dist/components/ui/dialog.js +1 -1
- package/dist/components/ui/dialog.js.map +1 -1
- package/dist/components/ui/dropdown-menu.cjs +1 -1
- package/dist/components/ui/dropdown-menu.cjs.map +1 -1
- package/dist/components/ui/dropdown-menu.js +12 -4
- package/dist/components/ui/dropdown-menu.js.map +1 -1
- package/dist/components/ui/hover-card.cjs +1 -1
- package/dist/components/ui/hover-card.cjs.map +1 -1
- package/dist/components/ui/hover-card.js +3 -3
- package/dist/components/ui/hover-card.js.map +1 -1
- package/dist/components/ui/item.cjs +1 -1
- package/dist/components/ui/item.cjs.map +1 -1
- package/dist/components/ui/item.js +44 -36
- package/dist/components/ui/item.js.map +1 -1
- package/dist/components/ui/menubar.cjs +1 -1
- package/dist/components/ui/menubar.cjs.map +1 -1
- package/dist/components/ui/menubar.js +2 -2
- package/dist/components/ui/menubar.js.map +1 -1
- package/dist/components/ui/navigation-menu.cjs +1 -1
- package/dist/components/ui/navigation-menu.cjs.map +1 -1
- package/dist/components/ui/navigation-menu.js +1 -1
- package/dist/components/ui/navigation-menu.js.map +1 -1
- package/dist/components/ui/popover.cjs +1 -1
- package/dist/components/ui/popover.cjs.map +1 -1
- package/dist/components/ui/popover.js +1 -1
- package/dist/components/ui/popover.js.map +1 -1
- package/dist/components/ui/scroll-area.cjs +1 -1
- package/dist/components/ui/scroll-area.cjs.map +1 -1
- package/dist/components/ui/scroll-area.js +1 -0
- package/dist/components/ui/scroll-area.js.map +1 -1
- package/dist/components/ui/select.cjs +1 -1
- package/dist/components/ui/select.cjs.map +1 -1
- package/dist/components/ui/select.js +1 -1
- package/dist/components/ui/select.js.map +1 -1
- package/dist/components/ui/sheet.cjs +1 -1
- package/dist/components/ui/sheet.cjs.map +1 -1
- package/dist/components/ui/sheet.js +5 -5
- package/dist/components/ui/sheet.js.map +1 -1
- package/dist/components/ui/sidebar.cjs +1 -1
- package/dist/components/ui/sidebar.cjs.map +1 -1
- package/dist/components/ui/sidebar.js +2 -2
- package/dist/components/ui/sidebar.js.map +1 -1
- package/dist/components/ui/slider.cjs +1 -1
- package/dist/components/ui/slider.cjs.map +1 -1
- package/dist/components/ui/slider.js +10 -9
- package/dist/components/ui/slider.js.map +1 -1
- package/dist/components/ui/sonner.cjs +1 -1
- package/dist/components/ui/sonner.cjs.map +1 -1
- package/dist/components/ui/sonner.js +25 -10
- package/dist/components/ui/sonner.js.map +1 -1
- package/dist/components/ui/table.cjs +1 -1
- package/dist/components/ui/table.cjs.map +1 -1
- package/dist/components/ui/table.js +1 -0
- package/dist/components/ui/table.js.map +1 -1
- package/dist/components/ui/tabs.cjs +1 -1
- package/dist/components/ui/tabs.cjs.map +1 -1
- package/dist/components/ui/tabs.js +18 -18
- package/dist/components/ui/tabs.js.map +1 -1
- package/dist/components/ui/tetra-molecule-icon.cjs +2 -0
- package/dist/components/ui/tetra-molecule-icon.cjs.map +1 -0
- package/dist/components/ui/tetra-molecule-icon.js +49 -0
- package/dist/components/ui/tetra-molecule-icon.js.map +1 -0
- package/dist/components/ui/toggle-group.cjs +1 -1
- package/dist/components/ui/toggle-group.cjs.map +1 -1
- package/dist/components/ui/toggle-group.js +35 -31
- package/dist/components/ui/toggle-group.js.map +1 -1
- package/dist/hooks/use-plotly-theme.cjs +1 -1
- package/dist/hooks/use-plotly-theme.cjs.map +1 -1
- package/dist/hooks/use-plotly-theme.js +4 -3
- package/dist/hooks/use-plotly-theme.js.map +1 -1
- package/dist/index.cjs +1 -1
- package/dist/index.css +1 -1
- package/dist/index.d.ts +1210 -132
- package/dist/index.js +694 -639
- package/dist/index.js.map +1 -1
- package/dist/index.tailwind.css +1 -1
- package/dist/lib/shiki.cjs +2 -0
- package/dist/lib/shiki.cjs.map +1 -0
- package/dist/lib/shiki.js +72 -0
- package/dist/lib/shiki.js.map +1 -0
- package/package.json +23 -12
- package/dist/components/charts/AreaGraph/AreaGraph.cjs +0 -2
- package/dist/components/charts/AreaGraph/AreaGraph.cjs.map +0 -1
- package/dist/components/charts/AreaGraph/AreaGraph.js +0 -271
- package/dist/components/charts/AreaGraph/AreaGraph.js.map +0 -1
- package/dist/components/charts/BarGraph/BarGraph.cjs +0 -2
- package/dist/components/charts/BarGraph/BarGraph.cjs.map +0 -1
- package/dist/components/charts/BarGraph/BarGraph.js +0 -220
- package/dist/components/charts/BarGraph/BarGraph.js.map +0 -1
- package/dist/components/charts/Boxplot/Boxplot.cjs +0 -2
- package/dist/components/charts/Boxplot/Boxplot.cjs.map +0 -1
- package/dist/components/charts/Boxplot/Boxplot.js.map +0 -1
- package/dist/components/charts/ChromatogramChart/ChromatogramChart.cjs +0 -2
- package/dist/components/charts/ChromatogramChart/ChromatogramChart.cjs.map +0 -1
- package/dist/components/charts/ChromatogramChart/ChromatogramChart.js +0 -227
- package/dist/components/charts/ChromatogramChart/ChromatogramChart.js.map +0 -1
- package/dist/components/charts/ChromatogramChart/annotations.cjs +0 -2
- package/dist/components/charts/ChromatogramChart/annotations.cjs.map +0 -1
- package/dist/components/charts/ChromatogramChart/annotations.js +0 -73
- package/dist/components/charts/ChromatogramChart/annotations.js.map +0 -1
- package/dist/components/charts/ChromatogramChart/boundaryMarkers.cjs +0 -2
- package/dist/components/charts/ChromatogramChart/boundaryMarkers.cjs.map +0 -1
- package/dist/components/charts/ChromatogramChart/boundaryMarkers.js +0 -34
- package/dist/components/charts/ChromatogramChart/boundaryMarkers.js.map +0 -1
- package/dist/components/charts/ChromatogramChart/constants.cjs.map +0 -1
- package/dist/components/charts/ChromatogramChart/constants.js.map +0 -1
- package/dist/components/charts/ChromatogramChart/dataProcessing.cjs +0 -2
- package/dist/components/charts/ChromatogramChart/dataProcessing.cjs.map +0 -1
- package/dist/components/charts/ChromatogramChart/dataProcessing.js +0 -79
- package/dist/components/charts/ChromatogramChart/dataProcessing.js.map +0 -1
- package/dist/components/charts/ChromatogramChart/peakDetection.cjs.map +0 -1
- package/dist/components/charts/ChromatogramChart/peakDetection.js.map +0 -1
- package/dist/components/charts/DotPlot/DotPlot.cjs +0 -2
- package/dist/components/charts/DotPlot/DotPlot.cjs.map +0 -1
- package/dist/components/charts/DotPlot/DotPlot.js +0 -208
- package/dist/components/charts/DotPlot/DotPlot.js.map +0 -1
- package/dist/components/charts/Heatmap/Heatmap.cjs +0 -2
- package/dist/components/charts/Heatmap/Heatmap.cjs.map +0 -1
- package/dist/components/charts/Heatmap/Heatmap.js +0 -67
- package/dist/components/charts/Heatmap/Heatmap.js.map +0 -1
- package/dist/components/charts/LineGraph/LineGraph.cjs +0 -2
- package/dist/components/charts/LineGraph/LineGraph.cjs.map +0 -1
- package/dist/components/charts/LineGraph/LineGraph.js +0 -225
- package/dist/components/charts/LineGraph/LineGraph.js.map +0 -1
- package/dist/components/charts/ScatterGraph/ScatterGraph.cjs +0 -2
- package/dist/components/charts/ScatterGraph/ScatterGraph.cjs.map +0 -1
- package/dist/components/charts/ScatterGraph/ScatterGraph.js +0 -234
- package/dist/components/charts/ScatterGraph/ScatterGraph.js.map +0 -1
- /package/dist/components/charts/{ChromatogramChart → Chromatogram}/peakDetection.cjs +0 -0
- /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":"wRA+BMA,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,EAMKC,EAAmE,CACvE,eAAgB,CACd,UAAW,kBACX,UAAW,uBACX,UAAW,uBACX,UAAW,uBACX,UAAW,uBACX,UAAW,wBACX,UAAW,sBACX,UAAW,mBACX,UAAW,sBACX,UAAW,uBAAA,EAEb,cAAe,CACb,UAAW,kBACX,UAAW,uBACX,UAAW,uBACX,UAAW,uBACX,UAAW,uBACX,UAAW,wBACX,UAAW,sBACX,UAAW,mBACX,UAAW,sBACX,UAAW,sBACX,UAAW,uBAAA,CAEf,EAGMC,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,EAGMC,EAAmBJ,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,GAGawB,EAAgB,CAC3BL,EACAC,EAEAK,IACyB,CACzB,MAAMC,EAAiBR,EAAkBC,EAAMC,CAAQ,EAGjDO,EAASZ,EAAY,IAAIW,CAAc,EAC7C,OAAIC,IAKAF,IACGT,EAAY,IAAIU,CAAc,GACjCV,EAAY,IAAIU,EAAgB,IAAI,GAAK,EAE3CV,EAAY,IAAIU,CAAc,GAAG,IAAID,CAAQ,GAO/CG,EAAAA,wBAAwBR,CAAQ,EAE7B,KAAK,CAAC,CAAE,YAAAS,EAAa,KAAAC,KAAW,CAC/B,MAAMC,EAASF,EAAY,aAAaV,EAAM,CAC5C,kBAAmBL,EACnB,KAAAgB,EACA,OAAQ,CACN,KAAM,cACN,MAAO,cAAA,CACT,CACD,EAEKE,EAA2B,CAC/B,GAAID,EAAO,IAAM,cACjB,GAAIA,EAAO,IAAM,UACjB,OAAQA,EAAO,MAAA,EAIjBhB,EAAY,IAAIW,EAAgBM,CAAS,EAGzC,MAAMC,EAAOjB,EAAY,IAAIU,CAAc,EAC3C,GAAIO,EAAM,CACR,UAAWC,KAAOD,EAChBC,EAAIF,CAAS,EAEfhB,EAAY,OAAOU,CAAc,CACnC,CACF,CAAC,EAEA,MAAOS,GAAU,CAChB,QAAQ,MAAM,4BAA6BA,CAAK,EAChDnB,EAAY,OAAOU,CAAc,CACnC,CAAC,EAEI,KACT,EAEMU,EAAgBC,EAAAA,KACpB,CAAC,CACC,UAAAL,EACA,gBAAAtB,EACA,UAAA4B,CAAA,IAKI,CACJ,MAAMC,EAAaC,EAAAA,QACjB,IAAM1C,EAAgBkC,EAAU,MAAM,EACtC,CAACA,EAAU,MAAM,CAAA,EAGnB,OACE3B,EAAAA,IAAC,MAAA,CACC,UAAWE,EAAAA,GAMT,gEACA+B,CAAA,EAGF,SAAAjC,EAAAA,IAAC,OAAA,CACC,UAAWE,EAAAA,GACT,oBACAG,GAAmB,iDAAA,EAGpB,SAAA6B,EAAW,IAAK9B,GACfJ,EAAAA,IAACG,EAAA,CAEC,UAAAC,EACA,gBAAAC,CAAA,EAFKD,EAAU,GAAA,CAIlB,CAAA,CAAA,CACH,CAAA,CAGN,EACA,CAACgC,EAAWC,IACVD,EAAU,YAAcC,EAAU,WAClCD,EAAU,kBAAoBC,EAAU,iBACxCD,EAAU,YAAcC,EAAU,SACtC,EAEAN,EAAc,YAAc,gBAErB,MAAMO,EAAqB,CAAC,CACjC,UAAAL,EACA,SAAAlB,EACA,MAAAwB,EACA,GAAGC,CACL,IACExC,EAAAA,IAAC,MAAA,CACC,UAAWE,EAAAA,GACT,wFACA+B,CAAA,EAEF,gBAAelB,EACf,MAAO,CACL,qBAAsB,aACtB,kBAAmB,OACnB,GAAGwB,CAAA,EAEJ,GAAGC,CAAA,CACN,EAGWC,EAAkB,CAAC,CAC9B,SAAAC,EACA,UAAAT,EACA,GAAGO,CACL,IACExC,EAAAA,IAAC,MAAA,CACC,UAAWE,EAAAA,GACT,iGACA+B,CAAA,EAED,GAAGO,EAEH,SAAAE,CAAA,CACH,EAGWC,EAAiB,CAAC,CAC7B,SAAAD,EACA,UAAAT,EACA,GAAGO,CACL,IACExC,EAAAA,IAAC,OAAI,UAAWE,EAAAA,GAAG,0BAA2B+B,CAAS,EAAI,GAAGO,EAC3D,SAAAE,CAAA,CACH,EAGWE,EAAoB,CAAC,CAChC,SAAAF,EACA,UAAAT,EACA,GAAGO,CACL,IACExC,EAAAA,IAAC,QAAK,UAAWE,EAAAA,GAAG,YAAa+B,CAAS,EAAI,GAAGO,EAC9C,SAAAE,CAAA,CACH,EAGWG,EAAmB,CAAC,CAC/B,SAAAH,EACA,UAAAT,EACA,GAAGO,CACL,IACExC,EAAAA,IAAC,MAAA,CACC,UAAWE,EAAAA,GAAG,sCAAuC+B,CAAS,EAC7D,GAAGO,EAEH,SAAAE,CAAA,CACH,EAGWI,EAAmB,CAAC,CAC/B,KAAAhC,EACA,SAAAC,EACA,gBAAAV,EAAkB,EACpB,IAIM,CAEJ,MAAM0C,EAAYZ,EAAAA,QAAQ,IAAMjB,EAAgBJ,CAAI,EAAG,CAACA,CAAI,CAAC,EAGvDkC,EAAab,EAAAA,QACjB,IAAMhB,EAAcL,EAAMC,CAAQ,GAAKgC,EACvC,CAACjC,EAAMC,EAAUgC,CAAS,CAAA,EAItB,CAACE,EAAaC,CAAc,EAAIC,EAAAA,SAA+B,IAAI,EACnEC,EAAcC,EAAAA,OAAO,CAAE,KAAAvC,EAAM,SAAAC,EAAU,GAI3CqC,EAAY,QAAQ,OAAStC,GAC7BsC,EAAY,QAAQ,WAAarC,KAEjCqC,EAAY,QAAU,CAAE,KAAAtC,EAAM,SAAAC,CAAA,EAC9BmC,EAAe,IAAI,GAGrBI,EAAAA,UAAU,IAAM,CACd,IAAIC,EAAY,GAEhB,OAAApC,EAAcL,EAAMC,EAAWW,GAAW,CACnC6B,GACHL,EAAexB,CAAM,CAEzB,CAAC,EAEM,IAAM,CACX6B,EAAY,EACd,CACF,EAAG,CAACzC,EAAMC,CAAQ,CAAC,EAEnB,MAAMY,EAAYsB,GAAeD,EAEjC,OACEhD,EAAAA,IAAC,MAAA,CAAI,UAAU,yBAAyB,SAAU,EAChD,SAAAA,EAAAA,IAAC+B,EAAA,CAAc,gBAAA1B,EAAkC,UAAAsB,CAAA,CAAsB,CAAA,CACzE,CAEJ,EAEa6B,EAAY,CAAC,CACxB,KAAA1C,EACA,SAAAC,EACA,gBAAAV,EAAkB,GAClB,UAAA4B,EACA,SAAAS,EACA,GAAGF,CACL,IAAsB,CACpB,MAAMiB,EAAetB,EAAAA,QAAQ,KAAO,CAAE,KAAArB,IAAS,CAACA,CAAI,CAAC,EAErD,OACEd,EAAAA,IAACO,EAAiB,SAAjB,CAA0B,MAAOkD,EAChC,SAAAC,EAAAA,KAACpB,EAAA,CAAmB,UAAAL,EAAsB,SAAAlB,EAAqB,GAAGyB,EAC/D,SAAA,CAAAE,EACD1C,EAAAA,IAAC8C,EAAA,CACC,KAAAhC,EACA,SAAAC,EACA,gBAAAV,CAAA,CAAA,CACF,CAAA,CACF,CAAA,CACF,CAEJ,EAQasD,EAAsB,CAAC,CAClC,OAAAC,EACA,QAAAC,EACA,QAAAC,EAAU,IACV,SAAApB,EACA,UAAAT,EACA,GAAGO,CACL,IAAgC,CAC9B,KAAM,CAACuB,EAAUC,CAAW,EAAIb,EAAAA,SAAS,EAAK,EACxCc,EAAaZ,EAAAA,OAAe,CAAC,EAC7B,CAAE,KAAAvC,CAAA,EAASoD,EAAAA,WAAW3D,CAAgB,EAEtC4D,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,UAAUjD,CAAI,EACxCkD,EAAY,EAAI,EAChBJ,IAAA,EACAK,EAAW,QAAU,OAAO,WAC1B,IAAMD,EAAY,EAAK,EACvBF,CAAA,EAGN,OAAShC,EAAO,CACd+B,IAAU/B,CAAc,CAC1B,CACF,EAAG,CAAChB,EAAM8C,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,OACEvE,EAAAA,IAACwE,EAAAA,OAAA,CACC,aAAW,YACX,UAAWtE,EAAAA,GAAG,WAAY+B,CAAS,EACnC,QAASkC,EACT,KAAK,OACL,QAAQ,QACP,GAAG3B,EAEH,SAAAE,GAAY1C,EAAAA,IAACqE,EAAA,CAAK,KAAM,EAAA,CAAI,CAAA,CAAA,CAGnC,EAIaI,EACXjC,GACGxC,EAAAA,IAAC0E,EAAAA,OAAA,CAAQ,GAAGlC,CAAA,CAAO,EAMXmC,EAAmC,CAAC,CAC/C,UAAA1C,EACA,GAAGO,CACL,IACExC,EAAAA,IAAC4E,EAAAA,cAAA,CACC,aAAW,kBACX,UAAW1E,EAAAA,GACT,0DACA+B,CAAA,EAEF,KAAK,KACJ,GAAGO,CAAA,CACN,EAOWqC,EACXrC,GACGxC,EAAAA,IAAC8E,EAAAA,YAAA,CAAa,GAAGtC,CAAA,CAAO,EAMhBuC,EAAmC,CAAC,CAC/C,MAAAC,EAAQ,MACR,GAAGxC,CACL,IACExC,EAAAA,IAACiF,EAAAA,cAAA,CAAc,MAAAD,EAAe,GAAGxC,CAAA,CAAO,EAO7B0C,EACX1C,GACGxC,EAAAA,IAACmF,EAAAA,WAAA,CAAY,GAAG3C,CAAA,CAAO"}
|
|
@@ -1,34 +1,34 @@
|
|
|
1
|
-
import { jsx as s, jsxs as
|
|
2
|
-
import { CheckIcon as
|
|
3
|
-
import { createContext as I, memo as
|
|
4
|
-
import {
|
|
5
|
-
import {
|
|
6
|
-
import {
|
|
7
|
-
import { cn as
|
|
8
|
-
const
|
|
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
|
-
),
|
|
11
|
+
), O = (e) => e.map((t, o) => ({
|
|
12
12
|
key: `line-${o}`,
|
|
13
|
-
tokens: t.map((n,
|
|
14
|
-
key: `line-${o}-${
|
|
13
|
+
tokens: t.map((n, r) => ({
|
|
14
|
+
key: `line-${o}-${r}`,
|
|
15
15
|
token: n
|
|
16
16
|
}))
|
|
17
|
-
})),
|
|
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:
|
|
25
|
-
fontWeight:
|
|
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
|
-
),
|
|
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
|
-
),
|
|
42
|
+
), G = ({
|
|
43
43
|
keyedLine: e,
|
|
44
44
|
showLineNumbers: t
|
|
45
|
-
}) => /* @__PURE__ */ s("span", { className: t ?
|
|
46
|
-
` : e.tokens.map(({ token: o, key: n }) => /* @__PURE__ */ s(
|
|
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
|
-
}),
|
|
49
|
-
|
|
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
|
-
},
|
|
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
|
-
}),
|
|
73
|
-
const n =
|
|
74
|
-
return
|
|
75
|
-
const
|
|
76
|
-
|
|
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
|
-
}),
|
|
82
|
-
bg:
|
|
83
|
-
fg:
|
|
84
|
-
tokens:
|
|
99
|
+
}), k = {
|
|
100
|
+
bg: c.bg ?? "transparent",
|
|
101
|
+
fg: c.fg ?? "inherit",
|
|
102
|
+
tokens: c.tokens
|
|
85
103
|
};
|
|
86
|
-
|
|
87
|
-
const
|
|
88
|
-
if (
|
|
89
|
-
for (const
|
|
90
|
-
|
|
91
|
-
|
|
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((
|
|
94
|
-
console.error("Failed to highlight code:",
|
|
111
|
+
}).catch((l) => {
|
|
112
|
+
console.error("Failed to highlight code:", l), h.delete(n);
|
|
95
113
|
}), null);
|
|
96
|
-
},
|
|
114
|
+
}, w = L(
|
|
97
115
|
({
|
|
98
116
|
tokenized: e,
|
|
99
117
|
showLineNumbers: t,
|
|
100
118
|
className: o
|
|
101
119
|
}) => {
|
|
102
|
-
const n =
|
|
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:
|
|
116
|
-
|
|
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:
|
|
139
|
+
className: a(
|
|
124
140
|
"font-mono text-sm",
|
|
125
141
|
t && "[counter-increment:line_0] [counter-reset:line]"
|
|
126
142
|
),
|
|
127
|
-
children:
|
|
128
|
-
|
|
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
|
-
|
|
143
|
-
const
|
|
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:
|
|
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
|
-
),
|
|
179
|
+
), se = ({
|
|
164
180
|
children: e,
|
|
165
181
|
className: t,
|
|
166
182
|
...o
|
|
167
183
|
}) => /* @__PURE__ */ s(
|
|
168
184
|
"div",
|
|
169
185
|
{
|
|
170
|
-
className:
|
|
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
|
-
),
|
|
193
|
+
), re = ({
|
|
178
194
|
children: e,
|
|
179
195
|
className: t,
|
|
180
196
|
...o
|
|
181
|
-
}) => /* @__PURE__ */ s("div", { className:
|
|
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:
|
|
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:
|
|
208
|
+
className: a("-my-1 -mr-1 flex items-center gap-2", t),
|
|
193
209
|
...o,
|
|
194
210
|
children: e
|
|
195
211
|
}
|
|
196
|
-
),
|
|
212
|
+
), Q = ({
|
|
197
213
|
code: e,
|
|
198
214
|
language: t,
|
|
199
215
|
showLineNumbers: o = !1
|
|
200
216
|
}) => {
|
|
201
|
-
const n =
|
|
202
|
-
() =>
|
|
217
|
+
const n = f(() => q(e), [e]), r = f(
|
|
218
|
+
() => b(e, t) ?? n,
|
|
203
219
|
[e, t, n]
|
|
204
|
-
), [
|
|
205
|
-
return (
|
|
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
|
|
208
|
-
d ||
|
|
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(
|
|
213
|
-
},
|
|
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:
|
|
219
|
-
...
|
|
234
|
+
children: r,
|
|
235
|
+
...l
|
|
220
236
|
}) => {
|
|
221
|
-
const
|
|
222
|
-
return /* @__PURE__ */ s(
|
|
223
|
-
|
|
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
|
-
|
|
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
|
-
},
|
|
249
|
+
}, le = ({
|
|
234
250
|
onCopy: e,
|
|
235
251
|
onError: t,
|
|
236
252
|
timeout: o = 2e3,
|
|
237
253
|
children: n,
|
|
238
|
-
className:
|
|
239
|
-
...
|
|
254
|
+
className: r,
|
|
255
|
+
...l
|
|
240
256
|
}) => {
|
|
241
|
-
const [
|
|
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
|
-
|
|
248
|
-
() =>
|
|
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,
|
|
255
|
-
|
|
270
|
+
}, [d, e, t, o, i]);
|
|
271
|
+
p(
|
|
256
272
|
() => () => {
|
|
257
|
-
window.clearTimeout(
|
|
273
|
+
window.clearTimeout(k.current);
|
|
258
274
|
},
|
|
259
275
|
[]
|
|
260
276
|
);
|
|
261
|
-
const
|
|
277
|
+
const x = i ? T : N;
|
|
262
278
|
return /* @__PURE__ */ s(
|
|
263
|
-
|
|
279
|
+
R,
|
|
264
280
|
{
|
|
265
|
-
|
|
266
|
-
|
|
281
|
+
"aria-label": "Copy code",
|
|
282
|
+
className: a("shrink-0", r),
|
|
283
|
+
onClick: m,
|
|
267
284
|
size: "icon",
|
|
268
285
|
variant: "ghost",
|
|
269
|
-
...
|
|
270
|
-
children: n ?? /* @__PURE__ */ s(
|
|
286
|
+
...l,
|
|
287
|
+
children: n ?? /* @__PURE__ */ s(x, { size: 14 })
|
|
271
288
|
}
|
|
272
289
|
);
|
|
273
|
-
},
|
|
290
|
+
}, de = (e) => /* @__PURE__ */ s(_, { ...e }), ke = ({
|
|
274
291
|
className: e,
|
|
275
292
|
...t
|
|
276
293
|
}) => /* @__PURE__ */ s(
|
|
277
|
-
|
|
294
|
+
K,
|
|
278
295
|
{
|
|
279
|
-
|
|
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
|
-
),
|
|
304
|
+
), he = (e) => /* @__PURE__ */ s(H, { ...e }), me = ({
|
|
287
305
|
align: e = "end",
|
|
288
306
|
...t
|
|
289
|
-
}) => /* @__PURE__ */ s(
|
|
307
|
+
}) => /* @__PURE__ */ s($, { align: e, ...t }), fe = (e) => /* @__PURE__ */ s(A, { ...e });
|
|
290
308
|
export {
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
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
|
-
|
|
298
|
-
|
|
299
|
-
|
|
315
|
+
se as CodeBlockHeader,
|
|
316
|
+
de as CodeBlockLanguageSelector,
|
|
317
|
+
me as CodeBlockLanguageSelectorContent,
|
|
300
318
|
fe as CodeBlockLanguageSelectorItem,
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
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
|