@burdenoff/microfe-bigconsole 2026.624.2 → 2026.626.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (72) hide show
  1. package/dist/bigconsole/BigConsoleRoutes.js +175 -118
  2. package/dist/bigconsole/BigConsoleRoutes.js.map +1 -1
  3. package/dist/bigconsole/assistant/assistantApi.js +215 -0
  4. package/dist/bigconsole/assistant/assistantApi.js.map +1 -0
  5. package/dist/bigconsole/assistant/createSandboxAssistantTransport.js +119 -0
  6. package/dist/bigconsole/assistant/createSandboxAssistantTransport.js.map +1 -0
  7. package/dist/bigconsole/assistant/index.js +2 -0
  8. package/dist/bigconsole/assistant/pageContext.js +51 -0
  9. package/dist/bigconsole/assistant/pageContext.js.map +1 -0
  10. package/dist/bigconsole/components/dashboard/CreateDashboardDialog.js +48 -48
  11. package/dist/bigconsole/components/dashboard/DashboardToolbar.js +52 -52
  12. package/dist/bigconsole/components/dashboard/DrilldownBreadcrumb.js.map +1 -1
  13. package/dist/bigconsole/components/dashboard/ExportDashboardDialog.js +33 -33
  14. package/dist/bigconsole/components/dashboard/ImportDashboardDialog.js +179 -179
  15. package/dist/bigconsole/components/dashboard/ImportDashboardDialog.js.map +1 -1
  16. package/dist/bigconsole/components/dashboard/WidgetPalette.js +38 -38
  17. package/dist/bigconsole/components/datasink/DataSinkTableViewer.js +32 -32
  18. package/dist/bigconsole/components/datasink/ExportDataSinkDialog.js +31 -31
  19. package/dist/bigconsole/components/datasink/ImportDataSinkDialog.js +98 -98
  20. package/dist/bigconsole/components/datasink/ImportDataSinkDialog.js.map +1 -1
  21. package/dist/bigconsole/components/parser/ExportParserDialog.js +31 -31
  22. package/dist/bigconsole/components/parser/ImportParserDialog.js +162 -162
  23. package/dist/bigconsole/components/parser/ImportParserDialog.js.map +1 -1
  24. package/dist/bigconsole/components/widgets/ActionConfigDialog.js +79 -79
  25. package/dist/bigconsole/components/widgets/ActionConfigDialog.js.map +1 -1
  26. package/dist/bigconsole/components/widgets/DrilldownConfigPanel.js.map +1 -1
  27. package/dist/bigconsole/components/widgets/PropertiesPanel.js +307 -307
  28. package/dist/bigconsole/components/widgets/PropertiesPanel.js.map +1 -1
  29. package/dist/bigconsole/components/widgets/WidgetConfigDialog.js +222 -222
  30. package/dist/bigconsole/components/widgets/WidgetConfigDialog.js.map +1 -1
  31. package/dist/bigconsole/components/widgets/WidgetTypeSelector.js +23 -23
  32. package/dist/bigconsole/index.js +3 -0
  33. package/dist/bigconsole/pages/DashboardBuilderPage.js +74 -74
  34. package/dist/bigconsole/pages/DashboardBuilderPage.js.map +1 -1
  35. package/dist/bigconsole/pages/DashboardViewPage.js +168 -189
  36. package/dist/bigconsole/pages/DashboardViewPage.js.map +1 -1
  37. package/dist/bigconsole/pages/DashboardsPage.js +266 -310
  38. package/dist/bigconsole/pages/DashboardsPage.js.map +1 -1
  39. package/dist/bigconsole/pages/DataParsersPage.js +148 -194
  40. package/dist/bigconsole/pages/DataParsersPage.js.map +1 -1
  41. package/dist/bigconsole/pages/DataSinkBuilderPage.js +252 -246
  42. package/dist/bigconsole/pages/DataSinkBuilderPage.js.map +1 -1
  43. package/dist/bigconsole/pages/DataSinkViewPage.js +256 -231
  44. package/dist/bigconsole/pages/DataSinkViewPage.js.map +1 -1
  45. package/dist/bigconsole/pages/DataSinksPage.js +173 -219
  46. package/dist/bigconsole/pages/DataSinksPage.js.map +1 -1
  47. package/dist/bigconsole/pages/HomePage.js +125 -141
  48. package/dist/bigconsole/pages/HomePage.js.map +1 -1
  49. package/dist/bigconsole/pages/InsightsPage.js +159 -184
  50. package/dist/bigconsole/pages/InsightsPage.js.map +1 -1
  51. package/dist/bigconsole/pages/ParserBuilderPage.js +401 -393
  52. package/dist/bigconsole/pages/ParserBuilderPage.js.map +1 -1
  53. package/dist/bigconsole/pages/ParserViewPage.js +220 -201
  54. package/dist/bigconsole/pages/ParserViewPage.js.map +1 -1
  55. package/dist/bigconsole/pages/PipelineBuilderPage.js +212 -206
  56. package/dist/bigconsole/pages/PipelineBuilderPage.js.map +1 -1
  57. package/dist/bigconsole/pages/PipelineViewPage.js +204 -181
  58. package/dist/bigconsole/pages/PipelineViewPage.js.map +1 -1
  59. package/dist/bigconsole/pages/PipelinesPage.js +107 -150
  60. package/dist/bigconsole/pages/PipelinesPage.js.map +1 -1
  61. package/dist/bigconsole/pages/SettingsPage.js +184 -171
  62. package/dist/bigconsole/pages/SettingsPage.js.map +1 -1
  63. package/dist/bigconsole/pages/WidgetDemoPage.js +69 -81
  64. package/dist/bigconsole/pages/WidgetDemoPage.js.map +1 -1
  65. package/dist/bigconsole/pages/WorkflowViewPage.js +230 -216
  66. package/dist/bigconsole/pages/WorkflowViewPage.js.map +1 -1
  67. package/dist/bigconsole/pages/WorkflowsPage.js +106 -149
  68. package/dist/bigconsole/pages/WorkflowsPage.js.map +1 -1
  69. package/dist/generated/wspace-operations.js +87 -36
  70. package/dist/generated/wspace-operations.js.map +1 -1
  71. package/dist/index.js +3 -1
  72. package/package.json +6 -2
@@ -5,9 +5,10 @@ import { ArrowRight as r, Blocks as i, FileCode2 as a, GitBranch as o, LayoutDas
5
5
  import { gql as l } from "@apollo/client";
6
6
  import { useQuery as u } from "@apollo/client/react";
7
7
  import { useI18n as d } from "@burdenoff/fe-libs/shared/providers/shell/I18nProvider";
8
- import { jsx as f, jsxs as p } from "react/jsx-runtime";
8
+ import { AuroraBackground as f, Button as p, GlassCard as m, GradientText as h, IllustratedEmptyState as g, PagePurpose as _ } from "@burdenoff/fe-libs/ui";
9
+ import { jsx as v, jsxs as y } from "react/jsx-runtime";
9
10
  //#region src/bigconsole/pages/HomePage.tsx
10
- var m = l`
11
+ var b = l`
11
12
  query HomepageStats {
12
13
  listDashboards(first: 0) {
13
14
  totalCount
@@ -22,7 +23,7 @@ var m = l`
22
23
  id
23
24
  }
24
25
  }
25
- `, h = l`
26
+ `, x = l`
26
27
  query RecentDashboards {
27
28
  listDashboards(first: 5, sortBy: "updatedAt", sortOrder: "desc") {
28
29
  edges {
@@ -35,83 +36,85 @@ var m = l`
35
36
  }
36
37
  }
37
38
  }
38
- `, g = t(function({ icon: e, label: t, count: n, loading: r, path: i, onNavigate: a }) {
39
- return /* @__PURE__ */ p("button", {
40
- onClick: () => a(i),
41
- style: {
42
- textAlign: "left",
43
- padding: "var(--space-cardPadding)",
44
- backgroundColor: "var(--color-bg-surface)",
45
- border: "1px solid var(--color-border)",
46
- borderRadius: "var(--radius-card)",
47
- cursor: "pointer",
48
- transition: "border-color 200ms"
49
- },
50
- children: [/* @__PURE__ */ p("div", {
51
- style: {
52
- display: "flex",
53
- alignItems: "center",
54
- gap: 8,
55
- marginBottom: 8
56
- },
57
- children: [/* @__PURE__ */ f("div", {
58
- style: { color: "var(--color-action-primary-bg)" },
59
- children: e
60
- }), /* @__PURE__ */ f("span", {
39
+ `, S = t(function({ icon: e, label: t, count: n, loading: r, path: i, onNavigate: a, hero: o = !1 }) {
40
+ return /* @__PURE__ */ v(m, {
41
+ treatment: o ? "glass" : "metric",
42
+ glow: o,
43
+ className: "border-border-seam p-0",
44
+ children: /* @__PURE__ */ y("button", {
45
+ type: "button",
46
+ onClick: () => a(i),
47
+ className: "flex w-full flex-col gap-2 rounded-card p-[var(--space-cardPadding)] text-left focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-[var(--color-focus-ring)]",
48
+ children: [/* @__PURE__ */ y("div", {
49
+ className: "flex items-center gap-2",
50
+ children: [/* @__PURE__ */ v("div", {
51
+ style: { color: "var(--color-action-primary-bg)" },
52
+ children: e
53
+ }), /* @__PURE__ */ v("span", {
54
+ style: {
55
+ fontSize: "var(--font-size-body-sm)",
56
+ color: "var(--color-text-secondary)"
57
+ },
58
+ children: t
59
+ })]
60
+ }), /* @__PURE__ */ v("div", {
61
+ className: "tabular-nums",
61
62
  style: {
62
- fontSize: "var(--font-size-body-sm)",
63
- color: "var(--color-text-secondary)"
63
+ fontSize: "var(--font-size-heading-h4)",
64
+ fontWeight: "var(--font-weight-bold)",
65
+ color: "var(--color-text-primary)"
64
66
  },
65
- children: t
67
+ children: r ? /* @__PURE__ */ v(c, {
68
+ size: 20,
69
+ className: "animate-spin"
70
+ }) : n ?? 0
66
71
  })]
67
- }), /* @__PURE__ */ f("div", {
68
- style: {
69
- fontSize: "var(--font-size-heading-h4)",
70
- fontWeight: "var(--font-weight-bold)",
71
- color: "var(--color-text-primary)"
72
- },
73
- children: r ? /* @__PURE__ */ f(c, {
74
- size: 20,
75
- className: "animate-spin"
76
- }) : n ?? 0
77
- })]
72
+ })
78
73
  });
79
- }), _ = t(function() {
80
- let t = e(), { t: l } = d(), _ = n((e, t) => {
74
+ }), C = t(function() {
75
+ let t = e(), { t: l } = d(), C = n((e, t) => {
81
76
  let n = l(e);
82
77
  return n === e ? t : n;
83
- }, [l]), { data: v, loading: y } = u(m, { fetchPolicy: "cache-and-network" }), { data: b, loading: x } = u(h, { fetchPolicy: "cache-and-network" }), S = b?.listDashboards?.edges?.map((e) => e.node) || [];
84
- return /* @__PURE__ */ f("div", {
78
+ }, [l]), { data: w, loading: T } = u(b, { fetchPolicy: "cache-and-network" }), { data: E, loading: D } = u(x, { fetchPolicy: "cache-and-network" }), O = E?.listDashboards?.edges?.map((e) => e.node) || [];
79
+ return /* @__PURE__ */ v("div", {
85
80
  style: {
86
81
  minHeight: "100vh",
87
82
  backgroundColor: "var(--color-bg-canvas)"
88
83
  },
89
- children: /* @__PURE__ */ p("div", {
84
+ children: /* @__PURE__ */ y("div", {
90
85
  style: {
91
86
  padding: "var(--space-pagePadding)",
92
87
  maxWidth: 960,
93
88
  margin: "0 auto"
94
89
  },
95
90
  children: [
96
- /* @__PURE__ */ p("div", {
97
- style: { marginBottom: "var(--space-sectionGap)" },
98
- children: [/* @__PURE__ */ f("h1", {
99
- style: {
100
- fontSize: "var(--font-size-heading-h4)",
101
- fontWeight: "var(--font-weight-bold)",
102
- color: "var(--color-text-primary)"
103
- },
104
- children: "BigConsole"
105
- }), /* @__PURE__ */ f("p", {
106
- style: {
107
- fontSize: "var(--font-size-body-md)",
108
- color: "var(--color-text-secondary)",
109
- marginTop: 4
110
- },
111
- children: _("bigconsole.home.subtitle", "AI-powered analytics platform")
112
- })]
91
+ /* @__PURE__ */ y("div", {
92
+ className: "relative mb-[var(--space-sectionGap)] overflow-hidden rounded-card border border-border-seam bg-gloss-card p-6",
93
+ children: [
94
+ /* @__PURE__ */ v(f, { intensity: "subtle" }),
95
+ /* @__PURE__ */ v("h1", {
96
+ style: {
97
+ fontSize: "var(--font-size-heading-h4)",
98
+ fontWeight: "var(--font-weight-bold)",
99
+ color: "var(--color-text-primary)"
100
+ },
101
+ children: /* @__PURE__ */ v(h, { children: "BigConsole" })
102
+ }),
103
+ /* @__PURE__ */ v("p", {
104
+ style: {
105
+ fontSize: "var(--font-size-body-md)",
106
+ color: "var(--color-text-secondary)",
107
+ marginTop: 4
108
+ },
109
+ children: C("bigconsole.home.subtitle", "AI-powered analytics platform")
110
+ })
111
+ ]
112
+ }),
113
+ /* @__PURE__ */ v(_, {
114
+ className: "mb-[var(--space-sectionGap)]",
115
+ children: C("bigconsole.home.purpose", "BigConsole is your analytics command center — build live dashboards, wire up data sinks and parsers, then automate it all with pipelines and workflows. Start from the quick actions below or jump back into a recent dashboard.")
113
116
  }),
114
- /* @__PURE__ */ p("div", {
117
+ /* @__PURE__ */ y("div", {
115
118
  style: {
116
119
  display: "grid",
117
120
  gridTemplateColumns: "repeat(auto-fit, minmax(180px, 1fr))",
@@ -119,51 +122,52 @@ var m = l`
119
122
  marginBottom: "var(--space-sectionGap)"
120
123
  },
121
124
  children: [
122
- /* @__PURE__ */ f(g, {
123
- icon: /* @__PURE__ */ f(s, { size: 20 }),
124
- label: _("bigconsole.home.stats.dashboards", "Dashboards"),
125
- count: v?.listDashboards?.totalCount,
126
- loading: y,
125
+ /* @__PURE__ */ v(S, {
126
+ hero: !0,
127
+ icon: /* @__PURE__ */ v(s, { size: 20 }),
128
+ label: C("bigconsole.home.stats.dashboards", "Dashboards"),
129
+ count: w?.listDashboards?.totalCount,
130
+ loading: T,
127
131
  path: "/dashboards",
128
132
  onNavigate: t
129
133
  }),
130
- /* @__PURE__ */ f(g, {
131
- icon: /* @__PURE__ */ f(i, { size: 20 }),
132
- label: _("bigconsole.home.stats.dataSinks", "Data Sinks"),
133
- count: v?.listDataSinks?.totalCount,
134
- loading: y,
134
+ /* @__PURE__ */ v(S, {
135
+ icon: /* @__PURE__ */ v(i, { size: 20 }),
136
+ label: C("bigconsole.home.stats.dataSinks", "Data Sinks"),
137
+ count: w?.listDataSinks?.totalCount,
138
+ loading: T,
135
139
  path: "/datasinks",
136
140
  onNavigate: t
137
141
  }),
138
- /* @__PURE__ */ f(g, {
139
- icon: /* @__PURE__ */ f(a, { size: 20 }),
140
- label: _("bigconsole.home.stats.parsers", "Parsers"),
141
- count: v?.listParsers?.length,
142
- loading: y,
142
+ /* @__PURE__ */ v(S, {
143
+ icon: /* @__PURE__ */ v(a, { size: 20 }),
144
+ label: C("bigconsole.home.stats.parsers", "Parsers"),
145
+ count: w?.listParsers?.length,
146
+ loading: T,
143
147
  path: "/parsers",
144
148
  onNavigate: t
145
149
  }),
146
- /* @__PURE__ */ f(g, {
147
- icon: /* @__PURE__ */ f(o, { size: 20 }),
148
- label: _("bigconsole.home.stats.pipelines", "Pipelines"),
149
- count: v?.listPipelines?.length,
150
- loading: y,
150
+ /* @__PURE__ */ v(S, {
151
+ icon: /* @__PURE__ */ v(o, { size: 20 }),
152
+ label: C("bigconsole.home.stats.pipelines", "Pipelines"),
153
+ count: w?.listPipelines?.length,
154
+ loading: T,
151
155
  path: "/pipelines",
152
156
  onNavigate: t
153
157
  })
154
158
  ]
155
159
  }),
156
- /* @__PURE__ */ p("div", {
160
+ /* @__PURE__ */ y("div", {
157
161
  style: { marginBottom: "var(--space-sectionGap)" },
158
- children: [/* @__PURE__ */ f("h2", {
162
+ children: [/* @__PURE__ */ v("h2", {
159
163
  style: {
160
164
  fontSize: "var(--font-size-body-md)",
161
165
  fontWeight: "var(--font-weight-semibold)",
162
166
  color: "var(--color-text-primary)",
163
167
  marginBottom: 12
164
168
  },
165
- children: _("bigconsole.home.quickActions.title", "Quick Actions")
166
- }), /* @__PURE__ */ f("div", {
169
+ children: C("bigconsole.home.quickActions.title", "Quick Actions")
170
+ }), /* @__PURE__ */ v("div", {
167
171
  style: {
168
172
  display: "flex",
169
173
  gap: 12,
@@ -171,26 +175,26 @@ var m = l`
171
175
  },
172
176
  children: [
173
177
  {
174
- label: _("bigconsole.home.quickActions.newDashboard", "New Dashboard"),
178
+ label: C("bigconsole.home.quickActions.newDashboard", "New Dashboard"),
175
179
  path: "/dashboards",
176
- icon: /* @__PURE__ */ f(s, { size: 14 })
180
+ icon: /* @__PURE__ */ v(s, { size: 14 })
177
181
  },
178
182
  {
179
- label: _("bigconsole.home.quickActions.newDataSink", "New Data Sink"),
183
+ label: C("bigconsole.home.quickActions.newDataSink", "New Data Sink"),
180
184
  path: "/datasinks/new",
181
- icon: /* @__PURE__ */ f(i, { size: 14 })
185
+ icon: /* @__PURE__ */ v(i, { size: 14 })
182
186
  },
183
187
  {
184
- label: _("bigconsole.home.quickActions.newParser", "New Parser"),
188
+ label: C("bigconsole.home.quickActions.newParser", "New Parser"),
185
189
  path: "/parsers/new",
186
- icon: /* @__PURE__ */ f(a, { size: 14 })
190
+ icon: /* @__PURE__ */ v(a, { size: 14 })
187
191
  },
188
192
  {
189
- label: _("bigconsole.home.quickActions.newPipeline", "New Pipeline"),
193
+ label: C("bigconsole.home.quickActions.newPipeline", "New Pipeline"),
190
194
  path: "/pipelines/new",
191
- icon: /* @__PURE__ */ f(o, { size: 14 })
195
+ icon: /* @__PURE__ */ v(o, { size: 14 })
192
196
  }
193
- ].map((e) => /* @__PURE__ */ p("button", {
197
+ ].map((e) => /* @__PURE__ */ y("button", {
194
198
  onClick: () => t(e.path),
195
199
  style: {
196
200
  display: "flex",
@@ -212,21 +216,21 @@ var m = l`
212
216
  }, e.path))
213
217
  })]
214
218
  }),
215
- /* @__PURE__ */ p("div", { children: [/* @__PURE__ */ p("div", {
219
+ /* @__PURE__ */ y("div", { children: [/* @__PURE__ */ y("div", {
216
220
  style: {
217
221
  display: "flex",
218
222
  justifyContent: "space-between",
219
223
  alignItems: "center",
220
224
  marginBottom: 12
221
225
  },
222
- children: [/* @__PURE__ */ f("h2", {
226
+ children: [/* @__PURE__ */ v("h2", {
223
227
  style: {
224
228
  fontSize: "var(--font-size-body-md)",
225
229
  fontWeight: "var(--font-weight-semibold)",
226
230
  color: "var(--color-text-primary)"
227
231
  },
228
- children: _("bigconsole.home.recentDashboards.title", "Recent Dashboards")
229
- }), /* @__PURE__ */ p("button", {
232
+ children: C("bigconsole.home.recentDashboards.title", "Recent Dashboards")
233
+ }), /* @__PURE__ */ y("button", {
230
234
  onClick: () => t("/dashboards"),
231
235
  style: {
232
236
  display: "flex",
@@ -241,61 +245,41 @@ var m = l`
241
245
  cursor: "pointer"
242
246
  },
243
247
  children: [
244
- _("bigconsole.home.recentDashboards.viewAll", "View all"),
248
+ C("bigconsole.home.recentDashboards.viewAll", "View all"),
245
249
  " ",
246
- /* @__PURE__ */ f(r, { size: 14 })
250
+ /* @__PURE__ */ v(r, { size: 14 })
247
251
  ]
248
252
  })]
249
- }), x ? /* @__PURE__ */ f("div", {
253
+ }), D ? /* @__PURE__ */ v("div", {
250
254
  style: {
251
255
  textAlign: "center",
252
256
  padding: 24,
253
257
  color: "var(--color-text-muted)"
254
258
  },
255
- children: /* @__PURE__ */ f(c, {
259
+ children: /* @__PURE__ */ v(c, {
256
260
  size: 20,
257
261
  className: "animate-spin",
258
262
  style: { margin: "0 auto" }
259
263
  })
260
- }) : S.length === 0 ? /* @__PURE__ */ p("div", {
261
- style: {
262
- textAlign: "center",
263
- padding: 32,
264
- backgroundColor: "var(--color-bg-surface)",
265
- border: "1px solid var(--color-border)",
266
- borderRadius: "var(--radius-card)"
267
- },
268
- children: [
269
- /* @__PURE__ */ f(s, {
270
- size: 32,
271
- style: {
272
- color: "var(--color-text-muted)",
273
- margin: "0 auto 8px"
274
- }
275
- }),
276
- /* @__PURE__ */ f("p", {
277
- style: {
278
- color: "var(--color-text-secondary)",
279
- fontWeight: "var(--font-weight-medium)"
280
- },
281
- children: _("bigconsole.home.recentDashboards.emptyTitle", "No dashboards yet")
282
- }),
283
- /* @__PURE__ */ f("p", {
284
- style: {
285
- color: "var(--color-text-muted)",
286
- fontSize: "var(--font-size-body-sm)",
287
- marginTop: 4
288
- },
289
- children: _("bigconsole.home.recentDashboards.emptyDescription", "Create your first dashboard to get started")
264
+ }) : O.length === 0 ? /* @__PURE__ */ v(m, {
265
+ treatment: "insight",
266
+ className: "border-border-seam",
267
+ children: /* @__PURE__ */ v(g, {
268
+ illustration: "empty-data",
269
+ title: C("bigconsole.home.recentDashboards.emptyTitle", "No dashboards yet"),
270
+ description: C("bigconsole.home.recentDashboards.emptyDescription", "Create your first dashboard to get started"),
271
+ action: /* @__PURE__ */ v(p, {
272
+ onClick: () => t("/dashboards"),
273
+ children: C("bigconsole.home.quickActions.newDashboard", "New Dashboard")
290
274
  })
291
- ]
292
- }) : /* @__PURE__ */ f("div", {
275
+ })
276
+ }) : /* @__PURE__ */ v("div", {
293
277
  style: {
294
278
  display: "flex",
295
279
  flexDirection: "column",
296
280
  gap: 8
297
281
  },
298
- children: S.map((e) => /* @__PURE__ */ p("button", {
282
+ children: O.map((e) => /* @__PURE__ */ y("button", {
299
283
  onClick: () => t(`/dashboards/${e.id}`),
300
284
  style: {
301
285
  textAlign: "left",
@@ -308,21 +292,21 @@ var m = l`
308
292
  justifyContent: "space-between",
309
293
  alignItems: "center"
310
294
  },
311
- children: [/* @__PURE__ */ p("div", { children: [/* @__PURE__ */ f("div", {
295
+ children: [/* @__PURE__ */ y("div", { children: [/* @__PURE__ */ v("div", {
312
296
  style: {
313
297
  fontWeight: "var(--font-weight-medium)",
314
298
  fontSize: "var(--font-size-body-sm)",
315
299
  color: "var(--color-text-primary)"
316
300
  },
317
301
  children: e.name
318
- }), e.description && /* @__PURE__ */ f("div", {
302
+ }), e.description && /* @__PURE__ */ v("div", {
319
303
  style: {
320
304
  fontSize: 11,
321
305
  color: "var(--color-text-muted)",
322
306
  marginTop: 2
323
307
  },
324
308
  children: e.description.slice(0, 80)
325
- })] }), /* @__PURE__ */ f(r, {
309
+ })] }), /* @__PURE__ */ v(r, {
326
310
  size: 14,
327
311
  style: { color: "var(--color-text-muted)" }
328
312
  })]
@@ -333,6 +317,6 @@ var m = l`
333
317
  });
334
318
  });
335
319
  //#endregion
336
- export { _ as default };
320
+ export { C as default };
337
321
 
338
322
  //# sourceMappingURL=HomePage.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"HomePage.js","names":[],"sources":["../../../src/bigconsole/pages/HomePage.tsx"],"sourcesContent":["/**\n * HomePage\n *\n * BigConsole landing page showing workspace statistics and quick actions.\n */\n\nimport { type FC, memo, useCallback } from 'react';\nimport { gql } from '@apollo/client';\nimport { useQuery } from '@apollo/client/react';\nimport { useI18n } from '@burdenoff/fe-libs/shared/providers/shell/I18nProvider';\nimport { useAppNavigate } from '../contexts';\nimport { LayoutDashboard, Blocks, FileCode2, GitBranch, ArrowRight, Loader2 } from 'lucide-react';\n\n// ============================================================================\n// GRAPHQL RESPONSE TYPES\n// ============================================================================\n\ninterface HomepageStatsData {\n listDashboards: { totalCount: number };\n listDataSinks: { totalCount: number };\n // TODO: listParsers and listPipelines don't support totalCount pagination yet;\n // using array length as a fallback until the schema is updated.\n listParsers: Array<{ id: string }>;\n listPipelines: Array<{ id: string }>;\n}\n\ninterface RecentDashboardNode {\n id: string;\n name: string;\n description?: string;\n updatedAt: string;\n}\n\ninterface RecentDashboardsData {\n listDashboards: {\n edges: Array<{ node: RecentDashboardNode }>;\n };\n}\n\nconst HOMEPAGE_STATS = gql`\n query HomepageStats {\n listDashboards(first: 0) {\n totalCount\n }\n listDataSinks(first: 0) {\n totalCount\n }\n listParsers {\n id\n }\n listPipelines {\n id\n }\n }\n`;\n\nconst RECENT_DASHBOARDS = gql`\n query RecentDashboards {\n listDashboards(first: 5, sortBy: \"updatedAt\", sortOrder: \"desc\") {\n edges {\n node {\n id\n name\n description\n updatedAt\n }\n }\n }\n }\n`;\n\ninterface StatCardProps {\n icon: React.ReactNode;\n label: string;\n count: number | undefined;\n loading: boolean;\n path: string;\n onNavigate: (path: string) => void;\n}\n\nconst StatCard: FC<StatCardProps> = memo(function StatCard({ icon, label, count, loading, path, onNavigate }) {\n return (\n <button\n onClick={() => onNavigate(path)}\n style={{\n textAlign: 'left',\n padding: 'var(--space-cardPadding)',\n backgroundColor: 'var(--color-bg-surface)',\n border: '1px solid var(--color-border)',\n borderRadius: 'var(--radius-card)',\n cursor: 'pointer',\n transition: 'border-color 200ms',\n }}\n >\n <div style={{ display: 'flex', alignItems: 'center', gap: 8, marginBottom: 8 }}>\n <div style={{ color: 'var(--color-action-primary-bg)' }}>{icon}</div>\n <span style={{ fontSize: 'var(--font-size-body-sm)', color: 'var(--color-text-secondary)' }}>{label}</span>\n </div>\n <div\n style={{\n fontSize: 'var(--font-size-heading-h4)',\n fontWeight: 'var(--font-weight-bold)',\n color: 'var(--color-text-primary)',\n }}\n >\n {loading ? <Loader2 size={20} className=\"animate-spin\" /> : (count ?? 0)}\n </div>\n </button>\n );\n});\n\nexport const HomePage: FC = memo(function HomePage() {\n const navigate = useAppNavigate();\n const { t } = useI18n();\n const tr = useCallback(\n (key: string, fallback: string) => {\n const translated = t(key);\n return translated === key ? fallback : translated;\n },\n [t]\n );\n const { data: stats, loading: statsLoading } = useQuery<HomepageStatsData>(HOMEPAGE_STATS, {\n fetchPolicy: 'cache-and-network',\n });\n const { data: recentData, loading: recentLoading } = useQuery<RecentDashboardsData>(RECENT_DASHBOARDS, {\n fetchPolicy: 'cache-and-network',\n });\n\n const recentDashboards = recentData?.listDashboards?.edges?.map((e) => e.node) || [];\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 style={{ marginBottom: 'var(--space-sectionGap)' }}>\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 BigConsole\n </h1>\n <p style={{ fontSize: 'var(--font-size-body-md)', color: 'var(--color-text-secondary)', marginTop: 4 }}>\n {tr('bigconsole.home.subtitle', 'AI-powered analytics platform')}\n </p>\n </div>\n\n {/* Stats Grid */}\n <div\n style={{\n display: 'grid',\n gridTemplateColumns: 'repeat(auto-fit, minmax(180px, 1fr))',\n gap: 12,\n marginBottom: 'var(--space-sectionGap)',\n }}\n >\n <StatCard\n icon={<LayoutDashboard size={20} />}\n label={tr('bigconsole.home.stats.dashboards', 'Dashboards')}\n count={stats?.listDashboards?.totalCount}\n loading={statsLoading}\n path=\"/dashboards\"\n onNavigate={navigate}\n />\n <StatCard\n icon={<Blocks size={20} />}\n label={tr('bigconsole.home.stats.dataSinks', 'Data Sinks')}\n count={stats?.listDataSinks?.totalCount}\n loading={statsLoading}\n path=\"/datasinks\"\n onNavigate={navigate}\n />\n <StatCard\n icon={<FileCode2 size={20} />}\n label={tr('bigconsole.home.stats.parsers', 'Parsers')}\n count={stats?.listParsers?.length}\n loading={statsLoading}\n path=\"/parsers\"\n onNavigate={navigate}\n />\n <StatCard\n icon={<GitBranch size={20} />}\n label={tr('bigconsole.home.stats.pipelines', 'Pipelines')}\n count={stats?.listPipelines?.length}\n loading={statsLoading}\n path=\"/pipelines\"\n onNavigate={navigate}\n />\n </div>\n\n {/* Quick Actions */}\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 {tr('bigconsole.home.quickActions.title', 'Quick Actions')}\n </h2>\n <div style={{ display: 'flex', gap: 12, flexWrap: 'wrap' }}>\n {[\n {\n label: tr('bigconsole.home.quickActions.newDashboard', 'New Dashboard'),\n path: '/dashboards',\n icon: <LayoutDashboard size={14} />,\n },\n {\n label: tr('bigconsole.home.quickActions.newDataSink', 'New Data Sink'),\n path: '/datasinks/new',\n icon: <Blocks size={14} />,\n },\n {\n label: tr('bigconsole.home.quickActions.newParser', 'New Parser'),\n path: '/parsers/new',\n icon: <FileCode2 size={14} />,\n },\n {\n label: tr('bigconsole.home.quickActions.newPipeline', 'New Pipeline'),\n path: '/pipelines/new',\n icon: <GitBranch size={14} />,\n },\n ].map((action) => (\n <button\n key={action.path}\n onClick={() => navigate(action.path)}\n style={{\n display: 'flex',\n alignItems: 'center',\n gap: 6,\n padding: '8px 16px',\n borderRadius: 'var(--radius-button)',\n border: '1px solid var(--color-border)',\n backgroundColor: 'var(--color-bg-surface)',\n color: 'var(--color-text-primary)',\n fontSize: 'var(--font-size-body-sm)',\n cursor: 'pointer',\n }}\n >\n {action.icon} {action.label}\n </button>\n ))}\n </div>\n </div>\n\n {/* Recent Dashboards */}\n <div>\n <div style={{ display: 'flex', justifyContent: 'space-between', alignItems: 'center', marginBottom: 12 }}>\n <h2\n style={{\n fontSize: 'var(--font-size-body-md)',\n fontWeight: 'var(--font-weight-semibold)',\n color: 'var(--color-text-primary)',\n }}\n >\n {tr('bigconsole.home.recentDashboards.title', 'Recent Dashboards')}\n </h2>\n <button\n onClick={() => navigate('/dashboards')}\n style={{\n display: 'flex',\n alignItems: 'center',\n gap: 4,\n padding: '4px 8px',\n borderRadius: 'var(--radius-button)',\n border: 'none',\n backgroundColor: 'transparent',\n color: 'var(--color-action-primary-bg)',\n fontSize: 'var(--font-size-body-sm)',\n cursor: 'pointer',\n }}\n >\n {tr('bigconsole.home.recentDashboards.viewAll', 'View all')} <ArrowRight size={14} />\n </button>\n </div>\n\n {recentLoading ? (\n <div style={{ textAlign: 'center', padding: 24, color: 'var(--color-text-muted)' }}>\n <Loader2 size={20} className=\"animate-spin\" style={{ margin: '0 auto' }} />\n </div>\n ) : recentDashboards.length === 0 ? (\n <div\n style={{\n textAlign: 'center',\n padding: 32,\n backgroundColor: 'var(--color-bg-surface)',\n border: '1px solid var(--color-border)',\n borderRadius: 'var(--radius-card)',\n }}\n >\n <LayoutDashboard size={32} style={{ color: 'var(--color-text-muted)', margin: '0 auto 8px' }} />\n <p style={{ color: 'var(--color-text-secondary)', fontWeight: 'var(--font-weight-medium)' }}>\n {tr('bigconsole.home.recentDashboards.emptyTitle', 'No dashboards yet')}\n </p>\n <p style={{ color: 'var(--color-text-muted)', fontSize: 'var(--font-size-body-sm)', marginTop: 4 }}>\n {tr('bigconsole.home.recentDashboards.emptyDescription', 'Create your first dashboard to get started')}\n </p>\n </div>\n ) : (\n <div style={{ display: 'flex', flexDirection: 'column', gap: 8 }}>\n {recentDashboards.map((d) => (\n <button\n key={d.id}\n onClick={() => navigate(`/dashboards/${d.id}`)}\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 display: 'flex',\n justifyContent: 'space-between',\n alignItems: 'center',\n }}\n >\n <div>\n <div\n style={{\n fontWeight: 'var(--font-weight-medium)',\n fontSize: 'var(--font-size-body-sm)',\n color: 'var(--color-text-primary)',\n }}\n >\n {d.name}\n </div>\n {d.description && (\n <div style={{ fontSize: 11, color: 'var(--color-text-muted)', marginTop: 2 }}>\n {d.description.slice(0, 80)}\n </div>\n )}\n </div>\n <ArrowRight size={14} style={{ color: 'var(--color-text-muted)' }} />\n </button>\n ))}\n </div>\n )}\n </div>\n </div>\n </div>\n );\n});\n\nexport default HomePage;\n"],"mappings":"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"}
1
+ {"version":3,"file":"HomePage.js","names":[],"sources":["../../../src/bigconsole/pages/HomePage.tsx"],"sourcesContent":["/**\n * HomePage\n *\n * BigConsole landing page showing workspace statistics and quick actions.\n */\n\nimport { type FC, memo, useCallback } from 'react';\nimport { gql } from '@apollo/client';\nimport { useQuery } from '@apollo/client/react';\nimport { useI18n } from '@burdenoff/fe-libs/shared/providers/shell/I18nProvider';\nimport {\n AuroraBackground,\n GlassCard,\n GradientText,\n IllustratedEmptyState,\n Button,\n PagePurpose,\n} from '@burdenoff/fe-libs/ui';\nimport { useAppNavigate } from '../contexts';\nimport { LayoutDashboard, Blocks, FileCode2, GitBranch, ArrowRight, Loader2 } from 'lucide-react';\n\n// ============================================================================\n// GRAPHQL RESPONSE TYPES\n// ============================================================================\n\ninterface HomepageStatsData {\n listDashboards: { totalCount: number };\n listDataSinks: { totalCount: number };\n // TODO: listParsers and listPipelines don't support totalCount pagination yet;\n // using array length as a fallback until the schema is updated.\n listParsers: Array<{ id: string }>;\n listPipelines: Array<{ id: string }>;\n}\n\ninterface RecentDashboardNode {\n id: string;\n name: string;\n description?: string;\n updatedAt: string;\n}\n\ninterface RecentDashboardsData {\n listDashboards: {\n edges: Array<{ node: RecentDashboardNode }>;\n };\n}\n\nconst HOMEPAGE_STATS = gql`\n query HomepageStats {\n listDashboards(first: 0) {\n totalCount\n }\n listDataSinks(first: 0) {\n totalCount\n }\n listParsers {\n id\n }\n listPipelines {\n id\n }\n }\n`;\n\nconst RECENT_DASHBOARDS = gql`\n query RecentDashboards {\n listDashboards(first: 5, sortBy: \"updatedAt\", sortOrder: \"desc\") {\n edges {\n node {\n id\n name\n description\n updatedAt\n }\n }\n }\n }\n`;\n\ninterface StatCardProps {\n icon: React.ReactNode;\n label: string;\n count: number | undefined;\n loading: boolean;\n path: string;\n onNavigate: (path: string) => void;\n}\n\nconst StatCard: FC<StatCardProps & { hero?: boolean }> = memo(function StatCard({\n icon,\n label,\n count,\n loading,\n path,\n onNavigate,\n hero = false,\n}) {\n return (\n <GlassCard treatment={hero ? 'glass' : 'metric'} glow={hero} className=\"border-border-seam p-0\">\n <button\n type=\"button\"\n onClick={() => onNavigate(path)}\n className=\"flex w-full flex-col gap-2 rounded-card p-[var(--space-cardPadding)] text-left focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-[var(--color-focus-ring)]\"\n >\n <div className=\"flex items-center gap-2\">\n <div style={{ color: 'var(--color-action-primary-bg)' }}>{icon}</div>\n <span style={{ fontSize: 'var(--font-size-body-sm)', color: 'var(--color-text-secondary)' }}>{label}</span>\n </div>\n <div\n className=\"tabular-nums\"\n style={{\n fontSize: 'var(--font-size-heading-h4)',\n fontWeight: 'var(--font-weight-bold)',\n color: 'var(--color-text-primary)',\n }}\n >\n {loading ? <Loader2 size={20} className=\"animate-spin\" /> : (count ?? 0)}\n </div>\n </button>\n </GlassCard>\n );\n});\n\nexport const HomePage: FC = memo(function HomePage() {\n const navigate = useAppNavigate();\n const { t } = useI18n();\n const tr = useCallback(\n (key: string, fallback: string) => {\n const translated = t(key);\n return translated === key ? fallback : translated;\n },\n [t]\n );\n const { data: stats, loading: statsLoading } = useQuery<HomepageStatsData>(HOMEPAGE_STATS, {\n fetchPolicy: 'cache-and-network',\n });\n const { data: recentData, loading: recentLoading } = useQuery<RecentDashboardsData>(RECENT_DASHBOARDS, {\n fetchPolicy: 'cache-and-network',\n });\n\n const recentDashboards = recentData?.listDashboards?.edges?.map((e) => e.node) || [];\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 {/* Hero 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 <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>BigConsole</GradientText>\n </h1>\n <p style={{ fontSize: 'var(--font-size-body-md)', color: 'var(--color-text-secondary)', marginTop: 4 }}>\n {tr('bigconsole.home.subtitle', 'AI-powered analytics platform')}\n </p>\n </div>\n\n <PagePurpose className=\"mb-[var(--space-sectionGap)]\">\n {tr(\n 'bigconsole.home.purpose',\n 'BigConsole is your analytics command center — build live dashboards, wire up data sinks and parsers, then automate it all with pipelines and workflows. Start from the quick actions below or jump back into a recent dashboard.'\n )}\n </PagePurpose>\n\n {/* Stats Grid */}\n <div\n style={{\n display: 'grid',\n gridTemplateColumns: 'repeat(auto-fit, minmax(180px, 1fr))',\n gap: 12,\n marginBottom: 'var(--space-sectionGap)',\n }}\n >\n <StatCard\n hero\n icon={<LayoutDashboard size={20} />}\n label={tr('bigconsole.home.stats.dashboards', 'Dashboards')}\n count={stats?.listDashboards?.totalCount}\n loading={statsLoading}\n path=\"/dashboards\"\n onNavigate={navigate}\n />\n <StatCard\n icon={<Blocks size={20} />}\n label={tr('bigconsole.home.stats.dataSinks', 'Data Sinks')}\n count={stats?.listDataSinks?.totalCount}\n loading={statsLoading}\n path=\"/datasinks\"\n onNavigate={navigate}\n />\n <StatCard\n icon={<FileCode2 size={20} />}\n label={tr('bigconsole.home.stats.parsers', 'Parsers')}\n count={stats?.listParsers?.length}\n loading={statsLoading}\n path=\"/parsers\"\n onNavigate={navigate}\n />\n <StatCard\n icon={<GitBranch size={20} />}\n label={tr('bigconsole.home.stats.pipelines', 'Pipelines')}\n count={stats?.listPipelines?.length}\n loading={statsLoading}\n path=\"/pipelines\"\n onNavigate={navigate}\n />\n </div>\n\n {/* Quick Actions */}\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 {tr('bigconsole.home.quickActions.title', 'Quick Actions')}\n </h2>\n <div style={{ display: 'flex', gap: 12, flexWrap: 'wrap' }}>\n {[\n {\n label: tr('bigconsole.home.quickActions.newDashboard', 'New Dashboard'),\n path: '/dashboards',\n icon: <LayoutDashboard size={14} />,\n },\n {\n label: tr('bigconsole.home.quickActions.newDataSink', 'New Data Sink'),\n path: '/datasinks/new',\n icon: <Blocks size={14} />,\n },\n {\n label: tr('bigconsole.home.quickActions.newParser', 'New Parser'),\n path: '/parsers/new',\n icon: <FileCode2 size={14} />,\n },\n {\n label: tr('bigconsole.home.quickActions.newPipeline', 'New Pipeline'),\n path: '/pipelines/new',\n icon: <GitBranch size={14} />,\n },\n ].map((action) => (\n <button\n key={action.path}\n onClick={() => navigate(action.path)}\n style={{\n display: 'flex',\n alignItems: 'center',\n gap: 6,\n padding: '8px 16px',\n borderRadius: 'var(--radius-button)',\n border: '1px solid var(--color-border)',\n backgroundColor: 'var(--color-bg-surface)',\n color: 'var(--color-text-primary)',\n fontSize: 'var(--font-size-body-sm)',\n cursor: 'pointer',\n }}\n >\n {action.icon} {action.label}\n </button>\n ))}\n </div>\n </div>\n\n {/* Recent Dashboards */}\n <div>\n <div style={{ display: 'flex', justifyContent: 'space-between', alignItems: 'center', marginBottom: 12 }}>\n <h2\n style={{\n fontSize: 'var(--font-size-body-md)',\n fontWeight: 'var(--font-weight-semibold)',\n color: 'var(--color-text-primary)',\n }}\n >\n {tr('bigconsole.home.recentDashboards.title', 'Recent Dashboards')}\n </h2>\n <button\n onClick={() => navigate('/dashboards')}\n style={{\n display: 'flex',\n alignItems: 'center',\n gap: 4,\n padding: '4px 8px',\n borderRadius: 'var(--radius-button)',\n border: 'none',\n backgroundColor: 'transparent',\n color: 'var(--color-action-primary-bg)',\n fontSize: 'var(--font-size-body-sm)',\n cursor: 'pointer',\n }}\n >\n {tr('bigconsole.home.recentDashboards.viewAll', 'View all')} <ArrowRight size={14} />\n </button>\n </div>\n\n {recentLoading ? (\n <div style={{ textAlign: 'center', padding: 24, color: 'var(--color-text-muted)' }}>\n <Loader2 size={20} className=\"animate-spin\" style={{ margin: '0 auto' }} />\n </div>\n ) : recentDashboards.length === 0 ? (\n <GlassCard treatment=\"insight\" className=\"border-border-seam\">\n <IllustratedEmptyState\n illustration=\"empty-data\"\n title={tr('bigconsole.home.recentDashboards.emptyTitle', 'No dashboards yet')}\n description={tr(\n 'bigconsole.home.recentDashboards.emptyDescription',\n 'Create your first dashboard to get started'\n )}\n action={\n <Button onClick={() => navigate('/dashboards')}>\n {tr('bigconsole.home.quickActions.newDashboard', 'New Dashboard')}\n </Button>\n }\n />\n </GlassCard>\n ) : (\n <div style={{ display: 'flex', flexDirection: 'column', gap: 8 }}>\n {recentDashboards.map((d) => (\n <button\n key={d.id}\n onClick={() => navigate(`/dashboards/${d.id}`)}\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 display: 'flex',\n justifyContent: 'space-between',\n alignItems: 'center',\n }}\n >\n <div>\n <div\n style={{\n fontWeight: 'var(--font-weight-medium)',\n fontSize: 'var(--font-size-body-sm)',\n color: 'var(--color-text-primary)',\n }}\n >\n {d.name}\n </div>\n {d.description && (\n <div style={{ fontSize: 11, color: 'var(--color-text-muted)', marginTop: 2 }}>\n {d.description.slice(0, 80)}\n </div>\n )}\n </div>\n <ArrowRight size={14} style={{ color: 'var(--color-text-muted)' }} />\n </button>\n ))}\n </div>\n )}\n </div>\n </div>\n </div>\n );\n});\n\nexport default HomePage;\n"],"mappings":"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"}