@burdenoff/microfe-adaptercloud 2026.801.1 → 2026.802.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1,35 @@
1
- import "react/jsx-runtime";
1
+ import { jsx as e, jsxs as t } from "react/jsx-runtime";
2
+ //#region src/adaptercloud/components/viz/StackedBar.tsx
3
+ var n = ({ segments: n, showLegend: r = !0, heightClassName: i = "h-3", ariaLabel: a }) => {
4
+ let o = n.reduce((e, t) => e + Math.max(0, t.value), 0);
5
+ return /* @__PURE__ */ t("div", { children: [/* @__PURE__ */ e("div", {
6
+ className: `flex ${i} w-full overflow-hidden rounded-full bg-bg-sunken`,
7
+ role: "img",
8
+ "aria-label": a ?? n.map((e) => `${e.label}: ${e.value}`).join(", "),
9
+ children: o === 0 ? /* @__PURE__ */ e("div", { className: "h-full w-full bg-bg-muted/50" }) : n.filter((e) => e.value > 0).map((t) => /* @__PURE__ */ e("div", {
10
+ className: `h-full ${t.className} transition-[width] duration-500`,
11
+ style: { width: `${t.value / o * 100}%` },
12
+ title: `${t.label}: ${t.value}`
13
+ }, t.key))
14
+ }), r && /* @__PURE__ */ e("ul", {
15
+ className: "mt-3 flex flex-wrap gap-x-4 gap-y-2",
16
+ children: n.map((n) => /* @__PURE__ */ t("li", {
17
+ className: "flex items-center gap-1.5 text-xs text-text-secondary",
18
+ children: [
19
+ /* @__PURE__ */ e("span", {
20
+ className: `h-2.5 w-2.5 shrink-0 rounded-full ${n.className}`,
21
+ "aria-hidden": !0
22
+ }),
23
+ /* @__PURE__ */ e("span", { children: n.label }),
24
+ /* @__PURE__ */ e("span", {
25
+ className: "font-semibold tabular-nums text-text-primary",
26
+ children: n.value
27
+ })
28
+ ]
29
+ }, n.key))
30
+ })] });
31
+ };
32
+ //#endregion
33
+ export { n as StackedBar };
34
+
35
+ //# sourceMappingURL=StackedBar.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"StackedBar.js","names":[],"sources":["../../../../src/adaptercloud/components/viz/StackedBar.tsx"],"sourcesContent":["/**\n * StackedBar — a proportional horizontal stacked bar with an optional legend.\n * Fully tokenized (no raw colors); each segment supplies a semantic-token bar\n * class. Used for breakdowns like connection health or violation severity mix.\n */\nimport type { FC } from 'react';\n\nexport interface StackedSegment {\n key: string;\n label: string;\n value: number;\n /** Semantic-token background class for the segment + legend dot, e.g. `bg-status-success-text`. */\n className: string;\n}\n\ninterface StackedBarProps {\n segments: StackedSegment[];\n showLegend?: boolean;\n /** Bar thickness class (default h-3). */\n heightClassName?: string;\n ariaLabel?: string;\n}\n\nexport const StackedBar: FC<StackedBarProps> = ({\n segments,\n showLegend = true,\n heightClassName = 'h-3',\n ariaLabel,\n}) => {\n const total = segments.reduce((acc, s) => acc + Math.max(0, s.value), 0);\n\n return (\n <div>\n <div\n className={`flex ${heightClassName} w-full overflow-hidden rounded-full bg-bg-sunken`}\n role=\"img\"\n aria-label={ariaLabel ?? segments.map((s) => `${s.label}: ${s.value}`).join(', ')}\n >\n {total === 0 ? (\n <div className=\"h-full w-full bg-bg-muted/50\" />\n ) : (\n segments\n .filter((s) => s.value > 0)\n .map((s) => (\n <div\n key={s.key}\n className={`h-full ${s.className} transition-[width] duration-500`}\n style={{ width: `${(s.value / total) * 100}%` }}\n title={`${s.label}: ${s.value}`}\n />\n ))\n )}\n </div>\n\n {showLegend && (\n <ul className=\"mt-3 flex flex-wrap gap-x-4 gap-y-2\">\n {segments.map((s) => (\n <li key={s.key} className=\"flex items-center gap-1.5 text-xs text-text-secondary\">\n <span className={`h-2.5 w-2.5 shrink-0 rounded-full ${s.className}`} aria-hidden />\n <span>{s.label}</span>\n <span className=\"font-semibold tabular-nums text-text-primary\">{s.value}</span>\n </li>\n ))}\n </ul>\n )}\n </div>\n );\n};\n"],"mappings":";;AAuBA,IAAa,KAAmC,EAC9C,aACA,gBAAa,IACb,qBAAkB,OAClB,mBACI;CACJ,IAAM,IAAQ,EAAS,QAAQ,GAAK,MAAM,IAAM,KAAK,IAAI,GAAG,EAAE,KAAK,GAAG,CAAC;CAEvE,OACE,kBAAC,OAAD,EAAA,UAAA,CACE,kBAAC,OAAD;EACE,WAAW,QAAQ,EAAgB;EACnC,MAAK;EACL,cAAY,KAAa,EAAS,KAAK,MAAM,GAAG,EAAE,MAAM,IAAI,EAAE,OAAO,EAAE,KAAK,IAAI;YAE/E,MAAU,IACT,kBAAC,OAAD,EAAK,WAAU,+BAAgC,CAAA,IAE/C,EACG,QAAQ,MAAM,EAAE,QAAQ,CAAC,EACzB,KAAK,MACJ,kBAAC,OAAD;GAEE,WAAW,UAAU,EAAE,UAAU;GACjC,OAAO,EAAE,OAAO,GAAI,EAAE,QAAQ,IAAS,IAAI,GAAG;GAC9C,OAAO,GAAG,EAAE,MAAM,IAAI,EAAE;EACzB,GAJM,EAAE,GAIR,CACF;CAEF,CAAA,GAEJ,KACC,kBAAC,MAAD;EAAI,WAAU;YACX,EAAS,KAAK,MACb,kBAAC,MAAD;GAAgB,WAAU;aAA1B;IACE,kBAAC,QAAD;KAAM,WAAW,qCAAqC,EAAE;KAAa,eAAA;IAAa,CAAA;IAClF,kBAAC,QAAD,EAAA,UAAO,EAAE,MAAY,CAAA;IACrB,kBAAC,QAAD;KAAM,WAAU;eAAgD,EAAE;IAAY,CAAA;GAC5E;KAJK,EAAE,GAIP,CACL;CACC,CAAA,CAEH,EAAA,CAAA;AAET"}
@@ -1 +1 @@
1
- {"version":3,"file":"OverviewPage.d.ts","sourceRoot":"","sources":["../../../src/adaptercloud/pages/OverviewPage.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AA+CH,wBAAgB,YAAY,gCA8W3B"}
1
+ {"version":3,"file":"OverviewPage.d.ts","sourceRoot":"","sources":["../../../src/adaptercloud/pages/OverviewPage.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAgDH,wBAAgB,YAAY,gCAmY3B"}
@@ -4,27 +4,30 @@ import { MetricsCard as n } from "../components/MetricsCard.js";
4
4
  import { formatMoney as r, severityRank as i, syncKindLabels as a } from "../utils/domain.js";
5
5
  import { StatusBadge as o } from "../components/StatusBadge.js";
6
6
  import { SeverityBadge as s } from "../components/SeverityBadge.js";
7
- import { DataState as c } from "../components/DataState.js";
8
- import { useAdapters as l, useConnections as u, useCostSummary as d, useDriftRecords as f, useResources as p, useSyncRuns as m, useViolations as h } from "../hooks/useAdapterCloudApi.js";
9
- import { formatRelativeTime as g } from "../utils/formatters.js";
10
- import { useCallback as _, useMemo as v } from "react";
11
- import { useI18n as y } from "@burdenoff/fe-libs/shared/providers/shell/I18nProvider";
12
- import { Activity as b, AlertCircle as x, ArrowRight as S, Boxes as C, Cable as w, DollarSign as T, GitCompareArrows as E, Plug as D, RefreshCw as O, Server as k, ShieldAlert as A } from "lucide-react";
13
- import { jsx as j, jsxs as M } from "react/jsx-runtime";
14
- import { EmphasisPanel as ee, GlassCard as N, PagePurpose as P } from "@burdenoff/fe-libs/ui";
7
+ import { DataState as ee } from "../components/DataState.js";
8
+ import { StackedBar as c } from "../components/viz/StackedBar.js";
9
+ import { BarChart as l } from "../components/viz/BarChart.js";
10
+ import "../components/viz/index.js";
11
+ import { useAdapters as u, useConnections as d, useCostSummary as f, useDriftRecords as p, useResources as m, useSyncRuns as h, useViolations as g } from "../hooks/useAdapterCloudApi.js";
12
+ import { formatRelativeTime as _ } from "../utils/formatters.js";
13
+ import { useCallback as v, useMemo as y } from "react";
14
+ import { useI18n as te } from "@burdenoff/fe-libs/shared/providers/shell/I18nProvider";
15
+ import { Activity as b, AlertCircle as x, ArrowRight as S, Boxes as C, Cable as w, DollarSign as T, GitCompareArrows as E, Plug as ne, RefreshCw as D, Server as re, ShieldAlert as O } from "lucide-react";
16
+ import { jsx as k, jsxs as A } from "react/jsx-runtime";
17
+ import { EmphasisPanel as j, GlassCard as M, PagePurpose as N } from "@burdenoff/fe-libs/ui";
15
18
  //#region src/adaptercloud/pages/OverviewPage.tsx
16
- function F(e) {
19
+ function P(e) {
17
20
  return e ? String(e.pageInfo.totalCount ?? e.items.length) : "—";
18
21
  }
19
- function I() {
20
- let { navigateTo: I, currentUser: L } = e(), { t: R } = y(), z = _((e, t) => {
21
- let n = R(e);
22
+ function F() {
23
+ let { navigateTo: F, currentUser: I } = e(), { t: L } = te(), R = v((e, t) => {
24
+ let n = L(e);
22
25
  return n === e ? t : n;
23
- }, [R]), B = l({ pagination: { limit: 100 } }), V = u({ pagination: { limit: 100 } }), H = p({ pagination: { limit: 100 } }), U = h({
26
+ }, [L]), z = u({ pagination: { limit: 100 } }), B = d({ pagination: { limit: 100 } }), V = m({ pagination: { limit: 100 } }), H = g({
24
27
  status: "OPEN",
25
28
  pagination: { limit: 50 }
26
- }), W = f({ status: "DETECTED" }), G = m({ pagination: { limit: 5 } }), K = d(), q = L?.firstName ?? L?.name ?? "there", J = v(() => {
27
- let e = V.data?.items ?? [], t = {
29
+ }), U = p({ status: "DETECTED" }), W = h({ pagination: { limit: 5 } }), G = f(), K = I?.firstName ?? I?.name ?? "there", q = y(() => {
30
+ let e = B.data?.items ?? [], t = {
28
31
  CONNECTED: 0,
29
32
  DEGRADED: 0,
30
33
  ERROR: 0,
@@ -33,72 +36,108 @@ function I() {
33
36
  };
34
37
  for (let n of e) t[n.status] += 1;
35
38
  return t;
36
- }, [V.data]), Y = v(() => [...U.data?.items ?? []].sort((e, t) => i[t.severity] - i[e.severity]).slice(0, 5), [U.data]), X = G.data?.items ?? [], Z = v(() => [...K.data?.lines ?? []].sort((e, t) => t.total - e.total).slice(0, 6), [K.data]), Q = B.isLoading || V.isLoading || H.isLoading || U.isLoading || W.isLoading || K.isLoading, te = B.isError || V.isError || H.isError || U.isError || W.isError || K.isError, $ = _(() => {
37
- B.refetch(), V.refetch(), H.refetch(), U.refetch(), W.refetch(), G.refetch(), K.refetch();
39
+ }, [B.data]), J = y(() => [
40
+ {
41
+ key: "CONNECTED",
42
+ label: "Connected",
43
+ value: q.CONNECTED,
44
+ className: "bg-status-success-text"
45
+ },
46
+ {
47
+ key: "DEGRADED",
48
+ label: "Degraded",
49
+ value: q.DEGRADED,
50
+ className: "bg-status-warning-text"
51
+ },
52
+ {
53
+ key: "ERROR",
54
+ label: "Error",
55
+ value: q.ERROR,
56
+ className: "bg-status-error-text"
57
+ },
58
+ {
59
+ key: "PENDING",
60
+ label: "Pending",
61
+ value: q.PENDING,
62
+ className: "bg-accent-blue"
63
+ },
64
+ {
65
+ key: "DISABLED",
66
+ label: "Disabled",
67
+ value: q.DISABLED,
68
+ className: "bg-text-secondary"
69
+ }
70
+ ], [q]), Y = y(() => [...H.data?.items ?? []].sort((e, t) => i[t.severity] - i[e.severity]).slice(0, 5), [H.data]), X = W.data?.items ?? [], Z = y(() => [...G.data?.lines ?? []].sort((e, t) => t.total - e.total).slice(0, 6), [G.data]), Q = y(() => Z.map((e) => ({
71
+ key: e.service,
72
+ label: e.service,
73
+ value: e.total,
74
+ display: r(e.total, G.data?.currency ?? "USD")
75
+ })), [Z, G.data?.currency]), ie = z.isLoading || B.isLoading || V.isLoading || H.isLoading || U.isLoading || G.isLoading, ae = z.isError || B.isError || V.isError || H.isError || U.isError || G.isError, $ = v(() => {
76
+ z.refetch(), B.refetch(), V.refetch(), H.refetch(), U.refetch(), W.refetch(), G.refetch();
38
77
  }, [
78
+ z,
39
79
  B,
40
80
  V,
41
81
  H,
42
82
  U,
43
83
  W,
44
- G,
45
- K
46
- ]), ne = [
84
+ G
85
+ ]), oe = [
47
86
  {
48
- icon: /* @__PURE__ */ j(C, { className: "h-5 w-5" }),
49
- value: F(B.data),
50
- label: z("adaptercloud.overview.adapters", "Adapters"),
51
- onClick: () => I("/adapters")
87
+ icon: /* @__PURE__ */ k(C, { className: "h-5 w-5" }),
88
+ value: P(z.data),
89
+ label: R("adaptercloud.overview.adapters", "Adapters"),
90
+ onClick: () => F("/adapters")
52
91
  },
53
92
  {
54
- icon: /* @__PURE__ */ j(w, { className: "h-5 w-5" }),
55
- value: F(V.data),
56
- label: z("adaptercloud.overview.connections", "Connections"),
57
- onClick: () => I("/connections")
93
+ icon: /* @__PURE__ */ k(w, { className: "h-5 w-5" }),
94
+ value: P(B.data),
95
+ label: R("adaptercloud.overview.connections", "Connections"),
96
+ onClick: () => F("/connections")
58
97
  },
59
98
  {
60
- icon: /* @__PURE__ */ j(k, { className: "h-5 w-5" }),
61
- value: F(H.data),
62
- label: z("adaptercloud.overview.resources", "Resources"),
63
- onClick: () => I("/resources")
99
+ icon: /* @__PURE__ */ k(re, { className: "h-5 w-5" }),
100
+ value: P(V.data),
101
+ label: R("adaptercloud.overview.resources", "Resources"),
102
+ onClick: () => F("/resources")
64
103
  },
65
104
  {
66
- icon: /* @__PURE__ */ j(A, { className: "h-5 w-5" }),
67
- value: F(U.data),
68
- label: z("adaptercloud.overview.openViolations", "Open Violations"),
69
- onClick: () => I("/violations")
105
+ icon: /* @__PURE__ */ k(O, { className: "h-5 w-5" }),
106
+ value: P(H.data),
107
+ label: R("adaptercloud.overview.openViolations", "Open Violations"),
108
+ onClick: () => F("/violations")
70
109
  }
71
110
  ];
72
- return /* @__PURE__ */ M(t, {
73
- title: `${z("adaptercloud.overview.hello", "Welcome back")}, ${q}`,
74
- description: z("adaptercloud.overview.subtitle", "Your infrastructure continuum at a glance — fabric, governance, operations and cost."),
75
- actions: /* @__PURE__ */ M("button", {
111
+ return /* @__PURE__ */ A(t, {
112
+ title: `${R("adaptercloud.overview.hello", "Welcome back")}, ${K}`,
113
+ description: R("adaptercloud.overview.subtitle", "Your infrastructure continuum at a glance — fabric, governance, operations and cost."),
114
+ actions: /* @__PURE__ */ A("button", {
76
115
  type: "button",
77
116
  onClick: $,
78
117
  className: "inline-flex items-center gap-2 rounded-lg border border-border-subtle bg-bg-surface px-3 py-2 text-sm font-medium text-text-primary transition-colors hover:bg-accent",
79
- children: [/* @__PURE__ */ j(O, { className: "h-4 w-4" }), z("adaptercloud.common.refresh", "Refresh")]
118
+ children: [/* @__PURE__ */ k(D, { className: "h-4 w-4" }), R("adaptercloud.common.refresh", "Refresh")]
80
119
  }),
81
- children: [/* @__PURE__ */ j(P, {
120
+ children: [/* @__PURE__ */ k(N, {
82
121
  className: "mb-6",
83
- children: z("adaptercloud.overview.purpose", "AdapterCloud connects your fragmented infrastructure — multi-cloud, on-prem, edge and SaaS — into one governable fabric. This overview is your control plane: see what you run, how connected it is, what is out of policy, and what it costs.")
84
- }), /* @__PURE__ */ M(c, {
85
- isLoading: Q,
86
- isError: te,
87
- error: B.error,
122
+ children: R("adaptercloud.overview.purpose", "AdapterCloud connects your fragmented infrastructure — multi-cloud, on-prem, edge and SaaS — into one governable fabric. This overview is your control plane: see what you run, how connected it is, what is out of policy, and what it costs.")
123
+ }), /* @__PURE__ */ A(ee, {
124
+ isLoading: ie,
125
+ isError: ae,
126
+ error: z.error,
88
127
  onRetry: $,
89
128
  children: [
90
- /* @__PURE__ */ M(ee, {
129
+ /* @__PURE__ */ A(j, {
91
130
  className: "mb-8",
92
- children: [/* @__PURE__ */ j("h2", {
131
+ children: [/* @__PURE__ */ k("h2", {
93
132
  className: "mb-4 text-lg font-semibold text-text-primary",
94
- children: z("adaptercloud.overview.estate", "Estate Summary")
95
- }), /* @__PURE__ */ j("div", {
133
+ children: R("adaptercloud.overview.estate", "Estate Summary")
134
+ }), /* @__PURE__ */ k("div", {
96
135
  className: "grid grid-cols-2 gap-4 lg:grid-cols-4",
97
- children: ne.map((e) => /* @__PURE__ */ j("button", {
136
+ children: oe.map((e) => /* @__PURE__ */ k("button", {
98
137
  type: "button",
99
138
  onClick: e.onClick,
100
139
  className: "text-left",
101
- children: /* @__PURE__ */ j(n, {
140
+ children: /* @__PURE__ */ k(n, {
102
141
  icon: e.icon,
103
142
  value: e.value,
104
143
  label: e.label
@@ -106,223 +145,199 @@ function I() {
106
145
  }, e.label))
107
146
  })]
108
147
  }),
109
- /* @__PURE__ */ M("div", {
148
+ /* @__PURE__ */ A("div", {
110
149
  className: "mb-8 grid grid-cols-1 gap-6 lg:grid-cols-2",
111
- children: [/* @__PURE__ */ M("section", { children: [/* @__PURE__ */ M("div", {
150
+ children: [/* @__PURE__ */ A("section", { children: [/* @__PURE__ */ A("div", {
112
151
  className: "mb-4 flex items-center justify-between",
113
- children: [/* @__PURE__ */ j("h2", {
152
+ children: [/* @__PURE__ */ k("h2", {
114
153
  className: "text-lg font-semibold text-text-primary",
115
- children: z("adaptercloud.overview.connectionHealth", "Connection Health")
116
- }), /* @__PURE__ */ M("button", {
154
+ children: R("adaptercloud.overview.connectionHealth", "Connection Health")
155
+ }), /* @__PURE__ */ A("button", {
117
156
  type: "button",
118
- onClick: () => I("/connections"),
157
+ onClick: () => F("/connections"),
119
158
  className: "flex items-center gap-1 text-sm font-medium text-accent-blue hover:underline",
120
159
  children: [
121
- z("adaptercloud.common.viewAll", "View all"),
160
+ R("adaptercloud.common.viewAll", "View all"),
122
161
  " ",
123
- /* @__PURE__ */ j(S, { className: "h-3.5 w-3.5" })
162
+ /* @__PURE__ */ k(S, { className: "h-3.5 w-3.5" })
124
163
  ]
125
164
  })]
126
- }), /* @__PURE__ */ j(N, {
165
+ }), /* @__PURE__ */ k(M, {
127
166
  className: "p-5",
128
- children: V.data && V.data.items.length > 0 ? /* @__PURE__ */ j("ul", {
129
- className: "space-y-3",
130
- children: [
131
- ["CONNECTED", J.CONNECTED],
132
- ["DEGRADED", J.DEGRADED],
133
- ["ERROR", J.ERROR],
134
- ["PENDING", J.PENDING],
135
- ["DISABLED", J.DISABLED]
136
- ].map(([e, t]) => /* @__PURE__ */ M("li", {
137
- className: "flex items-center justify-between",
138
- children: [/* @__PURE__ */ j(o, { status: e }), /* @__PURE__ */ j("span", {
139
- className: "text-sm font-semibold tabular-nums text-text-primary",
140
- children: t
141
- })]
142
- }, e))
143
- }) : /* @__PURE__ */ M("div", {
167
+ children: B.data && B.data.items.length > 0 ? /* @__PURE__ */ k(c, { segments: J }) : /* @__PURE__ */ A("div", {
144
168
  className: "flex flex-col items-center gap-3 py-6 text-center",
145
169
  children: [
146
- /* @__PURE__ */ j(D, { className: "h-8 w-8 text-text-secondary" }),
147
- /* @__PURE__ */ j("p", {
170
+ /* @__PURE__ */ k(ne, { className: "h-8 w-8 text-text-secondary" }),
171
+ /* @__PURE__ */ k("p", {
148
172
  className: "text-sm text-text-secondary",
149
- children: z("adaptercloud.overview.noConnections", "No connections yet. Connect a target to start discovering resources.")
173
+ children: R("adaptercloud.overview.noConnections", "No connections yet. Connect a target to start discovering resources.")
150
174
  }),
151
- /* @__PURE__ */ j("button", {
175
+ /* @__PURE__ */ k("button", {
152
176
  type: "button",
153
- onClick: () => I("/connections/new"),
177
+ onClick: () => F("/connections/new"),
154
178
  className: "rounded-lg bg-action-primary-bg px-4 py-2 text-sm font-medium text-action-primary-text transition-colors hover:opacity-90",
155
- children: z("adaptercloud.overview.addConnection", "Add connection")
179
+ children: R("adaptercloud.overview.addConnection", "Add connection")
156
180
  })
157
181
  ]
158
182
  })
159
- })] }), /* @__PURE__ */ M("section", { children: [/* @__PURE__ */ M("div", {
183
+ })] }), /* @__PURE__ */ A("section", { children: [/* @__PURE__ */ A("div", {
160
184
  className: "mb-4 flex items-center justify-between",
161
- children: [/* @__PURE__ */ j("h2", {
185
+ children: [/* @__PURE__ */ k("h2", {
162
186
  className: "text-lg font-semibold text-text-primary",
163
- children: z("adaptercloud.overview.costByService", "Cost by Service")
164
- }), /* @__PURE__ */ M("button", {
187
+ children: R("adaptercloud.overview.costByService", "Cost by Service")
188
+ }), /* @__PURE__ */ A("button", {
165
189
  type: "button",
166
- onClick: () => I("/costs"),
190
+ onClick: () => F("/costs"),
167
191
  className: "flex items-center gap-1 text-sm font-medium text-accent-blue hover:underline",
168
192
  children: [
169
- z("adaptercloud.overview.finops", "FinOps"),
193
+ R("adaptercloud.overview.finops", "FinOps"),
170
194
  " ",
171
- /* @__PURE__ */ j(S, { className: "h-3.5 w-3.5" })
195
+ /* @__PURE__ */ k(S, { className: "h-3.5 w-3.5" })
172
196
  ]
173
197
  })]
174
- }), /* @__PURE__ */ M(N, {
198
+ }), /* @__PURE__ */ A(M, {
175
199
  className: "p-5",
176
- children: [/* @__PURE__ */ M("div", {
200
+ children: [/* @__PURE__ */ A("div", {
177
201
  className: "mb-4 flex items-baseline gap-2",
178
202
  children: [
179
- /* @__PURE__ */ j(T, { className: "h-5 w-5 text-text-secondary" }),
180
- /* @__PURE__ */ j("span", {
203
+ /* @__PURE__ */ k(T, { className: "h-5 w-5 text-text-secondary" }),
204
+ /* @__PURE__ */ k("span", {
181
205
  className: "text-2xl font-bold tabular-nums text-text-primary",
182
- children: K.data ? r(K.data.total, K.data.currency) : "—"
206
+ children: G.data ? r(G.data.total, G.data.currency) : "—"
183
207
  }),
184
- /* @__PURE__ */ j("span", {
208
+ /* @__PURE__ */ k("span", {
185
209
  className: "text-sm text-text-secondary",
186
- children: z("adaptercloud.overview.totalSpend", "total spend")
210
+ children: R("adaptercloud.overview.totalSpend", "total spend")
187
211
  })
188
212
  ]
189
- }), Z.length > 0 ? /* @__PURE__ */ j("ul", {
190
- className: "space-y-2",
191
- children: Z.map((e) => /* @__PURE__ */ M("li", {
192
- className: "flex items-center justify-between text-sm",
193
- children: [/* @__PURE__ */ j("span", {
194
- className: "truncate text-text-primary",
195
- children: e.service
196
- }), /* @__PURE__ */ j("span", {
197
- className: "tabular-nums text-text-secondary",
198
- children: r(e.total, K.data?.currency ?? "USD")
199
- })]
200
- }, e.service))
201
- }) : /* @__PURE__ */ j("p", {
213
+ }), Q.length > 0 ? /* @__PURE__ */ k(l, {
214
+ data: Q,
215
+ labelWidthClassName: "w-24 sm:w-32"
216
+ }) : /* @__PURE__ */ k("p", {
202
217
  className: "py-4 text-center text-sm text-text-secondary",
203
- children: z("adaptercloud.overview.noCost", "No cost records ingested yet. Run a cost-ingest sync to populate FinOps.")
218
+ children: R("adaptercloud.overview.noCost", "No cost records ingested yet. Run a cost-ingest sync to populate FinOps.")
204
219
  })]
205
220
  })] })]
206
221
  }),
207
- /* @__PURE__ */ M("div", {
222
+ /* @__PURE__ */ A("div", {
208
223
  className: "grid grid-cols-1 gap-6 lg:grid-cols-2",
209
- children: [/* @__PURE__ */ M("section", { children: [
210
- /* @__PURE__ */ M("div", {
224
+ children: [/* @__PURE__ */ A("section", { children: [
225
+ /* @__PURE__ */ A("div", {
211
226
  className: "mb-4 flex items-center justify-between",
212
- children: [/* @__PURE__ */ j("h2", {
227
+ children: [/* @__PURE__ */ k("h2", {
213
228
  className: "text-lg font-semibold text-text-primary",
214
- children: z("adaptercloud.overview.priorityViolations", "Priority Violations")
215
- }), /* @__PURE__ */ M("button", {
229
+ children: R("adaptercloud.overview.priorityViolations", "Priority Violations")
230
+ }), /* @__PURE__ */ A("button", {
216
231
  type: "button",
217
- onClick: () => I("/violations"),
232
+ onClick: () => F("/violations"),
218
233
  className: "flex items-center gap-1 text-sm font-medium text-accent-blue hover:underline",
219
234
  children: [
220
- z("adaptercloud.overview.queue", "Queue"),
235
+ R("adaptercloud.overview.queue", "Queue"),
221
236
  " ",
222
- /* @__PURE__ */ j(S, { className: "h-3.5 w-3.5" })
237
+ /* @__PURE__ */ k(S, { className: "h-3.5 w-3.5" })
223
238
  ]
224
239
  })]
225
240
  }),
226
- /* @__PURE__ */ j("div", {
241
+ /* @__PURE__ */ k("div", {
227
242
  className: "divide-y divide-border rounded-xl border border-border-subtle bg-bg-surface",
228
- children: Y.length > 0 ? Y.map((e) => /* @__PURE__ */ M("button", {
243
+ children: Y.length > 0 ? Y.map((e) => /* @__PURE__ */ A("button", {
229
244
  type: "button",
230
- onClick: () => I("/violations"),
245
+ onClick: () => F("/violations"),
231
246
  className: "flex w-full items-start gap-3 px-4 py-3 text-left transition-colors hover:bg-accent/50",
232
247
  children: [
233
- /* @__PURE__ */ j(x, { className: "mt-0.5 h-4 w-4 shrink-0 text-status-error-text" }),
234
- /* @__PURE__ */ M("div", {
248
+ /* @__PURE__ */ k(x, { className: "mt-0.5 h-4 w-4 shrink-0 text-status-error-text" }),
249
+ /* @__PURE__ */ A("div", {
235
250
  className: "min-w-0 flex-1",
236
- children: [/* @__PURE__ */ j("p", {
251
+ children: [/* @__PURE__ */ k("p", {
237
252
  className: "truncate text-sm font-medium text-text-primary",
238
253
  children: e.message
239
- }), /* @__PURE__ */ M("p", {
254
+ }), /* @__PURE__ */ A("p", {
240
255
  className: "mt-0.5 text-xs text-text-secondary",
241
256
  children: [
242
- e.policy?.name ?? z("adaptercloud.overview.policy", "Policy"),
257
+ e.policy?.name ?? R("adaptercloud.overview.policy", "Policy"),
243
258
  " ·",
244
259
  " ",
245
- g(e.detectedAt)
260
+ _(e.detectedAt)
246
261
  ]
247
262
  })]
248
263
  }),
249
- /* @__PURE__ */ j(s, { severity: e.severity })
264
+ /* @__PURE__ */ k(s, { severity: e.severity })
250
265
  ]
251
- }, e.id)) : /* @__PURE__ */ M("div", {
266
+ }, e.id)) : /* @__PURE__ */ A("div", {
252
267
  className: "flex flex-col items-center gap-2 px-4 py-8 text-center",
253
- children: [/* @__PURE__ */ j(A, { className: "h-8 w-8 text-status-success-text" }), /* @__PURE__ */ j("p", {
268
+ children: [/* @__PURE__ */ k(O, { className: "h-8 w-8 text-status-success-text" }), /* @__PURE__ */ k("p", {
254
269
  className: "text-sm text-text-secondary",
255
- children: z("adaptercloud.overview.noViolations", "No open violations. Estate is clean.")
270
+ children: R("adaptercloud.overview.noViolations", "No open violations. Estate is clean.")
256
271
  })]
257
272
  })
258
273
  }),
259
- W.data && W.data.length > 0 && /* @__PURE__ */ M("button", {
274
+ U.data && U.data.length > 0 && /* @__PURE__ */ A("button", {
260
275
  type: "button",
261
- onClick: () => I("/drift"),
276
+ onClick: () => F("/drift"),
262
277
  className: "mt-3 flex w-full items-center gap-2 rounded-lg border border-border-subtle bg-bg-surface px-4 py-3 text-left text-sm transition-colors hover:bg-accent/50",
263
278
  children: [
264
- /* @__PURE__ */ j(E, { className: "h-4 w-4 text-status-warning-text" }),
265
- /* @__PURE__ */ M("span", {
279
+ /* @__PURE__ */ k(E, { className: "h-4 w-4 text-status-warning-text" }),
280
+ /* @__PURE__ */ A("span", {
266
281
  className: "text-text-primary",
267
282
  children: [
268
- W.data.length,
283
+ U.data.length,
269
284
  " ",
270
- z("adaptercloud.overview.driftDetected", "drift records detected")
285
+ R("adaptercloud.overview.driftDetected", "drift records detected")
271
286
  ]
272
287
  }),
273
- /* @__PURE__ */ j(S, { className: "ml-auto h-3.5 w-3.5 text-text-secondary" })
288
+ /* @__PURE__ */ k(S, { className: "ml-auto h-3.5 w-3.5 text-text-secondary" })
274
289
  ]
275
290
  })
276
- ] }), /* @__PURE__ */ M("section", { children: [/* @__PURE__ */ M("div", {
291
+ ] }), /* @__PURE__ */ A("section", { children: [/* @__PURE__ */ A("div", {
277
292
  className: "mb-4 flex items-center justify-between",
278
- children: [/* @__PURE__ */ j("h2", {
293
+ children: [/* @__PURE__ */ k("h2", {
279
294
  className: "text-lg font-semibold text-text-primary",
280
- children: z("adaptercloud.overview.recentRuns", "Recent Sync Runs")
281
- }), /* @__PURE__ */ M("button", {
295
+ children: R("adaptercloud.overview.recentRuns", "Recent Sync Runs")
296
+ }), /* @__PURE__ */ A("button", {
282
297
  type: "button",
283
- onClick: () => I("/sync-runs"),
298
+ onClick: () => F("/sync-runs"),
284
299
  className: "flex items-center gap-1 text-sm font-medium text-accent-blue hover:underline",
285
300
  children: [
286
- z("adaptercloud.common.viewAll", "View all"),
301
+ R("adaptercloud.common.viewAll", "View all"),
287
302
  " ",
288
- /* @__PURE__ */ j(S, { className: "h-3.5 w-3.5" })
303
+ /* @__PURE__ */ k(S, { className: "h-3.5 w-3.5" })
289
304
  ]
290
305
  })]
291
- }), /* @__PURE__ */ j("div", {
306
+ }), /* @__PURE__ */ k("div", {
292
307
  className: "divide-y divide-border rounded-xl border border-border-subtle bg-bg-surface",
293
- children: X.length > 0 ? X.map((e) => /* @__PURE__ */ M("button", {
308
+ children: X.length > 0 ? X.map((e) => /* @__PURE__ */ A("button", {
294
309
  type: "button",
295
- onClick: () => I("/sync-runs"),
310
+ onClick: () => F("/sync-runs"),
296
311
  className: "flex w-full items-center gap-3 px-4 py-3 text-left transition-colors hover:bg-accent/50",
297
312
  children: [
298
- /* @__PURE__ */ j("div", {
313
+ /* @__PURE__ */ k("div", {
299
314
  className: "flex h-8 w-8 shrink-0 items-center justify-center rounded-full bg-bg-sunken",
300
- children: /* @__PURE__ */ j(b, { className: "h-4 w-4 text-text-secondary" })
315
+ children: /* @__PURE__ */ k(b, { className: "h-4 w-4 text-text-secondary" })
301
316
  }),
302
- /* @__PURE__ */ M("div", {
317
+ /* @__PURE__ */ A("div", {
303
318
  className: "min-w-0 flex-1",
304
- children: [/* @__PURE__ */ j("p", {
319
+ children: [/* @__PURE__ */ k("p", {
305
320
  className: "text-sm font-medium text-text-primary",
306
321
  children: a[e.kind]
307
- }), /* @__PURE__ */ M("p", {
322
+ }), /* @__PURE__ */ A("p", {
308
323
  className: "mt-0.5 text-xs text-text-secondary",
309
324
  children: [
310
325
  e.discoveredCount,
311
326
  " ",
312
- z("adaptercloud.overview.discovered", "discovered"),
327
+ R("adaptercloud.overview.discovered", "discovered"),
313
328
  " ",
314
329
  "· ",
315
- g(e.createdAt)
330
+ _(e.createdAt)
316
331
  ]
317
332
  })]
318
333
  }),
319
- /* @__PURE__ */ j(o, { status: e.status })
334
+ /* @__PURE__ */ k(o, { status: e.status })
320
335
  ]
321
- }, e.id)) : /* @__PURE__ */ M("div", {
336
+ }, e.id)) : /* @__PURE__ */ A("div", {
322
337
  className: "flex flex-col items-center gap-2 px-4 py-8 text-center",
323
- children: [/* @__PURE__ */ j(O, { className: "h-8 w-8 text-text-secondary" }), /* @__PURE__ */ j("p", {
338
+ children: [/* @__PURE__ */ k(D, { className: "h-8 w-8 text-text-secondary" }), /* @__PURE__ */ k("p", {
324
339
  className: "text-sm text-text-secondary",
325
- children: z("adaptercloud.overview.noRuns", "No sync runs yet.")
340
+ children: R("adaptercloud.overview.noRuns", "No sync runs yet.")
326
341
  })]
327
342
  })
328
343
  })] })]
@@ -332,6 +347,6 @@ function I() {
332
347
  });
333
348
  }
334
349
  //#endregion
335
- export { I as OverviewPage };
350
+ export { F as OverviewPage };
336
351
 
337
352
  //# sourceMappingURL=OverviewPage.js.map