@burdenoff/microfe-bigconsole 2026.805.2 → 2026.812.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (253) hide show
  1. package/dist/bigconsole/components/DrilldownDashboardRenderer.js +118 -106
  2. package/dist/bigconsole/components/DrilldownDashboardRenderer.js.map +1 -1
  3. package/dist/bigconsole/components/DrilldownModal.js +54 -50
  4. package/dist/bigconsole/components/DrilldownModal.js.map +1 -1
  5. package/dist/bigconsole/components/builder/BuilderCanvas.js +2 -2
  6. package/dist/bigconsole/components/builder/BuilderCanvas.js.map +1 -1
  7. package/dist/bigconsole/components/builder/BuilderTopbar.js +3 -3
  8. package/dist/bigconsole/components/builder/BuilderTopbar.js.map +1 -1
  9. package/dist/bigconsole/components/builder/inspector/AdvancedSection.js +24 -25
  10. package/dist/bigconsole/components/builder/inspector/AdvancedSection.js.map +1 -1
  11. package/dist/bigconsole/components/builder/inspector/AppearanceSection.js +40 -29
  12. package/dist/bigconsole/components/builder/inspector/AppearanceSection.js.map +1 -1
  13. package/dist/bigconsole/components/builder/inspector/DataBindingSection.js +145 -111
  14. package/dist/bigconsole/components/builder/inspector/DataBindingSection.js.map +1 -1
  15. package/dist/bigconsole/components/builder/inspector/GeneralSection.js +58 -44
  16. package/dist/bigconsole/components/builder/inspector/GeneralSection.js.map +1 -1
  17. package/dist/bigconsole/components/common/Section.js +70 -0
  18. package/dist/bigconsole/components/common/Section.js.map +1 -0
  19. package/dist/bigconsole/components/common/index.js +2 -0
  20. package/dist/bigconsole/components/common/sectionStyles.js +42 -0
  21. package/dist/bigconsole/components/common/sectionStyles.js.map +1 -0
  22. package/dist/bigconsole/components/dashboard/CreateDashboardDialog.js +269 -251
  23. package/dist/bigconsole/components/dashboard/CreateDashboardDialog.js.map +1 -1
  24. package/dist/bigconsole/components/dashboard/DashboardCanvas.js +214 -223
  25. package/dist/bigconsole/components/dashboard/DashboardCanvas.js.map +1 -1
  26. package/dist/bigconsole/components/dashboard/DashboardGrid.js +12 -18
  27. package/dist/bigconsole/components/dashboard/DashboardGrid.js.map +1 -1
  28. package/dist/bigconsole/components/dashboard/DashboardToolbar.js +110 -102
  29. package/dist/bigconsole/components/dashboard/DashboardToolbar.js.map +1 -1
  30. package/dist/bigconsole/components/dashboard/DrilldownBreadcrumb.js +81 -68
  31. package/dist/bigconsole/components/dashboard/DrilldownBreadcrumb.js.map +1 -1
  32. package/dist/bigconsole/components/dashboard/ExportDashboardDialog.js +125 -159
  33. package/dist/bigconsole/components/dashboard/ExportDashboardDialog.js.map +1 -1
  34. package/dist/bigconsole/components/dashboard/GlobalFiltersBar/FilterChip.js +147 -144
  35. package/dist/bigconsole/components/dashboard/GlobalFiltersBar/FilterChip.js.map +1 -1
  36. package/dist/bigconsole/components/dashboard/GlobalFiltersBar/FilterEditor.js +154 -153
  37. package/dist/bigconsole/components/dashboard/GlobalFiltersBar/FilterEditor.js.map +1 -1
  38. package/dist/bigconsole/components/dashboard/GlobalFiltersBar/FilterPresetSelector.js +82 -79
  39. package/dist/bigconsole/components/dashboard/GlobalFiltersBar/FilterPresetSelector.js.map +1 -1
  40. package/dist/bigconsole/components/dashboard/GlobalFiltersBar/GlobalFiltersBar.js +171 -284
  41. package/dist/bigconsole/components/dashboard/GlobalFiltersBar/GlobalFiltersBar.js.map +1 -1
  42. package/dist/bigconsole/components/dashboard/ImportDashboardDialog.js +250 -273
  43. package/dist/bigconsole/components/dashboard/ImportDashboardDialog.js.map +1 -1
  44. package/dist/bigconsole/components/dashboard/LiveBoardBanner.js +45 -53
  45. package/dist/bigconsole/components/dashboard/LiveBoardBanner.js.map +1 -1
  46. package/dist/bigconsole/components/dashboard/PageTabsManager/PageTabsManager.js +157 -148
  47. package/dist/bigconsole/components/dashboard/PageTabsManager/PageTabsManager.js.map +1 -1
  48. package/dist/bigconsole/components/dashboard/PublishToStoreDialog.js +75 -83
  49. package/dist/bigconsole/components/dashboard/PublishToStoreDialog.js.map +1 -1
  50. package/dist/bigconsole/components/dashboard/SavedViewsDropdown/SavedViewsDropdown.js +167 -161
  51. package/dist/bigconsole/components/dashboard/SavedViewsDropdown/SavedViewsDropdown.js.map +1 -1
  52. package/dist/bigconsole/components/dashboard/ShareDialog/EmbedTab.js +181 -190
  53. package/dist/bigconsole/components/dashboard/ShareDialog/EmbedTab.js.map +1 -1
  54. package/dist/bigconsole/components/dashboard/ShareDialog/ShareDialog.js +101 -95
  55. package/dist/bigconsole/components/dashboard/ShareDialog/ShareDialog.js.map +1 -1
  56. package/dist/bigconsole/components/dashboard/StoreTemplatePicker.js +20 -18
  57. package/dist/bigconsole/components/dashboard/StoreTemplatePicker.js.map +1 -1
  58. package/dist/bigconsole/components/dashboard/TemplatePicker/TemplatePicker.js +1 -0
  59. package/dist/bigconsole/components/dashboard/TemplateSetupBanner.js +26 -58
  60. package/dist/bigconsole/components/dashboard/TemplateSetupBanner.js.map +1 -1
  61. package/dist/bigconsole/components/dashboard/WidgetPalette.js +307 -229
  62. package/dist/bigconsole/components/dashboard/WidgetPalette.js.map +1 -1
  63. package/dist/bigconsole/components/datasink/CacheTTLSelector.js +128 -129
  64. package/dist/bigconsole/components/datasink/CacheTTLSelector.js.map +1 -1
  65. package/dist/bigconsole/components/datasink/DataSinkCard.js +78 -79
  66. package/dist/bigconsole/components/datasink/DataSinkCard.js.map +1 -1
  67. package/dist/bigconsole/components/datasink/DataSinkDataViewer.js +33 -34
  68. package/dist/bigconsole/components/datasink/DataSinkDataViewer.js.map +1 -1
  69. package/dist/bigconsole/components/datasink/DataSinkDeleteDialog.js +79 -61
  70. package/dist/bigconsole/components/datasink/DataSinkDeleteDialog.js.map +1 -1
  71. package/dist/bigconsole/components/datasink/DataSinkRefreshDialog.js +75 -64
  72. package/dist/bigconsole/components/datasink/DataSinkRefreshDialog.js.map +1 -1
  73. package/dist/bigconsole/components/datasink/DataSinkStatusBadge.js +1 -1
  74. package/dist/bigconsole/components/datasink/DataSinkStatusBadge.js.map +1 -1
  75. package/dist/bigconsole/components/datasink/DataSinkTableViewer.js +20 -19
  76. package/dist/bigconsole/components/datasink/DataSinkTableViewer.js.map +1 -1
  77. package/dist/bigconsole/components/datasink/ExportDataSinkDialog.js +127 -171
  78. package/dist/bigconsole/components/datasink/ExportDataSinkDialog.js.map +1 -1
  79. package/dist/bigconsole/components/datasink/ImportDataGuideDialog.js +113 -117
  80. package/dist/bigconsole/components/datasink/ImportDataGuideDialog.js.map +1 -1
  81. package/dist/bigconsole/components/datasink/ImportDataSinkDialog.js +312 -307
  82. package/dist/bigconsole/components/datasink/ImportDataSinkDialog.js.map +1 -1
  83. package/dist/bigconsole/components/datasink/LinkedParsersPanel.js +65 -66
  84. package/dist/bigconsole/components/datasink/LinkedParsersPanel.js.map +1 -1
  85. package/dist/bigconsole/components/datasink/LinkedWorkflowsPanel.js +121 -127
  86. package/dist/bigconsole/components/datasink/LinkedWorkflowsPanel.js.map +1 -1
  87. package/dist/bigconsole/components/datasink/RefreshTypeSelector.js +194 -189
  88. package/dist/bigconsole/components/datasink/RefreshTypeSelector.js.map +1 -1
  89. package/dist/bigconsole/components/datasink/SetupStateBadge.js +3 -3
  90. package/dist/bigconsole/components/datasink/SetupStateBadge.js.map +1 -1
  91. package/dist/bigconsole/components/datasink/WorkflowStatusPanel.js +95 -95
  92. package/dist/bigconsole/components/datasink/WorkflowStatusPanel.js.map +1 -1
  93. package/dist/bigconsole/components/parser/DataSinkSelector.js +163 -131
  94. package/dist/bigconsole/components/parser/DataSinkSelector.js.map +1 -1
  95. package/dist/bigconsole/components/parser/ExpressionEditor.js +3 -3
  96. package/dist/bigconsole/components/parser/ExpressionEditor.js.map +1 -1
  97. package/dist/bigconsole/components/parser/ImportParserDialog.js +205 -260
  98. package/dist/bigconsole/components/parser/ImportParserDialog.js.map +1 -1
  99. package/dist/bigconsole/components/parser/ParserCard.js +133 -114
  100. package/dist/bigconsole/components/parser/ParserCard.js.map +1 -1
  101. package/dist/bigconsole/components/parser/ParserSelector.js +193 -174
  102. package/dist/bigconsole/components/parser/ParserSelector.js.map +1 -1
  103. package/dist/bigconsole/components/parser/ParserStatusBadge.js +2 -2
  104. package/dist/bigconsole/components/parser/ParserStatusBadge.js.map +1 -1
  105. package/dist/bigconsole/components/parser/ParserTypeBadge.js +4 -4
  106. package/dist/bigconsole/components/parser/ParserTypeBadge.js.map +1 -1
  107. package/dist/bigconsole/components/pipeline/PipelineCard.js +134 -89
  108. package/dist/bigconsole/components/pipeline/PipelineCard.js.map +1 -1
  109. package/dist/bigconsole/components/pipeline/PipelineDeleteDialog.js +77 -64
  110. package/dist/bigconsole/components/pipeline/PipelineDeleteDialog.js.map +1 -1
  111. package/dist/bigconsole/components/pipeline/PipelineStatusBadge.js +7 -10
  112. package/dist/bigconsole/components/pipeline/PipelineStatusBadge.js.map +1 -1
  113. package/dist/bigconsole/components/preview/AiPreviewContent.js +31 -32
  114. package/dist/bigconsole/components/preview/AiPreviewContent.js.map +1 -1
  115. package/dist/bigconsole/components/preview/AiPreviewMiniPanel.js +152 -103
  116. package/dist/bigconsole/components/preview/AiPreviewMiniPanel.js.map +1 -1
  117. package/dist/bigconsole/components/preview/AiPreviewPanel.js +193 -148
  118. package/dist/bigconsole/components/preview/AiPreviewPanel.js.map +1 -1
  119. package/dist/bigconsole/components/preview/previewShared.js +41 -23
  120. package/dist/bigconsole/components/preview/previewShared.js.map +1 -1
  121. package/dist/bigconsole/components/widgets/ActionConfigDialog.js +405 -364
  122. package/dist/bigconsole/components/widgets/ActionConfigDialog.js.map +1 -1
  123. package/dist/bigconsole/components/widgets/DrilldownConfigPanel.js +265 -237
  124. package/dist/bigconsole/components/widgets/DrilldownConfigPanel.js.map +1 -1
  125. package/dist/bigconsole/components/widgets/PropertiesPanel.js +764 -821
  126. package/dist/bigconsole/components/widgets/PropertiesPanel.js.map +1 -1
  127. package/dist/bigconsole/components/widgets/WidgetErrorBoundary.js +7 -5
  128. package/dist/bigconsole/components/widgets/WidgetErrorBoundary.js.map +1 -1
  129. package/dist/bigconsole/components/widgets/WidgetHeader.js +7 -8
  130. package/dist/bigconsole/components/widgets/WidgetHeader.js.map +1 -1
  131. package/dist/bigconsole/components/widgets/WidgetWrapper.js +8 -7
  132. package/dist/bigconsole/components/widgets/WidgetWrapper.js.map +1 -1
  133. package/dist/bigconsole/components/widgets/adaptive-card/AdaptiveCardWidget.js +1 -1
  134. package/dist/bigconsole/components/widgets/adaptive-card/AdaptiveCardWidget.js.map +1 -1
  135. package/dist/bigconsole/components/widgets/calendar/CalendarWidget.js +46 -49
  136. package/dist/bigconsole/components/widgets/calendar/CalendarWidget.js.map +1 -1
  137. package/dist/bigconsole/components/widgets/chart/ChartConfig.js +154 -147
  138. package/dist/bigconsole/components/widgets/chart/ChartConfig.js.map +1 -1
  139. package/dist/bigconsole/components/widgets/comments/WidgetComments.js +118 -101
  140. package/dist/bigconsole/components/widgets/comments/WidgetComments.js.map +1 -1
  141. package/dist/bigconsole/components/widgets/event-logs/EventLogViewer.js +244 -191
  142. package/dist/bigconsole/components/widgets/event-logs/EventLogViewer.js.map +1 -1
  143. package/dist/bigconsole/components/widgets/form/FormWidget.js +167 -159
  144. package/dist/bigconsole/components/widgets/form/FormWidget.js.map +1 -1
  145. package/dist/bigconsole/components/widgets/gauge/GaugeConfig.js +92 -76
  146. package/dist/bigconsole/components/widgets/gauge/GaugeConfig.js.map +1 -1
  147. package/dist/bigconsole/components/widgets/gauge/GaugeWidget.js +1 -1
  148. package/dist/bigconsole/components/widgets/gauge/GaugeWidget.js.map +1 -1
  149. package/dist/bigconsole/components/widgets/heatmap/HeatmapConfig.js +89 -86
  150. package/dist/bigconsole/components/widgets/heatmap/HeatmapConfig.js.map +1 -1
  151. package/dist/bigconsole/components/widgets/iframe-widget/IframeWidget.js +2 -2
  152. package/dist/bigconsole/components/widgets/iframe-widget/IframeWidget.js.map +1 -1
  153. package/dist/bigconsole/components/widgets/kanban/KanbanWidget.js +64 -63
  154. package/dist/bigconsole/components/widgets/kanban/KanbanWidget.js.map +1 -1
  155. package/dist/bigconsole/components/widgets/kpi-comparison/KPIComparisonWidget.js +2 -2
  156. package/dist/bigconsole/components/widgets/kpi-comparison/KPIComparisonWidget.js.map +1 -1
  157. package/dist/bigconsole/components/widgets/list/ListConfig.js +65 -58
  158. package/dist/bigconsole/components/widgets/list/ListConfig.js.map +1 -1
  159. package/dist/bigconsole/components/widgets/list/ListItem.js +1 -1
  160. package/dist/bigconsole/components/widgets/list/ListItem.js.map +1 -1
  161. package/dist/bigconsole/components/widgets/map-widget/MapWidget.js +1 -1
  162. package/dist/bigconsole/components/widgets/map-widget/MapWidget.js.map +1 -1
  163. package/dist/bigconsole/components/widgets/metric-card/MetricCardConfig.js +79 -72
  164. package/dist/bigconsole/components/widgets/metric-card/MetricCardConfig.js.map +1 -1
  165. package/dist/bigconsole/components/widgets/metric-card/SparklineChart.js +35 -34
  166. package/dist/bigconsole/components/widgets/metric-card/SparklineChart.js.map +1 -1
  167. package/dist/bigconsole/components/widgets/metric-card/TrendIndicator.js +20 -19
  168. package/dist/bigconsole/components/widgets/metric-card/TrendIndicator.js.map +1 -1
  169. package/dist/bigconsole/components/widgets/pivot-table/PivotTableWidget.js +181 -180
  170. package/dist/bigconsole/components/widgets/pivot-table/PivotTableWidget.js.map +1 -1
  171. package/dist/bigconsole/components/widgets/progress/ProgressConfig.js +100 -90
  172. package/dist/bigconsole/components/widgets/progress/ProgressConfig.js.map +1 -1
  173. package/dist/bigconsole/components/widgets/retention/RetentionWidget.js +3 -3
  174. package/dist/bigconsole/components/widgets/retention/RetentionWidget.js.map +1 -1
  175. package/dist/bigconsole/components/widgets/states/EmptyState.js +6 -4
  176. package/dist/bigconsole/components/widgets/states/EmptyState.js.map +1 -1
  177. package/dist/bigconsole/components/widgets/states/ErrorState.js +7 -5
  178. package/dist/bigconsole/components/widgets/states/ErrorState.js.map +1 -1
  179. package/dist/bigconsole/components/widgets/states/LoadingState.js +5 -4
  180. package/dist/bigconsole/components/widgets/states/LoadingState.js.map +1 -1
  181. package/dist/bigconsole/components/widgets/table/TableConfig.js +193 -172
  182. package/dist/bigconsole/components/widgets/table/TableConfig.js.map +1 -1
  183. package/dist/bigconsole/components/widgets/table/TableHeader.js +1 -1
  184. package/dist/bigconsole/components/widgets/table/TableHeader.js.map +1 -1
  185. package/dist/bigconsole/components/widgets/table/TableWidget.js +1 -1
  186. package/dist/bigconsole/components/widgets/table/TableWidget.js.map +1 -1
  187. package/dist/bigconsole/components/widgets/text-widget/TextWidget.js +1 -1
  188. package/dist/bigconsole/components/widgets/text-widget/TextWidget.js.map +1 -1
  189. package/dist/bigconsole/components/widgets/timeline/TimelineWidget.js +3 -3
  190. package/dist/bigconsole/components/widgets/timeline/TimelineWidget.js.map +1 -1
  191. package/dist/bigconsole/components/widgets/utils/conditionalFormat.js +2 -2
  192. package/dist/bigconsole/components/widgets/utils/conditionalFormat.js.map +1 -1
  193. package/dist/bigconsole/components/widgets/webhook-config/WebhookConfigPanel.js +283 -249
  194. package/dist/bigconsole/components/widgets/webhook-config/WebhookConfigPanel.js.map +1 -1
  195. package/dist/bigconsole/components/widgets/widget-actions/WidgetActions.js +28 -20
  196. package/dist/bigconsole/components/widgets/widget-actions/WidgetActions.js.map +1 -1
  197. package/dist/bigconsole/components/workflow/WorkflowCard.js +92 -77
  198. package/dist/bigconsole/components/workflow/WorkflowCard.js.map +1 -1
  199. package/dist/bigconsole/components/workflow/WorkflowDeleteDialog.js +70 -51
  200. package/dist/bigconsole/components/workflow/WorkflowDeleteDialog.js.map +1 -1
  201. package/dist/bigconsole/components/workflow/WorkflowStatusBadge.js +16 -17
  202. package/dist/bigconsole/components/workflow/WorkflowStatusBadge.js.map +1 -1
  203. package/dist/bigconsole/customWidget/CustomWidgetBuilderSheet.js +46 -42
  204. package/dist/bigconsole/customWidget/CustomWidgetBuilderSheet.js.map +1 -1
  205. package/dist/bigconsole/customWidget/CustomWidgetProposalPanel.js +372 -348
  206. package/dist/bigconsole/customWidget/CustomWidgetProposalPanel.js.map +1 -1
  207. package/dist/bigconsole/hooks/useModalFocusTrap.js +53 -0
  208. package/dist/bigconsole/hooks/useModalFocusTrap.js.map +1 -0
  209. package/dist/bigconsole/pages/DashboardBuilderPage.js +153 -142
  210. package/dist/bigconsole/pages/DashboardBuilderPage.js.map +1 -1
  211. package/dist/bigconsole/pages/DashboardViewPage.js +230 -220
  212. package/dist/bigconsole/pages/DashboardViewPage.js.map +1 -1
  213. package/dist/bigconsole/pages/DashboardsPage.js +832 -790
  214. package/dist/bigconsole/pages/DashboardsPage.js.map +1 -1
  215. package/dist/bigconsole/pages/DataParsersPage.js +249 -304
  216. package/dist/bigconsole/pages/DataParsersPage.js.map +1 -1
  217. package/dist/bigconsole/pages/DataSinkBuilderPage.js +324 -349
  218. package/dist/bigconsole/pages/DataSinkBuilderPage.js.map +1 -1
  219. package/dist/bigconsole/pages/DataSinkViewPage.js +336 -323
  220. package/dist/bigconsole/pages/DataSinkViewPage.js.map +1 -1
  221. package/dist/bigconsole/pages/DataSinksPage.js +356 -458
  222. package/dist/bigconsole/pages/DataSinksPage.js.map +1 -1
  223. package/dist/bigconsole/pages/DataSourcesPage.js +14 -8
  224. package/dist/bigconsole/pages/DataSourcesPage.js.map +1 -1
  225. package/dist/bigconsole/pages/HomePage.js +186 -193
  226. package/dist/bigconsole/pages/HomePage.js.map +1 -1
  227. package/dist/bigconsole/pages/InsightsPage.js +901 -724
  228. package/dist/bigconsole/pages/InsightsPage.js.map +1 -1
  229. package/dist/bigconsole/pages/ParserBuilderPage.js +769 -675
  230. package/dist/bigconsole/pages/ParserBuilderPage.js.map +1 -1
  231. package/dist/bigconsole/pages/ParserViewPage.js +382 -354
  232. package/dist/bigconsole/pages/ParserViewPage.js.map +1 -1
  233. package/dist/bigconsole/pages/PipelineBuilderPage.js +540 -420
  234. package/dist/bigconsole/pages/PipelineBuilderPage.js.map +1 -1
  235. package/dist/bigconsole/pages/PipelineViewPage.js +416 -384
  236. package/dist/bigconsole/pages/PipelineViewPage.js.map +1 -1
  237. package/dist/bigconsole/pages/PipelinesPage.js +260 -309
  238. package/dist/bigconsole/pages/PipelinesPage.js.map +1 -1
  239. package/dist/bigconsole/pages/SettingsPage.js +177 -172
  240. package/dist/bigconsole/pages/SettingsPage.js.map +1 -1
  241. package/dist/bigconsole/pages/WidgetDemoPage.js +278 -142
  242. package/dist/bigconsole/pages/WidgetDemoPage.js.map +1 -1
  243. package/dist/bigconsole/pages/WorkflowViewPage.js +382 -366
  244. package/dist/bigconsole/pages/WorkflowViewPage.js.map +1 -1
  245. package/dist/bigconsole/pages/WorkflowsPage.js +202 -316
  246. package/dist/bigconsole/pages/WorkflowsPage.js.map +1 -1
  247. package/dist/bigconsole/renderers/adapters/AdaptiveCardRenderer.js +111 -109
  248. package/dist/bigconsole/renderers/adapters/AdaptiveCardRenderer.js.map +1 -1
  249. package/dist/bigconsole/renderers/adapters/BlockKitRenderer.js +127 -126
  250. package/dist/bigconsole/renderers/adapters/BlockKitRenderer.js.map +1 -1
  251. package/dist/bigconsole/renderers/adapters/CustomRenderer.js +103 -103
  252. package/dist/bigconsole/renderers/adapters/CustomRenderer.js.map +1 -1
  253. package/package.json +2 -1
@@ -1 +1 @@
1
- {"version":3,"file":"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,124 +1,158 @@
1
- import e from "../../parser/DataSinkSelector.js";
2
- import t from "../../parser/ParserSelector.js";
3
- import { Input as n, Label as r, Spinner as i } from "@burdenoff/fe-libs/ui";
4
- import { jsx as a, jsxs as o } 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";
5
8
  //#region src/bigconsole/components/builder/inspector/DataBindingSection.tsx
6
- var s = {
7
- unbound: "Select a DataSink to begin",
8
- loading: "Testing parser and detecting fields…",
9
- bound: "Binding ready",
10
- no_data: "Parser returned no data",
11
- parser_error: "Parser test failed",
12
- field_mismatch: "Some mapped fields were not found"
13
- }, c = ({ consoleId: c, binding: l, dataSinkKey: u, dataPath: d, status: f, missingFields: p = [], preview: m, error: h, onDataSinkChange: g, onParserChange: _, onDataPathChange: v }) => /* @__PURE__ */ o("div", {
14
- className: "space-y-4",
15
- children: [
16
- /* @__PURE__ */ a("div", {
17
- className: "rounded-md border border-border-subtle bg-bg-sunken p-3",
18
- children: /* @__PURE__ */ a("p", {
19
- className: "text-xs text-text-secondary",
20
- children: "Connect this widget to a DataSink and Parser to display transformed data."
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")
24
+ };
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,
56
+ filterStatus: void 0,
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]
81
+ }),
82
+ v && /* @__PURE__ */ c("p", {
83
+ className: "break-words text-xs text-[var(--color-status-error-text)]",
84
+ children: v
85
+ }),
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(", ") })
89
+ }),
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."
93
+ })
94
+ ]
21
95
  })
22
96
  }),
23
- /* @__PURE__ */ o("div", {
24
- className: "space-y-2",
25
- children: [
26
- /* @__PURE__ */ a(r, { children: "DataSink" }),
27
- /* @__PURE__ */ a(e, {
28
- value: u,
29
- onChange: g,
30
- placeholder: "Select a DataSink..."
31
- }),
32
- u && /* @__PURE__ */ o("p", {
33
- className: "text-xs text-text-secondary",
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",
34
106
  children: [
35
- "Key: ",
36
- u,
37
- l.source.ref && /* @__PURE__ */ o("span", {
38
- className: "ml-2 text-text-tertiary",
39
- children: [
40
- "ID: ",
41
- l.source.ref.slice(0, 8),
42
- "..."
43
- ]
107
+ e,
108
+ ": ",
109
+ /* @__PURE__ */ c("code", {
110
+ className: "rounded bg-bg-surface px-1 font-mono",
111
+ children: t
44
112
  })
45
113
  ]
46
- })
47
- ]
114
+ }, e))
115
+ })
48
116
  }),
49
- /* @__PURE__ */ o("div", {
50
- className: "space-y-2",
51
- children: [
52
- /* @__PURE__ */ a(r, { children: "Parser" }),
53
- /* @__PURE__ */ a(t, {
54
- consoleId: c,
55
- value: l.parserId ?? null,
56
- onChange: _,
57
- filterInputSinkKey: u ?? void 0,
58
- filterStatus: void 0,
59
- placeholder: u ? "Select a parser..." : "Select a DataSink first...",
60
- disabled: !u
61
- }),
62
- /* @__PURE__ */ o("p", {
63
- className: "flex items-center gap-1 text-xs text-text-secondary",
64
- role: "status",
65
- children: [f === "loading" && /* @__PURE__ */ a(i, { style: {
66
- width: "12px",
67
- height: "12px"
68
- } }), s[f]]
69
- }),
70
- h && /* @__PURE__ */ a("p", {
71
- className: "text-xs text-status-error-text",
72
- children: h
73
- }),
74
- p.length > 0 && /* @__PURE__ */ o("p", {
75
- className: "text-xs text-status-warning-text",
76
- children: ["Missing: ", p.join(", ")]
77
- })
78
- ]
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
+ })
79
127
  }),
80
- l.parserId && Object.keys(l.fields).length > 0 && /* @__PURE__ */ o("div", {
81
- className: "rounded-md border border-status-success-border bg-status-success-bg-subtle p-3",
82
- children: [/* @__PURE__ */ a("p", {
83
- className: "mb-2 text-xs font-medium text-status-success-text",
84
- children: "Field mappings configured"
85
- }), /* @__PURE__ */ a("div", {
86
- className: "space-y-1 text-xs text-text-secondary",
87
- children: Object.entries(l.fields).map(([e, t]) => /* @__PURE__ */ o("p", { children: [
88
- e,
89
- ": ",
90
- /* @__PURE__ */ a("code", {
91
- className: "rounded bg-bg-sunken px-1",
92
- children: t
128
+ /* @__PURE__ */ c(e, {
129
+ emphasis: "muted",
130
+ padding: "compact",
131
+ title: "Data path",
132
+ headingLevel: 3,
133
+ children: /* @__PURE__ */ l("div", {
134
+ className: "space-y-2",
135
+ children: [
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")
145
+ }),
146
+ /* @__PURE__ */ c("p", {
147
+ className: "text-xs text-text-secondary",
148
+ children: S("bigconsole.builder.dataBinding.dataPathHelp", "Path to extract specific data from the parser output (dot notation)")
93
149
  })
94
- ] }, e))
95
- })]
96
- }),
97
- m !== void 0 && /* @__PURE__ */ o("div", {
98
- className: "space-y-2",
99
- children: [/* @__PURE__ */ a(r, { children: "Live Preview" }), /* @__PURE__ */ a("pre", {
100
- className: "max-h-40 overflow-auto rounded-md border border-border-subtle bg-bg-sunken p-3 text-xs text-text-secondary",
101
- children: JSON.stringify(m, null, 2)
102
- })]
103
- }),
104
- /* @__PURE__ */ o("div", {
105
- className: "space-y-2",
106
- children: [
107
- /* @__PURE__ */ a(r, { children: "Data Path (Optional)" }),
108
- /* @__PURE__ */ a(n, {
109
- value: d ?? "",
110
- onChange: (e) => v(e.target.value || void 0),
111
- placeholder: "e.g., summary.totalRevenue"
112
- }),
113
- /* @__PURE__ */ a("p", {
114
- className: "text-xs text-text-secondary",
115
- children: "Path to extract specific data from the parser output (dot notation)"
116
- })
117
- ]
150
+ ]
151
+ })
118
152
  })
119
- ]
120
- });
153
+ ] });
154
+ };
121
155
  //#endregion
122
- export { c as DataBindingSection };
156
+ export { d as DataBindingSection };
123
157
 
124
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 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\nconst STATUS_LABELS: Record<WidgetBindingStatus, string> = {\n unbound: 'Select a DataSink to begin',\n loading: 'Testing parser and detecting fields…',\n bound: 'Binding ready',\n no_data: 'Parser returned no data',\n parser_error: 'Parser test failed',\n field_mismatch: 'Some mapped fields were not found',\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 <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 Connect this widget to a DataSink and Parser to display transformed data.\n </p>\n </div>\n\n <div className=\"space-y-2\">\n <Label>DataSink</Label>\n <DataSinkSelector value={dataSinkKey} onChange={onDataSinkChange} placeholder=\"Select a DataSink...\" />\n {dataSinkKey && (\n <p className=\"text-xs text-text-secondary\">\n Key: {dataSinkKey}\n {binding.source.ref && (\n <span className=\"ml-2 text-text-tertiary\">ID: {binding.source.ref.slice(0, 8)}...</span>\n )}\n </p>\n )}\n </div>\n\n <div className=\"space-y-2\">\n <Label>Parser</Label>\n <ParserSelector\n consoleId={consoleId}\n value={binding.parserId ?? null}\n onChange={onParserChange}\n filterInputSinkKey={dataSinkKey ?? undefined}\n filterStatus={undefined}\n placeholder={dataSinkKey ? 'Select a parser...' : 'Select a DataSink first...'}\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 {STATUS_LABELS[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\">Missing: {missingFields.join(', ')}</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\">Field mappings configured</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>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>Data Path (Optional)</Label>\n <Input\n value={dataPath ?? ''}\n onChange={(event) => onDataPathChange(event.target.value || undefined)}\n placeholder=\"e.g., summary.totalRevenue\"\n />\n <p className=\"text-xs text-text-secondary\">Path to extract specific data from the parser output (dot notation)</p>\n </div>\n </div>\n);\n"],"mappings":";;;;;AAoBA,IAAM,IAAqD;CACzD,SAAS;CACT,SAAS;CACT,OAAO;CACP,SAAS;CACT,cAAc;CACd,gBAAgB;CACjB,EAEY,KAAmD,EAC9D,cACA,YACA,gBACA,aACA,WACA,mBAAgB,EAAE,EAClB,YACA,UACA,qBACA,mBACA,0BAEA,kBAAC,OAAD;CAAK,WAAU;WAAf;EACE,kBAAC,OAAD;GAAK,WAAU;aACb,kBAAC,KAAD;IAAG,WAAU;cAA8B;IAEvC,CAAA;GACA,CAAA;EAEN,kBAAC,OAAD;GAAK,WAAU;aAAf;IACE,kBAAC,GAAD,EAAA,UAAO,YAAgB,CAAA;IACvB,kBAAC,GAAD;KAAkB,OAAO;KAAa,UAAU;KAAkB,aAAY;KAAyB,CAAA;IACtG,KACC,kBAAC,KAAD;KAAG,WAAU;eAAb;MAA2C;MACnC;MACL,EAAQ,OAAO,OACd,kBAAC,QAAD;OAAM,WAAU;iBAAhB;QAA0C;QAAK,EAAQ,OAAO,IAAI,MAAM,GAAG,EAAE;QAAC;QAAU;;MAExF;;IAEF;;EAEN,kBAAC,OAAD;GAAK,WAAU;aAAf;IACE,kBAAC,GAAD,EAAA,UAAO,UAAc,CAAA;IACrB,kBAAC,GAAD;KACa;KACX,OAAO,EAAQ,YAAY;KAC3B,UAAU;KACV,oBAAoB,KAAe,KAAA;KACnC,cAAc,KAAA;KACd,aAAa,IAAc,uBAAuB;KAClD,UAAU,CAAC;KACX,CAAA;IACF,kBAAC,KAAD;KAAG,WAAU;KAAsD,MAAK;eAAxE,CACG,MAAW,aAAa,kBAAC,GAAD,EAAS,OAAO;MAAE,OAAO;MAAQ,QAAQ;MAAQ,EAAI,CAAA,EAC7E,EAAc,GACb;;IACH,KAAS,kBAAC,KAAD;KAAG,WAAU;eAAkC;KAAU,CAAA;IAClE,EAAc,SAAS,KACtB,kBAAC,KAAD;KAAG,WAAU;eAAb,CAAgD,aAAU,EAAc,KAAK,KAAK,CAAK;;IAErF;;EAEL,EAAQ,YAAY,OAAO,KAAK,EAAQ,OAAO,CAAC,SAAS,KACxD,kBAAC,OAAD;GAAK,WAAU;aAAf,CACE,kBAAC,KAAD;IAAG,WAAU;cAAoD;IAA6B,CAAA,EAC9F,kBAAC,OAAD;IAAK,WAAU;cACZ,OAAO,QAAQ,EAAQ,OAAO,CAAC,KAAK,CAAC,GAAM,OAC1C,kBAAC,KAAD,EAAA,UAAA;KACG;KAAK;KAAE,kBAAC,QAAD;MAAM,WAAU;gBAA6B;MAAY,CAAA;KAC/D,EAAA,EAFI,EAEJ,CACJ;IACE,CAAA,CACF;;EAGP,MAAY,KAAA,KACX,kBAAC,OAAD;GAAK,WAAU;aAAf,CACE,kBAAC,GAAD,EAAA,UAAO,gBAAoB,CAAA,EAC3B,kBAAC,OAAD;IAAK,WAAU;cACZ,KAAK,UAAU,GAAS,MAAM,EAAE;IAC7B,CAAA,CACF;;EAGR,kBAAC,OAAD;GAAK,WAAU;aAAf;IACE,kBAAC,GAAD,EAAA,UAAO,wBAA4B,CAAA;IACnC,kBAAC,GAAD;KACE,OAAO,KAAY;KACnB,WAAW,MAAU,EAAiB,EAAM,OAAO,SAAS,KAAA,EAAU;KACtE,aAAY;KACZ,CAAA;IACF,kBAAC,KAAD;KAAG,WAAU;eAA8B;KAAuE,CAAA;IAC9G;;EACF"}
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":";;;;;;;;AA2BA,IAAM,IAAyD;CAC7D,SAAS;CACT,SAAS;CACT,OAAO;CACP,SAAS;CACT,cAAc;CACd,gBAAgB;CACjB,EAEY,KAAmD,EAC9D,cACA,YACA,gBACA,aACA,WACA,mBAAgB,EAAE,EAClB,YACA,UACA,qBACA,mBACA,0BACI;CACJ,IAAM,EAAE,SAAM,GAAS,EAEjB,IAAoD;EACxD,SAAS,EAAE,iDAAiD,6BAA6B;EACzF,SAAS,EAAE,iDAAiD,uCAAuC;EACnG,OAAO,EAAE,+CAA+C,gBAAgB;EACxE,SAAS,EAAE,gDAAgD,0BAA0B;EACrF,cAAc,EAAE,qDAAqD,qBAAqB;EAC1F,gBAAgB,EAAE,uDAAuD,oCAAoC;EAC9G;AAED,QACE,kBAAC,GAAD,EAAA,UAAA;EACE,kBAAC,GAAD;GACE,OAAM;GACN,aAAa,EACX,wCACA,4EACD;GACD,eAAY;aAEZ,kBAAC,OAAD;IAAK,WAAU;cAAf,CACE,kBAAC,OAAD;KAAK,WAAU;eAAf;MACE,kBAAC,GAAD,EAAA,UAAQ,EAAE,gDAAgD,WAAW,EAAS,CAAA;MAC9E,kBAAC,GAAD;OACE,OAAO;OACP,UAAU;OACV,aAAa,EAAE,sDAAsD,uBAAuB;OAC5F,CAAA;MACD,KACC,kBAAC,KAAD;OAAG,WAAU;iBAAb,CACG,EAAE,2CAA2C,gBAAgB,EAAE,KAAK,GAAa,CAAC,EAClF,EAAQ,OAAO,OACd,kBAAC,QAAD;QAAM,WAAU;kBACb,EAAE,0CAA0C,iBAAiB,EAC5D,IAAI,EAAQ,OAAO,IAAI,MAAM,GAAG,EAAE,EACnC,CAAC;QACG,CAAA,CAEP;;MAEF;QAEN,kBAAC,OAAD;KAAK,WAAU;eAAf,CACE,kBAAC,GAAD,EAAA,UAAQ,EAAE,8CAA8C,SAAS,EAAS,CAAA,EAC1E,kBAAC,GAAD;MACa;MACX,OAAO,EAAQ,YAAY;MAC3B,UAAU;MACV,oBAAoB,KAAe,KAAA;MACnC,cAAc,KAAA;MACd,aACE,IACI,EAAE,oDAAoD,qBAAqB,GAC3E,EAAE,0DAA0D,6BAA6B;MAE/F,UAAU,CAAC;MACX,CAAA,CACE;OACF;;GACE,CAAA;EAEV,kBAAC,GAAD;GACE,OAAO,EAAa;GACpB,MAAM,EAAa;GACnB,SAAQ;GACR,cAAc;GACd,MAAM,MAAW,YAAY,kBAAC,GAAD,EAAS,OAAO;IAAE,OAAO;IAAQ,QAAQ;IAAQ,EAAI,CAAA,GAAG,KAAA;GACrF,eAAY;aAEZ,kBAAC,OAAD;IAAK,MAAK;IAAS,aAAU;IAAS,WAAU;cAAhD;KAME,kBAAC,KAAD;MAAG,WAAU;gBAAW,EAAa;MAAY,CAAA;KAChD,KAAS,kBAAC,KAAD;MAAG,WAAU;gBAA6D;MAAU,CAAA;KAC7F,EAAc,SAAS,KACtB,kBAAC,KAAD;MAAG,WAAU;gBACV,EAAE,gDAAgD,uBAAuB,EACxE,QAAQ,EAAc,KAAK,KAAK,EACjC,CAAC;MACA,CAAA;KAEL,CAAC,KAAS,EAAc,WAAW,KAAK,MAAW,WAClD,kBAAC,KAAD;MAAG,WAAU;gBAA8B;MAEvC,CAAA;KAEF;;GACE,CAAA;EAET,EAAQ,YAAY,OAAO,KAAK,EAAQ,OAAO,CAAC,SAAS,KACxD,kBAAC,GAAD;GACE,UAAS;GACT,SAAQ;GACR,OAAO,EAAE,0DAA0D,4BAA4B;GAC/F,cAAc;aAEd,kBAAC,OAAD;IAAK,WAAU;cACZ,OAAO,QAAQ,EAAQ,OAAO,CAAC,KAAK,CAAC,GAAM,OAC1C,kBAAC,KAAD;KAAc,WAAU;eAAxB;MACG;MAAK;MAAE,kBAAC,QAAD;OAAM,WAAU;iBAAwC;OAAY,CAAA;MAC1E;OAFI,EAEJ,CACJ;IACE,CAAA;GACE,CAAA;EAGX,MAAY,KAAA,KACX,kBAAC,GAAD;GACE,UAAS;GACT,SAAQ;GACR,OAAO,EAAE,mDAAmD,eAAe;GAC3E,aAAY;GACZ,cAAc;aAEd,kBAAC,OAAD;IAAK,WAAU;cACZ,KAAK,UAAU,GAAS,MAAM,EAAE;IAC7B,CAAA;GACE,CAAA;EAGZ,kBAAC,GAAD;GAAS,UAAS;GAAQ,SAAQ;GAAU,OAAM;GAAY,cAAc;aAC1E,kBAAC,OAAD;IAAK,WAAU;cAAf;KACE,kBAAC,GAAD;MAAO,SAAQ;gBACZ,EAAE,gDAAgD,uBAAuB;MACpE,CAAA;KACR,kBAAC,GAAD;MACE,IAAG;MACH,OAAO,KAAY;MACnB,WAAW,MAAU,EAAiB,EAAM,OAAO,SAAS,KAAA,EAAU;MACtE,aAAa,EAAE,sDAAsD,6BAA6B;MAClG,CAAA;KACF,kBAAC,KAAD;MAAG,WAAU;gBACV,EACC,+CACA,sEACD;MACC,CAAA;KACA;;GACE,CAAA;EACG,EAAA,CAAA"}