@burdenoff/microfe-subscriberbot 2026.827.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 (56) 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/hooks/index.d.ts +1 -0
  5. package/dist/subscriberbot/hooks/index.d.ts.map +1 -1
  6. package/dist/subscriberbot/hooks/index.js +1 -0
  7. package/dist/subscriberbot/hooks/useTr.d.ts +17 -0
  8. package/dist/subscriberbot/hooks/useTr.d.ts.map +1 -0
  9. package/dist/subscriberbot/hooks/useTr.js +14 -0
  10. package/dist/subscriberbot/hooks/useTr.js.map +1 -0
  11. package/dist/subscriberbot/pages/AssetVaultPage.d.ts.map +1 -1
  12. package/dist/subscriberbot/pages/AssetVaultPage.js +111 -109
  13. package/dist/subscriberbot/pages/AssetVaultPage.js.map +1 -1
  14. package/dist/subscriberbot/pages/DashboardPage.d.ts.map +1 -1
  15. package/dist/subscriberbot/pages/DashboardPage.js +113 -105
  16. package/dist/subscriberbot/pages/DashboardPage.js.map +1 -1
  17. package/dist/subscriberbot/pages/InboxPage.d.ts.map +1 -1
  18. package/dist/subscriberbot/pages/InboxPage.js +404 -369
  19. package/dist/subscriberbot/pages/InboxPage.js.map +1 -1
  20. package/dist/subscriberbot/pages/InsightsPage.d.ts.map +1 -1
  21. package/dist/subscriberbot/pages/InsightsPage.js +94 -93
  22. package/dist/subscriberbot/pages/InsightsPage.js.map +1 -1
  23. package/dist/subscriberbot/pages/InvoicesPage.d.ts.map +1 -1
  24. package/dist/subscriberbot/pages/InvoicesPage.js +360 -366
  25. package/dist/subscriberbot/pages/InvoicesPage.js.map +1 -1
  26. package/dist/subscriberbot/pages/WorkflowsPage.d.ts.map +1 -1
  27. package/dist/subscriberbot/pages/WorkflowsPage.js +209 -193
  28. package/dist/subscriberbot/pages/WorkflowsPage.js.map +1 -1
  29. package/dist/subscriberbot/pages/agents/AgentDetailPage.d.ts.map +1 -1
  30. package/dist/subscriberbot/pages/agents/AgentDetailPage.js +268 -236
  31. package/dist/subscriberbot/pages/agents/AgentDetailPage.js.map +1 -1
  32. package/dist/subscriberbot/pages/agents/AgentNewPage.d.ts.map +1 -1
  33. package/dist/subscriberbot/pages/agents/AgentNewPage.js +96 -76
  34. package/dist/subscriberbot/pages/agents/AgentNewPage.js.map +1 -1
  35. package/dist/subscriberbot/pages/agents/AgentsListPage.d.ts.map +1 -1
  36. package/dist/subscriberbot/pages/agents/AgentsListPage.js +145 -161
  37. package/dist/subscriberbot/pages/agents/AgentsListPage.js.map +1 -1
  38. package/dist/subscriberbot/pages/providers/ProviderDetailPage.d.ts.map +1 -1
  39. package/dist/subscriberbot/pages/providers/ProviderDetailPage.js +514 -441
  40. package/dist/subscriberbot/pages/providers/ProviderDetailPage.js.map +1 -1
  41. package/dist/subscriberbot/pages/providers/ProviderNewPage.d.ts.map +1 -1
  42. package/dist/subscriberbot/pages/providers/ProviderNewPage.js +167 -129
  43. package/dist/subscriberbot/pages/providers/ProviderNewPage.js.map +1 -1
  44. package/dist/subscriberbot/pages/providers/ProvidersListPage.d.ts.map +1 -1
  45. package/dist/subscriberbot/pages/providers/ProvidersListPage.js +171 -218
  46. package/dist/subscriberbot/pages/providers/ProvidersListPage.js.map +1 -1
  47. package/dist/subscriberbot/pages/relationships/RelationshipDetailPage.d.ts.map +1 -1
  48. package/dist/subscriberbot/pages/relationships/RelationshipDetailPage.js +340 -279
  49. package/dist/subscriberbot/pages/relationships/RelationshipDetailPage.js.map +1 -1
  50. package/dist/subscriberbot/pages/relationships/RelationshipNewPage.d.ts.map +1 -1
  51. package/dist/subscriberbot/pages/relationships/RelationshipNewPage.js +185 -166
  52. package/dist/subscriberbot/pages/relationships/RelationshipNewPage.js.map +1 -1
  53. package/dist/subscriberbot/pages/relationships/RelationshipsListPage.d.ts.map +1 -1
  54. package/dist/subscriberbot/pages/relationships/RelationshipsListPage.js +153 -182
  55. package/dist/subscriberbot/pages/relationships/RelationshipsListPage.js.map +1 -1
  56. package/package.json +1 -1
@@ -8,10 +8,11 @@ import { ErrorView as l, LoadingView as u, Section as d } from "../../components
8
8
  import { Gauge as f, MiniProgress as p, Timeline as m } from "../../components/viz.js";
9
9
  import "../../components/index.js";
10
10
  import { useCancelRelationship as h, useCreateAsset as g, useCreateEntitlement as _, useFileDownloadUrl as v, usePlans as y, useProviders as b, useRelationship as x, useTransitionRelationship as S, useUpdateRelationship as C, useUploadFile as w } from "../../hooks/useSubscriberBotApi.js";
11
- import { useState as T } from "react";
12
- import { Activity as E, ArrowLeft as D, Ban as O, CalendarClock as k, CreditCard as A, Download as j, Paperclip as M, Pause as N, Pencil as P, Play as F, Plus as I, ShieldCheck as L, Tag as ee, Wallet as te } from "lucide-react";
11
+ import { useTr as T } from "../../hooks/useTr.js";
12
+ import { useState as E } from "react";
13
+ import { Activity as D, ArrowLeft as O, Ban as k, CalendarClock as A, CreditCard as j, Download as M, Paperclip as N, Pause as P, Pencil as F, Play as I, Plus as L, ShieldCheck as R, Tag as ee, Wallet as te } from "lucide-react";
13
14
  import { useParams as ne } from "react-router";
14
- import { Fragment as R, jsx as z, jsxs as B } from "react/jsx-runtime";
15
+ import { Fragment as re, jsx as z, jsxs as B } from "react/jsx-runtime";
15
16
  import { GlassCard as V } from "@burdenoff/fe-libs/ui";
16
17
  //#region src/subscriberbot/pages/relationships/RelationshipDetailPage.tsx
17
18
  var H = "w-full rounded-lg border border-border-subtle bg-bg-surface px-3 py-2 text-sm text-text-primary placeholder:text-text-secondary focus:outline-none focus:ring-2 focus:ring-[var(--color-focus-ring)]", U = "mb-1 block text-xs font-medium text-text-secondary", W = [
@@ -39,21 +40,33 @@ var H = "w-full rounded-lg border border-border-subtle bg-bg-surface px-3 py-2 t
39
40
  "CERTIFICATE",
40
41
  "WARRANTY",
41
42
  "DOMAIN"
42
- ], q = [
43
+ ], q = {
44
+ SUBSCRIPTION: "relationships.kinds.subscription",
45
+ MEMBERSHIP: "relationships.kinds.membership",
46
+ LICENSE: "relationships.kinds.license",
47
+ CONTRACT: "relationships.kinds.contract",
48
+ NEWSLETTER: "relationships.kinds.newsletter",
49
+ RECURRING_PAYMENT: "relationships.kinds.recurringPayment",
50
+ ENROLLMENT: "relationships.kinds.enrollment",
51
+ TRIAL: "relationships.kinds.trial"
52
+ }, ie = [
43
53
  {
44
54
  status: "ACTIVE",
45
- label: "Activate",
46
- icon: F
55
+ labelKey: "relationships.detail.actions.activate",
56
+ defaultLabel: "Activate",
57
+ icon: I
47
58
  },
48
59
  {
49
60
  status: "PAUSED",
50
- label: "Pause",
51
- icon: N
61
+ labelKey: "relationships.detail.actions.pause",
62
+ defaultLabel: "Pause",
63
+ icon: P
52
64
  },
53
65
  {
54
66
  status: "EXPIRED",
55
- label: "Mark expired",
56
- icon: O
67
+ labelKey: "relationships.detail.actions.markExpired",
68
+ defaultLabel: "Mark expired",
69
+ icon: k
57
70
  }
58
71
  ];
59
72
  function J({ label: e, value: t }) {
@@ -68,7 +81,7 @@ function J({ label: e, value: t }) {
68
81
  })]
69
82
  });
70
83
  }
71
- function re(e) {
84
+ function ae(e) {
72
85
  return e == null ? "accent" : e >= 66 ? "positive" : e >= 33 ? "warning" : "negative";
73
86
  }
74
87
  function Y(e) {
@@ -76,62 +89,66 @@ function Y(e) {
76
89
  let t = new Date(e);
77
90
  return Number.isNaN(t.getTime()) ? "" : t.toISOString().slice(0, 10);
78
91
  }
79
- function ie({ relationship: e, onClose: t }) {
80
- let n = C(), r = b({ pagination: {
92
+ function oe({ relationship: e, onClose: t }) {
93
+ let n = T(), r = C(), i = b({ pagination: {
81
94
  limit: 100,
82
95
  offset: 0
83
- } }), [i, a] = T(e.label), [o, s] = T(e.providerId ?? ""), [l, u] = T(e.planId ?? ""), [d, f] = T(String(e.amount ?? "")), [p, m] = T(e.currency), [h, g] = T(e.interval), [_, v] = T(Y(e.renewsAt)), [x, S] = T(e.autoRenew), [w, E] = T(e.healthScore == null ? "" : String(e.healthScore)), [D, O] = T(e.notes ?? ""), [k, A] = T(null), j = y(o || void 0), M = (() => {
84
- let t = r.data?.items ?? [];
96
+ } }), [a, o] = E(e.label), [s, l] = E(e.providerId ?? ""), [u, d] = E(e.planId ?? ""), [f, p] = E(String(e.amount ?? "")), [m, h] = E(e.currency), [g, _] = E(e.interval), [v, x] = E(Y(e.renewsAt)), [S, w] = E(e.autoRenew), [D, O] = E(e.healthScore == null ? "" : String(e.healthScore)), [k, A] = E(e.notes ?? ""), [j, M] = E(null), N = y(s || void 0), P = (() => {
97
+ let t = i.data?.items ?? [];
85
98
  return e.provider && !t.some((t) => t.id === e.provider?.id) ? [e.provider, ...t] : t;
86
- })(), N = j.data ?? [];
99
+ })(), F = N.data ?? [];
87
100
  return /* @__PURE__ */ z(c, {
88
- title: "Edit relationship",
101
+ title: n("relationships.detail.editModal.title", "Edit relationship"),
89
102
  onClose: t,
90
103
  maxWidthClassName: "max-w-2xl",
91
104
  children: /* @__PURE__ */ B("form", {
92
- onSubmit: (r) => {
93
- if (r.preventDefault(), A(null), !i.trim()) {
94
- A("A label is required.");
105
+ onSubmit: (i) => {
106
+ if (i.preventDefault(), M(null), !a.trim()) {
107
+ M(n("relationships.detail.editModal.labelRequired", "A label is required."));
95
108
  return;
96
109
  }
97
- let a = {
98
- label: i.trim(),
99
- interval: h,
100
- autoRenew: x,
101
- currency: p.trim() || "USD",
102
- notes: D.trim(),
103
- ...o ? { providerId: o } : {},
104
- ...l ? { planId: l } : {},
105
- ...d.trim() ? { amount: Number(d) } : {},
106
- ...w.trim() ? { healthScore: Number(w) } : {},
107
- ..._ ? { renewsAt: new Date(_).toISOString() } : {}
110
+ let o = {
111
+ label: a.trim(),
112
+ interval: g,
113
+ autoRenew: S,
114
+ currency: m.trim() || "USD",
115
+ notes: k.trim(),
116
+ ...s ? { providerId: s } : {},
117
+ ...u ? { planId: u } : {},
118
+ ...f.trim() ? { amount: Number(f) } : {},
119
+ ...D.trim() ? { healthScore: Number(D) } : {},
120
+ ...v ? { renewsAt: new Date(v).toISOString() } : {}
108
121
  };
109
- n.mutate({
122
+ r.mutate({
110
123
  id: e.id,
111
- input: a
124
+ input: o
112
125
  }, {
113
126
  onSuccess: () => t(),
114
- onError: (e) => A(e instanceof Error ? e.message : "Could not update relationship.")
127
+ onError: (e) => M(e instanceof Error ? e.message : n("relationships.detail.editModal.error", "Could not update relationship."))
115
128
  });
116
129
  },
117
130
  className: "space-y-4",
118
131
  children: [
119
- k && /* @__PURE__ */ z("div", {
132
+ j && /* @__PURE__ */ z("div", {
120
133
  className: "rounded-lg border border-status-error-text/30 bg-status-error-bg-subtle px-4 py-2 text-sm text-status-error-text",
121
- children: k
134
+ children: j
122
135
  }),
123
136
  /* @__PURE__ */ B("div", { children: [/* @__PURE__ */ B("label", {
124
137
  htmlFor: "edit-label",
125
138
  className: U,
126
- children: ["Label ", /* @__PURE__ */ z("span", {
127
- className: "text-status-error-text",
128
- children: "*"
129
- })]
139
+ children: [
140
+ n("relationships.detail.editModal.labelLabel", "Label"),
141
+ " ",
142
+ /* @__PURE__ */ z("span", {
143
+ className: "text-status-error-text",
144
+ children: "*"
145
+ })
146
+ ]
130
147
  }), /* @__PURE__ */ z("input", {
131
148
  id: "edit-label",
132
149
  type: "text",
133
- value: i,
134
- onChange: (e) => a(e.target.value),
150
+ value: a,
151
+ onChange: (e) => o(e.target.value),
135
152
  className: H,
136
153
  required: !0
137
154
  })] }),
@@ -140,35 +157,35 @@ function ie({ relationship: e, onClose: t }) {
140
157
  children: [/* @__PURE__ */ B("div", { children: [/* @__PURE__ */ z("label", {
141
158
  htmlFor: "edit-provider",
142
159
  className: U,
143
- children: "Provider"
160
+ children: n("relationships.detail.editModal.providerLabel", "Provider")
144
161
  }), /* @__PURE__ */ B("select", {
145
162
  id: "edit-provider",
146
- value: o,
163
+ value: s,
147
164
  onChange: (e) => {
148
- s(e.target.value), u("");
165
+ l(e.target.value), d("");
149
166
  },
150
167
  className: H,
151
168
  children: [/* @__PURE__ */ z("option", {
152
169
  value: "",
153
- children: "— None —"
154
- }), M.map((e) => /* @__PURE__ */ z("option", {
170
+ children: n("relationships.detail.editModal.providerNone", "— None —")
171
+ }), P.map((e) => /* @__PURE__ */ z("option", {
155
172
  value: e.id,
156
173
  children: e.name
157
174
  }, e.id))]
158
175
  })] }), /* @__PURE__ */ B("div", { children: [/* @__PURE__ */ z("label", {
159
176
  htmlFor: "edit-plan",
160
177
  className: U,
161
- children: "Plan"
178
+ children: n("relationships.detail.editModal.planLabel", "Plan")
162
179
  }), /* @__PURE__ */ B("select", {
163
180
  id: "edit-plan",
164
- value: l,
165
- onChange: (e) => u(e.target.value),
181
+ value: u,
182
+ onChange: (e) => d(e.target.value),
166
183
  className: H,
167
- disabled: !o || N.length === 0,
184
+ disabled: !s || F.length === 0,
168
185
  children: [/* @__PURE__ */ z("option", {
169
186
  value: "",
170
- children: "— None —"
171
- }), N.map((e) => /* @__PURE__ */ z("option", {
187
+ children: n("relationships.detail.editModal.planNone", "— None —")
188
+ }), F.map((e) => /* @__PURE__ */ z("option", {
172
189
  value: e.id,
173
190
  children: e.name
174
191
  }, e.id))]
@@ -180,36 +197,36 @@ function ie({ relationship: e, onClose: t }) {
180
197
  /* @__PURE__ */ B("div", { children: [/* @__PURE__ */ z("label", {
181
198
  htmlFor: "edit-amount",
182
199
  className: U,
183
- children: "Amount"
200
+ children: n("relationships.detail.editModal.amountLabel", "Amount")
184
201
  }), /* @__PURE__ */ z("input", {
185
202
  id: "edit-amount",
186
203
  type: "number",
187
204
  min: "0",
188
205
  step: "0.01",
189
- value: d,
190
- onChange: (e) => f(e.target.value),
206
+ value: f,
207
+ onChange: (e) => p(e.target.value),
191
208
  className: H
192
209
  })] }),
193
210
  /* @__PURE__ */ B("div", { children: [/* @__PURE__ */ z("label", {
194
211
  htmlFor: "edit-currency",
195
212
  className: U,
196
- children: "Currency"
213
+ children: n("relationships.detail.editModal.currencyLabel", "Currency")
197
214
  }), /* @__PURE__ */ z("input", {
198
215
  id: "edit-currency",
199
216
  type: "text",
200
- value: p,
201
- onChange: (e) => m(e.target.value.toUpperCase()),
217
+ value: m,
218
+ onChange: (e) => h(e.target.value.toUpperCase()),
202
219
  maxLength: 3,
203
220
  className: H
204
221
  })] }),
205
222
  /* @__PURE__ */ B("div", { children: [/* @__PURE__ */ z("label", {
206
223
  htmlFor: "edit-interval",
207
224
  className: U,
208
- children: "Billing interval"
225
+ children: n("relationships.detail.editModal.intervalLabel", "Billing interval")
209
226
  }), /* @__PURE__ */ z("select", {
210
227
  id: "edit-interval",
211
- value: h,
212
- onChange: (e) => g(e.target.value),
228
+ value: g,
229
+ onChange: (e) => _(e.target.value),
213
230
  className: H,
214
231
  children: W.map((e) => /* @__PURE__ */ z("option", {
215
232
  value: e,
@@ -224,25 +241,25 @@ function ie({ relationship: e, onClose: t }) {
224
241
  /* @__PURE__ */ B("div", { children: [/* @__PURE__ */ z("label", {
225
242
  htmlFor: "edit-renews",
226
243
  className: U,
227
- children: "Renews on"
244
+ children: n("relationships.detail.editModal.renewsOnLabel", "Renews on")
228
245
  }), /* @__PURE__ */ z("input", {
229
246
  id: "edit-renews",
230
247
  type: "date",
231
- value: _,
232
- onChange: (e) => v(e.target.value),
248
+ value: v,
249
+ onChange: (e) => x(e.target.value),
233
250
  className: H
234
251
  })] }),
235
252
  /* @__PURE__ */ B("div", { children: [/* @__PURE__ */ z("label", {
236
253
  htmlFor: "edit-health",
237
254
  className: U,
238
- children: "Health score (0–100)"
255
+ children: n("relationships.detail.editModal.healthScoreLabel", "Health score (0–100)")
239
256
  }), /* @__PURE__ */ z("input", {
240
257
  id: "edit-health",
241
258
  type: "number",
242
259
  min: "0",
243
260
  max: "100",
244
- value: w,
245
- onChange: (e) => E(e.target.value),
261
+ value: D,
262
+ onChange: (e) => O(e.target.value),
246
263
  className: H
247
264
  })] }),
248
265
  /* @__PURE__ */ z("div", {
@@ -251,10 +268,10 @@ function ie({ relationship: e, onClose: t }) {
251
268
  className: "flex items-center gap-2 text-sm text-text-primary",
252
269
  children: [/* @__PURE__ */ z("input", {
253
270
  type: "checkbox",
254
- checked: x,
255
- onChange: (e) => S(e.target.checked),
271
+ checked: S,
272
+ onChange: (e) => w(e.target.checked),
256
273
  className: "size-4 rounded border-border-subtle"
257
- }), "Auto-renews"]
274
+ }), n("relationships.detail.editModal.autoRenews", "Auto-renews")]
258
275
  })
259
276
  })
260
277
  ]
@@ -262,11 +279,11 @@ function ie({ relationship: e, onClose: t }) {
262
279
  /* @__PURE__ */ B("div", { children: [/* @__PURE__ */ z("label", {
263
280
  htmlFor: "edit-notes",
264
281
  className: U,
265
- children: "Notes"
282
+ children: n("relationships.detail.editModal.notesLabel", "Notes")
266
283
  }), /* @__PURE__ */ z("textarea", {
267
284
  id: "edit-notes",
268
- value: D,
269
- onChange: (e) => O(e.target.value),
285
+ value: k,
286
+ onChange: (e) => A(e.target.value),
270
287
  rows: 3,
271
288
  className: H
272
289
  })] }),
@@ -276,60 +293,64 @@ function ie({ relationship: e, onClose: t }) {
276
293
  type: "button",
277
294
  onClick: t,
278
295
  className: "rounded-lg border border-border-subtle px-4 py-2 text-sm font-medium text-text-primary hover:bg-bg-sunken",
279
- children: "Cancel"
296
+ children: n("relationships.detail.editModal.cancel", "Cancel")
280
297
  }), /* @__PURE__ */ z("button", {
281
298
  type: "submit",
282
- disabled: n.isPending,
299
+ disabled: r.isPending,
283
300
  className: "rounded-lg bg-action-primary-bg px-4 py-2 text-sm font-medium text-action-primary-text hover:opacity-90 disabled:opacity-50",
284
- children: n.isPending ? "Saving…" : "Save changes"
301
+ children: r.isPending ? n("relationships.detail.editModal.saving", "Saving…") : n("relationships.detail.editModal.submit", "Save changes")
285
302
  })]
286
303
  })
287
304
  ]
288
305
  })
289
306
  });
290
307
  }
291
- function ae({ relationshipId: e, onClose: t }) {
292
- let n = _(), [r, i] = T(""), [a, o] = T("FEATURE_ACCESS"), [s, l] = T(""), [u, d] = T(""), [f, p] = T(""), [m, h] = T(null);
308
+ function se({ relationshipId: e, onClose: t }) {
309
+ let n = T(), r = _(), [i, a] = E(""), [o, s] = E("FEATURE_ACCESS"), [l, u] = E(""), [d, f] = E(""), [p, m] = E(""), [h, g] = E(null);
293
310
  return /* @__PURE__ */ z(c, {
294
- title: "Add entitlement",
311
+ title: n("relationships.detail.addEntitlementModal.title", "Add entitlement"),
295
312
  onClose: t,
296
313
  children: /* @__PURE__ */ B("form", {
297
- onSubmit: (i) => {
298
- if (i.preventDefault(), h(null), !r.trim()) {
299
- h("An entitlement name is required.");
314
+ onSubmit: (a) => {
315
+ if (a.preventDefault(), g(null), !i.trim()) {
316
+ g(n("relationships.detail.addEntitlementModal.nameRequired", "An entitlement name is required."));
300
317
  return;
301
318
  }
302
- n.mutate({
319
+ r.mutate({
303
320
  relationshipId: e,
304
- name: r.trim(),
305
- type: a,
306
- ...s.trim() ? { quota: Number(s) } : {},
307
- ...u.trim() ? { unit: u.trim() } : {},
308
- ...f.trim() ? { description: f.trim() } : {}
321
+ name: i.trim(),
322
+ type: o,
323
+ ...l.trim() ? { quota: Number(l) } : {},
324
+ ...d.trim() ? { unit: d.trim() } : {},
325
+ ...p.trim() ? { description: p.trim() } : {}
309
326
  }, {
310
327
  onSuccess: () => t(),
311
- onError: (e) => h(e instanceof Error ? e.message : "Could not add entitlement.")
328
+ onError: (e) => g(e instanceof Error ? e.message : n("relationships.detail.addEntitlementModal.error", "Could not add entitlement."))
312
329
  });
313
330
  },
314
331
  className: "space-y-4",
315
332
  children: [
316
- m && /* @__PURE__ */ z("div", {
333
+ h && /* @__PURE__ */ z("div", {
317
334
  className: "rounded-lg border border-status-error-text/30 bg-status-error-bg-subtle px-4 py-2 text-sm text-status-error-text",
318
- children: m
335
+ children: h
319
336
  }),
320
337
  /* @__PURE__ */ B("div", { children: [/* @__PURE__ */ B("label", {
321
338
  htmlFor: "ent-name",
322
339
  className: U,
323
- children: ["Name ", /* @__PURE__ */ z("span", {
324
- className: "text-status-error-text",
325
- children: "*"
326
- })]
340
+ children: [
341
+ n("relationships.detail.addEntitlementModal.nameLabel", "Name"),
342
+ " ",
343
+ /* @__PURE__ */ z("span", {
344
+ className: "text-status-error-text",
345
+ children: "*"
346
+ })
347
+ ]
327
348
  }), /* @__PURE__ */ z("input", {
328
349
  id: "ent-name",
329
350
  type: "text",
330
- value: r,
331
- onChange: (e) => i(e.target.value),
332
- placeholder: "e.g. Seats, API calls, Priority support",
351
+ value: i,
352
+ onChange: (e) => a(e.target.value),
353
+ placeholder: n("relationships.detail.addEntitlementModal.namePlaceholder", "e.g. Seats, API calls, Priority support"),
333
354
  className: H,
334
355
  required: !0
335
356
  })] }),
@@ -339,11 +360,11 @@ function ae({ relationshipId: e, onClose: t }) {
339
360
  /* @__PURE__ */ B("div", { children: [/* @__PURE__ */ z("label", {
340
361
  htmlFor: "ent-type",
341
362
  className: U,
342
- children: "Type"
363
+ children: n("relationships.detail.addEntitlementModal.typeLabel", "Type")
343
364
  }), /* @__PURE__ */ z("select", {
344
365
  id: "ent-type",
345
- value: a,
346
- onChange: (e) => o(e.target.value),
366
+ value: o,
367
+ onChange: (e) => s(e.target.value),
347
368
  className: H,
348
369
  children: G.map((e) => /* @__PURE__ */ z("option", {
349
370
  value: e,
@@ -353,26 +374,26 @@ function ae({ relationshipId: e, onClose: t }) {
353
374
  /* @__PURE__ */ B("div", { children: [/* @__PURE__ */ z("label", {
354
375
  htmlFor: "ent-quota",
355
376
  className: U,
356
- children: "Quota"
377
+ children: n("relationships.detail.addEntitlementModal.quotaLabel", "Quota")
357
378
  }), /* @__PURE__ */ z("input", {
358
379
  id: "ent-quota",
359
380
  type: "number",
360
381
  min: "0",
361
- value: s,
362
- onChange: (e) => l(e.target.value),
363
- placeholder: "e.g. 5",
382
+ value: l,
383
+ onChange: (e) => u(e.target.value),
384
+ placeholder: n("relationships.detail.addEntitlementModal.quotaPlaceholder", "e.g. 5"),
364
385
  className: H
365
386
  })] }),
366
387
  /* @__PURE__ */ B("div", { children: [/* @__PURE__ */ z("label", {
367
388
  htmlFor: "ent-unit",
368
389
  className: U,
369
- children: "Unit"
390
+ children: n("relationships.detail.addEntitlementModal.unitLabel", "Unit")
370
391
  }), /* @__PURE__ */ z("input", {
371
392
  id: "ent-unit",
372
393
  type: "text",
373
- value: u,
374
- onChange: (e) => d(e.target.value),
375
- placeholder: "e.g. seats, GB",
394
+ value: d,
395
+ onChange: (e) => f(e.target.value),
396
+ placeholder: n("relationships.detail.addEntitlementModal.unitPlaceholder", "e.g. seats, GB"),
376
397
  className: H
377
398
  })] })
378
399
  ]
@@ -380,11 +401,11 @@ function ae({ relationshipId: e, onClose: t }) {
380
401
  /* @__PURE__ */ B("div", { children: [/* @__PURE__ */ z("label", {
381
402
  htmlFor: "ent-desc",
382
403
  className: U,
383
- children: "Description"
404
+ children: n("relationships.detail.addEntitlementModal.descriptionLabel", "Description")
384
405
  }), /* @__PURE__ */ z("textarea", {
385
406
  id: "ent-desc",
386
- value: f,
387
- onChange: (e) => p(e.target.value),
407
+ value: p,
408
+ onChange: (e) => m(e.target.value),
388
409
  rows: 2,
389
410
  className: H
390
411
  })] }),
@@ -394,69 +415,73 @@ function ae({ relationshipId: e, onClose: t }) {
394
415
  type: "button",
395
416
  onClick: t,
396
417
  className: "rounded-lg border border-border-subtle px-4 py-2 text-sm font-medium text-text-primary hover:bg-bg-sunken",
397
- children: "Cancel"
418
+ children: n("relationships.detail.addEntitlementModal.cancel", "Cancel")
398
419
  }), /* @__PURE__ */ z("button", {
399
420
  type: "submit",
400
- disabled: n.isPending,
421
+ disabled: r.isPending,
401
422
  className: "rounded-lg bg-action-primary-bg px-4 py-2 text-sm font-medium text-action-primary-text hover:opacity-90 disabled:opacity-50",
402
- children: n.isPending ? "Adding…" : "Add entitlement"
423
+ children: r.isPending ? n("relationships.detail.addEntitlementModal.adding", "Adding…") : n("relationships.detail.addEntitlementModal.submit", "Add entitlement")
403
424
  })]
404
425
  })
405
426
  ]
406
427
  })
407
428
  });
408
429
  }
409
- function oe({ relationshipId: e, onClose: t }) {
410
- let n = g(), { uploadFile: r, progress: i, isUploading: a } = w(), [o, s] = T(""), [l, u] = T("RECEIPT"), [d, f] = T(null), [p, m] = T(""), [h, _] = T(null), v = a || n.isPending;
430
+ function ce({ relationshipId: e, onClose: t }) {
431
+ let n = T(), r = g(), { uploadFile: i, progress: a, isUploading: o } = w(), [s, l] = E(""), [u, d] = E("RECEIPT"), [f, p] = E(null), [m, h] = E(""), [_, v] = E(null), y = o || r.isPending;
411
432
  return /* @__PURE__ */ z(c, {
412
- title: "Attach asset",
433
+ title: n("relationships.detail.attachAssetModal.title", "Attach asset"),
413
434
  onClose: t,
414
435
  children: /* @__PURE__ */ B("form", {
415
- onSubmit: async (i) => {
416
- if (i.preventDefault(), _(null), !d) {
417
- _("Choose a file to attach.");
436
+ onSubmit: async (a) => {
437
+ if (a.preventDefault(), v(null), !f) {
438
+ v(n("relationships.detail.attachAssetModal.chooseFile", "Choose a file to attach."));
418
439
  return;
419
440
  }
420
441
  try {
421
- let { fileId: i, fileName: a } = await r(d);
422
- await n.mutateAsync({
442
+ let { fileId: n, fileName: a } = await i(f);
443
+ await r.mutateAsync({
423
444
  relationshipId: e,
424
- name: o.trim() || a,
425
- type: l,
426
- fileId: i,
427
- ...p ? { expiresAt: new Date(p).toISOString() } : {}
445
+ name: s.trim() || a,
446
+ type: u,
447
+ fileId: n,
448
+ ...m ? { expiresAt: new Date(m).toISOString() } : {}
428
449
  }), t();
429
450
  } catch (e) {
430
- _(e instanceof Error ? e.message : "Could not attach the asset.");
451
+ v(e instanceof Error ? e.message : n("relationships.detail.attachAssetModal.error", "Could not attach the asset."));
431
452
  }
432
453
  },
433
454
  className: "space-y-4",
434
455
  children: [
435
- h && /* @__PURE__ */ z("div", {
456
+ _ && /* @__PURE__ */ z("div", {
436
457
  className: "rounded-lg border border-status-error-text/30 bg-status-error-bg-subtle px-4 py-2 text-sm text-status-error-text",
437
- children: h
458
+ children: _
438
459
  }),
439
460
  /* @__PURE__ */ B("div", { children: [
440
461
  /* @__PURE__ */ B("label", {
441
462
  htmlFor: "asset-file",
442
463
  className: U,
443
- children: ["File ", /* @__PURE__ */ z("span", {
444
- className: "text-status-error-text",
445
- children: "*"
446
- })]
464
+ children: [
465
+ n("relationships.detail.attachAssetModal.fileLabel", "File"),
466
+ " ",
467
+ /* @__PURE__ */ z("span", {
468
+ className: "text-status-error-text",
469
+ children: "*"
470
+ })
471
+ ]
447
472
  }),
448
473
  /* @__PURE__ */ z("input", {
449
474
  id: "asset-file",
450
475
  type: "file",
451
476
  onChange: (e) => {
452
477
  let t = e.target.files?.[0] ?? null;
453
- f(t), t && !o.trim() && s(t.name);
478
+ p(t), t && !s.trim() && l(t.name);
454
479
  },
455
480
  className: "w-full text-sm text-text-secondary file:mr-3 file:rounded-lg file:border file:border-border-subtle file:bg-bg-surface file:px-3 file:py-1.5 file:text-sm file:font-medium file:text-text-primary hover:file:bg-bg-sunken"
456
481
  }),
457
482
  /* @__PURE__ */ z("p", {
458
483
  className: "mt-1 text-xs text-text-secondary",
459
- children: "Stored securely in files — only a reference is kept here."
484
+ children: n("relationships.detail.attachAssetModal.fileHint", "Stored securely in files — only a reference is kept here.")
460
485
  })
461
486
  ] }),
462
487
  /* @__PURE__ */ B("div", {
@@ -464,22 +489,22 @@ function oe({ relationshipId: e, onClose: t }) {
464
489
  children: [/* @__PURE__ */ B("div", { children: [/* @__PURE__ */ z("label", {
465
490
  htmlFor: "asset-name",
466
491
  className: U,
467
- children: "Name"
492
+ children: n("relationships.detail.attachAssetModal.nameLabel", "Name")
468
493
  }), /* @__PURE__ */ z("input", {
469
494
  id: "asset-name",
470
495
  type: "text",
471
- value: o,
472
- onChange: (e) => s(e.target.value),
473
- placeholder: "Defaults to the file name",
496
+ value: s,
497
+ onChange: (e) => l(e.target.value),
498
+ placeholder: n("relationships.detail.attachAssetModal.namePlaceholder", "Defaults to the file name"),
474
499
  className: H
475
500
  })] }), /* @__PURE__ */ B("div", { children: [/* @__PURE__ */ z("label", {
476
501
  htmlFor: "asset-type",
477
502
  className: U,
478
- children: "Type"
503
+ children: n("relationships.detail.attachAssetModal.typeLabel", "Type")
479
504
  }), /* @__PURE__ */ z("select", {
480
505
  id: "asset-type",
481
- value: l,
482
- onChange: (e) => u(e.target.value),
506
+ value: u,
507
+ onChange: (e) => d(e.target.value),
483
508
  className: H,
484
509
  children: K.map((e) => /* @__PURE__ */ z("option", {
485
510
  value: e,
@@ -490,21 +515,17 @@ function oe({ relationshipId: e, onClose: t }) {
490
515
  /* @__PURE__ */ B("div", { children: [/* @__PURE__ */ z("label", {
491
516
  htmlFor: "asset-expires",
492
517
  className: U,
493
- children: "Expires on"
518
+ children: n("relationships.detail.attachAssetModal.expiresOnLabel", "Expires on")
494
519
  }), /* @__PURE__ */ z("input", {
495
520
  id: "asset-expires",
496
521
  type: "date",
497
- value: p,
498
- onChange: (e) => m(e.target.value),
522
+ value: m,
523
+ onChange: (e) => h(e.target.value),
499
524
  className: H
500
525
  })] }),
501
- a && /* @__PURE__ */ B("p", {
526
+ o && /* @__PURE__ */ z("p", {
502
527
  className: "text-xs text-text-secondary",
503
- children: [
504
- "Uploading… ",
505
- i,
506
- "%"
507
- ]
528
+ children: n("relationships.detail.attachAssetModal.uploading", "Uploading… {{progress}}%", { progress: a })
508
529
  }),
509
530
  /* @__PURE__ */ B("div", {
510
531
  className: "flex justify-end gap-3",
@@ -512,25 +533,25 @@ function oe({ relationshipId: e, onClose: t }) {
512
533
  type: "button",
513
534
  onClick: t,
514
535
  className: "rounded-lg border border-border-subtle px-4 py-2 text-sm font-medium text-text-primary hover:bg-bg-sunken",
515
- children: "Cancel"
536
+ children: n("relationships.detail.attachAssetModal.cancel", "Cancel")
516
537
  }), /* @__PURE__ */ z("button", {
517
538
  type: "submit",
518
- disabled: v,
539
+ disabled: y,
519
540
  className: "rounded-lg bg-action-primary-bg px-4 py-2 text-sm font-medium text-action-primary-text hover:opacity-90 disabled:opacity-50",
520
- children: v ? "Attaching…" : "Attach asset"
541
+ children: y ? n("relationships.detail.attachAssetModal.attaching", "Attaching…") : n("relationships.detail.attachAssetModal.submit", "Attach asset")
521
542
  })]
522
543
  })
523
544
  ]
524
545
  })
525
546
  });
526
547
  }
527
- function se({ asset: e }) {
528
- let t = v(), [n, a] = T(!1);
548
+ function le({ asset: e }) {
549
+ let t = T(), n = v(), [a, o] = E(!1);
529
550
  return /* @__PURE__ */ B("div", {
530
551
  className: "flex items-center justify-between gap-3 p-3",
531
552
  children: [/* @__PURE__ */ B("div", {
532
553
  className: "flex min-w-0 items-center gap-2",
533
- children: [/* @__PURE__ */ z(M, { className: "h-4 w-4 shrink-0 text-text-secondary" }), /* @__PURE__ */ B("div", {
554
+ children: [/* @__PURE__ */ z(N, { className: "h-4 w-4 shrink-0 text-text-secondary" }), /* @__PURE__ */ B("div", {
534
555
  className: "min-w-0",
535
556
  children: [/* @__PURE__ */ z("p", {
536
557
  className: "truncate text-sm font-medium text-text-primary",
@@ -542,97 +563,105 @@ function se({ asset: e }) {
542
563
  })]
543
564
  }), /* @__PURE__ */ B("div", {
544
565
  className: "flex shrink-0 items-center gap-3",
545
- children: [e.expiresAt && /* @__PURE__ */ B("span", {
566
+ children: [e.expiresAt && /* @__PURE__ */ z("span", {
546
567
  className: "text-xs text-text-secondary",
547
- children: ["Expires ", r(e.expiresAt)]
568
+ children: t("relationships.detail.assetRow.expires", "Expires {{date}}", { date: r(e.expiresAt) })
548
569
  }), e.file?.id && /* @__PURE__ */ B("button", {
549
570
  type: "button",
550
571
  onClick: async () => {
551
572
  if (e.file?.id) {
552
- a(!0);
573
+ o(!0);
553
574
  try {
554
- let n = await t(e.file.id);
555
- window.open(n, "_blank", "noopener,noreferrer");
575
+ let t = await n(e.file.id);
576
+ window.open(t, "_blank", "noopener,noreferrer");
556
577
  } catch {} finally {
557
- a(!1);
578
+ o(!1);
558
579
  }
559
580
  }
560
581
  },
561
- disabled: n,
582
+ disabled: a,
562
583
  className: "inline-flex items-center gap-1 rounded-lg border border-border-subtle px-2.5 py-1 text-xs font-medium text-text-primary hover:bg-bg-sunken disabled:opacity-50",
563
584
  children: [
564
- /* @__PURE__ */ z(j, { className: "h-3.5 w-3.5" }),
585
+ /* @__PURE__ */ z(M, { className: "h-3.5 w-3.5" }),
565
586
  " ",
566
- n ? "Opening…" : "Download"
587
+ a ? t("relationships.detail.assetRow.opening", "Opening…") : t("relationships.detail.assetRow.download", "Download")
567
588
  ]
568
589
  })]
569
590
  })]
570
591
  });
571
592
  }
572
593
  function X() {
573
- let { id: c } = ne(), { navigateTo: g } = e(), { data: _, isLoading: v, isError: y, refetch: b } = x(c), C = S(), w = h(), [j, M] = T(null), [N, F] = T(!1), [H, U] = T(!1), [W, G] = T(!1);
574
- if (v) return /* @__PURE__ */ z(t, {
575
- title: "Relationship",
576
- children: /* @__PURE__ */ z(u, { label: "Loading relationship…" })
577
- });
594
+ let c = T(), { id: g } = ne(), { navigateTo: _ } = e(), { data: v, isLoading: y, isError: b, refetch: C } = x(g), w = S(), M = h(), [N, P] = E(null), [I, H] = E(!1), [U, W] = E(!1), [G, K] = E(!1);
578
595
  if (y) return /* @__PURE__ */ z(t, {
579
- title: "Relationship",
596
+ title: c("relationships.title", "Relationship"),
597
+ children: /* @__PURE__ */ z(u, { label: c("relationships.detail.loading", "Loading relationship…") })
598
+ });
599
+ if (b) return /* @__PURE__ */ z(t, {
600
+ title: c("relationships.title", "Relationship"),
580
601
  children: /* @__PURE__ */ z(l, {
581
- message: "Could not load this relationship.",
582
- onRetry: () => void b()
602
+ message: c("relationships.detail.error", "Could not load this relationship."),
603
+ onRetry: () => void C()
583
604
  })
584
605
  });
585
- if (!_) return /* @__PURE__ */ z(t, {
586
- title: "Relationship",
606
+ if (!v) return /* @__PURE__ */ z(t, {
607
+ title: c("relationships.title", "Relationship"),
587
608
  children: /* @__PURE__ */ z(s, {
588
609
  illustration: "empty-data",
589
- title: "Relationship not found",
590
- description: "It may have been removed, or you may not have access to it.",
610
+ title: c("relationships.detail.notFoundTitle", "Relationship not found"),
611
+ description: c("relationships.detail.notFoundDescription", "It may have been removed, or you may not have access to it."),
591
612
  action: /* @__PURE__ */ z("button", {
592
613
  type: "button",
593
- onClick: () => g("/relationships"),
614
+ onClick: () => _("/relationships"),
594
615
  className: "rounded-lg bg-action-primary-bg px-4 py-2 text-sm font-medium text-action-primary-text hover:opacity-90",
595
- children: "Back to relationships"
616
+ children: c("relationships.detail.backToRelationships", "Back to relationships")
596
617
  })
597
618
  })
598
619
  });
599
- let K = _, Y = C.isPending || w.isPending, X = (e) => {
600
- M(null), C.mutate({
601
- id: K.id,
620
+ let Y = v, X = w.isPending || M.isPending, ue = (e) => {
621
+ P(null), w.mutate({
622
+ id: Y.id,
602
623
  status: e
603
- }, { onError: (e) => M(e instanceof Error ? e.message : "Transition failed") });
604
- }, ce = () => {
605
- M(null), w.mutate(K.id, { onError: (e) => M(e instanceof Error ? e.message : "Cancel failed") });
606
- }, Z = [...K.renewalEvents ?? []].sort((e, t) => new Date(e.occursAt).getTime() - new Date(t.occursAt).getTime()).map((e) => {
624
+ }, { onError: (e) => P(e instanceof Error ? e.message : c("relationships.detail.transitionError", "Transition failed")) });
625
+ }, de = () => {
626
+ P(null), M.mutate(Y.id, { onError: (e) => P(e instanceof Error ? e.message : c("relationships.detail.cancelError", "Cancel failed")) });
627
+ }, Z = [...Y.renewalEvents ?? []].sort((e, t) => new Date(e.occursAt).getTime() - new Date(t.occursAt).getTime()).map((e) => {
607
628
  let t = new Date(e.occursAt).getTime(), a = !Number.isNaN(t) && t > Date.now();
608
629
  return {
609
630
  title: i(e.eventType),
610
631
  sub: `${r(e.occursAt)}${e.detail ? ` · ${e.detail}` : ""}`,
611
- meta: e.amount == null ? void 0 : n(e.amount, e.currency ?? K.currency),
632
+ meta: e.amount == null ? void 0 : n(e.amount, e.currency ?? Y.currency),
612
633
  tone: a ? "warning" : "muted"
613
634
  };
614
- }), Q = K.autoRenew ? /* @__PURE__ */ z("span", {
635
+ }), Q = Y.autoRenew ? /* @__PURE__ */ z("span", {
615
636
  className: "inline-flex items-center rounded-full bg-status-success-bg-subtle px-2 py-0.5 text-xs font-medium text-status-success-text",
616
- children: "On"
637
+ children: c("relationships.detail.autoRenewOn", "On")
617
638
  }) : /* @__PURE__ */ z("span", {
618
639
  className: "inline-flex items-center rounded-full bg-bg-sunken px-2 py-0.5 text-xs font-medium text-text-secondary",
619
- children: "Off"
620
- }), le = q.filter((e) => e.status !== K.status), $ = K.plan?.features ?? [];
640
+ children: c("relationships.detail.autoRenewOff", "Off")
641
+ }), fe = ie.filter((e) => e.status !== Y.status), $ = Y.plan?.features ?? [];
621
642
  return /* @__PURE__ */ B(t, {
622
- title: K.label,
623
- description: K.provider?.name ?? i(K.kind),
643
+ title: Y.label,
644
+ description: Y.provider?.name ?? c(q[Y.kind], i(Y.kind)),
624
645
  actions: /* @__PURE__ */ B("div", {
625
646
  className: "flex items-center gap-2",
626
647
  children: [/* @__PURE__ */ B("button", {
627
648
  type: "button",
628
- onClick: () => F(!0),
649
+ onClick: () => H(!0),
629
650
  className: "inline-flex items-center gap-2 rounded-lg border border-border-subtle px-3 py-2 text-sm font-medium text-text-primary hover:bg-bg-sunken",
630
- children: [/* @__PURE__ */ z(P, { className: "h-4 w-4" }), " Edit"]
651
+ children: [
652
+ /* @__PURE__ */ z(F, { className: "h-4 w-4" }),
653
+ " ",
654
+ c("relationships.detail.edit", "Edit")
655
+ ]
631
656
  }), /* @__PURE__ */ B("button", {
632
657
  type: "button",
633
- onClick: () => g("/relationships"),
658
+ onClick: () => _("/relationships"),
634
659
  className: "inline-flex items-center gap-2 rounded-lg border border-border-subtle px-3 py-2 text-sm font-medium text-text-primary hover:bg-bg-sunken",
635
- children: [/* @__PURE__ */ z(D, { className: "h-4 w-4" }), " Back"]
660
+ children: [
661
+ /* @__PURE__ */ z(O, { className: "h-4 w-4" }),
662
+ " ",
663
+ c("relationships.detail.back", "Back")
664
+ ]
636
665
  })]
637
666
  }),
638
667
  children: [
@@ -647,38 +676,42 @@ function X() {
647
676
  children: [
648
677
  /* @__PURE__ */ z("p", {
649
678
  className: "text-xs font-medium uppercase tracking-wide text-text-secondary",
650
- children: i(K.kind)
679
+ children: c(q[Y.kind], i(Y.kind))
651
680
  }),
652
681
  /* @__PURE__ */ B("div", {
653
682
  className: "mt-2 flex flex-wrap items-center gap-3",
654
683
  children: [/* @__PURE__ */ B("span", {
655
684
  className: "text-3xl font-bold tabular-nums text-text-primary",
656
- children: [n(K.amount, K.currency), /* @__PURE__ */ z("span", {
685
+ children: [n(Y.amount, Y.currency), /* @__PURE__ */ z("span", {
657
686
  className: "text-base font-normal text-text-secondary",
658
- children: a(K.interval)
687
+ children: a(Y.interval)
659
688
  })]
660
- }), /* @__PURE__ */ z(o, { status: K.status })]
689
+ }), /* @__PURE__ */ z(o, { status: Y.status })]
661
690
  }),
662
691
  /* @__PURE__ */ B("div", {
663
692
  className: "mt-2 flex flex-wrap items-center gap-x-4 gap-y-1 text-sm text-text-secondary",
664
693
  children: [
665
694
  /* @__PURE__ */ B("span", {
666
695
  className: "inline-flex items-center gap-1.5",
667
- children: [/* @__PURE__ */ z(k, { className: "h-3.5 w-3.5" }), K.renewsAt ? `Renews ${r(K.renewsAt)}` : "No renewal scheduled"]
696
+ children: [/* @__PURE__ */ z(A, { className: "h-3.5 w-3.5" }), Y.renewsAt ? c("relationships.detail.renews", "Renews {{date}}", { date: r(Y.renewsAt) }) : c("relationships.detail.noRenewalScheduled", "No renewal scheduled")]
668
697
  }),
669
698
  /* @__PURE__ */ B("span", {
670
699
  className: "inline-flex items-center gap-1.5",
671
- children: [/* @__PURE__ */ z(L, { className: "h-3.5 w-3.5" }), i(K.discoverySource)]
700
+ children: [/* @__PURE__ */ z(R, { className: "h-3.5 w-3.5" }), i(Y.discoverySource)]
672
701
  }),
673
702
  /* @__PURE__ */ B("span", {
674
703
  className: "inline-flex items-center gap-1.5",
675
- children: ["Auto-renew ", Q]
704
+ children: [
705
+ c("relationships.detail.autoRenew", "Auto-renew"),
706
+ " ",
707
+ Q
708
+ ]
676
709
  })
677
710
  ]
678
711
  }),
679
- K.tags.length > 0 && /* @__PURE__ */ B("div", {
712
+ Y.tags.length > 0 && /* @__PURE__ */ B("div", {
680
713
  className: "mt-3 flex flex-wrap items-center gap-2",
681
- children: [/* @__PURE__ */ z(ee, { className: "h-3.5 w-3.5 text-text-secondary" }), K.tags.map((e) => /* @__PURE__ */ z("span", {
714
+ children: [/* @__PURE__ */ z(ee, { className: "h-3.5 w-3.5 text-text-secondary" }), Y.tags.map((e) => /* @__PURE__ */ z("span", {
682
715
  className: "rounded-full bg-bg-sunken px-2.5 py-0.5 text-xs text-text-secondary",
683
716
  children: e
684
717
  }, e))]
@@ -686,32 +719,36 @@ function X() {
686
719
  ]
687
720
  }), /* @__PURE__ */ B("div", {
688
721
  className: "flex shrink-0 flex-wrap gap-2 lg:flex-col lg:items-stretch",
689
- children: [le.map((e) => {
722
+ children: [fe.map((e) => {
690
723
  let t = e.icon;
691
724
  return /* @__PURE__ */ B("button", {
692
725
  type: "button",
693
- disabled: Y,
694
- onClick: () => X(e.status),
726
+ disabled: X,
727
+ onClick: () => ue(e.status),
695
728
  className: "inline-flex items-center justify-center gap-1.5 rounded-lg border border-border-subtle bg-bg-surface px-3 py-1.5 text-xs font-medium text-text-primary hover:bg-bg-sunken disabled:opacity-50",
696
729
  children: [
697
730
  /* @__PURE__ */ z(t, { className: "h-3.5 w-3.5" }),
698
731
  " ",
699
- e.label
732
+ c(e.labelKey, e.defaultLabel)
700
733
  ]
701
734
  }, e.status);
702
- }), K.status !== "CANCELLED" && /* @__PURE__ */ B("button", {
735
+ }), Y.status !== "CANCELLED" && /* @__PURE__ */ B("button", {
703
736
  type: "button",
704
- disabled: Y,
705
- onClick: ce,
737
+ disabled: X,
738
+ onClick: de,
706
739
  className: "inline-flex items-center justify-center gap-1.5 rounded-lg border border-status-error-text/30 bg-status-error-bg-subtle px-3 py-1.5 text-xs font-medium text-status-error-text hover:opacity-90 disabled:opacity-50",
707
- children: [/* @__PURE__ */ z(O, { className: "h-3.5 w-3.5" }), " Cancel"]
740
+ children: [
741
+ /* @__PURE__ */ z(k, { className: "h-3.5 w-3.5" }),
742
+ " ",
743
+ c("relationships.detail.actions.cancel", "Cancel")
744
+ ]
708
745
  })]
709
746
  })]
710
747
  })
711
748
  }),
712
- j && /* @__PURE__ */ z("div", {
749
+ N && /* @__PURE__ */ z("div", {
713
750
  className: "mt-4 rounded-lg border border-status-error-text/30 bg-status-error-bg-subtle px-4 py-2 text-sm text-status-error-text",
714
- children: j
751
+ children: N
715
752
  }),
716
753
  /* @__PURE__ */ B("div", {
717
754
  className: "mt-6 grid grid-cols-1 gap-4 lg:grid-cols-3",
@@ -726,29 +763,33 @@ function X() {
726
763
  children: [
727
764
  /* @__PURE__ */ B("div", {
728
765
  className: "flex items-center gap-2 text-sm font-semibold text-text-primary",
729
- children: [/* @__PURE__ */ z(A, { className: "h-4 w-4 text-text-secondary" }), " Plan & pricing"]
766
+ children: [
767
+ /* @__PURE__ */ z(j, { className: "h-4 w-4 text-text-secondary" }),
768
+ " ",
769
+ c("relationships.detail.sections.planPricing", "Plan & pricing")
770
+ ]
730
771
  }),
731
772
  /* @__PURE__ */ B("div", {
732
773
  className: "mt-3",
733
774
  children: [
734
775
  /* @__PURE__ */ z(J, {
735
- label: "Plan",
736
- value: K.plan?.name ?? "—"
776
+ label: c("relationships.detail.info.plan", "Plan"),
777
+ value: Y.plan?.name ?? "—"
737
778
  }),
738
779
  /* @__PURE__ */ z(J, {
739
- label: "Price",
740
- value: /* @__PURE__ */ B(R, { children: [n(K.amount, K.currency), /* @__PURE__ */ z("span", {
780
+ label: c("relationships.detail.info.price", "Price"),
781
+ value: /* @__PURE__ */ B(re, { children: [n(Y.amount, Y.currency), /* @__PURE__ */ z("span", {
741
782
  className: "font-normal text-text-secondary",
742
- children: a(K.interval)
783
+ children: a(Y.interval)
743
784
  })] })
744
785
  }),
745
786
  /* @__PURE__ */ z(J, {
746
- label: "Billing interval",
747
- value: i(K.interval)
787
+ label: c("relationships.detail.info.billingInterval", "Billing interval"),
788
+ value: i(Y.interval)
748
789
  }),
749
790
  /* @__PURE__ */ z(J, {
750
- label: "Provider",
751
- value: K.provider?.name ?? "—"
791
+ label: c("relationships.detail.info.provider", "Provider"),
792
+ value: Y.provider?.name ?? "—"
752
793
  })
753
794
  ]
754
795
  }),
@@ -765,29 +806,33 @@ function X() {
765
806
  className: "p-5",
766
807
  children: [/* @__PURE__ */ B("div", {
767
808
  className: "flex items-center gap-2 text-sm font-semibold text-text-primary",
768
- children: [/* @__PURE__ */ z(te, { className: "h-4 w-4 text-text-secondary" }), " Payment & billing"]
809
+ children: [
810
+ /* @__PURE__ */ z(te, { className: "h-4 w-4 text-text-secondary" }),
811
+ " ",
812
+ c("relationships.detail.sections.paymentBilling", "Payment & billing")
813
+ ]
769
814
  }), /* @__PURE__ */ B("div", {
770
815
  className: "mt-3",
771
816
  children: [
772
817
  /* @__PURE__ */ z(J, {
773
- label: "Currency",
774
- value: K.currency
818
+ label: c("relationships.detail.info.currency", "Currency"),
819
+ value: Y.currency
775
820
  }),
776
821
  /* @__PURE__ */ z(J, {
777
- label: "Auto-renew",
822
+ label: c("relationships.detail.info.autoRenew", "Auto-renew"),
778
823
  value: Q
779
824
  }),
780
825
  /* @__PURE__ */ z(J, {
781
- label: "Next renewal",
782
- value: K.renewsAt ? r(K.renewsAt) : "—"
826
+ label: c("relationships.detail.info.nextRenewal", "Next renewal"),
827
+ value: Y.renewsAt ? r(Y.renewsAt) : "—"
783
828
  }),
784
829
  /* @__PURE__ */ z(J, {
785
- label: "Started",
786
- value: K.startedAt ? r(K.startedAt) : "—"
830
+ label: c("relationships.detail.info.started", "Started"),
831
+ value: Y.startedAt ? r(Y.startedAt) : "—"
787
832
  }),
788
- K.trialEndsAt && /* @__PURE__ */ z(J, {
789
- label: "Trial ends",
790
- value: r(K.trialEndsAt)
833
+ Y.trialEndsAt && /* @__PURE__ */ z(J, {
834
+ label: c("relationships.detail.info.trialEnds", "Trial ends"),
835
+ value: r(Y.trialEndsAt)
791
836
  })
792
837
  ]
793
838
  })]
@@ -795,21 +840,25 @@ function X() {
795
840
  }),
796
841
  /* @__PURE__ */ z(d, {
797
842
  className: "mt-0",
798
- title: "Entitlements",
799
- description: "What this relationship grants you",
843
+ title: c("relationships.detail.sections.entitlements", "Entitlements"),
844
+ description: c("relationships.detail.sections.entitlementsDescription", "What this relationship grants you"),
800
845
  action: /* @__PURE__ */ B("button", {
801
846
  type: "button",
802
- onClick: () => U(!0),
847
+ onClick: () => W(!0),
803
848
  className: "inline-flex items-center gap-1.5 rounded-lg border border-border-subtle px-3 py-1.5 text-xs font-medium text-text-primary hover:bg-bg-sunken",
804
- children: [/* @__PURE__ */ z(I, { className: "h-3.5 w-3.5" }), " Add entitlement"]
849
+ children: [
850
+ /* @__PURE__ */ z(L, { className: "h-3.5 w-3.5" }),
851
+ " ",
852
+ c("relationships.detail.sections.addEntitlement", "Add entitlement")
853
+ ]
805
854
  }),
806
- children: !K.entitlements || K.entitlements.length === 0 ? /* @__PURE__ */ z(s, {
855
+ children: !Y.entitlements || Y.entitlements.length === 0 ? /* @__PURE__ */ z(s, {
807
856
  illustration: "empty-data",
808
- title: "No entitlements",
809
- description: "Entitlements (seats, quotas, feature access) will appear here."
857
+ title: c("relationships.detail.empty.noEntitlementsTitle", "No entitlements"),
858
+ description: c("relationships.detail.empty.noEntitlementsDescription", "Entitlements (seats, quotas, feature access) will appear here.")
810
859
  }) : /* @__PURE__ */ z("div", {
811
860
  className: "grid grid-cols-1 gap-3 sm:grid-cols-2",
812
- children: K.entitlements.map((e) => {
861
+ children: Y.entitlements.map((e) => {
813
862
  let t = e.quota != null && e.quota > 0;
814
863
  return /* @__PURE__ */ B(V, {
815
864
  treatment: "plain",
@@ -853,33 +902,37 @@ function X() {
853
902
  }),
854
903
  /* @__PURE__ */ z(d, {
855
904
  className: "mt-0",
856
- title: "Assets",
857
- description: "Invoices, contracts, licenses and credentials",
905
+ title: c("relationships.detail.sections.assets", "Assets"),
906
+ description: c("relationships.detail.sections.assetsDescription", "Invoices, contracts, licenses and credentials"),
858
907
  action: /* @__PURE__ */ B("button", {
859
908
  type: "button",
860
- onClick: () => G(!0),
909
+ onClick: () => K(!0),
861
910
  className: "inline-flex items-center gap-1.5 rounded-lg border border-border-subtle px-3 py-1.5 text-xs font-medium text-text-primary hover:bg-bg-sunken",
862
- children: [/* @__PURE__ */ z(I, { className: "h-3.5 w-3.5" }), " Attach asset"]
911
+ children: [
912
+ /* @__PURE__ */ z(L, { className: "h-3.5 w-3.5" }),
913
+ " ",
914
+ c("relationships.detail.sections.attachAsset", "Attach asset")
915
+ ]
863
916
  }),
864
- children: !K.assets || K.assets.length === 0 ? /* @__PURE__ */ z(s, {
917
+ children: !Y.assets || Y.assets.length === 0 ? /* @__PURE__ */ z(s, {
865
918
  illustration: "empty-data",
866
- title: "No assets attached",
867
- description: "Attach invoices, contracts, licenses or receipts to this relationship."
919
+ title: c("relationships.detail.empty.noAssetsTitle", "No assets attached"),
920
+ description: c("relationships.detail.empty.noAssetsDescription", "Attach invoices, contracts, licenses or receipts to this relationship.")
868
921
  }) : /* @__PURE__ */ z(V, {
869
922
  treatment: "plain",
870
923
  className: "divide-y divide-border-subtle p-0",
871
- children: K.assets.map((e) => /* @__PURE__ */ z(se, { asset: e }, e.id))
924
+ children: Y.assets.map((e) => /* @__PURE__ */ z(le, { asset: e }, e.id))
872
925
  })
873
926
  }),
874
- K.notes && /* @__PURE__ */ B(V, {
927
+ Y.notes && /* @__PURE__ */ B(V, {
875
928
  treatment: "plain",
876
929
  className: "p-4",
877
930
  children: [/* @__PURE__ */ z("p", {
878
931
  className: "text-xs font-medium text-text-secondary",
879
- children: "Notes"
932
+ children: c("relationships.detail.sections.notes", "Notes")
880
933
  }), /* @__PURE__ */ z("p", {
881
934
  className: "mt-1 whitespace-pre-wrap text-sm text-text-primary",
882
- children: K.notes
935
+ children: Y.notes
883
936
  })]
884
937
  })
885
938
  ]
@@ -890,23 +943,27 @@ function X() {
890
943
  className: "p-5",
891
944
  children: [/* @__PURE__ */ B("div", {
892
945
  className: "flex items-center gap-2 text-sm font-semibold text-text-primary",
893
- children: [/* @__PURE__ */ z(E, { className: "h-4 w-4 text-text-secondary" }), " Health score"]
894
- }), K.healthScore == null ? /* @__PURE__ */ z("p", {
946
+ children: [
947
+ /* @__PURE__ */ z(D, { className: "h-4 w-4 text-text-secondary" }),
948
+ " ",
949
+ c("relationships.detail.sections.healthScore", "Health score")
950
+ ]
951
+ }), Y.healthScore == null ? /* @__PURE__ */ z("p", {
895
952
  className: "mt-4 text-sm text-text-secondary",
896
- children: "Not scored yet. A health score appears once Subscriber Bot has enough signal."
953
+ children: c("relationships.detail.empty.noHealthScore", "Not scored yet. A health score appears once Subscriber Bot has enough signal.")
897
954
  }) : /* @__PURE__ */ B("div", {
898
955
  className: "mt-4 flex flex-col items-center",
899
956
  children: [/* @__PURE__ */ z(f, {
900
- value: K.healthScore,
957
+ value: Y.healthScore,
901
958
  max: 100,
902
959
  size: 160,
903
- label: "of 100"
960
+ label: c("relationships.detail.outOf100", "of 100")
904
961
  }), /* @__PURE__ */ z("div", {
905
962
  className: "mt-2 w-full",
906
963
  children: /* @__PURE__ */ z(p, {
907
- value: K.healthScore,
964
+ value: Y.healthScore,
908
965
  max: 100,
909
- tone: re(K.healthScore)
966
+ tone: ae(Y.healthScore)
910
967
  })
911
968
  })]
912
969
  })]
@@ -916,18 +973,22 @@ function X() {
916
973
  children: [
917
974
  /* @__PURE__ */ B("div", {
918
975
  className: "flex items-center gap-2 text-sm font-semibold text-text-primary",
919
- children: [/* @__PURE__ */ z(k, { className: "h-4 w-4 text-text-secondary" }), " Renewal timeline"]
976
+ children: [
977
+ /* @__PURE__ */ z(A, { className: "h-4 w-4 text-text-secondary" }),
978
+ " ",
979
+ c("relationships.detail.sections.renewalTimeline", "Renewal timeline")
980
+ ]
920
981
  }),
921
982
  /* @__PURE__ */ z("p", {
922
983
  className: "mt-0.5 text-xs text-text-secondary",
923
- children: "Detected renewals and price changes"
984
+ children: c("relationships.detail.sections.renewalTimelineDescription", "Detected renewals and price changes")
924
985
  }),
925
986
  Z.length === 0 ? /* @__PURE__ */ z("div", {
926
987
  className: "mt-4",
927
988
  children: /* @__PURE__ */ z(s, {
928
989
  illustration: "empty-calendar",
929
- title: "No renewal events",
930
- description: "Renewals and price changes will appear here as they're detected."
990
+ title: c("relationships.detail.empty.noRenewalEventsTitle", "No renewal events"),
991
+ description: c("relationships.detail.empty.noRenewalEventsDescription", "Renewals and price changes will appear here as they're detected.")
931
992
  })
932
993
  }) : /* @__PURE__ */ z(m, {
933
994
  items: Z,
@@ -937,17 +998,17 @@ function X() {
937
998
  })]
938
999
  })]
939
1000
  }),
940
- N && /* @__PURE__ */ z(ie, {
941
- relationship: K,
942
- onClose: () => F(!1)
1001
+ I && /* @__PURE__ */ z(oe, {
1002
+ relationship: Y,
1003
+ onClose: () => H(!1)
943
1004
  }),
944
- H && /* @__PURE__ */ z(ae, {
945
- relationshipId: K.id,
946
- onClose: () => U(!1)
1005
+ U && /* @__PURE__ */ z(se, {
1006
+ relationshipId: Y.id,
1007
+ onClose: () => W(!1)
947
1008
  }),
948
- W && /* @__PURE__ */ z(oe, {
949
- relationshipId: K.id,
950
- onClose: () => G(!1)
1009
+ G && /* @__PURE__ */ z(ce, {
1010
+ relationshipId: Y.id,
1011
+ onClose: () => K(!1)
951
1012
  })
952
1013
  ]
953
1014
  });