@burdenoff/microfe-bigconsole 2026.1008.10 → 2026.1008.12

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 (131) hide show
  1. package/dist/bigconsole/BigConsoleRoutes.d.ts.map +1 -1
  2. package/dist/bigconsole/BigConsoleRoutes.js +136 -127
  3. package/dist/bigconsole/BigConsoleRoutes.js.map +1 -1
  4. package/dist/bigconsole/assistant/assistantProduct.d.ts.map +1 -1
  5. package/dist/bigconsole/assistant/assistantProduct.js +3 -1
  6. package/dist/bigconsole/assistant/assistantProduct.js.map +1 -1
  7. package/dist/bigconsole/components/builder/inspector/DataBindingSection.js +31 -31
  8. package/dist/bigconsole/components/dashboard/CreateDashboardDialog.js +44 -44
  9. package/dist/bigconsole/components/dashboard/CreateDashboardDialog.js.map +1 -1
  10. package/dist/bigconsole/components/dashboard/DashboardCanvas.js +36 -36
  11. package/dist/bigconsole/components/dashboard/DashboardCanvas.js.map +1 -1
  12. package/dist/bigconsole/components/dashboard/DashboardToolbar.js +59 -59
  13. package/dist/bigconsole/components/dashboard/DrilldownBreadcrumb.js +15 -15
  14. package/dist/bigconsole/components/dashboard/GlobalFiltersBar/FilterChip.js +30 -30
  15. package/dist/bigconsole/components/dashboard/GlobalFiltersBar/FilterEditor.js +41 -41
  16. package/dist/bigconsole/components/dashboard/GlobalFiltersBar/FilterPresetSelector.js +34 -34
  17. package/dist/bigconsole/components/dashboard/GlobalFiltersBar/GlobalFiltersBar.js +34 -34
  18. package/dist/bigconsole/components/dashboard/ImportDashboardDialog.js +110 -110
  19. package/dist/bigconsole/components/dashboard/ImportDashboardDialog.js.map +1 -1
  20. package/dist/bigconsole/components/dashboard/PublishToStoreDialog.js +21 -21
  21. package/dist/bigconsole/components/dashboard/SavedViewsDropdown/SavedViewsDropdown.js +46 -46
  22. package/dist/bigconsole/components/dashboard/ShareDialog/EmbedTab.js +91 -91
  23. package/dist/bigconsole/components/dashboard/ShareDialog/EmbedTab.js.map +1 -1
  24. package/dist/bigconsole/components/dashboard/ShareDialog/ShareDialog.js +101 -101
  25. package/dist/bigconsole/components/dashboard/ShareDialog/ShareDialog.js.map +1 -1
  26. package/dist/bigconsole/components/dashboard/TemplateInstallOptions.js +31 -31
  27. package/dist/bigconsole/components/dashboard/TemplateLayoutPreview.js +15 -15
  28. package/dist/bigconsole/components/dashboard/TemplatePicker/TemplatePicker.js +1 -1
  29. package/dist/bigconsole/components/dashboard/WidgetPalette.js +46 -46
  30. package/dist/bigconsole/components/datasink/AlertExecutionHistory.js +37 -37
  31. package/dist/bigconsole/components/datasink/AlertRuleEditor.js +66 -66
  32. package/dist/bigconsole/components/datasink/CacheTTLSelector.js +35 -35
  33. package/dist/bigconsole/components/datasink/DataSinkCard.js +29 -29
  34. package/dist/bigconsole/components/datasink/DataSinkDeleteDialog.js +18 -18
  35. package/dist/bigconsole/components/datasink/DataSinkRefreshDialog.js +20 -20
  36. package/dist/bigconsole/components/datasink/ImportDataGuideDialog.js +47 -47
  37. package/dist/bigconsole/components/datasink/ImportDataSinkDialog.js +91 -91
  38. package/dist/bigconsole/components/datasink/RefreshTypeSelector.js +35 -35
  39. package/dist/bigconsole/components/parser/DataSinkSelector.js +40 -40
  40. package/dist/bigconsole/components/parser/ImportParserDialog.js +120 -120
  41. package/dist/bigconsole/components/parser/ImportParserDialog.js.map +1 -1
  42. package/dist/bigconsole/components/parser/ParserSelector.js +51 -51
  43. package/dist/bigconsole/components/pipeline/PipelineScopePicker.js +10 -10
  44. package/dist/bigconsole/components/preview/AiPreviewMiniPanel.js +27 -27
  45. package/dist/bigconsole/components/preview/AiPreviewPanel.js +30 -30
  46. package/dist/bigconsole/components/widgets/ActionConfigDialog.js +4 -4
  47. package/dist/bigconsole/components/widgets/DrilldownConfigPanel.js +93 -93
  48. package/dist/bigconsole/components/widgets/DrilldownConfigPanel.js.map +1 -1
  49. package/dist/bigconsole/components/widgets/PropertiesPanel.d.ts.map +1 -1
  50. package/dist/bigconsole/components/widgets/PropertiesPanel.js +280 -273
  51. package/dist/bigconsole/components/widgets/PropertiesPanel.js.map +1 -1
  52. package/dist/bigconsole/components/widgets/calendar/CalendarWidget.js +4 -4
  53. package/dist/bigconsole/components/widgets/chart/ChartConfig.js +48 -48
  54. package/dist/bigconsole/components/widgets/comments/WidgetComments.js +46 -46
  55. package/dist/bigconsole/components/widgets/event-logs/EventLogViewer.js +61 -61
  56. package/dist/bigconsole/components/widgets/form/FormWidget.js +36 -36
  57. package/dist/bigconsole/components/widgets/gauge/GaugeConfig.js +42 -42
  58. package/dist/bigconsole/components/widgets/heatmap/HeatmapConfig.js +25 -25
  59. package/dist/bigconsole/components/widgets/kanban/KanbanWidget.js +4 -4
  60. package/dist/bigconsole/components/widgets/list/ListConfig.js +30 -30
  61. package/dist/bigconsole/components/widgets/metric-card/MetricCardConfig.js +38 -38
  62. package/dist/bigconsole/components/widgets/metric-card/SparklineChart.js +9 -9
  63. package/dist/bigconsole/components/widgets/metric-card/TrendIndicator.js +9 -9
  64. package/dist/bigconsole/components/widgets/pivot-table/PivotTableWidget.js +49 -49
  65. package/dist/bigconsole/components/widgets/progress/ProgressConfig.js +39 -39
  66. package/dist/bigconsole/components/widgets/table/TableConfig.js +73 -73
  67. package/dist/bigconsole/components/widgets/webhook-config/WebhookConfigPanel.js +64 -64
  68. package/dist/bigconsole/components/workflow/WorkflowOpenGuard.js +15 -15
  69. package/dist/bigconsole/components/workflow/WorkflowSinkLinkForm.js +15 -15
  70. package/dist/bigconsole/customWidget/CustomWidgetBuilderSheet.js +9 -9
  71. package/dist/bigconsole/customWidget/CustomWidgetProposalPanel.js +67 -67
  72. package/dist/bigconsole/customWidget/CustomWidgetProposalPanel.js.map +1 -1
  73. package/dist/bigconsole/hooks/useDashboardLayoutBaseline.d.ts +15 -0
  74. package/dist/bigconsole/hooks/useDashboardLayoutBaseline.d.ts.map +1 -0
  75. package/dist/bigconsole/hooks/useDashboardLayoutBaseline.js +34 -0
  76. package/dist/bigconsole/hooks/useDashboardLayoutBaseline.js.map +1 -0
  77. package/dist/bigconsole/hooks/useDrilldown.js +3 -3
  78. package/dist/bigconsole/hooks/useGlobalFilters.js +3 -3
  79. package/dist/bigconsole/pages/AdminPage.js +130 -130
  80. package/dist/bigconsole/pages/DashboardBuilderPage.d.ts.map +1 -1
  81. package/dist/bigconsole/pages/DashboardBuilderPage.js +72 -60
  82. package/dist/bigconsole/pages/DashboardBuilderPage.js.map +1 -1
  83. package/dist/bigconsole/pages/DashboardViewPage.js +1 -1
  84. package/dist/bigconsole/pages/DataSinkAlertsPage.d.ts.map +1 -1
  85. package/dist/bigconsole/pages/DataSinkAlertsPage.js +30 -23
  86. package/dist/bigconsole/pages/DataSinkAlertsPage.js.map +1 -1
  87. package/dist/bigconsole/pages/DataSinkBuilderPage.d.ts.map +1 -1
  88. package/dist/bigconsole/pages/DataSinkBuilderPage.js +272 -263
  89. package/dist/bigconsole/pages/DataSinkBuilderPage.js.map +1 -1
  90. package/dist/bigconsole/pages/DataSinkViewPage.js +1 -1
  91. package/dist/bigconsole/pages/DataSinksPage.js +1 -1
  92. package/dist/bigconsole/pages/DataSourcesPage.js +5 -5
  93. package/dist/bigconsole/pages/InsightsPage.js +181 -181
  94. package/dist/bigconsole/pages/InsightsPage.js.map +1 -1
  95. package/dist/bigconsole/pages/OverviewPage.js +47 -47
  96. package/dist/bigconsole/pages/OverviewPage.js.map +1 -1
  97. package/dist/bigconsole/pages/ParserBuilderPage.d.ts.map +1 -1
  98. package/dist/bigconsole/pages/ParserBuilderPage.js +227 -211
  99. package/dist/bigconsole/pages/ParserBuilderPage.js.map +1 -1
  100. package/dist/bigconsole/pages/ParserViewPage.js +97 -97
  101. package/dist/bigconsole/pages/PipelineBuilderPage.d.ts.map +1 -1
  102. package/dist/bigconsole/pages/PipelineBuilderPage.js +256 -214
  103. package/dist/bigconsole/pages/PipelineBuilderPage.js.map +1 -1
  104. package/dist/bigconsole/pages/PipelineViewPage.js +146 -146
  105. package/dist/bigconsole/pages/PipelinesPage.js +88 -88
  106. package/dist/bigconsole/pages/PipelinesPage.js.map +1 -1
  107. package/dist/bigconsole/pages/SettingsPage.d.ts.map +1 -1
  108. package/dist/bigconsole/pages/SettingsPage.js +179 -173
  109. package/dist/bigconsole/pages/SettingsPage.js.map +1 -1
  110. package/dist/bigconsole/pages/WidgetDemoPage.js +42 -42
  111. package/dist/bigconsole/pages/WorkflowViewPage.js +1 -1
  112. package/dist/bigconsole/pages/WorkflowsPage.js +141 -141
  113. package/dist/bigconsole/pages/WorkflowsPage.js.map +1 -1
  114. package/dist/bigconsole/providers/BigConsoleQuotaProvider.js +12 -12
  115. package/dist/bigconsole/renderers/adapters/AdaptiveCardRenderer.js +34 -34
  116. package/dist/bigconsole/renderers/adapters/BlockKitRenderer.js +79 -79
  117. package/dist/bigconsole/renderers/adapters/CustomRenderer.js +46 -46
  118. package/dist/bigconsole/store/widgetStore.d.ts +12 -0
  119. package/dist/bigconsole/store/widgetStore.d.ts.map +1 -1
  120. package/dist/bigconsole/store/widgetStore.js +3 -1
  121. package/dist/bigconsole/store/widgetStore.js.map +1 -1
  122. package/dist/bigconsole/utils/formDirty.d.ts +83 -0
  123. package/dist/bigconsole/utils/formDirty.d.ts.map +1 -0
  124. package/dist/bigconsole/utils/formDirty.js +23 -0
  125. package/dist/bigconsole/utils/formDirty.js.map +1 -0
  126. package/dist/bigconsole/utils/layoutBaseline.d.ts +131 -0
  127. package/dist/bigconsole/utils/layoutBaseline.d.ts.map +1 -0
  128. package/dist/bigconsole/utils/layoutBaseline.js +98 -0
  129. package/dist/bigconsole/utils/layoutBaseline.js.map +1 -0
  130. package/dist/translations/en.d.ts.map +1 -1
  131. package/package.json +3 -3
@@ -1,26 +1,26 @@
1
1
  import { usePipelineStore as e } from "../store/pipelineStore.js";
2
2
  import { useAppNavigate as t } from "../contexts/NavigationContext.js";
3
3
  import "../contexts/index.js";
4
- import { SECTION_FOCUS_RING as n, sectionSurfaceClasses as ee } from "../components/common/sectionStyles.js";
5
- import { Section as r, SectionStack as i } from "../components/common/Section.js";
4
+ import { SECTION_FOCUS_RING as n, sectionSurfaceClasses as r } from "../components/common/sectionStyles.js";
5
+ import { Section as i, SectionStack as a } from "../components/common/Section.js";
6
6
  import "../components/common/index.js";
7
- import te from "../hooks/usePipelineOperations.js";
8
- import { BIGCONSOLE_PERMISSIONS as a } from "../../constants/permissions.js";
9
- import { isNative as o, nativeNotify as s } from "../../utils/nativeBridge.js";
10
- import { PipelineScopePicker as c } from "../components/pipeline/PipelineScopePicker.js";
11
- import ne from "../components/pipeline/PipelineDeleteDialog.js";
12
- import re from "../components/pipeline/PipelineCard.js";
13
- import { memo as l, useCallback as u, useMemo as d, useState as f } from "react";
14
- import { useSearchParams as p } from "react-router";
15
- import { AccessDenied as m, PermissionButton as h } from "@burdenoff/fe-libs/shared/components";
16
- import { usePermissions as g } from "@burdenoff/fe-libs/shared/providers/shell";
17
- import { AlertCircle as _, GitBranch as v, LayoutGrid as y, List as ie, Plus as b, Search as ae } from "lucide-react";
18
- import { AuroraBackground as oe, Button as x, GradientText as se, IllustratedEmptyState as ce, Input as le, PagePurpose as ue, Spinner as S } from "@burdenoff/fe-libs/ui";
19
- import { jsx as C, jsxs as w } from "react/jsx-runtime";
20
- import { useI18n as T } from "@burdenoff/fe-libs/shared/providers/shell/I18nProvider";
7
+ import ee from "../hooks/usePipelineOperations.js";
8
+ import { BIGCONSOLE_PERMISSIONS as o } from "../../constants/permissions.js";
9
+ import { isNative as s, nativeNotify as c } from "../../utils/nativeBridge.js";
10
+ import { PipelineScopePicker as l } from "../components/pipeline/PipelineScopePicker.js";
11
+ import te from "../components/pipeline/PipelineDeleteDialog.js";
12
+ import ne from "../components/pipeline/PipelineCard.js";
13
+ import { memo as u, useCallback as d, useMemo as f, useState as p } from "react";
14
+ import { useSearchParams as m } from "react-router";
15
+ import { AccessDenied as h, PermissionButton as g } from "@burdenoff/fe-libs/shared/components";
16
+ import { usePermissions as _ } from "@burdenoff/fe-libs/shared/providers/shell";
17
+ import { AlertCircle as v, GitBranch as y, LayoutGrid as b, List as re, Plus as x, Search as ie } from "lucide-react";
18
+ import { AuroraBackground as ae, Button as S, GradientText as oe, IllustratedEmptyState as se, Input as ce, PagePurpose as le, Spinner as C } from "@burdenoff/fe-libs/ui";
19
+ import { useI18n as ue } from "@burdenoff/fe-libs/shared/providers/shell/I18nProvider";
20
+ import { jsx as w, jsxs as T } from "react/jsx-runtime";
21
21
  //#region src/bigconsole/pages/PipelinesPage.tsx
22
- var E = l(function() {
23
- let l = t(), { t: E } = T(), { hasPermission: D, isLoading: O } = g(), k = D(a.PIPELINE_READ), A = D(a.PIPELINE_UPDATE), j = D(a.PIPELINE_DELETE), M = D(a.PIPELINE_TEST), [N, P] = f("all"), [F, I] = p(), L = F.get("consoleId") || "default", [R, z] = f("grid"), B = e((e) => e.searchQuery), V = e((e) => e.setSearchQuery), H = e((e) => e.deleteDialogOpen), U = e((e) => e.currentPipeline), W = e((e) => e.openDeleteDialog), G = e((e) => e.closeDeleteDialog), { loading: K, error: q, pipelines: J, deletePipeline: Y, refetch: de } = te({ consoleId: L }), X = d(() => {
22
+ var E = u(function() {
23
+ let u = t(), { t: E } = ue(), { hasPermission: D, isLoading: O } = _(), k = D(o.PIPELINE_READ), A = D(o.PIPELINE_UPDATE), j = D(o.PIPELINE_DELETE), M = D(o.PIPELINE_TEST), [N, P] = p("all"), [F, I] = m(), L = F.get("consoleId") || "default", [R, z] = p("grid"), B = e((e) => e.searchQuery), V = e((e) => e.setSearchQuery), H = e((e) => e.deleteDialogOpen), U = e((e) => e.currentPipeline), W = e((e) => e.openDeleteDialog), G = e((e) => e.closeDeleteDialog), { loading: K, error: q, pipelines: J, deletePipeline: Y, refetch: de } = ee({ consoleId: L }), X = f(() => {
24
24
  let e = [...J];
25
25
  if (N !== "all" && (e = e.filter((e) => e.status === N)), B.trim()) {
26
26
  let t = B.toLowerCase();
@@ -31,23 +31,23 @@ var E = l(function() {
31
31
  J,
32
32
  N,
33
33
  B
34
- ]), Z = u(() => {
35
- l(`/pipelines/new?consoleId=${encodeURIComponent(L)}`);
36
- }, [l, L]), fe = u((e) => {
37
- l(`/pipelines/${e}`);
38
- }, [l]), pe = u((e) => {
39
- l(`/pipelines/${e}/edit`);
40
- }, [l]), me = u((e) => {
41
- l(`/pipelines/${e}?test=true`);
42
- }, [l]), he = u((e) => {
34
+ ]), Z = d(() => {
35
+ u(`/pipelines/new?consoleId=${encodeURIComponent(L)}`);
36
+ }, [u, L]), fe = d((e) => {
37
+ u(`/pipelines/${e}`);
38
+ }, [u]), pe = d((e) => {
39
+ u(`/pipelines/${e}/edit`);
40
+ }, [u]), me = d((e) => {
41
+ u(`/pipelines/${e}?test=true`);
42
+ }, [u]), he = d((e) => {
43
43
  let t = J.find((t) => t.id === e);
44
44
  t && W(t);
45
- }, [J, W]), ge = u(async () => {
45
+ }, [J, W]), ge = d(async () => {
46
46
  if (U) {
47
47
  try {
48
- await Y(U.id), o() && s("success");
48
+ await Y(U.id), s() && c("success");
49
49
  } catch (e) {
50
- throw o() && s("error"), e;
50
+ throw s() && c("error"), e;
51
51
  }
52
52
  G();
53
53
  }
@@ -55,7 +55,7 @@ var E = l(function() {
55
55
  U,
56
56
  Y,
57
57
  G
58
- ]), _e = u(() => {
58
+ ]), _e = d(() => {
59
59
  P("all"), V("");
60
60
  }, [V]), Q = [
61
61
  {
@@ -79,30 +79,30 @@ var E = l(function() {
79
79
  label: E("bigconsole.pipelines.filters.error", "Error")
80
80
  }
81
81
  ];
82
- if (O) return /* @__PURE__ */ C("div", {
82
+ if (O) return /* @__PURE__ */ w("div", {
83
83
  style: {
84
84
  display: "flex",
85
85
  alignItems: "center",
86
86
  justifyContent: "center",
87
87
  padding: "80px 0"
88
88
  },
89
- children: /* @__PURE__ */ C(S, { style: {
89
+ children: /* @__PURE__ */ w(C, { style: {
90
90
  height: "var(--size-icon-xl)",
91
91
  width: "var(--size-icon-xl)"
92
92
  } })
93
93
  });
94
- if (!k) return /* @__PURE__ */ C(m, {
94
+ if (!k) return /* @__PURE__ */ w(h, {
95
95
  title: E("bigconsole.pipelines.errors.accessDeniedTitle", "Access Denied"),
96
96
  description: E("bigconsole.pipelines.errors.accessDeniedListDescription", "You don't have permission to view pipelines.")
97
97
  });
98
- let $ = /* @__PURE__ */ w("header", {
98
+ let $ = /* @__PURE__ */ T("header", {
99
99
  className: "relative overflow-hidden border-b border-[var(--color-border-seam)] bg-[image:var(--gradient-gloss-card)]",
100
- children: [/* @__PURE__ */ C(oe, { intensity: "subtle" }), /* @__PURE__ */ w("div", {
100
+ children: [/* @__PURE__ */ w(ae, { intensity: "subtle" }), /* @__PURE__ */ T("div", {
101
101
  className: "flex flex-col gap-form-gap sm:flex-row sm:items-center sm:justify-between",
102
102
  style: { padding: "var(--space-pagePadding)" },
103
- children: [/* @__PURE__ */ w("div", {
103
+ children: [/* @__PURE__ */ T("div", {
104
104
  className: "flex min-w-0 items-center gap-form-gap",
105
- children: [/* @__PURE__ */ C("span", {
105
+ children: [/* @__PURE__ */ w("span", {
106
106
  "aria-hidden": "true",
107
107
  className: "flex shrink-0 items-center justify-center rounded-card",
108
108
  style: {
@@ -110,84 +110,84 @@ var E = l(function() {
110
110
  width: "var(--size-controlHeight-lg)",
111
111
  backgroundColor: "var(--color-action-primary-bg)"
112
112
  },
113
- children: /* @__PURE__ */ C(v, { style: {
113
+ children: /* @__PURE__ */ w(y, { style: {
114
114
  height: "var(--size-icon-lg)",
115
115
  width: "var(--size-icon-lg)",
116
116
  color: "var(--color-action-primary-text)"
117
117
  } })
118
- }), /* @__PURE__ */ w("div", {
118
+ }), /* @__PURE__ */ T("div", {
119
119
  className: "min-w-0",
120
- children: [/* @__PURE__ */ C("h1", {
120
+ children: [/* @__PURE__ */ w("h1", {
121
121
  className: "text-2xl font-bold leading-tight text-text-primary",
122
- children: /* @__PURE__ */ C(se, { children: E("bigconsole.pipelines.list.heading", "Pipelines") })
123
- }), /* @__PURE__ */ C("p", {
122
+ children: /* @__PURE__ */ w(oe, { children: E("bigconsole.pipelines.list.heading", "Pipelines") })
123
+ }), /* @__PURE__ */ w("p", {
124
124
  className: "text-sm text-text-secondary",
125
125
  children: E("bigconsole.pipelines.list.subtitle", "Create and manage sequential parser chains for data transformation")
126
126
  })]
127
127
  })]
128
- }), /* @__PURE__ */ C(h, {
129
- permission: a.PIPELINE_CREATE,
128
+ }), /* @__PURE__ */ w(g, {
129
+ permission: o.PIPELINE_CREATE,
130
130
  deniedBehavior: "disable",
131
- children: /* @__PURE__ */ w(x, {
131
+ children: /* @__PURE__ */ T(S, {
132
132
  onClick: Z,
133
133
  className: "w-full shrink-0 min-h-[var(--size-controlHeight-md)] sm:w-auto",
134
- children: [/* @__PURE__ */ C(b, { className: "h-icon-sm w-icon-sm" }), E("bigconsole.pipelines.actions.createPipeline", "Create Pipeline")]
134
+ children: [/* @__PURE__ */ w(x, { className: "h-icon-sm w-icon-sm" }), E("bigconsole.pipelines.actions.createPipeline", "Create Pipeline")]
135
135
  })
136
136
  })]
137
137
  })]
138
138
  });
139
- return q ? /* @__PURE__ */ w("div", {
139
+ return q ? /* @__PURE__ */ T("div", {
140
140
  className: "min-h-screen bg-bg-canvas",
141
- children: [$, /* @__PURE__ */ C("div", {
141
+ children: [$, /* @__PURE__ */ w("div", {
142
142
  style: { padding: "var(--space-pagePadding)" },
143
- children: /* @__PURE__ */ C(r, {
143
+ children: /* @__PURE__ */ w(i, {
144
144
  tone: "danger",
145
145
  headingLevel: 2,
146
146
  title: E("bigconsole.pipelines.errors.loadListTitle", "Failed to load Pipelines"),
147
147
  description: q.message,
148
- icon: /* @__PURE__ */ C(_, { className: "h-icon-sm w-icon-sm" }),
149
- actions: /* @__PURE__ */ C(x, {
148
+ icon: /* @__PURE__ */ w(v, { className: "h-icon-sm w-icon-sm" }),
149
+ actions: /* @__PURE__ */ w(S, {
150
150
  size: "sm",
151
151
  onClick: () => de(),
152
152
  children: E("bigconsole.pipelines.actions.tryAgain", "Try Again")
153
153
  }),
154
154
  "data-testid": "pipelines-error",
155
- children: /* @__PURE__ */ C("p", {
155
+ children: /* @__PURE__ */ w("p", {
156
156
  className: "text-sm text-text-secondary",
157
157
  children: "Nothing was changed. Retry once the console service is reachable again."
158
158
  })
159
159
  })
160
160
  })]
161
- }) : /* @__PURE__ */ w("div", {
161
+ }) : /* @__PURE__ */ T("div", {
162
162
  className: "min-h-screen bg-bg-canvas",
163
163
  children: [
164
164
  $,
165
- /* @__PURE__ */ C("div", {
165
+ /* @__PURE__ */ w("div", {
166
166
  style: { padding: "var(--space-pagePadding)" },
167
- children: /* @__PURE__ */ w(i, { children: [
168
- /* @__PURE__ */ C(ue, {
167
+ children: /* @__PURE__ */ T(a, { children: [
168
+ /* @__PURE__ */ w(le, {
169
169
  className: "max-w-[75ch]",
170
170
  children: E("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.")
171
171
  }),
172
- /* @__PURE__ */ w("section", {
172
+ /* @__PURE__ */ T("section", {
173
173
  "aria-label": "Filter and search pipelines",
174
174
  "data-testid": "pipelines-toolbar",
175
175
  "data-section-emphasis": "bare",
176
- className: ee("bare", "neutral", "none"),
177
- children: [/* @__PURE__ */ C(c, {
176
+ className: r("bare", "neutral", "none"),
177
+ children: [/* @__PURE__ */ w(l, {
178
178
  value: L,
179
179
  onChange: (e) => {
180
180
  let t = new URLSearchParams(F);
181
181
  t.set("consoleId", e), I(t);
182
182
  }
183
- }), /* @__PURE__ */ w("div", {
183
+ }), /* @__PURE__ */ T("div", {
184
184
  className: "mt-form-gap flex flex-col gap-control-gap md:flex-row md:items-center md:justify-between",
185
185
  children: [
186
- /* @__PURE__ */ C("div", {
186
+ /* @__PURE__ */ w("div", {
187
187
  role: "group",
188
188
  "aria-label": "Filter by status",
189
189
  className: "flex min-w-0 max-w-full items-center gap-1 overflow-x-auto rounded-card bg-bg-sunken p-1",
190
- children: Q.map((e) => /* @__PURE__ */ C("button", {
190
+ children: Q.map((e) => /* @__PURE__ */ w("button", {
191
191
  type: "button",
192
192
  "aria-pressed": N === e.value,
193
193
  onClick: () => P(e.value),
@@ -204,27 +204,27 @@ var E = l(function() {
204
204
  children: e.label
205
205
  }, e.value))
206
206
  }),
207
- /* @__PURE__ */ w("div", {
207
+ /* @__PURE__ */ T("div", {
208
208
  role: "group",
209
209
  "aria-label": "Pipeline layout",
210
210
  className: "flex shrink-0 gap-1",
211
- children: [/* @__PURE__ */ C(x, {
211
+ children: [/* @__PURE__ */ w(S, {
212
212
  variant: R === "grid" ? "secondary" : "ghost",
213
213
  "aria-label": "Grid view",
214
214
  "aria-pressed": R === "grid",
215
215
  onClick: () => z("grid"),
216
- children: /* @__PURE__ */ C(y, { className: "h-icon-sm w-icon-sm" })
217
- }), /* @__PURE__ */ C(x, {
216
+ children: /* @__PURE__ */ w(b, { className: "h-icon-sm w-icon-sm" })
217
+ }), /* @__PURE__ */ w(S, {
218
218
  variant: R === "list" ? "secondary" : "ghost",
219
219
  "aria-label": "List view",
220
220
  "aria-pressed": R === "list",
221
221
  onClick: () => z("list"),
222
- children: /* @__PURE__ */ C(ie, { className: "h-icon-sm w-icon-sm" })
222
+ children: /* @__PURE__ */ w(re, { className: "h-icon-sm w-icon-sm" })
223
223
  })]
224
224
  }),
225
- /* @__PURE__ */ w("div", {
225
+ /* @__PURE__ */ T("div", {
226
226
  className: "relative w-full md:max-w-[320px]",
227
- children: [/* @__PURE__ */ C(ae, {
227
+ children: [/* @__PURE__ */ w(ie, {
228
228
  "aria-hidden": "true",
229
229
  style: {
230
230
  position: "absolute",
@@ -235,7 +235,7 @@ var E = l(function() {
235
235
  width: "var(--size-icon-sm)",
236
236
  color: "var(--color-text-muted)"
237
237
  }
238
- }), /* @__PURE__ */ C(le, {
238
+ }), /* @__PURE__ */ w(ce, {
239
239
  type: "text",
240
240
  "aria-label": E("bigconsole.pipelines.list.searchPlaceholder", "Search pipelines..."),
241
241
  placeholder: E("bigconsole.pipelines.list.searchPlaceholder", "Search pipelines..."),
@@ -250,57 +250,57 @@ var E = l(function() {
250
250
  ]
251
251
  })]
252
252
  }),
253
- /* @__PURE__ */ w(r, {
253
+ /* @__PURE__ */ T(i, {
254
254
  emphasis: "primary",
255
255
  headingLevel: 2,
256
256
  title: "Your pipelines",
257
257
  description: "Open one to review its stages, or run a quick test against sample input.",
258
- meta: !K || J.length > 0 ? /* @__PURE__ */ w("span", {
258
+ meta: !K || J.length > 0 ? /* @__PURE__ */ T("span", {
259
259
  className: "rounded-pill bg-bg-sunken px-2 py-0.5 text-xs font-medium text-text-secondary",
260
260
  children: [X.length, X.length === J.length ? "" : ` of ${J.length}`]
261
261
  }) : null,
262
262
  "data-testid": "pipelines-results",
263
263
  children: [
264
- K && J.length === 0 && /* @__PURE__ */ C("div", {
264
+ K && J.length === 0 && /* @__PURE__ */ w("div", {
265
265
  className: "flex items-center justify-center py-12",
266
266
  role: "status",
267
- children: /* @__PURE__ */ w("div", {
267
+ children: /* @__PURE__ */ T("div", {
268
268
  className: "text-center",
269
- children: [/* @__PURE__ */ C(S, { style: {
269
+ children: [/* @__PURE__ */ w(C, { style: {
270
270
  height: "var(--size-icon-xl)",
271
271
  width: "var(--size-icon-xl)",
272
272
  margin: "0 auto var(--space-formGap)"
273
- } }), /* @__PURE__ */ C("p", {
273
+ } }), /* @__PURE__ */ w("p", {
274
274
  className: "text-sm text-text-muted",
275
275
  children: E("bigconsole.pipelines.list.loading", "Loading pipelines...")
276
276
  })]
277
277
  })
278
278
  }),
279
- !K && J.length === 0 && /* @__PURE__ */ C("div", {
279
+ !K && J.length === 0 && /* @__PURE__ */ w("div", {
280
280
  "data-testid": "pipelines-empty",
281
- children: /* @__PURE__ */ C(ce, {
281
+ children: /* @__PURE__ */ w(se, {
282
282
  illustration: "empty-data",
283
283
  title: E("bigconsole.pipelines.list.emptyTitle", "No Pipelines yet"),
284
284
  description: E("bigconsole.pipelines.list.emptyDescription", "Create a pipeline to chain parsers together for sequential data transformation. Each stage processes the output of the previous stage."),
285
- action: /* @__PURE__ */ C(h, {
286
- permission: a.PIPELINE_CREATE,
285
+ action: /* @__PURE__ */ w(g, {
286
+ permission: o.PIPELINE_CREATE,
287
287
  deniedBehavior: "disable",
288
- children: /* @__PURE__ */ w(x, {
288
+ children: /* @__PURE__ */ T(S, {
289
289
  onClick: Z,
290
290
  className: "min-h-[var(--size-controlHeight-md)]",
291
- children: [/* @__PURE__ */ C(b, { className: "h-icon-sm w-icon-sm" }), E("bigconsole.pipelines.actions.createPipeline", "Create Pipeline")]
291
+ children: [/* @__PURE__ */ w(x, { className: "h-icon-sm w-icon-sm" }), E("bigconsole.pipelines.actions.createPipeline", "Create Pipeline")]
292
292
  })
293
293
  })
294
294
  })
295
295
  }),
296
- !K && X.length === 0 && J.length > 0 && /* @__PURE__ */ C(r, {
296
+ !K && X.length === 0 && J.length > 0 && /* @__PURE__ */ w(i, {
297
297
  emphasis: "muted",
298
298
  tone: "info",
299
299
  padding: "compact",
300
300
  headingLevel: 3,
301
301
  title: E("bigconsole.pipelines.list.noResultsTitle", "No matching pipelines"),
302
302
  description: E("bigconsole.pipelines.list.noResultsDescription", "No pipelines match your filters"),
303
- actions: /* @__PURE__ */ C(x, {
303
+ actions: /* @__PURE__ */ w(S, {
304
304
  size: "sm",
305
305
  variant: "secondary",
306
306
  onClick: _e,
@@ -308,10 +308,10 @@ var E = l(function() {
308
308
  }),
309
309
  "data-testid": "pipelines-no-results"
310
310
  }),
311
- X.length > 0 && /* @__PURE__ */ C("div", {
311
+ X.length > 0 && /* @__PURE__ */ w("div", {
312
312
  className: R === "grid" ? "grid grid-cols-1 gap-form-gap sm:grid-cols-2 xl:grid-cols-3" : "grid grid-cols-1 gap-form-gap",
313
313
  "data-layout": R,
314
- children: X.map((e) => /* @__PURE__ */ C(re, {
314
+ children: X.map((e) => /* @__PURE__ */ w(ne, {
315
315
  pipeline: e,
316
316
  onView: fe,
317
317
  onEdit: A ? pe : void 0,
@@ -323,7 +323,7 @@ var E = l(function() {
323
323
  })
324
324
  ] })
325
325
  }),
326
- U && /* @__PURE__ */ C(ne, {
326
+ U && /* @__PURE__ */ w(te, {
327
327
  pipeline: U,
328
328
  isOpen: H,
329
329
  onClose: G,
@@ -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 *\n * Section ladder (BOFF-5635):\n * bare — page header band, filter/search toolbar (structure only)\n * primary — \"Your pipelines\" results region: the block this route exists for\n * muted — nested empty / no-match states inside the results region\n * danger — load failure, rendered under the header so navigation survives\n */\n\nimport { useSearchParams } from 'react-router';\nimport { PipelineScopePicker } from '../components/pipeline/PipelineScopePicker';\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 { Section, SectionStack, SECTION_FOCUS_RING, sectionSurfaceClasses } from '../components/common';\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 { Spinner } from '@burdenoff/fe-libs/ui';\nimport { AuroraBackground, GradientText, IllustratedEmptyState, PagePurpose } from '@burdenoff/fe-libs/ui';\n\n// Lucide icons\nimport { Plus, Search, GitBranch, AlertCircle, LayoutGrid, List } 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 const [searchParams, setSearchParams] = useSearchParams();\n const consoleId = searchParams.get('consoleId') || 'default';\n const [viewMode, setViewMode] = useState<'grid' | 'list'>('grid');\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,\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?consoleId=${encodeURIComponent(consoleId)}`);\n }, [navigate, consoleId]);\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 const handleClearFilters = useCallback(() => {\n setStatusFilter('all');\n setSearchQuery('');\n }, [setSearchQuery]);\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 /**\n * Page header band. `bare` in the emphasis ladder: it carries the page\n * identity and the single create action, never a content surface. Rendered in\n * both the error and the normal branch so a failed load keeps its \"you are\n * here\" anchor instead of replacing the whole page.\n */\n const pageHeader = (\n <header className=\"relative overflow-hidden border-b border-[var(--color-border-seam)] bg-[image:var(--gradient-gloss-card)]\">\n <AuroraBackground intensity=\"subtle\" />\n <div\n className=\"flex flex-col gap-form-gap sm:flex-row sm:items-center sm:justify-between\"\n style={{ padding: 'var(--space-pagePadding)' }}\n >\n <div className=\"flex min-w-0 items-center gap-form-gap\">\n <span\n aria-hidden=\"true\"\n className=\"flex shrink-0 items-center justify-center rounded-card\"\n style={{\n height: 'var(--size-controlHeight-lg)',\n width: 'var(--size-controlHeight-lg)',\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 </span>\n <div className=\"min-w-0\">\n <h1 className=\"text-2xl font-bold leading-tight text-text-primary\">\n <GradientText>{t('bigconsole.pipelines.list.heading', 'Pipelines')}</GradientText>\n </h1>\n <p className=\"text-sm text-text-secondary\">\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\n onClick={handleCreatePipeline}\n className=\"w-full shrink-0 min-h-[var(--size-controlHeight-md)] sm:w-auto\"\n >\n <Plus className=\"h-icon-sm w-icon-sm\" />\n {t('bigconsole.pipelines.actions.createPipeline', 'Create Pipeline')}\n </Button>\n </PermissionButton>\n </div>\n </header>\n );\n\n // Error state — keep the header so the page never loses its context.\n if (error) {\n return (\n <div className=\"min-h-screen bg-bg-canvas\">\n {pageHeader}\n <div style={{ padding: 'var(--space-pagePadding)' }}>\n <Section\n tone=\"danger\"\n headingLevel={2}\n title={t('bigconsole.pipelines.errors.loadListTitle', 'Failed to load Pipelines')}\n description={error.message}\n icon={<AlertCircle className=\"h-icon-sm w-icon-sm\" />}\n actions={\n <Button size=\"sm\" onClick={() => refetch()}>\n {t('bigconsole.pipelines.actions.tryAgain', 'Try Again')}\n </Button>\n }\n data-testid=\"pipelines-error\"\n >\n <p className=\"text-sm text-text-secondary\">\n Nothing was changed. Retry once the console service is reachable again.\n </p>\n </Section>\n </div>\n </div>\n );\n }\n\n return (\n <div className=\"min-h-screen bg-bg-canvas\">\n {pageHeader}\n\n {/* Main Content */}\n <div style={{ padding: 'var(--space-pagePadding)' }}>\n <SectionStack>\n <PagePurpose className=\"max-w-[75ch]\">\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 {/* Toolbar — `bare` in the ladder: filters + search grouped so the eye\n reads one control row instead of two floating stripes. Written with\n `sectionSurfaceClasses` rather than <Section> because the block has\n no visible heading (see the ticket note on Section's required\n `title` prop). */}\n <section\n aria-label=\"Filter and search pipelines\"\n data-testid=\"pipelines-toolbar\"\n data-section-emphasis=\"bare\"\n className={sectionSurfaceClasses('bare', 'neutral', 'none')}\n >\n <PipelineScopePicker\n value={consoleId}\n onChange={(next) => {\n const params = new URLSearchParams(searchParams);\n params.set('consoleId', next);\n setSearchParams(params);\n }}\n />\n <div className=\"mt-form-gap flex flex-col gap-control-gap md:flex-row md:items-center md:justify-between\">\n {/* `min-w-0`: the pills are `shrink-0`, so without it this scroller\n refuses to shrink in the md row and pushes the search field out. */}\n <div\n role=\"group\"\n aria-label=\"Filter by status\"\n className=\"flex min-w-0 max-w-full items-center gap-1 overflow-x-auto rounded-card bg-bg-sunken p-1\"\n >\n {statusOptions.map((option) => (\n <button\n key={option.value}\n type=\"button\"\n aria-pressed={statusFilter === option.value}\n onClick={() => setStatusFilter(option.value)}\n className={`shrink-0 whitespace-nowrap rounded-button text-sm font-medium motion-safe:transition-colors ${SECTION_FOCUS_RING}`}\n style={{\n minHeight: 'var(--size-controlHeight-md)',\n padding: '0 var(--space-formGap)',\n border: 'none',\n cursor: 'pointer',\n backgroundColor: statusFilter === option.value ? 'var(--color-bg-surface)' : 'transparent',\n color:\n statusFilter === option.value ? 'var(--color-text-primary)' : 'var(--color-text-secondary)',\n boxShadow: statusFilter === option.value ? 'var(--shadow-elevation-1)' : 'none',\n }}\n >\n {option.label}\n </button>\n ))}\n </div>\n\n <div role=\"group\" aria-label=\"Pipeline layout\" className=\"flex shrink-0 gap-1\">\n <Button\n variant={viewMode === 'grid' ? 'secondary' : 'ghost'}\n aria-label=\"Grid view\"\n aria-pressed={viewMode === 'grid'}\n onClick={() => setViewMode('grid')}\n >\n <LayoutGrid className=\"h-icon-sm w-icon-sm\" />\n </Button>\n <Button\n variant={viewMode === 'list' ? 'secondary' : 'ghost'}\n aria-label=\"List view\"\n aria-pressed={viewMode === 'list'}\n onClick={() => setViewMode('list')}\n >\n <List className=\"h-icon-sm w-icon-sm\" />\n </Button>\n </div>\n <div className=\"relative w-full md:max-w-[320px]\">\n <Search\n aria-hidden=\"true\"\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 aria-label={t('bigconsole.pipelines.list.searchPlaceholder', 'Search pipelines...')}\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 </section>\n\n {/* Results — the one primary block on this route. */}\n <Section\n emphasis=\"primary\"\n headingLevel={2}\n title=\"Your pipelines\"\n description=\"Open one to review its stages, or run a quick test against sample input.\"\n meta={\n !loading || pipelines.length > 0 ? (\n <span className=\"rounded-pill bg-bg-sunken px-2 py-0.5 text-xs font-medium text-text-secondary\">\n {filteredPipelines.length}\n {filteredPipelines.length === pipelines.length ? '' : ` of ${pipelines.length}`}\n </span>\n ) : null\n }\n data-testid=\"pipelines-results\"\n >\n {/* Loading state */}\n {loading && pipelines.length === 0 && (\n <div className=\"flex items-center justify-center py-12\" role=\"status\">\n <div className=\"text-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 className=\"text-sm text-text-muted\">\n {t('bigconsole.pipelines.list.loading', 'Loading pipelines...')}\n </p>\n </div>\n </div>\n )}\n\n {/* Empty state — nothing created yet (onboarding). */}\n {!loading && pipelines.length === 0 && (\n <div data-testid=\"pipelines-empty\">\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} className=\"min-h-[var(--size-controlHeight-md)]\">\n <Plus className=\"h-icon-sm w-icon-sm\" />\n {t('bigconsole.pipelines.actions.createPipeline', 'Create Pipeline')}\n </Button>\n </PermissionButton>\n }\n />\n </div>\n )}\n\n {/* No results state — a filter problem, not an onboarding problem. */}\n {!loading && filteredPipelines.length === 0 && pipelines.length > 0 && (\n <Section\n emphasis=\"muted\"\n tone=\"info\"\n padding=\"compact\"\n headingLevel={3}\n title={t('bigconsole.pipelines.list.noResultsTitle', 'No matching pipelines')}\n description={t('bigconsole.pipelines.list.noResultsDescription', 'No pipelines match your filters')}\n actions={\n <Button size=\"sm\" variant=\"secondary\" onClick={handleClearFilters}>\n Clear filters\n </Button>\n }\n data-testid=\"pipelines-no-results\"\n />\n )}\n\n {/* Pipeline Grid */}\n {filteredPipelines.length > 0 && (\n <div\n className={\n viewMode === 'grid'\n ? 'grid grid-cols-1 gap-form-gap sm:grid-cols-2 xl:grid-cols-3'\n : 'grid grid-cols-1 gap-form-gap'\n }\n data-layout={viewMode}\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 </Section>\n </SectionStack>\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 *\n * Section ladder (BOFF-5635):\n * bare — page header band, filter/search toolbar (structure only)\n * primary — \"Your pipelines\" results region: the block this route exists for\n * muted — nested empty / no-match states inside the results region\n * danger — load failure, rendered under the header so navigation survives\n */\n\nimport { useSearchParams } from 'react-router';\nimport { PipelineScopePicker } from '../components/pipeline/PipelineScopePicker';\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 { Section, SectionStack, SECTION_FOCUS_RING, sectionSurfaceClasses } from '../components/common';\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 { Spinner } from '@burdenoff/fe-libs/ui';\nimport { AuroraBackground, GradientText, IllustratedEmptyState, PagePurpose } from '@burdenoff/fe-libs/ui';\n\n// Lucide icons\nimport { Plus, Search, GitBranch, AlertCircle, LayoutGrid, List } 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 const [searchParams, setSearchParams] = useSearchParams();\n const consoleId = searchParams.get('consoleId') || 'default';\n const [viewMode, setViewMode] = useState<'grid' | 'list'>('grid');\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,\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?consoleId=${encodeURIComponent(consoleId)}`);\n }, [navigate, consoleId]);\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 const handleClearFilters = useCallback(() => {\n setStatusFilter('all');\n setSearchQuery('');\n }, [setSearchQuery]);\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 /**\n * Page header band. `bare` in the emphasis ladder: it carries the page\n * identity and the single create action, never a content surface. Rendered in\n * both the error and the normal branch so a failed load keeps its \"you are\n * here\" anchor instead of replacing the whole page.\n */\n const pageHeader = (\n <header className=\"relative overflow-hidden border-b border-[var(--color-border-seam)] bg-[image:var(--gradient-gloss-card)]\">\n <AuroraBackground intensity=\"subtle\" />\n <div\n className=\"flex flex-col gap-form-gap sm:flex-row sm:items-center sm:justify-between\"\n style={{ padding: 'var(--space-pagePadding)' }}\n >\n <div className=\"flex min-w-0 items-center gap-form-gap\">\n <span\n aria-hidden=\"true\"\n className=\"flex shrink-0 items-center justify-center rounded-card\"\n style={{\n height: 'var(--size-controlHeight-lg)',\n width: 'var(--size-controlHeight-lg)',\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 </span>\n <div className=\"min-w-0\">\n <h1 className=\"text-2xl font-bold leading-tight text-text-primary\">\n <GradientText>{t('bigconsole.pipelines.list.heading', 'Pipelines')}</GradientText>\n </h1>\n <p className=\"text-sm text-text-secondary\">\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\n onClick={handleCreatePipeline}\n className=\"w-full shrink-0 min-h-[var(--size-controlHeight-md)] sm:w-auto\"\n >\n <Plus className=\"h-icon-sm w-icon-sm\" />\n {t('bigconsole.pipelines.actions.createPipeline', 'Create Pipeline')}\n </Button>\n </PermissionButton>\n </div>\n </header>\n );\n\n // Error state — keep the header so the page never loses its context.\n if (error) {\n return (\n <div className=\"min-h-screen bg-bg-canvas\">\n {pageHeader}\n <div style={{ padding: 'var(--space-pagePadding)' }}>\n <Section\n tone=\"danger\"\n headingLevel={2}\n title={t('bigconsole.pipelines.errors.loadListTitle', 'Failed to load Pipelines')}\n description={error.message}\n icon={<AlertCircle className=\"h-icon-sm w-icon-sm\" />}\n actions={\n <Button size=\"sm\" onClick={() => refetch()}>\n {t('bigconsole.pipelines.actions.tryAgain', 'Try Again')}\n </Button>\n }\n data-testid=\"pipelines-error\"\n >\n <p className=\"text-sm text-text-secondary\">\n Nothing was changed. Retry once the console service is reachable again.\n </p>\n </Section>\n </div>\n </div>\n );\n }\n\n return (\n <div className=\"min-h-screen bg-bg-canvas\">\n {pageHeader}\n\n {/* Main Content */}\n <div style={{ padding: 'var(--space-pagePadding)' }}>\n <SectionStack>\n <PagePurpose className=\"max-w-[75ch]\">\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 {/* Toolbar — `bare` in the ladder: filters + search grouped so the eye\n reads one control row instead of two floating stripes. Written with\n `sectionSurfaceClasses` rather than <Section> because the block has\n no visible heading (see the ticket note on Section's required\n `title` prop). */}\n <section\n aria-label=\"Filter and search pipelines\"\n data-testid=\"pipelines-toolbar\"\n data-section-emphasis=\"bare\"\n className={sectionSurfaceClasses('bare', 'neutral', 'none')}\n >\n <PipelineScopePicker\n value={consoleId}\n onChange={(next) => {\n const params = new URLSearchParams(searchParams);\n params.set('consoleId', next);\n setSearchParams(params);\n }}\n />\n <div className=\"mt-form-gap flex flex-col gap-control-gap md:flex-row md:items-center md:justify-between\">\n {/* `min-w-0`: the pills are `shrink-0`, so without it this scroller\n refuses to shrink in the md row and pushes the search field out. */}\n <div\n role=\"group\"\n aria-label=\"Filter by status\"\n className=\"flex min-w-0 max-w-full items-center gap-1 overflow-x-auto rounded-card bg-bg-sunken p-1\"\n >\n {statusOptions.map((option) => (\n <button\n key={option.value}\n type=\"button\"\n aria-pressed={statusFilter === option.value}\n onClick={() => setStatusFilter(option.value)}\n className={`shrink-0 whitespace-nowrap rounded-button text-sm font-medium motion-safe:transition-colors ${SECTION_FOCUS_RING}`}\n style={{\n minHeight: 'var(--size-controlHeight-md)',\n padding: '0 var(--space-formGap)',\n border: 'none',\n cursor: 'pointer',\n backgroundColor: statusFilter === option.value ? 'var(--color-bg-surface)' : 'transparent',\n color:\n statusFilter === option.value ? 'var(--color-text-primary)' : 'var(--color-text-secondary)',\n boxShadow: statusFilter === option.value ? 'var(--shadow-elevation-1)' : 'none',\n }}\n >\n {option.label}\n </button>\n ))}\n </div>\n\n <div role=\"group\" aria-label=\"Pipeline layout\" className=\"flex shrink-0 gap-1\">\n <Button\n variant={viewMode === 'grid' ? 'secondary' : 'ghost'}\n aria-label=\"Grid view\"\n aria-pressed={viewMode === 'grid'}\n onClick={() => setViewMode('grid')}\n >\n <LayoutGrid className=\"h-icon-sm w-icon-sm\" />\n </Button>\n <Button\n variant={viewMode === 'list' ? 'secondary' : 'ghost'}\n aria-label=\"List view\"\n aria-pressed={viewMode === 'list'}\n onClick={() => setViewMode('list')}\n >\n <List className=\"h-icon-sm w-icon-sm\" />\n </Button>\n </div>\n <div className=\"relative w-full md:max-w-[320px]\">\n <Search\n aria-hidden=\"true\"\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 aria-label={t('bigconsole.pipelines.list.searchPlaceholder', 'Search pipelines...')}\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 </section>\n\n {/* Results — the one primary block on this route. */}\n <Section\n emphasis=\"primary\"\n headingLevel={2}\n title=\"Your pipelines\"\n description=\"Open one to review its stages, or run a quick test against sample input.\"\n meta={\n !loading || pipelines.length > 0 ? (\n <span className=\"rounded-pill bg-bg-sunken px-2 py-0.5 text-xs font-medium text-text-secondary\">\n {filteredPipelines.length}\n {filteredPipelines.length === pipelines.length ? '' : ` of ${pipelines.length}`}\n </span>\n ) : null\n }\n data-testid=\"pipelines-results\"\n >\n {/* Loading state */}\n {loading && pipelines.length === 0 && (\n <div className=\"flex items-center justify-center py-12\" role=\"status\">\n <div className=\"text-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 className=\"text-sm text-text-muted\">\n {t('bigconsole.pipelines.list.loading', 'Loading pipelines...')}\n </p>\n </div>\n </div>\n )}\n\n {/* Empty state — nothing created yet (onboarding). */}\n {!loading && pipelines.length === 0 && (\n <div data-testid=\"pipelines-empty\">\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} className=\"min-h-[var(--size-controlHeight-md)]\">\n <Plus className=\"h-icon-sm w-icon-sm\" />\n {t('bigconsole.pipelines.actions.createPipeline', 'Create Pipeline')}\n </Button>\n </PermissionButton>\n }\n />\n </div>\n )}\n\n {/* No results state — a filter problem, not an onboarding problem. */}\n {!loading && filteredPipelines.length === 0 && pipelines.length > 0 && (\n <Section\n emphasis=\"muted\"\n tone=\"info\"\n padding=\"compact\"\n headingLevel={3}\n title={t('bigconsole.pipelines.list.noResultsTitle', 'No matching pipelines')}\n description={t('bigconsole.pipelines.list.noResultsDescription', 'No pipelines match your filters')}\n actions={\n <Button size=\"sm\" variant=\"secondary\" onClick={handleClearFilters}>\n Clear filters\n </Button>\n }\n data-testid=\"pipelines-no-results\"\n />\n )}\n\n {/* Pipeline Grid */}\n {filteredPipelines.length > 0 && (\n <div\n className={\n viewMode === 'grid'\n ? 'grid grid-cols-1 gap-form-gap sm:grid-cols-2 xl:grid-cols-3'\n : 'grid grid-cols-1 gap-form-gap'\n }\n data-layout={viewMode}\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 </Section>\n </SectionStack>\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 +1 @@
1
- {"version":3,"file":"SettingsPage.d.ts","sourceRoot":"","sources":["../../../src/bigconsole/pages/SettingsPage.tsx"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,KAAK,EAAE,EAA0C,MAAM,OAAO,CAAC;AAgBxE,eAAO,MAAM,YAAY,EAAE,EA4czB,CAAC;AAEH,eAAe,YAAY,CAAC"}
1
+ {"version":3,"file":"SettingsPage.d.ts","sourceRoot":"","sources":["../../../src/bigconsole/pages/SettingsPage.tsx"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,KAAK,EAAE,EAA0C,MAAM,OAAO,CAAC;AAkBxE,eAAO,MAAM,YAAY,EAAE,EAqdzB,CAAC;AAEH,eAAe,YAAY,CAAC"}