@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":"InsightsPage.js","names":[],"sources":["../../../src/bigconsole/pages/InsightsPage.tsx"],"sourcesContent":["/**\n * InsightsPage\n *\n * AI-powered dashboard generation using the Prompt module backend.\n * Users enter a natural language prompt to generate dashboards with\n * suggested widgets, layouts, and configurations.\n */\n\nimport { type FC, memo, useState, useCallback, useEffect } from 'react';\nimport { gql } from '@apollo/client';\nimport { useMutation, useQuery } from '@apollo/client/react';\nimport { AuroraBackground, GradientText, GlassCard, EmphasisPanel, IllustratedEmptyState } from '@burdenoff/fe-libs/ui';\nimport { useI18n } from '@burdenoff/fe-libs/shared/providers/shell/I18nProvider';\nimport { useAppNavigate } from '../contexts';\nimport { useBigConsoleAnalytics } from '../hooks/useBigConsoleAnalytics';\nimport { reportBigConsoleQuotaError } from '../utils/quota';\nimport { isNative, nativeImpact, nativeNotify } from '../../utils/nativeBridge';\nimport {\n Sparkles,\n Loader2,\n Trash2,\n ArrowRight,\n Clock,\n CheckCircle,\n XCircle,\n AlertCircle,\n RefreshCw,\n Eye,\n Ban,\n Wand2,\n X,\n} from 'lucide-react';\n\n// ============================================================================\n// GRAPHQL OPERATIONS (inline until codegen is configured for prompt module)\n// TODO(BOFF-2055): Replace inline gql with codegen-generated hooks\n// ============================================================================\n\nconst LIST_PROMPT_GENERATIONS = gql`\n query ListPromptGenerations($status: PromptGenerationStatus, $first: Int) {\n listPromptGenerations(status: $status, first: $first) {\n edges {\n node {\n id\n prompt\n status\n dashboardId\n errorMessage\n createdAt\n completedAt\n generatedSpec {\n name\n description\n overallConfidence\n pages {\n name\n widgets {\n title\n type\n }\n }\n }\n }\n }\n totalCount\n }\n }\n`;\n\nconst GET_PROMPT_SUGGESTIONS = gql`\n query GetPromptSuggestions($category: String, $limit: Int) {\n getPromptSuggestions(category: $category, limit: $limit) {\n id\n category\n title\n prompt\n exampleDescription\n tags\n }\n }\n`;\n\nconst GENERATE_DASHBOARD = gql`\n mutation GenerateDashboardFromPrompt($input: GenerateDashboardFromPromptInput!) {\n generateDashboardFromPrompt(input: $input) {\n id\n status\n prompt\n }\n }\n`;\n\nconst CREATE_FROM_GENERATION = gql`\n mutation CreateDashboardFromGeneration($input: CreateDashboardFromGenerationInput!) {\n createDashboardFromGeneration(input: $input) {\n id\n }\n }\n`;\n\nconst DELETE_GENERATION = gql`\n mutation DeletePromptGeneration($generationId: ID!) {\n deletePromptGeneration(generationId: $generationId)\n }\n`;\n\nconst CANCEL_GENERATION = gql`\n mutation CancelPromptGeneration($generationId: ID!) {\n cancelPromptGeneration(generationId: $generationId) {\n id\n status\n }\n }\n`;\n\nconst REGENERATE_DASHBOARD = gql`\n mutation RegenerateDashboard($input: RegenerateDashboardInput!) {\n regenerateDashboard(input: $input) {\n id\n status\n prompt\n }\n }\n`;\n\nconst REFINE_GENERATION = gql`\n mutation RefineGeneratedDashboard($input: RefineGeneratedDashboardInput!) {\n refineGeneratedDashboard(input: $input) {\n id\n status\n prompt\n }\n }\n`;\n\n// ============================================================================\n// TYPES\n// ============================================================================\n\ninterface ListPromptGenerationsData {\n listPromptGenerations: {\n edges: Array<{ node: PromptGeneration }>;\n totalCount: number;\n };\n}\n\ninterface GetPromptSuggestionsData {\n getPromptSuggestions: PromptSuggestion[];\n}\n\ninterface GenerateDashboardData {\n generateDashboardFromPrompt: {\n id: string;\n status: string;\n prompt: string;\n };\n}\n\ninterface CreateFromGenerationData {\n createDashboardFromGeneration: {\n id: string;\n };\n}\n\nconst NON_TERMINAL_STATUSES = ['PENDING', 'PROCESSING', 'GENERATING'];\n\ninterface PromptSuggestion {\n id: string;\n category: string;\n title: string;\n prompt: string;\n exampleDescription?: string;\n tags: string[];\n}\n\ninterface PromptGeneration {\n id: string;\n prompt: string;\n status: string;\n dashboardId?: string;\n errorMessage?: string;\n createdAt: string;\n completedAt?: string;\n generatedSpec?: {\n name: string;\n description?: string;\n overallConfidence: number;\n pages: Array<{\n name: string;\n widgets: Array<{ title: string; type: string }>;\n }>;\n };\n}\n\n// ============================================================================\n// STATUS HELPERS\n// ============================================================================\n\nfunction getStatusIcon(status: string) {\n switch (status) {\n case 'COMPLETED':\n return <CheckCircle size={16} className=\"text-green-500\" />;\n case 'FAILED':\n return <XCircle size={16} className=\"text-red-500\" />;\n case 'CANCELLED':\n return <XCircle size={16} className=\"text-gray-400\" />;\n case 'PENDING':\n case 'PROCESSING':\n case 'GENERATING':\n return <Loader2 size={16} className=\"text-blue-500 animate-spin\" />;\n default:\n return <Clock size={16} className=\"text-gray-400\" />;\n }\n}\n\nfunction getStatusLabel(status: string, t: (key: string, fallback: string) => string) {\n switch (status) {\n case 'COMPLETED':\n return t('bigconsole.insights.status.completed', 'Completed');\n case 'FAILED':\n return t('bigconsole.insights.status.failed', 'Failed');\n case 'CANCELLED':\n return t('bigconsole.insights.status.cancelled', 'Cancelled');\n case 'PENDING':\n return t('bigconsole.insights.status.pending', 'Pending');\n case 'PROCESSING':\n return t('bigconsole.insights.status.processing', 'Processing');\n case 'GENERATING':\n return t('bigconsole.insights.status.generating', 'Generating');\n default:\n return status;\n }\n}\n\n// ============================================================================\n// COMPONENT\n// ============================================================================\n\nexport const InsightsPage: FC = memo(function InsightsPage() {\n const { t } = useI18n();\n const navigate = useAppNavigate();\n const emitBigConsoleEvent = useBigConsoleAnalytics();\n const [promptText, setPromptText] = useState('');\n const [isGenerating, setIsGenerating] = useState(false);\n const [mutationError, setMutationError] = useState<string | null>(null);\n // Track per-generation in-flight mutations independently so cancelling A\n // does not visually \"busy\" B's regenerate (and vice-versa).\n const [busyIds, setBusyIds] = useState<Set<string>>(() => new Set());\n const [previewGen, setPreviewGen] = useState<PromptGeneration | null>(null);\n const [refineGen, setRefineGen] = useState<PromptGeneration | null>(null);\n const [refineText, setRefineText] = useState('');\n\n const markBusy = useCallback((id: string) => {\n setBusyIds((prev) => new Set(prev).add(id));\n }, []);\n const clearBusy = useCallback((id: string) => {\n setBusyIds((prev) => {\n const next = new Set(prev);\n next.delete(id);\n return next;\n });\n }, []);\n\n // Fetch existing generations.\n const {\n data: generationsData,\n loading: generationsLoading,\n refetch: refetchGenerations,\n startPolling,\n stopPolling,\n } = useQuery<ListPromptGenerationsData>(LIST_PROMPT_GENERATIONS, {\n variables: { first: 20 },\n fetchPolicy: 'cache-and-network',\n });\n\n // Whether any generation is still in a non-terminal state. Derived from the\n // latest query data so polling stops automatically once everything settles.\n const hasActiveGenerations =\n generationsData?.listPromptGenerations?.edges?.some((edge) => NON_TERMINAL_STATUSES.includes(edge.node.status)) ??\n false;\n\n // Fetch suggestions\n const { data: suggestionsData } = useQuery<GetPromptSuggestionsData>(GET_PROMPT_SUGGESTIONS, {\n variables: { limit: 6 },\n });\n\n // Mutations\n const [generateDashboard] = useMutation<GenerateDashboardData>(GENERATE_DASHBOARD);\n const [createFromGeneration] = useMutation<CreateFromGenerationData>(CREATE_FROM_GENERATION);\n const [deleteGeneration] = useMutation(DELETE_GENERATION);\n const [cancelGeneration] = useMutation(CANCEL_GENERATION);\n const [regenerateDashboard] = useMutation(REGENERATE_DASHBOARD);\n const [refineGeneration] = useMutation(REFINE_GENERATION);\n\n const generations: PromptGeneration[] = generationsData?.listPromptGenerations?.edges?.map((edge) => edge.node) || [];\n const suggestions: PromptSuggestion[] = suggestionsData?.getPromptSuggestions || [];\n\n // Poll every 2s while a generation is non-terminal (or a generate request is\n // in flight) so cards advance (e.g. PROCESSING → COMPLETED) without a manual\n // refresh; polling is stopped once everything settles.\n useEffect(() => {\n if (hasActiveGenerations || isGenerating) {\n startPolling(2_000);\n } else {\n stopPolling();\n }\n return () => stopPolling();\n }, [hasActiveGenerations, isGenerating, startPolling, stopPolling]);\n\n // Close the Preview / Refine modals on Escape for keyboard accessibility.\n useEffect(() => {\n if (!previewGen && !refineGen) return;\n const onKey = (e: KeyboardEvent) => {\n if (e.key === 'Escape') {\n setPreviewGen(null);\n setRefineGen(null);\n }\n };\n window.addEventListener('keydown', onKey);\n return () => window.removeEventListener('keydown', onKey);\n }, [previewGen, refineGen]);\n\n // Handlers\n const handleGenerate = useCallback(async () => {\n if (!promptText.trim() || isGenerating) return;\n if (promptText.length > 2000) {\n setMutationError(t('bigconsole.insights.error.promptTooLong', 'Prompt is too long (max 2000 characters).'));\n return;\n }\n setMutationError(null);\n setIsGenerating(true);\n try {\n emitBigConsoleEvent('bigconsole.ai.generate_clicked', { maxWidgets: 8 });\n const result = await generateDashboard({\n variables: {\n input: {\n prompt: promptText.trim(),\n styleType: 'MODERN',\n layoutType: 'GRID',\n maxWidgets: 8,\n },\n },\n });\n if (reportBigConsoleQuotaError(result, 'command')) {\n return;\n }\n const generationId = result.data?.generateDashboardFromPrompt?.id;\n if (generationId) {\n emitBigConsoleEvent('bigconsole.ai.dashboard_generated', {\n generationId,\n maxWidgets: 8,\n });\n }\n setPromptText('');\n refetchGenerations();\n } catch (err) {\n if (reportBigConsoleQuotaError(err, 'command')) {\n return;\n }\n setMutationError(\n err instanceof Error\n ? err.message\n : t('bigconsole.insights.error.generateFailed', 'Failed to generate dashboard')\n );\n } finally {\n setIsGenerating(false);\n }\n }, [emitBigConsoleEvent, promptText, isGenerating, generateDashboard, refetchGenerations, t]);\n\n const handleCreateDashboard = useCallback(\n async (generationId: string) => {\n setMutationError(null);\n try {\n emitBigConsoleEvent('bigconsole.ai.create_dashboard_clicked', { generationId });\n const result = await createFromGeneration({\n variables: { input: { generationId } },\n });\n if (reportBigConsoleQuotaError(result, 'project')) {\n return;\n }\n const dashboardId = result.data?.createDashboardFromGeneration?.id;\n if (dashboardId) {\n emitBigConsoleEvent('bigconsole.ai.dashboard_created', {\n generationId,\n dashboardId,\n });\n navigate(`/dashboards/${dashboardId}`);\n }\n } catch (err) {\n if (reportBigConsoleQuotaError(err, 'project')) {\n return;\n }\n setMutationError(\n err instanceof Error ? err.message : t('bigconsole.insights.error.createFailed', 'Failed to create dashboard')\n );\n }\n },\n [createFromGeneration, emitBigConsoleEvent, navigate, t]\n );\n\n const handleDelete = useCallback(\n async (generationId: string) => {\n setMutationError(null);\n try {\n await deleteGeneration({ variables: { generationId } });\n if (isNative()) void nativeNotify('success');\n refetchGenerations();\n } catch (err) {\n setMutationError(\n err instanceof Error\n ? err.message\n : t('bigconsole.insights.error.deleteFailed', 'Failed to delete generation')\n );\n if (isNative()) void nativeNotify('error');\n }\n },\n [deleteGeneration, refetchGenerations, t]\n );\n\n // Cancel an in-flight (PENDING/PROCESSING/GENERATING) generation.\n const handleCancel = useCallback(\n async (generationId: string) => {\n setMutationError(null);\n markBusy(generationId);\n try {\n await cancelGeneration({ variables: { generationId } });\n refetchGenerations();\n } catch (err) {\n setMutationError(\n err instanceof Error\n ? err.message\n : t('bigconsole.insights.error.cancelFailed', 'Failed to cancel generation')\n );\n } finally {\n clearBusy(generationId);\n }\n },\n [cancelGeneration, refetchGenerations, t]\n );\n\n // Regenerate from an existing generation, reusing its original prompt.\n const handleRegenerate = useCallback(\n async (generationId: string) => {\n setMutationError(null);\n markBusy(generationId);\n try {\n const result = await regenerateDashboard({ variables: { input: { generationId } } });\n if (reportBigConsoleQuotaError(result, 'command')) {\n return;\n }\n refetchGenerations();\n } catch (err) {\n if (reportBigConsoleQuotaError(err, 'command')) {\n return;\n }\n setMutationError(\n err instanceof Error\n ? err.message\n : t('bigconsole.insights.error.regenerateFailed', 'Failed to regenerate dashboard')\n );\n } finally {\n clearBusy(generationId);\n }\n },\n [regenerateDashboard, refetchGenerations, t]\n );\n\n // Submit refinement instructions for a completed generation.\n const handleRefineSubmit = useCallback(async () => {\n if (!refineGen || !refineText.trim()) return;\n const generationId = refineGen.id;\n setMutationError(null);\n markBusy(generationId);\n let shouldClearRefine = false;\n try {\n const result = await refineGeneration({\n variables: { input: { generationId, refinementPrompt: refineText.trim() } },\n });\n if (reportBigConsoleQuotaError(result, 'command')) {\n // The user cannot retry quota failures without changing plan, so clear the completed refinement.\n shouldClearRefine = true;\n return;\n }\n shouldClearRefine = true;\n refetchGenerations();\n } catch (err) {\n if (reportBigConsoleQuotaError(err, 'command')) {\n // Keep the retry text only for non-quota errors; quota failures need a plan change first.\n shouldClearRefine = true;\n return;\n }\n setMutationError(\n err instanceof Error ? err.message : t('bigconsole.insights.error.refineFailed', 'Failed to refine generation')\n );\n } finally {\n if (shouldClearRefine) {\n setRefineGen(null);\n setRefineText('');\n }\n clearBusy(generationId);\n }\n }, [refineGen, refineText, refineGeneration, refetchGenerations, t]);\n\n const handleSuggestionClick = useCallback((prompt: string) => {\n setPromptText(prompt);\n }, []);\n\n return (\n <div style={{ minHeight: '100vh', backgroundColor: 'var(--color-bg-canvas)' }}>\n <div style={{ padding: 'var(--space-pagePadding)', maxWidth: 960, margin: '0 auto' }}>\n {/* Header */}\n <div className=\"relative mb-[var(--space-sectionGap)] overflow-hidden rounded-card border border-border-seam bg-gloss-card p-6\">\n <AuroraBackground intensity=\"subtle\" />\n <div style={{ display: 'flex', alignItems: 'center', gap: 'var(--space-iconGap)' }}>\n <Sparkles size={24} style={{ color: 'var(--color-action-primary-bg)' }} />\n <h1\n style={{\n fontSize: 'var(--font-size-heading-h4)',\n fontWeight: 'var(--font-weight-bold)',\n color: 'var(--color-text-primary)',\n }}\n >\n <GradientText>{t('bigconsole.insights.header.title', 'AI Insights')}</GradientText>\n </h1>\n </div>\n <p style={{ fontSize: 'var(--font-size-body-md)', color: 'var(--color-text-secondary)', marginTop: 4 }}>\n {t('bigconsole.insights.header.subtitle', 'Generate dashboards from natural language prompts')}\n </p>\n </div>\n\n {/* Prompt Input — primary insight zone */}\n <EmphasisPanel className=\"mb-[var(--space-sectionGap)] p-[var(--space-cardPadding)]\">\n <label\n htmlFor=\"prompt-input\"\n style={{\n display: 'block',\n fontSize: 'var(--font-size-body-sm)',\n fontWeight: 'var(--font-weight-medium)',\n color: 'var(--color-text-primary)',\n marginBottom: 8,\n }}\n >\n {t('bigconsole.insights.prompt.label', 'Describe the dashboard you want to create')}\n </label>\n <textarea\n id=\"prompt-input\"\n value={promptText}\n onChange={(e) => setPromptText(e.target.value)}\n placeholder={t(\n 'bigconsole.insights.prompt.placeholder',\n 'e.g., Create a sales dashboard showing revenue trends, top products, and regional performance'\n )}\n rows={3}\n maxLength={2000}\n style={{\n width: '100%',\n padding: '8px 12px',\n borderRadius: 'var(--radius-button)',\n border: '1px solid var(--color-border)',\n backgroundColor: 'var(--color-bg-canvas)',\n color: 'var(--color-text-primary)',\n fontSize: 'var(--font-size-body-md)',\n resize: 'vertical',\n outline: 'none',\n }}\n onKeyDown={(e) => {\n if (e.key === 'Enter' && (e.metaKey || e.ctrlKey)) handleGenerate();\n }}\n />\n <div\n style={{\n display: 'flex',\n justifyContent: 'space-between',\n alignItems: 'center',\n marginTop: 8,\n flexWrap: 'wrap',\n gap: 8,\n }}\n >\n <span style={{ fontSize: 'var(--font-size-body-sm)', color: 'var(--color-text-muted)' }}>\n {t('bigconsole.insights.prompt.hint', 'Press Ctrl+Enter to generate')}\n </span>\n <button\n onClick={handleGenerate}\n disabled={!promptText.trim() || isGenerating}\n style={{\n display: 'flex',\n alignItems: 'center',\n gap: 8,\n padding: '8px 16px',\n borderRadius: 'var(--radius-button)',\n backgroundColor: 'var(--color-action-primary-bg)',\n color: 'var(--color-action-primary-text)',\n fontWeight: 'var(--font-weight-medium)',\n fontSize: 'var(--font-size-body-sm)',\n border: 'none',\n cursor: !promptText.trim() || isGenerating ? 'not-allowed' : 'pointer',\n opacity: !promptText.trim() || isGenerating ? 0.5 : 1,\n }}\n >\n {isGenerating ? <Loader2 size={16} className=\"animate-spin\" /> : <Sparkles size={16} />}\n {t('bigconsole.insights.prompt.generateButton', 'Generate Dashboard')}\n </button>\n </div>\n </EmphasisPanel>\n\n {/* Mutation Error Banner */}\n {mutationError && (\n <div\n style={{\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n gap: 8,\n padding: '10px 16px',\n marginBottom: 'var(--space-sectionGap)',\n borderRadius: 'var(--radius-card)',\n border: '1px solid var(--color-status-error-text)',\n backgroundColor: 'var(--color-bg-surface)',\n color: 'var(--color-status-error-text)',\n fontSize: 'var(--font-size-body-sm)',\n }}\n >\n <div style={{ display: 'flex', alignItems: 'center', gap: 8 }}>\n <AlertCircle size={16} />\n {mutationError}\n </div>\n <button\n onClick={() => setMutationError(null)}\n style={{\n background: 'none',\n border: 'none',\n color: 'var(--color-status-error-text)',\n cursor: 'pointer',\n fontSize: 'var(--font-size-body-md)',\n padding: '0 4px',\n }}\n aria-label={t('bigconsole.insights.error.dismiss', 'Dismiss error')}\n >\n &times;\n </button>\n </div>\n )}\n\n {/* Suggestions */}\n {suggestions.length > 0 && (\n <div style={{ marginBottom: 'var(--space-sectionGap)' }}>\n <h2\n style={{\n fontSize: 'var(--font-size-body-md)',\n fontWeight: 'var(--font-weight-semibold)',\n color: 'var(--color-text-primary)',\n marginBottom: 12,\n }}\n >\n {t('bigconsole.insights.suggestions.heading', 'Suggestions')}\n </h2>\n <div\n style={{\n display: 'grid',\n gridTemplateColumns: 'repeat(auto-fill, minmax(min(280px, 100%), 1fr))',\n gap: 12,\n }}\n >\n {suggestions.map((s) => (\n <button\n key={s.id}\n onClick={() => handleSuggestionClick(s.prompt)}\n style={{\n textAlign: 'left',\n padding: 12,\n borderRadius: 'var(--radius-card)',\n border: '1px solid var(--color-border)',\n backgroundColor: 'var(--color-bg-surface)',\n cursor: 'pointer',\n }}\n >\n <div\n style={{\n fontWeight: 'var(--font-weight-medium)',\n fontSize: 'var(--font-size-body-sm)',\n color: 'var(--color-text-primary)',\n marginBottom: 4,\n }}\n >\n {s.title}\n </div>\n <div\n style={{\n fontSize: 'var(--font-size-body-sm)',\n color: 'var(--color-text-secondary)',\n lineHeight: 1.4,\n }}\n >\n {s.exampleDescription || s.prompt.slice(0, 80)}\n </div>\n <div style={{ display: 'flex', gap: 4, marginTop: 8, flexWrap: 'wrap' }}>\n {s.tags.slice(0, 3).map((tag) => (\n <span\n key={tag}\n style={{\n fontSize: 11,\n padding: '2px 6px',\n borderRadius: 4,\n backgroundColor: 'var(--color-bg-sunken)',\n color: 'var(--color-text-muted)',\n }}\n >\n {tag}\n </span>\n ))}\n </div>\n </button>\n ))}\n </div>\n </div>\n )}\n\n {/* Generations History */}\n <div>\n <h2\n style={{\n fontSize: 'var(--font-size-body-md)',\n fontWeight: 'var(--font-weight-semibold)',\n color: 'var(--color-text-primary)',\n marginBottom: 12,\n }}\n >\n {t('bigconsole.insights.generations.heading', 'Recent Generations')}\n </h2>\n\n {generationsLoading && generations.length === 0 ? (\n <div style={{ textAlign: 'center', padding: 40, color: 'var(--color-text-muted)' }}>\n <Loader2 size={24} className=\"animate-spin\" style={{ margin: '0 auto 8px' }} />\n <p>{t('bigconsole.insights.generations.loading', 'Loading generations...')}</p>\n </div>\n ) : generations.length === 0 && !isGenerating ? (\n <GlassCard treatment=\"insight\" className=\"border-border-seam\">\n <IllustratedEmptyState\n illustration=\"onboarding\"\n title={t('bigconsole.insights.generations.emptyTitle', 'No generations yet')}\n description={t(\n 'bigconsole.insights.generations.emptyDescription',\n 'Describe a dashboard above to get started'\n )}\n />\n </GlassCard>\n ) : (\n <div style={{ display: 'flex', flexDirection: 'column', gap: 12 }}>\n {/* Transient placeholder while the generate request is in flight and\n the backend has not yet returned the new PENDING generation. */}\n {isGenerating && !hasActiveGenerations && (\n <div\n style={{\n padding: 16,\n borderRadius: 'var(--radius-card)',\n border: '1px solid var(--color-border)',\n backgroundColor: 'var(--color-bg-surface)',\n }}\n >\n <div style={{ display: 'flex', alignItems: 'center', gap: 8, minWidth: 0 }}>\n {getStatusIcon('PROCESSING')}\n <span\n style={{\n fontSize: 'var(--font-size-body-sm)',\n fontWeight: 'var(--font-weight-medium)',\n color: 'var(--color-text-primary)',\n }}\n >\n {t('bigconsole.insights.generations.generating', 'Generating...')}\n </span>\n <span\n style={{\n fontSize: 11,\n color: 'var(--color-text-muted)',\n padding: '2px 6px',\n borderRadius: 4,\n backgroundColor: 'var(--color-bg-sunken)',\n }}\n >\n {getStatusLabel('PROCESSING', t)}\n </span>\n </div>\n </div>\n )}\n {generations.map((gen) => (\n <div\n key={gen.id}\n style={{\n padding: 16,\n borderRadius: 'var(--radius-card)',\n border: '1px solid var(--color-border)',\n backgroundColor: 'var(--color-bg-surface)',\n }}\n >\n <div\n style={{\n display: 'flex',\n justifyContent: 'space-between',\n alignItems: 'flex-start',\n flexWrap: 'wrap',\n gap: 8,\n }}\n >\n <div style={{ flex: '1 1 200px', minWidth: 0 }}>\n <div style={{ display: 'flex', alignItems: 'center', gap: 8, marginBottom: 4, minWidth: 0 }}>\n {getStatusIcon(gen.status)}\n <span\n style={{\n fontSize: 'var(--font-size-body-sm)',\n fontWeight: 'var(--font-weight-medium)',\n color: 'var(--color-text-primary)',\n minWidth: 0,\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n whiteSpace: 'nowrap',\n }}\n >\n {gen.generatedSpec?.name || t('bigconsole.insights.generations.generating', 'Generating...')}\n </span>\n <span\n style={{\n fontSize: 11,\n color: 'var(--color-text-muted)',\n padding: '2px 6px',\n borderRadius: 4,\n backgroundColor: 'var(--color-bg-sunken)',\n }}\n >\n {getStatusLabel(gen.status, t)}\n </span>\n </div>\n <p\n style={{\n fontSize: 'var(--font-size-body-sm)',\n color: 'var(--color-text-secondary)',\n marginBottom: 4,\n }}\n >\n {gen.prompt.length > 120 ? gen.prompt.slice(0, 120) + '...' : gen.prompt}\n </p>\n {gen.generatedSpec && (\n <div style={{ fontSize: 11, color: 'var(--color-text-muted)' }}>\n {t(\n 'bigconsole.insights.generations.summary',\n '{{widgets}} widgets across {{pages}} page(s) · {{confidence}}% confidence',\n {\n widgets: gen.generatedSpec.pages.reduce((acc, p) => acc + p.widgets.length, 0),\n pages: gen.generatedSpec.pages.length,\n confidence: Math.round(gen.generatedSpec.overallConfidence * 100),\n }\n )}\n </div>\n )}\n {gen.errorMessage && (\n <div\n style={{\n display: 'flex',\n alignItems: 'center',\n gap: 4,\n marginTop: 4,\n fontSize: 'var(--font-size-body-sm)',\n color: 'var(--color-status-error-text)',\n }}\n >\n <AlertCircle size={14} />\n {gen.errorMessage}\n </div>\n )}\n </div>\n <div style={{ display: 'flex', gap: 8, flexWrap: 'wrap' }}>\n {NON_TERMINAL_STATUSES.includes(gen.status) && (\n <button\n onClick={() => {\n nativeImpact('medium');\n void handleCancel(gen.id);\n }}\n disabled={busyIds.has(gen.id)}\n title={t('bigconsole.insights.actions.cancelTitle', 'Cancel generation')}\n style={{\n display: 'flex',\n alignItems: 'center',\n gap: 4,\n padding: '6px 12px',\n borderRadius: 'var(--radius-button)',\n border: '1px solid var(--color-border)',\n backgroundColor: 'transparent',\n color: 'var(--color-status-warning-text)',\n fontSize: 'var(--font-size-body-sm)',\n cursor: busyIds.has(gen.id) ? 'wait' : 'pointer',\n }}\n >\n <Ban size={14} /> {t('bigconsole.insights.actions.cancel', 'Cancel')}\n </button>\n )}\n {gen.status === 'COMPLETED' && gen.generatedSpec && (\n <button\n onClick={() => setPreviewGen(gen)}\n title={t('bigconsole.insights.actions.previewTitle', 'Preview proposed layout')}\n style={{\n display: 'flex',\n alignItems: 'center',\n gap: 4,\n padding: '6px 12px',\n borderRadius: 'var(--radius-button)',\n border: '1px solid var(--color-border)',\n backgroundColor: 'transparent',\n color: 'var(--color-text-primary)',\n fontSize: 'var(--font-size-body-sm)',\n cursor: 'pointer',\n }}\n >\n <Eye size={14} /> {t('bigconsole.insights.actions.preview', 'Preview')}\n </button>\n )}\n {gen.status === 'COMPLETED' && gen.generatedSpec && (\n <button\n onClick={() => {\n setRefineGen(gen);\n setRefineText('');\n }}\n title={t('bigconsole.insights.actions.refineTitle', 'Refine with instructions')}\n style={{\n display: 'flex',\n alignItems: 'center',\n gap: 4,\n padding: '6px 12px',\n borderRadius: 'var(--radius-button)',\n border: '1px solid var(--color-border)',\n backgroundColor: 'transparent',\n color: 'var(--color-text-primary)',\n fontSize: 'var(--font-size-body-sm)',\n cursor: 'pointer',\n }}\n >\n <Wand2 size={14} /> {t('bigconsole.insights.actions.refine', 'Refine')}\n </button>\n )}\n {(gen.status === 'COMPLETED' || gen.status === 'FAILED' || gen.status === 'CANCELLED') && (\n <button\n onClick={() => {\n nativeImpact('medium');\n void handleRegenerate(gen.id);\n }}\n disabled={busyIds.has(gen.id)}\n title={t('bigconsole.insights.actions.regenerateTitle', 'Regenerate with the same prompt')}\n style={{\n display: 'flex',\n alignItems: 'center',\n gap: 4,\n padding: '6px 12px',\n borderRadius: 'var(--radius-button)',\n border: '1px solid var(--color-border)',\n backgroundColor: 'transparent',\n color: 'var(--color-text-primary)',\n fontSize: 'var(--font-size-body-sm)',\n cursor: busyIds.has(gen.id) ? 'wait' : 'pointer',\n }}\n >\n <RefreshCw size={14} className={busyIds.has(gen.id) ? 'animate-spin' : ''} />{' '}\n {t('bigconsole.insights.actions.regenerate', 'Regenerate')}\n </button>\n )}\n {gen.status === 'COMPLETED' && !gen.dashboardId && (\n <button\n onClick={() => handleCreateDashboard(gen.id)}\n style={{\n display: 'flex',\n alignItems: 'center',\n gap: 4,\n padding: '6px 12px',\n borderRadius: 'var(--radius-button)',\n backgroundColor: 'var(--color-action-primary-bg)',\n color: 'var(--color-action-primary-text)',\n border: 'none',\n fontSize: 'var(--font-size-body-sm)',\n cursor: 'pointer',\n }}\n >\n {t('bigconsole.insights.actions.create', 'Create')} <ArrowRight size={14} />\n </button>\n )}\n {gen.dashboardId && (\n <button\n onClick={() => navigate(`/dashboards/${gen.dashboardId}`)}\n style={{\n display: 'flex',\n alignItems: 'center',\n gap: 4,\n padding: '6px 12px',\n borderRadius: 'var(--radius-button)',\n border: '1px solid var(--color-border)',\n backgroundColor: 'transparent',\n color: 'var(--color-text-primary)',\n fontSize: 'var(--font-size-body-sm)',\n cursor: 'pointer',\n }}\n >\n {t('bigconsole.insights.actions.viewDashboard', 'View Dashboard')} <ArrowRight size={14} />\n </button>\n )}\n <button\n onClick={() => {\n nativeImpact('medium');\n void handleDelete(gen.id);\n }}\n title={t('bigconsole.insights.actions.deleteTitle', 'Delete generation')}\n style={{\n display: 'flex',\n alignItems: 'center',\n padding: 6,\n borderRadius: 'var(--radius-button)',\n border: '1px solid var(--color-border)',\n backgroundColor: 'transparent',\n color: 'var(--color-text-muted)',\n cursor: 'pointer',\n }}\n >\n <Trash2 size={14} />\n </button>\n </div>\n </div>\n </div>\n ))}\n </div>\n )}\n </div>\n </div>\n\n {/* Preview modal — shows the AI-proposed page/widget structure before creation */}\n {previewGen?.generatedSpec && (\n <div\n role=\"dialog\"\n aria-modal=\"true\"\n aria-label={t('bigconsole.insights.preview.ariaLabel', 'Generation preview')}\n onClick={() => setPreviewGen(null)}\n style={{\n position: 'fixed',\n inset: 0,\n zIndex: 1000,\n backgroundColor: 'var(--color-overlay-scrim)',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n padding: 'var(--space-pagePadding)',\n }}\n >\n <div\n onClick={(e) => e.stopPropagation()}\n style={{\n width: 'min(640px, 100%)',\n maxHeight: '80vh',\n overflowY: 'auto',\n backgroundColor: 'var(--color-bg-surface)',\n borderRadius: 'var(--radius-card)',\n border: '1px solid var(--color-border)',\n boxShadow: 'var(--shadow-elevation-3)',\n padding: 'var(--space-cardPadding)',\n }}\n >\n <div\n style={{\n display: 'flex',\n justifyContent: 'space-between',\n alignItems: 'flex-start',\n gap: 8,\n marginBottom: 'var(--space-controlGap)',\n }}\n >\n <div style={{ minWidth: 0 }}>\n <h3\n style={{\n fontSize: 'var(--font-size-heading-h4)',\n fontWeight: 'var(--font-weight-semibold)',\n }}\n >\n {previewGen.generatedSpec.name}\n </h3>\n {previewGen.generatedSpec.description && (\n <p\n style={{\n fontSize: 'var(--font-size-body-sm)',\n color: 'var(--color-text-muted)',\n marginTop: 2,\n }}\n >\n {previewGen.generatedSpec.description}\n </p>\n )}\n </div>\n <button\n onClick={() => setPreviewGen(null)}\n aria-label={t('bigconsole.insights.preview.close', 'Close preview')}\n style={{\n display: 'flex',\n padding: 4,\n borderRadius: 'var(--radius-button)',\n border: 'none',\n backgroundColor: 'transparent',\n color: 'var(--color-text-muted)',\n cursor: 'pointer',\n }}\n >\n <X size={18} />\n </button>\n </div>\n <div\n style={{\n fontSize: 11,\n color: 'var(--color-text-muted)',\n marginBottom: 'var(--space-controlGap)',\n }}\n >\n {t(\n 'bigconsole.insights.generations.summary',\n '{{widgets}} widgets across {{pages}} page(s) · {{confidence}}% confidence',\n {\n widgets: previewGen.generatedSpec.pages.reduce((acc, p) => acc + p.widgets.length, 0),\n pages: previewGen.generatedSpec.pages.length,\n confidence: Math.round(previewGen.generatedSpec.overallConfidence * 100),\n }\n )}\n </div>\n {previewGen.generatedSpec.pages.map((page, pi) => (\n <div key={pi} style={{ marginBottom: 'var(--space-controlGap)' }}>\n <div\n style={{\n fontSize: 'var(--font-size-body-sm)',\n fontWeight: 'var(--font-weight-medium)',\n color: 'var(--color-text-primary)',\n marginBottom: 4,\n }}\n >\n {page.name}\n </div>\n <div style={{ display: 'flex', flexWrap: 'wrap', gap: 6 }}>\n {page.widgets.map((w, wi) => (\n <span\n key={wi}\n style={{\n fontSize: 11,\n padding: '3px 8px',\n borderRadius: 'var(--radius-pill)',\n backgroundColor: 'var(--color-bg-sunken)',\n color: 'var(--color-text-secondary)',\n }}\n >\n {w.title} · {w.type}\n </span>\n ))}\n </div>\n </div>\n ))}\n </div>\n </div>\n )}\n\n {/* Refine modal — collects refinement instructions for refineGeneratedDashboard */}\n {refineGen && (\n <div\n role=\"dialog\"\n aria-modal=\"true\"\n aria-label={t('bigconsole.insights.refine.ariaLabel', 'Refine generation')}\n onClick={() => setRefineGen(null)}\n style={{\n position: 'fixed',\n inset: 0,\n zIndex: 1000,\n backgroundColor: 'var(--color-overlay-scrim)',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n padding: 'var(--space-pagePadding)',\n }}\n >\n <div\n onClick={(e) => e.stopPropagation()}\n style={{\n width: 'min(520px, 100%)',\n backgroundColor: 'var(--color-bg-surface)',\n borderRadius: 'var(--radius-card)',\n border: '1px solid var(--color-border)',\n boxShadow: 'var(--shadow-elevation-3)',\n padding: 'var(--space-cardPadding)',\n }}\n >\n <h3\n style={{\n fontSize: 'var(--font-size-heading-h4)',\n fontWeight: 'var(--font-weight-semibold)',\n marginBottom: 4,\n }}\n >\n {t('bigconsole.insights.refine.heading', 'Refine dashboard')}\n </h3>\n <p\n style={{\n fontSize: 'var(--font-size-body-sm)',\n color: 'var(--color-text-muted)',\n marginBottom: 'var(--space-controlGap)',\n }}\n >\n {t(\n 'bigconsole.insights.refine.subtitle',\n 'Describe what to change — the AI keeps the existing spec and applies your instructions.'\n )}\n </p>\n <textarea\n value={refineText}\n onChange={(e) => setRefineText(e.target.value)}\n maxLength={2000}\n rows={4}\n placeholder={t(\n 'bigconsole.insights.refine.placeholder',\n 'e.g., Add a revenue-by-region map and remove the duplicate KPI cards'\n )}\n style={{\n width: '100%',\n resize: 'vertical',\n padding: 'var(--space-inputPadding, 8px)',\n borderRadius: 'var(--radius-input)',\n border: '1px solid var(--color-border)',\n backgroundColor: 'var(--color-bg-canvas)',\n color: 'var(--color-text-primary)',\n fontSize: 'var(--font-size-body-sm)',\n marginBottom: 'var(--space-controlGap)',\n }}\n />\n <div style={{ display: 'flex', justifyContent: 'flex-end', gap: 8, flexWrap: 'wrap' }}>\n <button\n onClick={() => setRefineGen(null)}\n style={{\n padding: '8px 16px',\n borderRadius: 'var(--radius-button)',\n border: '1px solid var(--color-border)',\n backgroundColor: 'transparent',\n color: 'var(--color-text-primary)',\n fontSize: 'var(--font-size-body-sm)',\n cursor: 'pointer',\n }}\n >\n {t('bigconsole.insights.actions.cancel', 'Cancel')}\n </button>\n <button\n onClick={() => void handleRefineSubmit()}\n disabled={!refineText.trim() || busyIds.has(refineGen.id)}\n style={{\n display: 'flex',\n alignItems: 'center',\n gap: 6,\n padding: '8px 16px',\n borderRadius: 'var(--radius-button)',\n border: 'none',\n backgroundColor: 'var(--color-action-primary-bg)',\n color: 'var(--color-action-primary-text)',\n fontSize: 'var(--font-size-body-sm)',\n cursor: !refineText.trim() || busyIds.has(refineGen.id) ? 'not-allowed' : 'pointer',\n opacity: !refineText.trim() ? 0.6 : 1,\n }}\n >\n {busyIds.has(refineGen.id) ? <Loader2 size={14} className=\"animate-spin\" /> : <Wand2 size={14} />}\n {t('bigconsole.insights.refine.apply', 'Apply refinement')}\n </button>\n </div>\n </div>\n </div>\n )}\n </div>\n );\n});\n\nexport default InsightsPage;\n"],"mappings":"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"}
1
+ {"version":3,"file":"InsightsPage.js","names":[],"sources":["../../../src/bigconsole/pages/InsightsPage.tsx"],"sourcesContent":["/**\n * InsightsPage\n *\n * AI-powered dashboard generation using the Prompt module backend.\n * Users enter a natural language prompt to generate dashboards with\n * suggested widgets, layouts, and configurations.\n *\n * Section emphasis (BOFF-5639): the screen reads as one ladder —\n * header band (structural)\n * → \"Describe your dashboard\" (PRIMARY: the reason the route exists)\n * → \"Starting points\" (MUTED: optional shortcuts, must not compete)\n * → \"Recent generations\" (BARE region of STANDARD result cards)\n * Status now travels through `Section tone` and a single tone-coded badge\n * instead of four unrelated hand-rolled error treatments.\n */\n\nimport { type CSSProperties, type FC, memo, useState, useCallback, useEffect } from 'react';\nimport { gql } from '@apollo/client';\nimport { useMutation, useQuery } from '@apollo/client/react';\nimport { AuroraBackground, GradientText, GlassCard, IllustratedEmptyState, PagePurpose } from '@burdenoff/fe-libs/ui';\nimport { useI18n } from '@burdenoff/fe-libs/shared/providers/shell/I18nProvider';\nimport { useAppNavigate } from '../contexts';\nimport { useBigConsoleAnalytics } from '../hooks/useBigConsoleAnalytics';\nimport { reportBigConsoleQuotaError } from '../utils/quota';\nimport { isNative, nativeImpact, nativeNotify } from '../../utils/nativeBridge';\nimport { Section, SectionStack, SECTION_FOCUS_RING } from '../components/common';\nimport {\n Sparkles,\n Loader2,\n Trash2,\n ArrowRight,\n Clock,\n CheckCircle,\n XCircle,\n AlertCircle,\n RefreshCw,\n Eye,\n Ban,\n Wand2,\n X,\n Lightbulb,\n History,\n} from 'lucide-react';\n\n// ============================================================================\n// GRAPHQL OPERATIONS (inline until codegen is configured for prompt module)\n// TODO(BOFF-2055): Replace inline gql with codegen-generated hooks\n// ============================================================================\n\nconst LIST_PROMPT_GENERATIONS = gql`\n query ListPromptGenerations($status: PromptGenerationStatus, $first: Int) {\n listPromptGenerations(status: $status, first: $first) {\n edges {\n node {\n id\n prompt\n status\n dashboardId\n errorMessage\n createdAt\n completedAt\n generatedSpec {\n name\n description\n overallConfidence\n pages {\n name\n widgets {\n title\n type\n }\n }\n }\n }\n }\n totalCount\n }\n }\n`;\n\nconst GET_PROMPT_SUGGESTIONS = gql`\n query GetPromptSuggestions($category: String, $limit: Int) {\n getPromptSuggestions(category: $category, limit: $limit) {\n id\n category\n title\n prompt\n exampleDescription\n tags\n }\n }\n`;\n\nconst GENERATE_DASHBOARD = gql`\n mutation GenerateDashboardFromPrompt($input: GenerateDashboardFromPromptInput!) {\n generateDashboardFromPrompt(input: $input) {\n id\n status\n prompt\n }\n }\n`;\n\nconst CREATE_FROM_GENERATION = gql`\n mutation CreateDashboardFromGeneration($input: CreateDashboardFromGenerationInput!) {\n createDashboardFromGeneration(input: $input) {\n id\n }\n }\n`;\n\nconst DELETE_GENERATION = gql`\n mutation DeletePromptGeneration($generationId: ID!) {\n deletePromptGeneration(generationId: $generationId)\n }\n`;\n\nconst CANCEL_GENERATION = gql`\n mutation CancelPromptGeneration($generationId: ID!) {\n cancelPromptGeneration(generationId: $generationId) {\n id\n status\n }\n }\n`;\n\nconst REGENERATE_DASHBOARD = gql`\n mutation RegenerateDashboard($input: RegenerateDashboardInput!) {\n regenerateDashboard(input: $input) {\n id\n status\n prompt\n }\n }\n`;\n\nconst REFINE_GENERATION = gql`\n mutation RefineGeneratedDashboard($input: RefineGeneratedDashboardInput!) {\n refineGeneratedDashboard(input: $input) {\n id\n status\n prompt\n }\n }\n`;\n\n// ============================================================================\n// TYPES\n// ============================================================================\n\ninterface ListPromptGenerationsData {\n listPromptGenerations: {\n edges: Array<{ node: PromptGeneration }>;\n totalCount: number;\n };\n}\n\ninterface GetPromptSuggestionsData {\n getPromptSuggestions: PromptSuggestion[];\n}\n\ninterface GenerateDashboardData {\n generateDashboardFromPrompt: {\n id: string;\n status: string;\n prompt: string;\n };\n}\n\ninterface CreateFromGenerationData {\n createDashboardFromGeneration: {\n id: string;\n };\n}\n\nconst NON_TERMINAL_STATUSES = ['PENDING', 'PROCESSING', 'GENERATING'];\n\ninterface PromptSuggestion {\n id: string;\n category: string;\n title: string;\n prompt: string;\n exampleDescription?: string;\n tags: string[];\n}\n\ninterface PromptGeneration {\n id: string;\n prompt: string;\n status: string;\n dashboardId?: string;\n errorMessage?: string;\n createdAt: string;\n completedAt?: string;\n generatedSpec?: {\n name: string;\n description?: string;\n overallConfidence: number;\n pages: Array<{\n name: string;\n widgets: Array<{ title: string; type: string }>;\n }>;\n };\n}\n\n// ============================================================================\n// SHARED CONTROL STYLES\n//\n// Every action on this page used to repeat a ~12-line inline style object, and\n// none of them reserved a touch target. One base object keeps the cluster\n// consistent and guarantees `--size-controlHeight-md` (40px) on every button.\n//\n// Borders read `--color-border-default`, never `--color-border`: the latter has\n// no per-theme definition in this shell (only the frozen light `#D1D5DB` in the\n// app-shell `@theme`), so it kept a light-grey outline on every control in dark\n// mode. `--color-border-default` carries the same light value AND a dark one.\n// ============================================================================\n\nconst ACTION_BASE: CSSProperties = {\n display: 'inline-flex',\n alignItems: 'center',\n justifyContent: 'center',\n gap: 'var(--space-iconGap)',\n minHeight: 'var(--size-controlHeight-md)',\n padding: '0 var(--space-formGap)',\n borderRadius: 'var(--radius-button)',\n fontSize: 'var(--font-size-body-sm)',\n fontWeight: 'var(--font-weight-medium)',\n lineHeight: 1.2,\n cursor: 'pointer',\n};\n\nconst NEUTRAL_ACTION: CSSProperties = {\n ...ACTION_BASE,\n border: '1px solid var(--color-border-default)',\n backgroundColor: 'transparent',\n color: 'var(--color-text-primary)',\n};\n\nconst PRIMARY_ACTION: CSSProperties = {\n ...ACTION_BASE,\n border: '1px solid transparent',\n backgroundColor: 'var(--color-action-primary-bg)',\n color: 'var(--color-action-primary-text)',\n};\n\nconst WARNING_ACTION: CSSProperties = {\n ...ACTION_BASE,\n border: '1px solid var(--color-status-warning-border)',\n backgroundColor: 'transparent',\n color: 'var(--color-status-warning-text)',\n};\n\nconst DANGER_ICON_ACTION: CSSProperties = {\n ...ACTION_BASE,\n minWidth: 'var(--size-controlHeight-md)',\n padding: '0 var(--space-controlGap)',\n border: '1px solid var(--color-border-default)',\n backgroundColor: 'transparent',\n color: 'var(--color-status-error-text)',\n};\n\nconst CHIP_BASE: CSSProperties = {\n display: 'inline-flex',\n alignItems: 'center',\n gap: 'var(--space-iconGap)',\n padding: '2px var(--space-controlGap)',\n borderRadius: 'var(--radius-pill)',\n fontSize: 'var(--font-size-body-sm)',\n fontWeight: 'var(--font-weight-medium)',\n border: '1px solid var(--color-border-subtle)',\n backgroundColor: 'var(--color-bg-sunken)',\n color: 'var(--color-text-secondary)',\n};\n\n// ============================================================================\n// STATUS HELPERS\n// ============================================================================\n\ntype StatusTone = 'success' | 'danger' | 'info' | 'neutral';\n\n/**\n * Status was previously drawn with raw Tailwind palette colours\n * (`text-green-500`, `text-red-500`, …), which ignore the theme entirely. Every\n * status now resolves to a semantic token so a FAILED card is unmistakably red\n * in light, dark and high-contrast themes.\n */\nfunction getStatusTone(status: string): StatusTone {\n switch (status) {\n case 'COMPLETED':\n return 'success';\n case 'FAILED':\n return 'danger';\n case 'PENDING':\n case 'PROCESSING':\n case 'GENERATING':\n return 'info';\n default:\n return 'neutral';\n }\n}\n\nconst STATUS_TONE_COLOR: Record<StatusTone, { text: string; bg: string; border: string }> = {\n success: {\n text: 'var(--color-status-success-text)',\n bg: 'var(--color-status-success-bgSubtle)',\n border: 'var(--color-status-success-border)',\n },\n danger: {\n text: 'var(--color-status-error-text)',\n bg: 'var(--color-status-error-bgSubtle)',\n border: 'var(--color-status-error-border)',\n },\n info: {\n text: 'var(--color-status-info-text)',\n bg: 'var(--color-status-info-bgSubtle)',\n border: 'var(--color-status-info-border)',\n },\n neutral: {\n text: 'var(--color-text-secondary)',\n bg: 'var(--color-bg-sunken)',\n border: 'var(--color-border-subtle)',\n },\n};\n\nfunction getStatusIcon(status: string) {\n const color = STATUS_TONE_COLOR[getStatusTone(status)].text;\n switch (status) {\n case 'COMPLETED':\n return <CheckCircle size={14} style={{ color }} aria-hidden=\"true\" />;\n case 'FAILED':\n case 'CANCELLED':\n return <XCircle size={14} style={{ color }} aria-hidden=\"true\" />;\n case 'PENDING':\n case 'PROCESSING':\n case 'GENERATING':\n return <Loader2 size={14} className=\"animate-spin\" style={{ color }} aria-hidden=\"true\" />;\n default:\n return <Clock size={14} style={{ color }} aria-hidden=\"true\" />;\n }\n}\n\nfunction getStatusLabel(status: string, t: (key: string, fallback: string) => string) {\n switch (status) {\n case 'COMPLETED':\n return t('bigconsole.insights.status.completed', 'Completed');\n case 'FAILED':\n return t('bigconsole.insights.status.failed', 'Failed');\n case 'CANCELLED':\n return t('bigconsole.insights.status.cancelled', 'Cancelled');\n case 'PENDING':\n return t('bigconsole.insights.status.pending', 'Pending');\n case 'PROCESSING':\n return t('bigconsole.insights.status.processing', 'Processing');\n case 'GENERATING':\n return t('bigconsole.insights.status.generating', 'Generating');\n default:\n return status;\n }\n}\n\n/** One tone-coded chip carrying icon + label, so status is legible at a glance. */\nconst StatusBadge: FC<{ status: string }> = ({ status }) => {\n const { t } = useI18n();\n const palette = STATUS_TONE_COLOR[getStatusTone(status)];\n return (\n <span\n data-status={status}\n style={{\n ...CHIP_BASE,\n border: `1px solid ${palette.border}`,\n backgroundColor: palette.bg,\n color: palette.text,\n }}\n >\n {getStatusIcon(status)}\n {getStatusLabel(status, t)}\n </span>\n );\n};\n\n/** Confidence is the one AI-quality signal on the card — colour it, don't hide it. */\nfunction confidenceChipStyle(confidence: number): CSSProperties {\n const tone: StatusTone = confidence >= 0.8 ? 'success' : confidence >= 0.5 ? 'neutral' : 'danger';\n const palette = STATUS_TONE_COLOR[tone];\n return {\n ...CHIP_BASE,\n border: `1px solid ${palette.border}`,\n backgroundColor: palette.bg,\n color: palette.text,\n };\n}\n\nfunction countWidgets(spec: NonNullable<PromptGeneration['generatedSpec']>): number {\n return spec.pages.reduce((acc, page) => acc + page.widgets.length, 0);\n}\n\n// ============================================================================\n// COMPONENT\n// ============================================================================\n\nexport const InsightsPage: FC = memo(function InsightsPage() {\n const { t } = useI18n();\n const navigate = useAppNavigate();\n const emitBigConsoleEvent = useBigConsoleAnalytics();\n const [promptText, setPromptText] = useState('');\n const [isGenerating, setIsGenerating] = useState(false);\n const [mutationError, setMutationError] = useState<string | null>(null);\n // Track per-generation in-flight mutations independently so cancelling A\n // does not visually \"busy\" B's regenerate (and vice-versa).\n const [busyIds, setBusyIds] = useState<Set<string>>(() => new Set());\n const [previewGen, setPreviewGen] = useState<PromptGeneration | null>(null);\n const [refineGen, setRefineGen] = useState<PromptGeneration | null>(null);\n const [refineText, setRefineText] = useState('');\n\n const markBusy = useCallback((id: string) => {\n setBusyIds((prev) => new Set(prev).add(id));\n }, []);\n const clearBusy = useCallback((id: string) => {\n setBusyIds((prev) => {\n const next = new Set(prev);\n next.delete(id);\n return next;\n });\n }, []);\n\n // Fetch existing generations.\n const {\n data: generationsData,\n loading: generationsLoading,\n refetch: refetchGenerations,\n startPolling,\n stopPolling,\n } = useQuery<ListPromptGenerationsData>(LIST_PROMPT_GENERATIONS, {\n variables: { first: 20 },\n fetchPolicy: 'cache-and-network',\n });\n\n // Whether any generation is still in a non-terminal state. Derived from the\n // latest query data so polling stops automatically once everything settles.\n const hasActiveGenerations =\n generationsData?.listPromptGenerations?.edges?.some((edge) => NON_TERMINAL_STATUSES.includes(edge.node.status)) ??\n false;\n\n // Fetch suggestions\n const { data: suggestionsData } = useQuery<GetPromptSuggestionsData>(GET_PROMPT_SUGGESTIONS, {\n variables: { limit: 6 },\n });\n\n // Mutations\n const [generateDashboard] = useMutation<GenerateDashboardData>(GENERATE_DASHBOARD);\n const [createFromGeneration] = useMutation<CreateFromGenerationData>(CREATE_FROM_GENERATION);\n const [deleteGeneration] = useMutation(DELETE_GENERATION);\n const [cancelGeneration] = useMutation(CANCEL_GENERATION);\n const [regenerateDashboard] = useMutation(REGENERATE_DASHBOARD);\n const [refineGeneration] = useMutation(REFINE_GENERATION);\n\n const generations: PromptGeneration[] = generationsData?.listPromptGenerations?.edges?.map((edge) => edge.node) || [];\n const suggestions: PromptSuggestion[] = suggestionsData?.getPromptSuggestions || [];\n\n // Poll every 2s while a generation is non-terminal (or a generate request is\n // in flight) so cards advance (e.g. PROCESSING → COMPLETED) without a manual\n // refresh; polling is stopped once everything settles.\n useEffect(() => {\n if (hasActiveGenerations || isGenerating) {\n startPolling(2_000);\n } else {\n stopPolling();\n }\n return () => stopPolling();\n }, [hasActiveGenerations, isGenerating, startPolling, stopPolling]);\n\n // Close the Preview / Refine modals on Escape for keyboard accessibility.\n useEffect(() => {\n if (!previewGen && !refineGen) return;\n const onKey = (e: KeyboardEvent) => {\n if (e.key === 'Escape') {\n setPreviewGen(null);\n setRefineGen(null);\n }\n };\n window.addEventListener('keydown', onKey);\n return () => window.removeEventListener('keydown', onKey);\n }, [previewGen, refineGen]);\n\n // Handlers\n const handleGenerate = useCallback(async () => {\n if (!promptText.trim() || isGenerating) return;\n if (promptText.length > 2000) {\n setMutationError(t('bigconsole.insights.error.promptTooLong', 'Prompt is too long (max 2000 characters).'));\n return;\n }\n setMutationError(null);\n setIsGenerating(true);\n try {\n emitBigConsoleEvent('bigconsole.ai.generate_clicked', { maxWidgets: 8 });\n const result = await generateDashboard({\n variables: {\n input: {\n prompt: promptText.trim(),\n styleType: 'MODERN',\n layoutType: 'GRID',\n maxWidgets: 8,\n },\n },\n });\n if (reportBigConsoleQuotaError(result, 'command')) {\n return;\n }\n const generationId = result.data?.generateDashboardFromPrompt?.id;\n if (generationId) {\n emitBigConsoleEvent('bigconsole.ai.dashboard_generated', {\n generationId,\n maxWidgets: 8,\n });\n }\n setPromptText('');\n refetchGenerations();\n } catch (err) {\n if (reportBigConsoleQuotaError(err, 'command')) {\n return;\n }\n setMutationError(\n err instanceof Error\n ? err.message\n : t('bigconsole.insights.error.generateFailed', 'Failed to generate dashboard')\n );\n } finally {\n setIsGenerating(false);\n }\n }, [emitBigConsoleEvent, promptText, isGenerating, generateDashboard, refetchGenerations, t]);\n\n const handleCreateDashboard = useCallback(\n async (generationId: string) => {\n setMutationError(null);\n try {\n emitBigConsoleEvent('bigconsole.ai.create_dashboard_clicked', { generationId });\n const result = await createFromGeneration({\n variables: { input: { generationId } },\n });\n if (reportBigConsoleQuotaError(result, 'project')) {\n return;\n }\n const dashboardId = result.data?.createDashboardFromGeneration?.id;\n if (dashboardId) {\n emitBigConsoleEvent('bigconsole.ai.dashboard_created', {\n generationId,\n dashboardId,\n });\n navigate(`/dashboards/${dashboardId}`);\n }\n } catch (err) {\n if (reportBigConsoleQuotaError(err, 'project')) {\n return;\n }\n setMutationError(\n err instanceof Error ? err.message : t('bigconsole.insights.error.createFailed', 'Failed to create dashboard')\n );\n }\n },\n [createFromGeneration, emitBigConsoleEvent, navigate, t]\n );\n\n const handleDelete = useCallback(\n async (generationId: string) => {\n setMutationError(null);\n try {\n await deleteGeneration({ variables: { generationId } });\n if (isNative()) void nativeNotify('success');\n refetchGenerations();\n } catch (err) {\n setMutationError(\n err instanceof Error\n ? err.message\n : t('bigconsole.insights.error.deleteFailed', 'Failed to delete generation')\n );\n if (isNative()) void nativeNotify('error');\n }\n },\n [deleteGeneration, refetchGenerations, t]\n );\n\n // Cancel an in-flight (PENDING/PROCESSING/GENERATING) generation.\n const handleCancel = useCallback(\n async (generationId: string) => {\n setMutationError(null);\n markBusy(generationId);\n try {\n await cancelGeneration({ variables: { generationId } });\n refetchGenerations();\n } catch (err) {\n setMutationError(\n err instanceof Error\n ? err.message\n : t('bigconsole.insights.error.cancelFailed', 'Failed to cancel generation')\n );\n } finally {\n clearBusy(generationId);\n }\n },\n [cancelGeneration, refetchGenerations, t]\n );\n\n // Regenerate from an existing generation, reusing its original prompt.\n const handleRegenerate = useCallback(\n async (generationId: string) => {\n setMutationError(null);\n markBusy(generationId);\n try {\n const result = await regenerateDashboard({ variables: { input: { generationId } } });\n if (reportBigConsoleQuotaError(result, 'command')) {\n return;\n }\n refetchGenerations();\n } catch (err) {\n if (reportBigConsoleQuotaError(err, 'command')) {\n return;\n }\n setMutationError(\n err instanceof Error\n ? err.message\n : t('bigconsole.insights.error.regenerateFailed', 'Failed to regenerate dashboard')\n );\n } finally {\n clearBusy(generationId);\n }\n },\n [regenerateDashboard, refetchGenerations, t]\n );\n\n // Submit refinement instructions for a completed generation.\n const handleRefineSubmit = useCallback(async () => {\n if (!refineGen || !refineText.trim()) return;\n const generationId = refineGen.id;\n setMutationError(null);\n markBusy(generationId);\n let shouldClearRefine = false;\n try {\n const result = await refineGeneration({\n variables: { input: { generationId, refinementPrompt: refineText.trim() } },\n });\n if (reportBigConsoleQuotaError(result, 'command')) {\n // The user cannot retry quota failures without changing plan, so clear the completed refinement.\n shouldClearRefine = true;\n return;\n }\n shouldClearRefine = true;\n refetchGenerations();\n } catch (err) {\n if (reportBigConsoleQuotaError(err, 'command')) {\n // Keep the retry text only for non-quota errors; quota failures need a plan change first.\n shouldClearRefine = true;\n return;\n }\n setMutationError(\n err instanceof Error ? err.message : t('bigconsole.insights.error.refineFailed', 'Failed to refine generation')\n );\n } finally {\n if (shouldClearRefine) {\n setRefineGen(null);\n setRefineText('');\n }\n clearBusy(generationId);\n }\n }, [refineGen, refineText, refineGeneration, refetchGenerations, t]);\n\n const handleSuggestionClick = useCallback((prompt: string) => {\n setPromptText(prompt);\n }, []);\n\n const previewSpec = previewGen?.generatedSpec;\n\n return (\n // No `minHeight: 100vh`: the app shell already pads this content area, so a\n // full-viewport child guaranteed vertical overflow on every screen.\n <div className=\"min-w-0\" style={{ backgroundColor: 'var(--color-bg-canvas)' }}>\n {/* Page header strip — the same full-bleed band the other BigConsole\n pages use. The old rounded hero relied on `border-border-seam` +\n `bg-gloss-card`, neither of which is a registered utility in this\n shell, so it rendered with no seam and no gloss at all. */}\n <header className=\"relative overflow-hidden border-b border-[var(--color-border-seam)] bg-[image:var(--gradient-gloss-card)]\">\n <AuroraBackground intensity=\"subtle\" />\n <div style={{ padding: 'var(--space-pagePadding)' }}>\n <div\n style={{\n display: 'flex',\n alignItems: 'center',\n gap: 'var(--space-formGap)',\n flexWrap: 'wrap',\n minWidth: 0,\n }}\n >\n <div\n style={{\n display: 'flex',\n height: 'var(--size-controlHeight-lg)',\n width: 'var(--size-controlHeight-lg)',\n flexShrink: 0,\n alignItems: 'center',\n justifyContent: 'center',\n borderRadius: 'var(--radius-card)',\n backgroundColor: 'var(--color-action-primary-bg)',\n }}\n >\n <Sparkles\n style={{\n height: 'var(--size-icon-lg)',\n width: 'var(--size-icon-lg)',\n color: 'var(--color-action-primary-text)',\n }}\n />\n </div>\n <div style={{ minWidth: 0 }}>\n {/* text-2xl matches the other page titles — `text-heading-h*`\n emits no CSS in this shell. */}\n <h1 className=\"m-0 text-2xl font-bold text-text-primary\">\n <GradientText>{t('bigconsole.insights.header.title', 'AI Insights')}</GradientText>\n </h1>\n <p className=\"m-0 text-sm text-text-secondary\">\n {t('bigconsole.insights.header.subtitle', 'Generate dashboards from natural language prompts')}\n </p>\n </div>\n </div>\n </div>\n </header>\n\n <div style={{ padding: 'var(--space-pagePadding)' }}>\n <PagePurpose className=\"mb-[var(--space-sectionGap)]\">\n Describe the dashboard you need in plain English and BigConsole proposes the pages, widgets and layout for it.\n Review the proposal, refine it in place, then create the real dashboard in one step — a generation is only a\n proposal until you accept it.\n </PagePurpose>\n\n <SectionStack>\n {/* Page-level failures were a red-bordered neutral card; they are now\n the same danger tone as every other status surface in BigConsole. */}\n {mutationError && (\n <Section\n headingLevel={2}\n tone=\"danger\"\n padding=\"compact\"\n title=\"That request did not go through\"\n description={mutationError}\n icon={<AlertCircle className=\"h-icon-sm w-icon-sm\" />}\n data-testid=\"insights-error\"\n actions={\n <button\n type=\"button\"\n onClick={() => setMutationError(null)}\n aria-label={t('bigconsole.insights.error.dismiss', 'Dismiss error')}\n className={SECTION_FOCUS_RING}\n style={NEUTRAL_ACTION}\n >\n Dismiss\n </button>\n }\n />\n )}\n\n {/* PRIMARY — the one block this route exists for. */}\n <Section\n id=\"insights-prompt\"\n emphasis=\"primary\"\n headingLevel={2}\n title=\"Describe your dashboard\"\n description=\"One or two sentences is enough — name the metrics, the breakdowns and who will read it.\"\n icon={<Sparkles className=\"h-icon-sm w-icon-sm\" />}\n data-testid=\"insights-prompt\"\n >\n <div style={{ display: 'flex', flexDirection: 'column', gap: 'var(--space-controlGap)' }}>\n <label\n htmlFor=\"prompt-input\"\n style={{\n display: 'block',\n fontSize: 'var(--font-size-body-sm)',\n fontWeight: 'var(--font-weight-medium)',\n color: 'var(--color-text-primary)',\n }}\n >\n {t('bigconsole.insights.prompt.label', 'Your prompt')}\n </label>\n <textarea\n id=\"prompt-input\"\n value={promptText}\n onChange={(e) => setPromptText(e.target.value)}\n placeholder={t(\n 'bigconsole.insights.prompt.placeholder',\n 'e.g., Create a sales dashboard showing revenue trends, top products, and regional performance'\n )}\n rows={3}\n maxLength={2000}\n // The page's most important control used to set `outline: none`\n // with no replacement, so it had no keyboard focus indicator.\n className={SECTION_FOCUS_RING}\n style={{\n width: '100%',\n maxWidth: '100%',\n padding: 'var(--space-controlGap) var(--space-formGap)',\n borderRadius: 'var(--radius-input)',\n border: '1px solid var(--color-border-default)',\n backgroundColor: 'var(--color-bg-canvas)',\n color: 'var(--color-text-primary)',\n fontSize: 'var(--font-size-body-md)',\n resize: 'vertical',\n }}\n onKeyDown={(e) => {\n if (e.key === 'Enter' && (e.metaKey || e.ctrlKey)) handleGenerate();\n }}\n />\n {/* A committed footer: the CTA now sits below a rule instead of\n floating as one more sibling of the label and the input. */}\n <div\n style={{\n display: 'flex',\n alignItems: 'center',\n flexWrap: 'wrap',\n gap: 'var(--space-controlGap)',\n borderTop: '1px solid var(--color-border-subtle)',\n paddingTop: 'var(--space-controlGap)',\n }}\n >\n <span\n style={{\n flex: '1 1 12rem',\n minWidth: 0,\n fontSize: 'var(--font-size-body-sm)',\n color: 'var(--color-text-muted)',\n }}\n >\n {t('bigconsole.insights.prompt.hint', 'Press Ctrl+Enter to generate')} · {promptText.length}/2000\n </span>\n <button\n type=\"button\"\n onClick={handleGenerate}\n disabled={!promptText.trim() || isGenerating}\n className={SECTION_FOCUS_RING}\n style={{\n ...PRIMARY_ACTION,\n // Keeps the CTA anchored to the right edge even after the\n // hint pushes it onto its own line.\n marginLeft: 'auto',\n cursor: !promptText.trim() || isGenerating ? 'not-allowed' : 'pointer',\n opacity: !promptText.trim() || isGenerating ? 0.5 : 1,\n }}\n >\n {isGenerating ? (\n <Loader2 size={16} className=\"animate-spin\" aria-hidden=\"true\" />\n ) : (\n <Sparkles size={16} aria-hidden=\"true\" />\n )}\n {t('bigconsole.insights.prompt.generateButton', 'Generate dashboard')}\n </button>\n </div>\n </div>\n </Section>\n\n {/* MUTED — optional shortcuts. Recessed so a prompt template can never\n be mistaken for a finished generation. */}\n {suggestions.length > 0 && (\n <Section\n emphasis=\"muted\"\n headingLevel={2}\n title={t('bigconsole.insights.suggestions.heading', 'Starting points')}\n description=\"Pick one to drop it into the prompt box above, then edit it before generating.\"\n icon={<Lightbulb className=\"h-icon-sm w-icon-sm\" />}\n data-testid=\"insights-suggestions\"\n >\n <div\n style={{\n display: 'grid',\n gridTemplateColumns: 'repeat(auto-fill, minmax(min(260px, 100%), 1fr))',\n gap: 'var(--space-controlGap)',\n }}\n >\n {suggestions.map((s) => (\n <button\n key={s.id}\n type=\"button\"\n onClick={() => handleSuggestionClick(s.prompt)}\n className={SECTION_FOCUS_RING}\n style={{\n textAlign: 'left',\n minWidth: 0,\n minHeight: 'var(--size-controlHeight-lg)',\n padding: 'var(--space-controlGap)',\n borderRadius: 'var(--radius-card)',\n border: '1px solid var(--color-border-subtle)',\n backgroundColor: 'var(--color-bg-surface)',\n cursor: 'pointer',\n }}\n >\n <span\n style={{\n display: 'block',\n fontWeight: 'var(--font-weight-medium)',\n fontSize: 'var(--font-size-body-sm)',\n color: 'var(--color-text-primary)',\n marginBottom: 'var(--space-iconGap)',\n }}\n >\n {s.title}\n </span>\n <span\n style={{\n display: 'block',\n fontSize: 'var(--font-size-body-sm)',\n color: 'var(--color-text-secondary)',\n lineHeight: 1.4,\n }}\n >\n {s.exampleDescription || s.prompt}\n </span>\n {s.tags.length > 0 && (\n <span\n style={{\n display: 'flex',\n gap: 'var(--space-iconGap)',\n marginTop: 'var(--space-controlGap)',\n flexWrap: 'wrap',\n }}\n >\n {s.tags.slice(0, 3).map((tag) => (\n <span key={tag} style={CHIP_BASE}>\n {tag}\n </span>\n ))}\n </span>\n )}\n </button>\n ))}\n </div>\n </Section>\n )}\n\n {/* BARE region — the heading and count give the results a boundary;\n the cards inside carry the surface. */}\n <Section\n emphasis=\"bare\"\n padding=\"none\"\n headingLevel={2}\n title={t('bigconsole.insights.generations.heading', 'Recent generations')}\n description=\"Newest first. A generation stays a proposal until you create the dashboard from it.\"\n icon={<History className=\"h-icon-sm w-icon-sm\" />}\n meta={\n generations.length > 0 ? (\n // A bare digit next to the heading is unreadable out of context\n // for a screen reader, so the chip carries its own noun.\n <span style={CHIP_BASE}>\n {generations.length} generation{generations.length === 1 ? '' : 's'}\n </span>\n ) : undefined\n }\n data-testid=\"insights-generations\"\n >\n {generationsLoading && generations.length === 0 ? (\n <Section\n emphasis=\"muted\"\n headingLevel={3}\n aria-label=\"Loading generations\"\n className=\"min-h-[10rem]\"\n data-testid=\"insights-generations-loading\"\n >\n <div\n style={{\n display: 'flex',\n minHeight: '8rem',\n flexDirection: 'column',\n alignItems: 'center',\n justifyContent: 'center',\n gap: 'var(--space-controlGap)',\n color: 'var(--color-text-muted)',\n }}\n >\n <Loader2 size={24} className=\"animate-spin\" aria-hidden=\"true\" />\n <p style={{ fontSize: 'var(--font-size-body-sm)' }}>\n {t('bigconsole.insights.generations.loading', 'Loading generations…')}\n </p>\n </div>\n </Section>\n ) : generations.length === 0 && !isGenerating ? (\n // `border-border-seam` emitted no CSS — the arbitrary form is\n // theme-aware and actually draws the seam.\n <GlassCard treatment=\"insight\" className=\"border-[var(--color-border-seam)]\">\n <IllustratedEmptyState\n illustration=\"onboarding\"\n title={t('bigconsole.insights.generations.emptyTitle', 'No generations yet')}\n description={t(\n 'bigconsole.insights.generations.emptyDescription',\n 'Describe a dashboard above to get started'\n )}\n />\n </GlassCard>\n ) : (\n <div className=\"flex flex-col gap-list-gap\">\n {/* Transient placeholder while the generate request is in flight\n and the backend has not yet returned the new PENDING\n generation. Toned `info` so it is not mistaken for a\n persisted generation. */}\n {isGenerating && !hasActiveGenerations && (\n <Section\n emphasis=\"muted\"\n tone=\"info\"\n padding=\"compact\"\n headingLevel={3}\n title=\"Sending your prompt…\"\n description=\"The new generation appears here as soon as the backend accepts it.\"\n icon={<Loader2 className=\"h-icon-sm w-icon-sm animate-spin\" />}\n data-testid=\"insights-generation-pending\"\n />\n )}\n {generations.map((gen) => {\n const spec = gen.generatedSpec;\n const busy = busyIds.has(gen.id);\n const inFlight = NON_TERMINAL_STATUSES.includes(gen.status);\n return (\n <Section\n key={gen.id}\n emphasis=\"standard\"\n padding=\"compact\"\n headingLevel={3}\n title={\n spec?.name ||\n (inFlight\n ? t('bigconsole.insights.generations.generating', 'Generating…')\n : 'Untitled generation')\n }\n meta={<StatusBadge status={gen.status} />}\n description={gen.prompt.length > 160 ? `${gen.prompt.slice(0, 160)}…` : gen.prompt}\n data-testid=\"insights-generation-card\"\n bodyClassName=\"flex flex-col gap-control-gap\"\n >\n {/* What the AI produced, separated from what was asked. */}\n {spec && (\n <div style={{ display: 'flex', flexWrap: 'wrap', gap: 'var(--space-iconGap)' }}>\n <span style={CHIP_BASE}>\n {countWidgets(spec)} widget{countWidgets(spec) === 1 ? '' : 's'}\n </span>\n <span style={CHIP_BASE}>\n {spec.pages.length} page{spec.pages.length === 1 ? '' : 's'}\n </span>\n <span style={confidenceChipStyle(spec.overallConfidence)}>\n {Math.round(spec.overallConfidence * 100)}% confidence\n </span>\n </div>\n )}\n\n {gen.errorMessage && (\n <Section\n headingLevel={4}\n tone=\"danger\"\n padding=\"compact\"\n title=\"Generation failed\"\n description={gen.errorMessage}\n icon={<AlertCircle className=\"h-icon-sm w-icon-sm\" />}\n />\n )}\n\n {/* Action cluster: reversible actions on the left, the\n decisive and destructive ones grouped on the right. */}\n <div\n style={{\n display: 'flex',\n flexWrap: 'wrap',\n alignItems: 'center',\n gap: 'var(--space-controlGap)',\n borderTop: '1px solid var(--color-border-subtle)',\n paddingTop: 'var(--space-controlGap)',\n }}\n >\n {inFlight && (\n <button\n type=\"button\"\n onClick={() => {\n nativeImpact('medium');\n void handleCancel(gen.id);\n }}\n disabled={busy}\n title={t('bigconsole.insights.actions.cancelTitle', 'Cancel generation')}\n className={SECTION_FOCUS_RING}\n style={{ ...WARNING_ACTION, cursor: busy ? 'wait' : 'pointer' }}\n >\n <Ban size={14} aria-hidden=\"true\" /> {t('bigconsole.insights.actions.cancel', 'Cancel')}\n </button>\n )}\n {gen.status === 'COMPLETED' && spec && (\n <button\n type=\"button\"\n onClick={() => setPreviewGen(gen)}\n title={t('bigconsole.insights.actions.previewTitle', 'Preview proposed layout')}\n className={SECTION_FOCUS_RING}\n style={NEUTRAL_ACTION}\n >\n <Eye size={14} aria-hidden=\"true\" /> {t('bigconsole.insights.actions.preview', 'Preview')}\n </button>\n )}\n {gen.status === 'COMPLETED' && spec && (\n <button\n type=\"button\"\n onClick={() => {\n setRefineGen(gen);\n setRefineText('');\n }}\n title={t('bigconsole.insights.actions.refineTitle', 'Refine with instructions')}\n className={SECTION_FOCUS_RING}\n style={NEUTRAL_ACTION}\n >\n <Wand2 size={14} aria-hidden=\"true\" /> {t('bigconsole.insights.actions.refine', 'Refine')}\n </button>\n )}\n {(gen.status === 'COMPLETED' || gen.status === 'FAILED' || gen.status === 'CANCELLED') && (\n <button\n type=\"button\"\n onClick={() => {\n nativeImpact('medium');\n void handleRegenerate(gen.id);\n }}\n disabled={busy}\n title={t('bigconsole.insights.actions.regenerateTitle', 'Regenerate with the same prompt')}\n className={SECTION_FOCUS_RING}\n style={{ ...NEUTRAL_ACTION, cursor: busy ? 'wait' : 'pointer' }}\n >\n <RefreshCw size={14} className={busy ? 'animate-spin' : ''} aria-hidden=\"true\" />{' '}\n {t('bigconsole.insights.actions.regenerate', 'Regenerate')}\n </button>\n )}\n\n <div\n style={{\n display: 'flex',\n flexWrap: 'wrap',\n alignItems: 'center',\n gap: 'var(--space-controlGap)',\n marginLeft: 'auto',\n }}\n >\n {gen.status === 'COMPLETED' && !gen.dashboardId && (\n <button\n type=\"button\"\n onClick={() => handleCreateDashboard(gen.id)}\n className={SECTION_FOCUS_RING}\n style={PRIMARY_ACTION}\n >\n {t('bigconsole.insights.actions.create', 'Create dashboard')}{' '}\n <ArrowRight size={14} aria-hidden=\"true\" />\n </button>\n )}\n {gen.dashboardId && (\n <button\n type=\"button\"\n onClick={() => navigate(`/dashboards/${gen.dashboardId ?? ''}`)}\n className={SECTION_FOCUS_RING}\n style={NEUTRAL_ACTION}\n >\n {t('bigconsole.insights.actions.viewDashboard', 'View dashboard')}{' '}\n <ArrowRight size={14} aria-hidden=\"true\" />\n </button>\n )}\n <button\n type=\"button\"\n onClick={() => {\n nativeImpact('medium');\n void handleDelete(gen.id);\n }}\n title={t('bigconsole.insights.actions.deleteTitle', 'Delete generation')}\n aria-label={t('bigconsole.insights.actions.deleteTitle', 'Delete generation')}\n className={SECTION_FOCUS_RING}\n style={DANGER_ICON_ACTION}\n >\n <Trash2 size={14} aria-hidden=\"true\" />\n </button>\n </div>\n </div>\n </Section>\n );\n })}\n </div>\n )}\n </Section>\n </SectionStack>\n </div>\n\n {/* Preview modal — shows the AI-proposed page/widget structure before creation */}\n {previewGen && previewSpec && (\n <div\n role=\"dialog\"\n aria-modal=\"true\"\n aria-label={t('bigconsole.insights.preview.ariaLabel', 'Generation preview')}\n onClick={() => setPreviewGen(null)}\n style={{\n position: 'fixed',\n inset: 0,\n zIndex: 1000,\n backgroundColor: 'var(--color-overlay-scrim)',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n padding: 'var(--space-pagePadding)',\n }}\n >\n <div\n onClick={(e) => e.stopPropagation()}\n style={{\n // Header and footer stay put while only the page list scrolls, so\n // the dashboard name and the accept action never scroll away.\n display: 'flex',\n flexDirection: 'column',\n minHeight: 0,\n width: 'min(640px, 100%)',\n maxHeight: 'calc(100dvh - 2 * var(--space-pagePadding))',\n backgroundColor: 'var(--color-bg-surface)',\n borderRadius: 'var(--radius-card)',\n border: '1px solid var(--color-border-default)',\n boxShadow: 'var(--shadow-elevation-3)',\n }}\n >\n <div\n style={{\n display: 'flex',\n justifyContent: 'space-between',\n alignItems: 'flex-start',\n gap: 'var(--space-controlGap)',\n padding: 'var(--space-cardPadding)',\n borderBottom: '1px solid var(--color-border-subtle)',\n }}\n >\n <div style={{ minWidth: 0 }}>\n <h2\n style={{\n fontSize: 'var(--font-size-heading-h4)',\n fontWeight: 'var(--font-weight-semibold)',\n color: 'var(--color-text-primary)',\n }}\n >\n {previewSpec.name}\n </h2>\n {previewSpec.description && (\n <p\n style={{\n fontSize: 'var(--font-size-body-sm)',\n color: 'var(--color-text-secondary)',\n marginTop: 2,\n }}\n >\n {previewSpec.description}\n </p>\n )}\n </div>\n <button\n type=\"button\"\n onClick={() => setPreviewGen(null)}\n aria-label={t('bigconsole.insights.preview.close', 'Close preview')}\n className={SECTION_FOCUS_RING}\n style={{ ...DANGER_ICON_ACTION, color: 'var(--color-text-muted)' }}\n >\n <X size={18} aria-hidden=\"true\" />\n </button>\n </div>\n\n <div\n style={{\n flex: '1 1 auto',\n minHeight: 0,\n overflowY: 'auto',\n padding: 'var(--space-cardPadding)',\n display: 'flex',\n flexDirection: 'column',\n gap: 'var(--space-controlGap)',\n }}\n >\n {/* The decision-making numbers were 11px muted text; they are now\n the first thing in the body, at readable size. */}\n <div style={{ display: 'flex', flexWrap: 'wrap', gap: 'var(--space-iconGap)' }}>\n <span style={CHIP_BASE}>\n {countWidgets(previewSpec)} widget{countWidgets(previewSpec) === 1 ? '' : 's'}\n </span>\n <span style={CHIP_BASE}>\n {previewSpec.pages.length} page{previewSpec.pages.length === 1 ? '' : 's'}\n </span>\n <span style={confidenceChipStyle(previewSpec.overallConfidence)}>\n {Math.round(previewSpec.overallConfidence * 100)}% confidence\n </span>\n </div>\n\n {/* One labelled block per page — the chips used to run together\n into a single wall with no page boundaries. */}\n {previewSpec.pages.map((page, pi) => (\n <Section\n key={pi}\n emphasis=\"muted\"\n padding=\"compact\"\n headingLevel={3}\n title={page.name}\n meta={\n <span style={CHIP_BASE}>\n {page.widgets.length} widget{page.widgets.length === 1 ? '' : 's'}\n </span>\n }\n >\n <div style={{ display: 'flex', flexWrap: 'wrap', gap: 'var(--space-iconGap)' }}>\n {page.widgets.map((w, wi) => (\n <span\n key={wi}\n style={{\n ...CHIP_BASE,\n backgroundColor: 'var(--color-bg-surface)',\n color: 'var(--color-text-primary)',\n }}\n >\n {w.title}\n <span style={{ color: 'var(--color-text-muted)' }}>{w.type}</span>\n </span>\n ))}\n </div>\n </Section>\n ))}\n </div>\n\n {/* Review → accept in one place: previously you had to close the\n modal and find the card again to create the dashboard. */}\n <div\n style={{\n display: 'flex',\n justifyContent: 'flex-end',\n flexWrap: 'wrap',\n gap: 'var(--space-controlGap)',\n padding: 'var(--space-cardPadding)',\n borderTop: '1px solid var(--color-border-subtle)',\n }}\n >\n <button\n type=\"button\"\n onClick={() => setPreviewGen(null)}\n className={SECTION_FOCUS_RING}\n style={NEUTRAL_ACTION}\n >\n Close\n </button>\n {previewGen.status === 'COMPLETED' && !previewGen.dashboardId && (\n <button\n type=\"button\"\n onClick={() => {\n const generationId = previewGen.id;\n setPreviewGen(null);\n void handleCreateDashboard(generationId);\n }}\n className={SECTION_FOCUS_RING}\n style={PRIMARY_ACTION}\n >\n {t('bigconsole.insights.actions.create', 'Create dashboard')}{' '}\n <ArrowRight size={14} aria-hidden=\"true\" />\n </button>\n )}\n </div>\n </div>\n </div>\n )}\n\n {/* Refine modal — collects refinement instructions for refineGeneratedDashboard */}\n {refineGen && (\n <div\n role=\"dialog\"\n aria-modal=\"true\"\n aria-label={t('bigconsole.insights.refine.ariaLabel', 'Refine generation')}\n onClick={() => setRefineGen(null)}\n style={{\n position: 'fixed',\n inset: 0,\n zIndex: 1000,\n backgroundColor: 'var(--color-overlay-scrim)',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n padding: 'var(--space-pagePadding)',\n }}\n >\n <div\n onClick={(e) => e.stopPropagation()}\n style={{\n // The refine dialog had no height cap and no scroll: with the\n // mobile keyboard open the Apply button was unreachable.\n display: 'flex',\n flexDirection: 'column',\n minHeight: 0,\n width: 'min(520px, 100%)',\n maxHeight: 'calc(100dvh - 2 * var(--space-pagePadding))',\n backgroundColor: 'var(--color-bg-surface)',\n borderRadius: 'var(--radius-card)',\n border: '1px solid var(--color-border-default)',\n boxShadow: 'var(--shadow-elevation-3)',\n }}\n >\n <div\n style={{\n padding: 'var(--space-cardPadding)',\n borderBottom: '1px solid var(--color-border-subtle)',\n }}\n >\n <h2\n style={{\n fontSize: 'var(--font-size-heading-h4)',\n fontWeight: 'var(--font-weight-semibold)',\n color: 'var(--color-text-primary)',\n }}\n >\n {t('bigconsole.insights.refine.heading', 'Refine dashboard')}\n </h2>\n <p\n style={{\n fontSize: 'var(--font-size-body-sm)',\n color: 'var(--color-text-secondary)',\n marginTop: 2,\n }}\n >\n {t(\n 'bigconsole.insights.refine.subtitle',\n 'Describe what to change — the AI keeps the existing spec and applies your instructions.'\n )}\n </p>\n </div>\n\n <div\n style={{\n flex: '1 1 auto',\n minHeight: 0,\n overflowY: 'auto',\n padding: 'var(--space-cardPadding)',\n display: 'flex',\n flexDirection: 'column',\n gap: 'var(--space-controlGap)',\n }}\n >\n {/* You were being asked to describe changes to something you could\n not see — the current proposal is now echoed above the box. */}\n <Section\n emphasis=\"muted\"\n padding=\"compact\"\n headingLevel={3}\n title={refineGen.generatedSpec?.name || 'Current proposal'}\n description={refineGen.prompt.length > 240 ? `${refineGen.prompt.slice(0, 240)}…` : refineGen.prompt}\n icon={<Sparkles className=\"h-icon-sm w-icon-sm\" />}\n />\n\n <div style={{ display: 'flex', flexDirection: 'column', gap: 'var(--space-controlGap)' }}>\n <label\n htmlFor=\"refine-input\"\n style={{\n display: 'block',\n fontSize: 'var(--font-size-body-sm)',\n fontWeight: 'var(--font-weight-medium)',\n color: 'var(--color-text-primary)',\n }}\n >\n What should change?\n </label>\n <textarea\n id=\"refine-input\"\n value={refineText}\n onChange={(e) => setRefineText(e.target.value)}\n maxLength={2000}\n rows={4}\n placeholder={t(\n 'bigconsole.insights.refine.placeholder',\n 'e.g., Add a revenue-by-region map and remove the duplicate KPI cards'\n )}\n className={SECTION_FOCUS_RING}\n style={{\n width: '100%',\n maxWidth: '100%',\n resize: 'vertical',\n // Matches the composer above — the two prompt inputs used\n // two different radii and two different padding scales.\n padding: 'var(--space-controlGap) var(--space-formGap)',\n borderRadius: 'var(--radius-input)',\n border: '1px solid var(--color-border-default)',\n backgroundColor: 'var(--color-bg-canvas)',\n color: 'var(--color-text-primary)',\n fontSize: 'var(--font-size-body-md)',\n }}\n />\n </div>\n </div>\n\n <div\n style={{\n display: 'flex',\n justifyContent: 'flex-end',\n flexWrap: 'wrap',\n gap: 'var(--space-controlGap)',\n padding: 'var(--space-cardPadding)',\n borderTop: '1px solid var(--color-border-subtle)',\n }}\n >\n <button\n type=\"button\"\n onClick={() => setRefineGen(null)}\n className={SECTION_FOCUS_RING}\n style={NEUTRAL_ACTION}\n >\n {t('bigconsole.insights.actions.cancel', 'Cancel')}\n </button>\n <button\n type=\"button\"\n onClick={() => void handleRefineSubmit()}\n disabled={!refineText.trim() || busyIds.has(refineGen.id)}\n className={SECTION_FOCUS_RING}\n style={{\n ...PRIMARY_ACTION,\n cursor: !refineText.trim() || busyIds.has(refineGen.id) ? 'not-allowed' : 'pointer',\n opacity: !refineText.trim() ? 0.6 : 1,\n }}\n >\n {busyIds.has(refineGen.id) ? (\n <Loader2 size={14} className=\"animate-spin\" aria-hidden=\"true\" />\n ) : (\n <Wand2 size={14} aria-hidden=\"true\" />\n )}\n {t('bigconsole.insights.refine.apply', 'Apply refinement')}\n </button>\n </div>\n </div>\n </div>\n )}\n </div>\n );\n});\n\nexport default InsightsPage;\n"],"mappings":"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"}