@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":"BuilderCanvas.js","names":[],"sources":["../../../../src/bigconsole/components/builder/BuilderCanvas.tsx"],"sourcesContent":["import { type FC, type ReactNode, memo } from 'react';\n\nexport interface BuilderCanvasProps {\n palette?: ReactNode;\n canvas: ReactNode;\n inspector?: ReactNode;\n}\n\n/** Stable pane composition. Palette and inspector slots will be migrated here incrementally. */\nexport const BuilderCanvas: FC<BuilderCanvasProps> = memo(function BuilderCanvas({ palette, canvas, inspector }) {\n return (\n <div className=\"flex min-h-0 min-w-0 flex-1 overflow-hidden\" data-testid=\"dashboard-editor-panes\">\n {palette}\n <main className=\"relative min-w-0 flex-1 overflow-hidden\">{canvas}</main>\n {inspector}\n </div>\n );\n});\n"],"mappings":";;;AASA,IAAa,IAAwC,EAAK,SAAuB,EAAE,YAAS,WAAQ,gBAAa;AAC/G,QACE,kBAAC,OAAD;EAAK,WAAU;EAA8C,eAAY;YAAzE;GACG;GACD,kBAAC,QAAD;IAAM,WAAU;cAA2C;IAAc,CAAA;GACxE;GACG;;EAER"}
1
+ {"version":3,"file":"BuilderCanvas.js","names":[],"sources":["../../../../src/bigconsole/components/builder/BuilderCanvas.tsx"],"sourcesContent":["import { type FC, type ReactNode, memo } from 'react';\n\nexport interface BuilderCanvasProps {\n palette?: ReactNode;\n canvas: ReactNode;\n inspector?: ReactNode;\n}\n\n/**\n * Stable pane composition for the builder: palette, canvas, inspector.\n *\n * The three panes sit side by side from `md` up. Below that they stack, because\n * a 300px palette pinned next to a canvas leaves the canvas unusably narrow on a\n * phone (BOFF-5636). The canvas keeps `min-w-0` so a wide widget grid scrolls\n * inside itself instead of pushing the page into horizontal scroll.\n */\nexport const BuilderCanvas: FC<BuilderCanvasProps> = memo(function BuilderCanvas({ palette, canvas, inspector }) {\n return (\n <div\n className=\"flex min-h-0 min-w-0 flex-1 flex-col overflow-hidden md:flex-row\"\n data-testid=\"dashboard-editor-panes\"\n >\n {palette}\n <main className=\"relative min-h-0 min-w-0 flex-1 overflow-hidden\">{canvas}</main>\n {inspector}\n </div>\n );\n});\n"],"mappings":";;;AAgBA,IAAa,IAAwC,EAAK,SAAuB,EAAE,YAAS,WAAQ,gBAAa;AAC/G,QACE,kBAAC,OAAD;EACE,WAAU;EACV,eAAY;YAFd;GAIG;GACD,kBAAC,QAAD;IAAM,WAAU;cAAmD;IAAc,CAAA;GAChF;GACG;;EAER"}
@@ -5,7 +5,7 @@ import { jsx as r, jsxs as i } from "react/jsx-runtime";
5
5
  //#region src/bigconsole/components/builder/BuilderTopbar.tsx
6
6
  var a = e(function({ title: e, onBack: a, actions: o }) {
7
7
  return /* @__PURE__ */ i("header", {
8
- className: "flex min-h-12 items-center gap-3 border-b border-border-default bg-bg-surface px-3 py-2",
8
+ className: "flex min-h-12 flex-wrap items-center gap-x-control-gap gap-y-1 border-b border-[var(--color-border-subtle)] bg-bg-surface px-3 py-2",
9
9
  children: [
10
10
  /* @__PURE__ */ i(n, {
11
11
  onClick: a,
@@ -16,12 +16,12 @@ var a = e(function({ title: e, onBack: a, actions: o }) {
16
16
  children: [/* @__PURE__ */ r(t, { className: "mr-2 size-4" }), "Back"]
17
17
  }),
18
18
  /* @__PURE__ */ r("h1", {
19
- className: "min-w-0 flex-1 truncate text-sm font-semibold text-text-primary",
19
+ className: "min-w-0 flex-1 truncate text-base font-semibold tracking-tight text-text-primary",
20
20
  title: e,
21
21
  children: e
22
22
  }),
23
23
  o && /* @__PURE__ */ r("div", {
24
- className: "flex flex-shrink-0 items-center gap-2",
24
+ className: "flex flex-shrink-0 flex-wrap items-center gap-2",
25
25
  children: o
26
26
  })
27
27
  ]
@@ -1 +1 @@
1
- {"version":3,"file":"BuilderTopbar.js","names":[],"sources":["../../../../src/bigconsole/components/builder/BuilderTopbar.tsx"],"sourcesContent":["import { type FC, type ReactNode, memo } from 'react';\nimport { ArrowLeft } from 'lucide-react';\nimport { Button } from '@burdenoff/fe-libs/ui';\n\nexport interface BuilderTopbarProps {\n title: string;\n onBack: () => void;\n actions?: ReactNode;\n}\n\n/** Route-level navigation and identity for the dashboard editor. */\nexport const BuilderTopbar: FC<BuilderTopbarProps> = memo(function BuilderTopbar({ title, onBack, actions }) {\n return (\n <header className=\"flex min-h-12 items-center gap-3 border-b border-border-default bg-bg-surface px-3 py-2\">\n <Button onClick={onBack} variant=\"ghost\" size=\"sm\" title=\"Back to Dashboards\" aria-label=\"Back to Dashboards\">\n <ArrowLeft className=\"mr-2 size-4\" />\n Back\n </Button>\n <h1 className=\"min-w-0 flex-1 truncate text-sm font-semibold text-text-primary\" title={title}>\n {title}\n </h1>\n {actions && <div className=\"flex flex-shrink-0 items-center gap-2\">{actions}</div>}\n </header>\n );\n});\n"],"mappings":";;;;;AAWA,IAAa,IAAwC,EAAK,SAAuB,EAAE,UAAO,WAAQ,cAAW;AAC3G,QACE,kBAAC,UAAD;EAAQ,WAAU;YAAlB;GACE,kBAAC,GAAD;IAAQ,SAAS;IAAQ,SAAQ;IAAQ,MAAK;IAAK,OAAM;IAAqB,cAAW;cAAzF,CACE,kBAAC,GAAD,EAAW,WAAU,eAAgB,CAAA,EAAA,OAE9B;;GACT,kBAAC,MAAD;IAAI,WAAU;IAAyE;cACpF;IACE,CAAA;GACJ,KAAW,kBAAC,OAAD;IAAK,WAAU;cAAyC;IAAc,CAAA;GAC3E;;EAEX"}
1
+ {"version":3,"file":"BuilderTopbar.js","names":[],"sources":["../../../../src/bigconsole/components/builder/BuilderTopbar.tsx"],"sourcesContent":["import { type FC, type ReactNode, memo } from 'react';\nimport { ArrowLeft } from 'lucide-react';\nimport { Button } from '@burdenoff/fe-libs/ui';\n\nexport interface BuilderTopbarProps {\n title: string;\n onBack: () => void;\n actions?: ReactNode;\n}\n\n/**\n * Route-level navigation and identity for the dashboard editor.\n *\n * This is the route's `h1`, so it is set heavier than the section titles below\n * it; previously it was `text-sm`, i.e. lighter than the dashboard title in the\n * toolbar directly beneath, which made two adjacent bars compete (BOFF-5636).\n * The bar is a `bare` structural strip — spacing and a seam, no card surface.\n */\nexport const BuilderTopbar: FC<BuilderTopbarProps> = memo(function BuilderTopbar({ title, onBack, actions }) {\n return (\n <header className=\"flex min-h-12 flex-wrap items-center gap-x-control-gap gap-y-1 border-b border-[var(--color-border-subtle)] bg-bg-surface px-3 py-2\">\n <Button onClick={onBack} variant=\"ghost\" size=\"sm\" title=\"Back to Dashboards\" aria-label=\"Back to Dashboards\">\n <ArrowLeft className=\"mr-2 size-4\" />\n Back\n </Button>\n <h1 className=\"min-w-0 flex-1 truncate text-base font-semibold tracking-tight text-text-primary\" title={title}>\n {title}\n </h1>\n {actions && <div className=\"flex flex-shrink-0 flex-wrap items-center gap-2\">{actions}</div>}\n </header>\n );\n});\n"],"mappings":";;;;;AAkBA,IAAa,IAAwC,EAAK,SAAuB,EAAE,UAAO,WAAQ,cAAW;AAC3G,QACE,kBAAC,UAAD;EAAQ,WAAU;YAAlB;GACE,kBAAC,GAAD;IAAQ,SAAS;IAAQ,SAAQ;IAAQ,MAAK;IAAK,OAAM;IAAqB,cAAW;cAAzF,CACE,kBAAC,GAAD,EAAW,WAAU,eAAgB,CAAA,EAAA,OAE9B;;GACT,kBAAC,MAAD;IAAI,WAAU;IAA0F;cACrG;IACE,CAAA;GACJ,KAAW,kBAAC,OAAD;IAAK,WAAU;cAAmD;IAAc,CAAA;GACrF;;EAEX"}
@@ -1,45 +1,44 @@
1
- import { memo as e } from "react";
2
- import { Select as t, SelectContent as n, SelectItem as r, SelectTrigger as i, SelectValue as a } from "@burdenoff/fe-libs/ui";
3
- import { jsx as o, jsxs as s } from "react/jsx-runtime";
1
+ import { Section as e } from "../../common/Section.js";
2
+ import "../../common/index.js";
3
+ import { memo as t } from "react";
4
+ import { Select as n, SelectContent as r, SelectItem as i, SelectTrigger as a, SelectValue as o } from "@burdenoff/fe-libs/ui";
5
+ import { jsx as s, jsxs as c } from "react/jsx-runtime";
4
6
  //#region src/bigconsole/components/builder/inspector/AdvancedSection.tsx
5
- var c = e(function({ renderer: e, rendererOptions: c, onRendererChange: l, templateEditor: u }) {
6
- let d = c.find((t) => t.value === e);
7
- return /* @__PURE__ */ s("section", {
8
- className: "border-t border-border-default pt-4",
9
- "aria-labelledby": "widget-advanced-renderer-heading",
7
+ var l = t(function({ renderer: t, rendererOptions: l, onRendererChange: u, templateEditor: d }) {
8
+ let f = l.find((e) => e.value === t);
9
+ return /* @__PURE__ */ c(e, {
10
+ id: "widget-advanced-renderer",
11
+ title: "Renderer",
12
+ description: "Which engine draws this widget's body. Non-native renderers take a JSON template.",
13
+ "data-testid": "widget-inspector-renderer",
10
14
  children: [
11
- /* @__PURE__ */ o("h3", {
12
- id: "widget-advanced-renderer-heading",
13
- className: "mb-1 text-sm font-semibold text-text-primary",
14
- children: "Renderer"
15
- }),
16
- /* @__PURE__ */ s(t, {
17
- value: e,
18
- onValueChange: (e) => l(e),
19
- children: [/* @__PURE__ */ o(i, {
20
- className: "h-9 text-sm",
21
- children: /* @__PURE__ */ o(a, { placeholder: "Select renderer" })
22
- }), /* @__PURE__ */ o(n, {
15
+ /* @__PURE__ */ c(n, {
16
+ value: t,
17
+ onValueChange: (e) => u(e),
18
+ children: [/* @__PURE__ */ s(a, {
19
+ className: "h-control-md text-sm",
20
+ children: /* @__PURE__ */ s(o, { placeholder: "Select renderer" })
21
+ }), /* @__PURE__ */ s(r, {
23
22
  position: "popper",
24
23
  side: "bottom",
25
24
  sideOffset: 4,
26
25
  align: "start",
27
26
  className: "max-h-52",
28
- children: c.map((e) => /* @__PURE__ */ o(r, {
27
+ children: l.map((e) => /* @__PURE__ */ s(i, {
29
28
  value: e.value,
30
29
  children: e.label
31
30
  }, e.value))
32
31
  })]
33
32
  }),
34
- d && /* @__PURE__ */ o("p", {
33
+ f && /* @__PURE__ */ s("p", {
35
34
  className: "mt-1 text-sm text-text-muted",
36
- children: d.description
35
+ children: f.description
37
36
  }),
38
- u
37
+ d
39
38
  ]
40
39
  });
41
40
  });
42
41
  //#endregion
43
- export { c as AdvancedSection };
42
+ export { l as AdvancedSection };
44
43
 
45
44
  //# sourceMappingURL=AdvancedSection.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"AdvancedSection.js","names":[],"sources":["../../../../../src/bigconsole/components/builder/inspector/AdvancedSection.tsx"],"sourcesContent":["import { type FC, type ReactNode, memo } from 'react';\nimport { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from '@burdenoff/fe-libs/ui';\nimport type { RendererType } from '../../../types';\n\nexport interface AdvancedRendererOption {\n value: RendererType;\n label: string;\n description: string;\n}\n\nexport interface AdvancedSectionProps {\n renderer: RendererType;\n rendererOptions: AdvancedRendererOption[];\n onRendererChange: (renderer: RendererType) => void;\n templateEditor?: ReactNode;\n}\n\n/** Renderer/template controls; actions and integrations migrate here next. */\nexport const AdvancedSection: FC<AdvancedSectionProps> = memo(function AdvancedSection({\n renderer,\n rendererOptions,\n onRendererChange,\n templateEditor,\n}) {\n const selectedOption = rendererOptions.find((option) => option.value === renderer);\n\n return (\n <section className=\"border-t border-border-default pt-4\" aria-labelledby=\"widget-advanced-renderer-heading\">\n <h3 id=\"widget-advanced-renderer-heading\" className=\"mb-1 text-sm font-semibold text-text-primary\">\n Renderer\n </h3>\n <Select value={renderer} onValueChange={(value) => onRendererChange(value as RendererType)}>\n <SelectTrigger className=\"h-9 text-sm\">\n <SelectValue placeholder=\"Select renderer\" />\n </SelectTrigger>\n <SelectContent position=\"popper\" side=\"bottom\" sideOffset={4} align=\"start\" className=\"max-h-52\">\n {rendererOptions.map((option) => (\n <SelectItem key={option.value} value={option.value}>\n {option.label}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n {selectedOption && <p className=\"mt-1 text-sm text-text-muted\">{selectedOption.description}</p>}\n {templateEditor}\n </section>\n );\n});\n"],"mappings":";;;;AAkBA,IAAa,IAA4C,EAAK,SAAyB,EACrF,aACA,oBACA,qBACA,qBACC;CACD,IAAM,IAAiB,EAAgB,MAAM,MAAW,EAAO,UAAU,EAAS;AAElF,QACE,kBAAC,WAAD;EAAS,WAAU;EAAsC,mBAAgB;YAAzE;GACE,kBAAC,MAAD;IAAI,IAAG;IAAmC,WAAU;cAA+C;IAE9F,CAAA;GACL,kBAAC,GAAD;IAAQ,OAAO;IAAU,gBAAgB,MAAU,EAAiB,EAAsB;cAA1F,CACE,kBAAC,GAAD;KAAe,WAAU;eACvB,kBAAC,GAAD,EAAa,aAAY,mBAAoB,CAAA;KAC/B,CAAA,EAChB,kBAAC,GAAD;KAAe,UAAS;KAAS,MAAK;KAAS,YAAY;KAAG,OAAM;KAAQ,WAAU;eACnF,EAAgB,KAAK,MACpB,kBAAC,GAAD;MAA+B,OAAO,EAAO;gBAC1C,EAAO;MACG,EAFI,EAAO,MAEX,CACb;KACY,CAAA,CACT;;GACR,KAAkB,kBAAC,KAAD;IAAG,WAAU;cAAgC,EAAe;IAAgB,CAAA;GAC9F;GACO;;EAEZ"}
1
+ {"version":3,"file":"AdvancedSection.js","names":[],"sources":["../../../../../src/bigconsole/components/builder/inspector/AdvancedSection.tsx"],"sourcesContent":["import { type FC, type ReactNode, memo } from 'react';\nimport { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from '@burdenoff/fe-libs/ui';\nimport type { RendererType } from '../../../types';\nimport { Section } from '../../common';\n\nexport interface AdvancedRendererOption {\n value: RendererType;\n label: string;\n description: string;\n}\n\nexport interface AdvancedSectionProps {\n renderer: RendererType;\n rendererOptions: AdvancedRendererOption[];\n onRendererChange: (renderer: RendererType) => void;\n templateEditor?: ReactNode;\n}\n\n/** Renderer/template controls; actions and integrations migrate here next. */\nexport const AdvancedSection: FC<AdvancedSectionProps> = memo(function AdvancedSection({\n renderer,\n rendererOptions,\n onRendererChange,\n templateEditor,\n}) {\n const selectedOption = rendererOptions.find((option) => option.value === renderer);\n\n return (\n <Section\n id=\"widget-advanced-renderer\"\n title=\"Renderer\"\n description=\"Which engine draws this widget's body. Non-native renderers take a JSON template.\"\n data-testid=\"widget-inspector-renderer\"\n >\n <Select value={renderer} onValueChange={(value) => onRendererChange(value as RendererType)}>\n <SelectTrigger className=\"h-control-md text-sm\">\n <SelectValue placeholder=\"Select renderer\" />\n </SelectTrigger>\n <SelectContent position=\"popper\" side=\"bottom\" sideOffset={4} align=\"start\" className=\"max-h-52\">\n {rendererOptions.map((option) => (\n <SelectItem key={option.value} value={option.value}>\n {option.label}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n {selectedOption && <p className=\"mt-1 text-sm text-text-muted\">{selectedOption.description}</p>}\n {templateEditor}\n </Section>\n );\n});\n"],"mappings":";;;;;;AAmBA,IAAa,IAA4C,EAAK,SAAyB,EACrF,aACA,oBACA,qBACA,qBACC;CACD,IAAM,IAAiB,EAAgB,MAAM,MAAW,EAAO,UAAU,EAAS;AAElF,QACE,kBAAC,GAAD;EACE,IAAG;EACH,OAAM;EACN,aAAY;EACZ,eAAY;YAJd;GAME,kBAAC,GAAD;IAAQ,OAAO;IAAU,gBAAgB,MAAU,EAAiB,EAAsB;cAA1F,CACE,kBAAC,GAAD;KAAe,WAAU;eACvB,kBAAC,GAAD,EAAa,aAAY,mBAAoB,CAAA;KAC/B,CAAA,EAChB,kBAAC,GAAD;KAAe,UAAS;KAAS,MAAK;KAAS,YAAY;KAAG,OAAM;KAAQ,WAAU;eACnF,EAAgB,KAAK,MACpB,kBAAC,GAAD;MAA+B,OAAO,EAAO;gBAC1C,EAAO;MACG,EAFI,EAAO,MAEX,CACb;KACY,CAAA,CACT;;GACR,KAAkB,kBAAC,KAAD;IAAG,WAAU;cAAgC,EAAe;IAAgB,CAAA;GAC9F;GACO;;EAEZ"}
@@ -1,45 +1,56 @@
1
- import e from "../../widgets/chart/ChartConfig.js";
2
- import t from "../../widgets/gauge/GaugeConfig.js";
3
- import n from "../../widgets/heatmap/HeatmapConfig.js";
4
- import r from "../../widgets/list/ListConfig.js";
5
- import i from "../../widgets/metric-card/MetricCardConfig.js";
6
- import a from "../../widgets/progress/ProgressConfig.js";
7
- import o from "../../widgets/table/TableConfig.js";
8
- import { memo as s } from "react";
9
- import { jsx as c } from "react/jsx-runtime";
1
+ import { Section as e } from "../../common/Section.js";
2
+ import "../../common/index.js";
3
+ import t from "../../widgets/chart/ChartConfig.js";
4
+ import n from "../../widgets/gauge/GaugeConfig.js";
5
+ import r from "../../widgets/heatmap/HeatmapConfig.js";
6
+ import i from "../../widgets/list/ListConfig.js";
7
+ import a from "../../widgets/metric-card/MetricCardConfig.js";
8
+ import o from "../../widgets/progress/ProgressConfig.js";
9
+ import s from "../../widgets/table/TableConfig.js";
10
+ import { memo as c } from "react";
11
+ import { jsx as l } from "react/jsx-runtime";
10
12
  //#region src/bigconsole/components/builder/inspector/AppearanceSection.tsx
11
- function l(e) {
13
+ function u(e) {
12
14
  return e;
13
15
  }
14
- function u(s) {
15
- switch (s) {
16
+ function d(e) {
17
+ switch (e) {
16
18
  case "metric_card":
17
- case "kpi_card_comparison": return l(i);
19
+ case "kpi_card_comparison": return u(a);
18
20
  case "chart":
19
- case "funnel_chart": return l(e);
21
+ case "funnel_chart": return u(t);
20
22
  case "table":
21
- case "pivot_table": return l(o);
22
- case "gauge": return l(t);
23
- case "progress": return l(a);
24
- case "list": return l(r);
25
- case "heatmap": return l(n);
23
+ case "pivot_table": return u(s);
24
+ case "gauge": return u(n);
25
+ case "progress": return u(o);
26
+ case "list": return u(i);
27
+ case "heatmap": return u(r);
26
28
  default: return null;
27
29
  }
28
30
  }
29
- var d = s(function({ widgetType: e, config: t, onChange: n }) {
30
- let r = u(e);
31
- return r ? /* @__PURE__ */ c(r, {
32
- config: t,
33
- onChange: n
34
- }) : /* @__PURE__ */ c("div", {
35
- className: "rounded-lg bg-bg-sunken p-4 text-center",
36
- children: /* @__PURE__ */ c("p", {
31
+ var f = c(function({ widgetType: t, config: n, onChange: r }) {
32
+ let i = d(t);
33
+ return i ? /* @__PURE__ */ l(e, {
34
+ title: "Style",
35
+ description: "Presentation options for this widget type. Data and identity live on the other tabs.",
36
+ "data-testid": "widget-inspector-style",
37
+ children: /* @__PURE__ */ l(i, {
38
+ config: n,
39
+ onChange: r
40
+ })
41
+ }) : /* @__PURE__ */ l(e, {
42
+ tone: "info",
43
+ padding: "compact",
44
+ title: "No style options",
45
+ headingLevel: 3,
46
+ "data-testid": "widget-inspector-style-empty",
47
+ children: /* @__PURE__ */ l("p", {
37
48
  className: "text-sm text-text-secondary",
38
- children: "No style options for this widget type"
49
+ children: "This widget type renders from its data and template, so there is nothing to style here."
39
50
  })
40
51
  });
41
52
  });
42
53
  //#endregion
43
- export { d as AppearanceSection };
54
+ export { f as AppearanceSection };
44
55
 
45
56
  //# sourceMappingURL=AppearanceSection.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"AppearanceSection.js","names":[],"sources":["../../../../../src/bigconsole/components/builder/inspector/AppearanceSection.tsx"],"sourcesContent":["import { type ComponentType, type FC, memo } from 'react';\nimport type { WidgetType } from '../../../types';\nimport { MetricCardConfig } from '../../widgets/metric-card/MetricCardConfig';\nimport { ChartConfig } from '../../widgets/chart/ChartConfig';\nimport { TableConfig } from '../../widgets/table/TableConfig';\nimport { GaugeConfig } from '../../widgets/gauge/GaugeConfig';\nimport { ProgressConfig } from '../../widgets/progress/ProgressConfig';\nimport { ListConfig } from '../../widgets/list/ListConfig';\nimport { HeatmapConfig } from '../../widgets/heatmap/HeatmapConfig';\n\ninterface ConfigComponentProps {\n config: never;\n onChange: (config: never) => void;\n}\n\n// Legacy widget config components expose distinct config interfaces even though\n// they share the same runtime { config, onChange } contract. Keep the narrowing\n// cast in this adapter instead of spreading `never` casts across inspector code.\nfunction asConfigComponent(component: ComponentType<unknown>): ComponentType<ConfigComponentProps> {\n return component as unknown as ComponentType<ConfigComponentProps>;\n}\n\nexport interface AppearanceSectionProps {\n widgetType: WidgetType;\n config: Record<string, unknown>;\n onChange: (config: Record<string, unknown>) => void;\n}\n\nfunction getConfigComponent(type: WidgetType): ComponentType<ConfigComponentProps> | null {\n switch (type) {\n case 'metric_card':\n case 'kpi_card_comparison':\n return asConfigComponent(MetricCardConfig as ComponentType<unknown>);\n case 'chart':\n case 'funnel_chart':\n return asConfigComponent(ChartConfig as ComponentType<unknown>);\n case 'table':\n case 'pivot_table':\n return asConfigComponent(TableConfig as ComponentType<unknown>);\n case 'gauge':\n return asConfigComponent(GaugeConfig as ComponentType<unknown>);\n case 'progress':\n return asConfigComponent(ProgressConfig as ComponentType<unknown>);\n case 'list':\n return asConfigComponent(ListConfig as ComponentType<unknown>);\n case 'heatmap':\n return asConfigComponent(HeatmapConfig as ComponentType<unknown>);\n default:\n return null;\n }\n}\n\n/** Widget-specific visual configuration with a shared empty state. */\nexport const AppearanceSection: FC<AppearanceSectionProps> = memo(function AppearanceSection({\n widgetType,\n config,\n onChange,\n}) {\n const ConfigComponent = getConfigComponent(widgetType);\n\n if (!ConfigComponent) {\n return (\n <div className=\"rounded-lg bg-bg-sunken p-4 text-center\">\n <p className=\"text-sm text-text-secondary\">No style options for this widget type</p>\n </div>\n );\n }\n\n return <ConfigComponent config={config as never} onChange={onChange as (config: never) => void} />;\n});\n"],"mappings":";;;;;;;;;;AAkBA,SAAS,EAAkB,GAAwE;AACjG,QAAO;;AAST,SAAS,EAAmB,GAA8D;AACxF,SAAQ,GAAR;EACE,KAAK;EACL,KAAK,sBACH,QAAO,EAAkB,EAA2C;EACtE,KAAK;EACL,KAAK,eACH,QAAO,EAAkB,EAAsC;EACjE,KAAK;EACL,KAAK,cACH,QAAO,EAAkB,EAAsC;EACjE,KAAK,QACH,QAAO,EAAkB,EAAsC;EACjE,KAAK,WACH,QAAO,EAAkB,EAAyC;EACpE,KAAK,OACH,QAAO,EAAkB,EAAqC;EAChE,KAAK,UACH,QAAO,EAAkB,EAAwC;EACnE,QACE,QAAO;;;AAKb,IAAa,IAAgD,EAAK,SAA2B,EAC3F,eACA,WACA,eACC;CACD,IAAM,IAAkB,EAAmB,EAAW;AAUtD,QARK,IAQE,kBAAC,GAAD;EAAyB;EAA2B;EAAuC,CAAA,GAN9F,kBAAC,OAAD;EAAK,WAAU;YACb,kBAAC,KAAD;GAAG,WAAU;aAA8B;GAAyC,CAAA;EAChF,CAAA;EAKV"}
1
+ {"version":3,"file":"AppearanceSection.js","names":[],"sources":["../../../../../src/bigconsole/components/builder/inspector/AppearanceSection.tsx"],"sourcesContent":["import { type ComponentType, type FC, memo } from 'react';\nimport type { WidgetType } from '../../../types';\nimport { Section } from '../../common';\nimport { MetricCardConfig } from '../../widgets/metric-card/MetricCardConfig';\nimport { ChartConfig } from '../../widgets/chart/ChartConfig';\nimport { TableConfig } from '../../widgets/table/TableConfig';\nimport { GaugeConfig } from '../../widgets/gauge/GaugeConfig';\nimport { ProgressConfig } from '../../widgets/progress/ProgressConfig';\nimport { ListConfig } from '../../widgets/list/ListConfig';\nimport { HeatmapConfig } from '../../widgets/heatmap/HeatmapConfig';\n\ninterface ConfigComponentProps {\n config: never;\n onChange: (config: never) => void;\n}\n\n// Legacy widget config components expose distinct config interfaces even though\n// they share the same runtime { config, onChange } contract. Keep the narrowing\n// cast in this adapter instead of spreading `never` casts across inspector code.\nfunction asConfigComponent(component: ComponentType<unknown>): ComponentType<ConfigComponentProps> {\n return component as unknown as ComponentType<ConfigComponentProps>;\n}\n\nexport interface AppearanceSectionProps {\n widgetType: WidgetType;\n config: Record<string, unknown>;\n onChange: (config: Record<string, unknown>) => void;\n}\n\nfunction getConfigComponent(type: WidgetType): ComponentType<ConfigComponentProps> | null {\n switch (type) {\n case 'metric_card':\n case 'kpi_card_comparison':\n return asConfigComponent(MetricCardConfig as ComponentType<unknown>);\n case 'chart':\n case 'funnel_chart':\n return asConfigComponent(ChartConfig as ComponentType<unknown>);\n case 'table':\n case 'pivot_table':\n return asConfigComponent(TableConfig as ComponentType<unknown>);\n case 'gauge':\n return asConfigComponent(GaugeConfig as ComponentType<unknown>);\n case 'progress':\n return asConfigComponent(ProgressConfig as ComponentType<unknown>);\n case 'list':\n return asConfigComponent(ListConfig as ComponentType<unknown>);\n case 'heatmap':\n return asConfigComponent(HeatmapConfig as ComponentType<unknown>);\n default:\n return null;\n }\n}\n\n/** Widget-specific visual configuration with a shared empty state. */\nexport const AppearanceSection: FC<AppearanceSectionProps> = memo(function AppearanceSection({\n widgetType,\n config,\n onChange,\n}) {\n const ConfigComponent = getConfigComponent(widgetType);\n\n if (!ConfigComponent) {\n return (\n <Section\n tone=\"info\"\n padding=\"compact\"\n title=\"No style options\"\n headingLevel={3}\n data-testid=\"widget-inspector-style-empty\"\n >\n <p className=\"text-sm text-text-secondary\">\n This widget type renders from its data and template, so there is nothing to style here.\n </p>\n </Section>\n );\n }\n\n return (\n <Section\n title=\"Style\"\n description=\"Presentation options for this widget type. Data and identity live on the other tabs.\"\n data-testid=\"widget-inspector-style\"\n >\n <ConfigComponent config={config as never} onChange={onChange as (config: never) => void} />\n </Section>\n );\n});\n"],"mappings":";;;;;;;;;;;;AAmBA,SAAS,EAAkB,GAAwE;AACjG,QAAO;;AAST,SAAS,EAAmB,GAA8D;AACxF,SAAQ,GAAR;EACE,KAAK;EACL,KAAK,sBACH,QAAO,EAAkB,EAA2C;EACtE,KAAK;EACL,KAAK,eACH,QAAO,EAAkB,EAAsC;EACjE,KAAK;EACL,KAAK,cACH,QAAO,EAAkB,EAAsC;EACjE,KAAK,QACH,QAAO,EAAkB,EAAsC;EACjE,KAAK,WACH,QAAO,EAAkB,EAAyC;EACpE,KAAK,OACH,QAAO,EAAkB,EAAqC;EAChE,KAAK,UACH,QAAO,EAAkB,EAAwC;EACnE,QACE,QAAO;;;AAKb,IAAa,IAAgD,EAAK,SAA2B,EAC3F,eACA,WACA,eACC;CACD,IAAM,IAAkB,EAAmB,EAAW;AAkBtD,QAhBK,IAiBH,kBAAC,GAAD;EACE,OAAM;EACN,aAAY;EACZ,eAAY;YAEZ,kBAAC,GAAD;GAAyB;GAA2B;GAAuC,CAAA;EACnF,CAAA,GArBR,kBAAC,GAAD;EACE,MAAK;EACL,SAAQ;EACR,OAAM;EACN,cAAc;EACd,eAAY;YAEZ,kBAAC,KAAD;GAAG,WAAU;aAA8B;GAEvC,CAAA;EACI,CAAA;EAad"}
@@ -1,120 +1,158 @@
1
- import e from "../../parser/DataSinkSelector.js";
2
- import t from "../../parser/ParserSelector.js";
3
- import { useI18n as n } from "@burdenoff/fe-libs/shared/providers/shell/I18nProvider";
4
- import { Input as r, Label as i, Spinner as a } from "@burdenoff/fe-libs/ui";
5
- import { jsx as o, jsxs as s } from "react/jsx-runtime";
1
+ import { Section as e, SectionStack as t } from "../../common/Section.js";
2
+ import "../../common/index.js";
3
+ import n from "../../parser/DataSinkSelector.js";
4
+ import r from "../../parser/ParserSelector.js";
5
+ import { useI18n as i } from "@burdenoff/fe-libs/shared/providers/shell/I18nProvider";
6
+ import { Input as a, Label as o, Spinner as s } from "@burdenoff/fe-libs/ui";
7
+ import { jsx as c, jsxs as l } from "react/jsx-runtime";
6
8
  //#region src/bigconsole/components/builder/inspector/DataBindingSection.tsx
7
- var c = ({ consoleId: c, binding: l, dataSinkKey: u, dataPath: d, status: f, missingFields: p = [], preview: m, error: h, onDataSinkChange: g, onParserChange: _, onDataPathChange: v }) => {
8
- let { t: y } = n(), b = {
9
- unbound: y("bigconsole.builder.dataBinding.status.unbound", "Select a DataSink to begin"),
10
- loading: y("bigconsole.builder.dataBinding.status.loading", "Testing parser and detecting fields…"),
11
- bound: y("bigconsole.builder.dataBinding.status.bound", "Binding ready"),
12
- no_data: y("bigconsole.builder.dataBinding.status.noData", "Parser returned no data"),
13
- parser_error: y("bigconsole.builder.dataBinding.status.parserError", "Parser test failed"),
14
- field_mismatch: y("bigconsole.builder.dataBinding.status.fieldMismatch", "Some mapped fields were not found")
9
+ var u = {
10
+ unbound: "info",
11
+ loading: "info",
12
+ bound: "success",
13
+ no_data: "warning",
14
+ parser_error: "danger",
15
+ field_mismatch: "warning"
16
+ }, d = ({ consoleId: d, binding: f, dataSinkKey: p, dataPath: m, status: h, missingFields: g = [], preview: _, error: v, onDataSinkChange: y, onParserChange: b, onDataPathChange: x }) => {
17
+ let { t: S } = i(), C = {
18
+ unbound: S("bigconsole.builder.dataBinding.status.unbound", "Select a DataSink to begin"),
19
+ loading: S("bigconsole.builder.dataBinding.status.loading", "Testing parser and detecting fields…"),
20
+ bound: S("bigconsole.builder.dataBinding.status.bound", "Binding ready"),
21
+ no_data: S("bigconsole.builder.dataBinding.status.noData", "Parser returned no data"),
22
+ parser_error: S("bigconsole.builder.dataBinding.status.parserError", "Parser test failed"),
23
+ field_mismatch: S("bigconsole.builder.dataBinding.status.fieldMismatch", "Some mapped fields were not found")
15
24
  };
16
- return /* @__PURE__ */ s("div", {
17
- className: "space-y-4",
18
- children: [
19
- /* @__PURE__ */ o("div", {
20
- className: "rounded-md border border-border-subtle bg-bg-sunken p-3",
21
- children: /* @__PURE__ */ o("p", {
22
- className: "text-xs text-text-secondary",
23
- children: y("bigconsole.builder.dataBinding.intro", "Connect this widget to a DataSink and Parser to display transformed data.")
24
- })
25
- }),
26
- /* @__PURE__ */ s("div", {
27
- className: "space-y-2",
28
- children: [
29
- /* @__PURE__ */ o(i, { children: y("bigconsole.builder.dataBinding.dataSinkLabel", "DataSink") }),
30
- /* @__PURE__ */ o(e, {
31
- value: u,
32
- onChange: g,
33
- placeholder: y("bigconsole.builder.dataBinding.dataSinkPlaceholder", "Select a DataSink...")
34
- }),
35
- u && /* @__PURE__ */ s("p", {
36
- className: "text-xs text-text-secondary",
37
- children: [y("bigconsole.builder.dataBinding.keyLabel", "Key: {{key}}", { key: u }), l.source.ref && /* @__PURE__ */ o("span", {
38
- className: "ml-2 text-text-tertiary",
39
- children: y("bigconsole.builder.dataBinding.idLabel", "ID: {{id}}...", { id: l.source.ref.slice(0, 8) })
40
- })]
41
- })
42
- ]
43
- }),
44
- /* @__PURE__ */ s("div", {
45
- className: "space-y-2",
46
- children: [
47
- /* @__PURE__ */ o(i, { children: y("bigconsole.builder.dataBinding.parserLabel", "Parser") }),
48
- /* @__PURE__ */ o(t, {
49
- consoleId: c,
50
- value: l.parserId ?? null,
51
- onChange: _,
52
- filterInputSinkKey: u ?? void 0,
25
+ return /* @__PURE__ */ l(t, { children: [
26
+ /* @__PURE__ */ c(e, {
27
+ title: "Data source",
28
+ description: S("bigconsole.builder.dataBinding.intro", "Connect this widget to a DataSink and Parser to display transformed data."),
29
+ "data-testid": "widget-inspector-data-source",
30
+ children: /* @__PURE__ */ l("div", {
31
+ className: "flex flex-col gap-form-gap",
32
+ children: [/* @__PURE__ */ l("div", {
33
+ className: "space-y-2",
34
+ children: [
35
+ /* @__PURE__ */ c(o, { children: S("bigconsole.builder.dataBinding.dataSinkLabel", "DataSink") }),
36
+ /* @__PURE__ */ c(n, {
37
+ value: p,
38
+ onChange: y,
39
+ placeholder: S("bigconsole.builder.dataBinding.dataSinkPlaceholder", "Select a DataSink...")
40
+ }),
41
+ p && /* @__PURE__ */ l("p", {
42
+ className: "text-xs text-text-secondary",
43
+ children: [S("bigconsole.builder.dataBinding.keyLabel", "Key: {{key}}", { key: p }), f.source.ref && /* @__PURE__ */ c("span", {
44
+ className: "ml-2 text-text-muted",
45
+ children: S("bigconsole.builder.dataBinding.idLabel", "ID: {{id}}...", { id: f.source.ref.slice(0, 8) })
46
+ })]
47
+ })
48
+ ]
49
+ }), /* @__PURE__ */ l("div", {
50
+ className: "space-y-2",
51
+ children: [/* @__PURE__ */ c(o, { children: S("bigconsole.builder.dataBinding.parserLabel", "Parser") }), /* @__PURE__ */ c(r, {
52
+ consoleId: d,
53
+ value: f.parserId ?? null,
54
+ onChange: b,
55
+ filterInputSinkKey: p ?? void 0,
53
56
  filterStatus: void 0,
54
- placeholder: u ? y("bigconsole.builder.dataBinding.parserPlaceholder", "Select a parser...") : y("bigconsole.builder.dataBinding.parserPlaceholderNoSink", "Select a DataSink first..."),
55
- disabled: !u
57
+ placeholder: p ? S("bigconsole.builder.dataBinding.parserPlaceholder", "Select a parser...") : S("bigconsole.builder.dataBinding.parserPlaceholderNoSink", "Select a DataSink first..."),
58
+ disabled: !p
59
+ })]
60
+ })]
61
+ })
62
+ }),
63
+ /* @__PURE__ */ c(e, {
64
+ title: C[h],
65
+ tone: u[h],
66
+ padding: "compact",
67
+ headingLevel: 3,
68
+ icon: h === "loading" ? /* @__PURE__ */ c(s, { style: {
69
+ width: "14px",
70
+ height: "14px"
71
+ } }) : void 0,
72
+ "data-testid": "widget-inspector-binding-status",
73
+ children: /* @__PURE__ */ l("div", {
74
+ role: "status",
75
+ "aria-live": "polite",
76
+ className: "min-w-0 space-y-1",
77
+ children: [
78
+ /* @__PURE__ */ c("p", {
79
+ className: "sr-only",
80
+ children: C[h]
56
81
  }),
57
- /* @__PURE__ */ s("p", {
58
- className: "flex items-center gap-1 text-xs text-text-secondary",
59
- role: "status",
60
- children: [f === "loading" && /* @__PURE__ */ o(a, { style: {
61
- width: "12px",
62
- height: "12px"
63
- } }), b[f]]
82
+ v && /* @__PURE__ */ c("p", {
83
+ className: "break-words text-xs text-[var(--color-status-error-text)]",
84
+ children: v
64
85
  }),
65
- h && /* @__PURE__ */ o("p", {
66
- className: "text-xs text-status-error-text",
67
- children: h
86
+ g.length > 0 && /* @__PURE__ */ c("p", {
87
+ className: "break-words text-xs text-[var(--color-status-warning-text)]",
88
+ children: S("bigconsole.builder.dataBinding.missingFields", "Missing: {{fields}}", { fields: g.join(", ") })
68
89
  }),
69
- p.length > 0 && /* @__PURE__ */ o("p", {
70
- className: "text-xs text-status-warning-text",
71
- children: y("bigconsole.builder.dataBinding.missingFields", "Missing: {{fields}}", { fields: p.join(", ") })
90
+ !v && g.length === 0 && h === "bound" && /* @__PURE__ */ c("p", {
91
+ className: "text-xs text-text-secondary",
92
+ children: "The parser ran and its output matches the fields this widget expects."
72
93
  })
73
94
  ]
74
- }),
75
- l.parserId && Object.keys(l.fields).length > 0 && /* @__PURE__ */ s("div", {
76
- className: "rounded-md border border-status-success-border bg-status-success-bg-subtle p-3",
77
- children: [/* @__PURE__ */ o("p", {
78
- className: "mb-2 text-xs font-medium text-status-success-text",
79
- children: y("bigconsole.builder.dataBinding.fieldMappingsConfigured", "Field mappings configured")
80
- }), /* @__PURE__ */ o("div", {
81
- className: "space-y-1 text-xs text-text-secondary",
82
- children: Object.entries(l.fields).map(([e, t]) => /* @__PURE__ */ s("p", { children: [
95
+ })
96
+ }),
97
+ f.parserId && Object.keys(f.fields).length > 0 && /* @__PURE__ */ c(e, {
98
+ emphasis: "muted",
99
+ padding: "compact",
100
+ title: S("bigconsole.builder.dataBinding.fieldMappingsConfigured", "Field mappings configured"),
101
+ headingLevel: 3,
102
+ children: /* @__PURE__ */ c("div", {
103
+ className: "min-w-0 space-y-1 text-xs text-text-secondary",
104
+ children: Object.entries(f.fields).map(([e, t]) => /* @__PURE__ */ l("p", {
105
+ className: "break-words",
106
+ children: [
83
107
  e,
84
108
  ": ",
85
- /* @__PURE__ */ o("code", {
86
- className: "rounded bg-bg-sunken px-1",
109
+ /* @__PURE__ */ c("code", {
110
+ className: "rounded bg-bg-surface px-1 font-mono",
87
111
  children: t
88
112
  })
89
- ] }, e))
90
- })]
91
- }),
92
- m !== void 0 && /* @__PURE__ */ s("div", {
93
- className: "space-y-2",
94
- children: [/* @__PURE__ */ o(i, { children: y("bigconsole.builder.dataBinding.livePreviewLabel", "Live Preview") }), /* @__PURE__ */ o("pre", {
95
- className: "max-h-40 overflow-auto rounded-md border border-border-subtle bg-bg-sunken p-3 text-xs text-text-secondary",
96
- children: JSON.stringify(m, null, 2)
97
- })]
98
- }),
99
- /* @__PURE__ */ s("div", {
113
+ ]
114
+ }, e))
115
+ })
116
+ }),
117
+ _ !== void 0 && /* @__PURE__ */ c(e, {
118
+ emphasis: "muted",
119
+ padding: "compact",
120
+ title: S("bigconsole.builder.dataBinding.livePreviewLabel", "Live Preview"),
121
+ description: "Raw parser output, exactly as the widget receives it.",
122
+ headingLevel: 3,
123
+ children: /* @__PURE__ */ c("pre", {
124
+ className: "max-h-40 min-w-0 overflow-auto rounded-input border border-[var(--color-border-subtle)] bg-bg-surface p-3 text-xs text-text-secondary",
125
+ children: JSON.stringify(_, null, 2)
126
+ })
127
+ }),
128
+ /* @__PURE__ */ c(e, {
129
+ emphasis: "muted",
130
+ padding: "compact",
131
+ title: "Data path",
132
+ headingLevel: 3,
133
+ children: /* @__PURE__ */ l("div", {
100
134
  className: "space-y-2",
101
135
  children: [
102
- /* @__PURE__ */ o(i, { children: y("bigconsole.builder.dataBinding.dataPathLabel", "Data Path (Optional)") }),
103
- /* @__PURE__ */ o(r, {
104
- value: d ?? "",
105
- onChange: (e) => v(e.target.value || void 0),
106
- placeholder: y("bigconsole.builder.dataBinding.dataPathPlaceholder", "e.g., summary.totalRevenue")
136
+ /* @__PURE__ */ c(o, {
137
+ htmlFor: "widget-inspector-data-path",
138
+ children: S("bigconsole.builder.dataBinding.dataPathLabel", "Data Path (Optional)")
139
+ }),
140
+ /* @__PURE__ */ c(a, {
141
+ id: "widget-inspector-data-path",
142
+ value: m ?? "",
143
+ onChange: (e) => x(e.target.value || void 0),
144
+ placeholder: S("bigconsole.builder.dataBinding.dataPathPlaceholder", "e.g., summary.totalRevenue")
107
145
  }),
108
- /* @__PURE__ */ o("p", {
146
+ /* @__PURE__ */ c("p", {
109
147
  className: "text-xs text-text-secondary",
110
- children: y("bigconsole.builder.dataBinding.dataPathHelp", "Path to extract specific data from the parser output (dot notation)")
148
+ children: S("bigconsole.builder.dataBinding.dataPathHelp", "Path to extract specific data from the parser output (dot notation)")
111
149
  })
112
150
  ]
113
151
  })
114
- ]
115
- });
152
+ })
153
+ ] });
116
154
  };
117
155
  //#endregion
118
- export { c as DataBindingSection };
156
+ export { d as DataBindingSection };
119
157
 
120
158
  //# sourceMappingURL=DataBindingSection.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"DataBindingSection.js","names":[],"sources":["../../../../../src/bigconsole/components/builder/inspector/DataBindingSection.tsx"],"sourcesContent":["import type { FC } from 'react';\nimport { Input, Label, Spinner } from '@burdenoff/fe-libs/ui';\nimport { useI18n } from '@burdenoff/fe-libs/shared/providers/shell/I18nProvider';\nimport type { WidgetBinding, WidgetBindingStatus } from '../../../types';\nimport { DataSinkSelector } from '../../parser/DataSinkSelector';\nimport { ParserSelector } from '../../parser/ParserSelector';\n\nexport interface DataBindingSectionProps {\n consoleId: string;\n binding: WidgetBinding;\n dataSinkKey: string | null;\n dataPath?: string;\n status: WidgetBindingStatus;\n missingFields?: string[];\n preview?: unknown;\n error?: string | null;\n onDataSinkChange: (key: string | null) => void;\n onParserChange: (parserId: string | null) => void;\n onDataPathChange: (path: string | undefined) => void;\n}\n\nexport const DataBindingSection: FC<DataBindingSectionProps> = ({\n consoleId,\n binding,\n dataSinkKey,\n dataPath,\n status,\n missingFields = [],\n preview,\n error,\n onDataSinkChange,\n onParserChange,\n onDataPathChange,\n}) => {\n const { t } = useI18n();\n\n const statusLabels: Record<WidgetBindingStatus, string> = {\n unbound: t('bigconsole.builder.dataBinding.status.unbound', 'Select a DataSink to begin'),\n loading: t('bigconsole.builder.dataBinding.status.loading', 'Testing parser and detecting fields…'),\n bound: t('bigconsole.builder.dataBinding.status.bound', 'Binding ready'),\n no_data: t('bigconsole.builder.dataBinding.status.noData', 'Parser returned no data'),\n parser_error: t('bigconsole.builder.dataBinding.status.parserError', 'Parser test failed'),\n field_mismatch: t('bigconsole.builder.dataBinding.status.fieldMismatch', 'Some mapped fields were not found'),\n };\n\n return (\n <div className=\"space-y-4\">\n <div className=\"rounded-md border border-border-subtle bg-bg-sunken p-3\">\n <p className=\"text-xs text-text-secondary\">\n {t(\n 'bigconsole.builder.dataBinding.intro',\n 'Connect this widget to a DataSink and Parser to display transformed data.'\n )}\n </p>\n </div>\n\n <div className=\"space-y-2\">\n <Label>{t('bigconsole.builder.dataBinding.dataSinkLabel', 'DataSink')}</Label>\n <DataSinkSelector\n value={dataSinkKey}\n onChange={onDataSinkChange}\n placeholder={t('bigconsole.builder.dataBinding.dataSinkPlaceholder', 'Select a DataSink...')}\n />\n {dataSinkKey && (\n <p className=\"text-xs text-text-secondary\">\n {t('bigconsole.builder.dataBinding.keyLabel', 'Key: {{key}}', { key: dataSinkKey })}\n {binding.source.ref && (\n <span className=\"ml-2 text-text-tertiary\">\n {t('bigconsole.builder.dataBinding.idLabel', 'ID: {{id}}...', {\n id: binding.source.ref.slice(0, 8),\n })}\n </span>\n )}\n </p>\n )}\n </div>\n\n <div className=\"space-y-2\">\n <Label>{t('bigconsole.builder.dataBinding.parserLabel', 'Parser')}</Label>\n <ParserSelector\n consoleId={consoleId}\n value={binding.parserId ?? null}\n onChange={onParserChange}\n filterInputSinkKey={dataSinkKey ?? undefined}\n filterStatus={undefined}\n placeholder={\n dataSinkKey\n ? t('bigconsole.builder.dataBinding.parserPlaceholder', 'Select a parser...')\n : t('bigconsole.builder.dataBinding.parserPlaceholderNoSink', 'Select a DataSink first...')\n }\n disabled={!dataSinkKey}\n />\n <p className=\"flex items-center gap-1 text-xs text-text-secondary\" role=\"status\">\n {status === 'loading' && <Spinner style={{ width: '12px', height: '12px' }} />}\n {statusLabels[status]}\n </p>\n {error && <p className=\"text-xs text-status-error-text\">{error}</p>}\n {missingFields.length > 0 && (\n <p className=\"text-xs text-status-warning-text\">\n {t('bigconsole.builder.dataBinding.missingFields', 'Missing: {{fields}}', {\n fields: missingFields.join(', '),\n })}\n </p>\n )}\n </div>\n\n {binding.parserId && Object.keys(binding.fields).length > 0 && (\n <div className=\"rounded-md border border-status-success-border bg-status-success-bg-subtle p-3\">\n <p className=\"mb-2 text-xs font-medium text-status-success-text\">\n {t('bigconsole.builder.dataBinding.fieldMappingsConfigured', 'Field mappings configured')}\n </p>\n <div className=\"space-y-1 text-xs text-text-secondary\">\n {Object.entries(binding.fields).map(([name, path]) => (\n <p key={name}>\n {name}: <code className=\"rounded bg-bg-sunken px-1\">{path}</code>\n </p>\n ))}\n </div>\n </div>\n )}\n\n {preview !== undefined && (\n <div className=\"space-y-2\">\n <Label>{t('bigconsole.builder.dataBinding.livePreviewLabel', 'Live Preview')}</Label>\n <pre className=\"max-h-40 overflow-auto rounded-md border border-border-subtle bg-bg-sunken p-3 text-xs text-text-secondary\">\n {JSON.stringify(preview, null, 2)}\n </pre>\n </div>\n )}\n\n <div className=\"space-y-2\">\n <Label>{t('bigconsole.builder.dataBinding.dataPathLabel', 'Data Path (Optional)')}</Label>\n <Input\n value={dataPath ?? ''}\n onChange={(event) => onDataPathChange(event.target.value || undefined)}\n placeholder={t('bigconsole.builder.dataBinding.dataPathPlaceholder', 'e.g., summary.totalRevenue')}\n />\n <p className=\"text-xs text-text-secondary\">\n {t(\n 'bigconsole.builder.dataBinding.dataPathHelp',\n 'Path to extract specific data from the parser output (dot notation)'\n )}\n </p>\n </div>\n </div>\n );\n};\n"],"mappings":"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"}
1
+ {"version":3,"file":"DataBindingSection.js","names":[],"sources":["../../../../../src/bigconsole/components/builder/inspector/DataBindingSection.tsx"],"sourcesContent":["import type { FC } from 'react';\nimport { Input, Label, Spinner } from '@burdenoff/fe-libs/ui';\nimport { useI18n } from '@burdenoff/fe-libs/shared/providers/shell/I18nProvider';\nimport type { WidgetBinding, WidgetBindingStatus } from '../../../types';\nimport { DataSinkSelector } from '../../parser/DataSinkSelector';\nimport { ParserSelector } from '../../parser/ParserSelector';\nimport { Section, SectionStack, type SectionTone } from '../../common';\n\nexport interface DataBindingSectionProps {\n consoleId: string;\n binding: WidgetBinding;\n dataSinkKey: string | null;\n dataPath?: string;\n status: WidgetBindingStatus;\n missingFields?: string[];\n preview?: unknown;\n error?: string | null;\n onDataSinkChange: (key: string | null) => void;\n onParserChange: (parserId: string | null) => void;\n onDataPathChange: (path: string | undefined) => void;\n}\n\n/**\n * Binding health is the single most important signal on this tab, so it gets a\n * toned section of its own instead of the bare `<p class=\"text-xs\">` it used to\n * be (BOFF-5636).\n */\nconst STATUS_TONES: Record<WidgetBindingStatus, SectionTone> = {\n unbound: 'info',\n loading: 'info',\n bound: 'success',\n no_data: 'warning',\n parser_error: 'danger',\n field_mismatch: 'warning',\n};\n\nexport const DataBindingSection: FC<DataBindingSectionProps> = ({\n consoleId,\n binding,\n dataSinkKey,\n dataPath,\n status,\n missingFields = [],\n preview,\n error,\n onDataSinkChange,\n onParserChange,\n onDataPathChange,\n}) => {\n const { t } = useI18n();\n\n const statusLabels: Record<WidgetBindingStatus, string> = {\n unbound: t('bigconsole.builder.dataBinding.status.unbound', 'Select a DataSink to begin'),\n loading: t('bigconsole.builder.dataBinding.status.loading', 'Testing parser and detecting fields…'),\n bound: t('bigconsole.builder.dataBinding.status.bound', 'Binding ready'),\n no_data: t('bigconsole.builder.dataBinding.status.noData', 'Parser returned no data'),\n parser_error: t('bigconsole.builder.dataBinding.status.parserError', 'Parser test failed'),\n field_mismatch: t('bigconsole.builder.dataBinding.status.fieldMismatch', 'Some mapped fields were not found'),\n };\n\n return (\n <SectionStack>\n <Section\n title=\"Data source\"\n description={t(\n 'bigconsole.builder.dataBinding.intro',\n 'Connect this widget to a DataSink and Parser to display transformed data.'\n )}\n data-testid=\"widget-inspector-data-source\"\n >\n <div className=\"flex flex-col gap-form-gap\">\n <div className=\"space-y-2\">\n <Label>{t('bigconsole.builder.dataBinding.dataSinkLabel', 'DataSink')}</Label>\n <DataSinkSelector\n value={dataSinkKey}\n onChange={onDataSinkChange}\n placeholder={t('bigconsole.builder.dataBinding.dataSinkPlaceholder', 'Select a DataSink...')}\n />\n {dataSinkKey && (\n <p className=\"text-xs text-text-secondary\">\n {t('bigconsole.builder.dataBinding.keyLabel', 'Key: {{key}}', { key: dataSinkKey })}\n {binding.source.ref && (\n <span className=\"ml-2 text-text-muted\">\n {t('bigconsole.builder.dataBinding.idLabel', 'ID: {{id}}...', {\n id: binding.source.ref.slice(0, 8),\n })}\n </span>\n )}\n </p>\n )}\n </div>\n\n <div className=\"space-y-2\">\n <Label>{t('bigconsole.builder.dataBinding.parserLabel', 'Parser')}</Label>\n <ParserSelector\n consoleId={consoleId}\n value={binding.parserId ?? null}\n onChange={onParserChange}\n filterInputSinkKey={dataSinkKey ?? undefined}\n filterStatus={undefined}\n placeholder={\n dataSinkKey\n ? t('bigconsole.builder.dataBinding.parserPlaceholder', 'Select a parser...')\n : t('bigconsole.builder.dataBinding.parserPlaceholderNoSink', 'Select a DataSink first...')\n }\n disabled={!dataSinkKey}\n />\n </div>\n </div>\n </Section>\n\n <Section\n title={statusLabels[status]}\n tone={STATUS_TONES[status]}\n padding=\"compact\"\n headingLevel={3}\n icon={status === 'loading' ? <Spinner style={{ width: '14px', height: '14px' }} /> : undefined}\n data-testid=\"widget-inspector-binding-status\"\n >\n <div role=\"status\" aria-live=\"polite\" className=\"min-w-0 space-y-1\">\n {/*\n The status label is the section heading, which sits OUTSIDE this live\n region — without this echo a screen reader would never hear the binding\n flip from \"loading\" to \"bound\".\n */}\n <p className=\"sr-only\">{statusLabels[status]}</p>\n {error && <p className=\"break-words text-xs text-[var(--color-status-error-text)]\">{error}</p>}\n {missingFields.length > 0 && (\n <p className=\"break-words text-xs text-[var(--color-status-warning-text)]\">\n {t('bigconsole.builder.dataBinding.missingFields', 'Missing: {{fields}}', {\n fields: missingFields.join(', '),\n })}\n </p>\n )}\n {!error && missingFields.length === 0 && status === 'bound' && (\n <p className=\"text-xs text-text-secondary\">\n The parser ran and its output matches the fields this widget expects.\n </p>\n )}\n </div>\n </Section>\n\n {binding.parserId && Object.keys(binding.fields).length > 0 && (\n <Section\n emphasis=\"muted\"\n padding=\"compact\"\n title={t('bigconsole.builder.dataBinding.fieldMappingsConfigured', 'Field mappings configured')}\n headingLevel={3}\n >\n <div className=\"min-w-0 space-y-1 text-xs text-text-secondary\">\n {Object.entries(binding.fields).map(([name, path]) => (\n <p key={name} className=\"break-words\">\n {name}: <code className=\"rounded bg-bg-surface px-1 font-mono\">{path}</code>\n </p>\n ))}\n </div>\n </Section>\n )}\n\n {preview !== undefined && (\n <Section\n emphasis=\"muted\"\n padding=\"compact\"\n title={t('bigconsole.builder.dataBinding.livePreviewLabel', 'Live Preview')}\n description=\"Raw parser output, exactly as the widget receives it.\"\n headingLevel={3}\n >\n <pre className=\"max-h-40 min-w-0 overflow-auto rounded-input border border-[var(--color-border-subtle)] bg-bg-surface p-3 text-xs text-text-secondary\">\n {JSON.stringify(preview, null, 2)}\n </pre>\n </Section>\n )}\n\n <Section emphasis=\"muted\" padding=\"compact\" title=\"Data path\" headingLevel={3}>\n <div className=\"space-y-2\">\n <Label htmlFor=\"widget-inspector-data-path\">\n {t('bigconsole.builder.dataBinding.dataPathLabel', 'Data Path (Optional)')}\n </Label>\n <Input\n id=\"widget-inspector-data-path\"\n value={dataPath ?? ''}\n onChange={(event) => onDataPathChange(event.target.value || undefined)}\n placeholder={t('bigconsole.builder.dataBinding.dataPathPlaceholder', 'e.g., summary.totalRevenue')}\n />\n <p className=\"text-xs text-text-secondary\">\n {t(\n 'bigconsole.builder.dataBinding.dataPathHelp',\n 'Path to extract specific data from the parser output (dot notation)'\n )}\n </p>\n </div>\n </Section>\n </SectionStack>\n );\n};\n"],"mappings":"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"}