@burdenoff/microfe-subscriberbot 2026.801.1 → 2026.829.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (67) hide show
  1. package/dist/subscriberbot/admin/AdminDashboardPage.d.ts.map +1 -1
  2. package/dist/subscriberbot/admin/AdminDashboardPage.js +80 -83
  3. package/dist/subscriberbot/admin/AdminDashboardPage.js.map +1 -1
  4. package/dist/subscriberbot/components/viz.js +51 -27
  5. package/dist/subscriberbot/components/viz.js.map +1 -1
  6. package/dist/subscriberbot/hooks/index.d.ts +2 -1
  7. package/dist/subscriberbot/hooks/index.d.ts.map +1 -1
  8. package/dist/subscriberbot/hooks/index.js +1 -0
  9. package/dist/subscriberbot/hooks/useSubscriberBotApi.d.ts +12 -1
  10. package/dist/subscriberbot/hooks/useSubscriberBotApi.d.ts.map +1 -1
  11. package/dist/subscriberbot/hooks/useSubscriberBotApi.js +82 -56
  12. package/dist/subscriberbot/hooks/useSubscriberBotApi.js.map +1 -1
  13. package/dist/subscriberbot/hooks/useTr.d.ts +17 -0
  14. package/dist/subscriberbot/hooks/useTr.d.ts.map +1 -0
  15. package/dist/subscriberbot/hooks/useTr.js +14 -0
  16. package/dist/subscriberbot/hooks/useTr.js.map +1 -0
  17. package/dist/subscriberbot/pages/AssetVaultPage.d.ts.map +1 -1
  18. package/dist/subscriberbot/pages/AssetVaultPage.js +155 -97
  19. package/dist/subscriberbot/pages/AssetVaultPage.js.map +1 -1
  20. package/dist/subscriberbot/pages/DashboardPage.d.ts.map +1 -1
  21. package/dist/subscriberbot/pages/DashboardPage.js +113 -105
  22. package/dist/subscriberbot/pages/DashboardPage.js.map +1 -1
  23. package/dist/subscriberbot/pages/InboxPage.d.ts.map +1 -1
  24. package/dist/subscriberbot/pages/InboxPage.js +404 -369
  25. package/dist/subscriberbot/pages/InboxPage.js.map +1 -1
  26. package/dist/subscriberbot/pages/InsightsPage.d.ts.map +1 -1
  27. package/dist/subscriberbot/pages/InsightsPage.js +94 -93
  28. package/dist/subscriberbot/pages/InsightsPage.js.map +1 -1
  29. package/dist/subscriberbot/pages/InvoicesPage.d.ts +3 -2
  30. package/dist/subscriberbot/pages/InvoicesPage.d.ts.map +1 -1
  31. package/dist/subscriberbot/pages/InvoicesPage.js +368 -362
  32. package/dist/subscriberbot/pages/InvoicesPage.js.map +1 -1
  33. package/dist/subscriberbot/pages/WorkflowsPage.d.ts.map +1 -1
  34. package/dist/subscriberbot/pages/WorkflowsPage.js +209 -193
  35. package/dist/subscriberbot/pages/WorkflowsPage.js.map +1 -1
  36. package/dist/subscriberbot/pages/agents/AgentDetailPage.d.ts +3 -1
  37. package/dist/subscriberbot/pages/agents/AgentDetailPage.d.ts.map +1 -1
  38. package/dist/subscriberbot/pages/agents/AgentDetailPage.js +296 -228
  39. package/dist/subscriberbot/pages/agents/AgentDetailPage.js.map +1 -1
  40. package/dist/subscriberbot/pages/agents/AgentNewPage.d.ts.map +1 -1
  41. package/dist/subscriberbot/pages/agents/AgentNewPage.js +96 -76
  42. package/dist/subscriberbot/pages/agents/AgentNewPage.js.map +1 -1
  43. package/dist/subscriberbot/pages/agents/AgentsListPage.d.ts.map +1 -1
  44. package/dist/subscriberbot/pages/agents/AgentsListPage.js +145 -161
  45. package/dist/subscriberbot/pages/agents/AgentsListPage.js.map +1 -1
  46. package/dist/subscriberbot/pages/providers/ProviderDetailPage.d.ts +4 -2
  47. package/dist/subscriberbot/pages/providers/ProviderDetailPage.d.ts.map +1 -1
  48. package/dist/subscriberbot/pages/providers/ProviderDetailPage.js +577 -402
  49. package/dist/subscriberbot/pages/providers/ProviderDetailPage.js.map +1 -1
  50. package/dist/subscriberbot/pages/providers/ProviderNewPage.d.ts.map +1 -1
  51. package/dist/subscriberbot/pages/providers/ProviderNewPage.js +167 -129
  52. package/dist/subscriberbot/pages/providers/ProviderNewPage.js.map +1 -1
  53. package/dist/subscriberbot/pages/providers/ProvidersListPage.d.ts.map +1 -1
  54. package/dist/subscriberbot/pages/providers/ProvidersListPage.js +171 -218
  55. package/dist/subscriberbot/pages/providers/ProvidersListPage.js.map +1 -1
  56. package/dist/subscriberbot/pages/relationships/RelationshipDetailPage.d.ts.map +1 -1
  57. package/dist/subscriberbot/pages/relationships/RelationshipDetailPage.js +340 -279
  58. package/dist/subscriberbot/pages/relationships/RelationshipDetailPage.js.map +1 -1
  59. package/dist/subscriberbot/pages/relationships/RelationshipNewPage.d.ts.map +1 -1
  60. package/dist/subscriberbot/pages/relationships/RelationshipNewPage.js +185 -166
  61. package/dist/subscriberbot/pages/relationships/RelationshipNewPage.js.map +1 -1
  62. package/dist/subscriberbot/pages/relationships/RelationshipsListPage.d.ts.map +1 -1
  63. package/dist/subscriberbot/pages/relationships/RelationshipsListPage.js +153 -182
  64. package/dist/subscriberbot/pages/relationships/RelationshipsListPage.js.map +1 -1
  65. package/dist/subscriberbot/types/index.d.ts +37 -0
  66. package/dist/subscriberbot/types/index.d.ts.map +1 -1
  67. package/package.json +2 -2
@@ -8,120 +8,53 @@ import { ErrorView as o, LoadingView as s } from "../../components/StateViews.js
8
8
  import { MiniProgress as c } from "../../components/viz.js";
9
9
  import "../../components/index.js";
10
10
  import { useProviders as l } from "../../hooks/useSubscriberBotApi.js";
11
- import { useState as u } from "react";
12
- import { Activity as d, BadgeCheck as f, Building2 as p, ChevronRight as m, Plus as h, Search as g, ShieldCheck as _, Store as v } from "lucide-react";
13
- import { Fragment as y, jsx as b, jsxs as x } from "react/jsx-runtime";
14
- import { EmphasisPanel as S, GlassCard as C, PagePurpose as w } from "@burdenoff/fe-libs/ui";
11
+ import { useTr as u } from "../../hooks/useTr.js";
12
+ import { useState as d } from "react";
13
+ import { Activity as f, BadgeCheck as p, Building2 as m, ChevronRight as h, Plus as g, Search as _, ShieldCheck as v, Store as y } from "lucide-react";
14
+ import { Fragment as b, jsx as x, jsxs as S } from "react/jsx-runtime";
15
+ import { EmphasisPanel as C, GlassCard as w, PagePurpose as T } from "@burdenoff/fe-libs/ui";
15
16
  //#region src/subscriberbot/pages/providers/ProvidersListPage.tsx
16
- var T = 24, E = [
17
- {
18
- value: "",
19
- label: "All"
20
- },
21
- {
22
- value: "SAAS",
23
- label: "SaaS"
24
- },
25
- {
26
- value: "AI_SERVICE",
27
- label: "AI service"
28
- },
29
- {
30
- value: "STREAMING",
31
- label: "Streaming"
32
- },
33
- {
34
- value: "NEWSLETTER",
35
- label: "Newsletter"
36
- },
37
- {
38
- value: "NEWS_DIGEST",
39
- label: "News digest"
40
- },
41
- {
42
- value: "MEMBERSHIP",
43
- label: "Membership"
44
- },
45
- {
46
- value: "COMMUNITY",
47
- label: "Community"
48
- },
49
- {
50
- value: "EDUCATION",
51
- label: "Education"
52
- },
53
- {
54
- value: "FINANCIAL",
55
- label: "Financial"
56
- },
57
- {
58
- value: "INSURANCE",
59
- label: "Insurance"
60
- },
61
- {
62
- value: "TELECOM",
63
- label: "Telecom"
64
- },
65
- {
66
- value: "UTILITY",
67
- label: "Utility"
68
- },
69
- {
70
- value: "ASSOCIATION",
71
- label: "Association"
72
- },
73
- {
74
- value: "LICENSE",
75
- label: "License"
76
- },
77
- {
78
- value: "CONTRACT",
79
- label: "Contract"
80
- },
81
- {
82
- value: "OTHER",
83
- label: "Other"
84
- }
85
- ], D = [
86
- {
87
- value: "",
88
- label: "Any status"
89
- },
90
- {
91
- value: "VERIFIED",
92
- label: "Verified"
93
- },
94
- {
95
- value: "CLAIMED",
96
- label: "Claimed"
97
- },
98
- {
99
- value: "UNVERIFIED",
100
- label: "Unverified"
101
- },
102
- {
103
- value: "DEPRECATED",
104
- label: "Deprecated"
105
- }
106
- ];
107
- function O(e) {
17
+ var E = 24, D = {
18
+ SAAS: "providers.categories.saas",
19
+ AI_SERVICE: "providers.categories.aiService",
20
+ STREAMING: "providers.categories.streaming",
21
+ NEWSLETTER: "providers.categories.newsletter",
22
+ NEWS_DIGEST: "providers.categories.newsDigest",
23
+ MEMBERSHIP: "providers.categories.membership",
24
+ COMMUNITY: "providers.categories.community",
25
+ EDUCATION: "providers.categories.education",
26
+ FINANCIAL: "providers.categories.financial",
27
+ INSURANCE: "providers.categories.insurance",
28
+ TELECOM: "providers.categories.telecom",
29
+ UTILITY: "providers.categories.utility",
30
+ ASSOCIATION: "providers.categories.association",
31
+ LICENSE: "providers.categories.license",
32
+ CONTRACT: "providers.categories.contract",
33
+ OTHER: "providers.categories.other"
34
+ }, O = {
35
+ VERIFIED: "providers.filters.verified",
36
+ CLAIMED: "providers.filters.claimed",
37
+ UNVERIFIED: "providers.filters.unverified",
38
+ DEPRECATED: "providers.filters.deprecated"
39
+ };
40
+ function k(e) {
108
41
  return e >= 70 ? "positive" : e >= 45 ? "accent" : e >= 25 ? "warning" : "negative";
109
42
  }
110
- function k(e) {
43
+ function A(e, t) {
111
44
  return e >= 67 ? {
112
- label: "High churn risk",
45
+ label: t("providers.card.highChurn", "High churn risk"),
113
46
  cls: "bg-status-error-bg-subtle text-status-error-text"
114
47
  } : e >= 34 ? {
115
- label: "Moderate churn risk",
48
+ label: t("providers.card.moderateChurn", "Moderate churn risk"),
116
49
  cls: "bg-status-warning-bg-subtle text-status-warning-text"
117
50
  } : {
118
- label: "Low churn risk",
51
+ label: t("providers.card.lowChurn", "Low churn risk"),
119
52
  cls: "bg-status-success-bg-subtle text-status-success-text"
120
53
  };
121
54
  }
122
- function A({ provider: e, onOpen: n }) {
123
- let a = e.vendorHealthScore, o = e.churnRiskScore, s = o == null ? null : k(o);
124
- return /* @__PURE__ */ x(C, {
55
+ function j({ provider: e, onOpen: n }) {
56
+ let a = u(), o = e.vendorHealthScore, s = e.churnRiskScore, l = s == null ? null : A(s, a);
57
+ return /* @__PURE__ */ S(w, {
125
58
  treatment: "glass",
126
59
  role: "button",
127
60
  tabIndex: 0,
@@ -129,224 +62,244 @@ function A({ provider: e, onOpen: n }) {
129
62
  onKeyDown: (e) => {
130
63
  (e.key === "Enter" || e.key === " ") && (e.preventDefault(), n());
131
64
  },
132
- "aria-label": `Open ${e.name}`,
65
+ "aria-label": a("providers.card.openAria", "Open {{name}}", { name: e.name }),
133
66
  className: "group flex cursor-pointer flex-col p-5 outline-none transition-all hover:-translate-y-0.5 hover:shadow-lg focus-visible:ring-2 focus-visible:ring-[var(--color-focus-ring)]",
134
67
  children: [
135
- /* @__PURE__ */ x("div", {
68
+ /* @__PURE__ */ S("div", {
136
69
  className: "flex items-start justify-between gap-2",
137
- children: [/* @__PURE__ */ b("span", {
70
+ children: [/* @__PURE__ */ x("span", {
138
71
  className: "flex size-10 items-center justify-center rounded-xl bg-[var(--color-accent-soft)] text-text-primary",
139
- children: /* @__PURE__ */ b(p, { className: "h-5 w-5" })
140
- }), /* @__PURE__ */ b(i, { status: e.status })]
72
+ children: /* @__PURE__ */ x(m, { className: "h-5 w-5" })
73
+ }), /* @__PURE__ */ x(i, { status: e.status })]
141
74
  }),
142
- /* @__PURE__ */ b("p", {
75
+ /* @__PURE__ */ x("p", {
143
76
  className: "mt-3 truncate text-base font-semibold text-text-primary",
144
77
  children: e.name
145
78
  }),
146
- /* @__PURE__ */ b("span", {
79
+ /* @__PURE__ */ x("span", {
147
80
  className: "mt-1 inline-flex w-fit rounded-full bg-bg-sunken px-2.5 py-0.5 text-xs font-medium text-text-secondary",
148
- children: r(e.category)
81
+ children: a(D[e.category], r(e.category))
149
82
  }),
150
- e.description ? /* @__PURE__ */ b("p", {
83
+ e.description ? /* @__PURE__ */ x("p", {
151
84
  className: "mt-3 line-clamp-2 min-h-[2.5rem] text-xs leading-relaxed text-text-secondary",
152
85
  children: e.description
153
- }) : /* @__PURE__ */ b("p", {
86
+ }) : /* @__PURE__ */ x("p", {
154
87
  className: "mt-3 min-h-[2.5rem] text-xs italic text-text-secondary/70",
155
- children: "No description yet."
88
+ children: a("providers.card.noDescription", "No description yet.")
156
89
  }),
157
- /* @__PURE__ */ x("div", {
90
+ /* @__PURE__ */ S("div", {
158
91
  className: "mt-4 border-t border-border-subtle pt-3",
159
- children: [/* @__PURE__ */ x("div", {
92
+ children: [/* @__PURE__ */ S("div", {
160
93
  className: "flex items-center justify-between text-xs",
161
- children: [/* @__PURE__ */ x("span", {
94
+ children: [/* @__PURE__ */ S("span", {
162
95
  className: "inline-flex items-center gap-1 text-text-secondary",
163
- children: [/* @__PURE__ */ b(_, { className: "h-3.5 w-3.5" }), " Vendor health"]
164
- }), /* @__PURE__ */ b("span", {
96
+ children: [
97
+ /* @__PURE__ */ x(v, { className: "h-3.5 w-3.5" }),
98
+ " ",
99
+ a("providers.card.vendorHealth", "Vendor health")
100
+ ]
101
+ }), /* @__PURE__ */ x("span", {
165
102
  className: "font-semibold tabular-nums text-text-primary",
166
- children: a == null ? "—" : `${a}/100`
103
+ children: o == null ? "—" : `${o}/100`
167
104
  })]
168
- }), /* @__PURE__ */ b(c, {
169
- value: a ?? 0,
170
- tone: a == null ? "accent" : O(a),
105
+ }), /* @__PURE__ */ x(c, {
106
+ value: o ?? 0,
107
+ tone: o == null ? "accent" : k(o),
171
108
  className: "mt-1.5"
172
109
  })]
173
110
  }),
174
- /* @__PURE__ */ x("div", {
111
+ /* @__PURE__ */ S("div", {
175
112
  className: "mt-3 flex flex-wrap items-center justify-between gap-2",
176
- children: [/* @__PURE__ */ x("div", {
113
+ children: [/* @__PURE__ */ S("div", {
177
114
  className: "flex flex-wrap items-center gap-2",
178
- children: [s && /* @__PURE__ */ b("span", {
179
- className: t("inline-flex rounded-full px-2 py-0.5 text-[11px] font-medium", s.cls),
180
- children: s.label
181
- }), e.region && /* @__PURE__ */ b("span", {
115
+ children: [l && /* @__PURE__ */ x("span", {
116
+ className: t("inline-flex rounded-full px-2 py-0.5 text-[11px] font-medium", l.cls),
117
+ children: l.label
118
+ }), e.region && /* @__PURE__ */ x("span", {
182
119
  className: "text-[11px] text-text-secondary",
183
120
  children: e.region
184
121
  })]
185
- }), /* @__PURE__ */ x("span", {
122
+ }), /* @__PURE__ */ S("span", {
186
123
  className: "inline-flex items-center gap-0.5 text-xs font-medium text-text-link opacity-0 transition-opacity group-hover:opacity-100",
187
- children: ["View ", /* @__PURE__ */ b(m, { className: "h-3.5 w-3.5" })]
124
+ children: [
125
+ a("providers.card.view", "View"),
126
+ " ",
127
+ /* @__PURE__ */ x(h, { className: "h-3.5 w-3.5" })
128
+ ]
188
129
  })]
189
130
  })
190
131
  ]
191
132
  });
192
133
  }
193
- function j() {
194
- let { navigateTo: r } = e(), [i, c] = u(0), [m, _] = u(""), [O, k] = u(""), [j, M] = u(""), [N, P] = u(""), { data: F, isLoading: I, isError: L, refetch: R, isFetching: z } = l({
195
- search: m || void 0,
196
- category: j || void 0,
197
- status: N || void 0,
134
+ function M() {
135
+ let i = u(), { navigateTo: c } = e(), [h, v] = d(0), [k, A] = d(""), [M, N] = d(""), [P, F] = d(""), [I, L] = d(""), R = [{
136
+ value: "",
137
+ label: i("providers.categories.all", "All")
138
+ }, ...Object.entries(D).map(([e, t]) => ({
139
+ value: e,
140
+ label: i(t, r(e))
141
+ }))], z = [{
142
+ value: "",
143
+ label: i("providers.filters.anyStatus", "Any status")
144
+ }, ...Object.entries(O).map(([e, t]) => ({
145
+ value: e,
146
+ label: i(t, r(e))
147
+ }))], { data: B, isLoading: V, isError: H, refetch: U, isFetching: W } = l({
148
+ search: k || void 0,
149
+ category: P || void 0,
150
+ status: I || void 0,
198
151
  pagination: {
199
- limit: T,
200
- offset: i * T
152
+ limit: E,
153
+ offset: h * E
201
154
  }
202
- }), B = F?.items ?? [], V = F?.pageInfo.hasMore ?? !1, H = B.filter((e) => e.status === "VERIFIED").length, U = B.map((e) => e.vendorHealthScore).filter((e) => e != null), W = U.length ? Math.round(U.reduce((e, t) => e + t, 0) / U.length) : null, G = (e) => {
203
- e.preventDefault(), _(O.trim()), c(0);
204
- }, K = [
155
+ }), G = B?.items ?? [], K = B?.pageInfo.hasMore ?? !1, q = G.filter((e) => e.status === "VERIFIED").length, J = G.map((e) => e.vendorHealthScore).filter((e) => e != null), Y = J.length ? Math.round(J.reduce((e, t) => e + t, 0) / J.length) : null, X = (e) => {
156
+ e.preventDefault(), A(M.trim()), v(0);
157
+ }, Z = [
205
158
  {
206
- icon: v,
207
- label: "On this page",
208
- value: String(B.length)
159
+ icon: y,
160
+ label: i("providers.summary.onThisPage", "On this page"),
161
+ value: String(G.length)
209
162
  },
210
163
  {
211
- icon: f,
212
- label: "Verified",
213
- value: String(H)
164
+ icon: p,
165
+ label: i("providers.filters.verified", "Verified"),
166
+ value: String(q)
214
167
  },
215
168
  {
216
- icon: d,
217
- label: "Avg. vendor health",
218
- value: W == null ? "—" : `${W}/100`
169
+ icon: f,
170
+ label: i("providers.summary.avgVendorHealth", "Avg. vendor health"),
171
+ value: Y == null ? "—" : `${Y}/100`
219
172
  }
220
173
  ];
221
- return /* @__PURE__ */ x(n, {
222
- title: "Discover providers",
223
- description: "Browse the global provider registry — the public face of the Subscription Knowledge Graph",
224
- actions: /* @__PURE__ */ x("button", {
174
+ return /* @__PURE__ */ S(n, {
175
+ title: i("providers.title", "Discover providers"),
176
+ description: i("providers.description", "Browse the global provider registry — the public face of the Subscription Knowledge Graph"),
177
+ actions: /* @__PURE__ */ S("button", {
225
178
  type: "button",
226
- onClick: () => r("/providers/new"),
179
+ onClick: () => c("/providers/new"),
227
180
  className: "inline-flex items-center gap-2 rounded-lg bg-action-primary-bg px-4 py-2 text-sm font-medium text-action-primary-text hover:opacity-90",
228
- children: [/* @__PURE__ */ b(h, { className: "h-4 w-4" }), " Add provider"]
181
+ children: [
182
+ /* @__PURE__ */ x(g, { className: "h-4 w-4" }),
183
+ " ",
184
+ i("providers.addProvider", "Add provider")
185
+ ]
229
186
  }),
230
187
  children: [
231
- /* @__PURE__ */ b(w, {
188
+ /* @__PURE__ */ x(T, {
232
189
  className: "mb-4",
233
- children: "Every provider exists here whether or not it integrates. Search and filter to find the ones you have relationships with, compare their vendor health, or add a new one."
190
+ children: i("providers.purpose", "Every provider exists here whether or not it integrates. Search and filter to find the ones you have relationships with, compare their vendor health, or add a new one.")
234
191
  }),
235
- /* @__PURE__ */ b(S, { children: /* @__PURE__ */ x("form", {
236
- onSubmit: G,
192
+ /* @__PURE__ */ x(C, { children: /* @__PURE__ */ S("form", {
193
+ onSubmit: X,
237
194
  className: "relative",
238
195
  children: [
239
- /* @__PURE__ */ b(g, { className: "absolute left-3 top-1/2 h-4 w-4 -translate-y-1/2 text-text-secondary" }),
240
- /* @__PURE__ */ b("input", {
196
+ /* @__PURE__ */ x(_, { className: "absolute left-3 top-1/2 h-4 w-4 -translate-y-1/2 text-text-secondary" }),
197
+ /* @__PURE__ */ x("input", {
241
198
  type: "text",
242
- placeholder: "Search providers by name…",
243
- value: O,
244
- onChange: (e) => k(e.target.value),
199
+ placeholder: i("providers.searchPlaceholder", "Search providers by name…"),
200
+ value: M,
201
+ onChange: (e) => N(e.target.value),
245
202
  className: "w-full rounded-lg border border-border-subtle bg-bg-surface py-2.5 pl-10 pr-24 text-sm text-text-primary placeholder:text-text-secondary focus:outline-none focus:ring-2 focus:ring-[var(--color-focus-ring)]"
246
203
  }),
247
- /* @__PURE__ */ b("button", {
204
+ /* @__PURE__ */ x("button", {
248
205
  type: "submit",
249
206
  className: "absolute right-1.5 top-1/2 -translate-y-1/2 rounded-md bg-action-primary-bg px-3 py-1.5 text-xs font-medium text-action-primary-text hover:opacity-90",
250
- children: "Search"
207
+ children: i("providers.search", "Search")
251
208
  })
252
209
  ]
253
210
  }) }),
254
- /* @__PURE__ */ b("div", {
211
+ /* @__PURE__ */ x("div", {
255
212
  className: "mt-4 flex items-center gap-2 overflow-x-auto pb-1 [scrollbar-width:none] [&::-webkit-scrollbar]:hidden",
256
- children: E.map((e) => {
257
- let n = j === e.value;
258
- return /* @__PURE__ */ b("button", {
213
+ children: R.map((e) => {
214
+ let n = P === e.value;
215
+ return /* @__PURE__ */ x("button", {
259
216
  type: "button",
260
217
  "aria-pressed": n,
261
218
  onClick: () => {
262
- M(e.value), c(0);
219
+ F(e.value), v(0);
263
220
  },
264
221
  className: t("shrink-0 rounded-full border px-3.5 py-1.5 text-xs font-medium transition-colors", n ? "border-transparent bg-action-primary-bg text-action-primary-text" : "border-border-subtle bg-bg-surface text-text-secondary hover:bg-bg-sunken hover:text-text-primary"),
265
222
  children: e.label
266
223
  }, e.value || "all");
267
224
  })
268
225
  }),
269
- /* @__PURE__ */ b("div", {
226
+ /* @__PURE__ */ x("div", {
270
227
  className: "mt-3 flex flex-wrap items-center gap-2",
271
- children: /* @__PURE__ */ b("select", {
272
- "aria-label": "Filter by status",
273
- value: N,
228
+ children: /* @__PURE__ */ x("select", {
229
+ "aria-label": i("providers.filters.statusLabel", "Filter by status"),
230
+ value: I,
274
231
  onChange: (e) => {
275
- P(e.target.value), c(0);
232
+ L(e.target.value), v(0);
276
233
  },
277
234
  className: "rounded-lg border border-border-subtle bg-bg-surface px-3 py-2 text-xs text-text-primary focus:outline-none focus:ring-2 focus:ring-[var(--color-focus-ring)]",
278
- children: D.map((e) => /* @__PURE__ */ b("option", {
235
+ children: z.map((e) => /* @__PURE__ */ x("option", {
279
236
  value: e.value,
280
237
  children: e.label
281
238
  }, e.value))
282
239
  })
283
240
  }),
284
- !I && !L && B.length > 0 && /* @__PURE__ */ b("div", {
241
+ !V && !H && G.length > 0 && /* @__PURE__ */ x("div", {
285
242
  className: "mt-4 grid grid-cols-1 gap-3 sm:grid-cols-3",
286
- children: K.map((e) => /* @__PURE__ */ x(C, {
243
+ children: Z.map((e) => /* @__PURE__ */ S(w, {
287
244
  treatment: "metric",
288
245
  className: "flex items-center gap-3 p-4",
289
- children: [/* @__PURE__ */ b("span", {
246
+ children: [/* @__PURE__ */ x("span", {
290
247
  className: "flex size-9 shrink-0 items-center justify-center rounded-lg bg-[var(--color-accent-soft)] text-text-primary",
291
- children: /* @__PURE__ */ b(e.icon, { className: "h-4 w-4" })
292
- }), /* @__PURE__ */ x("div", {
248
+ children: /* @__PURE__ */ x(e.icon, { className: "h-4 w-4" })
249
+ }), /* @__PURE__ */ S("div", {
293
250
  className: "min-w-0",
294
- children: [/* @__PURE__ */ b("p", {
251
+ children: [/* @__PURE__ */ x("p", {
295
252
  className: "truncate text-xs text-text-secondary",
296
253
  children: e.label
297
- }), /* @__PURE__ */ b("p", {
254
+ }), /* @__PURE__ */ x("p", {
298
255
  className: "text-lg font-semibold tabular-nums text-text-primary",
299
256
  children: e.value
300
257
  })]
301
258
  })]
302
259
  }, e.label))
303
260
  }),
304
- I ? /* @__PURE__ */ b(s, { label: "Loading providers…" }) : L ? /* @__PURE__ */ b(o, {
305
- message: "Could not load the provider registry.",
306
- onRetry: () => void R()
307
- }) : B.length === 0 ? /* @__PURE__ */ b("div", {
261
+ V ? /* @__PURE__ */ x(s, { label: i("providers.loading", "Loading providers…") }) : H ? /* @__PURE__ */ x(o, {
262
+ message: i("providers.error", "Could not load the provider registry."),
263
+ onRetry: () => void U()
264
+ }) : G.length === 0 ? /* @__PURE__ */ x("div", {
308
265
  className: "mt-6",
309
- children: /* @__PURE__ */ b(a, {
266
+ children: /* @__PURE__ */ x(a, {
310
267
  illustration: "empty-search",
311
- icon: /* @__PURE__ */ b(p, { className: "h-12 w-12" }),
312
- title: "No providers found",
313
- description: m ? `No providers match "${m}".` : "No providers in the registry with these filters yet.",
314
- action: /* @__PURE__ */ b("button", {
268
+ icon: /* @__PURE__ */ x(m, { className: "h-12 w-12" }),
269
+ title: i("providers.emptyTitle", "No providers found"),
270
+ description: k ? i("providers.emptyDescriptionSearch", "No providers match \"{{search}}\".", { search: k }) : i("providers.emptyDescription", "No providers in the registry with these filters yet."),
271
+ action: /* @__PURE__ */ x("button", {
315
272
  type: "button",
316
- onClick: () => r("/providers/new"),
273
+ onClick: () => c("/providers/new"),
317
274
  className: "rounded-lg bg-action-primary-bg px-4 py-2 text-sm font-medium text-action-primary-text hover:opacity-90",
318
- children: "Add provider"
275
+ children: i("providers.addProvider", "Add provider")
319
276
  })
320
277
  })
321
- }) : /* @__PURE__ */ x(y, { children: [/* @__PURE__ */ b("div", {
278
+ }) : /* @__PURE__ */ S(b, { children: [/* @__PURE__ */ x("div", {
322
279
  className: "mt-6 grid grid-cols-1 gap-4 sm:grid-cols-2 lg:grid-cols-3",
323
- children: B.map((e) => /* @__PURE__ */ b(A, {
280
+ children: G.map((e) => /* @__PURE__ */ x(j, {
324
281
  provider: e,
325
- onOpen: () => r(`/providers/${e.id}`)
282
+ onOpen: () => c(`/providers/${e.id}`)
326
283
  }, e.id))
327
- }), /* @__PURE__ */ x("div", {
284
+ }), /* @__PURE__ */ S("div", {
328
285
  className: "mt-6 flex items-center justify-between",
329
- children: [/* @__PURE__ */ x("p", {
286
+ children: [/* @__PURE__ */ S("p", {
330
287
  className: "text-xs text-text-secondary",
331
- children: [
332
- "Page ",
333
- i + 1,
334
- z ? " · refreshing…" : ""
335
- ]
336
- }), /* @__PURE__ */ x("div", {
288
+ children: [i("providers.pagination.page", "Page {{page}}", { page: h + 1 }), W ? ` · ${i("providers.pagination.refreshing", "refreshing…")}` : ""]
289
+ }), /* @__PURE__ */ S("div", {
337
290
  className: "flex gap-2",
338
- children: [/* @__PURE__ */ b("button", {
291
+ children: [/* @__PURE__ */ x("button", {
339
292
  type: "button",
340
- disabled: i === 0,
341
- onClick: () => c((e) => Math.max(0, e - 1)),
342
- className: t("rounded-lg border border-border-subtle px-3 py-1.5 text-xs font-medium", i === 0 ? "cursor-not-allowed text-text-secondary opacity-50" : "text-text-primary hover:bg-bg-sunken"),
343
- children: "Previous"
344
- }), /* @__PURE__ */ b("button", {
293
+ disabled: h === 0,
294
+ onClick: () => v((e) => Math.max(0, e - 1)),
295
+ className: t("rounded-lg border border-border-subtle px-3 py-1.5 text-xs font-medium", h === 0 ? "cursor-not-allowed text-text-secondary opacity-50" : "text-text-primary hover:bg-bg-sunken"),
296
+ children: i("providers.pagination.previous", "Previous")
297
+ }), /* @__PURE__ */ x("button", {
345
298
  type: "button",
346
- disabled: !V,
347
- onClick: () => c((e) => e + 1),
348
- className: t("rounded-lg border border-border-subtle px-3 py-1.5 text-xs font-medium", V ? "text-text-primary hover:bg-bg-sunken" : "cursor-not-allowed text-text-secondary opacity-50"),
349
- children: "Next"
299
+ disabled: !K,
300
+ onClick: () => v((e) => e + 1),
301
+ className: t("rounded-lg border border-border-subtle px-3 py-1.5 text-xs font-medium", K ? "text-text-primary hover:bg-bg-sunken" : "cursor-not-allowed text-text-secondary opacity-50"),
302
+ children: i("providers.pagination.next", "Next")
350
303
  })]
351
304
  })]
352
305
  })] })
@@ -354,6 +307,6 @@ function j() {
354
307
  });
355
308
  }
356
309
  //#endregion
357
- export { j as ProvidersListPage };
310
+ export { M as ProvidersListPage };
358
311
 
359
312
  //# sourceMappingURL=ProvidersListPage.js.map