@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":"PipelineDeleteDialog.js","names":[],"sources":["../../../../src/bigconsole/components/pipeline/PipelineDeleteDialog.tsx"],"sourcesContent":["/**\n * PipelineDeleteDialog Component\n *\n * Confirmation dialog for deleting a Pipeline.\n * Shows warning about stages before deletion.\n */\n\nimport { memo, useCallback } from 'react';\nimport type { Pipeline } from '../../types';\n\n// ============================================================================\n// TYPES\n// ============================================================================\n\ninterface PipelineDeleteDialogProps {\n pipeline: Pipeline;\n isOpen: boolean;\n onClose: () => void;\n onConfirm: () => void | Promise<void>;\n}\n\n// ============================================================================\n// ICONS\n// ============================================================================\n\nconst WarningIcon = ({ className }: { className?: string }) => (\n <svg className={className} fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M12 9v2m0 4h.01m-6.938 4h13.856c1.54 0 2.502-1.667 1.732-3L13.732 4c-.77-1.333-2.694-1.333-3.464 0L3.34 16c-.77 1.333.192 3 1.732 3z\"\n />\n </svg>\n);\n\n// ============================================================================\n// COMPONENT\n// ============================================================================\n\nexport const PipelineDeleteDialog = memo(function PipelineDeleteDialog({\n pipeline,\n isOpen,\n onClose,\n onConfirm,\n}: PipelineDeleteDialogProps) {\n // Calculate stage count\n const stageCount = pipeline.stages?.length ?? 0;\n\n // Event handlers\n const handleBackdropClick = useCallback(() => {\n onClose();\n }, [onClose]);\n\n const handleConfirmClick = useCallback(() => {\n onConfirm();\n }, [onConfirm]);\n\n // Don't render if not open\n if (!isOpen) {\n return null;\n }\n\n return (\n <div className=\"fixed inset-0 z-50 flex items-center justify-center\">\n {/* Backdrop */}\n <div className=\"absolute inset-0 bg-black/50\" onClick={handleBackdropClick} />\n\n {/* Dialog */}\n <div className=\"relative bg-bg-surface rounded-lg shadow-xl max-w-md w-full mx-4 p-6\">\n {/* Header */}\n <div className=\"flex items-center gap-3 mb-4\">\n <div className=\"p-2 rounded-full bg-status-error-bg/10\">\n <WarningIcon className=\"w-6 h-6 text-status-error-text\" />\n </div>\n <h2 className=\"text-lg font-semibold text-text-primary\">Delete Pipeline</h2>\n </div>\n\n {/* Content */}\n <div className=\"mb-6\">\n <p className=\"text-sm text-text-secondary mb-3\">\n Are you sure you want to delete the pipeline{' '}\n <span className=\"font-medium text-text-primary\">{pipeline.name}</span>?\n </p>\n\n {/* Warning about stages */}\n {stageCount > 0 && (\n <div className=\"p-3 bg-status-warning-bg/10 rounded-md\">\n <p className=\"text-sm text-status-warning-text\">\n This pipeline has {stageCount} stage{stageCount !== 1 ? 's' : ''}. All stages will be permanently\n deleted.\n </p>\n </div>\n )}\n\n <p className=\"text-sm text-text-secondary mt-3\">This action cannot be undone.</p>\n </div>\n\n {/* Actions */}\n <div className=\"flex justify-end gap-3\">\n <button\n type=\"button\"\n onClick={onClose}\n className=\"\n px-4 py-2\n text-sm font-medium\n text-text-primary\n bg-bg-sunken\n hover:bg-border-default\n rounded-md\n transition-colors\n \"\n >\n Cancel\n </button>\n <button\n type=\"button\"\n onClick={handleConfirmClick}\n className=\"\n px-4 py-2\n text-sm font-medium\n text-white\n bg-status-error-bg\n hover:bg-status-error-bg/90\n rounded-md\n transition-colors\n \"\n >\n Delete Pipeline\n </button>\n </div>\n </div>\n </div>\n );\n});\n\nexport default PipelineDeleteDialog;\n"],"mappings":";;;AAyBA,IAAM,KAAe,EAAE,mBACrB,kBAAC,OAAD;CAAgB;CAAW,MAAK;CAAO,QAAO;CAAe,SAAQ;WACnE,kBAAC,QAAD;EACE,eAAc;EACd,gBAAe;EACf,aAAa;EACb,GAAE;EACF,CAAA;CACE,CAAA,EAOK,IAAuB,EAAK,SAA8B,EACrE,aACA,WACA,YACA,gBAC4B;CAE5B,IAAM,IAAa,EAAS,QAAQ,UAAU,GAGxC,IAAsB,QAAkB;AAC5C,KAAS;IACR,CAAC,EAAQ,CAAC,EAEP,IAAqB,QAAkB;AAC3C,KAAW;IACV,CAAC,EAAU,CAAC;AAOf,QAJK,IAKH,kBAAC,OAAD;EAAK,WAAU;YAAf,CAEE,kBAAC,OAAD;GAAK,WAAU;GAA+B,SAAS;GAAuB,CAAA,EAG9E,kBAAC,OAAD;GAAK,WAAU;aAAf;IAEE,kBAAC,OAAD;KAAK,WAAU;eAAf,CACE,kBAAC,OAAD;MAAK,WAAU;gBACb,kBAAC,GAAD,EAAa,WAAU,kCAAmC,CAAA;MACtD,CAAA,EACN,kBAAC,MAAD;MAAI,WAAU;gBAA0C;MAAoB,CAAA,CACxE;;IAGN,kBAAC,OAAD;KAAK,WAAU;eAAf;MACE,kBAAC,KAAD;OAAG,WAAU;iBAAb;QAAgD;QACD;QAC7C,kBAAC,QAAD;SAAM,WAAU;mBAAiC,EAAS;SAAY,CAAA;;QACpE;;MAGH,IAAa,KACZ,kBAAC,OAAD;OAAK,WAAU;iBACb,kBAAC,KAAD;QAAG,WAAU;kBAAb;SAAgD;SAC3B;SAAW;SAAO,MAAe,IAAU,KAAN;SAAS;SAE/D;;OACA,CAAA;MAGR,kBAAC,KAAD;OAAG,WAAU;iBAAmC;OAAiC,CAAA;MAC7E;;IAGN,kBAAC,OAAD;KAAK,WAAU;eAAf,CACE,kBAAC,UAAD;MACE,MAAK;MACL,SAAS;MACT,WAAU;gBASX;MAEQ,CAAA,EACT,kBAAC,UAAD;MACE,MAAK;MACL,SAAS;MACT,WAAU;gBASX;MAEQ,CAAA,CACL;;IACF;KACF;MAxEC;EA0ET"}
1
+ {"version":3,"file":"PipelineDeleteDialog.js","names":[],"sources":["../../../../src/bigconsole/components/pipeline/PipelineDeleteDialog.tsx"],"sourcesContent":["/**\n * PipelineDeleteDialog Component\n *\n * Confirmation dialog for deleting a Pipeline.\n * Shows warning about stages before deletion.\n *\n * BOFF-5635: this is a hand-rolled overlay (not fe-libs `Dialog`), so the\n * hierarchy work here is: a real `role=\"dialog\"` labelled by its heading, the\n * raw `bg-black/50` backdrop replaced with `--color-bg-overlay`, the stage-loss\n * warning promoted from a tinted paragraph to a `tone=\"warning\"` Section, and a\n * separated actions zone whose destructive commit reads as destructive.\n *\n * `aria-modal=\"true\"` hides the rest of the page from assistive tech, so this\n * overlay has to own the whole focus contract, not just the label:\n * - on open, focus moves to Cancel — the least-destructive control, so a\n * stray Enter/Space dismisses instead of deleting;\n * - Tab / Shift+Tab cycle inside the panel while it is open (the browser\n * still tabs into `aria-hidden` content otherwise);\n * - on close, focus returns to whatever opened the dialog;\n * - Escape still closes.\n *\n * It stays hand-rolled rather than migrating to the fe-libs `Dialog` /\n * `AlertDialog` primitives: those wrap Radix and would fix focus for free, but\n * their `DialogContent` ships `bg-bg-elevated`, `backdrop-blur-sm`, `p-6`,\n * `gap-4`, `sm:max-w-lg`, a close \"X\" and un-guarded `animate-in` / `zoom-in-95`\n * entry animation. That is a visual change and a new animation with no\n * `motion-safe` guard, and it would split this dialog from its two siblings\n * (WorkflowDeleteDialog, DataSinkDeleteDialog) which use exactly this markup.\n * The focus contract below is the same one Radix implements, scoped to this panel.\n */\n\nimport { memo, useCallback, useId, useRef } from 'react';\nimport { Button } from '@burdenoff/fe-libs/ui';\nimport { Section } from '../common';\nimport { useModalFocusTrap } from '../../hooks/useModalFocusTrap';\nimport type { Pipeline } from '../../types';\n\n// ============================================================================\n// TYPES\n// ============================================================================\n\ninterface PipelineDeleteDialogProps {\n pipeline: Pipeline;\n isOpen: boolean;\n onClose: () => void;\n onConfirm: () => void | Promise<void>;\n}\n\n// ============================================================================\n// FOCUS TRAP HELPERS\n// ============================================================================\n\n// ============================================================================\n// ICONS\n// ============================================================================\n\nconst WarningIcon = ({ className }: { className?: string }) => (\n <svg className={className} fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M12 9v2m0 4h.01m-6.938 4h13.856c1.54 0 2.502-1.667 1.732-3L13.732 4c-.77-1.333-2.694-1.333-3.464 0L3.34 16c-.77 1.333.192 3 1.732 3z\"\n />\n </svg>\n);\n\n// ============================================================================\n// COMPONENT\n// ============================================================================\n\nexport const PipelineDeleteDialog = memo(function PipelineDeleteDialog({\n pipeline,\n isOpen,\n onClose,\n onConfirm,\n}: PipelineDeleteDialogProps) {\n // Calculate stage count\n const stageCount = pipeline.stages?.length ?? 0;\n const titleId = useId();\n const descriptionId = useId();\n const panelRef = useRef<HTMLDivElement | null>(null);\n const cancelRef = useRef<HTMLButtonElement | null>(null);\n\n // Event handlers\n const handleBackdropClick = useCallback(() => {\n onClose();\n }, [onClose]);\n\n const handleConfirmClick = useCallback(() => {\n onConfirm();\n }, [onConfirm]);\n\n useModalFocusTrap({ isOpen, panelRef, onClose, initialFocusRef: cancelRef });\n\n // Don't render if not open\n if (!isOpen) {\n return null;\n }\n\n return (\n <div className=\"fixed inset-0 z-50 flex items-center justify-center p-4\">\n {/* Backdrop */}\n <div aria-hidden=\"true\" className=\"absolute inset-0 bg-[var(--color-bg-overlay)]\" onClick={handleBackdropClick} />\n\n {/* Dialog */}\n <div\n ref={panelRef}\n role=\"dialog\"\n aria-modal=\"true\"\n aria-labelledby={titleId}\n aria-describedby={descriptionId}\n tabIndex={-1}\n data-testid=\"pipeline-delete-dialog\"\n className=\"relative flex max-h-[calc(100dvh-2rem)] w-full max-w-md min-w-0 flex-col gap-form-gap overflow-y-auto rounded-card border border-[var(--color-border-subtle)] bg-bg-surface p-card-padding shadow-[var(--shadow-elevation-4)] focus:outline-none\"\n >\n {/* Header */}\n <div className=\"flex items-center gap-icon-gap\">\n <span aria-hidden=\"true\" className=\"rounded-pill bg-[var(--color-status-error-bgSubtle)] p-2\">\n <WarningIcon className=\"h-icon-md w-icon-md text-status-error-text\" />\n </span>\n <h2 id={titleId} className=\"text-lg font-semibold text-text-primary\">\n Delete Pipeline\n </h2>\n </div>\n\n {/* Content */}\n <div className=\"flex min-w-0 flex-col gap-form-gap\">\n <p id={descriptionId} className=\"text-sm text-text-secondary\">\n Are you sure you want to delete the pipeline{' '}\n <span className=\"font-medium text-text-primary\">{pipeline.name}</span>? This action cannot be undone.\n </p>\n\n {/* Warning about stages */}\n {stageCount > 0 && (\n <Section\n tone=\"warning\"\n padding=\"compact\"\n headingLevel={3}\n title={`${stageCount} stage${stageCount !== 1 ? 's' : ''} will be deleted`}\n icon={<WarningIcon className=\"h-icon-sm w-icon-sm\" />}\n data-testid=\"pipeline-delete-stage-warning\"\n >\n <p className=\"text-sm text-text-secondary\">\n Every stage in this pipeline is removed with it. The parsers themselves are not deleted.\n </p>\n </Section>\n )}\n </div>\n\n {/* Actions */}\n <div className=\"flex flex-wrap justify-end gap-control-gap border-t border-[var(--color-border-subtle)] pt-form-gap\">\n <Button ref={cancelRef} type=\"button\" variant=\"secondary\" onClick={onClose}>\n Cancel\n </Button>\n <Button type=\"button\" variant=\"destructive\" onClick={handleConfirmClick}>\n Delete Pipeline\n </Button>\n </div>\n </div>\n </div>\n );\n});\n\nexport default PipelineDeleteDialog;\n"],"mappings":";;;;;;;AAwDA,IAAM,KAAe,EAAE,mBACrB,kBAAC,OAAD;CAAgB;CAAW,MAAK;CAAO,QAAO;CAAe,SAAQ;WACnE,kBAAC,QAAD;EACE,eAAc;EACd,gBAAe;EACf,aAAa;EACb,GAAE;EACF,CAAA;CACE,CAAA,EAOK,IAAuB,EAAK,SAA8B,EACrE,aACA,WACA,YACA,gBAC4B;CAE5B,IAAM,IAAa,EAAS,QAAQ,UAAU,GACxC,IAAU,GAAO,EACjB,IAAgB,GAAO,EACvB,IAAW,EAA8B,KAAK,EAC9C,IAAY,EAAiC,KAAK,EAGlD,IAAsB,QAAkB;AAC5C,KAAS;IACR,CAAC,EAAQ,CAAC,EAEP,IAAqB,QAAkB;AAC3C,KAAW;IACV,CAAC,EAAU,CAAC;AASf,QAPA,EAAkB;EAAE;EAAQ;EAAU;EAAS,iBAAiB;EAAW,CAAC,EAGvE,IAKH,kBAAC,OAAD;EAAK,WAAU;YAAf,CAEE,kBAAC,OAAD;GAAK,eAAY;GAAO,WAAU;GAAgD,SAAS;GAAuB,CAAA,EAGlH,kBAAC,OAAD;GACE,KAAK;GACL,MAAK;GACL,cAAW;GACX,mBAAiB;GACjB,oBAAkB;GAClB,UAAU;GACV,eAAY;GACZ,WAAU;aARZ;IAWE,kBAAC,OAAD;KAAK,WAAU;eAAf,CACE,kBAAC,QAAD;MAAM,eAAY;MAAO,WAAU;gBACjC,kBAAC,GAAD,EAAa,WAAU,8CAA+C,CAAA;MACjE,CAAA,EACP,kBAAC,MAAD;MAAI,IAAI;MAAS,WAAU;gBAA0C;MAEhE,CAAA,CACD;;IAGN,kBAAC,OAAD;KAAK,WAAU;eAAf,CACE,kBAAC,KAAD;MAAG,IAAI;MAAe,WAAU;gBAAhC;OAA8D;OACf;OAC7C,kBAAC,QAAD;QAAM,WAAU;kBAAiC,EAAS;QAAY,CAAA;;OACpE;SAGH,IAAa,KACZ,kBAAC,GAAD;MACE,MAAK;MACL,SAAQ;MACR,cAAc;MACd,OAAO,GAAG,EAAW,QAAQ,MAAe,IAAU,KAAN,IAAS;MACzD,MAAM,kBAAC,GAAD,EAAa,WAAU,uBAAwB,CAAA;MACrD,eAAY;gBAEZ,kBAAC,KAAD;OAAG,WAAU;iBAA8B;OAEvC,CAAA;MACI,CAAA,CAER;;IAGN,kBAAC,OAAD;KAAK,WAAU;eAAf,CACE,kBAAC,GAAD;MAAQ,KAAK;MAAW,MAAK;MAAS,SAAQ;MAAY,SAAS;gBAAS;MAEnE,CAAA,EACT,kBAAC,GAAD;MAAQ,MAAK;MAAS,SAAQ;MAAc,SAAS;gBAAoB;MAEhE,CAAA,CACL;;IACF;KACF;MA/DC;EAiET"}
@@ -4,29 +4,26 @@ import { jsx as t } from "react/jsx-runtime";
4
4
  var n = {
5
5
  draft: {
6
6
  label: "Draft",
7
- className: "bg-bg-sunken text-text-secondary"
7
+ className: "bg-bg-sunken text-text-secondary border-[var(--color-border-subtle)]"
8
8
  },
9
9
  active: {
10
10
  label: "Active",
11
- className: "bg-status-success-bg/10 text-status-success-text"
11
+ className: "bg-[var(--color-status-success-bgSubtle)] text-status-success-text border-[var(--color-status-success-border)]"
12
12
  },
13
13
  inactive: {
14
14
  label: "Inactive",
15
- className: "bg-status-warning-bg/10 text-status-warning-text"
15
+ className: "bg-[var(--color-status-warning-bgSubtle)] text-[var(--color-status-warning-text)] border-[var(--color-status-warning-border)]"
16
16
  },
17
17
  error: {
18
18
  label: "Error",
19
- className: "bg-status-error-bg/10 text-status-error-text"
19
+ className: "bg-[var(--color-status-error-bgSubtle)] text-status-error-text border-[var(--color-status-error-border)]"
20
20
  }
21
21
  }, r = e(function({ status: e, size: r = "md" }) {
22
22
  let i = n[e] || n.draft;
23
23
  return /* @__PURE__ */ t("span", {
24
- className: `
25
- inline-flex items-center
26
- font-medium rounded-md
27
- ${r === "sm" ? "px-1.5 py-0.5 text-xs" : "px-2 py-1 text-xs"}
28
- ${i.className}
29
- `,
24
+ "data-testid": "pipeline-status-badge",
25
+ "data-status": e,
26
+ className: `inline-flex shrink-0 items-center whitespace-nowrap rounded-pill border font-medium ${r === "sm" ? "px-2 py-0.5 text-xs" : "px-2.5 py-1 text-sm"} ${i.className}`,
30
27
  children: i.label
31
28
  });
32
29
  });
@@ -1 +1 @@
1
- {"version":3,"file":"PipelineStatusBadge.js","names":[],"sources":["../../../../src/bigconsole/components/pipeline/PipelineStatusBadge.tsx"],"sourcesContent":["/**\n * PipelineStatusBadge Component\n *\n * Displays the status of a Pipeline with appropriate styling.\n */\n\nimport { memo } from 'react';\nimport type { PipelineStatus } from '../../types';\n\n// ============================================================================\n// TYPES\n// ============================================================================\n\ninterface PipelineStatusBadgeProps {\n status: PipelineStatus;\n size?: 'sm' | 'md';\n}\n\n// ============================================================================\n// STATUS CONFIG\n// ============================================================================\n\nconst STATUS_CONFIG: Record<PipelineStatus, { label: string; className: string }> = {\n draft: {\n label: 'Draft',\n className: 'bg-bg-sunken text-text-secondary',\n },\n active: {\n label: 'Active',\n className: 'bg-status-success-bg/10 text-status-success-text',\n },\n inactive: {\n label: 'Inactive',\n className: 'bg-status-warning-bg/10 text-status-warning-text',\n },\n error: {\n label: 'Error',\n className: 'bg-status-error-bg/10 text-status-error-text',\n },\n};\n\n// ============================================================================\n// COMPONENT\n// ============================================================================\n\nexport const PipelineStatusBadge = memo(function PipelineStatusBadge({\n status,\n size = 'md',\n}: PipelineStatusBadgeProps) {\n const config = STATUS_CONFIG[status] || STATUS_CONFIG.draft;\n\n const sizeClasses = size === 'sm' ? 'px-1.5 py-0.5 text-xs' : 'px-2 py-1 text-xs';\n\n return (\n <span\n className={`\n inline-flex items-center\n font-medium rounded-md\n ${sizeClasses}\n ${config.className}\n `}\n >\n {config.label}\n </span>\n );\n});\n\nexport default PipelineStatusBadge;\n"],"mappings":";;;AAsBA,IAAM,IAA8E;CAClF,OAAO;EACL,OAAO;EACP,WAAW;EACZ;CACD,QAAQ;EACN,OAAO;EACP,WAAW;EACZ;CACD,UAAU;EACR,OAAO;EACP,WAAW;EACZ;CACD,OAAO;EACL,OAAO;EACP,WAAW;EACZ;CACF,EAMY,IAAsB,EAAK,SAA6B,EACnE,WACA,UAAO,QACoB;CAC3B,IAAM,IAAS,EAAc,MAAW,EAAc;AAItD,QACE,kBAAC,QAAD;EACE,WAAW;;;UAJK,MAAS,OAAO,0BAA0B,oBAO1C;UACZ,EAAO,UAAU;;YAGpB,EAAO;EACH,CAAA;EAET"}
1
+ {"version":3,"file":"PipelineStatusBadge.js","names":[],"sources":["../../../../src/bigconsole/components/pipeline/PipelineStatusBadge.tsx"],"sourcesContent":["/**\n * PipelineStatusBadge Component\n *\n * Displays the status of a Pipeline with appropriate styling.\n *\n * BOFF-5635: the fills used to be `bg-status-*-bg/10`, which is almost invisible\n * against `bg-bg-surface` — the chip carried no signal at a glance. Each status\n * now uses its own `bgSubtle` fill plus a matching border, and `md` steps up to\n * `text-sm` so the badge holds its own next to a page `h1`.\n */\n\nimport { memo } from 'react';\nimport type { PipelineStatus } from '../../types';\n\n// ============================================================================\n// TYPES\n// ============================================================================\n\ninterface PipelineStatusBadgeProps {\n status: PipelineStatus;\n size?: 'sm' | 'md';\n}\n\n// ============================================================================\n// STATUS CONFIG\n// ============================================================================\n\nconst STATUS_CONFIG: Record<PipelineStatus, { label: string; className: string }> = {\n draft: {\n label: 'Draft',\n className: 'bg-bg-sunken text-text-secondary border-[var(--color-border-subtle)]',\n },\n active: {\n label: 'Active',\n className:\n 'bg-[var(--color-status-success-bgSubtle)] text-status-success-text border-[var(--color-status-success-border)]',\n },\n inactive: {\n label: 'Inactive',\n className:\n 'bg-[var(--color-status-warning-bgSubtle)] text-[var(--color-status-warning-text)] border-[var(--color-status-warning-border)]',\n },\n error: {\n label: 'Error',\n className:\n 'bg-[var(--color-status-error-bgSubtle)] text-status-error-text border-[var(--color-status-error-border)]',\n },\n};\n\n// ============================================================================\n// COMPONENT\n// ============================================================================\n\nexport const PipelineStatusBadge = memo(function PipelineStatusBadge({\n status,\n size = 'md',\n}: PipelineStatusBadgeProps) {\n const config = STATUS_CONFIG[status] || STATUS_CONFIG.draft;\n\n const sizeClasses = size === 'sm' ? 'px-2 py-0.5 text-xs' : 'px-2.5 py-1 text-sm';\n\n return (\n <span\n data-testid=\"pipeline-status-badge\"\n data-status={status}\n className={`inline-flex shrink-0 items-center whitespace-nowrap rounded-pill border font-medium ${sizeClasses} ${config.className}`}\n >\n {config.label}\n </span>\n );\n});\n\nexport default PipelineStatusBadge;\n"],"mappings":";;;AA2BA,IAAM,IAA8E;CAClF,OAAO;EACL,OAAO;EACP,WAAW;EACZ;CACD,QAAQ;EACN,OAAO;EACP,WACE;EACH;CACD,UAAU;EACR,OAAO;EACP,WACE;EACH;CACD,OAAO;EACL,OAAO;EACP,WACE;EACH;CACF,EAMY,IAAsB,EAAK,SAA6B,EACnE,WACA,UAAO,QACoB;CAC3B,IAAM,IAAS,EAAc,MAAW,EAAc;AAItD,QACE,kBAAC,QAAD;EACE,eAAY;EACZ,eAAa;EACb,WAAW,uFANK,MAAS,OAAO,wBAAwB,sBAMsD,GAAG,EAAO;YAEvH,EAAO;EACH,CAAA;EAET"}
@@ -8,20 +8,20 @@ import { useEffect as o, useRef as s, useState as c } from "react";
8
8
  import { Spinner as l } from "@burdenoff/fe-libs/ui";
9
9
  import { jsx as u, jsxs as d } from "react/jsx-runtime";
10
10
  //#region src/bigconsole/components/preview/AiPreviewContent.tsx
11
- var f = 4e3, p = 6e4;
12
- function m({ label: e }) {
11
+ var f = 4e3, p = 6e4, m = "flex min-h-[6rem] min-w-0 items-center justify-center gap-2 rounded-card bg-bg-sunken px-3 py-6 text-center text-sm text-text-muted";
12
+ function h({ label: e }) {
13
13
  return /* @__PURE__ */ d("div", {
14
- className: "flex items-center gap-2 px-1 py-8 text-sm text-text-muted",
15
- children: [/* @__PURE__ */ u(l, { className: "size-4" }), e]
14
+ className: m,
15
+ children: [/* @__PURE__ */ u(l, { className: "size-4 shrink-0" }), e]
16
16
  });
17
17
  }
18
- function h({ text: e }) {
18
+ function g({ text: e }) {
19
19
  return /* @__PURE__ */ u("p", {
20
- className: "px-1 py-8 text-sm text-text-muted",
20
+ className: m,
21
21
  children: e
22
22
  });
23
23
  }
24
- function g(e, t, n) {
24
+ function _(e, t, n) {
25
25
  let [r, i] = c(null), [a, l] = c(!0), u = s(e);
26
26
  return u.current = e, o(() => {
27
27
  if (!t) {
@@ -44,50 +44,49 @@ function g(e, t, n) {
44
44
  loading: a
45
45
  };
46
46
  }
47
- function _({ id: t, live: r }) {
48
- let { getDataSinkData: i } = n({ skipFetch: !0 }), { data: a, loading: o } = g(async () => {
47
+ function v({ id: t, live: r }) {
48
+ let { getDataSinkData: i } = n({ skipFetch: !0 }), { data: a, loading: o } = _(async () => {
49
49
  let e = await i({ id: t }, { limit: 50 });
50
50
  return e ? e.raw : null;
51
51
  }, t, r);
52
- return t ? o ? /* @__PURE__ */ u(m, { label: "Loading the data sink’s data…" }) : /* @__PURE__ */ u("div", {
52
+ return t ? o ? /* @__PURE__ */ u(h, { label: "Loading the data sink’s data…" }) : /* @__PURE__ */ u("div", {
53
53
  "data-testid": "ai-preview-content-datasink",
54
+ className: "min-w-0",
54
55
  children: /* @__PURE__ */ u(e, {
55
56
  data: a,
56
57
  maxHeight: "300px"
57
58
  })
58
- }) : /* @__PURE__ */ u(h, { text: "Waiting for the data sink to be created…" });
59
+ }) : /* @__PURE__ */ u(g, { text: "Waiting for the data sink to be created…" });
59
60
  }
60
- function v({ dashboardId: e }) {
61
+ function y({ dashboardId: e }) {
61
62
  return e ? /* @__PURE__ */ u("div", {
62
63
  "data-testid": "ai-preview-content-dashboard",
63
- className: "max-h-[340px] overflow-y-auto",
64
+ className: "min-w-0",
64
65
  children: /* @__PURE__ */ u(a, {
65
66
  dashboardId: e,
66
67
  params: {}
67
68
  })
68
- }) : /* @__PURE__ */ u(h, { text: "Waiting for the dashboard to be created…" });
69
+ }) : /* @__PURE__ */ u(g, { text: "Waiting for the dashboard to be created…" });
69
70
  }
70
- function y({ parserId: t, live: n }) {
71
- let { executeParser: i } = r({ skipFetch: !0 }), { data: a, loading: o } = g(async () => {
71
+ function b({ parserId: t, live: n }) {
72
+ let { executeParser: i } = r({ skipFetch: !0 }), { data: a, loading: o } = _(async () => {
72
73
  let e = await i(t ?? "");
73
74
  return e ? e.output : null;
74
75
  }, t, n);
75
- return t ? o ? /* @__PURE__ */ u(m, { label: "Running the parser…" }) : /* @__PURE__ */ d("div", {
76
+ return t ? o ? /* @__PURE__ */ u(h, { label: "Running the parser…" }) : /* @__PURE__ */ u("div", {
76
77
  "data-testid": "ai-preview-content-parser",
77
- children: [/* @__PURE__ */ u("p", {
78
- className: "mb-2 px-1 text-xs text-text-muted",
79
- children: "Parser output (transformed rows):"
80
- }), /* @__PURE__ */ u(e, {
78
+ className: "min-w-0",
79
+ children: /* @__PURE__ */ u(e, {
81
80
  data: a,
82
81
  maxHeight: "280px"
83
- })]
84
- }) : /* @__PURE__ */ u(h, { text: "No parser in this build — the rows were already shaped." });
82
+ })
83
+ }) : /* @__PURE__ */ u(g, { text: "No parser in this build — the rows were already shaped." });
85
84
  }
86
- function b(e) {
85
+ function x(e) {
87
86
  let t = e.toUpperCase();
88
- return t.includes("METRIC") || t.includes("KPI") || t.includes("CARD") || t.includes("STAT") ? 160 : t.includes("TABLE") || t.includes("LIST") ? 280 : 320;
87
+ return t.includes("METRIC") || t.includes("KPI") || t.includes("CARD") || t.includes("STAT") ? "min(160px, 40vh)" : t.includes("TABLE") || t.includes("LIST") ? "min(280px, 50vh)" : "min(320px, 50vh)";
89
88
  }
90
- function x({ dashboardId: e, live: n }) {
89
+ function S({ dashboardId: e, live: n }) {
91
90
  let { widgets: r, loading: a, refetch: c } = t(void 0, e, { skipFetch: !e }), l = s(c);
92
91
  return l.current = c, o(() => {
93
92
  if (!e) return;
@@ -95,12 +94,12 @@ function x({ dashboardId: e, live: n }) {
95
94
  !n || Date.now() - t > p || typeof document < "u" && document.visibilityState !== "visible" || l.current();
96
95
  }, f);
97
96
  return () => window.clearInterval(r);
98
- }, [e, n]), e ? a && r.length === 0 ? /* @__PURE__ */ u(m, { label: "Loading widgets…" }) : r.length === 0 ? /* @__PURE__ */ u(h, { text: "No widgets on this dashboard yet." }) : /* @__PURE__ */ u("div", {
97
+ }, [e, n]), e ? a && r.length === 0 ? /* @__PURE__ */ u(h, { label: "Loading widgets…" }) : r.length === 0 ? /* @__PURE__ */ u(g, { text: "No widgets on this dashboard yet." }) : /* @__PURE__ */ u("div", {
99
98
  "data-testid": "ai-preview-content-widget",
100
- className: "space-y-3",
99
+ className: "flex min-w-0 flex-col gap-list-gap",
101
100
  children: r.map((e) => /* @__PURE__ */ u("div", {
102
- className: "overflow-hidden rounded-md border border-border-subtle bg-bg-surface",
103
- style: { height: b(e.type) },
101
+ className: "min-w-0 overflow-hidden rounded-card border border-[var(--color-border-subtle)] bg-bg-canvas",
102
+ style: { height: x(e.type) },
104
103
  children: /* @__PURE__ */ u(i, {
105
104
  widget: e,
106
105
  isLoading: !1,
@@ -108,9 +107,9 @@ function x({ dashboardId: e, live: n }) {
108
107
  filterValues: {}
109
108
  })
110
109
  }, e.id))
111
- }) : /* @__PURE__ */ u(h, { text: "Waiting for the dashboard — widgets live on it." });
110
+ }) : /* @__PURE__ */ u(g, { text: "Waiting for the dashboard — widgets live on it." });
112
111
  }
113
112
  //#endregion
114
- export { v as DashboardContent, _ as DataSinkContent, y as ParserContent, x as WidgetsContent };
113
+ export { y as DashboardContent, v as DataSinkContent, b as ParserContent, S as WidgetsContent };
115
114
 
116
115
  //# sourceMappingURL=AiPreviewContent.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"AiPreviewContent.js","names":[],"sources":["../../../../src/bigconsole/components/preview/AiPreviewContent.tsx"],"sourcesContent":["/**\n * Live content renderers for the AI preview tabs.\n *\n * Each tab shows the REAL content of the entity the assistant just built —\n * the data sink's rows, the live dashboard, the parser's transformed output,\n * the rendered widget charts — not a list with an Open button. They reuse the\n * same components the real pages use (DataSinkTableViewer, DrilldownDashboard-\n * Renderer, WidgetWrapper) so what you see in the preview is what you get.\n *\n * These require Apollo + the BigConsole providers, which is why they live only\n * in the full AiPreviewPanel (mounted inside BigConsoleRoot), never in the\n * store-only app-shell mini panel.\n */\nimport { useEffect, useRef, useState } from 'react';\nimport { Spinner } from '@burdenoff/fe-libs/ui';\n\nimport { DataSinkTableViewer } from '../datasink/DataSinkTableViewer';\nimport { DrilldownDashboardRenderer } from '../DrilldownDashboardRenderer';\nimport { WidgetWrapper } from '../widgets/WidgetWrapper';\nimport { useDataSinkOperations } from '../../hooks/useDataSinkOperations';\nimport { useParserOperations } from '../../hooks/useParserOperations';\nimport { useWidgetOperations } from '../../hooks/useWidgetOperations';\n\n/** While the build is live, re-pull content on this cadence so it fills in. */\nconst CONTENT_POLL_MS = 4000;\n/** Stop the live re-pull after this long even if the turn is still running. */\nconst CONTENT_POLL_WINDOW_MS = 60_000;\n\nfunction CenteredSpinner({ label }: { label: string }) {\n return (\n <div className=\"flex items-center gap-2 px-1 py-8 text-sm text-text-muted\">\n <Spinner className=\"size-4\" />\n {label}\n </div>\n );\n}\n\nfunction Waiting({ text }: { text: string }) {\n return <p className=\"px-1 py-8 text-sm text-text-muted\">{text}</p>;\n}\n\n/**\n * Fetch-on-mount, then re-fetch every CONTENT_POLL_MS while `live`, bounded to\n * CONTENT_POLL_WINDOW_MS. Returns { data, loading, done }. `fetcher` must be\n * stable-ish; we hold it in a ref so the effect keys only on `key`/`live`.\n */\nfunction useLiveContent<T>(fetcher: () => Promise<T | null>, key: string | undefined, live: boolean) {\n const [data, setData] = useState<T | null>(null);\n const [loading, setLoading] = useState(true);\n const fetcherRef = useRef(fetcher);\n fetcherRef.current = fetcher;\n\n useEffect(() => {\n if (!key) {\n setLoading(false);\n return;\n }\n let cancelled = false;\n const startedAt = Date.now();\n const pull = async () => {\n const result = await fetcherRef.current();\n if (cancelled) return;\n if (result !== null && result !== undefined) setData(result);\n setLoading(false);\n };\n void pull();\n const intervalId = window.setInterval(() => {\n if (!live || Date.now() - startedAt > CONTENT_POLL_WINDOW_MS) return;\n if (typeof document !== 'undefined' && document.visibilityState !== 'visible') return;\n void pull();\n }, CONTENT_POLL_MS);\n return () => {\n cancelled = true;\n window.clearInterval(intervalId);\n };\n }, [key, live]);\n\n return { data, loading };\n}\n\nexport function DataSinkContent({ id, live }: { id?: string; live: boolean }) {\n const { getDataSinkData } = useDataSinkOperations({ skipFetch: true });\n const { data, loading } = useLiveContent(\n async () => {\n const res = await getDataSinkData({ id }, { limit: 50 });\n return res ? res.raw : null;\n },\n id,\n live\n );\n\n if (!id) return <Waiting text=\"Waiting for the data sink to be created…\" />;\n if (loading) return <CenteredSpinner label=\"Loading the data sink’s data…\" />;\n return (\n <div data-testid=\"ai-preview-content-datasink\">\n <DataSinkTableViewer data={data} maxHeight=\"300px\" />\n </div>\n );\n}\n\nexport function DashboardContent({ dashboardId }: { dashboardId?: string }) {\n if (!dashboardId) return <Waiting text=\"Waiting for the dashboard to be created…\" />;\n return (\n <div data-testid=\"ai-preview-content-dashboard\" className=\"max-h-[340px] overflow-y-auto\">\n <DrilldownDashboardRenderer dashboardId={dashboardId} params={{}} />\n </div>\n );\n}\n\nexport function ParserContent({ parserId, live }: { parserId?: string; live: boolean }) {\n const { executeParser } = useParserOperations({ skipFetch: true });\n const { data, loading } = useLiveContent(\n async () => {\n const res = await executeParser(parserId ?? '');\n return res ? res.output : null;\n },\n parserId,\n live\n );\n\n if (!parserId) return <Waiting text=\"No parser in this build — the rows were already shaped.\" />;\n if (loading) return <CenteredSpinner label=\"Running the parser…\" />;\n return (\n <div data-testid=\"ai-preview-content-parser\">\n <p className=\"mb-2 px-1 text-xs text-text-muted\">Parser output (transformed rows):</p>\n <DataSinkTableViewer data={data} maxHeight=\"280px\" />\n </div>\n );\n}\n\n/** Recharts needs a definite pixel height or it renders 0px tall. */\nfunction widgetBoxHeight(type: string): number {\n const t = type.toUpperCase();\n if (t.includes('METRIC') || t.includes('KPI') || t.includes('CARD') || t.includes('STAT')) return 160;\n if (t.includes('TABLE') || t.includes('LIST')) return 280;\n return 320;\n}\n\nexport function WidgetsContent({ dashboardId, live }: { dashboardId?: string; live: boolean }) {\n const { widgets, loading, refetch } = useWidgetOperations(undefined, dashboardId, {\n skipFetch: !dashboardId,\n });\n\n const refetchRef = useRef(refetch);\n refetchRef.current = refetch;\n useEffect(() => {\n if (!dashboardId) return;\n const startedAt = Date.now();\n const intervalId = window.setInterval(() => {\n if (!live || Date.now() - startedAt > CONTENT_POLL_WINDOW_MS) return;\n if (typeof document !== 'undefined' && document.visibilityState !== 'visible') return;\n void refetchRef.current();\n }, CONTENT_POLL_MS);\n return () => window.clearInterval(intervalId);\n }, [dashboardId, live]);\n\n if (!dashboardId) return <Waiting text=\"Waiting for the dashboard — widgets live on it.\" />;\n if (loading && widgets.length === 0) return <CenteredSpinner label=\"Loading widgets…\" />;\n if (widgets.length === 0) return <Waiting text=\"No widgets on this dashboard yet.\" />;\n\n return (\n <div data-testid=\"ai-preview-content-widget\" className=\"space-y-3\">\n {widgets.map((widget) => (\n <div\n key={widget.id}\n className=\"overflow-hidden rounded-md border border-border-subtle bg-bg-surface\"\n style={{ height: widgetBoxHeight(widget.type) }}\n >\n <WidgetWrapper widget={widget} isLoading={false} error={null} filterValues={{}} />\n </div>\n ))}\n </div>\n );\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"AiPreviewContent.js","names":[],"sources":["../../../../src/bigconsole/components/preview/AiPreviewContent.tsx"],"sourcesContent":["/**\n * Live content renderers for the AI preview tabs.\n *\n * Each tab shows the REAL content of the entity the assistant just built —\n * the data sink's rows, the live dashboard, the parser's transformed output,\n * the rendered widget charts — not a list with an Open button. They reuse the\n * same components the real pages use (DataSinkTableViewer, DrilldownDashboard-\n * Renderer, WidgetWrapper) so what you see in the preview is what you get.\n *\n * These require Apollo + the BigConsole providers, which is why they live only\n * in the full AiPreviewPanel (mounted inside BigConsoleRoot), never in the\n * store-only app-shell mini panel.\n */\nimport { useEffect, useRef, useState } from 'react';\nimport { Spinner } from '@burdenoff/fe-libs/ui';\n\nimport { DataSinkTableViewer } from '../datasink/DataSinkTableViewer';\nimport { DrilldownDashboardRenderer } from '../DrilldownDashboardRenderer';\nimport { WidgetWrapper } from '../widgets/WidgetWrapper';\nimport { useDataSinkOperations } from '../../hooks/useDataSinkOperations';\nimport { useParserOperations } from '../../hooks/useParserOperations';\nimport { useWidgetOperations } from '../../hooks/useWidgetOperations';\n\n/** While the build is live, re-pull content on this cadence so it fills in. */\nconst CONTENT_POLL_MS = 4000;\n/** Stop the live re-pull after this long even if the turn is still running. */\nconst CONTENT_POLL_WINDOW_MS = 60_000;\n\n/**\n * Loading and waiting states share one recessed, height-reserved block so the\n * panel does not jump every time a tab fills in — previously each tab had its\n * own bare paragraph and its own height.\n */\nconst PLACEHOLDER_BOX =\n 'flex min-h-[6rem] min-w-0 items-center justify-center gap-2 rounded-card bg-bg-sunken px-3 py-6 text-center text-sm text-text-muted';\n\nfunction CenteredSpinner({ label }: { label: string }) {\n return (\n <div className={PLACEHOLDER_BOX}>\n <Spinner className=\"size-4 shrink-0\" />\n {label}\n </div>\n );\n}\n\nfunction Waiting({ text }: { text: string }) {\n return <p className={PLACEHOLDER_BOX}>{text}</p>;\n}\n\n/**\n * Fetch-on-mount, then re-fetch every CONTENT_POLL_MS while `live`, bounded to\n * CONTENT_POLL_WINDOW_MS. Returns { data, loading, done }. `fetcher` must be\n * stable-ish; we hold it in a ref so the effect keys only on `key`/`live`.\n */\nfunction useLiveContent<T>(fetcher: () => Promise<T | null>, key: string | undefined, live: boolean) {\n const [data, setData] = useState<T | null>(null);\n const [loading, setLoading] = useState(true);\n const fetcherRef = useRef(fetcher);\n fetcherRef.current = fetcher;\n\n useEffect(() => {\n if (!key) {\n setLoading(false);\n return;\n }\n let cancelled = false;\n const startedAt = Date.now();\n const pull = async () => {\n const result = await fetcherRef.current();\n if (cancelled) return;\n if (result !== null && result !== undefined) setData(result);\n setLoading(false);\n };\n void pull();\n const intervalId = window.setInterval(() => {\n if (!live || Date.now() - startedAt > CONTENT_POLL_WINDOW_MS) return;\n if (typeof document !== 'undefined' && document.visibilityState !== 'visible') return;\n void pull();\n }, CONTENT_POLL_MS);\n return () => {\n cancelled = true;\n window.clearInterval(intervalId);\n };\n }, [key, live]);\n\n return { data, loading };\n}\n\nexport function DataSinkContent({ id, live }: { id?: string; live: boolean }) {\n const { getDataSinkData } = useDataSinkOperations({ skipFetch: true });\n const { data, loading } = useLiveContent(\n async () => {\n const res = await getDataSinkData({ id }, { limit: 50 });\n return res ? res.raw : null;\n },\n id,\n live\n );\n\n if (!id) return <Waiting text=\"Waiting for the data sink to be created…\" />;\n if (loading) return <CenteredSpinner label=\"Loading the data sink’s data…\" />;\n return (\n <div data-testid=\"ai-preview-content-datasink\" className=\"min-w-0\">\n <DataSinkTableViewer data={data} maxHeight=\"300px\" />\n </div>\n );\n}\n\nexport function DashboardContent({ dashboardId }: { dashboardId?: string }) {\n if (!dashboardId) return <Waiting text=\"Waiting for the dashboard to be created…\" />;\n // No inner `max-h + overflow-y-auto`: the panel already owns a vertical\n // scroll, and nesting a second one put two scrollbars in ~440px of space.\n return (\n <div data-testid=\"ai-preview-content-dashboard\" className=\"min-w-0\">\n <DrilldownDashboardRenderer dashboardId={dashboardId} params={{}} />\n </div>\n );\n}\n\nexport function ParserContent({ parserId, live }: { parserId?: string; live: boolean }) {\n const { executeParser } = useParserOperations({ skipFetch: true });\n const { data, loading } = useLiveContent(\n async () => {\n const res = await executeParser(parserId ?? '');\n return res ? res.output : null;\n },\n parserId,\n live\n );\n\n if (!parserId) return <Waiting text=\"No parser in this build — the rows were already shaped.\" />;\n if (loading) return <CenteredSpinner label=\"Running the parser…\" />;\n // The \"Parser output (transformed rows)\" caption used to sit here; it now\n // lives on the section header, so the tab does not label itself twice.\n return (\n <div data-testid=\"ai-preview-content-parser\" className=\"min-w-0\">\n <DataSinkTableViewer data={data} maxHeight=\"280px\" />\n </div>\n );\n}\n\n/**\n * Recharts needs a definite height or it renders 0px tall, but a hard 320px box\n * eats a short viewport whole. `min(px, vh)` keeps the definite height Recharts\n * needs while letting the box shrink on small screens.\n */\nfunction widgetBoxHeight(type: string): string {\n const t = type.toUpperCase();\n if (t.includes('METRIC') || t.includes('KPI') || t.includes('CARD') || t.includes('STAT')) return 'min(160px, 40vh)';\n if (t.includes('TABLE') || t.includes('LIST')) return 'min(280px, 50vh)';\n return 'min(320px, 50vh)';\n}\n\nexport function WidgetsContent({ dashboardId, live }: { dashboardId?: string; live: boolean }) {\n const { widgets, loading, refetch } = useWidgetOperations(undefined, dashboardId, {\n skipFetch: !dashboardId,\n });\n\n const refetchRef = useRef(refetch);\n refetchRef.current = refetch;\n useEffect(() => {\n if (!dashboardId) return;\n const startedAt = Date.now();\n const intervalId = window.setInterval(() => {\n if (!live || Date.now() - startedAt > CONTENT_POLL_WINDOW_MS) return;\n if (typeof document !== 'undefined' && document.visibilityState !== 'visible') return;\n void refetchRef.current();\n }, CONTENT_POLL_MS);\n return () => window.clearInterval(intervalId);\n }, [dashboardId, live]);\n\n if (!dashboardId) return <Waiting text=\"Waiting for the dashboard — widgets live on it.\" />;\n if (loading && widgets.length === 0) return <CenteredSpinner label=\"Loading widgets…\" />;\n if (widgets.length === 0) return <Waiting text=\"No widgets on this dashboard yet.\" />;\n\n return (\n <div data-testid=\"ai-preview-content-widget\" className=\"flex min-w-0 flex-col gap-list-gap\">\n {widgets.map((widget) => (\n <div\n key={widget.id}\n // `border-border-subtle` is registered as a frozen light hex in this\n // shell, so the box kept a light border in dark mode.\n className=\"min-w-0 overflow-hidden rounded-card border border-[var(--color-border-subtle)] bg-bg-canvas\"\n style={{ height: widgetBoxHeight(widget.type) }}\n >\n <WidgetWrapper widget={widget} isLoading={false} error={null} filterValues={{}} />\n </div>\n ))}\n </div>\n );\n}\n"],"mappings":"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"}
@@ -1,133 +1,182 @@
1
- import { useAssistantRunStore as e } from "../../assistant/assistantRunStore.js";
2
- import { StepRail as t, formatAgo as n, useAssistantSidebarWidth as r } from "./previewShared.js";
3
- import { useEffect as i, useState as a } from "react";
4
- import { ArrowUpRight as o, Loader2 as s, Sparkles as c, X as l } from "lucide-react";
5
- import { Button as u } from "@burdenoff/fe-libs/ui";
6
- import { jsx as d, jsxs as f } from "react/jsx-runtime";
1
+ import { Section as e } from "../common/Section.js";
2
+ import "../common/index.js";
3
+ import { useAssistantRunStore as t } from "../../assistant/assistantRunStore.js";
4
+ import { PREVIEW_CHROME_DIVIDER as n, PREVIEW_PANEL_SHELL as r, StepRail as i, formatAgo as a, useAssistantSidebarWidth as o } from "./previewShared.js";
5
+ import { useEffect as s, useState as c } from "react";
6
+ import { AlertCircle as l, ArrowUpRight as u, Braces as d, Database as f, LayoutDashboard as p, Loader2 as m, Sparkles as h, X as g } from "lucide-react";
7
+ import { useI18n as _ } from "@burdenoff/fe-libs/shared/providers/shell/I18nProvider";
8
+ import { Button as v } from "@burdenoff/fe-libs/ui";
9
+ import { jsx as y, jsxs as b } from "react/jsx-runtime";
7
10
  //#region src/bigconsole/components/preview/AiPreviewMiniPanel.tsx
8
- function p({ onNavigate: p }) {
9
- let m = e((e) => e.isRunning), h = e((e) => e.previewOpen), g = e((e) => e.hasRun), _ = e((e) => e.richMounted), v = e((e) => e.steps), y = e((e) => e.entityIds), b = e((e) => e.caption), x = e((e) => e.error), S = e((e) => e.updatedAt), C = e((e) => e.openPreview), w = e((e) => e.closePreview), [T, E] = a(() => Date.now());
10
- i(() => {
11
- if (!m) return;
12
- let e = window.setInterval(() => E(Date.now()), 1e3);
11
+ function x({ onNavigate: x }) {
12
+ let { t: S } = _(), C = t((e) => e.isRunning), w = t((e) => e.previewOpen), T = t((e) => e.hasRun), E = t((e) => e.richMounted), D = t((e) => e.steps), O = t((e) => e.entityIds), k = t((e) => e.caption), A = t((e) => e.error), j = t((e) => e.updatedAt), M = t((e) => e.openPreview), N = t((e) => e.closePreview), [P, F] = c(() => Date.now());
13
+ s(() => {
14
+ if (!C) return;
15
+ let e = window.setInterval(() => F(Date.now()), 1e3);
13
16
  return () => window.clearInterval(e);
14
- }, [m]);
15
- let D = r(), O = (e) => {
16
- p ? p(e) : typeof window < "u" && window.location.assign(e);
17
+ }, [C]);
18
+ let I = o(), L = (e) => {
19
+ x ? x(e) : typeof window < "u" && window.location.assign(e);
17
20
  };
18
- if (!g || _) return null;
19
- if (!h) return /* @__PURE__ */ d("div", {
20
- className: "flex justify-end px-4 pt-1 md:px-6",
21
- style: { marginRight: D },
22
- children: /* @__PURE__ */ f(u, {
21
+ if (!T || E) return null;
22
+ if (!w) return /* @__PURE__ */ b("div", {
23
+ className: "flex flex-wrap items-center justify-end gap-control-gap px-4 pt-3 md:px-6",
24
+ style: { marginRight: I },
25
+ children: [/* @__PURE__ */ y("span", {
26
+ className: "text-xs text-text-muted",
27
+ children: C ? "AI build running" : "AI build finished"
28
+ }), /* @__PURE__ */ b(v, {
23
29
  size: "sm",
24
30
  variant: "outline",
25
- onClick: C,
31
+ onClick: M,
26
32
  "data-testid": "ai-preview-open",
27
33
  children: [
28
- /* @__PURE__ */ d(c, { className: "mr-1.5 size-4" }),
29
- "Preview",
30
- m ? /* @__PURE__ */ d(s, { className: "ml-1.5 size-3.5 animate-spin" }) : null
34
+ /* @__PURE__ */ y(h, { className: "mr-1.5 size-4" }),
35
+ S("bigconsole.widget.aiPreviewMini.previewButton", "Preview"),
36
+ C ? /* @__PURE__ */ y(m, { className: "ml-1.5 size-3.5 animate-spin" }) : null
31
37
  ]
32
- })
38
+ })]
33
39
  });
34
- let k = S ? Math.max(0, Math.floor((T - S) / 1e3)) : 0, A = [];
35
- return y.datasink && A.push({
40
+ let R = j ? Math.max(0, Math.floor((P - j) / 1e3)) : 0, z = [];
41
+ return O.datasink && z.push({
36
42
  key: "datasink",
37
- label: "Data Sink",
38
- path: `/bigconsole/datasinks/${y.datasink}`
39
- }), y.dashboard && A.push({
43
+ label: S("bigconsole.widget.aiPreviewMini.link.dataSink", "Data Sink"),
44
+ path: `/bigconsole/datasinks/${O.datasink}`,
45
+ icon: /* @__PURE__ */ y(f, {
46
+ className: "size-4 shrink-0 text-text-muted",
47
+ "aria-hidden": "true"
48
+ })
49
+ }), O.dashboard && z.push({
40
50
  key: "dashboard",
41
- label: "Dashboard",
42
- path: `/bigconsole/dashboards/${y.dashboard}`
43
- }), y.parser && A.push({
51
+ label: S("bigconsole.widget.aiPreviewMini.link.dashboard", "Dashboard"),
52
+ path: `/bigconsole/dashboards/${O.dashboard}`,
53
+ icon: /* @__PURE__ */ y(p, {
54
+ className: "size-4 shrink-0 text-text-muted",
55
+ "aria-hidden": "true"
56
+ })
57
+ }), O.parser && z.push({
44
58
  key: "parser",
45
- label: "Parser",
46
- path: `/bigconsole/parsers/${y.parser}`
47
- }), /* @__PURE__ */ f("section", {
59
+ label: S("bigconsole.widget.aiPreviewMini.link.parser", "Parser"),
60
+ path: `/bigconsole/parsers/${O.parser}`,
61
+ icon: /* @__PURE__ */ y(d, {
62
+ className: "size-4 shrink-0 text-text-muted",
63
+ "aria-hidden": "true"
64
+ })
65
+ }), /* @__PURE__ */ b("section", {
48
66
  "data-testid": "ai-preview-panel",
49
67
  "data-variant": "mini",
50
- "aria-label": "AI preview",
51
- style: { marginRight: D ? D + 16 : void 0 },
52
- className: "mx-4 mt-1 mb-3 overflow-hidden rounded-lg border border-border-default bg-bg-sunken shadow-sm md:mx-6",
68
+ "aria-label": S("bigconsole.widget.aiPreviewMini.ariaLabel", "AI preview"),
69
+ style: { marginRight: I ? I + 16 : void 0 },
70
+ className: `${r} mx-4 mt-3 mb-3 md:mx-6`,
53
71
  children: [
54
- /* @__PURE__ */ f("div", {
55
- className: "flex items-center justify-between gap-3 border-b border-border-subtle bg-bg-surface px-3 py-2",
56
- children: [/* @__PURE__ */ f("div", {
57
- className: "flex min-w-0 items-center gap-2",
58
- children: [
59
- /* @__PURE__ */ d(c, { className: "size-4 shrink-0 text-action-primary-bg" }),
60
- /* @__PURE__ */ d("h2", {
61
- className: "truncate text-sm font-semibold text-text-primary",
62
- children: "AI Preview"
63
- }),
64
- m ? /* @__PURE__ */ f("span", {
65
- className: "inline-flex items-center gap-1.5 rounded-full bg-status-success-bg px-2 py-0.5 text-[11px] font-semibold uppercase tracking-wide text-status-success-text",
66
- "data-testid": "ai-preview-live",
67
- children: [/* @__PURE__ */ f("span", {
68
- className: "relative flex size-2",
69
- children: [/* @__PURE__ */ d("span", { className: "absolute inline-flex size-full animate-ping rounded-full bg-status-success-text opacity-75" }), /* @__PURE__ */ d("span", { className: "relative inline-flex size-2 rounded-full bg-status-success-text" })]
70
- }), "Live"]
71
- }) : null,
72
- /* @__PURE__ */ f("span", {
73
- className: "truncate text-xs text-text-muted",
74
- "data-testid": "ai-preview-ago",
75
- children: [
76
- m ? b || "Working…" : x ? "Stopped" : "Done",
77
- " · updated",
78
- " ",
79
- n(k)
80
- ]
81
- })
82
- ]
83
- }), /* @__PURE__ */ d(u, {
72
+ /* @__PURE__ */ b("div", {
73
+ className: `flex items-start justify-between gap-control-gap bg-bg-surface px-3 py-2 ${n}`,
74
+ children: [/* @__PURE__ */ b("div", {
75
+ className: "flex min-w-0 flex-col gap-0.5",
76
+ children: [/* @__PURE__ */ b("div", {
77
+ className: "flex min-w-0 flex-wrap items-center gap-2",
78
+ children: [
79
+ /* @__PURE__ */ y(h, { className: "size-4 shrink-0 text-action-primary-bg" }),
80
+ /* @__PURE__ */ y("h2", {
81
+ className: "text-sm font-semibold text-text-primary",
82
+ children: S("bigconsole.widget.aiPreviewMini.title", "AI Preview")
83
+ }),
84
+ C ? /* @__PURE__ */ b("span", {
85
+ className: "inline-flex items-center gap-1.5 rounded-full bg-status-success-bg px-2 py-0.5 text-[11px] font-semibold uppercase tracking-wide text-status-success-text",
86
+ "data-testid": "ai-preview-live",
87
+ children: [/* @__PURE__ */ b("span", {
88
+ className: "relative flex size-2",
89
+ children: [/* @__PURE__ */ y("span", { className: "absolute inline-flex size-full rounded-full bg-status-success-text opacity-75 motion-safe:animate-ping" }), /* @__PURE__ */ y("span", { className: "relative inline-flex size-2 rounded-full bg-status-success-text" })]
90
+ }), S("bigconsole.widget.aiPreviewMini.live", "Live")]
91
+ }) : null
92
+ ]
93
+ }), /* @__PURE__ */ b("span", {
94
+ className: "min-w-0 break-words text-xs text-text-muted",
95
+ "data-testid": "ai-preview-ago",
96
+ children: [
97
+ C ? k || S("bigconsole.widget.aiPreviewMini.working", "Working…") : A ? S("bigconsole.widget.aiPreviewMini.stopped", "Stopped") : S("bigconsole.widget.aiPreviewMini.done", "Done"),
98
+ " ",
99
+ "· ",
100
+ S("bigconsole.widget.aiPreviewMini.updated", "updated"),
101
+ " ",
102
+ a(R)
103
+ ]
104
+ })]
105
+ }), /* @__PURE__ */ y(v, {
84
106
  size: "sm",
85
107
  variant: "ghost",
86
- onClick: w,
87
- "aria-label": "Close preview",
108
+ onClick: N,
109
+ "aria-label": S("bigconsole.widget.aiPreviewMini.closeAriaLabel", "Close preview"),
88
110
  "data-testid": "ai-preview-close",
89
- children: /* @__PURE__ */ d(l, { className: "size-4" })
111
+ children: /* @__PURE__ */ y(g, { className: "size-4" })
90
112
  })]
91
113
  }),
92
- /* @__PURE__ */ d("div", {
93
- className: "border-b border-border-subtle px-3 py-2",
94
- children: /* @__PURE__ */ d(t, { steps: v })
114
+ /* @__PURE__ */ b("div", {
115
+ className: `px-3 py-2 ${n}`,
116
+ children: [/* @__PURE__ */ y("h3", {
117
+ className: "mb-1 text-[11px] font-semibold uppercase tracking-wide text-text-muted",
118
+ children: "Build progress"
119
+ }), /* @__PURE__ */ y(i, { steps: D })]
95
120
  }),
96
- /* @__PURE__ */ f("div", {
97
- className: "space-y-2 p-3",
98
- children: [A.length === 0 ? /* @__PURE__ */ d("p", {
99
- className: "px-1 py-4 text-sm text-text-muted",
100
- children: m ? "Building… links appear here as each piece is created." : "Nothing built yet."
101
- }) : A.map((e) => /* @__PURE__ */ f("div", {
102
- "data-testid": "ai-preview-row",
103
- className: "flex items-center justify-between gap-3 rounded-md border border-border-subtle bg-bg-surface px-3 py-2",
104
- children: [/* @__PURE__ */ f("p", {
105
- className: "truncate text-sm font-medium text-text-primary",
106
- children: [e.label, " ready"]
107
- }), /* @__PURE__ */ f(u, {
121
+ /* @__PURE__ */ y("div", {
122
+ className: "p-3",
123
+ children: /* @__PURE__ */ b(e, {
124
+ emphasis: "standard",
125
+ padding: "compact",
126
+ headingLevel: 3,
127
+ title: "Built so far",
128
+ description: "Open any piece to see the real thing.",
129
+ bodyClassName: "flex flex-col gap-list-gap",
130
+ children: [z.length === 0 ? /* @__PURE__ */ y("p", {
131
+ className: "text-sm text-text-muted",
132
+ children: C ? S("bigconsole.widget.aiPreviewMini.building", "Building… links appear here as each piece is created.") : S("bigconsole.widget.aiPreviewMini.nothingBuilt", "Nothing built yet.")
133
+ }) : z.map((e) => /* @__PURE__ */ b("div", {
134
+ "data-testid": "ai-preview-row",
135
+ className: "flex min-w-0 items-center justify-between gap-control-gap rounded-card border border-[var(--color-border-subtle)] bg-bg-canvas px-3 py-2",
136
+ children: [/* @__PURE__ */ b("p", {
137
+ className: "flex min-w-0 items-center gap-icon-gap text-sm font-medium text-text-primary",
138
+ children: [e.icon, /* @__PURE__ */ y("span", {
139
+ className: "truncate",
140
+ children: S("bigconsole.widget.aiPreviewMini.linkReady", "{{label}} ready", { label: e.label })
141
+ })]
142
+ }), /* @__PURE__ */ b(v, {
143
+ size: "sm",
144
+ variant: "ghost",
145
+ onClick: () => L(e.path),
146
+ children: [S("bigconsole.widget.aiPreviewMini.open", "Open"), /* @__PURE__ */ y(u, { className: "ml-1 size-3.5" })]
147
+ })]
148
+ }, e.key)), O.dashboard ? /* @__PURE__ */ b(v, {
108
149
  size: "sm",
109
- variant: "ghost",
110
- onClick: () => O(e.path),
111
- children: ["Open", /* @__PURE__ */ d(o, { className: "ml-1 size-3.5" })]
112
- })]
113
- }, e.key)), y.dashboard ? /* @__PURE__ */ f(u, {
114
- size: "sm",
115
- variant: "outline",
116
- className: "w-full",
117
- "data-testid": "ai-preview-open-in-bigconsole",
118
- onClick: () => O(`/bigconsole/dashboards/${y.dashboard ?? ""}`),
119
- children: ["Open in BigConsole for the live view", /* @__PURE__ */ d(o, { className: "ml-1 size-3.5" })]
120
- }) : null]
150
+ variant: "outline",
151
+ className: "h-auto w-full whitespace-normal py-1.5 text-center",
152
+ "data-testid": "ai-preview-open-in-bigconsole",
153
+ onClick: () => L(`/bigconsole/dashboards/${O.dashboard ?? ""}`),
154
+ children: [S("bigconsole.widget.aiPreviewMini.openInBigConsole", "Open in BigConsole for the live view"), /* @__PURE__ */ y(u, { className: "ml-1 size-3.5" })]
155
+ }) : null]
156
+ })
121
157
  }),
122
- x ? /* @__PURE__ */ d("p", {
123
- className: "border-t border-border-subtle px-3 py-2 text-xs text-status-error-text",
124
- "data-testid": "ai-preview-error",
125
- children: x
158
+ A ? /* @__PURE__ */ b("div", {
159
+ role: "alert",
160
+ className: "border-t border-[var(--color-status-error-border)] bg-[var(--color-status-error-bgSubtle)] px-3 py-2",
161
+ children: [/* @__PURE__ */ y("h3", {
162
+ className: "text-[11px] font-semibold uppercase tracking-wide text-[var(--color-status-error-text)]",
163
+ children: "Build stopped"
164
+ }), /* @__PURE__ */ b("p", {
165
+ className: "mt-0.5 flex items-start gap-icon-gap text-xs text-[var(--color-status-error-text)]",
166
+ "data-testid": "ai-preview-error",
167
+ children: [/* @__PURE__ */ y(l, {
168
+ className: "mt-0.5 size-3.5 shrink-0",
169
+ "aria-hidden": "true"
170
+ }), /* @__PURE__ */ y("span", {
171
+ className: "min-w-0 break-words",
172
+ children: A
173
+ })]
174
+ })]
126
175
  }) : null
127
176
  ]
128
177
  });
129
178
  }
130
179
  //#endregion
131
- export { p as default };
180
+ export { x as default };
132
181
 
133
182
  //# sourceMappingURL=AiPreviewMiniPanel.js.map