@burdenoff/microfe-bigconsole 2026.805.3 → 2026.812.2

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 (247) 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 +135 -97
  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 +209 -193
  23. package/dist/bigconsole/components/dashboard/CreateDashboardDialog.js.map +1 -1
  24. package/dist/bigconsole/components/dashboard/DashboardCanvas.js +213 -231
  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 +109 -102
  29. package/dist/bigconsole/components/dashboard/DashboardToolbar.js.map +1 -1
  30. package/dist/bigconsole/components/dashboard/DrilldownBreadcrumb.js +81 -70
  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 +25 -23
  35. package/dist/bigconsole/components/dashboard/GlobalFiltersBar/FilterChip.js.map +1 -1
  36. package/dist/bigconsole/components/dashboard/GlobalFiltersBar/FilterEditor.js +3 -3
  37. package/dist/bigconsole/components/dashboard/GlobalFiltersBar/FilterEditor.js.map +1 -1
  38. package/dist/bigconsole/components/dashboard/GlobalFiltersBar/FilterPresetSelector.js +5 -3
  39. package/dist/bigconsole/components/dashboard/GlobalFiltersBar/FilterPresetSelector.js.map +1 -1
  40. package/dist/bigconsole/components/dashboard/GlobalFiltersBar/GlobalFiltersBar.js +170 -284
  41. package/dist/bigconsole/components/dashboard/GlobalFiltersBar/GlobalFiltersBar.js.map +1 -1
  42. package/dist/bigconsole/components/dashboard/ImportDashboardDialog.js +147 -151
  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/SavedViewsDropdown/SavedViewsDropdown.js +17 -8
  49. package/dist/bigconsole/components/dashboard/SavedViewsDropdown/SavedViewsDropdown.js.map +1 -1
  50. package/dist/bigconsole/components/dashboard/ShareDialog/ShareDialog.js +101 -95
  51. package/dist/bigconsole/components/dashboard/ShareDialog/ShareDialog.js.map +1 -1
  52. package/dist/bigconsole/components/dashboard/StoreTemplatePicker.js +20 -18
  53. package/dist/bigconsole/components/dashboard/StoreTemplatePicker.js.map +1 -1
  54. package/dist/bigconsole/components/dashboard/TemplateSetupBanner.js +26 -58
  55. package/dist/bigconsole/components/dashboard/TemplateSetupBanner.js.map +1 -1
  56. package/dist/bigconsole/components/dashboard/WidgetPalette.js +307 -231
  57. package/dist/bigconsole/components/dashboard/WidgetPalette.js.map +1 -1
  58. package/dist/bigconsole/components/datasink/CacheTTLSelector.js +29 -29
  59. package/dist/bigconsole/components/datasink/CacheTTLSelector.js.map +1 -1
  60. package/dist/bigconsole/components/datasink/DataSinkCard.js +78 -79
  61. package/dist/bigconsole/components/datasink/DataSinkCard.js.map +1 -1
  62. package/dist/bigconsole/components/datasink/DataSinkDataViewer.js +33 -34
  63. package/dist/bigconsole/components/datasink/DataSinkDataViewer.js.map +1 -1
  64. package/dist/bigconsole/components/datasink/DataSinkDeleteDialog.js +79 -56
  65. package/dist/bigconsole/components/datasink/DataSinkDeleteDialog.js.map +1 -1
  66. package/dist/bigconsole/components/datasink/DataSinkRefreshDialog.js +75 -65
  67. package/dist/bigconsole/components/datasink/DataSinkRefreshDialog.js.map +1 -1
  68. package/dist/bigconsole/components/datasink/DataSinkStatusBadge.js +1 -1
  69. package/dist/bigconsole/components/datasink/DataSinkStatusBadge.js.map +1 -1
  70. package/dist/bigconsole/components/datasink/DataSinkTableViewer.js +20 -19
  71. package/dist/bigconsole/components/datasink/DataSinkTableViewer.js.map +1 -1
  72. package/dist/bigconsole/components/datasink/ExportDataSinkDialog.js +127 -171
  73. package/dist/bigconsole/components/datasink/ExportDataSinkDialog.js.map +1 -1
  74. package/dist/bigconsole/components/datasink/ImportDataSinkDialog.js +263 -243
  75. package/dist/bigconsole/components/datasink/ImportDataSinkDialog.js.map +1 -1
  76. package/dist/bigconsole/components/datasink/LinkedParsersPanel.js +65 -66
  77. package/dist/bigconsole/components/datasink/LinkedParsersPanel.js.map +1 -1
  78. package/dist/bigconsole/components/datasink/LinkedWorkflowsPanel.js +121 -127
  79. package/dist/bigconsole/components/datasink/LinkedWorkflowsPanel.js.map +1 -1
  80. package/dist/bigconsole/components/datasink/RefreshTypeSelector.js +33 -26
  81. package/dist/bigconsole/components/datasink/RefreshTypeSelector.js.map +1 -1
  82. package/dist/bigconsole/components/datasink/SetupStateBadge.js +3 -3
  83. package/dist/bigconsole/components/datasink/SetupStateBadge.js.map +1 -1
  84. package/dist/bigconsole/components/datasink/WorkflowStatusPanel.js +95 -95
  85. package/dist/bigconsole/components/datasink/WorkflowStatusPanel.js.map +1 -1
  86. package/dist/bigconsole/components/parser/DataSinkSelector.js +154 -123
  87. package/dist/bigconsole/components/parser/DataSinkSelector.js.map +1 -1
  88. package/dist/bigconsole/components/parser/ExpressionEditor.js +3 -3
  89. package/dist/bigconsole/components/parser/ExpressionEditor.js.map +1 -1
  90. package/dist/bigconsole/components/parser/ImportParserDialog.js +235 -275
  91. package/dist/bigconsole/components/parser/ImportParserDialog.js.map +1 -1
  92. package/dist/bigconsole/components/parser/ParserCard.js +133 -114
  93. package/dist/bigconsole/components/parser/ParserCard.js.map +1 -1
  94. package/dist/bigconsole/components/parser/ParserSelector.js +191 -174
  95. package/dist/bigconsole/components/parser/ParserSelector.js.map +1 -1
  96. package/dist/bigconsole/components/parser/ParserStatusBadge.js +2 -2
  97. package/dist/bigconsole/components/parser/ParserStatusBadge.js.map +1 -1
  98. package/dist/bigconsole/components/parser/ParserTypeBadge.js +4 -4
  99. package/dist/bigconsole/components/parser/ParserTypeBadge.js.map +1 -1
  100. package/dist/bigconsole/components/pipeline/PipelineCard.js +134 -89
  101. package/dist/bigconsole/components/pipeline/PipelineCard.js.map +1 -1
  102. package/dist/bigconsole/components/pipeline/PipelineDeleteDialog.js +77 -64
  103. package/dist/bigconsole/components/pipeline/PipelineDeleteDialog.js.map +1 -1
  104. package/dist/bigconsole/components/pipeline/PipelineStatusBadge.js +7 -10
  105. package/dist/bigconsole/components/pipeline/PipelineStatusBadge.js.map +1 -1
  106. package/dist/bigconsole/components/preview/AiPreviewContent.js +31 -32
  107. package/dist/bigconsole/components/preview/AiPreviewContent.js.map +1 -1
  108. package/dist/bigconsole/components/preview/AiPreviewMiniPanel.js +152 -106
  109. package/dist/bigconsole/components/preview/AiPreviewMiniPanel.js.map +1 -1
  110. package/dist/bigconsole/components/preview/AiPreviewPanel.js +193 -152
  111. package/dist/bigconsole/components/preview/AiPreviewPanel.js.map +1 -1
  112. package/dist/bigconsole/components/preview/previewShared.js +41 -23
  113. package/dist/bigconsole/components/preview/previewShared.js.map +1 -1
  114. package/dist/bigconsole/components/widgets/ActionConfigDialog.js +342 -308
  115. package/dist/bigconsole/components/widgets/ActionConfigDialog.js.map +1 -1
  116. package/dist/bigconsole/components/widgets/DrilldownConfigPanel.js +262 -238
  117. package/dist/bigconsole/components/widgets/DrilldownConfigPanel.js.map +1 -1
  118. package/dist/bigconsole/components/widgets/PropertiesPanel.js +783 -867
  119. package/dist/bigconsole/components/widgets/PropertiesPanel.js.map +1 -1
  120. package/dist/bigconsole/components/widgets/WidgetErrorBoundary.js +7 -5
  121. package/dist/bigconsole/components/widgets/WidgetErrorBoundary.js.map +1 -1
  122. package/dist/bigconsole/components/widgets/WidgetHeader.js +7 -8
  123. package/dist/bigconsole/components/widgets/WidgetHeader.js.map +1 -1
  124. package/dist/bigconsole/components/widgets/WidgetRegistry.js +4 -4
  125. package/dist/bigconsole/components/widgets/WidgetRegistry.js.map +1 -1
  126. package/dist/bigconsole/components/widgets/WidgetWrapper.js +8 -7
  127. package/dist/bigconsole/components/widgets/WidgetWrapper.js.map +1 -1
  128. package/dist/bigconsole/components/widgets/adaptive-card/AdaptiveCardWidget.js +1 -1
  129. package/dist/bigconsole/components/widgets/adaptive-card/AdaptiveCardWidget.js.map +1 -1
  130. package/dist/bigconsole/components/widgets/calendar/CalendarWidget.js +2 -2
  131. package/dist/bigconsole/components/widgets/calendar/CalendarWidget.js.map +1 -1
  132. package/dist/bigconsole/components/widgets/chart/ChartConfig.js +11 -5
  133. package/dist/bigconsole/components/widgets/chart/ChartConfig.js.map +1 -1
  134. package/dist/bigconsole/components/widgets/comments/WidgetComments.js +19 -15
  135. package/dist/bigconsole/components/widgets/comments/WidgetComments.js.map +1 -1
  136. package/dist/bigconsole/components/widgets/event-logs/EventLogViewer.js +154 -102
  137. package/dist/bigconsole/components/widgets/event-logs/EventLogViewer.js.map +1 -1
  138. package/dist/bigconsole/components/widgets/gauge/CircularGauge.js +36 -32
  139. package/dist/bigconsole/components/widgets/gauge/CircularGauge.js.map +1 -1
  140. package/dist/bigconsole/components/widgets/gauge/GaugeConfig.js +85 -60
  141. package/dist/bigconsole/components/widgets/gauge/GaugeConfig.js.map +1 -1
  142. package/dist/bigconsole/components/widgets/gauge/GaugeWidget.js +64 -35
  143. package/dist/bigconsole/components/widgets/gauge/GaugeWidget.js.map +1 -1
  144. package/dist/bigconsole/components/widgets/gauge/LinearGauge.js +46 -45
  145. package/dist/bigconsole/components/widgets/gauge/LinearGauge.js.map +1 -1
  146. package/dist/bigconsole/components/widgets/heatmap/HeatmapConfig.js +35 -24
  147. package/dist/bigconsole/components/widgets/heatmap/HeatmapConfig.js.map +1 -1
  148. package/dist/bigconsole/components/widgets/iframe-widget/IframeWidget.js +2 -2
  149. package/dist/bigconsole/components/widgets/iframe-widget/IframeWidget.js.map +1 -1
  150. package/dist/bigconsole/components/widgets/kanban/KanbanWidget.js +4 -4
  151. package/dist/bigconsole/components/widgets/kanban/KanbanWidget.js.map +1 -1
  152. package/dist/bigconsole/components/widgets/kpi-comparison/KPIComparisonWidget.js +153 -90
  153. package/dist/bigconsole/components/widgets/kpi-comparison/KPIComparisonWidget.js.map +1 -1
  154. package/dist/bigconsole/components/widgets/list/ListConfig.js +8 -2
  155. package/dist/bigconsole/components/widgets/list/ListConfig.js.map +1 -1
  156. package/dist/bigconsole/components/widgets/list/ListItem.js +1 -1
  157. package/dist/bigconsole/components/widgets/list/ListItem.js.map +1 -1
  158. package/dist/bigconsole/components/widgets/map-widget/MapWidget.js +1 -1
  159. package/dist/bigconsole/components/widgets/map-widget/MapWidget.js.map +1 -1
  160. package/dist/bigconsole/components/widgets/metric-card/MetricCardConfig.js +14 -4
  161. package/dist/bigconsole/components/widgets/metric-card/MetricCardConfig.js.map +1 -1
  162. package/dist/bigconsole/components/widgets/metric-card/MetricCardWidget.js +112 -89
  163. package/dist/bigconsole/components/widgets/metric-card/MetricCardWidget.js.map +1 -1
  164. package/dist/bigconsole/components/widgets/metric-card/SparklineChart.js +21 -13
  165. package/dist/bigconsole/components/widgets/metric-card/SparklineChart.js.map +1 -1
  166. package/dist/bigconsole/components/widgets/metric-card/index.js +4 -4
  167. package/dist/bigconsole/components/widgets/pivot-table/PivotTableWidget.js +3 -3
  168. package/dist/bigconsole/components/widgets/pivot-table/PivotTableWidget.js.map +1 -1
  169. package/dist/bigconsole/components/widgets/progress/ProgressConfig.js +34 -25
  170. package/dist/bigconsole/components/widgets/progress/ProgressConfig.js.map +1 -1
  171. package/dist/bigconsole/components/widgets/progress/ProgressWidget.js +129 -114
  172. package/dist/bigconsole/components/widgets/progress/ProgressWidget.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 +10 -4
  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/utils/targetProgress.js +13 -0
  194. package/dist/bigconsole/components/widgets/utils/targetProgress.js.map +1 -0
  195. package/dist/bigconsole/components/widgets/webhook-config/WebhookConfigPanel.js +112 -85
  196. package/dist/bigconsole/components/widgets/webhook-config/WebhookConfigPanel.js.map +1 -1
  197. package/dist/bigconsole/components/widgets/widget-actions/WidgetActions.js +28 -20
  198. package/dist/bigconsole/components/widgets/widget-actions/WidgetActions.js.map +1 -1
  199. package/dist/bigconsole/components/workflow/WorkflowCard.js +92 -77
  200. package/dist/bigconsole/components/workflow/WorkflowCard.js.map +1 -1
  201. package/dist/bigconsole/components/workflow/WorkflowDeleteDialog.js +70 -51
  202. package/dist/bigconsole/components/workflow/WorkflowDeleteDialog.js.map +1 -1
  203. package/dist/bigconsole/components/workflow/WorkflowStatusBadge.js +16 -17
  204. package/dist/bigconsole/components/workflow/WorkflowStatusBadge.js.map +1 -1
  205. package/dist/bigconsole/customWidget/CustomWidgetBuilderSheet.js +6 -4
  206. package/dist/bigconsole/customWidget/CustomWidgetBuilderSheet.js.map +1 -1
  207. package/dist/bigconsole/customWidget/CustomWidgetProposalPanel.js +360 -338
  208. package/dist/bigconsole/customWidget/CustomWidgetProposalPanel.js.map +1 -1
  209. package/dist/bigconsole/hooks/useModalFocusTrap.js +53 -0
  210. package/dist/bigconsole/hooks/useModalFocusTrap.js.map +1 -0
  211. package/dist/bigconsole/pages/DashboardBuilderPage.js +209 -203
  212. package/dist/bigconsole/pages/DashboardBuilderPage.js.map +1 -1
  213. package/dist/bigconsole/pages/DashboardViewPage.js +126 -120
  214. package/dist/bigconsole/pages/DashboardViewPage.js.map +1 -1
  215. package/dist/bigconsole/pages/DashboardsPage.js +838 -800
  216. package/dist/bigconsole/pages/DashboardsPage.js.map +1 -1
  217. package/dist/bigconsole/pages/DataParsersPage.js +263 -315
  218. package/dist/bigconsole/pages/DataParsersPage.js.map +1 -1
  219. package/dist/bigconsole/pages/DataSinkBuilderPage.js +301 -341
  220. package/dist/bigconsole/pages/DataSinkBuilderPage.js.map +1 -1
  221. package/dist/bigconsole/pages/DataSinkViewPage.js +346 -339
  222. package/dist/bigconsole/pages/DataSinkViewPage.js.map +1 -1
  223. package/dist/bigconsole/pages/DataSinksPage.js +356 -458
  224. package/dist/bigconsole/pages/DataSinksPage.js.map +1 -1
  225. package/dist/bigconsole/pages/DataSourcesPage.js +7 -2
  226. package/dist/bigconsole/pages/DataSourcesPage.js.map +1 -1
  227. package/dist/bigconsole/pages/HomePage.js +186 -193
  228. package/dist/bigconsole/pages/HomePage.js.map +1 -1
  229. package/dist/bigconsole/pages/InsightsPage.js +887 -740
  230. package/dist/bigconsole/pages/InsightsPage.js.map +1 -1
  231. package/dist/bigconsole/pages/ParserBuilderPage.js +679 -637
  232. package/dist/bigconsole/pages/ParserBuilderPage.js.map +1 -1
  233. package/dist/bigconsole/pages/ParserViewPage.js +368 -342
  234. package/dist/bigconsole/pages/ParserViewPage.js.map +1 -1
  235. package/dist/bigconsole/pages/PipelineBuilderPage.js +537 -444
  236. package/dist/bigconsole/pages/PipelineBuilderPage.js.map +1 -1
  237. package/dist/bigconsole/pages/PipelineViewPage.js +412 -377
  238. package/dist/bigconsole/pages/PipelineViewPage.js.map +1 -1
  239. package/dist/bigconsole/pages/PipelinesPage.js +248 -298
  240. package/dist/bigconsole/pages/PipelinesPage.js.map +1 -1
  241. package/dist/bigconsole/pages/WidgetDemoPage.js +251 -153
  242. package/dist/bigconsole/pages/WidgetDemoPage.js.map +1 -1
  243. package/dist/bigconsole/pages/WorkflowViewPage.js +381 -371
  244. package/dist/bigconsole/pages/WorkflowViewPage.js.map +1 -1
  245. package/dist/bigconsole/pages/WorkflowsPage.js +171 -286
  246. package/dist/bigconsole/pages/WorkflowsPage.js.map +1 -1
  247. package/package.json +1 -1
@@ -1 +1 @@
1
- {"version":3,"file":"DataSinkCard.js","names":[],"sources":["../../../../src/bigconsole/components/datasink/DataSinkCard.tsx"],"sourcesContent":["/**\n * DataSink Card\n *\n * Card component for displaying DataSink information in a list/grid view.\n */\n\nimport { memo, useCallback } from 'react';\nimport { formatDistanceToNow } from 'date-fns';\nimport { DataSinkStatusBadge } from './DataSinkStatusBadge';\nimport type { DataSink, DataSinkSetupState } from '../../types';\n\n// ============================================================================\n// TYPES\n// ============================================================================\n\ninterface DataSinkCardProps {\n /** DataSink data */\n dataSink: DataSink;\n /** Setup state override */\n setupState?: DataSinkSetupState;\n /** Callback when view is clicked */\n onView?: (id: string) => void;\n /** Callback when edit is clicked */\n onEdit?: (id: string) => void;\n /** Callback when refresh is clicked */\n onRefresh?: (id: string) => void;\n /** Callback when export is clicked */\n onExport?: (id: string) => void;\n /** Callback when delete is clicked */\n onDelete?: (id: string) => void;\n /** Callback to continue setup */\n onContinueSetup?: (id: string) => void;\n /** Whether the current actor may edit this DataSink (gates the Edit action). Defaults to true. */\n canEdit?: boolean;\n /** Whether the current actor may refresh this DataSink (gates the Refresh action). Defaults to true. */\n canRefresh?: boolean;\n /** Whether the current actor may delete this DataSink (gates the Delete action). Defaults to true. */\n canDelete?: boolean;\n}\n\n// ============================================================================\n// COMPONENT\n// ============================================================================\n\nexport const DataSinkCard = memo(function DataSinkCard({\n dataSink,\n setupState,\n onView,\n onEdit,\n onRefresh,\n onExport,\n onDelete,\n onContinueSetup,\n canEdit = true,\n canRefresh = true,\n canDelete = true,\n}: DataSinkCardProps) {\n // Event handlers\n const handleView = useCallback(\n (e: React.MouseEvent) => {\n e.stopPropagation();\n onView?.(dataSink.id);\n },\n [dataSink.id, onView]\n );\n\n const handleEdit = useCallback(\n (e: React.MouseEvent) => {\n e.stopPropagation();\n onEdit?.(dataSink.id);\n },\n [dataSink.id, onEdit]\n );\n\n const handleRefresh = useCallback(\n (e: React.MouseEvent) => {\n e.stopPropagation();\n onRefresh?.(dataSink.id);\n },\n [dataSink.id, onRefresh]\n );\n\n const handleExport = useCallback(\n (e: React.MouseEvent) => {\n e.stopPropagation();\n onExport?.(dataSink.id);\n },\n [dataSink.id, onExport]\n );\n\n const handleDelete = useCallback(\n (e: React.MouseEvent) => {\n e.stopPropagation();\n onDelete?.(dataSink.id);\n },\n [dataSink.id, onDelete]\n );\n\n const handleContinueSetup = useCallback(\n (e: React.MouseEvent) => {\n e.stopPropagation();\n onContinueSetup?.(dataSink.id);\n },\n [dataSink.id, onContinueSetup]\n );\n\n const currentSetupState = setupState ?? dataSink.setupState;\n const isSetupComplete = currentSetupState === 'completed';\n\n // Format last refreshed time\n const lastRefreshedText = dataSink.lastRefreshedAt\n ? formatDistanceToNow(new Date(dataSink.lastRefreshedAt), { addSuffix: true })\n : 'Never';\n\n return (\n <div\n className={`\n p-4\n bg-bg-surface\n border border-border-default\n rounded-lg\n hover:border-action-primary-bg/50\n transition-colors\n cursor-pointer\n `}\n onClick={handleView}\n >\n {/* Header */}\n <div className=\"flex items-start justify-between mb-3\">\n <div className=\"flex-1 min-w-0\">\n <h3 className=\"text-sm font-semibold text-text-primary truncate\">{dataSink.name || 'Untitled DataSink'}</h3>\n <p className=\"text-xs text-text-secondary font-mono mt-0.5 truncate\">{dataSink.key}</p>\n </div>\n <DataSinkStatusBadge status={dataSink.status} size=\"sm\" />\n </div>\n\n {/* Description */}\n {dataSink.description && <p className=\"text-xs text-text-secondary mb-3 line-clamp-2\">{dataSink.description}</p>}\n\n {/* Stats */}\n <div className=\"flex items-center gap-4 text-xs text-text-secondary mb-3\">\n <span className=\"flex items-center gap-1\">\n <svg className=\"w-3.5 h-3.5\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M12 8v4l3 3m6-3a9 9 0 11-18 0 9 9 0 0118 0z\"\n />\n </svg>\n {lastRefreshedText}\n </span>\n {dataSink.linkedWorkflowCount !== undefined && dataSink.linkedWorkflowCount > 0 && (\n <span className=\"flex items-center gap-1\">\n <svg className=\"w-3.5 h-3.5\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1\"\n />\n </svg>\n {dataSink.linkedWorkflowCount} workflow{dataSink.linkedWorkflowCount !== 1 ? 's' : ''}\n </span>\n )}\n </div>\n\n {/* Setup state indicator */}\n {!isSetupComplete && (\n <div className=\"mb-3 p-2 bg-status-warning-bg/10 border border-status-warning-border/20 rounded-md\">\n <div className=\"flex items-center justify-between\">\n <span className=\"text-xs text-status-warning-text\">Setup incomplete</span>\n <button\n type=\"button\"\n onClick={handleContinueSetup}\n className=\"text-xs font-medium text-action-primary-bg hover:underline\"\n >\n Continue\n </button>\n </div>\n </div>\n )}\n\n {/* Actions */}\n <div className=\"flex items-center gap-2 pt-2 border-t border-border-default\">\n <button\n type=\"button\"\n onClick={handleView}\n className=\"flex-1 px-3 py-1.5 text-xs font-medium text-text-primary bg-bg-sunken hover:bg-border-default rounded-md transition-colors\"\n >\n View\n </button>\n {canEdit && (\n <button\n type=\"button\"\n onClick={handleEdit}\n className=\"px-3 py-1.5 text-xs font-medium text-text-secondary hover:text-text-primary hover:bg-bg-sunken rounded-md transition-colors\"\n >\n Edit\n </button>\n )}\n {canRefresh && (\n <button\n type=\"button\"\n onClick={handleRefresh}\n className=\"px-3 py-1.5 text-xs font-medium text-text-secondary hover:text-text-primary hover:bg-bg-sunken rounded-md transition-colors\"\n >\n Refresh\n </button>\n )}\n {onExport && (\n <button\n type=\"button\"\n onClick={handleExport}\n className=\"px-3 py-1.5 text-xs font-medium text-text-secondary hover:text-text-primary hover:bg-bg-sunken rounded-md transition-colors\"\n >\n Export\n </button>\n )}\n {canDelete && (\n <button\n type=\"button\"\n onClick={handleDelete}\n className=\"px-3 py-1.5 text-xs font-medium text-status-error-text hover:bg-status-error-bg/10 rounded-md transition-colors\"\n >\n Delete\n </button>\n )}\n </div>\n </div>\n );\n});\n\nexport default DataSinkCard;\n"],"mappings":"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"}
1
+ {"version":3,"file":"DataSinkCard.js","names":[],"sources":["../../../../src/bigconsole/components/datasink/DataSinkCard.tsx"],"sourcesContent":["/**\n * DataSink Card\n *\n * Card component for displaying DataSink information in a list/grid view.\n */\n\nimport { memo, useCallback } from 'react';\nimport { formatDistanceToNow } from 'date-fns';\nimport { DataSinkStatusBadge } from './DataSinkStatusBadge';\nimport { SECTION_FOCUS_RING } from '../common';\nimport type { DataSink, DataSinkSetupState } from '../../types';\n\n/**\n * Shared class recipe for the card's five action buttons. `min-h-[var(--size-controlHeight-md)]`\n * keeps every one at the 40px touch minimum once the row wraps on mobile.\n */\nconst CARD_ACTION =\n `inline-flex min-h-[var(--size-controlHeight-md)] items-center justify-center rounded-button px-3 py-1.5 text-xs font-medium motion-safe:transition-colors ${SECTION_FOCUS_RING}` as const;\n\n// ============================================================================\n// TYPES\n// ============================================================================\n\ninterface DataSinkCardProps {\n /** DataSink data */\n dataSink: DataSink;\n /** Setup state override */\n setupState?: DataSinkSetupState;\n /** Callback when view is clicked */\n onView?: (id: string) => void;\n /** Callback when edit is clicked */\n onEdit?: (id: string) => void;\n /** Callback when refresh is clicked */\n onRefresh?: (id: string) => void;\n /** Callback when export is clicked */\n onExport?: (id: string) => void;\n /** Callback when delete is clicked */\n onDelete?: (id: string) => void;\n /** Callback to continue setup */\n onContinueSetup?: (id: string) => void;\n /** Whether the current actor may edit this DataSink (gates the Edit action). Defaults to true. */\n canEdit?: boolean;\n /** Whether the current actor may refresh this DataSink (gates the Refresh action). Defaults to true. */\n canRefresh?: boolean;\n /** Whether the current actor may delete this DataSink (gates the Delete action). Defaults to true. */\n canDelete?: boolean;\n}\n\n// ============================================================================\n// COMPONENT\n// ============================================================================\n\nexport const DataSinkCard = memo(function DataSinkCard({\n dataSink,\n setupState,\n onView,\n onEdit,\n onRefresh,\n onExport,\n onDelete,\n onContinueSetup,\n canEdit = true,\n canRefresh = true,\n canDelete = true,\n}: DataSinkCardProps) {\n // Event handlers\n const handleView = useCallback(\n (e: React.MouseEvent) => {\n e.stopPropagation();\n onView?.(dataSink.id);\n },\n [dataSink.id, onView]\n );\n\n const handleEdit = useCallback(\n (e: React.MouseEvent) => {\n e.stopPropagation();\n onEdit?.(dataSink.id);\n },\n [dataSink.id, onEdit]\n );\n\n const handleRefresh = useCallback(\n (e: React.MouseEvent) => {\n e.stopPropagation();\n onRefresh?.(dataSink.id);\n },\n [dataSink.id, onRefresh]\n );\n\n const handleExport = useCallback(\n (e: React.MouseEvent) => {\n e.stopPropagation();\n onExport?.(dataSink.id);\n },\n [dataSink.id, onExport]\n );\n\n const handleDelete = useCallback(\n (e: React.MouseEvent) => {\n e.stopPropagation();\n onDelete?.(dataSink.id);\n },\n [dataSink.id, onDelete]\n );\n\n const handleContinueSetup = useCallback(\n (e: React.MouseEvent) => {\n e.stopPropagation();\n onContinueSetup?.(dataSink.id);\n },\n [dataSink.id, onContinueSetup]\n );\n\n const currentSetupState = setupState ?? dataSink.setupState;\n const isSetupComplete = currentSetupState === 'completed';\n\n // Format last refreshed time\n const lastRefreshedText = dataSink.lastRefreshedAt\n ? formatDistanceToNow(new Date(dataSink.lastRefreshedAt), { addSuffix: true })\n : 'Never';\n\n return (\n // A card is a tile inside the page's `primary` results section, so it steps\n // down to the `muted` recipe (recessed surface, transparent border) instead\n // of competing with the panel that contains it.\n <article\n className={`\n min-w-0\n cursor-pointer\n rounded-card\n border border-transparent\n bg-bg-sunken\n p-card-padding\n hover:border-[var(--color-action-primary-bg)]\n motion-safe:transition-colors\n `}\n onClick={handleView}\n >\n {/* Identity */}\n <div className=\"mb-3 flex items-start justify-between gap-icon-gap\">\n <div className=\"min-w-0 flex-1\">\n <h3 className=\"truncate text-sm font-semibold text-text-primary\">{dataSink.name || 'Untitled data sink'}</h3>\n <p className=\"mt-0.5 truncate font-mono text-xs text-text-secondary\">{dataSink.key}</p>\n </div>\n <DataSinkStatusBadge status={dataSink.status} size=\"sm\" />\n </div>\n\n {/* Description */}\n {dataSink.description && <p className=\"mb-3 line-clamp-2 text-xs text-text-secondary\">{dataSink.description}</p>}\n\n {/* Stats */}\n <div className=\"mb-3 flex flex-wrap items-center gap-x-4 gap-y-1 text-xs text-text-secondary\">\n <span className=\"flex items-center gap-1\">\n <svg className=\"w-3.5 h-3.5\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M12 8v4l3 3m6-3a9 9 0 11-18 0 9 9 0 0118 0z\"\n />\n </svg>\n {lastRefreshedText}\n </span>\n {dataSink.linkedWorkflowCount !== undefined && dataSink.linkedWorkflowCount > 0 && (\n <span className=\"flex items-center gap-1\">\n <svg className=\"w-3.5 h-3.5\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1\"\n />\n </svg>\n {dataSink.linkedWorkflowCount} workflow{dataSink.linkedWorkflowCount !== 1 ? 's' : ''}\n </span>\n )}\n </div>\n\n {/* Setup state — a warning strip, so it carries the warning tone. */}\n {!isSetupComplete && (\n <div className=\"mb-3 flex items-center justify-between gap-icon-gap rounded-input border border-[var(--color-status-warning-border)] bg-[var(--color-status-warning-bgSubtle)] p-2\">\n <span className=\"text-xs text-[var(--color-status-warning-text)]\">Setup incomplete</span>\n <button\n type=\"button\"\n onClick={handleContinueSetup}\n className={`rounded-button px-1 text-xs font-medium text-text-link hover:underline ${SECTION_FOCUS_RING}`}\n >\n Continue\n </button>\n </div>\n )}\n\n {/* Actions */}\n <div className=\"flex flex-wrap items-center gap-2 border-t border-[var(--color-border-subtle)] pt-2\">\n <button\n type=\"button\"\n onClick={handleView}\n className={`${CARD_ACTION} flex-1 bg-bg-surface text-text-primary hover:bg-bg-elevated`}\n >\n View\n </button>\n {canEdit && (\n <button\n type=\"button\"\n onClick={handleEdit}\n className={`${CARD_ACTION} text-text-secondary hover:bg-bg-surface hover:text-text-primary`}\n >\n Edit\n </button>\n )}\n {canRefresh && (\n <button\n type=\"button\"\n onClick={handleRefresh}\n className={`${CARD_ACTION} text-text-secondary hover:bg-bg-surface hover:text-text-primary`}\n >\n Refresh\n </button>\n )}\n {onExport && (\n <button\n type=\"button\"\n onClick={handleExport}\n className={`${CARD_ACTION} text-text-secondary hover:bg-bg-surface hover:text-text-primary`}\n >\n Export\n </button>\n )}\n {canDelete && (\n <button\n type=\"button\"\n onClick={handleDelete}\n className={`${CARD_ACTION} text-status-error-text hover:bg-[var(--color-status-error-bgSubtle)]`}\n >\n Delete\n </button>\n )}\n </div>\n </article>\n );\n});\n\nexport default DataSinkCard;\n"],"mappings":"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"}
@@ -1,43 +1,42 @@
1
- import { memo as e, useCallback as t, useState as n } from "react";
2
- import { jsx as r, jsxs as i } from "react/jsx-runtime";
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 { memo as n, useCallback as r, useState as i } from "react";
5
+ import { jsx as a } from "react/jsx-runtime";
3
6
  //#region src/bigconsole/components/datasink/DataSinkDataViewer.tsx
4
- var a = e(function({ data: e, dataPath: a, maxHeight: o = "400px", showCopyButton: s = !0 }) {
5
- let [c, l] = n(!1), u = JSON.stringify(e, null, 2), d = t(async () => {
7
+ var o = n(function({ data: n, dataPath: o, maxHeight: s = "400px", showCopyButton: c = !0 }) {
8
+ let [l, u] = i(!1), d = JSON.stringify(n, null, 2), f = r(async () => {
6
9
  try {
7
- await navigator.clipboard.writeText(u), l(!0), setTimeout(() => l(!1), 2e3);
10
+ await navigator.clipboard.writeText(d), u(!0), setTimeout(() => u(!1), 2e3);
8
11
  } catch {}
9
- }, [u]);
10
- return /* @__PURE__ */ i("div", {
11
- className: "relative",
12
- children: [(a || s) && /* @__PURE__ */ i("div", {
13
- className: "flex items-center justify-between p-2 bg-bg-sunken border-b border-border-default rounded-t-md",
14
- children: [a && /* @__PURE__ */ i("span", {
15
- className: "text-xs text-text-secondary font-mono",
16
- children: ["Path: ", a]
17
- }), s && /* @__PURE__ */ r("button", {
18
- type: "button",
19
- onClick: d,
20
- className: "\n px-2 py-1\n text-xs font-medium\n text-text-primary\n bg-bg-surface\n hover:bg-bg-sunken\n rounded\n transition-colors\n ",
21
- children: c ? "Copied!" : "Copy"
22
- })]
23
- }), /* @__PURE__ */ r("pre", {
24
- className: `
25
- p-4
26
- bg-bg-surface
27
- border border-border-default
28
- ${a || s ? "rounded-b-md border-t-0" : "rounded-md"}
29
- overflow-auto
30
- text-sm
31
- `,
32
- style: { maxHeight: o },
33
- children: /* @__PURE__ */ r("code", {
34
- className: "text-text-primary font-mono",
35
- children: u
12
+ }, [d]);
13
+ return /* @__PURE__ */ a(t, {
14
+ emphasis: "muted",
15
+ padding: "compact",
16
+ headingLevel: 3,
17
+ title: "Raw JSON",
18
+ meta: o ? /* @__PURE__ */ a("span", {
19
+ className: "font-mono text-xs text-text-secondary",
20
+ children: o
21
+ }) : void 0,
22
+ actions: c ? /* @__PURE__ */ a("button", {
23
+ type: "button",
24
+ onClick: f,
25
+ className: `min-h-[var(--size-controlHeight-md)] rounded-button bg-bg-surface px-2 py-1 text-xs font-medium text-text-primary hover:bg-bg-elevated motion-safe:transition-colors ${e}`,
26
+ children: l ? "Copied!" : "Copy"
27
+ }) : void 0,
28
+ headerClassName: "mb-control-gap",
29
+ children: /* @__PURE__ */ a("pre", {
30
+ className: "min-w-0 overflow-auto rounded-input bg-bg-surface p-3 text-xs sm:text-sm",
31
+ style: { maxHeight: s },
32
+ children: /* @__PURE__ */ a("code", {
33
+ className: "font-mono text-text-primary",
34
+ children: d
36
35
  })
37
- })]
36
+ })
38
37
  });
39
38
  });
40
39
  //#endregion
41
- export { a as default };
40
+ export { o as default };
42
41
 
43
42
  //# sourceMappingURL=DataSinkDataViewer.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"DataSinkDataViewer.js","names":[],"sources":["../../../../src/bigconsole/components/datasink/DataSinkDataViewer.tsx"],"sourcesContent":["/**\n * DataSink Data Viewer\n *\n * Component for viewing DataSink data as formatted JSON.\n */\n\nimport { memo, useState, useCallback } from 'react';\n\n// ============================================================================\n// TYPES\n// ============================================================================\n\ninterface DataSinkDataViewerProps {\n /** Data to display */\n data: unknown;\n /** Optional path to display */\n dataPath?: string;\n /** Maximum height */\n maxHeight?: string;\n /** Whether to show copy button */\n showCopyButton?: boolean;\n}\n\n// ============================================================================\n// COMPONENT\n// ============================================================================\n\nexport const DataSinkDataViewer = memo(function DataSinkDataViewer({\n data,\n dataPath,\n maxHeight = '400px',\n showCopyButton = true,\n}: DataSinkDataViewerProps) {\n const [isCopied, setIsCopied] = useState(false);\n\n // Format data as JSON\n const formattedData = JSON.stringify(data, null, 2);\n\n // Copy to clipboard\n const handleCopy = useCallback(async () => {\n try {\n await navigator.clipboard.writeText(formattedData);\n setIsCopied(true);\n setTimeout(() => setIsCopied(false), 2000);\n } catch (err) {}\n }, [formattedData]);\n\n return (\n <div className=\"relative\">\n {/* Header with path and copy button */}\n {(dataPath || showCopyButton) && (\n <div className=\"flex items-center justify-between p-2 bg-bg-sunken border-b border-border-default rounded-t-md\">\n {dataPath && <span className=\"text-xs text-text-secondary font-mono\">Path: {dataPath}</span>}\n {showCopyButton && (\n <button\n type=\"button\"\n onClick={handleCopy}\n className={`\n px-2 py-1\n text-xs font-medium\n text-text-primary\n bg-bg-surface\n hover:bg-bg-sunken\n rounded\n transition-colors\n `}\n >\n {isCopied ? 'Copied!' : 'Copy'}\n </button>\n )}\n </div>\n )}\n\n {/* Data display */}\n <pre\n className={`\n p-4\n bg-bg-surface\n border border-border-default\n ${dataPath || showCopyButton ? 'rounded-b-md border-t-0' : 'rounded-md'}\n overflow-auto\n text-sm\n `}\n style={{ maxHeight }}\n >\n <code className=\"text-text-primary font-mono\">{formattedData}</code>\n </pre>\n </div>\n );\n});\n\nexport default DataSinkDataViewer;\n"],"mappings":";;;AA2BA,IAAa,IAAqB,EAAK,SAA4B,EACjE,SACA,aACA,eAAY,SACZ,oBAAiB,MACS;CAC1B,IAAM,CAAC,GAAU,KAAe,EAAS,GAAM,EAGzC,IAAgB,KAAK,UAAU,GAAM,MAAM,EAAE,EAG7C,IAAa,EAAY,YAAY;AACzC,MAAI;AAGF,GAFA,MAAM,UAAU,UAAU,UAAU,EAAc,EAClD,EAAY,GAAK,EACjB,iBAAiB,EAAY,GAAM,EAAE,IAAK;UAC9B;IACb,CAAC,EAAc,CAAC;AAEnB,QACE,kBAAC,OAAD;EAAK,WAAU;YAAf,EAEI,KAAY,MACZ,kBAAC,OAAD;GAAK,WAAU;aAAf,CACG,KAAY,kBAAC,QAAD;IAAM,WAAU;cAAhB,CAAwD,UAAO,EAAgB;OAC3F,KACC,kBAAC,UAAD;IACE,MAAK;IACL,SAAS;IACT,WAAW;cAUV,IAAW,YAAY;IACjB,CAAA,CAEP;MAIR,kBAAC,OAAD;GACE,WAAW;;;;YAIP,KAAY,IAAiB,4BAA4B,aAAa;;;;GAI1E,OAAO,EAAE,cAAW;aAEpB,kBAAC,QAAD;IAAM,WAAU;cAA+B;IAAqB,CAAA;GAChE,CAAA,CACF;;EAER"}
1
+ {"version":3,"file":"DataSinkDataViewer.js","names":[],"sources":["../../../../src/bigconsole/components/datasink/DataSinkDataViewer.tsx"],"sourcesContent":["/**\n * DataSink Data Viewer\n *\n * Component for viewing DataSink data as formatted JSON.\n */\n\nimport { memo, useState, useCallback } from 'react';\nimport { Section, SECTION_FOCUS_RING } from '../common';\n\n// ============================================================================\n// TYPES\n// ============================================================================\n\ninterface DataSinkDataViewerProps {\n /** Data to display */\n data: unknown;\n /** Optional path to display */\n dataPath?: string;\n /** Maximum height */\n maxHeight?: string;\n /** Whether to show copy button */\n showCopyButton?: boolean;\n}\n\n// ============================================================================\n// COMPONENT\n// ============================================================================\n\nexport const DataSinkDataViewer = memo(function DataSinkDataViewer({\n data,\n dataPath,\n maxHeight = '400px',\n showCopyButton = true,\n}: DataSinkDataViewerProps) {\n const [isCopied, setIsCopied] = useState(false);\n\n // Format data as JSON\n const formattedData = JSON.stringify(data, null, 2);\n\n // Copy to clipboard\n const handleCopy = useCallback(async () => {\n try {\n await navigator.clipboard.writeText(formattedData);\n setIsCopied(true);\n setTimeout(() => setIsCopied(false), 2000);\n } catch (err) {}\n }, [formattedData]);\n\n return (\n <Section\n emphasis=\"muted\"\n padding=\"compact\"\n // Rendered directly inside the detail page's level-2 \"Data preview\"\n // section, so h3 keeps the outline unbroken (h2 h4 would skip a level).\n headingLevel={3}\n title=\"Raw JSON\"\n meta={dataPath ? <span className=\"font-mono text-xs text-text-secondary\">{dataPath}</span> : undefined}\n actions={\n showCopyButton ? (\n <button\n type=\"button\"\n onClick={handleCopy}\n className={`min-h-[var(--size-controlHeight-md)] rounded-button bg-bg-surface px-2 py-1 text-xs font-medium text-text-primary hover:bg-bg-elevated motion-safe:transition-colors ${SECTION_FOCUS_RING}`}\n >\n {isCopied ? 'Copied!' : 'Copy'}\n </button>\n ) : undefined\n }\n headerClassName=\"mb-control-gap\"\n >\n <pre className=\"min-w-0 overflow-auto rounded-input bg-bg-surface p-3 text-xs sm:text-sm\" style={{ maxHeight }}>\n <code className=\"font-mono text-text-primary\">{formattedData}</code>\n </pre>\n </Section>\n );\n});\n\nexport default DataSinkDataViewer;\n"],"mappings":";;;;;;AA4BA,IAAa,IAAqB,EAAK,SAA4B,EACjE,SACA,aACA,eAAY,SACZ,oBAAiB,MACS;CAC1B,IAAM,CAAC,GAAU,KAAe,EAAS,GAAM,EAGzC,IAAgB,KAAK,UAAU,GAAM,MAAM,EAAE,EAG7C,IAAa,EAAY,YAAY;AACzC,MAAI;AAGF,GAFA,MAAM,UAAU,UAAU,UAAU,EAAc,EAClD,EAAY,GAAK,EACjB,iBAAiB,EAAY,GAAM,EAAE,IAAK;UAC9B;IACb,CAAC,EAAc,CAAC;AAEnB,QACE,kBAAC,GAAD;EACE,UAAS;EACT,SAAQ;EAGR,cAAc;EACd,OAAM;EACN,MAAM,IAAW,kBAAC,QAAD;GAAM,WAAU;aAAyC;GAAgB,CAAA,GAAG,KAAA;EAC7F,SACE,IACE,kBAAC,UAAD;GACE,MAAK;GACL,SAAS;GACT,WAAW,wKAAwK;aAElL,IAAW,YAAY;GACjB,CAAA,GACP,KAAA;EAEN,iBAAgB;YAEhB,kBAAC,OAAD;GAAK,WAAU;GAA2E,OAAO,EAAE,cAAW;aAC5G,kBAAC,QAAD;IAAM,WAAU;cAA+B;IAAqB,CAAA;GAChE,CAAA;EACE,CAAA;EAEZ"}
@@ -1,75 +1,98 @@
1
- import { memo as e, useCallback as t } from "react";
2
- import { useI18n as n } from "@burdenoff/fe-libs/shared/providers/shell/I18nProvider";
3
- import { jsx as r, jsxs as i } from "react/jsx-runtime";
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 { useModalFocusTrap as n } from "../../hooks/useModalFocusTrap.js";
5
+ import { memo as r, useCallback as i, useId as a, useRef as o } from "react";
6
+ import { useI18n as s } from "@burdenoff/fe-libs/shared/providers/shell/I18nProvider";
7
+ import { jsx as c, jsxs as l } from "react/jsx-runtime";
4
8
  //#region src/bigconsole/components/datasink/DataSinkDeleteDialog.tsx
5
- var a = e(function({ dataSink: e, isOpen: a, onClose: o, onConfirm: s, isDeleting: c = !1 }) {
6
- let { t: l } = n(), u = t((e) => {
7
- e.target === e.currentTarget && !c && o();
8
- }, [c, o]), d = t((e) => {
9
- e.key === "Escape" && !c && o();
10
- }, [c, o]);
11
- return a ? /* @__PURE__ */ r("div", {
12
- className: "fixed inset-0 z-50 flex items-center justify-center p-4 bg-black/50",
13
- onClick: u,
14
- onKeyDown: d,
15
- role: "dialog",
16
- "aria-modal": "true",
17
- "aria-labelledby": "delete-dialog-title",
18
- children: /* @__PURE__ */ i("div", {
19
- className: "bg-bg-surface border border-border-default rounded-lg shadow-xl max-w-md w-full",
9
+ var u = `min-h-[var(--size-controlHeight-md)] rounded-button px-4 py-2 text-sm font-medium disabled:cursor-not-allowed disabled:opacity-50 motion-safe:transition-colors ${e}`, d = r(function({ dataSink: e, isOpen: r, onClose: d, onConfirm: f, isDeleting: p = !1 }) {
10
+ let { t: m } = s(), h = a(), g = a(), _ = o(null), v = o(null);
11
+ n({
12
+ isOpen: r,
13
+ panelRef: _,
14
+ onClose: i(() => {
15
+ p || d();
16
+ }, [p, d]),
17
+ initialFocusRef: v
18
+ });
19
+ let y = i((e) => {
20
+ e.target === e.currentTarget && !p && d();
21
+ }, [p, d]);
22
+ return r ? /* @__PURE__ */ c("div", {
23
+ className: "fixed inset-0 z-50 flex items-center justify-center bg-[var(--color-bg-overlay)] p-4",
24
+ onClick: y,
25
+ children: /* @__PURE__ */ l("div", {
26
+ ref: _,
27
+ role: "dialog",
28
+ "aria-modal": "true",
29
+ "aria-labelledby": h,
30
+ "aria-describedby": g,
31
+ tabIndex: -1,
32
+ className: "flex max-h-[90vh] w-full max-w-md flex-col rounded-card border border-[var(--color-border-subtle)] bg-bg-surface shadow-[var(--shadow-elevation-3)] focus:outline-none",
20
33
  children: [
21
- /* @__PURE__ */ r("div", {
22
- className: "p-6 border-b border-border-default",
23
- children: /* @__PURE__ */ r("h2", {
24
- id: "delete-dialog-title",
34
+ /* @__PURE__ */ c("div", {
35
+ className: "border-b border-[var(--color-border-subtle)] p-form-gap sm:p-card-padding",
36
+ children: /* @__PURE__ */ c("h2", {
37
+ id: h,
25
38
  className: "text-lg font-semibold text-text-primary",
26
- children: l("bigconsole.dataSinks.deleteDialog.title", "Delete DataSink")
39
+ children: m("bigconsole.dataSinks.deleteDialog.title", "Delete DataSink")
27
40
  })
28
41
  }),
29
- /* @__PURE__ */ i("div", {
30
- className: "p-6",
42
+ /* @__PURE__ */ l("div", {
43
+ className: "min-w-0 flex-1 space-y-form-gap overflow-y-auto p-form-gap sm:p-card-padding",
31
44
  children: [
32
- /* @__PURE__ */ r("p", {
33
- className: "text-sm text-text-primary mb-4",
34
- children: l("bigconsole.dataSinks.deleteDialog.confirmMessage", "Are you sure you want to delete this DataSink?")
45
+ /* @__PURE__ */ c("p", {
46
+ id: g,
47
+ className: "text-sm text-text-primary",
48
+ children: m("bigconsole.dataSinks.deleteDialog.confirmMessage", "Are you sure you want to delete this DataSink?")
35
49
  }),
36
- /* @__PURE__ */ i("div", {
37
- className: "bg-bg-sunken p-3 rounded-md",
38
- children: [/* @__PURE__ */ r("p", {
50
+ /* @__PURE__ */ l(t, {
51
+ emphasis: "muted",
52
+ padding: "compact",
53
+ headingLevel: 3,
54
+ title: "Data sink",
55
+ headerClassName: "mb-control-gap",
56
+ children: [/* @__PURE__ */ c("p", {
39
57
  className: "text-sm font-medium text-text-primary",
40
- children: e.name || l("bigconsole.dataSinks.deleteDialog.untitledName", "Untitled DataSink")
41
- }), /* @__PURE__ */ r("p", {
42
- className: "text-xs text-text-secondary mt-1 font-mono",
58
+ children: e.name || m("bigconsole.dataSinks.deleteDialog.untitledName", "Untitled DataSink")
59
+ }), /* @__PURE__ */ c("p", {
60
+ className: "mt-1 break-all font-mono text-xs text-text-secondary",
43
61
  children: e.key
44
62
  })]
45
63
  }),
46
- e.linkedWorkflowCount && e.linkedWorkflowCount > 0 && /* @__PURE__ */ r("div", {
47
- className: "mt-4 p-3 bg-status-warning-bg/10 border border-status-warning-border/20 rounded-md",
48
- children: /* @__PURE__ */ r("p", {
49
- className: "text-sm text-status-warning-text",
50
- children: e.linkedWorkflowCount === 1 ? l("bigconsole.dataSinks.deleteDialog.linkedWorkflowWarningSingular", "This DataSink is linked to {{count}} workflow. Deleting it will remove these links.", { count: e.linkedWorkflowCount }) : l("bigconsole.dataSinks.deleteDialog.linkedWorkflowWarningPlural", "This DataSink is linked to {{count}} workflows. Deleting it will remove these links.", { count: e.linkedWorkflowCount })
64
+ e.linkedWorkflowCount && e.linkedWorkflowCount > 0 ? /* @__PURE__ */ c(t, {
65
+ tone: "warning",
66
+ padding: "compact",
67
+ headingLevel: 3,
68
+ title: "Workflow links will be removed",
69
+ headerClassName: "mb-control-gap",
70
+ children: /* @__PURE__ */ c("p", {
71
+ className: "text-sm text-[var(--color-status-warning-text)]",
72
+ children: e.linkedWorkflowCount === 1 ? m("bigconsole.dataSinks.deleteDialog.linkedWorkflowWarningSingular", "This DataSink is linked to {{count}} workflow. Deleting it will remove these links.", { count: e.linkedWorkflowCount }) : m("bigconsole.dataSinks.deleteDialog.linkedWorkflowWarningPlural", "This DataSink is linked to {{count}} workflows. Deleting it will remove these links.", { count: e.linkedWorkflowCount })
51
73
  })
52
- }),
53
- /* @__PURE__ */ r("p", {
54
- className: "text-sm text-status-error-text mt-4",
55
- children: l("bigconsole.dataSinks.deleteDialog.cannotBeUndone", "This action cannot be undone.")
74
+ }) : null,
75
+ /* @__PURE__ */ c("p", {
76
+ className: "text-sm text-status-error-text",
77
+ children: m("bigconsole.dataSinks.deleteDialog.cannotBeUndone", "This action cannot be undone.")
56
78
  })
57
79
  ]
58
80
  }),
59
- /* @__PURE__ */ i("div", {
60
- className: "p-6 border-t border-border-default flex items-center justify-end gap-3",
61
- children: [/* @__PURE__ */ r("button", {
81
+ /* @__PURE__ */ l("div", {
82
+ className: "flex flex-wrap items-center justify-end gap-control-gap border-t border-[var(--color-border-subtle)] p-form-gap sm:p-card-padding",
83
+ children: [/* @__PURE__ */ c("button", {
84
+ ref: v,
62
85
  type: "button",
63
- onClick: o,
64
- disabled: c,
65
- 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 disabled:opacity-50 disabled:cursor-not-allowed\n rounded-md\n transition-colors\n ",
66
- children: l("bigconsole.dataSinks.deleteDialog.cancelButton", "Cancel")
67
- }), /* @__PURE__ */ r("button", {
86
+ onClick: d,
87
+ disabled: p,
88
+ className: `${u} bg-bg-sunken text-text-primary hover:bg-bg-elevated`,
89
+ children: m("bigconsole.dataSinks.deleteDialog.cancelButton", "Cancel")
90
+ }), /* @__PURE__ */ c("button", {
68
91
  type: "button",
69
- onClick: s,
70
- disabled: c,
71
- 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 disabled:opacity-50 disabled:cursor-not-allowed\n rounded-md\n transition-colors\n ",
72
- children: c ? l("bigconsole.dataSinks.deleteDialog.deletingButton", "Deleting...") : l("bigconsole.dataSinks.deleteDialog.deleteButton", "Delete")
92
+ onClick: f,
93
+ disabled: p,
94
+ className: `${u} bg-action-danger-bg text-[var(--color-action-danger-text)] hover:bg-[var(--color-action-danger-bgHover)]`,
95
+ children: p ? m("bigconsole.dataSinks.deleteDialog.deletingButton", "Deleting...") : m("bigconsole.dataSinks.deleteDialog.deleteButton", "Delete")
73
96
  })]
74
97
  })
75
98
  ]
@@ -77,6 +100,6 @@ var a = e(function({ dataSink: e, isOpen: a, onClose: o, onConfirm: s, isDeletin
77
100
  }) : null;
78
101
  });
79
102
  //#endregion
80
- export { a as default };
103
+ export { d as default };
81
104
 
82
105
  //# sourceMappingURL=DataSinkDeleteDialog.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"DataSinkDeleteDialog.js","names":[],"sources":["../../../../src/bigconsole/components/datasink/DataSinkDeleteDialog.tsx"],"sourcesContent":["/**\n * DataSink Delete Dialog\n *\n * Confirmation dialog for deleting a DataSink.\n */\n\nimport { memo, useCallback } from 'react';\nimport { useI18n } from '@burdenoff/fe-libs/shared/providers/shell/I18nProvider';\nimport type { DataSink } from '../../types';\n\n// ============================================================================\n// TYPES\n// ============================================================================\n\ninterface DataSinkDeleteDialogProps {\n /** DataSink to delete */\n dataSink: DataSink;\n /** Whether dialog is open */\n isOpen: boolean;\n /** Callback when dialog is closed */\n onClose: () => void;\n /** Callback when delete is confirmed */\n onConfirm: () => void;\n /** Whether delete is in progress */\n isDeleting?: boolean;\n}\n\n// ============================================================================\n// COMPONENT\n// ============================================================================\n\nexport const DataSinkDeleteDialog = memo(function DataSinkDeleteDialog({\n dataSink,\n isOpen,\n onClose,\n onConfirm,\n isDeleting = false,\n}: DataSinkDeleteDialogProps) {\n const { t } = useI18n();\n\n // Handle backdrop click\n const handleBackdropClick = useCallback(\n (e: React.MouseEvent) => {\n if (e.target === e.currentTarget && !isDeleting) {\n onClose();\n }\n },\n [isDeleting, onClose]\n );\n\n // Handle escape key\n const handleKeyDown = useCallback(\n (e: React.KeyboardEvent) => {\n if (e.key === 'Escape' && !isDeleting) {\n onClose();\n }\n },\n [isDeleting, onClose]\n );\n\n if (!isOpen) {\n return null;\n }\n\n return (\n <div\n className=\"fixed inset-0 z-50 flex items-center justify-center p-4 bg-black/50\"\n onClick={handleBackdropClick}\n onKeyDown={handleKeyDown}\n role=\"dialog\"\n aria-modal=\"true\"\n aria-labelledby=\"delete-dialog-title\"\n >\n <div className=\"bg-bg-surface border border-border-default rounded-lg shadow-xl max-w-md w-full\">\n {/* Header */}\n <div className=\"p-6 border-b border-border-default\">\n <h2 id=\"delete-dialog-title\" className=\"text-lg font-semibold text-text-primary\">\n {t('bigconsole.dataSinks.deleteDialog.title', 'Delete DataSink')}\n </h2>\n </div>\n\n {/* Content */}\n <div className=\"p-6\">\n <p className=\"text-sm text-text-primary mb-4\">\n {t('bigconsole.dataSinks.deleteDialog.confirmMessage', 'Are you sure you want to delete this DataSink?')}\n </p>\n\n <div className=\"bg-bg-sunken p-3 rounded-md\">\n <p className=\"text-sm font-medium text-text-primary\">\n {dataSink.name || t('bigconsole.dataSinks.deleteDialog.untitledName', 'Untitled DataSink')}\n </p>\n <p className=\"text-xs text-text-secondary mt-1 font-mono\">{dataSink.key}</p>\n </div>\n\n {dataSink.linkedWorkflowCount && dataSink.linkedWorkflowCount > 0 && (\n <div className=\"mt-4 p-3 bg-status-warning-bg/10 border border-status-warning-border/20 rounded-md\">\n <p className=\"text-sm text-status-warning-text\">\n {dataSink.linkedWorkflowCount === 1\n ? t(\n 'bigconsole.dataSinks.deleteDialog.linkedWorkflowWarningSingular',\n 'This DataSink is linked to {{count}} workflow. Deleting it will remove these links.',\n { count: dataSink.linkedWorkflowCount }\n )\n : t(\n 'bigconsole.dataSinks.deleteDialog.linkedWorkflowWarningPlural',\n 'This DataSink is linked to {{count}} workflows. Deleting it will remove these links.',\n { count: dataSink.linkedWorkflowCount }\n )}\n </p>\n </div>\n )}\n\n <p className=\"text-sm text-status-error-text mt-4\">\n {t('bigconsole.dataSinks.deleteDialog.cannotBeUndone', 'This action cannot be undone.')}\n </p>\n </div>\n\n {/* Footer */}\n <div className=\"p-6 border-t border-border-default flex items-center justify-end gap-3\">\n <button\n type=\"button\"\n onClick={onClose}\n disabled={isDeleting}\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 disabled:opacity-50 disabled:cursor-not-allowed\n rounded-md\n transition-colors\n `}\n >\n {t('bigconsole.dataSinks.deleteDialog.cancelButton', 'Cancel')}\n </button>\n <button\n type=\"button\"\n onClick={onConfirm}\n disabled={isDeleting}\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 disabled:opacity-50 disabled:cursor-not-allowed\n rounded-md\n transition-colors\n `}\n >\n {isDeleting\n ? t('bigconsole.dataSinks.deleteDialog.deletingButton', 'Deleting...')\n : t('bigconsole.dataSinks.deleteDialog.deleteButton', 'Delete')}\n </button>\n </div>\n </div>\n </div>\n );\n});\n\nexport default DataSinkDeleteDialog;\n"],"mappings":";;;;AA+BA,IAAa,IAAuB,EAAK,SAA8B,EACrE,aACA,WACA,YACA,cACA,gBAAa,MACe;CAC5B,IAAM,EAAE,SAAM,GAAS,EAGjB,IAAsB,GACzB,MAAwB;AACvB,EAAI,EAAE,WAAW,EAAE,iBAAiB,CAAC,KACnC,GAAS;IAGb,CAAC,GAAY,EAAQ,CACtB,EAGK,IAAgB,GACnB,MAA2B;AAC1B,EAAI,EAAE,QAAQ,YAAY,CAAC,KACzB,GAAS;IAGb,CAAC,GAAY,EAAQ,CACtB;AAMD,QAJK,IAKH,kBAAC,OAAD;EACE,WAAU;EACV,SAAS;EACT,WAAW;EACX,MAAK;EACL,cAAW;EACX,mBAAgB;YAEhB,kBAAC,OAAD;GAAK,WAAU;aAAf;IAEE,kBAAC,OAAD;KAAK,WAAU;eACb,kBAAC,MAAD;MAAI,IAAG;MAAsB,WAAU;gBACpC,EAAE,2CAA2C,kBAAkB;MAC7D,CAAA;KACD,CAAA;IAGN,kBAAC,OAAD;KAAK,WAAU;eAAf;MACE,kBAAC,KAAD;OAAG,WAAU;iBACV,EAAE,oDAAoD,iDAAiD;OACtG,CAAA;MAEJ,kBAAC,OAAD;OAAK,WAAU;iBAAf,CACE,kBAAC,KAAD;QAAG,WAAU;kBACV,EAAS,QAAQ,EAAE,kDAAkD,oBAAoB;QACxF,CAAA,EACJ,kBAAC,KAAD;QAAG,WAAU;kBAA8C,EAAS;QAAQ,CAAA,CACxE;;MAEL,EAAS,uBAAuB,EAAS,sBAAsB,KAC9D,kBAAC,OAAD;OAAK,WAAU;iBACb,kBAAC,KAAD;QAAG,WAAU;kBACV,EAAS,wBAAwB,IAC9B,EACE,mEACA,uFACA,EAAE,OAAO,EAAS,qBAAqB,CACxC,GACD,EACE,iEACA,wFACA,EAAE,OAAO,EAAS,qBAAqB,CACxC;QACH,CAAA;OACA,CAAA;MAGR,kBAAC,KAAD;OAAG,WAAU;iBACV,EAAE,oDAAoD,gCAAgC;OACrF,CAAA;MACA;;IAGN,kBAAC,OAAD;KAAK,WAAU;eAAf,CACE,kBAAC,UAAD;MACE,MAAK;MACL,SAAS;MACT,UAAU;MACV,WAAW;gBAWV,EAAE,kDAAkD,SAAS;MACvD,CAAA,EACT,kBAAC,UAAD;MACE,MAAK;MACL,SAAS;MACT,UAAU;MACV,WAAW;gBAWV,IACG,EAAE,oDAAoD,cAAc,GACpE,EAAE,kDAAkD,SAAS;MAC1D,CAAA,CACL;;IACF;;EACF,CAAA,GAhGC;EAkGT"}
1
+ {"version":3,"file":"DataSinkDeleteDialog.js","names":[],"sources":["../../../../src/bigconsole/components/datasink/DataSinkDeleteDialog.tsx"],"sourcesContent":["/**\n * DataSink Delete Dialog\n *\n * Confirmation dialog for deleting a DataSink.\n */\n\nimport { memo, useCallback, useId, useRef } from 'react';\nimport { useI18n } from '@burdenoff/fe-libs/shared/providers/shell/I18nProvider';\nimport { useModalFocusTrap } from '../../hooks/useModalFocusTrap';\nimport { Section, SECTION_FOCUS_RING } from '../common';\nimport type { DataSink } from '../../types';\n\n/** Shared button recipe for the dialog footer. Keeps a visible focus ring. */\nconst DIALOG_BUTTON =\n `min-h-[var(--size-controlHeight-md)] rounded-button px-4 py-2 text-sm font-medium disabled:cursor-not-allowed disabled:opacity-50 motion-safe:transition-colors ${SECTION_FOCUS_RING}` as const;\n\n// ============================================================================\n// TYPES\n// ============================================================================\n\ninterface DataSinkDeleteDialogProps {\n /** DataSink to delete */\n dataSink: DataSink;\n /** Whether dialog is open */\n isOpen: boolean;\n /** Callback when dialog is closed */\n onClose: () => void;\n /** Callback when delete is confirmed */\n onConfirm: () => void;\n /** Whether delete is in progress */\n isDeleting?: boolean;\n}\n\n// ============================================================================\n// COMPONENT\n// ============================================================================\n\nexport const DataSinkDeleteDialog = memo(function DataSinkDeleteDialog({\n dataSink,\n isOpen,\n onClose,\n onConfirm,\n isDeleting = false,\n}: DataSinkDeleteDialogProps) {\n const { t } = useI18n();\n const titleId = useId();\n const descriptionId = useId();\n const panelRef = useRef<HTMLDivElement | null>(null);\n const cancelRef = useRef<HTMLButtonElement | null>(null);\n\n // Escape must not yank the dialog away mid-delete — the request is already in\n // flight and the user would be left guessing whether it landed.\n const handleEscape = useCallback(() => {\n if (!isDeleting) onClose();\n }, [isDeleting, onClose]);\n\n // `aria-modal=\"true\"` promises assistive tech that focus is confined to the\n // panel, so it has to actually be confined. Cancel is the entry point: this is\n // a destructive confirmation, so the control under the keyboard is the safe\n // one. Same contract as the pipeline and workflow delete dialogs.\n useModalFocusTrap({ isOpen, panelRef, onClose: handleEscape, initialFocusRef: cancelRef });\n\n // Handle backdrop click\n const handleBackdropClick = useCallback(\n (e: React.MouseEvent) => {\n if (e.target === e.currentTarget && !isDeleting) {\n onClose();\n }\n },\n [isDeleting, onClose]\n );\n\n if (!isOpen) {\n return null;\n }\n\n return (\n <div\n className=\"fixed inset-0 z-50 flex items-center justify-center bg-[var(--color-bg-overlay)] p-4\"\n onClick={handleBackdropClick}\n >\n {/*\n `role=\"dialog\"` / `aria-modal` belong on the PANEL, not the scrim: on the\n scrim the dialog boundary screen readers announce is the whole viewport.\n */}\n <div\n ref={panelRef}\n role=\"dialog\"\n aria-modal=\"true\"\n aria-labelledby={titleId}\n aria-describedby={descriptionId}\n tabIndex={-1}\n className=\"flex max-h-[90vh] w-full max-w-md flex-col rounded-card border border-[var(--color-border-subtle)] bg-bg-surface shadow-[var(--shadow-elevation-3)] focus:outline-none\"\n >\n {/* Header strip — structural only. */}\n <div className=\"border-b border-[var(--color-border-subtle)] p-form-gap sm:p-card-padding\">\n <h2 id={titleId} className=\"text-lg font-semibold text-text-primary\">\n {t('bigconsole.dataSinks.deleteDialog.title', 'Delete DataSink')}\n </h2>\n </div>\n\n {/* Body */}\n <div className=\"min-w-0 flex-1 space-y-form-gap overflow-y-auto p-form-gap sm:p-card-padding\">\n <p id={descriptionId} className=\"text-sm text-text-primary\">\n {t('bigconsole.dataSinks.deleteDialog.confirmMessage', 'Are you sure you want to delete this DataSink?')}\n </p>\n\n <Section\n emphasis=\"muted\"\n padding=\"compact\"\n headingLevel={3}\n title=\"Data sink\"\n headerClassName=\"mb-control-gap\"\n >\n <p className=\"text-sm font-medium text-text-primary\">\n {dataSink.name || t('bigconsole.dataSinks.deleteDialog.untitledName', 'Untitled DataSink')}\n </p>\n <p className=\"mt-1 break-all font-mono text-xs text-text-secondary\">{dataSink.key}</p>\n </Section>\n\n {dataSink.linkedWorkflowCount && dataSink.linkedWorkflowCount > 0 ? (\n <Section\n tone=\"warning\"\n padding=\"compact\"\n headingLevel={3}\n title=\"Workflow links will be removed\"\n headerClassName=\"mb-control-gap\"\n >\n <p className=\"text-sm text-[var(--color-status-warning-text)]\">\n {dataSink.linkedWorkflowCount === 1\n ? t(\n 'bigconsole.dataSinks.deleteDialog.linkedWorkflowWarningSingular',\n 'This DataSink is linked to {{count}} workflow. Deleting it will remove these links.',\n { count: dataSink.linkedWorkflowCount }\n )\n : t(\n 'bigconsole.dataSinks.deleteDialog.linkedWorkflowWarningPlural',\n 'This DataSink is linked to {{count}} workflows. Deleting it will remove these links.',\n { count: dataSink.linkedWorkflowCount }\n )}\n </p>\n </Section>\n ) : null}\n\n <p className=\"text-sm text-status-error-text\">\n {t('bigconsole.dataSinks.deleteDialog.cannotBeUndone', 'This action cannot be undone.')}\n </p>\n </div>\n\n {/* Footer strip */}\n <div className=\"flex flex-wrap items-center justify-end gap-control-gap border-t border-[var(--color-border-subtle)] p-form-gap sm:p-card-padding\">\n <button\n ref={cancelRef}\n type=\"button\"\n onClick={onClose}\n disabled={isDeleting}\n className={`${DIALOG_BUTTON} bg-bg-sunken text-text-primary hover:bg-bg-elevated`}\n >\n {t('bigconsole.dataSinks.deleteDialog.cancelButton', 'Cancel')}\n </button>\n <button\n type=\"button\"\n onClick={onConfirm}\n disabled={isDeleting}\n className={`${DIALOG_BUTTON} bg-action-danger-bg text-[var(--color-action-danger-text)] hover:bg-[var(--color-action-danger-bgHover)]`}\n >\n {isDeleting\n ? t('bigconsole.dataSinks.deleteDialog.deletingButton', 'Deleting...')\n : t('bigconsole.dataSinks.deleteDialog.deleteButton', 'Delete')}\n </button>\n </div>\n </div>\n </div>\n );\n});\n\nexport default DataSinkDeleteDialog;\n"],"mappings":";;;;;;;;AAaA,IAAM,IACJ,mKAAmK,KAuBxJ,IAAuB,EAAK,SAA8B,EACrE,aACA,WACA,YACA,cACA,gBAAa,MACe;CAC5B,IAAM,EAAE,SAAM,GAAS,EACjB,IAAU,GAAO,EACjB,IAAgB,GAAO,EACvB,IAAW,EAA8B,KAAK,EAC9C,IAAY,EAAiC,KAAK;AAYxD,GAAkB;EAAE;EAAQ;EAAU,SARjB,QAAkB;AACrC,GAAK,KAAY,GAAS;KACzB,CAAC,GAAY,EAAQ,CAAC;EAMoC,iBAAiB;EAAW,CAAC;CAG1F,IAAM,IAAsB,GACzB,MAAwB;AACvB,EAAI,EAAE,WAAW,EAAE,iBAAiB,CAAC,KACnC,GAAS;IAGb,CAAC,GAAY,EAAQ,CACtB;AAMD,QAJK,IAKH,kBAAC,OAAD;EACE,WAAU;EACV,SAAS;YAMT,kBAAC,OAAD;GACE,KAAK;GACL,MAAK;GACL,cAAW;GACX,mBAAiB;GACjB,oBAAkB;GAClB,UAAU;GACV,WAAU;aAPZ;IAUE,kBAAC,OAAD;KAAK,WAAU;eACb,kBAAC,MAAD;MAAI,IAAI;MAAS,WAAU;gBACxB,EAAE,2CAA2C,kBAAkB;MAC7D,CAAA;KACD,CAAA;IAGN,kBAAC,OAAD;KAAK,WAAU;eAAf;MACE,kBAAC,KAAD;OAAG,IAAI;OAAe,WAAU;iBAC7B,EAAE,oDAAoD,iDAAiD;OACtG,CAAA;MAEJ,kBAAC,GAAD;OACE,UAAS;OACT,SAAQ;OACR,cAAc;OACd,OAAM;OACN,iBAAgB;iBALlB,CAOE,kBAAC,KAAD;QAAG,WAAU;kBACV,EAAS,QAAQ,EAAE,kDAAkD,oBAAoB;QACxF,CAAA,EACJ,kBAAC,KAAD;QAAG,WAAU;kBAAwD,EAAS;QAAQ,CAAA,CAC9E;;MAET,EAAS,uBAAuB,EAAS,sBAAsB,IAC9D,kBAAC,GAAD;OACE,MAAK;OACL,SAAQ;OACR,cAAc;OACd,OAAM;OACN,iBAAgB;iBAEhB,kBAAC,KAAD;QAAG,WAAU;kBACV,EAAS,wBAAwB,IAC9B,EACE,mEACA,uFACA,EAAE,OAAO,EAAS,qBAAqB,CACxC,GACD,EACE,iEACA,wFACA,EAAE,OAAO,EAAS,qBAAqB,CACxC;QACH,CAAA;OACI,CAAA,GACR;MAEJ,kBAAC,KAAD;OAAG,WAAU;iBACV,EAAE,oDAAoD,gCAAgC;OACrF,CAAA;MACA;;IAGN,kBAAC,OAAD;KAAK,WAAU;eAAf,CACE,kBAAC,UAAD;MACE,KAAK;MACL,MAAK;MACL,SAAS;MACT,UAAU;MACV,WAAW,GAAG,EAAc;gBAE3B,EAAE,kDAAkD,SAAS;MACvD,CAAA,EACT,kBAAC,UAAD;MACE,MAAK;MACL,SAAS;MACT,UAAU;MACV,WAAW,GAAG,EAAc;gBAE3B,IACG,EAAE,oDAAoD,cAAc,GACpE,EAAE,kDAAkD,SAAS;MAC1D,CAAA,CACL;;IACF;;EACF,CAAA,GAnGC;EAqGT"}
@@ -1,82 +1,92 @@
1
- import { memo as e, useCallback as t, useState as n } from "react";
2
- import { useI18n as r } from "@burdenoff/fe-libs/shared/providers/shell/I18nProvider";
3
- import { jsx as i, jsxs as a } from "react/jsx-runtime";
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 { memo as n, useCallback as r, useState as i } from "react";
5
+ import { useI18n as a } from "@burdenoff/fe-libs/shared/providers/shell/I18nProvider";
6
+ import { jsx as o, jsxs as s } from "react/jsx-runtime";
4
7
  //#region src/bigconsole/components/datasink/DataSinkRefreshDialog.tsx
5
- var o = e(function({ dataSink: e, isOpen: o, onClose: s, onConfirm: c, isRefreshing: l = !1 }) {
6
- let { t: u } = r(), [d, f] = n(!1), p = t((e) => {
7
- e.target === e.currentTarget && !l && s();
8
- }, [l, s]), m = (e) => new Date(e).toLocaleString(), h = t(() => {
9
- c(d);
10
- }, [c, d]);
11
- return o ? /* @__PURE__ */ i("div", {
12
- className: "fixed inset-0 z-50 flex items-center justify-center p-4 bg-black/50",
13
- onClick: p,
8
+ var c = `min-h-[var(--size-controlHeight-md)] rounded-button px-4 py-2 text-sm font-medium disabled:cursor-not-allowed disabled:opacity-50 motion-safe:transition-colors ${e}`, l = n(function({ dataSink: n, isOpen: l, onClose: u, onConfirm: d, isRefreshing: f = !1 }) {
9
+ let { t: p } = a(), [m, h] = i(!1), g = r((e) => {
10
+ e.target === e.currentTarget && !f && u();
11
+ }, [f, u]), _ = (e) => new Date(e).toLocaleString(), v = r(() => {
12
+ d(m);
13
+ }, [d, m]);
14
+ return l ? /* @__PURE__ */ o("div", {
15
+ className: "fixed inset-0 z-50 flex items-center justify-center bg-[var(--color-bg-overlay)] p-4",
16
+ onClick: g,
14
17
  role: "dialog",
15
18
  "aria-modal": "true",
16
19
  "aria-labelledby": "refresh-dialog-title",
17
- children: /* @__PURE__ */ a("div", {
18
- className: "bg-bg-surface border border-border-default rounded-lg shadow-xl max-w-md w-full",
20
+ children: /* @__PURE__ */ s("div", {
21
+ className: "flex max-h-[90vh] w-full max-w-md flex-col rounded-card border border-[var(--color-border-subtle)] bg-bg-surface shadow-[var(--shadow-elevation-3)]",
19
22
  children: [
20
- /* @__PURE__ */ i("div", {
21
- className: "p-6 border-b border-border-default",
22
- children: /* @__PURE__ */ i("h2", {
23
+ /* @__PURE__ */ o("div", {
24
+ className: "border-b border-[var(--color-border-subtle)] p-form-gap sm:p-card-padding",
25
+ children: /* @__PURE__ */ o("h2", {
23
26
  id: "refresh-dialog-title",
24
27
  className: "text-lg font-semibold text-text-primary",
25
- children: u("bigconsole.dataSinks.refreshDialog.title", "Refresh DataSink")
28
+ children: p("bigconsole.dataSinks.refreshDialog.title", "Refresh DataSink")
26
29
  })
27
30
  }),
28
- /* @__PURE__ */ a("div", {
29
- className: "p-6",
30
- children: [
31
- /* @__PURE__ */ a("div", {
32
- className: "bg-bg-sunken p-3 rounded-md mb-4",
33
- children: [
34
- /* @__PURE__ */ i("p", {
35
- className: "text-sm font-medium text-text-primary",
36
- children: e.name || u("bigconsole.dataSinks.refreshDialog.untitledName", "Untitled DataSink")
37
- }),
38
- /* @__PURE__ */ i("p", {
39
- className: "text-xs text-text-secondary mt-1 font-mono",
40
- children: e.key
41
- }),
42
- e.lastRefreshedAt && /* @__PURE__ */ i("p", {
43
- className: "text-xs text-text-secondary mt-2",
44
- children: u("bigconsole.dataSinks.refreshDialog.lastRefreshed", "Last refreshed: {{date}}", { date: m(e.lastRefreshedAt) })
45
- })
46
- ]
47
- }),
48
- /* @__PURE__ */ a("label", {
49
- className: "flex items-center gap-2 cursor-pointer",
50
- children: [/* @__PURE__ */ i("input", {
31
+ /* @__PURE__ */ s("div", {
32
+ className: "min-w-0 flex-1 space-y-form-gap overflow-y-auto p-form-gap sm:p-card-padding",
33
+ children: [/* @__PURE__ */ s(t, {
34
+ emphasis: "muted",
35
+ padding: "compact",
36
+ headingLevel: 3,
37
+ title: "Data sink",
38
+ headerClassName: "mb-control-gap",
39
+ children: [
40
+ /* @__PURE__ */ o("p", {
41
+ className: "text-sm font-medium text-text-primary",
42
+ children: n.name || p("bigconsole.dataSinks.refreshDialog.untitledName", "Untitled DataSink")
43
+ }),
44
+ /* @__PURE__ */ o("p", {
45
+ className: "mt-1 break-all font-mono text-xs text-text-secondary",
46
+ children: n.key
47
+ }),
48
+ n.lastRefreshedAt && /* @__PURE__ */ o("p", {
49
+ className: "mt-2 text-xs text-text-secondary",
50
+ children: p("bigconsole.dataSinks.refreshDialog.lastRefreshed", "Last refreshed: {{date}}", { date: _(n.lastRefreshedAt) })
51
+ })
52
+ ]
53
+ }), /* @__PURE__ */ s(t, {
54
+ emphasis: "bare",
55
+ padding: "none",
56
+ headingLevel: 3,
57
+ title: "Options",
58
+ headerClassName: "mb-control-gap",
59
+ children: [/* @__PURE__ */ s("label", {
60
+ className: "flex min-h-[var(--size-controlHeight-md)] cursor-pointer items-center gap-2",
61
+ children: [/* @__PURE__ */ o("input", {
51
62
  type: "checkbox",
52
- checked: d,
53
- onChange: (e) => f(e.target.checked),
54
- className: "w-4 h-4 text-action-primary-bg focus:ring-action-primary-bg rounded"
55
- }), /* @__PURE__ */ i("span", {
63
+ checked: m,
64
+ onChange: (e) => h(e.target.checked),
65
+ className: `h-4 w-4 rounded ${e}`
66
+ }), /* @__PURE__ */ o("span", {
56
67
  className: "text-sm text-text-primary",
57
- children: u("bigconsole.dataSinks.refreshDialog.forceRefreshLabel", "Force refresh (bypass cache)")
68
+ children: p("bigconsole.dataSinks.refreshDialog.forceRefreshLabel", "Force refresh (bypass cache)")
58
69
  })]
59
- }),
60
- /* @__PURE__ */ i("p", {
61
- className: "mt-2 text-xs text-text-secondary",
62
- children: u("bigconsole.dataSinks.refreshDialog.forceRefreshDescription", "Force refresh will re-fetch all data from the source, ignoring any cached values.")
63
- })
64
- ]
70
+ }), /* @__PURE__ */ o("p", {
71
+ className: "mt-1 text-xs text-text-secondary",
72
+ children: p("bigconsole.dataSinks.refreshDialog.forceRefreshDescription", "Force refresh will re-fetch all data from the source, ignoring any cached values.")
73
+ })]
74
+ })]
65
75
  }),
66
- /* @__PURE__ */ a("div", {
67
- className: "p-6 border-t border-border-default flex items-center justify-end gap-3",
68
- children: [/* @__PURE__ */ i("button", {
76
+ /* @__PURE__ */ s("div", {
77
+ className: "flex flex-wrap items-center justify-end gap-control-gap border-t border-[var(--color-border-subtle)] p-form-gap sm:p-card-padding",
78
+ children: [/* @__PURE__ */ o("button", {
69
79
  type: "button",
70
- onClick: s,
71
- disabled: l,
72
- 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 disabled:opacity-50 disabled:cursor-not-allowed\n rounded-md\n transition-colors\n ",
73
- children: u("bigconsole.dataSinks.refreshDialog.cancelButton", "Cancel")
74
- }), /* @__PURE__ */ i("button", {
80
+ onClick: u,
81
+ disabled: f,
82
+ className: `${c} bg-bg-sunken text-text-primary hover:bg-bg-elevated`,
83
+ children: p("bigconsole.dataSinks.refreshDialog.cancelButton", "Cancel")
84
+ }), /* @__PURE__ */ o("button", {
75
85
  type: "button",
76
- onClick: h,
77
- disabled: l,
78
- className: "\n px-4 py-2\n text-sm font-medium\n text-action-primary-fg\n bg-action-primary-bg\n hover:bg-action-primary-bgHover\n disabled:opacity-50 disabled:cursor-not-allowed\n rounded-md\n transition-colors\n ",
79
- children: l ? u("bigconsole.dataSinks.refreshDialog.refreshingButton", "Refreshing...") : u("bigconsole.dataSinks.refreshDialog.refreshButton", "Refresh")
86
+ onClick: v,
87
+ disabled: f,
88
+ className: `${c} bg-action-primary-bg text-action-primary-text hover:bg-action-primary-bgHover`,
89
+ children: f ? p("bigconsole.dataSinks.refreshDialog.refreshingButton", "Refreshing...") : p("bigconsole.dataSinks.refreshDialog.refreshButton", "Refresh")
80
90
  })]
81
91
  })
82
92
  ]
@@ -84,6 +94,6 @@ var o = e(function({ dataSink: e, isOpen: o, onClose: s, onConfirm: c, isRefresh
84
94
  }) : null;
85
95
  });
86
96
  //#endregion
87
- export { o as default };
97
+ export { l as default };
88
98
 
89
99
  //# sourceMappingURL=DataSinkRefreshDialog.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"DataSinkRefreshDialog.js","names":[],"sources":["../../../../src/bigconsole/components/datasink/DataSinkRefreshDialog.tsx"],"sourcesContent":["/**\n * DataSink Refresh Dialog\n *\n * Dialog for confirming DataSink refresh with force option.\n */\n\nimport { memo, useState, useCallback } from 'react';\nimport { useI18n } from '@burdenoff/fe-libs/shared/providers/shell/I18nProvider';\nimport type { DataSink } from '../../types';\n\n// ============================================================================\n// TYPES\n// ============================================================================\n\ninterface DataSinkRefreshDialogProps {\n /** DataSink to refresh */\n dataSink: DataSink;\n /** Whether dialog is open */\n isOpen: boolean;\n /** Callback when dialog is closed */\n onClose: () => void;\n /** Callback when refresh is confirmed (with force flag) */\n onConfirm: (force: boolean) => void;\n /** Whether refresh is in progress */\n isRefreshing?: boolean;\n}\n\n// ============================================================================\n// COMPONENT\n// ============================================================================\n\nexport const DataSinkRefreshDialog = memo(function DataSinkRefreshDialog({\n dataSink,\n isOpen,\n onClose,\n onConfirm,\n isRefreshing = false,\n}: DataSinkRefreshDialogProps) {\n const { t } = useI18n();\n const [forceRefresh, setForceRefresh] = useState(false);\n\n // Handle backdrop click\n const handleBackdropClick = useCallback(\n (e: React.MouseEvent) => {\n if (e.target === e.currentTarget && !isRefreshing) {\n onClose();\n }\n },\n [isRefreshing, onClose]\n );\n\n // Format date\n const formatDate = (dateString: string) => {\n return new Date(dateString).toLocaleString();\n };\n\n // Handle confirm\n const handleConfirm = useCallback(() => {\n onConfirm(forceRefresh);\n }, [onConfirm, forceRefresh]);\n\n if (!isOpen) {\n return null;\n }\n\n return (\n <div\n className=\"fixed inset-0 z-50 flex items-center justify-center p-4 bg-black/50\"\n onClick={handleBackdropClick}\n role=\"dialog\"\n aria-modal=\"true\"\n aria-labelledby=\"refresh-dialog-title\"\n >\n <div className=\"bg-bg-surface border border-border-default rounded-lg shadow-xl max-w-md w-full\">\n {/* Header */}\n <div className=\"p-6 border-b border-border-default\">\n <h2 id=\"refresh-dialog-title\" className=\"text-lg font-semibold text-text-primary\">\n {t('bigconsole.dataSinks.refreshDialog.title', 'Refresh DataSink')}\n </h2>\n </div>\n\n {/* Content */}\n <div className=\"p-6\">\n {/* DataSink info */}\n <div className=\"bg-bg-sunken p-3 rounded-md mb-4\">\n <p className=\"text-sm font-medium text-text-primary\">\n {dataSink.name || t('bigconsole.dataSinks.refreshDialog.untitledName', 'Untitled DataSink')}\n </p>\n <p className=\"text-xs text-text-secondary mt-1 font-mono\">{dataSink.key}</p>\n {dataSink.lastRefreshedAt && (\n <p className=\"text-xs text-text-secondary mt-2\">\n {t('bigconsole.dataSinks.refreshDialog.lastRefreshed', 'Last refreshed: {{date}}', {\n date: formatDate(dataSink.lastRefreshedAt),\n })}\n </p>\n )}\n </div>\n\n {/* Force refresh option */}\n <label className=\"flex items-center gap-2 cursor-pointer\">\n <input\n type=\"checkbox\"\n checked={forceRefresh}\n onChange={(e) => setForceRefresh(e.target.checked)}\n className=\"w-4 h-4 text-action-primary-bg focus:ring-action-primary-bg rounded\"\n />\n <span className=\"text-sm text-text-primary\">\n {t('bigconsole.dataSinks.refreshDialog.forceRefreshLabel', 'Force refresh (bypass cache)')}\n </span>\n </label>\n <p className=\"mt-2 text-xs text-text-secondary\">\n {t(\n 'bigconsole.dataSinks.refreshDialog.forceRefreshDescription',\n 'Force refresh will re-fetch all data from the source, ignoring any cached values.'\n )}\n </p>\n </div>\n\n {/* Footer */}\n <div className=\"p-6 border-t border-border-default flex items-center justify-end gap-3\">\n <button\n type=\"button\"\n onClick={onClose}\n disabled={isRefreshing}\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 disabled:opacity-50 disabled:cursor-not-allowed\n rounded-md\n transition-colors\n `}\n >\n {t('bigconsole.dataSinks.refreshDialog.cancelButton', 'Cancel')}\n </button>\n <button\n type=\"button\"\n onClick={handleConfirm}\n disabled={isRefreshing}\n className={`\n px-4 py-2\n text-sm font-medium\n text-action-primary-fg\n bg-action-primary-bg\n hover:bg-action-primary-bgHover\n disabled:opacity-50 disabled:cursor-not-allowed\n rounded-md\n transition-colors\n `}\n >\n {isRefreshing\n ? t('bigconsole.dataSinks.refreshDialog.refreshingButton', 'Refreshing...')\n : t('bigconsole.dataSinks.refreshDialog.refreshButton', 'Refresh')}\n </button>\n </div>\n </div>\n </div>\n );\n});\n\nexport default DataSinkRefreshDialog;\n"],"mappings":";;;;AA+BA,IAAa,IAAwB,EAAK,SAA+B,EACvE,aACA,WACA,YACA,cACA,kBAAe,MACc;CAC7B,IAAM,EAAE,SAAM,GAAS,EACjB,CAAC,GAAc,KAAmB,EAAS,GAAM,EAGjD,IAAsB,GACzB,MAAwB;AACvB,EAAI,EAAE,WAAW,EAAE,iBAAiB,CAAC,KACnC,GAAS;IAGb,CAAC,GAAc,EAAQ,CACxB,EAGK,KAAc,MACX,IAAI,KAAK,EAAW,CAAC,gBAAgB,EAIxC,IAAgB,QAAkB;AACtC,IAAU,EAAa;IACtB,CAAC,GAAW,EAAa,CAAC;AAM7B,QAJK,IAKH,kBAAC,OAAD;EACE,WAAU;EACV,SAAS;EACT,MAAK;EACL,cAAW;EACX,mBAAgB;YAEhB,kBAAC,OAAD;GAAK,WAAU;aAAf;IAEE,kBAAC,OAAD;KAAK,WAAU;eACb,kBAAC,MAAD;MAAI,IAAG;MAAuB,WAAU;gBACrC,EAAE,4CAA4C,mBAAmB;MAC/D,CAAA;KACD,CAAA;IAGN,kBAAC,OAAD;KAAK,WAAU;eAAf;MAEE,kBAAC,OAAD;OAAK,WAAU;iBAAf;QACE,kBAAC,KAAD;SAAG,WAAU;mBACV,EAAS,QAAQ,EAAE,mDAAmD,oBAAoB;SACzF,CAAA;QACJ,kBAAC,KAAD;SAAG,WAAU;mBAA8C,EAAS;SAAQ,CAAA;QAC3E,EAAS,mBACR,kBAAC,KAAD;SAAG,WAAU;mBACV,EAAE,oDAAoD,4BAA4B,EACjF,MAAM,EAAW,EAAS,gBAAgB,EAC3C,CAAC;SACA,CAAA;QAEF;;MAGN,kBAAC,SAAD;OAAO,WAAU;iBAAjB,CACE,kBAAC,SAAD;QACE,MAAK;QACL,SAAS;QACT,WAAW,MAAM,EAAgB,EAAE,OAAO,QAAQ;QAClD,WAAU;QACV,CAAA,EACF,kBAAC,QAAD;QAAM,WAAU;kBACb,EAAE,wDAAwD,+BAA+B;QACrF,CAAA,CACD;;MACR,kBAAC,KAAD;OAAG,WAAU;iBACV,EACC,8DACA,oFACD;OACC,CAAA;MACA;;IAGN,kBAAC,OAAD;KAAK,WAAU;eAAf,CACE,kBAAC,UAAD;MACE,MAAK;MACL,SAAS;MACT,UAAU;MACV,WAAW;gBAWV,EAAE,mDAAmD,SAAS;MACxD,CAAA,EACT,kBAAC,UAAD;MACE,MAAK;MACL,SAAS;MACT,UAAU;MACV,WAAW;gBAWV,IACG,EAAE,uDAAuD,gBAAgB,GACzE,EAAE,oDAAoD,UAAU;MAC7D,CAAA,CACL;;IACF;;EACF,CAAA,GAhGC;EAkGT"}
1
+ {"version":3,"file":"DataSinkRefreshDialog.js","names":[],"sources":["../../../../src/bigconsole/components/datasink/DataSinkRefreshDialog.tsx"],"sourcesContent":["/**\n * DataSink Refresh Dialog\n *\n * Dialog for confirming DataSink refresh with force option.\n */\n\nimport { memo, useState, useCallback } from 'react';\nimport { useI18n } from '@burdenoff/fe-libs/shared/providers/shell/I18nProvider';\nimport { Section, SECTION_FOCUS_RING } from '../common';\nimport type { DataSink } from '../../types';\n\n/** Shared button recipe for the dialog footer. Keeps a visible focus ring. */\nconst DIALOG_BUTTON =\n `min-h-[var(--size-controlHeight-md)] rounded-button px-4 py-2 text-sm font-medium disabled:cursor-not-allowed disabled:opacity-50 motion-safe:transition-colors ${SECTION_FOCUS_RING}` as const;\n\n// ============================================================================\n// TYPES\n// ============================================================================\n\ninterface DataSinkRefreshDialogProps {\n /** DataSink to refresh */\n dataSink: DataSink;\n /** Whether dialog is open */\n isOpen: boolean;\n /** Callback when dialog is closed */\n onClose: () => void;\n /** Callback when refresh is confirmed (with force flag) */\n onConfirm: (force: boolean) => void;\n /** Whether refresh is in progress */\n isRefreshing?: boolean;\n}\n\n// ============================================================================\n// COMPONENT\n// ============================================================================\n\nexport const DataSinkRefreshDialog = memo(function DataSinkRefreshDialog({\n dataSink,\n isOpen,\n onClose,\n onConfirm,\n isRefreshing = false,\n}: DataSinkRefreshDialogProps) {\n const { t } = useI18n();\n const [forceRefresh, setForceRefresh] = useState(false);\n\n // Handle backdrop click\n const handleBackdropClick = useCallback(\n (e: React.MouseEvent) => {\n if (e.target === e.currentTarget && !isRefreshing) {\n onClose();\n }\n },\n [isRefreshing, onClose]\n );\n\n // Format date\n const formatDate = (dateString: string) => {\n return new Date(dateString).toLocaleString();\n };\n\n // Handle confirm\n const handleConfirm = useCallback(() => {\n onConfirm(forceRefresh);\n }, [onConfirm, forceRefresh]);\n\n if (!isOpen) {\n return null;\n }\n\n return (\n <div\n className=\"fixed inset-0 z-50 flex items-center justify-center bg-[var(--color-bg-overlay)] p-4\"\n onClick={handleBackdropClick}\n role=\"dialog\"\n aria-modal=\"true\"\n aria-labelledby=\"refresh-dialog-title\"\n >\n <div className=\"flex max-h-[90vh] w-full max-w-md flex-col rounded-card border border-[var(--color-border-subtle)] bg-bg-surface shadow-[var(--shadow-elevation-3)]\">\n {/* Header strip — structural only. */}\n <div className=\"border-b border-[var(--color-border-subtle)] p-form-gap sm:p-card-padding\">\n <h2 id=\"refresh-dialog-title\" className=\"text-lg font-semibold text-text-primary\">\n {t('bigconsole.dataSinks.refreshDialog.title', 'Refresh DataSink')}\n </h2>\n </div>\n\n {/* Body */}\n <div className=\"min-w-0 flex-1 space-y-form-gap overflow-y-auto p-form-gap sm:p-card-padding\">\n <Section\n emphasis=\"muted\"\n padding=\"compact\"\n headingLevel={3}\n title=\"Data sink\"\n headerClassName=\"mb-control-gap\"\n >\n <p className=\"text-sm font-medium text-text-primary\">\n {dataSink.name || t('bigconsole.dataSinks.refreshDialog.untitledName', 'Untitled DataSink')}\n </p>\n <p className=\"mt-1 break-all font-mono text-xs text-text-secondary\">{dataSink.key}</p>\n {dataSink.lastRefreshedAt && (\n <p className=\"mt-2 text-xs text-text-secondary\">\n {t('bigconsole.dataSinks.refreshDialog.lastRefreshed', 'Last refreshed: {{date}}', {\n date: formatDate(dataSink.lastRefreshedAt),\n })}\n </p>\n )}\n </Section>\n\n <Section emphasis=\"bare\" padding=\"none\" headingLevel={3} title=\"Options\" headerClassName=\"mb-control-gap\">\n <label className=\"flex min-h-[var(--size-controlHeight-md)] cursor-pointer items-center gap-2\">\n <input\n type=\"checkbox\"\n checked={forceRefresh}\n onChange={(e) => setForceRefresh(e.target.checked)}\n className={`h-4 w-4 rounded ${SECTION_FOCUS_RING}`}\n />\n <span className=\"text-sm text-text-primary\">\n {t('bigconsole.dataSinks.refreshDialog.forceRefreshLabel', 'Force refresh (bypass cache)')}\n </span>\n </label>\n <p className=\"mt-1 text-xs text-text-secondary\">\n {t(\n 'bigconsole.dataSinks.refreshDialog.forceRefreshDescription',\n 'Force refresh will re-fetch all data from the source, ignoring any cached values.'\n )}\n </p>\n </Section>\n </div>\n\n {/* Footer strip */}\n <div className=\"flex flex-wrap items-center justify-end gap-control-gap border-t border-[var(--color-border-subtle)] p-form-gap sm:p-card-padding\">\n <button\n type=\"button\"\n onClick={onClose}\n disabled={isRefreshing}\n className={`${DIALOG_BUTTON} bg-bg-sunken text-text-primary hover:bg-bg-elevated`}\n >\n {t('bigconsole.dataSinks.refreshDialog.cancelButton', 'Cancel')}\n </button>\n <button\n type=\"button\"\n onClick={handleConfirm}\n disabled={isRefreshing}\n className={`${DIALOG_BUTTON} bg-action-primary-bg text-action-primary-text hover:bg-action-primary-bgHover`}\n >\n {isRefreshing\n ? t('bigconsole.dataSinks.refreshDialog.refreshingButton', 'Refreshing...')\n : t('bigconsole.dataSinks.refreshDialog.refreshButton', 'Refresh')}\n </button>\n </div>\n </div>\n </div>\n );\n});\n\nexport default DataSinkRefreshDialog;\n"],"mappings":";;;;;;;AAYA,IAAM,IACJ,mKAAmK,KAuBxJ,IAAwB,EAAK,SAA+B,EACvE,aACA,WACA,YACA,cACA,kBAAe,MACc;CAC7B,IAAM,EAAE,SAAM,GAAS,EACjB,CAAC,GAAc,KAAmB,EAAS,GAAM,EAGjD,IAAsB,GACzB,MAAwB;AACvB,EAAI,EAAE,WAAW,EAAE,iBAAiB,CAAC,KACnC,GAAS;IAGb,CAAC,GAAc,EAAQ,CACxB,EAGK,KAAc,MACX,IAAI,KAAK,EAAW,CAAC,gBAAgB,EAIxC,IAAgB,QAAkB;AACtC,IAAU,EAAa;IACtB,CAAC,GAAW,EAAa,CAAC;AAM7B,QAJK,IAKH,kBAAC,OAAD;EACE,WAAU;EACV,SAAS;EACT,MAAK;EACL,cAAW;EACX,mBAAgB;YAEhB,kBAAC,OAAD;GAAK,WAAU;aAAf;IAEE,kBAAC,OAAD;KAAK,WAAU;eACb,kBAAC,MAAD;MAAI,IAAG;MAAuB,WAAU;gBACrC,EAAE,4CAA4C,mBAAmB;MAC/D,CAAA;KACD,CAAA;IAGN,kBAAC,OAAD;KAAK,WAAU;eAAf,CACE,kBAAC,GAAD;MACE,UAAS;MACT,SAAQ;MACR,cAAc;MACd,OAAM;MACN,iBAAgB;gBALlB;OAOE,kBAAC,KAAD;QAAG,WAAU;kBACV,EAAS,QAAQ,EAAE,mDAAmD,oBAAoB;QACzF,CAAA;OACJ,kBAAC,KAAD;QAAG,WAAU;kBAAwD,EAAS;QAAQ,CAAA;OACrF,EAAS,mBACR,kBAAC,KAAD;QAAG,WAAU;kBACV,EAAE,oDAAoD,4BAA4B,EACjF,MAAM,EAAW,EAAS,gBAAgB,EAC3C,CAAC;QACA,CAAA;OAEE;SAEV,kBAAC,GAAD;MAAS,UAAS;MAAO,SAAQ;MAAO,cAAc;MAAG,OAAM;MAAU,iBAAgB;gBAAzF,CACE,kBAAC,SAAD;OAAO,WAAU;iBAAjB,CACE,kBAAC,SAAD;QACE,MAAK;QACL,SAAS;QACT,WAAW,MAAM,EAAgB,EAAE,OAAO,QAAQ;QAClD,WAAW,mBAAmB;QAC9B,CAAA,EACF,kBAAC,QAAD;QAAM,WAAU;kBACb,EAAE,wDAAwD,+BAA+B;QACrF,CAAA,CACD;UACR,kBAAC,KAAD;OAAG,WAAU;iBACV,EACC,8DACA,oFACD;OACC,CAAA,CACI;QACN;;IAGN,kBAAC,OAAD;KAAK,WAAU;eAAf,CACE,kBAAC,UAAD;MACE,MAAK;MACL,SAAS;MACT,UAAU;MACV,WAAW,GAAG,EAAc;gBAE3B,EAAE,mDAAmD,SAAS;MACxD,CAAA,EACT,kBAAC,UAAD;MACE,MAAK;MACL,SAAS;MACT,UAAU;MACV,WAAW,GAAG,EAAc;gBAE3B,IACG,EAAE,uDAAuD,gBAAgB,GACzE,EAAE,oDAAoD,UAAU;MAC7D,CAAA,CACL;;IACF;;EACF,CAAA,GApFC;EAsFT"}
@@ -47,7 +47,7 @@ var r = e(function({ status: e, size: r = "md", showIcon: i = !0 }) {
47
47
  },
48
48
  stale: {
49
49
  bg: "bg-status-warning-bg/10",
50
- text: "text-status-warning-text",
50
+ text: "text-[var(--color-status-warning-text)]",
51
51
  icon: /* @__PURE__ */ t("svg", {
52
52
  className: o[r],
53
53
  fill: "none",