@burdenoff/microfe-billing 2026.530.2 → 2026.530.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (28) hide show
  1. package/dist/billing/BillingAdminRoutes.js +84 -71
  2. package/dist/billing/BillingAdminRoutes.js.map +1 -1
  3. package/dist/billing/BillingUserRoutes.js +103 -90
  4. package/dist/billing/BillingUserRoutes.js.map +1 -1
  5. package/dist/billing/modules/billing/index.js +2 -1
  6. package/dist/billing/modules/billing/pages/InvoicesListPage.js +135 -126
  7. package/dist/billing/modules/billing/pages/InvoicesListPage.js.map +1 -1
  8. package/dist/billing/modules/billing/pages/UserRefundsPage.js +417 -0
  9. package/dist/billing/modules/billing/pages/UserRefundsPage.js.map +1 -0
  10. package/dist/billing/modules/billing/pages/index.js +1 -0
  11. package/dist/billing/modules/plans/constants/featuredQuotas.js +37 -0
  12. package/dist/billing/modules/plans/constants/featuredQuotas.js.map +1 -0
  13. package/dist/billing/modules/plans/index.js +2 -1
  14. package/dist/billing/modules/plans/pages/PlanAssignFreePage.js +205 -0
  15. package/dist/billing/modules/plans/pages/PlanAssignFreePage.js.map +1 -0
  16. package/dist/billing/modules/plans/pages/PlanCreatePage.js +51 -33
  17. package/dist/billing/modules/plans/pages/PlanCreatePage.js.map +1 -1
  18. package/dist/billing/modules/plans/pages/PlanEditPage.js +78 -60
  19. package/dist/billing/modules/plans/pages/PlanEditPage.js.map +1 -1
  20. package/dist/billing/modules/plans/pages/PlansBrowsePage.js +246 -126
  21. package/dist/billing/modules/plans/pages/PlansBrowsePage.js.map +1 -1
  22. package/dist/billing/modules/plans/pages/index.js +1 -0
  23. package/dist/billing/shared/types/graphql.js.map +1 -1
  24. package/dist/generated/global-operations.js +317 -287
  25. package/dist/generated/global-operations.js.map +1 -1
  26. package/dist/generated/global-types.js +3 -1
  27. package/dist/generated/global-types.js.map +1 -1
  28. package/package.json +1 -1
@@ -1,23 +1,25 @@
1
1
  import { useBilling as e } from "../../../providers/BillingProvider.js";
2
2
  import { ServerError as t } from "../../../shared/components/ServerError.js";
3
3
  import "../../../shared/components/index.js";
4
- import { formatCurrency as n, formatPlanDuration as r, formatPlanDurationLabel as i } from "../../../shared/utils/format.js";
5
- import { isServerError as a } from "../../../shared/utils/error.js";
6
- import { getPlanFeatureQuantity as o } from "../../../shared/utils/planFeatureQuantity.js";
4
+ import { PlanDuration as n } from "../../../shared/types/graphql.js";
5
+ import { formatCurrency as r, formatPlanDuration as i, formatPlanDurationLabel as a } from "../../../shared/utils/format.js";
6
+ import { isServerError as o } from "../../../shared/utils/error.js";
7
+ import { getPlanFeatureQuantity as s } from "../../../shared/utils/planFeatureQuantity.js";
7
8
  import "../../../shared/utils/index.js";
8
- import { useBillingNavigate as s } from "../../../hooks/useBillingNavigate.js";
9
- import { getDisplayPrice as c, useDefaultBillingCurrency as l } from "../../../hooks/useDefaultBillingCurrency.js";
10
- import { usePlans as u } from "../hooks/usePlans.js";
9
+ import { useBillingNavigate as c } from "../../../hooks/useBillingNavigate.js";
10
+ import { getDisplayPrice as l, useDefaultBillingCurrency as u } from "../../../hooks/useDefaultBillingCurrency.js";
11
+ import { usePlans as d } from "../hooks/usePlans.js";
11
12
  import "../hooks/index.js";
12
- import { useState as d } from "react";
13
- import { jsx as f, jsxs as p } from "react/jsx-runtime";
14
- import { useI18n as m } from "@burdenoff/fe-libs/shared/providers/shell/I18nProvider";
13
+ import { FEATURED_QUOTA_LABELS as f, FEATURED_QUOTA_NAMES as p, formatFeaturedQuotaValue as m } from "../constants/featuredQuotas.js";
14
+ import { useState as h } from "react";
15
+ import { jsx as g, jsxs as _ } from "react/jsx-runtime";
16
+ import { useI18n as v } from "@burdenoff/fe-libs/shared/providers/shell/I18nProvider";
15
17
  //#region src/billing/modules/plans/pages/PlansBrowsePage.tsx
16
- function h(e) {
18
+ function y(e) {
17
19
  let t = /* @__PURE__ */ new Map();
18
20
  for (let n of e) {
19
21
  if (!n.quota) continue;
20
- let e = n.quota.id, r = o(n), i = t.get(e);
22
+ let e = n.quota.id, r = s(n), i = t.get(e);
21
23
  i ? i.totalValue += r : t.set(e, {
22
24
  quotaId: e,
23
25
  name: n.quota.name ?? "Unknown Quota",
@@ -26,100 +28,103 @@ function h(e) {
26
28
  }
27
29
  return Array.from(t.values());
28
30
  }
29
- var g = () => {
30
- let { t: n } = m(), r = (e, t) => {
31
- let r = n(e);
32
- return r === e ? t : r;
33
- }, i = s(), { productId: o } = e(), { plans: c, isLoading: l, error: h, refetch: g } = u({
31
+ function b(e) {
32
+ let t = y(e), n = new Map(t.map((e) => [e.name, e]));
33
+ return p.flatMap((e) => {
34
+ let t = n.get(e);
35
+ return t ? [t] : [];
36
+ });
37
+ }
38
+ var x = () => {
39
+ let { t: r } = v(), i = (e, t) => {
40
+ let n = r(e);
41
+ return n === e ? t : n;
42
+ }, a = c(), { productId: s } = e(), { plans: l, isLoading: u, error: f, refetch: p } = d({
34
43
  includeFree: !1,
35
- productId: o ?? void 0
36
- }), [y, b] = d("grid"), [x, S] = d("all"), C = c.filter((e) => !(!e.isActive || x !== "all" && e.duration !== x));
37
- return l && c.length === 0 ? /* @__PURE__ */ p("div", {
44
+ productId: s ?? void 0
45
+ }), [m, y] = h("grid"), [b, x] = h(n.MONTHLY), S = l.filter((e) => e.isActive && e.duration === b);
46
+ return u && l.length === 0 ? /* @__PURE__ */ _("div", {
38
47
  className: "space-y-6 p-6",
39
- children: [/* @__PURE__ */ f("div", { className: "h-8 w-48 bg-muted animate-pulse rounded" }), /* @__PURE__ */ f("div", {
48
+ children: [/* @__PURE__ */ g("div", { className: "h-8 w-48 bg-muted animate-pulse rounded" }), /* @__PURE__ */ g("div", {
40
49
  className: "grid grid-cols-1 md:grid-cols-3 gap-6",
41
50
  children: [
42
51
  1,
43
52
  2,
44
53
  3
45
- ].map((e) => /* @__PURE__ */ p("div", {
54
+ ].map((e) => /* @__PURE__ */ _("div", {
46
55
  className: "border border-border rounded-lg p-6 space-y-4",
47
56
  children: [
48
- /* @__PURE__ */ f("div", { className: "h-6 w-24 bg-muted animate-pulse rounded" }),
49
- /* @__PURE__ */ f("div", { className: "h-8 w-32 bg-muted animate-pulse rounded" }),
50
- /* @__PURE__ */ f("div", {
57
+ /* @__PURE__ */ g("div", { className: "h-6 w-24 bg-muted animate-pulse rounded" }),
58
+ /* @__PURE__ */ g("div", { className: "h-8 w-32 bg-muted animate-pulse rounded" }),
59
+ /* @__PURE__ */ g("div", {
51
60
  className: "space-y-2",
52
61
  children: [
53
62
  1,
54
63
  2,
55
64
  3
56
- ].map((e) => /* @__PURE__ */ f("div", { className: "h-4 w-full bg-muted animate-pulse rounded" }, e))
65
+ ].map((e) => /* @__PURE__ */ g("div", { className: "h-4 w-full bg-muted animate-pulse rounded" }, e))
57
66
  })
58
67
  ]
59
68
  }, e))
60
69
  })]
61
- }) : h && a(h) ? /* @__PURE__ */ f("div", {
70
+ }) : f && o(f) ? /* @__PURE__ */ g("div", {
62
71
  className: "p-6",
63
- children: /* @__PURE__ */ f(t, {
64
- title: r("billing.plans.serverUnavailable", "Server Unavailable"),
65
- message: r("billing.plans.unableToLoadPlans", "Unable to load plans."),
66
- onRetry: () => g(),
72
+ children: /* @__PURE__ */ g(t, {
73
+ title: i("billing.plans.serverUnavailable", "Server Unavailable"),
74
+ message: i("billing.plans.unableToLoadPlans", "Unable to load plans."),
75
+ onRetry: () => p(),
67
76
  showRetry: !0
68
77
  })
69
- }) : /* @__PURE__ */ p("div", {
78
+ }) : /* @__PURE__ */ _("div", {
70
79
  className: "space-y-6 p-6",
71
80
  children: [
72
- /* @__PURE__ */ p("div", { children: [/* @__PURE__ */ f("h1", {
81
+ /* @__PURE__ */ _("div", { children: [/* @__PURE__ */ g("h1", {
73
82
  className: "text-2xl font-bold text-foreground",
74
- children: r("billing.plans.browsePlansTitle", "Plans")
75
- }), /* @__PURE__ */ f("p", {
83
+ children: i("billing.plans.browsePlansTitle", "Plans")
84
+ }), /* @__PURE__ */ g("p", {
76
85
  className: "text-sm text-muted-foreground mt-1",
77
- children: r("billing.plans.browsePlansSubtitle", "Choose a plan that fits your needs")
86
+ children: i("billing.plans.browsePlansSubtitle", "Choose a plan that fits your needs")
78
87
  })] }),
79
- /* @__PURE__ */ p("div", {
88
+ /* @__PURE__ */ _("div", {
80
89
  className: "flex flex-wrap items-center gap-4 pb-4 border-b border-border",
81
- children: [/* @__PURE__ */ f("div", {
90
+ children: [/* @__PURE__ */ g("div", {
82
91
  className: "inline-flex rounded-lg border border-border p-1 bg-muted/50",
83
- children: [
84
- "all",
85
- "monthly",
86
- "yearly"
87
- ].map((e) => /* @__PURE__ */ f("button", {
92
+ children: [n.MONTHLY, n.YEARLY].map((e) => /* @__PURE__ */ g("button", {
88
93
  type: "button",
89
- onClick: () => S(e),
90
- className: `px-3 py-1.5 text-sm font-medium rounded-md transition-colors ${x === e ? "bg-background text-foreground shadow-sm" : "text-muted-foreground hover:text-foreground"}`,
91
- children: e === "all" ? "All" : e === "monthly" ? "Monthly" : "Yearly"
94
+ onClick: () => x(e),
95
+ className: `px-3 py-1.5 text-sm font-medium rounded-md transition-colors ${b === e ? "bg-background text-foreground shadow-sm" : "text-muted-foreground hover:text-foreground"}`,
96
+ children: e === n.MONTHLY ? "Monthly" : "Yearly"
92
97
  }, e))
93
- }), /* @__PURE__ */ p("div", {
98
+ }), /* @__PURE__ */ _("div", {
94
99
  className: "ml-auto inline-flex rounded-lg border border-border p-1 bg-muted/50",
95
- children: [/* @__PURE__ */ f("button", {
100
+ children: [/* @__PURE__ */ g("button", {
96
101
  type: "button",
97
- onClick: () => b("grid"),
98
- className: `p-1.5 rounded-md transition-colors ${y === "grid" ? "bg-background text-foreground shadow-sm" : "text-muted-foreground hover:text-foreground"}`,
102
+ onClick: () => y("grid"),
103
+ className: `p-1.5 rounded-md transition-colors ${m === "grid" ? "bg-background text-foreground shadow-sm" : "text-muted-foreground hover:text-foreground"}`,
99
104
  title: "Grid view",
100
- children: /* @__PURE__ */ f("svg", {
105
+ children: /* @__PURE__ */ g("svg", {
101
106
  className: "size-4",
102
107
  fill: "none",
103
108
  viewBox: "0 0 24 24",
104
109
  stroke: "currentColor",
105
- children: /* @__PURE__ */ f("path", {
110
+ children: /* @__PURE__ */ g("path", {
106
111
  strokeLinecap: "round",
107
112
  strokeLinejoin: "round",
108
113
  strokeWidth: 2,
109
114
  d: "M4 6a2 2 0 012-2h2a2 2 0 012 2v2a2 2 0 01-2 2H6a2 2 0 01-2-2V6zM14 6a2 2 0 012-2h2a2 2 0 012 2v2a2 2 0 01-2 2h-2a2 2 0 01-2-2V6zM4 16a2 2 0 012-2h2a2 2 0 012 2v2a2 2 0 01-2 2H6a2 2 0 01-2-2v-2zM14 16a2 2 0 012-2h2a2 2 0 012 2v2a2 2 0 01-2 2h-2a2 2 0 01-2-2v-2z"
110
115
  })
111
116
  })
112
- }), /* @__PURE__ */ f("button", {
117
+ }), /* @__PURE__ */ g("button", {
113
118
  type: "button",
114
- onClick: () => b("list"),
115
- className: `p-1.5 rounded-md transition-colors ${y === "list" ? "bg-background text-foreground shadow-sm" : "text-muted-foreground hover:text-foreground"}`,
119
+ onClick: () => y("list"),
120
+ className: `p-1.5 rounded-md transition-colors ${m === "list" ? "bg-background text-foreground shadow-sm" : "text-muted-foreground hover:text-foreground"}`,
116
121
  title: "List view",
117
- children: /* @__PURE__ */ f("svg", {
122
+ children: /* @__PURE__ */ g("svg", {
118
123
  className: "size-4",
119
124
  fill: "none",
120
125
  viewBox: "0 0 24 24",
121
126
  stroke: "currentColor",
122
- children: /* @__PURE__ */ f("path", {
127
+ children: /* @__PURE__ */ g("path", {
123
128
  strokeLinecap: "round",
124
129
  strokeLinejoin: "round",
125
130
  strokeWidth: 2,
@@ -129,17 +134,17 @@ var g = () => {
129
134
  })]
130
135
  })]
131
136
  }),
132
- C.length === 0 ? /* @__PURE__ */ p("div", {
137
+ S.length === 0 ? /* @__PURE__ */ _("div", {
133
138
  className: "flex flex-col items-center justify-center py-12 border border-dashed border-border rounded-lg",
134
139
  children: [
135
- /* @__PURE__ */ f("div", {
140
+ /* @__PURE__ */ g("div", {
136
141
  className: "size-12 rounded-full bg-muted flex items-center justify-center mb-4",
137
- children: /* @__PURE__ */ f("svg", {
142
+ children: /* @__PURE__ */ g("svg", {
138
143
  className: "size-6 text-muted-foreground",
139
144
  fill: "none",
140
145
  viewBox: "0 0 24 24",
141
146
  stroke: "currentColor",
142
- children: /* @__PURE__ */ f("path", {
147
+ children: /* @__PURE__ */ g("path", {
143
148
  strokeLinecap: "round",
144
149
  strokeLinejoin: "round",
145
150
  strokeWidth: 2,
@@ -147,102 +152,217 @@ var g = () => {
147
152
  })
148
153
  })
149
154
  }),
150
- /* @__PURE__ */ f("h3", {
155
+ /* @__PURE__ */ g("h3", {
151
156
  className: "text-lg font-medium text-foreground",
152
- children: r("billing.plans.noPlansAvailable", "No plans available")
157
+ children: i("billing.plans.noPlansAvailable", "No plans available")
153
158
  }),
154
- /* @__PURE__ */ f("p", {
159
+ /* @__PURE__ */ g("p", {
155
160
  className: "text-sm text-muted-foreground mt-1",
156
- children: r("billing.plans.checkBackLater", "Check back later for new plans.")
161
+ children: i("billing.plans.checkBackLater", "Check back later for new plans.")
157
162
  })
158
163
  ]
159
- }) : y === "grid" ? /* @__PURE__ */ f("div", {
164
+ }) : m === "grid" ? /* @__PURE__ */ _("div", {
160
165
  className: "grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-6",
161
- children: C.map((e) => /* @__PURE__ */ f(_, {
166
+ children: [S.map((e) => /* @__PURE__ */ g(T, {
162
167
  plan: e,
163
- onView: () => i(`/plans/${e.id}`),
164
- onSubscribe: () => i(`/checkout/${e.id}`)
165
- }, e.id))
166
- }) : /* @__PURE__ */ f("div", {
168
+ onView: () => a(`/plans/${e.id}`),
169
+ onSubscribe: () => a(`/checkout/${e.id}`)
170
+ }, e.id)), /* @__PURE__ */ g(C, {})]
171
+ }) : /* @__PURE__ */ _("div", {
167
172
  className: "space-y-3",
168
- children: C.map((e) => /* @__PURE__ */ f(v, {
173
+ children: [S.map((e) => /* @__PURE__ */ g(E, {
169
174
  plan: e,
170
- onView: () => i(`/plans/${e.id}`),
171
- onSubscribe: () => i(`/checkout/${e.id}`)
172
- }, e.id))
175
+ onView: () => a(`/plans/${e.id}`),
176
+ onSubscribe: () => a(`/checkout/${e.id}`)
177
+ }, e.id)), /* @__PURE__ */ g(w, {})]
173
178
  })
174
179
  ]
175
180
  });
176
- }, _ = ({ plan: e, onView: t, onSubscribe: a }) => {
177
- let o = h(e.features || []), s = l();
178
- return /* @__PURE__ */ p("div", {
181
+ }, S = [
182
+ "Unlimited Agents & Sessions",
183
+ "Dedicated single-tenant infra",
184
+ "Customer-managed encryption keys",
185
+ "SSO / SCIM provisioning",
186
+ "Custom SLA & support contract",
187
+ "Volume-based custom pricing",
188
+ "Audit log with custom retention",
189
+ "Priority onboarding & migration"
190
+ ], C = () => /* @__PURE__ */ _("div", {
191
+ className: "border border-action-primary-bg/40 bg-action-primary-bg/5 rounded-lg p-6 flex flex-col h-full",
192
+ children: [
193
+ /* @__PURE__ */ _("div", {
194
+ className: "mb-4",
195
+ children: [/* @__PURE__ */ _("div", {
196
+ className: "flex items-center gap-2",
197
+ children: [/* @__PURE__ */ g("h3", {
198
+ className: "text-lg font-bold text-foreground",
199
+ children: "Enterprise"
200
+ }), /* @__PURE__ */ g("span", {
201
+ className: "text-xs font-medium px-2 py-0.5 rounded-full bg-action-primary-bg/15 text-action-primary-bg",
202
+ children: "Contact Us"
203
+ })]
204
+ }), /* @__PURE__ */ g("span", {
205
+ className: "text-sm text-muted-foreground",
206
+ children: "Custom contract"
207
+ })]
208
+ }),
209
+ /* @__PURE__ */ g("div", {
210
+ className: "flex items-baseline gap-1 mb-4",
211
+ children: /* @__PURE__ */ g("span", {
212
+ className: "text-2xl font-bold text-foreground",
213
+ children: "Custom pricing"
214
+ })
215
+ }),
216
+ /* @__PURE__ */ g("ul", {
217
+ className: "space-y-2 mb-4 flex-1",
218
+ children: S.map((e) => /* @__PURE__ */ _("li", {
219
+ className: "flex items-center gap-2 text-sm",
220
+ children: [/* @__PURE__ */ g("svg", {
221
+ className: "size-4 text-status-success-text shrink-0",
222
+ fill: "none",
223
+ viewBox: "0 0 24 24",
224
+ stroke: "currentColor",
225
+ children: /* @__PURE__ */ g("path", {
226
+ strokeLinecap: "round",
227
+ strokeLinejoin: "round",
228
+ strokeWidth: 2,
229
+ d: "M5 13l4 4L19 7"
230
+ })
231
+ }), /* @__PURE__ */ g("span", {
232
+ className: "text-foreground",
233
+ children: e
234
+ })]
235
+ }, e))
236
+ }),
237
+ /* @__PURE__ */ g("div", {
238
+ className: "space-y-2 pt-4 border-t border-border mt-auto",
239
+ children: /* @__PURE__ */ g("a", {
240
+ href: "mailto:contact@burdenoff.com?subject=Enterprise Plan Inquiry",
241
+ className: "block w-full px-4 py-2 text-sm font-medium text-center bg-action-primary-bg text-action-primary-text rounded-md hover:bg-action-primary-bg-hover transition-colors",
242
+ children: "Contact Us"
243
+ })
244
+ })
245
+ ]
246
+ }), w = () => /* @__PURE__ */ _("div", {
247
+ className: "flex items-center gap-4 p-4 border border-action-primary-bg/40 rounded-lg bg-action-primary-bg/5 transition-all hover:shadow-sm",
248
+ children: [
249
+ /* @__PURE__ */ g("div", {
250
+ className: "size-10 rounded-lg bg-action-primary-bg/10 flex items-center justify-center shrink-0",
251
+ children: /* @__PURE__ */ g("svg", {
252
+ className: "size-5 text-action-primary-bg",
253
+ fill: "none",
254
+ viewBox: "0 0 24 24",
255
+ stroke: "currentColor",
256
+ children: /* @__PURE__ */ g("path", {
257
+ strokeLinecap: "round",
258
+ strokeLinejoin: "round",
259
+ strokeWidth: 2,
260
+ d: "M19 21V5a2 2 0 00-2-2H7a2 2 0 00-2 2v16m14 0h2m-2 0h-5m-9 0H3m2 0h5M9 7h1m-1 4h1m4-4h1m-1 4h1m-2 10v-5a1 1 0 011-1h2a1 1 0 011 1v5m-4 0h4"
261
+ })
262
+ })
263
+ }),
264
+ /* @__PURE__ */ _("div", {
265
+ className: "flex-1 min-w-0",
266
+ children: [/* @__PURE__ */ _("div", {
267
+ className: "flex items-center gap-2",
268
+ children: [/* @__PURE__ */ g("h3", {
269
+ className: "font-semibold text-foreground",
270
+ children: "Enterprise"
271
+ }), /* @__PURE__ */ g("span", {
272
+ className: "text-xs font-medium px-2 py-0.5 rounded-full bg-action-primary-bg/15 text-action-primary-bg shrink-0",
273
+ children: "Contact Us"
274
+ })]
275
+ }), /* @__PURE__ */ g("p", {
276
+ className: "text-sm text-muted-foreground",
277
+ children: "Dedicated infra · SSO/SCIM · Custom SLA"
278
+ })]
279
+ }),
280
+ /* @__PURE__ */ _("div", {
281
+ className: "text-right",
282
+ children: [/* @__PURE__ */ g("div", {
283
+ className: "font-semibold text-foreground",
284
+ children: "Custom pricing"
285
+ }), /* @__PURE__ */ g("div", {
286
+ className: "text-sm text-muted-foreground",
287
+ children: "contract-based"
288
+ })]
289
+ }),
290
+ /* @__PURE__ */ g("a", {
291
+ href: "mailto:contact@burdenoff.com?subject=Enterprise Plan Inquiry",
292
+ className: "px-3 py-1.5 text-sm font-medium bg-action-primary-bg text-action-primary-text rounded-md hover:bg-action-primary-bg-hover transition-colors shrink-0",
293
+ children: "Contact Us"
294
+ })
295
+ ]
296
+ }), T = ({ plan: e, onView: t, onSubscribe: n }) => {
297
+ let o = b(e.features || []), s = y(e.features || []).length - o.length, c = u();
298
+ return /* @__PURE__ */ _("div", {
179
299
  className: "border border-border rounded-lg bg-card p-6 transition-all hover:shadow-md flex flex-col h-full",
180
300
  children: [
181
- /* @__PURE__ */ p("div", {
301
+ /* @__PURE__ */ _("div", {
182
302
  className: "mb-4",
183
- children: [/* @__PURE__ */ f("h3", {
303
+ children: [/* @__PURE__ */ g("h3", {
184
304
  className: "text-lg font-bold text-foreground",
185
305
  children: e.name
186
- }), /* @__PURE__ */ f("span", {
306
+ }), /* @__PURE__ */ g("span", {
187
307
  className: "text-sm text-muted-foreground",
188
- children: i(e.duration)
308
+ children: a(e.duration)
189
309
  })]
190
310
  }),
191
- /* @__PURE__ */ p("div", {
311
+ /* @__PURE__ */ _("div", {
192
312
  className: "flex items-baseline gap-1 mb-4",
193
- children: [/* @__PURE__ */ f("span", {
313
+ children: [/* @__PURE__ */ g("span", {
194
314
  className: "text-3xl font-bold text-foreground",
195
315
  children: (() => {
196
- let { price: t, currency: r } = c(e.price, e.currency, e.currencyPrices, s);
197
- return n(t, r);
316
+ let { price: t, currency: n } = l(e.price, e.currency, e.currencyPrices, c);
317
+ return r(t, n);
198
318
  })()
199
- }), /* @__PURE__ */ p("span", {
319
+ }), /* @__PURE__ */ _("span", {
200
320
  className: "text-muted-foreground text-sm",
201
- children: ["/ ", r(e.duration)]
321
+ children: ["/ ", i(e.duration)]
202
322
  })]
203
323
  }),
204
- o.length > 0 && /* @__PURE__ */ p("ul", {
205
- className: "space-y-2 mb-4",
206
- children: [o.slice(0, 5).map((e) => /* @__PURE__ */ p("li", {
324
+ o.length > 0 && /* @__PURE__ */ _("ul", {
325
+ className: "space-y-2 mb-4 flex-1",
326
+ children: [o.map((e) => /* @__PURE__ */ _("li", {
207
327
  className: "flex items-center justify-between text-sm",
208
- children: [/* @__PURE__ */ p("div", {
328
+ children: [/* @__PURE__ */ _("div", {
209
329
  className: "flex items-center gap-2",
210
- children: [/* @__PURE__ */ f("svg", {
330
+ children: [/* @__PURE__ */ g("svg", {
211
331
  className: "size-4 text-status-success-text shrink-0",
212
332
  fill: "none",
213
333
  viewBox: "0 0 24 24",
214
334
  stroke: "currentColor",
215
- children: /* @__PURE__ */ f("path", {
335
+ children: /* @__PURE__ */ g("path", {
216
336
  strokeLinecap: "round",
217
337
  strokeLinejoin: "round",
218
338
  strokeWidth: 2,
219
339
  d: "M5 13l4 4L19 7"
220
340
  })
221
- }), /* @__PURE__ */ f("span", {
341
+ }), /* @__PURE__ */ g("span", {
222
342
  className: "text-foreground",
223
- children: e.name
343
+ children: f[e.name] ?? e.name
224
344
  })]
225
- }), /* @__PURE__ */ f("span", {
226
- className: "font-medium text-foreground",
227
- children: e.totalValue.toLocaleString()
345
+ }), /* @__PURE__ */ g("span", {
346
+ className: "font-medium text-foreground tabular-nums",
347
+ children: m(e.name, e.totalValue)
228
348
  })]
229
- }, e.quotaId)), o.length > 5 && /* @__PURE__ */ p("li", {
349
+ }, e.quotaId)), s > 0 && /* @__PURE__ */ _("li", {
230
350
  className: "text-sm text-muted-foreground pl-6",
231
351
  children: [
232
352
  "+",
233
- o.length - 5,
234
- " more"
353
+ s,
354
+ " more — see details"
235
355
  ]
236
356
  })]
237
357
  }),
238
- /* @__PURE__ */ p("div", {
358
+ /* @__PURE__ */ _("div", {
239
359
  className: "space-y-2 pt-4 border-t border-border mt-auto",
240
- children: [/* @__PURE__ */ f("button", {
360
+ children: [/* @__PURE__ */ g("button", {
241
361
  type: "button",
242
- onClick: a,
362
+ onClick: n,
243
363
  className: "w-full px-4 py-2 text-sm font-medium bg-primary text-primary-foreground rounded-md hover:bg-primary/90 transition-colors",
244
364
  children: "Subscribe"
245
- }), /* @__PURE__ */ f("button", {
365
+ }), /* @__PURE__ */ g("button", {
246
366
  type: "button",
247
367
  onClick: t,
248
368
  className: "w-full px-4 py-2 text-sm font-medium border border-border text-foreground rounded-md hover:bg-muted transition-colors",
@@ -251,19 +371,19 @@ var g = () => {
251
371
  })
252
372
  ]
253
373
  });
254
- }, v = ({ plan: e, onView: t, onSubscribe: i }) => {
255
- let a = h(e.features || []), o = l();
256
- return /* @__PURE__ */ p("div", {
374
+ }, E = ({ plan: e, onView: t, onSubscribe: n }) => {
375
+ let a = b(e.features || []), o = u();
376
+ return /* @__PURE__ */ _("div", {
257
377
  className: "flex items-center gap-4 p-4 border border-border rounded-lg bg-card transition-all hover:shadow-sm",
258
378
  children: [
259
- /* @__PURE__ */ f("div", {
379
+ /* @__PURE__ */ g("div", {
260
380
  className: "size-10 rounded-lg bg-primary/10 flex items-center justify-center shrink-0",
261
- children: /* @__PURE__ */ f("svg", {
381
+ children: /* @__PURE__ */ g("svg", {
262
382
  className: "size-5 text-primary",
263
383
  fill: "none",
264
384
  viewBox: "0 0 24 24",
265
385
  stroke: "currentColor",
266
- children: /* @__PURE__ */ f("path", {
386
+ children: /* @__PURE__ */ g("path", {
267
387
  strokeLinecap: "round",
268
388
  strokeLinejoin: "round",
269
389
  strokeWidth: 2,
@@ -271,42 +391,42 @@ var g = () => {
271
391
  })
272
392
  })
273
393
  }),
274
- /* @__PURE__ */ p("div", {
394
+ /* @__PURE__ */ _("div", {
275
395
  className: "flex-1 min-w-0",
276
- children: [/* @__PURE__ */ f("h3", {
396
+ children: [/* @__PURE__ */ g("h3", {
277
397
  className: "font-semibold text-foreground truncate",
278
398
  children: e.name
279
- }), /* @__PURE__ */ p("p", {
399
+ }), /* @__PURE__ */ _("p", {
280
400
  className: "text-sm text-muted-foreground",
281
401
  children: [
282
402
  a.length,
283
- " quota",
403
+ " key feature",
284
404
  a.length === 1 ? "" : "s",
285
405
  " included"
286
406
  ]
287
407
  })]
288
408
  }),
289
- /* @__PURE__ */ p("div", {
409
+ /* @__PURE__ */ _("div", {
290
410
  className: "text-right",
291
- children: [/* @__PURE__ */ f("div", {
411
+ children: [/* @__PURE__ */ g("div", {
292
412
  className: "font-semibold text-foreground",
293
413
  children: (() => {
294
- let { price: t, currency: r } = c(e.price, e.currency, e.currencyPrices, o);
295
- return n(t, r);
414
+ let { price: t, currency: n } = l(e.price, e.currency, e.currencyPrices, o);
415
+ return r(t, n);
296
416
  })()
297
- }), /* @__PURE__ */ p("div", {
417
+ }), /* @__PURE__ */ _("div", {
298
418
  className: "text-sm text-muted-foreground",
299
- children: ["per ", r(e.duration)]
419
+ children: ["per ", i(e.duration)]
300
420
  })]
301
421
  }),
302
- /* @__PURE__ */ p("div", {
422
+ /* @__PURE__ */ _("div", {
303
423
  className: "flex items-center gap-2",
304
- children: [/* @__PURE__ */ f("button", {
424
+ children: [/* @__PURE__ */ g("button", {
305
425
  type: "button",
306
- onClick: i,
426
+ onClick: n,
307
427
  className: "px-3 py-1.5 text-sm font-medium bg-primary text-primary-foreground rounded-md hover:bg-primary/90 transition-colors",
308
428
  children: "Subscribe"
309
- }), /* @__PURE__ */ f("button", {
429
+ }), /* @__PURE__ */ g("button", {
310
430
  type: "button",
311
431
  onClick: t,
312
432
  className: "px-3 py-1.5 text-sm font-medium border border-border text-foreground rounded-md hover:bg-muted transition-colors",
@@ -317,6 +437,6 @@ var g = () => {
317
437
  });
318
438
  };
319
439
  //#endregion
320
- export { g as PlansBrowsePage };
440
+ export { x as PlansBrowsePage };
321
441
 
322
442
  //# sourceMappingURL=PlansBrowsePage.js.map