@burdenoff/microfe-bigconsole 2026.805.2 → 2026.805.3

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 (134) hide show
  1. package/dist/bigconsole/components/builder/inspector/DataBindingSection.js +109 -113
  2. package/dist/bigconsole/components/builder/inspector/DataBindingSection.js.map +1 -1
  3. package/dist/bigconsole/components/dashboard/CreateDashboardDialog.js +115 -113
  4. package/dist/bigconsole/components/dashboard/CreateDashboardDialog.js.map +1 -1
  5. package/dist/bigconsole/components/dashboard/DashboardCanvas.js +71 -62
  6. package/dist/bigconsole/components/dashboard/DashboardCanvas.js.map +1 -1
  7. package/dist/bigconsole/components/dashboard/DashboardToolbar.js +90 -89
  8. package/dist/bigconsole/components/dashboard/DashboardToolbar.js.map +1 -1
  9. package/dist/bigconsole/components/dashboard/DrilldownBreadcrumb.js +56 -54
  10. package/dist/bigconsole/components/dashboard/DrilldownBreadcrumb.js.map +1 -1
  11. package/dist/bigconsole/components/dashboard/GlobalFiltersBar/FilterChip.js +126 -125
  12. package/dist/bigconsole/components/dashboard/GlobalFiltersBar/FilterChip.js.map +1 -1
  13. package/dist/bigconsole/components/dashboard/GlobalFiltersBar/FilterEditor.js +151 -150
  14. package/dist/bigconsole/components/dashboard/GlobalFiltersBar/FilterEditor.js.map +1 -1
  15. package/dist/bigconsole/components/dashboard/GlobalFiltersBar/FilterPresetSelector.js +77 -76
  16. package/dist/bigconsole/components/dashboard/GlobalFiltersBar/FilterPresetSelector.js.map +1 -1
  17. package/dist/bigconsole/components/dashboard/GlobalFiltersBar/GlobalFiltersBar.js +97 -96
  18. package/dist/bigconsole/components/dashboard/GlobalFiltersBar/GlobalFiltersBar.js.map +1 -1
  19. package/dist/bigconsole/components/dashboard/ImportDashboardDialog.js +172 -191
  20. package/dist/bigconsole/components/dashboard/ImportDashboardDialog.js.map +1 -1
  21. package/dist/bigconsole/components/dashboard/PublishToStoreDialog.js +75 -83
  22. package/dist/bigconsole/components/dashboard/PublishToStoreDialog.js.map +1 -1
  23. package/dist/bigconsole/components/dashboard/SavedViewsDropdown/SavedViewsDropdown.js +151 -154
  24. package/dist/bigconsole/components/dashboard/SavedViewsDropdown/SavedViewsDropdown.js.map +1 -1
  25. package/dist/bigconsole/components/dashboard/ShareDialog/EmbedTab.js +181 -190
  26. package/dist/bigconsole/components/dashboard/ShareDialog/EmbedTab.js.map +1 -1
  27. package/dist/bigconsole/components/dashboard/TemplatePicker/TemplatePicker.js +1 -0
  28. package/dist/bigconsole/components/dashboard/WidgetPalette.js +110 -108
  29. package/dist/bigconsole/components/dashboard/WidgetPalette.js.map +1 -1
  30. package/dist/bigconsole/components/datasink/CacheTTLSelector.js +102 -103
  31. package/dist/bigconsole/components/datasink/CacheTTLSelector.js.map +1 -1
  32. package/dist/bigconsole/components/datasink/DataSinkDeleteDialog.js +36 -41
  33. package/dist/bigconsole/components/datasink/DataSinkDeleteDialog.js.map +1 -1
  34. package/dist/bigconsole/components/datasink/DataSinkRefreshDialog.js +38 -37
  35. package/dist/bigconsole/components/datasink/DataSinkRefreshDialog.js.map +1 -1
  36. package/dist/bigconsole/components/datasink/ImportDataGuideDialog.js +113 -117
  37. package/dist/bigconsole/components/datasink/ImportDataGuideDialog.js.map +1 -1
  38. package/dist/bigconsole/components/datasink/ImportDataSinkDialog.js +182 -197
  39. package/dist/bigconsole/components/datasink/ImportDataSinkDialog.js.map +1 -1
  40. package/dist/bigconsole/components/datasink/RefreshTypeSelector.js +166 -168
  41. package/dist/bigconsole/components/datasink/RefreshTypeSelector.js.map +1 -1
  42. package/dist/bigconsole/components/parser/DataSinkSelector.js +87 -86
  43. package/dist/bigconsole/components/parser/DataSinkSelector.js.map +1 -1
  44. package/dist/bigconsole/components/parser/ImportParserDialog.js +196 -211
  45. package/dist/bigconsole/components/parser/ImportParserDialog.js.map +1 -1
  46. package/dist/bigconsole/components/parser/ParserSelector.js +130 -128
  47. package/dist/bigconsole/components/parser/ParserSelector.js.map +1 -1
  48. package/dist/bigconsole/components/preview/AiPreviewMiniPanel.js +66 -63
  49. package/dist/bigconsole/components/preview/AiPreviewMiniPanel.js.map +1 -1
  50. package/dist/bigconsole/components/preview/AiPreviewPanel.js +95 -91
  51. package/dist/bigconsole/components/preview/AiPreviewPanel.js.map +1 -1
  52. package/dist/bigconsole/components/widgets/ActionConfigDialog.js +222 -215
  53. package/dist/bigconsole/components/widgets/ActionConfigDialog.js.map +1 -1
  54. package/dist/bigconsole/components/widgets/DrilldownConfigPanel.js +149 -145
  55. package/dist/bigconsole/components/widgets/DrilldownConfigPanel.js.map +1 -1
  56. package/dist/bigconsole/components/widgets/PropertiesPanel.js +504 -470
  57. package/dist/bigconsole/components/widgets/PropertiesPanel.js.map +1 -1
  58. package/dist/bigconsole/components/widgets/calendar/CalendarWidget.js +44 -47
  59. package/dist/bigconsole/components/widgets/calendar/CalendarWidget.js.map +1 -1
  60. package/dist/bigconsole/components/widgets/chart/ChartConfig.js +143 -142
  61. package/dist/bigconsole/components/widgets/chart/ChartConfig.js.map +1 -1
  62. package/dist/bigconsole/components/widgets/comments/WidgetComments.js +101 -88
  63. package/dist/bigconsole/components/widgets/comments/WidgetComments.js.map +1 -1
  64. package/dist/bigconsole/components/widgets/event-logs/EventLogViewer.js +135 -134
  65. package/dist/bigconsole/components/widgets/event-logs/EventLogViewer.js.map +1 -1
  66. package/dist/bigconsole/components/widgets/form/FormWidget.js +167 -159
  67. package/dist/bigconsole/components/widgets/form/FormWidget.js.map +1 -1
  68. package/dist/bigconsole/components/widgets/gauge/GaugeConfig.js +69 -68
  69. package/dist/bigconsole/components/widgets/gauge/GaugeConfig.js.map +1 -1
  70. package/dist/bigconsole/components/widgets/heatmap/HeatmapConfig.js +64 -72
  71. package/dist/bigconsole/components/widgets/heatmap/HeatmapConfig.js.map +1 -1
  72. package/dist/bigconsole/components/widgets/kanban/KanbanWidget.js +60 -59
  73. package/dist/bigconsole/components/widgets/kanban/KanbanWidget.js.map +1 -1
  74. package/dist/bigconsole/components/widgets/list/ListConfig.js +57 -56
  75. package/dist/bigconsole/components/widgets/list/ListConfig.js.map +1 -1
  76. package/dist/bigconsole/components/widgets/metric-card/MetricCardConfig.js +70 -69
  77. package/dist/bigconsole/components/widgets/metric-card/MetricCardConfig.js.map +1 -1
  78. package/dist/bigconsole/components/widgets/metric-card/SparklineChart.js +35 -34
  79. package/dist/bigconsole/components/widgets/metric-card/SparklineChart.js.map +1 -1
  80. package/dist/bigconsole/components/widgets/metric-card/TrendIndicator.js +20 -19
  81. package/dist/bigconsole/components/widgets/metric-card/TrendIndicator.js.map +1 -1
  82. package/dist/bigconsole/components/widgets/pivot-table/PivotTableWidget.js +178 -177
  83. package/dist/bigconsole/components/widgets/pivot-table/PivotTableWidget.js.map +1 -1
  84. package/dist/bigconsole/components/widgets/progress/ProgressConfig.js +76 -75
  85. package/dist/bigconsole/components/widgets/progress/ProgressConfig.js.map +1 -1
  86. package/dist/bigconsole/components/widgets/table/TableConfig.js +183 -168
  87. package/dist/bigconsole/components/widgets/table/TableConfig.js.map +1 -1
  88. package/dist/bigconsole/components/widgets/webhook-config/WebhookConfigPanel.js +187 -180
  89. package/dist/bigconsole/components/widgets/webhook-config/WebhookConfigPanel.js.map +1 -1
  90. package/dist/bigconsole/customWidget/CustomWidgetBuilderSheet.js +40 -38
  91. package/dist/bigconsole/customWidget/CustomWidgetBuilderSheet.js.map +1 -1
  92. package/dist/bigconsole/customWidget/CustomWidgetProposalPanel.js +150 -148
  93. package/dist/bigconsole/customWidget/CustomWidgetProposalPanel.js.map +1 -1
  94. package/dist/bigconsole/pages/DashboardBuilderPage.js +181 -176
  95. package/dist/bigconsole/pages/DashboardBuilderPage.js.map +1 -1
  96. package/dist/bigconsole/pages/DashboardViewPage.js +196 -192
  97. package/dist/bigconsole/pages/DashboardViewPage.js.map +1 -1
  98. package/dist/bigconsole/pages/DashboardsPage.js +223 -219
  99. package/dist/bigconsole/pages/DashboardsPage.js.map +1 -1
  100. package/dist/bigconsole/pages/DataParsersPage.js +167 -170
  101. package/dist/bigconsole/pages/DataParsersPage.js.map +1 -1
  102. package/dist/bigconsole/pages/DataSinkBuilderPage.js +204 -189
  103. package/dist/bigconsole/pages/DataSinkBuilderPage.js.map +1 -1
  104. package/dist/bigconsole/pages/DataSinkViewPage.js +175 -169
  105. package/dist/bigconsole/pages/DataSinkViewPage.js.map +1 -1
  106. package/dist/bigconsole/pages/DataSourcesPage.js +8 -7
  107. package/dist/bigconsole/pages/DataSourcesPage.js.map +1 -1
  108. package/dist/bigconsole/pages/InsightsPage.js +238 -208
  109. package/dist/bigconsole/pages/InsightsPage.js.map +1 -1
  110. package/dist/bigconsole/pages/ParserBuilderPage.js +464 -412
  111. package/dist/bigconsole/pages/ParserBuilderPage.js.map +1 -1
  112. package/dist/bigconsole/pages/ParserViewPage.js +92 -90
  113. package/dist/bigconsole/pages/ParserViewPage.js.map +1 -1
  114. package/dist/bigconsole/pages/PipelineBuilderPage.js +221 -194
  115. package/dist/bigconsole/pages/PipelineBuilderPage.js.map +1 -1
  116. package/dist/bigconsole/pages/PipelineViewPage.js +181 -184
  117. package/dist/bigconsole/pages/PipelineViewPage.js.map +1 -1
  118. package/dist/bigconsole/pages/PipelinesPage.js +128 -127
  119. package/dist/bigconsole/pages/PipelinesPage.js.map +1 -1
  120. package/dist/bigconsole/pages/SettingsPage.js +177 -172
  121. package/dist/bigconsole/pages/SettingsPage.js.map +1 -1
  122. package/dist/bigconsole/pages/WidgetDemoPage.js +121 -83
  123. package/dist/bigconsole/pages/WidgetDemoPage.js.map +1 -1
  124. package/dist/bigconsole/pages/WorkflowViewPage.js +199 -193
  125. package/dist/bigconsole/pages/WorkflowViewPage.js.map +1 -1
  126. package/dist/bigconsole/pages/WorkflowsPage.js +129 -128
  127. package/dist/bigconsole/pages/WorkflowsPage.js.map +1 -1
  128. package/dist/bigconsole/renderers/adapters/AdaptiveCardRenderer.js +111 -109
  129. package/dist/bigconsole/renderers/adapters/AdaptiveCardRenderer.js.map +1 -1
  130. package/dist/bigconsole/renderers/adapters/BlockKitRenderer.js +127 -126
  131. package/dist/bigconsole/renderers/adapters/BlockKitRenderer.js.map +1 -1
  132. package/dist/bigconsole/renderers/adapters/CustomRenderer.js +103 -103
  133. package/dist/bigconsole/renderers/adapters/CustomRenderer.js.map +1 -1
  134. package/package.json +2 -1
@@ -10,67 +10,89 @@ import { memo as c, useCallback as l, useMemo as u, useState as d } from "react"
10
10
  import { AccessDenied as f, PermissionButton as p } from "@burdenoff/fe-libs/shared/components";
11
11
  import { usePermissions as m } from "@burdenoff/fe-libs/shared/providers/shell";
12
12
  import { AlertCircle as h, GitBranch as g, Plus as _, Search as v } from "lucide-react";
13
- import { AuroraBackground as y, Button as b, Card as x, CardContent as S, GlassCard as C, GradientText as w, IllustratedEmptyState as T, Input as E, PagePurpose as D, Spinner as O } from "@burdenoff/fe-libs/ui";
14
- import { jsx as k, jsxs as A } from "react/jsx-runtime";
13
+ import { useI18n as y } from "@burdenoff/fe-libs/shared/providers/shell/I18nProvider";
14
+ import { AuroraBackground as b, Button as x, Card as S, CardContent as C, GlassCard as w, GradientText as T, IllustratedEmptyState as E, Input as D, PagePurpose as O, Spinner as k } from "@burdenoff/fe-libs/ui";
15
+ import { jsx as A, jsxs as j } from "react/jsx-runtime";
15
16
  //#region src/bigconsole/pages/PipelinesPage.tsx
16
- var j = c(function() {
17
- let c = t(), { hasPermission: j, isLoading: M } = m(), N = j(r.PIPELINE_READ), P = j(r.PIPELINE_UPDATE), F = j(r.PIPELINE_DELETE), I = j(r.PIPELINE_TEST), [L, R] = d("all"), z = e((e) => e.searchQuery), B = e((e) => e.setSearchQuery), V = e((e) => e.deleteDialogOpen), H = e((e) => e.currentPipeline), U = e((e) => e.openDeleteDialog), W = e((e) => e.closeDeleteDialog), { loading: G, error: K, pipelines: q, deletePipeline: J, refetch: Y } = n({ consoleId: "default" }), X = u(() => {
18
- let e = [...q];
19
- if (L !== "all" && (e = e.filter((e) => e.status === L)), z.trim()) {
20
- let t = z.toLowerCase();
17
+ var M = c(function() {
18
+ let c = t(), { t: M } = y(), { hasPermission: N, isLoading: P } = m(), F = N(r.PIPELINE_READ), I = N(r.PIPELINE_UPDATE), L = N(r.PIPELINE_DELETE), R = N(r.PIPELINE_TEST), [z, B] = d("all"), V = e((e) => e.searchQuery), H = e((e) => e.setSearchQuery), U = e((e) => e.deleteDialogOpen), W = e((e) => e.currentPipeline), G = e((e) => e.openDeleteDialog), K = e((e) => e.closeDeleteDialog), { loading: q, error: J, pipelines: Y, deletePipeline: X, refetch: Z } = n({ consoleId: "default" }), Q = u(() => {
19
+ let e = [...Y];
20
+ if (z !== "all" && (e = e.filter((e) => e.status === z)), V.trim()) {
21
+ let t = V.toLowerCase();
21
22
  e = e.filter((e) => e.name.toLowerCase().includes(t) || e.description?.toLowerCase().includes(t));
22
23
  }
23
24
  return e.sort((e, t) => new Date(t.updatedAt).getTime() - new Date(e.updatedAt).getTime());
24
25
  }, [
25
- q,
26
- L,
27
- z
28
- ]), Z = l(() => {
26
+ Y,
27
+ z,
28
+ V
29
+ ]), $ = l(() => {
29
30
  c("/pipelines/new");
30
- }, [c]), Q = l((e) => {
31
+ }, [c]), ee = l((e) => {
31
32
  c(`/pipelines/${e}`);
32
- }, [c]), $ = l((e) => {
33
+ }, [c]), te = l((e) => {
33
34
  c(`/pipelines/${e}/edit`);
34
- }, [c]), ee = l((e) => {
35
+ }, [c]), ne = l((e) => {
35
36
  c(`/pipelines/${e}?test=true`);
36
- }, [c]), te = l((e) => {
37
- let t = q.find((t) => t.id === e);
38
- t && U(t);
39
- }, [q, U]), ne = l(async () => {
40
- if (H) {
37
+ }, [c]), re = l((e) => {
38
+ let t = Y.find((t) => t.id === e);
39
+ t && G(t);
40
+ }, [Y, G]), ie = l(async () => {
41
+ if (W) {
41
42
  try {
42
- await J(H.id), i() && a("success");
43
+ await X(W.id), i() && a("success");
43
44
  } catch (e) {
44
45
  throw i() && a("error"), e;
45
46
  }
46
- W();
47
+ K();
47
48
  }
48
49
  }, [
49
- H,
50
- J,
51
- W
52
- ]);
53
- return M ? /* @__PURE__ */ k("div", {
50
+ W,
51
+ X,
52
+ K
53
+ ]), ae = [
54
+ {
55
+ value: "all",
56
+ label: M("bigconsole.pipelines.filters.all", "All")
57
+ },
58
+ {
59
+ value: "draft",
60
+ label: M("bigconsole.pipelines.filters.draft", "Draft")
61
+ },
62
+ {
63
+ value: "active",
64
+ label: M("bigconsole.pipelines.filters.active", "Active")
65
+ },
66
+ {
67
+ value: "inactive",
68
+ label: M("bigconsole.pipelines.filters.inactive", "Inactive")
69
+ },
70
+ {
71
+ value: "error",
72
+ label: M("bigconsole.pipelines.filters.error", "Error")
73
+ }
74
+ ];
75
+ return P ? /* @__PURE__ */ A("div", {
54
76
  style: {
55
77
  display: "flex",
56
78
  alignItems: "center",
57
79
  justifyContent: "center",
58
80
  padding: "80px 0"
59
81
  },
60
- children: /* @__PURE__ */ k(O, { style: {
82
+ children: /* @__PURE__ */ A(k, { style: {
61
83
  height: "var(--size-icon-xl)",
62
84
  width: "var(--size-icon-xl)"
63
85
  } })
64
- }) : N ? K ? /* @__PURE__ */ k("div", {
86
+ }) : F ? J ? /* @__PURE__ */ A("div", {
65
87
  style: { padding: "var(--space-pagePadding)" },
66
- children: /* @__PURE__ */ k(x, {
88
+ children: /* @__PURE__ */ A(S, {
67
89
  style: {
68
90
  borderColor: "var(--color-status-error-border)",
69
91
  backgroundColor: "var(--color-status-error-bgSubtle)"
70
92
  },
71
- children: /* @__PURE__ */ k(S, {
93
+ children: /* @__PURE__ */ A(C, {
72
94
  style: { padding: "var(--space-pagePadding)" },
73
- children: /* @__PURE__ */ A("div", {
95
+ children: /* @__PURE__ */ j("div", {
74
96
  style: {
75
97
  display: "flex",
76
98
  flexDirection: "column",
@@ -78,68 +100,68 @@ var j = c(function() {
78
100
  textAlign: "center"
79
101
  },
80
102
  children: [
81
- /* @__PURE__ */ k("div", {
103
+ /* @__PURE__ */ A("div", {
82
104
  style: {
83
105
  padding: "var(--space-controlGap)",
84
106
  borderRadius: "50%",
85
107
  backgroundColor: "var(--color-status-error-bgSubtle)",
86
108
  marginBottom: "var(--space-formGap)"
87
109
  },
88
- children: /* @__PURE__ */ k(h, { style: {
110
+ children: /* @__PURE__ */ A(h, { style: {
89
111
  height: "var(--size-icon-xl)",
90
112
  width: "var(--size-icon-xl)",
91
113
  color: "var(--color-status-error-text)"
92
114
  } })
93
115
  }),
94
- /* @__PURE__ */ k("h3", {
116
+ /* @__PURE__ */ A("h3", {
95
117
  style: {
96
118
  fontSize: "var(--font-size-body-lg)",
97
119
  fontWeight: "var(--font-weight-medium)",
98
120
  color: "var(--color-status-error-text)",
99
121
  marginBottom: "var(--space-controlGap)"
100
122
  },
101
- children: "Failed to load Pipelines"
123
+ children: M("bigconsole.pipelines.errors.loadListTitle", "Failed to load Pipelines")
102
124
  }),
103
- /* @__PURE__ */ k("p", {
125
+ /* @__PURE__ */ A("p", {
104
126
  style: {
105
127
  fontSize: "var(--font-size-body-sm)",
106
128
  color: "var(--color-text-secondary)",
107
129
  marginBottom: "var(--space-formGap)"
108
130
  },
109
- children: K.message
131
+ children: J.message
110
132
  }),
111
- /* @__PURE__ */ k(b, {
133
+ /* @__PURE__ */ A(x, {
112
134
  size: "sm",
113
- onClick: () => Y(),
114
- children: "Try Again"
135
+ onClick: () => Z(),
136
+ children: M("bigconsole.pipelines.actions.tryAgain", "Try Again")
115
137
  })
116
138
  ]
117
139
  })
118
140
  })
119
141
  })
120
- }) : /* @__PURE__ */ A("div", {
142
+ }) : /* @__PURE__ */ j("div", {
121
143
  style: {
122
144
  minHeight: "100vh",
123
145
  backgroundColor: "var(--color-bg-canvas)"
124
146
  },
125
147
  children: [
126
- /* @__PURE__ */ A("div", {
148
+ /* @__PURE__ */ j("div", {
127
149
  className: "relative overflow-hidden border-b border-border-seam bg-gloss-card",
128
- children: [/* @__PURE__ */ k(y, { intensity: "subtle" }), /* @__PURE__ */ k("div", {
150
+ children: [/* @__PURE__ */ A(b, { intensity: "subtle" }), /* @__PURE__ */ A("div", {
129
151
  style: { padding: "var(--space-pagePadding)" },
130
- children: /* @__PURE__ */ A("div", {
152
+ children: /* @__PURE__ */ j("div", {
131
153
  style: {
132
154
  display: "flex",
133
155
  alignItems: "center",
134
156
  justifyContent: "space-between"
135
157
  },
136
- children: [/* @__PURE__ */ A("div", {
158
+ children: [/* @__PURE__ */ j("div", {
137
159
  style: {
138
160
  display: "flex",
139
161
  alignItems: "center",
140
162
  gap: "var(--space-formGap)"
141
163
  },
142
- children: [/* @__PURE__ */ k("div", {
164
+ children: [/* @__PURE__ */ A("div", {
143
165
  style: {
144
166
  display: "flex",
145
167
  height: "var(--size-controlHeight-lg)",
@@ -149,52 +171,52 @@ var j = c(function() {
149
171
  borderRadius: "var(--radius-card)",
150
172
  backgroundColor: "var(--color-action-primary-bg)"
151
173
  },
152
- children: /* @__PURE__ */ k(g, { style: {
174
+ children: /* @__PURE__ */ A(g, { style: {
153
175
  height: "var(--size-icon-lg)",
154
176
  width: "var(--size-icon-lg)",
155
177
  color: "var(--color-action-primary-text)"
156
178
  } })
157
- }), /* @__PURE__ */ A("div", { children: [/* @__PURE__ */ k("h1", {
179
+ }), /* @__PURE__ */ j("div", { children: [/* @__PURE__ */ A("h1", {
158
180
  style: {
159
181
  fontSize: "var(--font-size-heading-h4)",
160
182
  fontWeight: "var(--font-weight-bold)",
161
183
  margin: 0,
162
184
  color: "var(--color-text-primary)"
163
185
  },
164
- children: /* @__PURE__ */ k(w, { children: "Pipelines" })
165
- }), /* @__PURE__ */ k("p", {
186
+ children: /* @__PURE__ */ A(T, { children: M("bigconsole.pipelines.list.heading", "Pipelines") })
187
+ }), /* @__PURE__ */ A("p", {
166
188
  style: {
167
189
  fontSize: "var(--font-size-body-sm)",
168
190
  color: "var(--color-text-secondary)",
169
191
  margin: 0
170
192
  },
171
- children: "Create and manage sequential parser chains for data transformation"
193
+ children: M("bigconsole.pipelines.list.subtitle", "Create and manage sequential parser chains for data transformation")
172
194
  })] })]
173
- }), /* @__PURE__ */ k(p, {
195
+ }), /* @__PURE__ */ A(p, {
174
196
  permission: r.PIPELINE_CREATE,
175
197
  deniedBehavior: "disable",
176
- children: /* @__PURE__ */ A(b, {
177
- onClick: Z,
178
- children: [/* @__PURE__ */ k(_, { style: {
198
+ children: /* @__PURE__ */ j(x, {
199
+ onClick: $,
200
+ children: [/* @__PURE__ */ A(_, { style: {
179
201
  marginRight: "var(--space-iconGap)",
180
202
  height: "var(--size-icon-sm)",
181
203
  width: "var(--size-icon-sm)"
182
- } }), "Create Pipeline"]
204
+ } }), M("bigconsole.pipelines.actions.createPipeline", "Create Pipeline")]
183
205
  })
184
206
  })]
185
207
  })
186
208
  })]
187
209
  }),
188
- /* @__PURE__ */ A("div", {
210
+ /* @__PURE__ */ j("div", {
189
211
  style: { padding: "var(--space-pagePadding)" },
190
212
  children: [
191
- /* @__PURE__ */ k(D, {
213
+ /* @__PURE__ */ A(O, {
192
214
  className: "mb-[var(--space-sectionGap)]",
193
- children: "Pipelines chain parsers and data sinks into a repeatable flow — they take raw input, run it through your parsers, and route the structured result into a sink. Use them to turn messy logs, files, or API payloads into clean, queryable data your dashboards can use."
215
+ children: M("bigconsole.pipelines.list.purpose", "Pipelines chain parsers and data sinks into a repeatable flow — they take raw input, run it through your parsers, and route the structured result into a sink. Use them to turn messy logs, files, or API payloads into clean, queryable data your dashboards can use.")
194
216
  }),
195
- /* @__PURE__ */ k("div", {
217
+ /* @__PURE__ */ A("div", {
196
218
  style: { marginBottom: "var(--space-formGap)" },
197
- children: /* @__PURE__ */ k("div", {
219
+ children: /* @__PURE__ */ A("div", {
198
220
  style: {
199
221
  display: "flex",
200
222
  alignItems: "center",
@@ -204,30 +226,9 @@ var j = c(function() {
204
226
  borderRadius: "var(--radius-card)",
205
227
  width: "fit-content"
206
228
  },
207
- children: [
208
- {
209
- value: "all",
210
- label: "All"
211
- },
212
- {
213
- value: "draft",
214
- label: "Draft"
215
- },
216
- {
217
- value: "active",
218
- label: "Active"
219
- },
220
- {
221
- value: "inactive",
222
- label: "Inactive"
223
- },
224
- {
225
- value: "error",
226
- label: "Error"
227
- }
228
- ].map((e) => /* @__PURE__ */ k("button", {
229
+ children: ae.map((e) => /* @__PURE__ */ A("button", {
229
230
  type: "button",
230
- onClick: () => R(e.value),
231
+ onClick: () => B(e.value),
231
232
  style: {
232
233
  padding: "var(--space-controlGap) var(--space-formGap)",
233
234
  fontSize: "var(--font-size-body-sm)",
@@ -236,22 +237,22 @@ var j = c(function() {
236
237
  border: "none",
237
238
  cursor: "pointer",
238
239
  transition: "all 0.2s ease",
239
- backgroundColor: L === e.value ? "var(--color-bg-surface)" : "transparent",
240
- color: L === e.value ? "var(--color-text-primary)" : "var(--color-text-secondary)",
241
- boxShadow: L === e.value ? "0 1px 2px rgba(0,0,0,0.05)" : "none"
240
+ backgroundColor: z === e.value ? "var(--color-bg-surface)" : "transparent",
241
+ color: z === e.value ? "var(--color-text-primary)" : "var(--color-text-secondary)",
242
+ boxShadow: z === e.value ? "0 1px 2px rgba(0,0,0,0.05)" : "none"
242
243
  },
243
244
  children: e.label
244
245
  }, e.value))
245
246
  })
246
247
  }),
247
- /* @__PURE__ */ k("div", {
248
+ /* @__PURE__ */ A("div", {
248
249
  style: { marginBottom: "var(--space-sectionGap)" },
249
- children: /* @__PURE__ */ A("div", {
250
+ children: /* @__PURE__ */ j("div", {
250
251
  style: {
251
252
  position: "relative",
252
253
  maxWidth: "400px"
253
254
  },
254
- children: [/* @__PURE__ */ k(v, { style: {
255
+ children: [/* @__PURE__ */ A(v, { style: {
255
256
  position: "absolute",
256
257
  left: "var(--space-controlGap)",
257
258
  top: "50%",
@@ -259,11 +260,11 @@ var j = c(function() {
259
260
  height: "var(--size-icon-sm)",
260
261
  width: "var(--size-icon-sm)",
261
262
  color: "var(--color-text-muted)"
262
- } }), /* @__PURE__ */ k(E, {
263
+ } }), /* @__PURE__ */ A(D, {
263
264
  type: "text",
264
- placeholder: "Search pipelines...",
265
- value: z,
266
- onChange: (e) => B(e.target.value),
265
+ placeholder: M("bigconsole.pipelines.list.searchPlaceholder", "Search pipelines..."),
266
+ value: V,
267
+ onChange: (e) => H(e.target.value),
267
268
  style: {
268
269
  paddingLeft: "var(--size-controlHeight-md)",
269
270
  height: "var(--size-controlHeight-md)"
@@ -271,87 +272,87 @@ var j = c(function() {
271
272
  })]
272
273
  })
273
274
  }),
274
- G && q.length === 0 && /* @__PURE__ */ k("div", {
275
+ q && Y.length === 0 && /* @__PURE__ */ A("div", {
275
276
  style: {
276
277
  display: "flex",
277
278
  alignItems: "center",
278
279
  justifyContent: "center",
279
280
  padding: "80px 0"
280
281
  },
281
- children: /* @__PURE__ */ A("div", {
282
+ children: /* @__PURE__ */ j("div", {
282
283
  style: { textAlign: "center" },
283
- children: [/* @__PURE__ */ k(O, { style: {
284
+ children: [/* @__PURE__ */ A(k, { style: {
284
285
  height: "var(--size-icon-xl)",
285
286
  width: "var(--size-icon-xl)",
286
287
  margin: "0 auto var(--space-formGap)"
287
- } }), /* @__PURE__ */ k("p", {
288
+ } }), /* @__PURE__ */ A("p", {
288
289
  style: {
289
290
  fontSize: "var(--font-size-body-sm)",
290
291
  color: "var(--color-text-muted)"
291
292
  },
292
- children: "Loading pipelines..."
293
+ children: M("bigconsole.pipelines.list.loading", "Loading pipelines...")
293
294
  })]
294
295
  })
295
296
  }),
296
- !G && q.length === 0 && /* @__PURE__ */ k(C, {
297
+ !q && Y.length === 0 && /* @__PURE__ */ A(w, {
297
298
  treatment: "insight",
298
299
  className: "border-border-seam",
299
- children: /* @__PURE__ */ k(T, {
300
+ children: /* @__PURE__ */ A(E, {
300
301
  illustration: "empty-data",
301
- title: "No Pipelines yet",
302
- description: "Create a pipeline to chain parsers together for sequential data transformation. Each stage processes the output of the previous stage.",
303
- action: /* @__PURE__ */ k(p, {
302
+ title: M("bigconsole.pipelines.list.emptyTitle", "No Pipelines yet"),
303
+ description: M("bigconsole.pipelines.list.emptyDescription", "Create a pipeline to chain parsers together for sequential data transformation. Each stage processes the output of the previous stage."),
304
+ action: /* @__PURE__ */ A(p, {
304
305
  permission: r.PIPELINE_CREATE,
305
306
  deniedBehavior: "disable",
306
- children: /* @__PURE__ */ A(b, {
307
- onClick: Z,
308
- children: [/* @__PURE__ */ k(_, { style: {
307
+ children: /* @__PURE__ */ j(x, {
308
+ onClick: $,
309
+ children: [/* @__PURE__ */ A(_, { style: {
309
310
  marginRight: "var(--space-iconGap)",
310
311
  height: "var(--size-icon-sm)",
311
312
  width: "var(--size-icon-sm)"
312
- } }), "Create Pipeline"]
313
+ } }), M("bigconsole.pipelines.actions.createPipeline", "Create Pipeline")]
313
314
  })
314
315
  })
315
316
  })
316
317
  }),
317
- !G && X.length === 0 && q.length > 0 && /* @__PURE__ */ k(C, {
318
+ !q && Q.length === 0 && Y.length > 0 && /* @__PURE__ */ A(w, {
318
319
  treatment: "insight",
319
320
  className: "border-border-seam",
320
- children: /* @__PURE__ */ k(T, {
321
+ children: /* @__PURE__ */ A(E, {
321
322
  illustration: "empty-search",
322
- title: "No matching pipelines",
323
- description: "No pipelines match your filters"
323
+ title: M("bigconsole.pipelines.list.noResultsTitle", "No matching pipelines"),
324
+ description: M("bigconsole.pipelines.list.noResultsDescription", "No pipelines match your filters")
324
325
  })
325
326
  }),
326
- X.length > 0 && /* @__PURE__ */ k("div", {
327
+ Q.length > 0 && /* @__PURE__ */ A("div", {
327
328
  style: {
328
329
  display: "grid",
329
330
  gridTemplateColumns: "repeat(auto-fill, minmax(320px, 1fr))",
330
331
  gap: "var(--space-formGap)"
331
332
  },
332
- children: X.map((e) => /* @__PURE__ */ k(s, {
333
+ children: Q.map((e) => /* @__PURE__ */ A(s, {
333
334
  pipeline: e,
334
- onView: Q,
335
- onEdit: P ? $ : void 0,
336
- onTest: I ? ee : void 0,
337
- onDelete: F ? te : void 0
335
+ onView: ee,
336
+ onEdit: I ? te : void 0,
337
+ onTest: R ? ne : void 0,
338
+ onDelete: L ? re : void 0
338
339
  }, e.id))
339
340
  })
340
341
  ]
341
342
  }),
342
- H && /* @__PURE__ */ k(o, {
343
- pipeline: H,
344
- isOpen: V,
345
- onClose: W,
346
- onConfirm: ne
343
+ W && /* @__PURE__ */ A(o, {
344
+ pipeline: W,
345
+ isOpen: U,
346
+ onClose: K,
347
+ onConfirm: ie
347
348
  })
348
349
  ]
349
- }) : /* @__PURE__ */ k(f, {
350
- title: "Access Denied",
351
- description: "You don't have permission to view pipelines."
350
+ }) : /* @__PURE__ */ A(f, {
351
+ title: M("bigconsole.pipelines.errors.accessDeniedTitle", "Access Denied"),
352
+ description: M("bigconsole.pipelines.errors.accessDeniedListDescription", "You don't have permission to view pipelines.")
352
353
  });
353
354
  });
354
355
  //#endregion
355
- export { j as PipelinesPage, j as default };
356
+ export { M as PipelinesPage, M as default };
356
357
 
357
358
  //# sourceMappingURL=PipelinesPage.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"PipelinesPage.js","names":[],"sources":["../../../src/bigconsole/pages/PipelinesPage.tsx"],"sourcesContent":["/**\n * Pipelines Page\n *\n * List and manage Pipelines.\n * Uses fe-libs shared UI components and semantic tokens for consistent styling.\n */\n\nimport { memo, useState, useMemo, useCallback } from 'react';\nimport { useAppNavigate } from '../contexts';\nimport { isNative, nativeNotify } from '../../utils/nativeBridge';\nimport { usePipelineOperations } from '../hooks/usePipelineOperations';\nimport { usePipelineStore } from '../store/pipelineStore';\nimport { PipelineCard } from '../components/pipeline/PipelineCard';\nimport { PipelineDeleteDialog } from '../components/pipeline/PipelineDeleteDialog';\nimport type { PipelineStatus } from '../types';\n\n// fe-libs RBAC\nimport { usePermissions } from '@burdenoff/fe-libs/shared/providers/shell';\nimport { AccessDenied, PermissionButton } from '@burdenoff/fe-libs/shared/components';\nimport { BIGCONSOLE_PERMISSIONS } from '../../constants/permissions';\n\n// fe-libs UI components\nimport { Button } from '@burdenoff/fe-libs/ui';\nimport { Input } from '@burdenoff/fe-libs/ui';\nimport { Card, CardContent } from '@burdenoff/fe-libs/ui';\nimport { Spinner } from '@burdenoff/fe-libs/ui';\nimport { AuroraBackground, GradientText, GlassCard, IllustratedEmptyState, PagePurpose } from '@burdenoff/fe-libs/ui';\n\n// Lucide icons\nimport { Plus, Search, GitBranch, AlertCircle } from 'lucide-react';\n\n// ============================================================================\n// TYPES\n// ============================================================================\n\ntype StatusFilter = 'all' | PipelineStatus;\n\n// ============================================================================\n// COMPONENT\n// ============================================================================\n\nexport const PipelinesPage = memo(function PipelinesPage() {\n const navigate = useAppNavigate();\n\n // Permissions\n const { hasPermission, isLoading: permissionsLoading } = usePermissions();\n const canRead = hasPermission(BIGCONSOLE_PERMISSIONS.PIPELINE_READ);\n // Create is gated inline via <PermissionButton permission=PIPELINE_CREATE>.\n const canUpdate = hasPermission(BIGCONSOLE_PERMISSIONS.PIPELINE_UPDATE);\n const canDelete = hasPermission(BIGCONSOLE_PERMISSIONS.PIPELINE_DELETE);\n const canTest = hasPermission(BIGCONSOLE_PERMISSIONS.PIPELINE_TEST);\n\n // Local state\n const [statusFilter, setStatusFilter] = useState<StatusFilter>('all');\n\n // Store state\n const searchQuery = usePipelineStore((state) => state.searchQuery);\n const setSearchQuery = usePipelineStore((state) => state.setSearchQuery);\n const deleteDialogOpen = usePipelineStore((state) => state.deleteDialogOpen);\n const currentPipeline = usePipelineStore((state) => state.currentPipeline);\n const openDeleteDialog = usePipelineStore((state) => state.openDeleteDialog);\n const closeDeleteDialog = usePipelineStore((state) => state.closeDeleteDialog);\n\n // Operations\n const { loading, error, pipelines, deletePipeline, refetch } = usePipelineOperations({\n consoleId: 'default',\n });\n\n // Filter pipelines\n const filteredPipelines = useMemo(() => {\n let filtered = [...pipelines];\n\n // Apply status filter\n if (statusFilter !== 'all') {\n filtered = filtered.filter((p) => p.status === statusFilter);\n }\n\n // Apply search filter\n if (searchQuery.trim()) {\n const query = searchQuery.toLowerCase();\n filtered = filtered.filter(\n (p) => p.name.toLowerCase().includes(query) || p.description?.toLowerCase().includes(query)\n );\n }\n\n // Sort by updatedAt descending\n return filtered.sort((a, b) => new Date(b.updatedAt).getTime() - new Date(a.updatedAt).getTime());\n }, [pipelines, statusFilter, searchQuery]);\n\n // Handlers\n const handleCreatePipeline = useCallback(() => {\n navigate('/pipelines/new');\n }, [navigate]);\n\n const handleViewPipeline = useCallback(\n (id: string) => {\n navigate(`/pipelines/${id}`);\n },\n [navigate]\n );\n\n const handleEditPipeline = useCallback(\n (id: string) => {\n navigate(`/pipelines/${id}/edit`);\n },\n [navigate]\n );\n\n const handleTestPipeline = useCallback(\n (id: string) => {\n navigate(`/pipelines/${id}?test=true`);\n },\n [navigate]\n );\n\n const handleDeleteClick = useCallback(\n (id: string) => {\n const pipeline = pipelines.find((p) => p.id === id);\n if (pipeline) {\n openDeleteDialog(pipeline);\n }\n },\n [pipelines, openDeleteDialog]\n );\n\n const handleDeleteConfirm = useCallback(async () => {\n if (currentPipeline) {\n try {\n await deletePipeline(currentPipeline.id);\n if (isNative()) void nativeNotify('success');\n } catch (err) {\n if (isNative()) void nativeNotify('error');\n throw err;\n }\n closeDeleteDialog();\n }\n }, [currentPipeline, deletePipeline, closeDeleteDialog]);\n\n // Status filter options\n const statusOptions: { value: StatusFilter; label: string }[] = [\n { value: 'all', label: 'All' },\n { value: 'draft', label: 'Draft' },\n { value: 'active', label: 'Active' },\n { value: 'inactive', label: 'Inactive' },\n { value: 'error', label: 'Error' },\n ];\n\n // Permission gate — wait for permissions to resolve, then block callers\n // without pipeline read access before rendering the page body.\n if (permissionsLoading) {\n return (\n <div style={{ display: 'flex', alignItems: 'center', justifyContent: 'center', padding: '80px 0' }}>\n <Spinner\n style={{\n height: 'var(--size-icon-xl)',\n width: 'var(--size-icon-xl)',\n }}\n />\n </div>\n );\n }\n\n if (!canRead) {\n return <AccessDenied title=\"Access Denied\" description=\"You don't have permission to view pipelines.\" />;\n }\n\n // Error state\n if (error) {\n return (\n <div style={{ padding: 'var(--space-pagePadding)' }}>\n <Card\n style={{\n borderColor: 'var(--color-status-error-border)',\n backgroundColor: 'var(--color-status-error-bgSubtle)',\n }}\n >\n <CardContent style={{ padding: 'var(--space-pagePadding)' }}>\n <div style={{ display: 'flex', flexDirection: 'column', alignItems: 'center', textAlign: 'center' }}>\n <div\n style={{\n padding: 'var(--space-controlGap)',\n borderRadius: '50%',\n backgroundColor: 'var(--color-status-error-bgSubtle)',\n marginBottom: 'var(--space-formGap)',\n }}\n >\n <AlertCircle\n style={{\n height: 'var(--size-icon-xl)',\n width: 'var(--size-icon-xl)',\n color: 'var(--color-status-error-text)',\n }}\n />\n </div>\n <h3\n style={{\n fontSize: 'var(--font-size-body-lg)',\n fontWeight: 'var(--font-weight-medium)',\n color: 'var(--color-status-error-text)',\n marginBottom: 'var(--space-controlGap)',\n }}\n >\n Failed to load Pipelines\n </h3>\n <p\n style={{\n fontSize: 'var(--font-size-body-sm)',\n color: 'var(--color-text-secondary)',\n marginBottom: 'var(--space-formGap)',\n }}\n >\n {error.message}\n </p>\n <Button size=\"sm\" onClick={() => refetch()}>\n Try Again\n </Button>\n </div>\n </CardContent>\n </Card>\n </div>\n );\n }\n\n return (\n <div style={{ minHeight: '100vh', backgroundColor: 'var(--color-bg-canvas)' }}>\n {/* Header Section */}\n <div className=\"relative overflow-hidden border-b border-border-seam bg-gloss-card\">\n <AuroraBackground intensity=\"subtle\" />\n <div style={{ padding: 'var(--space-pagePadding)' }}>\n <div style={{ display: 'flex', alignItems: 'center', justifyContent: 'space-between' }}>\n <div style={{ display: 'flex', alignItems: 'center', gap: 'var(--space-formGap)' }}>\n <div\n style={{\n display: 'flex',\n height: 'var(--size-controlHeight-lg)',\n width: 'var(--size-controlHeight-lg)',\n alignItems: 'center',\n justifyContent: 'center',\n borderRadius: 'var(--radius-card)',\n backgroundColor: 'var(--color-action-primary-bg)',\n }}\n >\n <GitBranch\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>\n <h1\n style={{\n fontSize: 'var(--font-size-heading-h4)',\n fontWeight: 'var(--font-weight-bold)',\n margin: 0,\n color: 'var(--color-text-primary)',\n }}\n >\n <GradientText>Pipelines</GradientText>\n </h1>\n <p style={{ fontSize: 'var(--font-size-body-sm)', color: 'var(--color-text-secondary)', margin: 0 }}>\n Create and manage sequential parser chains for data transformation\n </p>\n </div>\n </div>\n\n <PermissionButton permission={BIGCONSOLE_PERMISSIONS.PIPELINE_CREATE} deniedBehavior=\"disable\">\n <Button onClick={handleCreatePipeline}>\n <Plus\n style={{\n marginRight: 'var(--space-iconGap)',\n height: 'var(--size-icon-sm)',\n width: 'var(--size-icon-sm)',\n }}\n />\n Create Pipeline\n </Button>\n </PermissionButton>\n </div>\n </div>\n </div>\n\n {/* Main Content */}\n <div style={{ padding: 'var(--space-pagePadding)' }}>\n <PagePurpose className=\"mb-[var(--space-sectionGap)]\">\n Pipelines chain parsers and data sinks into a repeatable flow — they take raw input, run it through your\n parsers, and route the structured result into a sink. Use them to turn messy logs, files, or API payloads into\n clean, queryable data your dashboards can use.\n </PagePurpose>\n\n {/* Status Filter Tabs */}\n <div style={{ marginBottom: 'var(--space-formGap)' }}>\n <div\n style={{\n display: 'flex',\n alignItems: 'center',\n gap: '2px',\n padding: '4px',\n backgroundColor: 'var(--color-bg-sunken)',\n borderRadius: 'var(--radius-card)',\n width: 'fit-content',\n }}\n >\n {statusOptions.map((option) => (\n <button\n key={option.value}\n type=\"button\"\n onClick={() => setStatusFilter(option.value)}\n style={{\n padding: 'var(--space-controlGap) var(--space-formGap)',\n fontSize: 'var(--font-size-body-sm)',\n fontWeight: 'var(--font-weight-medium)',\n borderRadius: 'var(--radius-button)',\n border: 'none',\n cursor: 'pointer',\n transition: 'all 0.2s ease',\n backgroundColor: statusFilter === option.value ? 'var(--color-bg-surface)' : 'transparent',\n color: statusFilter === option.value ? 'var(--color-text-primary)' : 'var(--color-text-secondary)',\n boxShadow: statusFilter === option.value ? '0 1px 2px rgba(0,0,0,0.05)' : 'none',\n }}\n >\n {option.label}\n </button>\n ))}\n </div>\n </div>\n\n {/* Search Bar */}\n <div style={{ marginBottom: 'var(--space-sectionGap)' }}>\n <div style={{ position: 'relative', maxWidth: '400px' }}>\n <Search\n style={{\n position: 'absolute',\n left: 'var(--space-controlGap)',\n top: '50%',\n transform: 'translateY(-50%)',\n height: 'var(--size-icon-sm)',\n width: 'var(--size-icon-sm)',\n color: 'var(--color-text-muted)',\n }}\n />\n <Input\n type=\"text\"\n placeholder=\"Search pipelines...\"\n value={searchQuery}\n onChange={(e) => setSearchQuery(e.target.value)}\n style={{ paddingLeft: 'var(--size-controlHeight-md)', height: 'var(--size-controlHeight-md)' }}\n />\n </div>\n </div>\n\n {/* Loading state */}\n {loading && pipelines.length === 0 && (\n <div style={{ display: 'flex', alignItems: 'center', justifyContent: 'center', padding: '80px 0' }}>\n <div style={{ textAlign: 'center' }}>\n <Spinner\n style={{\n height: 'var(--size-icon-xl)',\n width: 'var(--size-icon-xl)',\n margin: '0 auto var(--space-formGap)',\n }}\n />\n <p style={{ fontSize: 'var(--font-size-body-sm)', color: 'var(--color-text-muted)' }}>\n Loading pipelines...\n </p>\n </div>\n </div>\n )}\n\n {/* Empty state */}\n {!loading && pipelines.length === 0 && (\n <GlassCard treatment=\"insight\" className=\"border-border-seam\">\n <IllustratedEmptyState\n illustration=\"empty-data\"\n title=\"No Pipelines yet\"\n description=\"Create a pipeline to chain parsers together for sequential data transformation. Each stage processes the output of the previous stage.\"\n action={\n <PermissionButton permission={BIGCONSOLE_PERMISSIONS.PIPELINE_CREATE} deniedBehavior=\"disable\">\n <Button onClick={handleCreatePipeline}>\n <Plus\n style={{\n marginRight: 'var(--space-iconGap)',\n height: 'var(--size-icon-sm)',\n width: 'var(--size-icon-sm)',\n }}\n />\n Create Pipeline\n </Button>\n </PermissionButton>\n }\n />\n </GlassCard>\n )}\n\n {/* No results state */}\n {!loading && filteredPipelines.length === 0 && pipelines.length > 0 && (\n <GlassCard treatment=\"insight\" className=\"border-border-seam\">\n <IllustratedEmptyState\n illustration=\"empty-search\"\n title=\"No matching pipelines\"\n description=\"No pipelines match your filters\"\n />\n </GlassCard>\n )}\n\n {/* Pipeline Grid */}\n {filteredPipelines.length > 0 && (\n <div\n style={{\n display: 'grid',\n gridTemplateColumns: 'repeat(auto-fill, minmax(320px, 1fr))',\n gap: 'var(--space-formGap)',\n }}\n >\n {filteredPipelines.map((pipeline) => (\n <PipelineCard\n key={pipeline.id}\n pipeline={pipeline}\n onView={handleViewPipeline}\n onEdit={canUpdate ? handleEditPipeline : undefined}\n onTest={canTest ? handleTestPipeline : undefined}\n onDelete={canDelete ? handleDeleteClick : undefined}\n />\n ))}\n </div>\n )}\n </div>\n\n {/* Delete Dialog */}\n {currentPipeline && (\n <PipelineDeleteDialog\n pipeline={currentPipeline}\n isOpen={deleteDialogOpen}\n onClose={closeDeleteDialog}\n onConfirm={handleDeleteConfirm}\n />\n )}\n </div>\n );\n});\n\nexport default PipelinesPage;\n"],"mappings":"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"}
1
+ {"version":3,"file":"PipelinesPage.js","names":[],"sources":["../../../src/bigconsole/pages/PipelinesPage.tsx"],"sourcesContent":["/**\n * Pipelines Page\n *\n * List and manage Pipelines.\n * Uses fe-libs shared UI components and semantic tokens for consistent styling.\n */\n\nimport { memo, useState, useMemo, useCallback } from 'react';\nimport { useAppNavigate } from '../contexts';\nimport { isNative, nativeNotify } from '../../utils/nativeBridge';\nimport { usePipelineOperations } from '../hooks/usePipelineOperations';\nimport { usePipelineStore } from '../store/pipelineStore';\nimport { PipelineCard } from '../components/pipeline/PipelineCard';\nimport { PipelineDeleteDialog } from '../components/pipeline/PipelineDeleteDialog';\nimport type { PipelineStatus } from '../types';\n\n// fe-libs RBAC\nimport { usePermissions } from '@burdenoff/fe-libs/shared/providers/shell';\nimport { useI18n } from '@burdenoff/fe-libs/shared/providers/shell/I18nProvider';\nimport { AccessDenied, PermissionButton } from '@burdenoff/fe-libs/shared/components';\nimport { BIGCONSOLE_PERMISSIONS } from '../../constants/permissions';\n\n// fe-libs UI components\nimport { Button } from '@burdenoff/fe-libs/ui';\nimport { Input } from '@burdenoff/fe-libs/ui';\nimport { Card, CardContent } from '@burdenoff/fe-libs/ui';\nimport { Spinner } from '@burdenoff/fe-libs/ui';\nimport { AuroraBackground, GradientText, GlassCard, IllustratedEmptyState, PagePurpose } from '@burdenoff/fe-libs/ui';\n\n// Lucide icons\nimport { Plus, Search, GitBranch, AlertCircle } from 'lucide-react';\n\n// ============================================================================\n// TYPES\n// ============================================================================\n\ntype StatusFilter = 'all' | PipelineStatus;\n\n// ============================================================================\n// COMPONENT\n// ============================================================================\n\nexport const PipelinesPage = memo(function PipelinesPage() {\n const navigate = useAppNavigate();\n const { t } = useI18n();\n\n // Permissions\n const { hasPermission, isLoading: permissionsLoading } = usePermissions();\n const canRead = hasPermission(BIGCONSOLE_PERMISSIONS.PIPELINE_READ);\n // Create is gated inline via <PermissionButton permission=PIPELINE_CREATE>.\n const canUpdate = hasPermission(BIGCONSOLE_PERMISSIONS.PIPELINE_UPDATE);\n const canDelete = hasPermission(BIGCONSOLE_PERMISSIONS.PIPELINE_DELETE);\n const canTest = hasPermission(BIGCONSOLE_PERMISSIONS.PIPELINE_TEST);\n\n // Local state\n const [statusFilter, setStatusFilter] = useState<StatusFilter>('all');\n\n // Store state\n const searchQuery = usePipelineStore((state) => state.searchQuery);\n const setSearchQuery = usePipelineStore((state) => state.setSearchQuery);\n const deleteDialogOpen = usePipelineStore((state) => state.deleteDialogOpen);\n const currentPipeline = usePipelineStore((state) => state.currentPipeline);\n const openDeleteDialog = usePipelineStore((state) => state.openDeleteDialog);\n const closeDeleteDialog = usePipelineStore((state) => state.closeDeleteDialog);\n\n // Operations\n const { loading, error, pipelines, deletePipeline, refetch } = usePipelineOperations({\n consoleId: 'default',\n });\n\n // Filter pipelines\n const filteredPipelines = useMemo(() => {\n let filtered = [...pipelines];\n\n // Apply status filter\n if (statusFilter !== 'all') {\n filtered = filtered.filter((p) => p.status === statusFilter);\n }\n\n // Apply search filter\n if (searchQuery.trim()) {\n const query = searchQuery.toLowerCase();\n filtered = filtered.filter(\n (p) => p.name.toLowerCase().includes(query) || p.description?.toLowerCase().includes(query)\n );\n }\n\n // Sort by updatedAt descending\n return filtered.sort((a, b) => new Date(b.updatedAt).getTime() - new Date(a.updatedAt).getTime());\n }, [pipelines, statusFilter, searchQuery]);\n\n // Handlers\n const handleCreatePipeline = useCallback(() => {\n navigate('/pipelines/new');\n }, [navigate]);\n\n const handleViewPipeline = useCallback(\n (id: string) => {\n navigate(`/pipelines/${id}`);\n },\n [navigate]\n );\n\n const handleEditPipeline = useCallback(\n (id: string) => {\n navigate(`/pipelines/${id}/edit`);\n },\n [navigate]\n );\n\n const handleTestPipeline = useCallback(\n (id: string) => {\n navigate(`/pipelines/${id}?test=true`);\n },\n [navigate]\n );\n\n const handleDeleteClick = useCallback(\n (id: string) => {\n const pipeline = pipelines.find((p) => p.id === id);\n if (pipeline) {\n openDeleteDialog(pipeline);\n }\n },\n [pipelines, openDeleteDialog]\n );\n\n const handleDeleteConfirm = useCallback(async () => {\n if (currentPipeline) {\n try {\n await deletePipeline(currentPipeline.id);\n if (isNative()) void nativeNotify('success');\n } catch (err) {\n if (isNative()) void nativeNotify('error');\n throw err;\n }\n closeDeleteDialog();\n }\n }, [currentPipeline, deletePipeline, closeDeleteDialog]);\n\n // Status filter options\n const statusOptions: { value: StatusFilter; label: string }[] = [\n { value: 'all', label: t('bigconsole.pipelines.filters.all', 'All') },\n { value: 'draft', label: t('bigconsole.pipelines.filters.draft', 'Draft') },\n { value: 'active', label: t('bigconsole.pipelines.filters.active', 'Active') },\n { value: 'inactive', label: t('bigconsole.pipelines.filters.inactive', 'Inactive') },\n { value: 'error', label: t('bigconsole.pipelines.filters.error', 'Error') },\n ];\n\n // Permission gate — wait for permissions to resolve, then block callers\n // without pipeline read access before rendering the page body.\n if (permissionsLoading) {\n return (\n <div style={{ display: 'flex', alignItems: 'center', justifyContent: 'center', padding: '80px 0' }}>\n <Spinner\n style={{\n height: 'var(--size-icon-xl)',\n width: 'var(--size-icon-xl)',\n }}\n />\n </div>\n );\n }\n\n if (!canRead) {\n return (\n <AccessDenied\n title={t('bigconsole.pipelines.errors.accessDeniedTitle', 'Access Denied')}\n description={t(\n 'bigconsole.pipelines.errors.accessDeniedListDescription',\n \"You don't have permission to view pipelines.\"\n )}\n />\n );\n }\n\n // Error state\n if (error) {\n return (\n <div style={{ padding: 'var(--space-pagePadding)' }}>\n <Card\n style={{\n borderColor: 'var(--color-status-error-border)',\n backgroundColor: 'var(--color-status-error-bgSubtle)',\n }}\n >\n <CardContent style={{ padding: 'var(--space-pagePadding)' }}>\n <div style={{ display: 'flex', flexDirection: 'column', alignItems: 'center', textAlign: 'center' }}>\n <div\n style={{\n padding: 'var(--space-controlGap)',\n borderRadius: '50%',\n backgroundColor: 'var(--color-status-error-bgSubtle)',\n marginBottom: 'var(--space-formGap)',\n }}\n >\n <AlertCircle\n style={{\n height: 'var(--size-icon-xl)',\n width: 'var(--size-icon-xl)',\n color: 'var(--color-status-error-text)',\n }}\n />\n </div>\n <h3\n style={{\n fontSize: 'var(--font-size-body-lg)',\n fontWeight: 'var(--font-weight-medium)',\n color: 'var(--color-status-error-text)',\n marginBottom: 'var(--space-controlGap)',\n }}\n >\n {t('bigconsole.pipelines.errors.loadListTitle', 'Failed to load Pipelines')}\n </h3>\n <p\n style={{\n fontSize: 'var(--font-size-body-sm)',\n color: 'var(--color-text-secondary)',\n marginBottom: 'var(--space-formGap)',\n }}\n >\n {error.message}\n </p>\n <Button size=\"sm\" onClick={() => refetch()}>\n {t('bigconsole.pipelines.actions.tryAgain', 'Try Again')}\n </Button>\n </div>\n </CardContent>\n </Card>\n </div>\n );\n }\n\n return (\n <div style={{ minHeight: '100vh', backgroundColor: 'var(--color-bg-canvas)' }}>\n {/* Header Section */}\n <div className=\"relative overflow-hidden border-b border-border-seam bg-gloss-card\">\n <AuroraBackground intensity=\"subtle\" />\n <div style={{ padding: 'var(--space-pagePadding)' }}>\n <div style={{ display: 'flex', alignItems: 'center', justifyContent: 'space-between' }}>\n <div style={{ display: 'flex', alignItems: 'center', gap: 'var(--space-formGap)' }}>\n <div\n style={{\n display: 'flex',\n height: 'var(--size-controlHeight-lg)',\n width: 'var(--size-controlHeight-lg)',\n alignItems: 'center',\n justifyContent: 'center',\n borderRadius: 'var(--radius-card)',\n backgroundColor: 'var(--color-action-primary-bg)',\n }}\n >\n <GitBranch\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>\n <h1\n style={{\n fontSize: 'var(--font-size-heading-h4)',\n fontWeight: 'var(--font-weight-bold)',\n margin: 0,\n color: 'var(--color-text-primary)',\n }}\n >\n <GradientText>{t('bigconsole.pipelines.list.heading', 'Pipelines')}</GradientText>\n </h1>\n <p style={{ fontSize: 'var(--font-size-body-sm)', color: 'var(--color-text-secondary)', margin: 0 }}>\n {t(\n 'bigconsole.pipelines.list.subtitle',\n 'Create and manage sequential parser chains for data transformation'\n )}\n </p>\n </div>\n </div>\n\n <PermissionButton permission={BIGCONSOLE_PERMISSIONS.PIPELINE_CREATE} deniedBehavior=\"disable\">\n <Button onClick={handleCreatePipeline}>\n <Plus\n style={{\n marginRight: 'var(--space-iconGap)',\n height: 'var(--size-icon-sm)',\n width: 'var(--size-icon-sm)',\n }}\n />\n {t('bigconsole.pipelines.actions.createPipeline', 'Create Pipeline')}\n </Button>\n </PermissionButton>\n </div>\n </div>\n </div>\n\n {/* Main Content */}\n <div style={{ padding: 'var(--space-pagePadding)' }}>\n <PagePurpose className=\"mb-[var(--space-sectionGap)]\">\n {t(\n 'bigconsole.pipelines.list.purpose',\n 'Pipelines chain parsers and data sinks into a repeatable flow — they take raw input, run it through your parsers, and route the structured result into a sink. Use them to turn messy logs, files, or API payloads into clean, queryable data your dashboards can use.'\n )}\n </PagePurpose>\n\n {/* Status Filter Tabs */}\n <div style={{ marginBottom: 'var(--space-formGap)' }}>\n <div\n style={{\n display: 'flex',\n alignItems: 'center',\n gap: '2px',\n padding: '4px',\n backgroundColor: 'var(--color-bg-sunken)',\n borderRadius: 'var(--radius-card)',\n width: 'fit-content',\n }}\n >\n {statusOptions.map((option) => (\n <button\n key={option.value}\n type=\"button\"\n onClick={() => setStatusFilter(option.value)}\n style={{\n padding: 'var(--space-controlGap) var(--space-formGap)',\n fontSize: 'var(--font-size-body-sm)',\n fontWeight: 'var(--font-weight-medium)',\n borderRadius: 'var(--radius-button)',\n border: 'none',\n cursor: 'pointer',\n transition: 'all 0.2s ease',\n backgroundColor: statusFilter === option.value ? 'var(--color-bg-surface)' : 'transparent',\n color: statusFilter === option.value ? 'var(--color-text-primary)' : 'var(--color-text-secondary)',\n boxShadow: statusFilter === option.value ? '0 1px 2px rgba(0,0,0,0.05)' : 'none',\n }}\n >\n {option.label}\n </button>\n ))}\n </div>\n </div>\n\n {/* Search Bar */}\n <div style={{ marginBottom: 'var(--space-sectionGap)' }}>\n <div style={{ position: 'relative', maxWidth: '400px' }}>\n <Search\n style={{\n position: 'absolute',\n left: 'var(--space-controlGap)',\n top: '50%',\n transform: 'translateY(-50%)',\n height: 'var(--size-icon-sm)',\n width: 'var(--size-icon-sm)',\n color: 'var(--color-text-muted)',\n }}\n />\n <Input\n type=\"text\"\n placeholder={t('bigconsole.pipelines.list.searchPlaceholder', 'Search pipelines...')}\n value={searchQuery}\n onChange={(e) => setSearchQuery(e.target.value)}\n style={{ paddingLeft: 'var(--size-controlHeight-md)', height: 'var(--size-controlHeight-md)' }}\n />\n </div>\n </div>\n\n {/* Loading state */}\n {loading && pipelines.length === 0 && (\n <div style={{ display: 'flex', alignItems: 'center', justifyContent: 'center', padding: '80px 0' }}>\n <div style={{ textAlign: 'center' }}>\n <Spinner\n style={{\n height: 'var(--size-icon-xl)',\n width: 'var(--size-icon-xl)',\n margin: '0 auto var(--space-formGap)',\n }}\n />\n <p style={{ fontSize: 'var(--font-size-body-sm)', color: 'var(--color-text-muted)' }}>\n {t('bigconsole.pipelines.list.loading', 'Loading pipelines...')}\n </p>\n </div>\n </div>\n )}\n\n {/* Empty state */}\n {!loading && pipelines.length === 0 && (\n <GlassCard treatment=\"insight\" className=\"border-border-seam\">\n <IllustratedEmptyState\n illustration=\"empty-data\"\n title={t('bigconsole.pipelines.list.emptyTitle', 'No Pipelines yet')}\n description={t(\n 'bigconsole.pipelines.list.emptyDescription',\n 'Create a pipeline to chain parsers together for sequential data transformation. Each stage processes the output of the previous stage.'\n )}\n action={\n <PermissionButton permission={BIGCONSOLE_PERMISSIONS.PIPELINE_CREATE} deniedBehavior=\"disable\">\n <Button onClick={handleCreatePipeline}>\n <Plus\n style={{\n marginRight: 'var(--space-iconGap)',\n height: 'var(--size-icon-sm)',\n width: 'var(--size-icon-sm)',\n }}\n />\n {t('bigconsole.pipelines.actions.createPipeline', 'Create Pipeline')}\n </Button>\n </PermissionButton>\n }\n />\n </GlassCard>\n )}\n\n {/* No results state */}\n {!loading && filteredPipelines.length === 0 && pipelines.length > 0 && (\n <GlassCard treatment=\"insight\" className=\"border-border-seam\">\n <IllustratedEmptyState\n illustration=\"empty-search\"\n title={t('bigconsole.pipelines.list.noResultsTitle', 'No matching pipelines')}\n description={t('bigconsole.pipelines.list.noResultsDescription', 'No pipelines match your filters')}\n />\n </GlassCard>\n )}\n\n {/* Pipeline Grid */}\n {filteredPipelines.length > 0 && (\n <div\n style={{\n display: 'grid',\n gridTemplateColumns: 'repeat(auto-fill, minmax(320px, 1fr))',\n gap: 'var(--space-formGap)',\n }}\n >\n {filteredPipelines.map((pipeline) => (\n <PipelineCard\n key={pipeline.id}\n pipeline={pipeline}\n onView={handleViewPipeline}\n onEdit={canUpdate ? handleEditPipeline : undefined}\n onTest={canTest ? handleTestPipeline : undefined}\n onDelete={canDelete ? handleDeleteClick : undefined}\n />\n ))}\n </div>\n )}\n </div>\n\n {/* Delete Dialog */}\n {currentPipeline && (\n <PipelineDeleteDialog\n pipeline={currentPipeline}\n isOpen={deleteDialogOpen}\n onClose={closeDeleteDialog}\n onConfirm={handleDeleteConfirm}\n />\n )}\n </div>\n );\n});\n\nexport default PipelinesPage;\n"],"mappings":";;;;;;;;;;;;;;;;AA0CA,IAAa,IAAgB,EAAK,WAAyB;CACzD,IAAM,IAAW,GAAgB,EAC3B,EAAE,SAAM,GAAS,EAGjB,EAAE,kBAAe,WAAW,MAAuB,GAAgB,EACnE,IAAU,EAAc,EAAuB,cAAc,EAE7D,IAAY,EAAc,EAAuB,gBAAgB,EACjE,IAAY,EAAc,EAAuB,gBAAgB,EACjE,IAAU,EAAc,EAAuB,cAAc,EAG7D,CAAC,GAAc,KAAmB,EAAuB,MAAM,EAG/D,IAAc,GAAkB,MAAU,EAAM,YAAY,EAC5D,IAAiB,GAAkB,MAAU,EAAM,eAAe,EAClE,IAAmB,GAAkB,MAAU,EAAM,iBAAiB,EACtE,IAAkB,GAAkB,MAAU,EAAM,gBAAgB,EACpE,IAAmB,GAAkB,MAAU,EAAM,iBAAiB,EACtE,IAAoB,GAAkB,MAAU,EAAM,kBAAkB,EAGxE,EAAE,YAAS,UAAO,cAAW,mBAAgB,eAAY,EAAsB,EACnF,WAAW,WACZ,CAAC,EAGI,IAAoB,QAAc;EACtC,IAAI,IAAW,CAAC,GAAG,EAAU;AAQ7B,MALI,MAAiB,UACnB,IAAW,EAAS,QAAQ,MAAM,EAAE,WAAW,EAAa,GAI1D,EAAY,MAAM,EAAE;GACtB,IAAM,IAAQ,EAAY,aAAa;AACvC,OAAW,EAAS,QACjB,MAAM,EAAE,KAAK,aAAa,CAAC,SAAS,EAAM,IAAI,EAAE,aAAa,aAAa,CAAC,SAAS,EAAM,CAC5F;;AAIH,SAAO,EAAS,MAAM,GAAG,MAAM,IAAI,KAAK,EAAE,UAAU,CAAC,SAAS,GAAG,IAAI,KAAK,EAAE,UAAU,CAAC,SAAS,CAAC;IAChG;EAAC;EAAW;EAAc;EAAY,CAAC,EAGpC,IAAuB,QAAkB;AAC7C,IAAS,iBAAiB;IACzB,CAAC,EAAS,CAAC,EAER,KAAqB,GACxB,MAAe;AACd,IAAS,cAAc,IAAK;IAE9B,CAAC,EAAS,CACX,EAEK,KAAqB,GACxB,MAAe;AACd,IAAS,cAAc,EAAG,OAAO;IAEnC,CAAC,EAAS,CACX,EAEK,KAAqB,GACxB,MAAe;AACd,IAAS,cAAc,EAAG,YAAY;IAExC,CAAC,EAAS,CACX,EAEK,KAAoB,GACvB,MAAe;EACd,IAAM,IAAW,EAAU,MAAM,MAAM,EAAE,OAAO,EAAG;AACnD,EAAI,KACF,EAAiB,EAAS;IAG9B,CAAC,GAAW,EAAiB,CAC9B,EAEK,KAAsB,EAAY,YAAY;AAClD,MAAI,GAAiB;AACnB,OAAI;AAEF,IADA,MAAM,EAAe,EAAgB,GAAG,EACpC,GAAU,IAAO,EAAa,UAAU;YACrC,GAAK;AAEZ,UADI,GAAU,IAAO,EAAa,QAAQ,EACpC;;AAER,MAAmB;;IAEpB;EAAC;EAAiB;EAAgB;EAAkB,CAAC,EAGlD,KAA0D;EAC9D;GAAE,OAAO;GAAO,OAAO,EAAE,oCAAoC,MAAM;GAAE;EACrE;GAAE,OAAO;GAAS,OAAO,EAAE,sCAAsC,QAAQ;GAAE;EAC3E;GAAE,OAAO;GAAU,OAAO,EAAE,uCAAuC,SAAS;GAAE;EAC9E;GAAE,OAAO;GAAY,OAAO,EAAE,yCAAyC,WAAW;GAAE;EACpF;GAAE,OAAO;GAAS,OAAO,EAAE,sCAAsC,QAAQ;GAAE;EAC5E;AAsFD,QAlFI,IAEA,kBAAC,OAAD;EAAK,OAAO;GAAE,SAAS;GAAQ,YAAY;GAAU,gBAAgB;GAAU,SAAS;GAAU;YAChG,kBAAC,GAAD,EACE,OAAO;GACL,QAAQ;GACR,OAAO;GACR,EACD,CAAA;EACE,CAAA,GAIL,IAaD,IAEA,kBAAC,OAAD;EAAK,OAAO,EAAE,SAAS,4BAA4B;YACjD,kBAAC,GAAD;GACE,OAAO;IACL,aAAa;IACb,iBAAiB;IAClB;aAED,kBAAC,GAAD;IAAa,OAAO,EAAE,SAAS,4BAA4B;cACzD,kBAAC,OAAD;KAAK,OAAO;MAAE,SAAS;MAAQ,eAAe;MAAU,YAAY;MAAU,WAAW;MAAU;eAAnG;MACE,kBAAC,OAAD;OACE,OAAO;QACL,SAAS;QACT,cAAc;QACd,iBAAiB;QACjB,cAAc;QACf;iBAED,kBAAC,GAAD,EACE,OAAO;QACL,QAAQ;QACR,OAAO;QACP,OAAO;QACR,EACD,CAAA;OACE,CAAA;MACN,kBAAC,MAAD;OACE,OAAO;QACL,UAAU;QACV,YAAY;QACZ,OAAO;QACP,cAAc;QACf;iBAEA,EAAE,6CAA6C,2BAA2B;OACxE,CAAA;MACL,kBAAC,KAAD;OACE,OAAO;QACL,UAAU;QACV,OAAO;QACP,cAAc;QACf;iBAEA,EAAM;OACL,CAAA;MACJ,kBAAC,GAAD;OAAQ,MAAK;OAAK,eAAe,GAAS;iBACvC,EAAE,yCAAyC,YAAY;OACjD,CAAA;MACL;;IACM,CAAA;GACT,CAAA;EACH,CAAA,GAKR,kBAAC,OAAD;EAAK,OAAO;GAAE,WAAW;GAAS,iBAAiB;GAA0B;YAA7E;GAEE,kBAAC,OAAD;IAAK,WAAU;cAAf,CACE,kBAAC,GAAD,EAAkB,WAAU,UAAW,CAAA,EACvC,kBAAC,OAAD;KAAK,OAAO,EAAE,SAAS,4BAA4B;eACjD,kBAAC,OAAD;MAAK,OAAO;OAAE,SAAS;OAAQ,YAAY;OAAU,gBAAgB;OAAiB;gBAAtF,CACE,kBAAC,OAAD;OAAK,OAAO;QAAE,SAAS;QAAQ,YAAY;QAAU,KAAK;QAAwB;iBAAlF,CACE,kBAAC,OAAD;QACE,OAAO;SACL,SAAS;SACT,QAAQ;SACR,OAAO;SACP,YAAY;SACZ,gBAAgB;SAChB,cAAc;SACd,iBAAiB;SAClB;kBAED,kBAAC,GAAD,EACE,OAAO;SACL,QAAQ;SACR,OAAO;SACP,OAAO;SACR,EACD,CAAA;QACE,CAAA,EACN,kBAAC,OAAD,EAAA,UAAA,CACE,kBAAC,MAAD;QACE,OAAO;SACL,UAAU;SACV,YAAY;SACZ,QAAQ;SACR,OAAO;SACR;kBAED,kBAAC,GAAD,EAAA,UAAe,EAAE,qCAAqC,YAAY,EAAgB,CAAA;QAC/E,CAAA,EACL,kBAAC,KAAD;QAAG,OAAO;SAAE,UAAU;SAA4B,OAAO;SAA+B,QAAQ;SAAG;kBAChG,EACC,sCACA,qEACD;QACC,CAAA,CACA,EAAA,CAAA,CACF;UAEN,kBAAC,GAAD;OAAkB,YAAY,EAAuB;OAAiB,gBAAe;iBACnF,kBAAC,GAAD;QAAQ,SAAS;kBAAjB,CACE,kBAAC,GAAD,EACE,OAAO;SACL,aAAa;SACb,QAAQ;SACR,OAAO;SACR,EACD,CAAA,EACD,EAAE,+CAA+C,kBAAkB,CAC7D;;OACQ,CAAA,CACf;;KACF,CAAA,CACF;;GAGN,kBAAC,OAAD;IAAK,OAAO,EAAE,SAAS,4BAA4B;cAAnD;KACE,kBAAC,GAAD;MAAa,WAAU;gBACpB,EACC,qCACA,yQACD;MACW,CAAA;KAGd,kBAAC,OAAD;MAAK,OAAO,EAAE,cAAc,wBAAwB;gBAClD,kBAAC,OAAD;OACE,OAAO;QACL,SAAS;QACT,YAAY;QACZ,KAAK;QACL,SAAS;QACT,iBAAiB;QACjB,cAAc;QACd,OAAO;QACR;iBAEA,GAAc,KAAK,MAClB,kBAAC,UAAD;QAEE,MAAK;QACL,eAAe,EAAgB,EAAO,MAAM;QAC5C,OAAO;SACL,SAAS;SACT,UAAU;SACV,YAAY;SACZ,cAAc;SACd,QAAQ;SACR,QAAQ;SACR,YAAY;SACZ,iBAAiB,MAAiB,EAAO,QAAQ,4BAA4B;SAC7E,OAAO,MAAiB,EAAO,QAAQ,8BAA8B;SACrE,WAAW,MAAiB,EAAO,QAAQ,+BAA+B;SAC3E;kBAEA,EAAO;QACD,EAjBF,EAAO,MAiBL,CACT;OACE,CAAA;MACF,CAAA;KAGN,kBAAC,OAAD;MAAK,OAAO,EAAE,cAAc,2BAA2B;gBACrD,kBAAC,OAAD;OAAK,OAAO;QAAE,UAAU;QAAY,UAAU;QAAS;iBAAvD,CACE,kBAAC,GAAD,EACE,OAAO;QACL,UAAU;QACV,MAAM;QACN,KAAK;QACL,WAAW;QACX,QAAQ;QACR,OAAO;QACP,OAAO;QACR,EACD,CAAA,EACF,kBAAC,GAAD;QACE,MAAK;QACL,aAAa,EAAE,+CAA+C,sBAAsB;QACpF,OAAO;QACP,WAAW,MAAM,EAAe,EAAE,OAAO,MAAM;QAC/C,OAAO;SAAE,aAAa;SAAgC,QAAQ;SAAgC;QAC9F,CAAA,CACE;;MACF,CAAA;KAGL,KAAW,EAAU,WAAW,KAC/B,kBAAC,OAAD;MAAK,OAAO;OAAE,SAAS;OAAQ,YAAY;OAAU,gBAAgB;OAAU,SAAS;OAAU;gBAChG,kBAAC,OAAD;OAAK,OAAO,EAAE,WAAW,UAAU;iBAAnC,CACE,kBAAC,GAAD,EACE,OAAO;QACL,QAAQ;QACR,OAAO;QACP,QAAQ;QACT,EACD,CAAA,EACF,kBAAC,KAAD;QAAG,OAAO;SAAE,UAAU;SAA4B,OAAO;SAA2B;kBACjF,EAAE,qCAAqC,uBAAuB;QAC7D,CAAA,CACA;;MACF,CAAA;KAIP,CAAC,KAAW,EAAU,WAAW,KAChC,kBAAC,GAAD;MAAW,WAAU;MAAU,WAAU;gBACvC,kBAAC,GAAD;OACE,cAAa;OACb,OAAO,EAAE,wCAAwC,mBAAmB;OACpE,aAAa,EACX,8CACA,yIACD;OACD,QACE,kBAAC,GAAD;QAAkB,YAAY,EAAuB;QAAiB,gBAAe;kBACnF,kBAAC,GAAD;SAAQ,SAAS;mBAAjB,CACE,kBAAC,GAAD,EACE,OAAO;UACL,aAAa;UACb,QAAQ;UACR,OAAO;UACR,EACD,CAAA,EACD,EAAE,+CAA+C,kBAAkB,CAC7D;;QACQ,CAAA;OAErB,CAAA;MACQ,CAAA;KAIb,CAAC,KAAW,EAAkB,WAAW,KAAK,EAAU,SAAS,KAChE,kBAAC,GAAD;MAAW,WAAU;MAAU,WAAU;gBACvC,kBAAC,GAAD;OACE,cAAa;OACb,OAAO,EAAE,4CAA4C,wBAAwB;OAC7E,aAAa,EAAE,kDAAkD,kCAAkC;OACnG,CAAA;MACQ,CAAA;KAIb,EAAkB,SAAS,KAC1B,kBAAC,OAAD;MACE,OAAO;OACL,SAAS;OACT,qBAAqB;OACrB,KAAK;OACN;gBAEA,EAAkB,KAAK,MACtB,kBAAC,GAAD;OAEY;OACV,QAAQ;OACR,QAAQ,IAAY,KAAqB,KAAA;OACzC,QAAQ,IAAU,KAAqB,KAAA;OACvC,UAAU,IAAY,KAAoB,KAAA;OAC1C,EANK,EAAS,GAMd,CACF;MACE,CAAA;KAEJ;;GAGL,KACC,kBAAC,GAAD;IACE,UAAU;IACV,QAAQ;IACR,SAAS;IACT,WAAW;IACX,CAAA;GAEA;MAjSJ,kBAAC,GAAD;EACE,OAAO,EAAE,iDAAiD,gBAAgB;EAC1E,aAAa,EACX,2DACA,+CACD;EACD,CAAA;EA6RN"}