@burdenoff/microfe-bigconsole 2026.805.2 → 2026.812.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 (253) hide show
  1. package/dist/bigconsole/components/DrilldownDashboardRenderer.js +118 -106
  2. package/dist/bigconsole/components/DrilldownDashboardRenderer.js.map +1 -1
  3. package/dist/bigconsole/components/DrilldownModal.js +54 -50
  4. package/dist/bigconsole/components/DrilldownModal.js.map +1 -1
  5. package/dist/bigconsole/components/builder/BuilderCanvas.js +2 -2
  6. package/dist/bigconsole/components/builder/BuilderCanvas.js.map +1 -1
  7. package/dist/bigconsole/components/builder/BuilderTopbar.js +3 -3
  8. package/dist/bigconsole/components/builder/BuilderTopbar.js.map +1 -1
  9. package/dist/bigconsole/components/builder/inspector/AdvancedSection.js +24 -25
  10. package/dist/bigconsole/components/builder/inspector/AdvancedSection.js.map +1 -1
  11. package/dist/bigconsole/components/builder/inspector/AppearanceSection.js +40 -29
  12. package/dist/bigconsole/components/builder/inspector/AppearanceSection.js.map +1 -1
  13. package/dist/bigconsole/components/builder/inspector/DataBindingSection.js +145 -111
  14. package/dist/bigconsole/components/builder/inspector/DataBindingSection.js.map +1 -1
  15. package/dist/bigconsole/components/builder/inspector/GeneralSection.js +58 -44
  16. package/dist/bigconsole/components/builder/inspector/GeneralSection.js.map +1 -1
  17. package/dist/bigconsole/components/common/Section.js +70 -0
  18. package/dist/bigconsole/components/common/Section.js.map +1 -0
  19. package/dist/bigconsole/components/common/index.js +2 -0
  20. package/dist/bigconsole/components/common/sectionStyles.js +42 -0
  21. package/dist/bigconsole/components/common/sectionStyles.js.map +1 -0
  22. package/dist/bigconsole/components/dashboard/CreateDashboardDialog.js +269 -251
  23. package/dist/bigconsole/components/dashboard/CreateDashboardDialog.js.map +1 -1
  24. package/dist/bigconsole/components/dashboard/DashboardCanvas.js +214 -223
  25. package/dist/bigconsole/components/dashboard/DashboardCanvas.js.map +1 -1
  26. package/dist/bigconsole/components/dashboard/DashboardGrid.js +12 -18
  27. package/dist/bigconsole/components/dashboard/DashboardGrid.js.map +1 -1
  28. package/dist/bigconsole/components/dashboard/DashboardToolbar.js +110 -102
  29. package/dist/bigconsole/components/dashboard/DashboardToolbar.js.map +1 -1
  30. package/dist/bigconsole/components/dashboard/DrilldownBreadcrumb.js +81 -68
  31. package/dist/bigconsole/components/dashboard/DrilldownBreadcrumb.js.map +1 -1
  32. package/dist/bigconsole/components/dashboard/ExportDashboardDialog.js +125 -159
  33. package/dist/bigconsole/components/dashboard/ExportDashboardDialog.js.map +1 -1
  34. package/dist/bigconsole/components/dashboard/GlobalFiltersBar/FilterChip.js +147 -144
  35. package/dist/bigconsole/components/dashboard/GlobalFiltersBar/FilterChip.js.map +1 -1
  36. package/dist/bigconsole/components/dashboard/GlobalFiltersBar/FilterEditor.js +154 -153
  37. package/dist/bigconsole/components/dashboard/GlobalFiltersBar/FilterEditor.js.map +1 -1
  38. package/dist/bigconsole/components/dashboard/GlobalFiltersBar/FilterPresetSelector.js +82 -79
  39. package/dist/bigconsole/components/dashboard/GlobalFiltersBar/FilterPresetSelector.js.map +1 -1
  40. package/dist/bigconsole/components/dashboard/GlobalFiltersBar/GlobalFiltersBar.js +171 -284
  41. package/dist/bigconsole/components/dashboard/GlobalFiltersBar/GlobalFiltersBar.js.map +1 -1
  42. package/dist/bigconsole/components/dashboard/ImportDashboardDialog.js +250 -273
  43. package/dist/bigconsole/components/dashboard/ImportDashboardDialog.js.map +1 -1
  44. package/dist/bigconsole/components/dashboard/LiveBoardBanner.js +45 -53
  45. package/dist/bigconsole/components/dashboard/LiveBoardBanner.js.map +1 -1
  46. package/dist/bigconsole/components/dashboard/PageTabsManager/PageTabsManager.js +157 -148
  47. package/dist/bigconsole/components/dashboard/PageTabsManager/PageTabsManager.js.map +1 -1
  48. package/dist/bigconsole/components/dashboard/PublishToStoreDialog.js +75 -83
  49. package/dist/bigconsole/components/dashboard/PublishToStoreDialog.js.map +1 -1
  50. package/dist/bigconsole/components/dashboard/SavedViewsDropdown/SavedViewsDropdown.js +167 -161
  51. package/dist/bigconsole/components/dashboard/SavedViewsDropdown/SavedViewsDropdown.js.map +1 -1
  52. package/dist/bigconsole/components/dashboard/ShareDialog/EmbedTab.js +181 -190
  53. package/dist/bigconsole/components/dashboard/ShareDialog/EmbedTab.js.map +1 -1
  54. package/dist/bigconsole/components/dashboard/ShareDialog/ShareDialog.js +101 -95
  55. package/dist/bigconsole/components/dashboard/ShareDialog/ShareDialog.js.map +1 -1
  56. package/dist/bigconsole/components/dashboard/StoreTemplatePicker.js +20 -18
  57. package/dist/bigconsole/components/dashboard/StoreTemplatePicker.js.map +1 -1
  58. package/dist/bigconsole/components/dashboard/TemplatePicker/TemplatePicker.js +1 -0
  59. package/dist/bigconsole/components/dashboard/TemplateSetupBanner.js +26 -58
  60. package/dist/bigconsole/components/dashboard/TemplateSetupBanner.js.map +1 -1
  61. package/dist/bigconsole/components/dashboard/WidgetPalette.js +307 -229
  62. package/dist/bigconsole/components/dashboard/WidgetPalette.js.map +1 -1
  63. package/dist/bigconsole/components/datasink/CacheTTLSelector.js +128 -129
  64. package/dist/bigconsole/components/datasink/CacheTTLSelector.js.map +1 -1
  65. package/dist/bigconsole/components/datasink/DataSinkCard.js +78 -79
  66. package/dist/bigconsole/components/datasink/DataSinkCard.js.map +1 -1
  67. package/dist/bigconsole/components/datasink/DataSinkDataViewer.js +33 -34
  68. package/dist/bigconsole/components/datasink/DataSinkDataViewer.js.map +1 -1
  69. package/dist/bigconsole/components/datasink/DataSinkDeleteDialog.js +79 -61
  70. package/dist/bigconsole/components/datasink/DataSinkDeleteDialog.js.map +1 -1
  71. package/dist/bigconsole/components/datasink/DataSinkRefreshDialog.js +75 -64
  72. package/dist/bigconsole/components/datasink/DataSinkRefreshDialog.js.map +1 -1
  73. package/dist/bigconsole/components/datasink/DataSinkStatusBadge.js +1 -1
  74. package/dist/bigconsole/components/datasink/DataSinkStatusBadge.js.map +1 -1
  75. package/dist/bigconsole/components/datasink/DataSinkTableViewer.js +20 -19
  76. package/dist/bigconsole/components/datasink/DataSinkTableViewer.js.map +1 -1
  77. package/dist/bigconsole/components/datasink/ExportDataSinkDialog.js +127 -171
  78. package/dist/bigconsole/components/datasink/ExportDataSinkDialog.js.map +1 -1
  79. package/dist/bigconsole/components/datasink/ImportDataGuideDialog.js +113 -117
  80. package/dist/bigconsole/components/datasink/ImportDataGuideDialog.js.map +1 -1
  81. package/dist/bigconsole/components/datasink/ImportDataSinkDialog.js +312 -307
  82. package/dist/bigconsole/components/datasink/ImportDataSinkDialog.js.map +1 -1
  83. package/dist/bigconsole/components/datasink/LinkedParsersPanel.js +65 -66
  84. package/dist/bigconsole/components/datasink/LinkedParsersPanel.js.map +1 -1
  85. package/dist/bigconsole/components/datasink/LinkedWorkflowsPanel.js +121 -127
  86. package/dist/bigconsole/components/datasink/LinkedWorkflowsPanel.js.map +1 -1
  87. package/dist/bigconsole/components/datasink/RefreshTypeSelector.js +194 -189
  88. package/dist/bigconsole/components/datasink/RefreshTypeSelector.js.map +1 -1
  89. package/dist/bigconsole/components/datasink/SetupStateBadge.js +3 -3
  90. package/dist/bigconsole/components/datasink/SetupStateBadge.js.map +1 -1
  91. package/dist/bigconsole/components/datasink/WorkflowStatusPanel.js +95 -95
  92. package/dist/bigconsole/components/datasink/WorkflowStatusPanel.js.map +1 -1
  93. package/dist/bigconsole/components/parser/DataSinkSelector.js +163 -131
  94. package/dist/bigconsole/components/parser/DataSinkSelector.js.map +1 -1
  95. package/dist/bigconsole/components/parser/ExpressionEditor.js +3 -3
  96. package/dist/bigconsole/components/parser/ExpressionEditor.js.map +1 -1
  97. package/dist/bigconsole/components/parser/ImportParserDialog.js +205 -260
  98. package/dist/bigconsole/components/parser/ImportParserDialog.js.map +1 -1
  99. package/dist/bigconsole/components/parser/ParserCard.js +133 -114
  100. package/dist/bigconsole/components/parser/ParserCard.js.map +1 -1
  101. package/dist/bigconsole/components/parser/ParserSelector.js +193 -174
  102. package/dist/bigconsole/components/parser/ParserSelector.js.map +1 -1
  103. package/dist/bigconsole/components/parser/ParserStatusBadge.js +2 -2
  104. package/dist/bigconsole/components/parser/ParserStatusBadge.js.map +1 -1
  105. package/dist/bigconsole/components/parser/ParserTypeBadge.js +4 -4
  106. package/dist/bigconsole/components/parser/ParserTypeBadge.js.map +1 -1
  107. package/dist/bigconsole/components/pipeline/PipelineCard.js +134 -89
  108. package/dist/bigconsole/components/pipeline/PipelineCard.js.map +1 -1
  109. package/dist/bigconsole/components/pipeline/PipelineDeleteDialog.js +77 -64
  110. package/dist/bigconsole/components/pipeline/PipelineDeleteDialog.js.map +1 -1
  111. package/dist/bigconsole/components/pipeline/PipelineStatusBadge.js +7 -10
  112. package/dist/bigconsole/components/pipeline/PipelineStatusBadge.js.map +1 -1
  113. package/dist/bigconsole/components/preview/AiPreviewContent.js +31 -32
  114. package/dist/bigconsole/components/preview/AiPreviewContent.js.map +1 -1
  115. package/dist/bigconsole/components/preview/AiPreviewMiniPanel.js +152 -103
  116. package/dist/bigconsole/components/preview/AiPreviewMiniPanel.js.map +1 -1
  117. package/dist/bigconsole/components/preview/AiPreviewPanel.js +193 -148
  118. package/dist/bigconsole/components/preview/AiPreviewPanel.js.map +1 -1
  119. package/dist/bigconsole/components/preview/previewShared.js +41 -23
  120. package/dist/bigconsole/components/preview/previewShared.js.map +1 -1
  121. package/dist/bigconsole/components/widgets/ActionConfigDialog.js +405 -364
  122. package/dist/bigconsole/components/widgets/ActionConfigDialog.js.map +1 -1
  123. package/dist/bigconsole/components/widgets/DrilldownConfigPanel.js +265 -237
  124. package/dist/bigconsole/components/widgets/DrilldownConfigPanel.js.map +1 -1
  125. package/dist/bigconsole/components/widgets/PropertiesPanel.js +764 -821
  126. package/dist/bigconsole/components/widgets/PropertiesPanel.js.map +1 -1
  127. package/dist/bigconsole/components/widgets/WidgetErrorBoundary.js +7 -5
  128. package/dist/bigconsole/components/widgets/WidgetErrorBoundary.js.map +1 -1
  129. package/dist/bigconsole/components/widgets/WidgetHeader.js +7 -8
  130. package/dist/bigconsole/components/widgets/WidgetHeader.js.map +1 -1
  131. package/dist/bigconsole/components/widgets/WidgetWrapper.js +8 -7
  132. package/dist/bigconsole/components/widgets/WidgetWrapper.js.map +1 -1
  133. package/dist/bigconsole/components/widgets/adaptive-card/AdaptiveCardWidget.js +1 -1
  134. package/dist/bigconsole/components/widgets/adaptive-card/AdaptiveCardWidget.js.map +1 -1
  135. package/dist/bigconsole/components/widgets/calendar/CalendarWidget.js +46 -49
  136. package/dist/bigconsole/components/widgets/calendar/CalendarWidget.js.map +1 -1
  137. package/dist/bigconsole/components/widgets/chart/ChartConfig.js +154 -147
  138. package/dist/bigconsole/components/widgets/chart/ChartConfig.js.map +1 -1
  139. package/dist/bigconsole/components/widgets/comments/WidgetComments.js +118 -101
  140. package/dist/bigconsole/components/widgets/comments/WidgetComments.js.map +1 -1
  141. package/dist/bigconsole/components/widgets/event-logs/EventLogViewer.js +244 -191
  142. package/dist/bigconsole/components/widgets/event-logs/EventLogViewer.js.map +1 -1
  143. package/dist/bigconsole/components/widgets/form/FormWidget.js +167 -159
  144. package/dist/bigconsole/components/widgets/form/FormWidget.js.map +1 -1
  145. package/dist/bigconsole/components/widgets/gauge/GaugeConfig.js +92 -76
  146. package/dist/bigconsole/components/widgets/gauge/GaugeConfig.js.map +1 -1
  147. package/dist/bigconsole/components/widgets/gauge/GaugeWidget.js +1 -1
  148. package/dist/bigconsole/components/widgets/gauge/GaugeWidget.js.map +1 -1
  149. package/dist/bigconsole/components/widgets/heatmap/HeatmapConfig.js +89 -86
  150. package/dist/bigconsole/components/widgets/heatmap/HeatmapConfig.js.map +1 -1
  151. package/dist/bigconsole/components/widgets/iframe-widget/IframeWidget.js +2 -2
  152. package/dist/bigconsole/components/widgets/iframe-widget/IframeWidget.js.map +1 -1
  153. package/dist/bigconsole/components/widgets/kanban/KanbanWidget.js +64 -63
  154. package/dist/bigconsole/components/widgets/kanban/KanbanWidget.js.map +1 -1
  155. package/dist/bigconsole/components/widgets/kpi-comparison/KPIComparisonWidget.js +2 -2
  156. package/dist/bigconsole/components/widgets/kpi-comparison/KPIComparisonWidget.js.map +1 -1
  157. package/dist/bigconsole/components/widgets/list/ListConfig.js +65 -58
  158. package/dist/bigconsole/components/widgets/list/ListConfig.js.map +1 -1
  159. package/dist/bigconsole/components/widgets/list/ListItem.js +1 -1
  160. package/dist/bigconsole/components/widgets/list/ListItem.js.map +1 -1
  161. package/dist/bigconsole/components/widgets/map-widget/MapWidget.js +1 -1
  162. package/dist/bigconsole/components/widgets/map-widget/MapWidget.js.map +1 -1
  163. package/dist/bigconsole/components/widgets/metric-card/MetricCardConfig.js +79 -72
  164. package/dist/bigconsole/components/widgets/metric-card/MetricCardConfig.js.map +1 -1
  165. package/dist/bigconsole/components/widgets/metric-card/SparklineChart.js +35 -34
  166. package/dist/bigconsole/components/widgets/metric-card/SparklineChart.js.map +1 -1
  167. package/dist/bigconsole/components/widgets/metric-card/TrendIndicator.js +20 -19
  168. package/dist/bigconsole/components/widgets/metric-card/TrendIndicator.js.map +1 -1
  169. package/dist/bigconsole/components/widgets/pivot-table/PivotTableWidget.js +181 -180
  170. package/dist/bigconsole/components/widgets/pivot-table/PivotTableWidget.js.map +1 -1
  171. package/dist/bigconsole/components/widgets/progress/ProgressConfig.js +100 -90
  172. package/dist/bigconsole/components/widgets/progress/ProgressConfig.js.map +1 -1
  173. package/dist/bigconsole/components/widgets/retention/RetentionWidget.js +3 -3
  174. package/dist/bigconsole/components/widgets/retention/RetentionWidget.js.map +1 -1
  175. package/dist/bigconsole/components/widgets/states/EmptyState.js +6 -4
  176. package/dist/bigconsole/components/widgets/states/EmptyState.js.map +1 -1
  177. package/dist/bigconsole/components/widgets/states/ErrorState.js +7 -5
  178. package/dist/bigconsole/components/widgets/states/ErrorState.js.map +1 -1
  179. package/dist/bigconsole/components/widgets/states/LoadingState.js +5 -4
  180. package/dist/bigconsole/components/widgets/states/LoadingState.js.map +1 -1
  181. package/dist/bigconsole/components/widgets/table/TableConfig.js +193 -172
  182. package/dist/bigconsole/components/widgets/table/TableConfig.js.map +1 -1
  183. package/dist/bigconsole/components/widgets/table/TableHeader.js +1 -1
  184. package/dist/bigconsole/components/widgets/table/TableHeader.js.map +1 -1
  185. package/dist/bigconsole/components/widgets/table/TableWidget.js +1 -1
  186. package/dist/bigconsole/components/widgets/table/TableWidget.js.map +1 -1
  187. package/dist/bigconsole/components/widgets/text-widget/TextWidget.js +1 -1
  188. package/dist/bigconsole/components/widgets/text-widget/TextWidget.js.map +1 -1
  189. package/dist/bigconsole/components/widgets/timeline/TimelineWidget.js +3 -3
  190. package/dist/bigconsole/components/widgets/timeline/TimelineWidget.js.map +1 -1
  191. package/dist/bigconsole/components/widgets/utils/conditionalFormat.js +2 -2
  192. package/dist/bigconsole/components/widgets/utils/conditionalFormat.js.map +1 -1
  193. package/dist/bigconsole/components/widgets/webhook-config/WebhookConfigPanel.js +283 -249
  194. package/dist/bigconsole/components/widgets/webhook-config/WebhookConfigPanel.js.map +1 -1
  195. package/dist/bigconsole/components/widgets/widget-actions/WidgetActions.js +28 -20
  196. package/dist/bigconsole/components/widgets/widget-actions/WidgetActions.js.map +1 -1
  197. package/dist/bigconsole/components/workflow/WorkflowCard.js +92 -77
  198. package/dist/bigconsole/components/workflow/WorkflowCard.js.map +1 -1
  199. package/dist/bigconsole/components/workflow/WorkflowDeleteDialog.js +70 -51
  200. package/dist/bigconsole/components/workflow/WorkflowDeleteDialog.js.map +1 -1
  201. package/dist/bigconsole/components/workflow/WorkflowStatusBadge.js +16 -17
  202. package/dist/bigconsole/components/workflow/WorkflowStatusBadge.js.map +1 -1
  203. package/dist/bigconsole/customWidget/CustomWidgetBuilderSheet.js +46 -42
  204. package/dist/bigconsole/customWidget/CustomWidgetBuilderSheet.js.map +1 -1
  205. package/dist/bigconsole/customWidget/CustomWidgetProposalPanel.js +372 -348
  206. package/dist/bigconsole/customWidget/CustomWidgetProposalPanel.js.map +1 -1
  207. package/dist/bigconsole/hooks/useModalFocusTrap.js +53 -0
  208. package/dist/bigconsole/hooks/useModalFocusTrap.js.map +1 -0
  209. package/dist/bigconsole/pages/DashboardBuilderPage.js +153 -142
  210. package/dist/bigconsole/pages/DashboardBuilderPage.js.map +1 -1
  211. package/dist/bigconsole/pages/DashboardViewPage.js +230 -220
  212. package/dist/bigconsole/pages/DashboardViewPage.js.map +1 -1
  213. package/dist/bigconsole/pages/DashboardsPage.js +832 -790
  214. package/dist/bigconsole/pages/DashboardsPage.js.map +1 -1
  215. package/dist/bigconsole/pages/DataParsersPage.js +249 -304
  216. package/dist/bigconsole/pages/DataParsersPage.js.map +1 -1
  217. package/dist/bigconsole/pages/DataSinkBuilderPage.js +324 -349
  218. package/dist/bigconsole/pages/DataSinkBuilderPage.js.map +1 -1
  219. package/dist/bigconsole/pages/DataSinkViewPage.js +336 -323
  220. package/dist/bigconsole/pages/DataSinkViewPage.js.map +1 -1
  221. package/dist/bigconsole/pages/DataSinksPage.js +356 -458
  222. package/dist/bigconsole/pages/DataSinksPage.js.map +1 -1
  223. package/dist/bigconsole/pages/DataSourcesPage.js +14 -8
  224. package/dist/bigconsole/pages/DataSourcesPage.js.map +1 -1
  225. package/dist/bigconsole/pages/HomePage.js +186 -193
  226. package/dist/bigconsole/pages/HomePage.js.map +1 -1
  227. package/dist/bigconsole/pages/InsightsPage.js +901 -724
  228. package/dist/bigconsole/pages/InsightsPage.js.map +1 -1
  229. package/dist/bigconsole/pages/ParserBuilderPage.js +769 -675
  230. package/dist/bigconsole/pages/ParserBuilderPage.js.map +1 -1
  231. package/dist/bigconsole/pages/ParserViewPage.js +382 -354
  232. package/dist/bigconsole/pages/ParserViewPage.js.map +1 -1
  233. package/dist/bigconsole/pages/PipelineBuilderPage.js +540 -420
  234. package/dist/bigconsole/pages/PipelineBuilderPage.js.map +1 -1
  235. package/dist/bigconsole/pages/PipelineViewPage.js +416 -384
  236. package/dist/bigconsole/pages/PipelineViewPage.js.map +1 -1
  237. package/dist/bigconsole/pages/PipelinesPage.js +260 -309
  238. package/dist/bigconsole/pages/PipelinesPage.js.map +1 -1
  239. package/dist/bigconsole/pages/SettingsPage.js +177 -172
  240. package/dist/bigconsole/pages/SettingsPage.js.map +1 -1
  241. package/dist/bigconsole/pages/WidgetDemoPage.js +278 -142
  242. package/dist/bigconsole/pages/WidgetDemoPage.js.map +1 -1
  243. package/dist/bigconsole/pages/WorkflowViewPage.js +382 -366
  244. package/dist/bigconsole/pages/WorkflowViewPage.js.map +1 -1
  245. package/dist/bigconsole/pages/WorkflowsPage.js +202 -316
  246. package/dist/bigconsole/pages/WorkflowsPage.js.map +1 -1
  247. package/dist/bigconsole/renderers/adapters/AdaptiveCardRenderer.js +111 -109
  248. package/dist/bigconsole/renderers/adapters/AdaptiveCardRenderer.js.map +1 -1
  249. package/dist/bigconsole/renderers/adapters/BlockKitRenderer.js +127 -126
  250. package/dist/bigconsole/renderers/adapters/BlockKitRenderer.js.map +1 -1
  251. package/dist/bigconsole/renderers/adapters/CustomRenderer.js +103 -103
  252. package/dist/bigconsole/renderers/adapters/CustomRenderer.js.map +1 -1
  253. package/package.json +2 -1
@@ -1 +1 @@
1
- {"version":3,"file":"DataSinkTableViewer.js","names":[],"sources":["../../../../src/bigconsole/components/datasink/DataSinkTableViewer.tsx"],"sourcesContent":["/**\n * DataSink Table Viewer\n *\n * Component for viewing DataSink data in tabular format with support for\n * nested data, column selection, and multiple view modes.\n */\n\nimport { memo, useState, useMemo, useCallback } from 'react';\n\nimport { Table, TableBody, TableCell, TableHead, TableHeader, TableRow } from '@burdenoff/fe-libs/ui/table';\n\nimport { Button } from '@burdenoff/fe-libs/ui';\nimport { ChevronLeft, ChevronRight, ChevronsLeft, ChevronsRight, Settings2, X } from 'lucide-react';\n\ninterface DataSinkTableViewerProps {\n data: unknown;\n maxHeight?: string;\n}\n\ninterface Column {\n key: string;\n label: string;\n path: string;\n}\n\nfunction isObject(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n\nfunction isArrayOfObjects(value: unknown): boolean {\n return Array.isArray(value) && value.length > 0 && isObject(value[0]);\n}\n\nfunction flattenObject(obj: Record<string, unknown>, prefix = ''): Record<string, unknown> {\n const result: Record<string, unknown> = {};\n\n for (const [key, value] of Object.entries(obj)) {\n const newKey = prefix ? `${prefix}.${key}` : key;\n\n if (isObject(value) && !Array.isArray(value)) {\n Object.assign(result, flattenObject(value, newKey));\n } else {\n result[newKey] = value;\n }\n }\n\n return result;\n}\n\nfunction getNestedValue(obj: Record<string, unknown>, path: string): unknown {\n return path.split('.').reduce((acc: unknown, key) => {\n if (acc && typeof acc === 'object' && key in acc) {\n return (acc as Record<string, unknown>)[key];\n }\n return undefined;\n }, obj);\n}\n\nfunction formatCellValue(value: unknown): string {\n if (value === null || value === undefined) {\n return '-';\n }\n if (typeof value === 'object') {\n return JSON.stringify(value);\n }\n return String(value);\n}\n\nexport const DataSinkTableViewer = memo(function DataSinkTableViewer({\n data,\n maxHeight = '400px',\n}: DataSinkTableViewerProps) {\n const [page, setPage] = useState(0);\n const PAGE_SIZE = 50;\n const [selectedColumns, setSelectedColumns] = useState<string[] | null>(null);\n const [showColumnPicker, setShowColumnPicker] = useState(false);\n\n const rows = useMemo(() => {\n if (!data) return [];\n if (Array.isArray(data) && isArrayOfObjects(data)) {\n return data as Record<string, unknown>[];\n }\n if (isObject(data)) {\n return [data];\n }\n return [];\n }, [data]);\n\n const allColumns = useMemo(() => {\n if (rows.length === 0) return [];\n\n const columnMap = new Map<string, Column>();\n\n for (const row of rows) {\n const flat = flattenObject(row);\n for (const key of Object.keys(flat)) {\n if (!columnMap.has(key)) {\n const parts = key.split('.');\n const label = parts[parts.length - 1];\n columnMap.set(key, { key, label, path: key });\n }\n }\n }\n\n return Array.from(columnMap.values());\n }, [rows]);\n\n const displayColumns = useMemo(() => {\n if (selectedColumns) {\n return allColumns.filter((col) => selectedColumns.includes(col.key));\n }\n return allColumns.slice(0, 10);\n }, [allColumns, selectedColumns]);\n\n const paginatedRows = useMemo(() => {\n const start = page * PAGE_SIZE;\n return rows.slice(start, start + PAGE_SIZE);\n }, [rows, page]);\n\n const totalPages = Math.ceil(rows.length / PAGE_SIZE);\n\n const handleColumnToggle = useCallback((columnKey: string) => {\n setSelectedColumns((prev) => {\n if (!prev) {\n return [columnKey];\n }\n if (prev.includes(columnKey)) {\n const next = prev.filter((k) => k !== columnKey);\n return next.length > 0 ? next : null;\n }\n return [...prev, columnKey];\n });\n }, []);\n\n const handleResetColumns = useCallback(() => {\n setSelectedColumns(null);\n setShowColumnPicker(false);\n }, []);\n\n if (rows.length === 0) {\n return (\n <div className=\"flex items-center justify-center p-8 text-text-secondary text-body-sm\">\n No tabular data available. Data must be an array of objects for table view.\n </div>\n );\n }\n\n return (\n <div className=\"relative\">\n <div className=\"flex items-center justify-between p-3 bg-bg-sunken border-b border-border-default\">\n <span className=\"text-xs text-text-secondary\">\n {rows.length} rows &middot; {displayColumns.length} columns\n </span>\n <div className=\"flex items-center gap-2\">\n <Button variant=\"ghost\" size=\"sm\" onClick={() => setShowColumnPicker((v) => !v)}>\n <Settings2 className=\"w-4 h-4\" />\n </Button>\n </div>\n </div>\n\n {showColumnPicker && (\n <div className=\"absolute right-0 top-10 z-10 bg-bg-surface border border-border-default rounded-md shadow-lg p-3 min-w-[200px] max-h-[300px] overflow-auto\">\n <div className=\"flex items-center justify-between mb-2\">\n <span className=\"text-xs font-medium text-text-primary\">Select Columns</span>\n <Button variant=\"ghost\" size=\"sm\" onClick={handleResetColumns}>\n <X className=\"w-3 h-3\" />\n </Button>\n </div>\n <div className=\"space-y-1\">\n {allColumns.map((col) => {\n const isSelected = !selectedColumns || selectedColumns.includes(col.key);\n return (\n <label\n key={col.key}\n className=\"flex items-center gap-2 text-xs text-text-secondary hover:text-text-primary cursor-pointer\"\n >\n <input\n type=\"checkbox\"\n checked={isSelected}\n onChange={() => handleColumnToggle(col.key)}\n className=\"rounded border-border-default\"\n />\n <span className=\"truncate\" title={col.key}>\n {col.label}\n </span>\n </label>\n );\n })}\n </div>\n </div>\n )}\n\n <div className=\"overflow-auto\" style={{ maxHeight }}>\n <Table>\n <TableHeader>\n <TableRow>\n {displayColumns.map((col) => (\n <TableHead key={col.key} title={col.path}>\n {col.label}\n </TableHead>\n ))}\n </TableRow>\n </TableHeader>\n <TableBody>\n {paginatedRows.map((row, rowIndex) => (\n <TableRow key={rowIndex}>\n {displayColumns.map((col) => (\n <TableCell key={col.key}>{formatCellValue(getNestedValue(row, col.path))}</TableCell>\n ))}\n </TableRow>\n ))}\n </TableBody>\n </Table>\n </div>\n\n {totalPages > 1 && (\n <div className=\"flex items-center justify-between p-3 bg-bg-sunken border-t border-border-default\">\n <span className=\"text-xs text-text-secondary\">\n Page {page + 1} of {totalPages}\n </span>\n <div className=\"flex items-center gap-1\">\n <Button variant=\"ghost\" size=\"sm\" onClick={() => setPage(0)} disabled={page === 0}>\n <ChevronsLeft className=\"w-4 h-4\" />\n </Button>\n <Button variant=\"ghost\" size=\"sm\" onClick={() => setPage((p) => Math.max(0, p - 1))} disabled={page === 0}>\n <ChevronLeft className=\"w-4 h-4\" />\n </Button>\n <Button\n variant=\"ghost\"\n size=\"sm\"\n onClick={() => setPage((p) => Math.min(totalPages - 1, p + 1))}\n disabled={page >= totalPages - 1}\n >\n <ChevronRight className=\"w-4 h-4\" />\n </Button>\n <Button variant=\"ghost\" size=\"sm\" onClick={() => setPage(totalPages - 1)} disabled={page >= totalPages - 1}>\n <ChevronsRight className=\"w-4 h-4\" />\n </Button>\n </div>\n </div>\n )}\n </div>\n );\n});\n\nexport default DataSinkTableViewer;\n"],"mappings":"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"}
1
+ {"version":3,"file":"DataSinkTableViewer.js","names":[],"sources":["../../../../src/bigconsole/components/datasink/DataSinkTableViewer.tsx"],"sourcesContent":["/**\n * DataSink Table Viewer\n *\n * Component for viewing DataSink data in tabular format with support for\n * nested data, column selection, and multiple view modes.\n */\n\nimport { memo, useState, useMemo, useCallback } from 'react';\n\nimport { Table, TableBody, TableCell, TableHead, TableHeader, TableRow } from '@burdenoff/fe-libs/ui/table';\n\nimport { Button } from '@burdenoff/fe-libs/ui';\nimport { ChevronLeft, ChevronRight, ChevronsLeft, ChevronsRight, Settings2, X } from 'lucide-react';\n\nimport { SECTION_FOCUS_RING } from '../common';\n\ninterface DataSinkTableViewerProps {\n data: unknown;\n maxHeight?: string;\n}\n\ninterface Column {\n key: string;\n label: string;\n path: string;\n}\n\nfunction isObject(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n\nfunction isArrayOfObjects(value: unknown): boolean {\n return Array.isArray(value) && value.length > 0 && isObject(value[0]);\n}\n\nfunction flattenObject(obj: Record<string, unknown>, prefix = ''): Record<string, unknown> {\n const result: Record<string, unknown> = {};\n\n for (const [key, value] of Object.entries(obj)) {\n const newKey = prefix ? `${prefix}.${key}` : key;\n\n if (isObject(value) && !Array.isArray(value)) {\n Object.assign(result, flattenObject(value, newKey));\n } else {\n result[newKey] = value;\n }\n }\n\n return result;\n}\n\nfunction getNestedValue(obj: Record<string, unknown>, path: string): unknown {\n return path.split('.').reduce((acc: unknown, key) => {\n if (acc && typeof acc === 'object' && key in acc) {\n return (acc as Record<string, unknown>)[key];\n }\n return undefined;\n }, obj);\n}\n\nfunction formatCellValue(value: unknown): string {\n if (value === null || value === undefined) {\n return '-';\n }\n if (typeof value === 'object') {\n return JSON.stringify(value);\n }\n return String(value);\n}\n\nexport const DataSinkTableViewer = memo(function DataSinkTableViewer({\n data,\n maxHeight = '400px',\n}: DataSinkTableViewerProps) {\n const [page, setPage] = useState(0);\n const PAGE_SIZE = 50;\n const [selectedColumns, setSelectedColumns] = useState<string[] | null>(null);\n const [showColumnPicker, setShowColumnPicker] = useState(false);\n\n const rows = useMemo(() => {\n if (!data) return [];\n if (Array.isArray(data) && isArrayOfObjects(data)) {\n return data as Record<string, unknown>[];\n }\n if (isObject(data)) {\n return [data];\n }\n return [];\n }, [data]);\n\n const allColumns = useMemo(() => {\n if (rows.length === 0) return [];\n\n const columnMap = new Map<string, Column>();\n\n for (const row of rows) {\n const flat = flattenObject(row);\n for (const key of Object.keys(flat)) {\n if (!columnMap.has(key)) {\n const parts = key.split('.');\n const label = parts[parts.length - 1];\n columnMap.set(key, { key, label, path: key });\n }\n }\n }\n\n return Array.from(columnMap.values());\n }, [rows]);\n\n const displayColumns = useMemo(() => {\n if (selectedColumns) {\n return allColumns.filter((col) => selectedColumns.includes(col.key));\n }\n return allColumns.slice(0, 10);\n }, [allColumns, selectedColumns]);\n\n const paginatedRows = useMemo(() => {\n const start = page * PAGE_SIZE;\n return rows.slice(start, start + PAGE_SIZE);\n }, [rows, page]);\n\n const totalPages = Math.ceil(rows.length / PAGE_SIZE);\n\n const handleColumnToggle = useCallback((columnKey: string) => {\n setSelectedColumns((prev) => {\n if (!prev) {\n return [columnKey];\n }\n if (prev.includes(columnKey)) {\n const next = prev.filter((k) => k !== columnKey);\n return next.length > 0 ? next : null;\n }\n return [...prev, columnKey];\n });\n }, []);\n\n const handleResetColumns = useCallback(() => {\n setSelectedColumns(null);\n setShowColumnPicker(false);\n }, []);\n\n if (rows.length === 0) {\n return (\n <div className=\"flex items-center justify-center p-8 text-center text-sm text-text-secondary\">\n No tabular data available. Data must be an array of objects for table view.\n </div>\n );\n }\n\n return (\n <div className=\"relative min-w-0\">\n {/* Toolbar. Deliberately surface-less: this viewer is rendered inside an\n already-headed section, and a second sunken band stacked three bars\n deep was the main reason the preview did not scan. */}\n <div className=\"mb-control-gap flex flex-wrap items-center justify-between gap-control-gap\">\n <span className=\"text-xs text-text-secondary\">\n {rows.length} rows &middot; {displayColumns.length} columns\n </span>\n <Button variant=\"ghost\" size=\"sm\" onClick={() => setShowColumnPicker((v) => !v)} aria-label=\"Select columns\">\n <Settings2 className=\"w-4 h-4\" />\n </Button>\n </div>\n\n {showColumnPicker && (\n <div className=\"absolute right-0 top-10 z-10 max-h-[300px] w-56 max-w-[calc(100vw-2rem)] overflow-auto rounded-card border border-[var(--color-border-subtle)] bg-bg-surface p-3 shadow-[var(--shadow-elevation-2)]\">\n <div className=\"mb-2 flex items-center justify-between gap-control-gap\">\n <span className=\"text-xs font-medium text-text-primary\">Select columns</span>\n <Button variant=\"ghost\" size=\"sm\" onClick={handleResetColumns} aria-label=\"Reset columns\">\n <X className=\"w-3 h-3\" />\n </Button>\n </div>\n <div className=\"space-y-1\">\n {allColumns.map((col) => {\n const isSelected = !selectedColumns || selectedColumns.includes(col.key);\n return (\n <label\n key={col.key}\n className=\"flex min-h-[var(--size-controlHeight-md)] cursor-pointer items-center gap-2 text-xs text-text-secondary hover:text-text-primary\"\n >\n <input\n type=\"checkbox\"\n checked={isSelected}\n onChange={() => handleColumnToggle(col.key)}\n className={`rounded border-[var(--color-border-default)] ${SECTION_FOCUS_RING}`}\n />\n <span className=\"truncate\" title={col.key}>\n {col.label}\n </span>\n </label>\n );\n })}\n </div>\n </div>\n )}\n\n <div\n className=\"min-w-0 overflow-auto rounded-input border border-[var(--color-border-subtle)]\"\n style={{ maxHeight }}\n >\n <Table>\n <TableHeader>\n <TableRow>\n {displayColumns.map((col) => (\n <TableHead key={col.key} title={col.path}>\n {col.label}\n </TableHead>\n ))}\n </TableRow>\n </TableHeader>\n <TableBody>\n {paginatedRows.map((row, rowIndex) => (\n <TableRow key={rowIndex}>\n {displayColumns.map((col) => (\n <TableCell key={col.key}>{formatCellValue(getNestedValue(row, col.path))}</TableCell>\n ))}\n </TableRow>\n ))}\n </TableBody>\n </Table>\n </div>\n\n {totalPages > 1 && (\n <div className=\"mt-control-gap flex flex-wrap items-center justify-between gap-control-gap\">\n <span className=\"text-xs text-text-secondary\">\n Page {page + 1} of {totalPages}\n </span>\n <div className=\"flex flex-wrap items-center gap-1\">\n <Button variant=\"ghost\" size=\"sm\" onClick={() => setPage(0)} disabled={page === 0}>\n <ChevronsLeft className=\"w-4 h-4\" />\n </Button>\n <Button variant=\"ghost\" size=\"sm\" onClick={() => setPage((p) => Math.max(0, p - 1))} disabled={page === 0}>\n <ChevronLeft className=\"w-4 h-4\" />\n </Button>\n <Button\n variant=\"ghost\"\n size=\"sm\"\n onClick={() => setPage((p) => Math.min(totalPages - 1, p + 1))}\n disabled={page >= totalPages - 1}\n >\n <ChevronRight className=\"w-4 h-4\" />\n </Button>\n <Button variant=\"ghost\" size=\"sm\" onClick={() => setPage(totalPages - 1)} disabled={page >= totalPages - 1}>\n <ChevronsRight className=\"w-4 h-4\" />\n </Button>\n </div>\n </div>\n )}\n </div>\n );\n});\n\nexport default DataSinkTableViewer;\n"],"mappings":"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"}
@@ -1,11 +1,14 @@
1
- import e from "../../hooks/useExportDataSink.js";
1
+ import { SECTION_FOCUS_RING as e } from "../common/sectionStyles.js";
2
+ import { Section as t } from "../common/Section.js";
3
+ import "../common/index.js";
4
+ import n from "../../hooks/useExportDataSink.js";
2
5
  import "../../hooks/index.js";
3
- import { memo as t, useCallback as n, useEffect as r, useState as i } from "react";
4
- import { Check as a, Download as o, FileJson as s } from "lucide-react";
5
- import { Dialog as c, DialogContent as l, DialogDescription as u, DialogTitle as d, Spinner as f } from "@burdenoff/fe-libs/ui";
6
- import { Fragment as p, jsx as m, jsxs as h } from "react/jsx-runtime";
6
+ import { memo as r, useCallback as i, useEffect as a, useState as o } from "react";
7
+ import { Check as s, Download as c, FileJson as l } from "lucide-react";
8
+ import { Dialog as u, DialogContent as d, DialogDescription as f, DialogTitle as p, Spinner as m } from "@burdenoff/fe-libs/ui";
9
+ import { Fragment as h, jsx as g, jsxs as _ } from "react/jsx-runtime";
7
10
  //#region src/bigconsole/components/datasink/ExportDataSinkDialog.tsx
8
- var g = {
11
+ var v = {
9
12
  dialogContent: {
10
13
  maxWidth: "450px",
11
14
  width: "95vw",
@@ -45,48 +48,30 @@ var g = {
45
48
  margin: "4px 0 0 0"
46
49
  },
47
50
  content: { padding: "20px 24px" },
48
- dataSinkInfo: {
49
- padding: "12px 16px",
50
- backgroundColor: "var(--color-bg-muted)",
51
- borderRadius: "8px",
52
- marginBottom: "20px"
53
- },
54
- dataSinkLabel: {
55
- fontSize: "12px",
56
- color: "var(--color-text-secondary)",
57
- margin: 0
58
- },
59
51
  dataSinkName: {
60
52
  fontSize: "14px",
61
53
  fontWeight: 500,
62
54
  color: "var(--color-text-primary)",
63
- margin: "4px 0 0 0",
55
+ margin: 0,
64
56
  overflow: "hidden",
65
57
  textOverflow: "ellipsis",
66
58
  whiteSpace: "nowrap"
67
59
  },
68
- optionsTitle: {
69
- fontSize: "13px",
70
- fontWeight: 600,
71
- color: "var(--color-text-secondary)",
72
- marginBottom: "16px",
73
- textTransform: "uppercase",
74
- letterSpacing: "0.05em"
75
- },
76
60
  optionItem: {
77
61
  display: "flex",
78
62
  alignItems: "flex-start",
79
63
  gap: "12px",
64
+ width: "100%",
65
+ textAlign: "left",
80
66
  padding: "12px",
81
- borderRadius: "8px",
67
+ borderRadius: "var(--radius-card)",
82
68
  marginBottom: "8px",
83
69
  backgroundColor: "var(--color-bg-sunken)",
84
70
  border: "1px solid var(--color-border)",
85
- cursor: "pointer",
86
- transition: "all 0.15s ease"
71
+ cursor: "pointer"
87
72
  },
88
73
  optionItemActive: {
89
- backgroundColor: "var(--color-action-primary-bg)",
74
+ backgroundColor: "var(--color-bg-accentSubtle)",
90
75
  borderColor: "var(--color-action-primary-bg)"
91
76
  },
92
77
  checkbox: {
@@ -118,13 +103,6 @@ var g = {
118
103
  color: "var(--color-text-secondary)",
119
104
  margin: "4px 0 0 0"
120
105
  },
121
- error: {
122
- padding: "12px 16px",
123
- backgroundColor: "var(--color-status-error-bgSubtle)",
124
- border: "1px solid var(--color-status-error-border)",
125
- borderRadius: "8px",
126
- marginTop: "16px"
127
- },
128
106
  errorText: {
129
107
  fontSize: "13px",
130
108
  color: "var(--color-status-error-text)",
@@ -132,184 +110,162 @@ var g = {
132
110
  },
133
111
  footer: {
134
112
  display: "flex",
113
+ flexWrap: "wrap",
135
114
  justifyContent: "flex-end",
136
115
  gap: "12px",
137
116
  padding: "16px 24px",
138
117
  borderTop: "1px solid var(--color-border)",
139
118
  backgroundColor: "var(--color-bg-sunken)"
140
- },
141
- cancelButton: {
142
- padding: "10px 20px",
143
- fontSize: "14px",
144
- fontWeight: 500,
145
- borderRadius: "8px",
146
- border: "1px solid var(--color-border)",
147
- backgroundColor: "var(--color-bg-surface)",
148
- color: "var(--color-text-secondary)",
149
- cursor: "pointer",
150
- transition: "all 0.15s ease"
151
- },
152
- exportButton: {
153
- display: "flex",
154
- alignItems: "center",
155
- gap: "8px",
156
- padding: "10px 20px",
157
- fontSize: "14px",
158
- fontWeight: 500,
159
- borderRadius: "8px",
160
- border: "none",
161
- backgroundColor: "var(--color-action-primary-bg)",
162
- color: "var(--color-action-primary-text)",
163
- cursor: "pointer",
164
- transition: "all 0.15s ease"
165
- },
166
- exportButtonDisabled: {
167
- backgroundColor: "var(--color-action-primary-bg)",
168
- opacity: .5,
169
- cursor: "not-allowed"
170
119
  }
171
- }, _ = t(function({ checked: e, onChange: t, disabled: n, label: r, description: i }) {
172
- return /* @__PURE__ */ h("div", {
120
+ }, y = `inline-flex min-h-[var(--size-controlHeight-md)] items-center gap-2 rounded-button px-5 py-2 text-sm font-medium motion-safe:transition-colors ${e}`, b = r(function({ checked: t, onChange: n, disabled: r, label: i, description: a }) {
121
+ return /* @__PURE__ */ _("button", {
122
+ type: "button",
123
+ role: "checkbox",
124
+ "aria-checked": t,
125
+ disabled: r,
126
+ className: e,
173
127
  style: {
174
- ...g.optionItem,
175
- ...e ? g.optionItemActive : {},
176
- opacity: n ? .6 : 1,
177
- cursor: n ? "not-allowed" : "pointer"
128
+ ...v.optionItem,
129
+ ...t ? v.optionItemActive : {},
130
+ opacity: r ? .6 : 1,
131
+ cursor: r ? "not-allowed" : "pointer"
178
132
  },
179
- onClick: () => !n && t(!e),
180
- children: [/* @__PURE__ */ m("div", {
133
+ onClick: () => !r && n(!t),
134
+ children: [/* @__PURE__ */ g("span", {
135
+ "aria-hidden": "true",
181
136
  style: {
182
- ...g.checkbox,
183
- ...e ? g.checkboxChecked : {}
137
+ ...v.checkbox,
138
+ ...t ? v.checkboxChecked : {}
184
139
  },
185
- children: e && /* @__PURE__ */ m(a, { style: {
140
+ children: t && /* @__PURE__ */ g(s, { style: {
186
141
  width: "14px",
187
142
  height: "14px",
188
143
  color: "var(--color-action-primary-text)"
189
144
  } })
190
- }), /* @__PURE__ */ h("div", {
191
- style: g.optionText,
192
- children: [/* @__PURE__ */ m("p", {
193
- style: g.optionLabel,
194
- children: r
195
- }), /* @__PURE__ */ m("p", {
196
- style: g.optionDescription,
145
+ }), /* @__PURE__ */ _("span", {
146
+ style: v.optionText,
147
+ children: [/* @__PURE__ */ g("span", {
148
+ style: {
149
+ ...v.optionLabel,
150
+ display: "block"
151
+ },
197
152
  children: i
153
+ }), /* @__PURE__ */ g("span", {
154
+ style: {
155
+ ...v.optionDescription,
156
+ display: "block"
157
+ },
158
+ children: a
198
159
  })]
199
160
  })]
200
161
  });
201
- }), v = t(function({ isOpen: t, dataSinkId: a, dataSinkName: v, onClose: y, onSuccess: b }) {
202
- let [x, S] = i(!0), { loading: C, error: w, downloadDataSink: T, clearError: E } = e();
203
- r(() => {
204
- t && (S(!0), E());
205
- }, [t, E]);
206
- let D = n(async () => {
207
- a && await T(a, v, { prettyPrint: x }) && (b?.(), y());
162
+ }), x = r(function({ isOpen: e, dataSinkId: r, dataSinkName: s, onClose: x, onSuccess: S }) {
163
+ let [C, w] = o(!0), { loading: T, error: E, downloadDataSink: D, clearError: O } = n();
164
+ a(() => {
165
+ e && (w(!0), O());
166
+ }, [e, O]);
167
+ let k = i(async () => {
168
+ r && await D(r, s, { prettyPrint: C }) && (S?.(), x());
208
169
  }, [
209
- a,
210
- v,
211
- x,
212
- T,
213
- b,
214
- y
170
+ r,
171
+ s,
172
+ C,
173
+ D,
174
+ S,
175
+ x
215
176
  ]);
216
- return a ? /* @__PURE__ */ m(c, {
217
- open: t,
218
- onOpenChange: (e) => !e && !C && y(),
219
- children: /* @__PURE__ */ h(l, {
220
- style: g.dialogContent,
177
+ return r ? /* @__PURE__ */ g(u, {
178
+ open: e,
179
+ onOpenChange: (e) => !e && !T && x(),
180
+ children: /* @__PURE__ */ _(d, {
181
+ style: v.dialogContent,
221
182
  children: [
222
- /* @__PURE__ */ h("div", {
223
- style: g.header,
224
- children: [/* @__PURE__ */ m("div", {
225
- style: g.iconWrapper,
226
- children: /* @__PURE__ */ m(s, { style: {
183
+ /* @__PURE__ */ _("div", {
184
+ style: v.header,
185
+ children: [/* @__PURE__ */ g("div", {
186
+ style: v.iconWrapper,
187
+ children: /* @__PURE__ */ g(l, { style: {
227
188
  width: "22px",
228
189
  height: "22px"
229
190
  } })
230
- }), /* @__PURE__ */ h("div", {
231
- style: g.headerText,
232
- children: [/* @__PURE__ */ m(d, {
191
+ }), /* @__PURE__ */ _("div", {
192
+ style: v.headerText,
193
+ children: [/* @__PURE__ */ g(p, {
233
194
  asChild: !0,
234
- children: /* @__PURE__ */ m("h2", {
235
- style: g.title,
195
+ children: /* @__PURE__ */ g("h2", {
196
+ style: v.title,
236
197
  children: "Export DataSink"
237
198
  })
238
- }), /* @__PURE__ */ m(u, {
199
+ }), /* @__PURE__ */ g(f, {
239
200
  asChild: !0,
240
- children: /* @__PURE__ */ m("p", {
241
- style: g.description,
201
+ children: /* @__PURE__ */ g("p", {
202
+ style: v.description,
242
203
  children: "Export your DataSink configuration to a JSON file."
243
204
  })
244
205
  })]
245
206
  })]
246
207
  }),
247
- /* @__PURE__ */ h("div", {
248
- style: g.content,
208
+ /* @__PURE__ */ _("div", {
209
+ style: v.content,
210
+ className: "space-y-form-gap",
249
211
  children: [
250
- v && /* @__PURE__ */ h("div", {
251
- style: g.dataSinkInfo,
252
- children: [/* @__PURE__ */ m("p", {
253
- style: g.dataSinkLabel,
254
- children: "Exporting:"
255
- }), /* @__PURE__ */ m("p", {
256
- style: g.dataSinkName,
257
- children: v
258
- })]
259
- }),
260
- /* @__PURE__ */ m("p", {
261
- style: g.optionsTitle,
262
- children: "Export Options"
212
+ s && /* @__PURE__ */ g(t, {
213
+ emphasis: "muted",
214
+ padding: "compact",
215
+ headingLevel: 3,
216
+ title: "Exporting",
217
+ headerClassName: "mb-control-gap",
218
+ children: /* @__PURE__ */ g("p", {
219
+ style: v.dataSinkName,
220
+ children: s
221
+ })
263
222
  }),
264
- /* @__PURE__ */ m(_, {
265
- checked: x,
266
- onChange: S,
267
- disabled: C,
268
- label: "Format JSON (Pretty Print)",
269
- description: "Makes the export file human-readable (larger file size)"
223
+ /* @__PURE__ */ g(t, {
224
+ emphasis: "bare",
225
+ padding: "none",
226
+ headingLevel: 3,
227
+ title: "Export options",
228
+ headerClassName: "mb-control-gap",
229
+ children: /* @__PURE__ */ g(b, {
230
+ checked: C,
231
+ onChange: w,
232
+ disabled: T,
233
+ label: "Format JSON (pretty print)",
234
+ description: "Makes the export file human-readable (larger file size)"
235
+ })
270
236
  }),
271
- w && /* @__PURE__ */ m("div", {
272
- style: g.error,
273
- children: /* @__PURE__ */ m("p", {
274
- style: g.errorText,
275
- children: w.message
237
+ E && /* @__PURE__ */ g(t, {
238
+ tone: "danger",
239
+ padding: "compact",
240
+ headingLevel: 3,
241
+ title: "Export failed",
242
+ children: /* @__PURE__ */ g("p", {
243
+ style: v.errorText,
244
+ children: E.message
276
245
  })
277
246
  })
278
247
  ]
279
248
  }),
280
- /* @__PURE__ */ h("div", {
281
- style: g.footer,
282
- children: [/* @__PURE__ */ m("button", {
283
- style: g.cancelButton,
284
- onClick: y,
285
- disabled: C,
286
- onMouseEnter: (e) => {
287
- e.currentTarget.style.backgroundColor = "var(--color-bg-muted)";
288
- },
289
- onMouseLeave: (e) => {
290
- e.currentTarget.style.backgroundColor = "var(--color-bg-surface)";
291
- },
249
+ /* @__PURE__ */ _("div", {
250
+ style: v.footer,
251
+ children: [/* @__PURE__ */ g("button", {
252
+ type: "button",
253
+ className: `${y} border border-[var(--color-border-default)] bg-bg-surface text-text-secondary hover:bg-bg-sunken`,
254
+ onClick: x,
255
+ disabled: T,
292
256
  children: "Cancel"
293
- }), /* @__PURE__ */ m("button", {
294
- style: {
295
- ...g.exportButton,
296
- ...C ? g.exportButtonDisabled : {}
297
- },
298
- onClick: D,
299
- disabled: C,
300
- onMouseEnter: (e) => {
301
- C || (e.currentTarget.style.opacity = "0.9");
302
- },
303
- onMouseLeave: (e) => {
304
- C || (e.currentTarget.style.opacity = "1");
305
- },
306
- children: C ? /* @__PURE__ */ h(p, { children: [/* @__PURE__ */ m(f, { style: {
257
+ }), /* @__PURE__ */ g("button", {
258
+ type: "button",
259
+ className: `${y} bg-action-primary-bg text-action-primary-text hover:bg-action-primary-bgHover disabled:cursor-not-allowed disabled:opacity-50`,
260
+ onClick: k,
261
+ disabled: T,
262
+ children: T ? /* @__PURE__ */ _(h, { children: [/* @__PURE__ */ g(m, { style: {
307
263
  width: "16px",
308
264
  height: "16px"
309
- } }), "Exporting..."] }) : /* @__PURE__ */ h(p, { children: [/* @__PURE__ */ m(o, { style: {
265
+ } }), "Exporting..."] }) : /* @__PURE__ */ _(h, { children: [/* @__PURE__ */ g(c, { style: {
310
266
  width: "16px",
311
267
  height: "16px"
312
- } }), "Download Export"] })
268
+ } }), "Download export"] })
313
269
  })]
314
270
  })
315
271
  ]
@@ -317,6 +273,6 @@ var g = {
317
273
  }) : null;
318
274
  });
319
275
  //#endregion
320
- export { v as default };
276
+ export { x as default };
321
277
 
322
278
  //# sourceMappingURL=ExportDataSinkDialog.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"ExportDataSinkDialog.js","names":[],"sources":["../../../../src/bigconsole/components/datasink/ExportDataSinkDialog.tsx"],"sourcesContent":["/**\n * ExportDataSinkDialog Component\n *\n * Modal dialog for exporting a DataSink to JSON.\n * Uses inline styles for consistent styling across environments.\n */\n\nimport { type FC, memo, useState, useCallback, useEffect } from 'react';\nimport { Dialog, DialogContent, DialogTitle, DialogDescription } from '@burdenoff/fe-libs/ui';\nimport { Spinner } from '@burdenoff/fe-libs/ui';\nimport { Download, FileJson, Check } from 'lucide-react';\nimport { useExportDataSink, type ExportDataSinkOptions } from '../../hooks';\n\n// ============================================================================\n// Types\n// ============================================================================\n\nexport interface ExportDataSinkDialogProps {\n /** Whether dialog is open */\n isOpen: boolean;\n /** DataSink ID to export */\n dataSinkId: string | null;\n /** DataSink name for filename */\n dataSinkName?: string;\n /** Callback when dialog is closed */\n onClose: () => void;\n /** Callback when export succeeds */\n onSuccess?: () => void;\n}\n\n// ============================================================================\n// Styles\n// ============================================================================\n\nconst styles = {\n dialogContent: {\n maxWidth: '450px',\n width: '95vw',\n padding: 0,\n borderRadius: '12px',\n overflow: 'hidden',\n } as React.CSSProperties,\n header: {\n display: 'flex',\n alignItems: 'center',\n gap: '12px',\n padding: '20px 24px',\n borderBottom: '1px solid var(--color-border)',\n backgroundColor: 'var(--color-bg-sunken)',\n } as React.CSSProperties,\n iconWrapper: {\n width: '44px',\n height: '44px',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n borderRadius: '10px',\n backgroundColor: 'var(--color-action-primary-bg)',\n color: 'var(--color-action-primary-text)',\n flexShrink: 0,\n } as React.CSSProperties,\n headerText: {\n flex: 1,\n } as React.CSSProperties,\n title: {\n fontSize: '16px',\n fontWeight: 600,\n color: 'var(--color-text-primary)',\n margin: 0,\n } as React.CSSProperties,\n description: {\n fontSize: '13px',\n color: 'var(--color-text-secondary)',\n margin: '4px 0 0 0',\n } as React.CSSProperties,\n content: {\n padding: '20px 24px',\n } as React.CSSProperties,\n dataSinkInfo: {\n padding: '12px 16px',\n backgroundColor: 'var(--color-bg-muted)',\n borderRadius: '8px',\n marginBottom: '20px',\n } as React.CSSProperties,\n dataSinkLabel: {\n fontSize: '12px',\n color: 'var(--color-text-secondary)',\n margin: 0,\n } as React.CSSProperties,\n dataSinkName: {\n fontSize: '14px',\n fontWeight: 500,\n color: 'var(--color-text-primary)',\n margin: '4px 0 0 0',\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n whiteSpace: 'nowrap',\n } as React.CSSProperties,\n optionsTitle: {\n fontSize: '13px',\n fontWeight: 600,\n color: 'var(--color-text-secondary)',\n marginBottom: '16px',\n textTransform: 'uppercase',\n letterSpacing: '0.05em',\n } as React.CSSProperties,\n optionItem: {\n display: 'flex',\n alignItems: 'flex-start',\n gap: '12px',\n padding: '12px',\n borderRadius: '8px',\n marginBottom: '8px',\n backgroundColor: 'var(--color-bg-sunken)',\n border: '1px solid var(--color-border)',\n cursor: 'pointer',\n transition: 'all 0.15s ease',\n } as React.CSSProperties,\n optionItemActive: {\n backgroundColor: 'var(--color-action-primary-bg)',\n borderColor: 'var(--color-action-primary-bg)',\n } as React.CSSProperties,\n checkbox: {\n width: '20px',\n height: '20px',\n borderRadius: '4px',\n border: '2px solid var(--color-border)',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n flexShrink: 0,\n marginTop: '2px',\n transition: 'all 0.15s ease',\n cursor: 'pointer',\n } as React.CSSProperties,\n checkboxChecked: {\n backgroundColor: 'var(--color-action-primary-bg)',\n borderColor: 'var(--color-action-primary-bg)',\n } as React.CSSProperties,\n optionText: {\n flex: 1,\n } as React.CSSProperties,\n optionLabel: {\n fontSize: '14px',\n fontWeight: 500,\n color: 'var(--color-text-primary)',\n margin: 0,\n } as React.CSSProperties,\n optionDescription: {\n fontSize: '12px',\n color: 'var(--color-text-secondary)',\n margin: '4px 0 0 0',\n } as React.CSSProperties,\n error: {\n padding: '12px 16px',\n backgroundColor: 'var(--color-status-error-bgSubtle)',\n border: '1px solid var(--color-status-error-border)',\n borderRadius: '8px',\n marginTop: '16px',\n } as React.CSSProperties,\n errorText: {\n fontSize: '13px',\n color: 'var(--color-status-error-text)',\n margin: 0,\n } as React.CSSProperties,\n footer: {\n display: 'flex',\n justifyContent: 'flex-end',\n gap: '12px',\n padding: '16px 24px',\n borderTop: '1px solid var(--color-border)',\n backgroundColor: 'var(--color-bg-sunken)',\n } as React.CSSProperties,\n cancelButton: {\n padding: '10px 20px',\n fontSize: '14px',\n fontWeight: 500,\n borderRadius: '8px',\n border: '1px solid var(--color-border)',\n backgroundColor: 'var(--color-bg-surface)',\n color: 'var(--color-text-secondary)',\n cursor: 'pointer',\n transition: 'all 0.15s ease',\n } as React.CSSProperties,\n exportButton: {\n display: 'flex',\n alignItems: 'center',\n gap: '8px',\n padding: '10px 20px',\n fontSize: '14px',\n fontWeight: 500,\n borderRadius: '8px',\n border: 'none',\n backgroundColor: 'var(--color-action-primary-bg)',\n color: 'var(--color-action-primary-text)',\n cursor: 'pointer',\n transition: 'all 0.15s ease',\n } as React.CSSProperties,\n exportButtonDisabled: {\n backgroundColor: 'var(--color-action-primary-bg)',\n opacity: 0.5,\n cursor: 'not-allowed',\n } as React.CSSProperties,\n};\n\n// ============================================================================\n// Custom Checkbox Component\n// ============================================================================\n\ninterface CustomCheckboxProps {\n checked: boolean;\n onChange: (checked: boolean) => void;\n disabled?: boolean;\n label: string;\n description: string;\n}\n\nconst CustomCheckbox: FC<CustomCheckboxProps> = memo(function CustomCheckbox({\n checked,\n onChange,\n disabled,\n label,\n description,\n}) {\n return (\n <div\n style={{\n ...styles.optionItem,\n ...(checked ? styles.optionItemActive : {}),\n opacity: disabled ? 0.6 : 1,\n cursor: disabled ? 'not-allowed' : 'pointer',\n }}\n onClick={() => !disabled && onChange(!checked)}\n >\n <div\n style={{\n ...styles.checkbox,\n ...(checked ? styles.checkboxChecked : {}),\n }}\n >\n {checked && <Check style={{ width: '14px', height: '14px', color: 'var(--color-action-primary-text)' }} />}\n </div>\n <div style={styles.optionText}>\n <p style={styles.optionLabel}>{label}</p>\n <p style={styles.optionDescription}>{description}</p>\n </div>\n </div>\n );\n});\n\n// ============================================================================\n// Component\n// ============================================================================\n\nexport const ExportDataSinkDialog: FC<ExportDataSinkDialogProps> = memo(function ExportDataSinkDialog({\n isOpen,\n dataSinkId,\n dataSinkName,\n onClose,\n onSuccess,\n}) {\n const [prettyPrint, setPrettyPrint] = useState(true);\n\n const { loading, error, downloadDataSink, clearError } = useExportDataSink();\n\n // Reset state when dialog opens\n useEffect(() => {\n if (isOpen) {\n setPrettyPrint(true);\n clearError();\n }\n }, [isOpen, clearError]);\n\n // Handle export\n const handleExport = useCallback(async () => {\n if (!dataSinkId) return;\n\n const options: ExportDataSinkOptions = {\n prettyPrint,\n };\n\n const success = await downloadDataSink(dataSinkId, dataSinkName, options);\n\n if (success) {\n onSuccess?.();\n onClose();\n }\n }, [dataSinkId, dataSinkName, prettyPrint, downloadDataSink, onSuccess, onClose]);\n\n // Don't render if no DataSink\n if (!dataSinkId) return null;\n\n return (\n <Dialog open={isOpen} onOpenChange={(open) => !open && !loading && onClose()}>\n <DialogContent style={styles.dialogContent}>\n {/* Header */}\n <div style={styles.header}>\n <div style={styles.iconWrapper}>\n <FileJson style={{ width: '22px', height: '22px' }} />\n </div>\n <div style={styles.headerText}>\n <DialogTitle asChild>\n <h2 style={styles.title}>Export DataSink</h2>\n </DialogTitle>\n <DialogDescription asChild>\n <p style={styles.description}>Export your DataSink configuration to a JSON file.</p>\n </DialogDescription>\n </div>\n </div>\n\n {/* Content */}\n <div style={styles.content}>\n {/* DataSink Info */}\n {dataSinkName && (\n <div style={styles.dataSinkInfo}>\n <p style={styles.dataSinkLabel}>Exporting:</p>\n <p style={styles.dataSinkName}>{dataSinkName}</p>\n </div>\n )}\n\n {/* Options */}\n <p style={styles.optionsTitle}>Export Options</p>\n\n <CustomCheckbox\n checked={prettyPrint}\n onChange={setPrettyPrint}\n disabled={loading}\n label=\"Format JSON (Pretty Print)\"\n description=\"Makes the export file human-readable (larger file size)\"\n />\n\n {/* Error */}\n {error && (\n <div style={styles.error}>\n <p style={styles.errorText}>{error.message}</p>\n </div>\n )}\n </div>\n\n {/* Footer */}\n <div style={styles.footer}>\n <button\n style={styles.cancelButton}\n onClick={onClose}\n disabled={loading}\n onMouseEnter={(e) => {\n e.currentTarget.style.backgroundColor = 'var(--color-bg-muted)';\n }}\n onMouseLeave={(e) => {\n e.currentTarget.style.backgroundColor = 'var(--color-bg-surface)';\n }}\n >\n Cancel\n </button>\n <button\n style={{\n ...styles.exportButton,\n ...(loading ? styles.exportButtonDisabled : {}),\n }}\n onClick={handleExport}\n disabled={loading}\n onMouseEnter={(e) => {\n if (!loading) e.currentTarget.style.opacity = '0.9';\n }}\n onMouseLeave={(e) => {\n if (!loading) e.currentTarget.style.opacity = '1';\n }}\n >\n {loading ? (\n <>\n <Spinner style={{ width: '16px', height: '16px' }} />\n Exporting...\n </>\n ) : (\n <>\n <Download style={{ width: '16px', height: '16px' }} />\n Download Export\n </>\n )}\n </button>\n </div>\n </DialogContent>\n </Dialog>\n );\n});\n\nexport default ExportDataSinkDialog;\n"],"mappings":"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"}
1
+ {"version":3,"file":"ExportDataSinkDialog.js","names":[],"sources":["../../../../src/bigconsole/components/datasink/ExportDataSinkDialog.tsx"],"sourcesContent":["/**\n * ExportDataSinkDialog Component\n *\n * Modal dialog for exporting a DataSink to JSON.\n * Uses inline styles for consistent styling across environments.\n */\n\nimport { type FC, memo, useState, useCallback, useEffect } from 'react';\nimport { Dialog, DialogContent, DialogTitle, DialogDescription } from '@burdenoff/fe-libs/ui';\nimport { Spinner } from '@burdenoff/fe-libs/ui';\nimport { Download, FileJson, Check } from 'lucide-react';\nimport { useExportDataSink, type ExportDataSinkOptions } from '../../hooks';\nimport { Section, SECTION_FOCUS_RING } from '../common';\n\n// ============================================================================\n// Types\n// ============================================================================\n\nexport interface ExportDataSinkDialogProps {\n /** Whether dialog is open */\n isOpen: boolean;\n /** DataSink ID to export */\n dataSinkId: string | null;\n /** DataSink name for filename */\n dataSinkName?: string;\n /** Callback when dialog is closed */\n onClose: () => void;\n /** Callback when export succeeds */\n onSuccess?: () => void;\n}\n\n// ============================================================================\n// Styles\n// ============================================================================\n\nconst styles = {\n dialogContent: {\n maxWidth: '450px',\n width: '95vw',\n padding: 0,\n borderRadius: '12px',\n overflow: 'hidden',\n } as React.CSSProperties,\n header: {\n display: 'flex',\n alignItems: 'center',\n gap: '12px',\n padding: '20px 24px',\n borderBottom: '1px solid var(--color-border)',\n backgroundColor: 'var(--color-bg-sunken)',\n } as React.CSSProperties,\n iconWrapper: {\n width: '44px',\n height: '44px',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n borderRadius: '10px',\n backgroundColor: 'var(--color-action-primary-bg)',\n color: 'var(--color-action-primary-text)',\n flexShrink: 0,\n } as React.CSSProperties,\n headerText: {\n flex: 1,\n } as React.CSSProperties,\n title: {\n fontSize: '16px',\n fontWeight: 600,\n color: 'var(--color-text-primary)',\n margin: 0,\n } as React.CSSProperties,\n description: {\n fontSize: '13px',\n color: 'var(--color-text-secondary)',\n margin: '4px 0 0 0',\n } as React.CSSProperties,\n content: {\n padding: '20px 24px',\n } as React.CSSProperties,\n dataSinkName: {\n fontSize: '14px',\n fontWeight: 500,\n color: 'var(--color-text-primary)',\n margin: 0,\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n whiteSpace: 'nowrap',\n } as React.CSSProperties,\n optionItem: {\n display: 'flex',\n alignItems: 'flex-start',\n gap: '12px',\n width: '100%',\n textAlign: 'left',\n padding: '12px',\n borderRadius: 'var(--radius-card)',\n marginBottom: '8px',\n backgroundColor: 'var(--color-bg-sunken)',\n border: '1px solid var(--color-border)',\n cursor: 'pointer',\n } as React.CSSProperties,\n // The selected row used to paint its whole background with the primary action\n // colour, making it by far the loudest selected state in the module. A subtle\n // accent wash plus an accent border reads as \"chosen\" without shouting.\n optionItemActive: {\n backgroundColor: 'var(--color-bg-accentSubtle)',\n borderColor: 'var(--color-action-primary-bg)',\n } as React.CSSProperties,\n checkbox: {\n width: '20px',\n height: '20px',\n borderRadius: '4px',\n border: '2px solid var(--color-border)',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n flexShrink: 0,\n marginTop: '2px',\n transition: 'all 0.15s ease',\n cursor: 'pointer',\n } as React.CSSProperties,\n checkboxChecked: {\n backgroundColor: 'var(--color-action-primary-bg)',\n borderColor: 'var(--color-action-primary-bg)',\n } as React.CSSProperties,\n optionText: {\n flex: 1,\n } as React.CSSProperties,\n optionLabel: {\n fontSize: '14px',\n fontWeight: 500,\n color: 'var(--color-text-primary)',\n margin: 0,\n } as React.CSSProperties,\n optionDescription: {\n fontSize: '12px',\n color: 'var(--color-text-secondary)',\n margin: '4px 0 0 0',\n } as React.CSSProperties,\n errorText: {\n fontSize: '13px',\n color: 'var(--color-status-error-text)',\n margin: 0,\n } as React.CSSProperties,\n footer: {\n display: 'flex',\n flexWrap: 'wrap',\n justifyContent: 'flex-end',\n gap: '12px',\n padding: '16px 24px',\n borderTop: '1px solid var(--color-border)',\n backgroundColor: 'var(--color-bg-sunken)',\n } as React.CSSProperties,\n};\n\n/**\n * Footer buttons. Hover used to be JS-driven (`onMouseEnter` mutating inline\n * style), which sticks after a tap on touch devices and cannot express a focus\n * ring; these are CSS classes instead.\n */\nconst FOOTER_BUTTON =\n `inline-flex min-h-[var(--size-controlHeight-md)] items-center gap-2 rounded-button px-5 py-2 text-sm font-medium motion-safe:transition-colors ${SECTION_FOCUS_RING}` as const;\n\n// ============================================================================\n// Custom Checkbox Component\n// ============================================================================\n\ninterface CustomCheckboxProps {\n checked: boolean;\n onChange: (checked: boolean) => void;\n disabled?: boolean;\n label: string;\n description: string;\n}\n\nconst CustomCheckbox: FC<CustomCheckboxProps> = memo(function CustomCheckbox({\n checked,\n onChange,\n disabled,\n label,\n description,\n}) {\n return (\n <button\n type=\"button\"\n role=\"checkbox\"\n aria-checked={checked}\n disabled={disabled}\n className={SECTION_FOCUS_RING}\n style={{\n ...styles.optionItem,\n ...(checked ? styles.optionItemActive : {}),\n opacity: disabled ? 0.6 : 1,\n cursor: disabled ? 'not-allowed' : 'pointer',\n }}\n onClick={() => !disabled && onChange(!checked)}\n >\n <span\n aria-hidden=\"true\"\n style={{\n ...styles.checkbox,\n ...(checked ? styles.checkboxChecked : {}),\n }}\n >\n {checked && <Check style={{ width: '14px', height: '14px', color: 'var(--color-action-primary-text)' }} />}\n </span>\n <span style={styles.optionText}>\n <span style={{ ...styles.optionLabel, display: 'block' }}>{label}</span>\n <span style={{ ...styles.optionDescription, display: 'block' }}>{description}</span>\n </span>\n </button>\n );\n});\n\n// ============================================================================\n// Component\n// ============================================================================\n\nexport const ExportDataSinkDialog: FC<ExportDataSinkDialogProps> = memo(function ExportDataSinkDialog({\n isOpen,\n dataSinkId,\n dataSinkName,\n onClose,\n onSuccess,\n}) {\n const [prettyPrint, setPrettyPrint] = useState(true);\n\n const { loading, error, downloadDataSink, clearError } = useExportDataSink();\n\n // Reset state when dialog opens\n useEffect(() => {\n if (isOpen) {\n setPrettyPrint(true);\n clearError();\n }\n }, [isOpen, clearError]);\n\n // Handle export\n const handleExport = useCallback(async () => {\n if (!dataSinkId) return;\n\n const options: ExportDataSinkOptions = {\n prettyPrint,\n };\n\n const success = await downloadDataSink(dataSinkId, dataSinkName, options);\n\n if (success) {\n onSuccess?.();\n onClose();\n }\n }, [dataSinkId, dataSinkName, prettyPrint, downloadDataSink, onSuccess, onClose]);\n\n // Don't render if no DataSink\n if (!dataSinkId) return null;\n\n return (\n <Dialog open={isOpen} onOpenChange={(open) => !open && !loading && onClose()}>\n <DialogContent style={styles.dialogContent}>\n {/* Header */}\n <div style={styles.header}>\n <div style={styles.iconWrapper}>\n <FileJson style={{ width: '22px', height: '22px' }} />\n </div>\n <div style={styles.headerText}>\n <DialogTitle asChild>\n <h2 style={styles.title}>Export DataSink</h2>\n </DialogTitle>\n <DialogDescription asChild>\n <p style={styles.description}>Export your DataSink configuration to a JSON file.</p>\n </DialogDescription>\n </div>\n </div>\n\n {/* Content */}\n <div style={styles.content} className=\"space-y-form-gap\">\n {/* What is being exported — supporting detail. */}\n {dataSinkName && (\n <Section\n emphasis=\"muted\"\n padding=\"compact\"\n headingLevel={3}\n title=\"Exporting\"\n headerClassName=\"mb-control-gap\"\n >\n <p style={styles.dataSinkName}>{dataSinkName}</p>\n </Section>\n )}\n\n {/* Options */}\n <Section\n emphasis=\"bare\"\n padding=\"none\"\n headingLevel={3}\n title=\"Export options\"\n headerClassName=\"mb-control-gap\"\n >\n <CustomCheckbox\n checked={prettyPrint}\n onChange={setPrettyPrint}\n disabled={loading}\n label=\"Format JSON (pretty print)\"\n description=\"Makes the export file human-readable (larger file size)\"\n />\n </Section>\n\n {/* Error */}\n {error && (\n <Section tone=\"danger\" padding=\"compact\" headingLevel={3} title=\"Export failed\">\n <p style={styles.errorText}>{error.message}</p>\n </Section>\n )}\n </div>\n\n {/* Footer */}\n <div style={styles.footer}>\n <button\n type=\"button\"\n className={`${FOOTER_BUTTON} border border-[var(--color-border-default)] bg-bg-surface text-text-secondary hover:bg-bg-sunken`}\n onClick={onClose}\n disabled={loading}\n >\n Cancel\n </button>\n <button\n type=\"button\"\n className={`${FOOTER_BUTTON} bg-action-primary-bg text-action-primary-text hover:bg-action-primary-bgHover disabled:cursor-not-allowed disabled:opacity-50`}\n onClick={handleExport}\n disabled={loading}\n >\n {loading ? (\n <>\n <Spinner style={{ width: '16px', height: '16px' }} />\n Exporting...\n </>\n ) : (\n <>\n <Download style={{ width: '16px', height: '16px' }} />\n Download export\n </>\n )}\n </button>\n </div>\n </DialogContent>\n </Dialog>\n );\n});\n\nexport default ExportDataSinkDialog;\n"],"mappings":";;;;;;;;;;AAmCA,IAAM,IAAS;CACb,eAAe;EACb,UAAU;EACV,OAAO;EACP,SAAS;EACT,cAAc;EACd,UAAU;EACX;CACD,QAAQ;EACN,SAAS;EACT,YAAY;EACZ,KAAK;EACL,SAAS;EACT,cAAc;EACd,iBAAiB;EAClB;CACD,aAAa;EACX,OAAO;EACP,QAAQ;EACR,SAAS;EACT,YAAY;EACZ,gBAAgB;EAChB,cAAc;EACd,iBAAiB;EACjB,OAAO;EACP,YAAY;EACb;CACD,YAAY,EACV,MAAM,GACP;CACD,OAAO;EACL,UAAU;EACV,YAAY;EACZ,OAAO;EACP,QAAQ;EACT;CACD,aAAa;EACX,UAAU;EACV,OAAO;EACP,QAAQ;EACT;CACD,SAAS,EACP,SAAS,aACV;CACD,cAAc;EACZ,UAAU;EACV,YAAY;EACZ,OAAO;EACP,QAAQ;EACR,UAAU;EACV,cAAc;EACd,YAAY;EACb;CACD,YAAY;EACV,SAAS;EACT,YAAY;EACZ,KAAK;EACL,OAAO;EACP,WAAW;EACX,SAAS;EACT,cAAc;EACd,cAAc;EACd,iBAAiB;EACjB,QAAQ;EACR,QAAQ;EACT;CAID,kBAAkB;EAChB,iBAAiB;EACjB,aAAa;EACd;CACD,UAAU;EACR,OAAO;EACP,QAAQ;EACR,cAAc;EACd,QAAQ;EACR,SAAS;EACT,YAAY;EACZ,gBAAgB;EAChB,YAAY;EACZ,WAAW;EACX,YAAY;EACZ,QAAQ;EACT;CACD,iBAAiB;EACf,iBAAiB;EACjB,aAAa;EACd;CACD,YAAY,EACV,MAAM,GACP;CACD,aAAa;EACX,UAAU;EACV,YAAY;EACZ,OAAO;EACP,QAAQ;EACT;CACD,mBAAmB;EACjB,UAAU;EACV,OAAO;EACP,QAAQ;EACT;CACD,WAAW;EACT,UAAU;EACV,OAAO;EACP,QAAQ;EACT;CACD,QAAQ;EACN,SAAS;EACT,UAAU;EACV,gBAAgB;EAChB,KAAK;EACL,SAAS;EACT,WAAW;EACX,iBAAiB;EAClB;CACF,EAOK,IACJ,kJAAkJ,KAc9I,IAA0C,EAAK,SAAwB,EAC3E,YACA,aACA,aACA,UACA,kBACC;AACD,QACE,kBAAC,UAAD;EACE,MAAK;EACL,MAAK;EACL,gBAAc;EACJ;EACV,WAAW;EACX,OAAO;GACL,GAAG,EAAO;GACV,GAAI,IAAU,EAAO,mBAAmB,EAAE;GAC1C,SAAS,IAAW,KAAM;GAC1B,QAAQ,IAAW,gBAAgB;GACpC;EACD,eAAe,CAAC,KAAY,EAAS,CAAC,EAAQ;YAZhD,CAcE,kBAAC,QAAD;GACE,eAAY;GACZ,OAAO;IACL,GAAG,EAAO;IACV,GAAI,IAAU,EAAO,kBAAkB,EAAE;IAC1C;aAEA,KAAW,kBAAC,GAAD,EAAO,OAAO;IAAE,OAAO;IAAQ,QAAQ;IAAQ,OAAO;IAAoC,EAAI,CAAA;GACrG,CAAA,EACP,kBAAC,QAAD;GAAM,OAAO,EAAO;aAApB,CACE,kBAAC,QAAD;IAAM,OAAO;KAAE,GAAG,EAAO;KAAa,SAAS;KAAS;cAAG;IAAa,CAAA,EACxE,kBAAC,QAAD;IAAM,OAAO;KAAE,GAAG,EAAO;KAAmB,SAAS;KAAS;cAAG;IAAmB,CAAA,CAC/E;KACA;;EAEX,EAMW,IAAsD,EAAK,SAA8B,EACpG,WACA,eACA,iBACA,YACA,gBACC;CACD,IAAM,CAAC,GAAa,KAAkB,EAAS,GAAK,EAE9C,EAAE,YAAS,UAAO,qBAAkB,kBAAe,GAAmB;AAG5E,SAAgB;AACd,EAAI,MACF,EAAe,GAAK,EACpB,GAAY;IAEb,CAAC,GAAQ,EAAW,CAAC;CAGxB,IAAM,IAAe,EAAY,YAAY;AACtC,OAMW,MAAM,EAAiB,GAAY,GAJZ,EACrC,gBACD,CAEwE,KAGvE,KAAa,EACb,GAAS;IAEV;EAAC;EAAY;EAAc;EAAa;EAAkB;EAAW;EAAQ,CAAC;AAKjF,QAFK,IAGH,kBAAC,GAAD;EAAQ,MAAM;EAAQ,eAAe,MAAS,CAAC,KAAQ,CAAC,KAAW,GAAS;YAC1E,kBAAC,GAAD;GAAe,OAAO,EAAO;aAA7B;IAEE,kBAAC,OAAD;KAAK,OAAO,EAAO;eAAnB,CACE,kBAAC,OAAD;MAAK,OAAO,EAAO;gBACjB,kBAAC,GAAD,EAAU,OAAO;OAAE,OAAO;OAAQ,QAAQ;OAAQ,EAAI,CAAA;MAClD,CAAA,EACN,kBAAC,OAAD;MAAK,OAAO,EAAO;gBAAnB,CACE,kBAAC,GAAD;OAAa,SAAA;iBACX,kBAAC,MAAD;QAAI,OAAO,EAAO;kBAAO;QAAoB,CAAA;OACjC,CAAA,EACd,kBAAC,GAAD;OAAmB,SAAA;iBACjB,kBAAC,KAAD;QAAG,OAAO,EAAO;kBAAa;QAAsD,CAAA;OAClE,CAAA,CAChB;QACF;;IAGN,kBAAC,OAAD;KAAK,OAAO,EAAO;KAAS,WAAU;eAAtC;MAEG,KACC,kBAAC,GAAD;OACE,UAAS;OACT,SAAQ;OACR,cAAc;OACd,OAAM;OACN,iBAAgB;iBAEhB,kBAAC,KAAD;QAAG,OAAO,EAAO;kBAAe;QAAiB,CAAA;OACzC,CAAA;MAIZ,kBAAC,GAAD;OACE,UAAS;OACT,SAAQ;OACR,cAAc;OACd,OAAM;OACN,iBAAgB;iBAEhB,kBAAC,GAAD;QACE,SAAS;QACT,UAAU;QACV,UAAU;QACV,OAAM;QACN,aAAY;QACZ,CAAA;OACM,CAAA;MAGT,KACC,kBAAC,GAAD;OAAS,MAAK;OAAS,SAAQ;OAAU,cAAc;OAAG,OAAM;iBAC9D,kBAAC,KAAD;QAAG,OAAO,EAAO;kBAAY,EAAM;QAAY,CAAA;OACvC,CAAA;MAER;;IAGN,kBAAC,OAAD;KAAK,OAAO,EAAO;eAAnB,CACE,kBAAC,UAAD;MACE,MAAK;MACL,WAAW,GAAG,EAAc;MAC5B,SAAS;MACT,UAAU;gBACX;MAEQ,CAAA,EACT,kBAAC,UAAD;MACE,MAAK;MACL,WAAW,GAAG,EAAc;MAC5B,SAAS;MACT,UAAU;gBAET,IACC,kBAAA,GAAA,EAAA,UAAA,CACE,kBAAC,GAAD,EAAS,OAAO;OAAE,OAAO;OAAQ,QAAQ;OAAQ,EAAI,CAAA,EAAA,eAEpD,EAAA,CAAA,GAEH,kBAAA,GAAA,EAAA,UAAA,CACE,kBAAC,GAAD,EAAU,OAAO;OAAE,OAAO;OAAQ,QAAQ;OAAQ,EAAI,CAAA,EAAA,kBAErD,EAAA,CAAA;MAEE,CAAA,CACL;;IACQ;;EACT,CAAA,GA1Fa;EA4FxB"}