@nextblock-cms/ecom 0.0.10 → 0.8.0

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 (147) hide show
  1. package/actions.d.ts +2 -0
  2. package/currency-rest-client-CwoqdgAP.js +23 -0
  3. package/currency-rest-client-uolJxUkL.cjs +1 -0
  4. package/index.cjs.js +1 -0
  5. package/index.d.ts +35 -0
  6. package/index.es.js +3226 -0
  7. package/invoice-ui-BJZfedDd.cjs +332 -0
  8. package/invoice-ui-GJ1ADAjn.js +5759 -0
  9. package/lib/CurrencyProvider.d.ts +18 -0
  10. package/lib/cart-store.d.ts +47 -0
  11. package/lib/components/AccountNavigationMenu.d.ts +14 -0
  12. package/lib/components/AddToCartButton.d.ts +8 -0
  13. package/lib/components/Cart.d.ts +1 -0
  14. package/lib/components/CartDrawer.d.ts +1 -0
  15. package/lib/components/CartIcon.d.ts +1 -0
  16. package/lib/components/Checkout.d.ts +6 -0
  17. package/lib/components/CouponForm.d.ts +8 -0
  18. package/lib/components/CurrencySwitcher.d.ts +1 -0
  19. package/lib/components/CustomerProfileForm.d.ts +21 -0
  20. package/lib/components/FeaturedProduct.d.ts +8 -0
  21. package/lib/components/InvoiceDocument.d.ts +32 -0
  22. package/lib/components/InvoiceViewerShell.d.ts +26 -0
  23. package/lib/components/ProductCard.d.ts +7 -0
  24. package/lib/components/ProductDetailsLayout.d.ts +7 -0
  25. package/lib/components/ProductGallery.d.ts +9 -0
  26. package/lib/components/ProductGrid.d.ts +8 -0
  27. package/lib/components/ShippingEstimator.d.ts +5 -0
  28. package/lib/components/SimpleTiptapRenderer.d.ts +7 -0
  29. package/lib/components/SubscriptionSelector.d.ts +7 -0
  30. package/lib/components/media/MediaImage.d.ts +12 -0
  31. package/lib/components/media/MediaPickerDialog.d.ts +16 -0
  32. package/lib/components/media/MediaUploadForm.d.ts +10 -0
  33. package/lib/components/media/UploadFolderContext.d.ts +10 -0
  34. package/lib/countries.d.ts +5 -0
  35. package/lib/coupon-server.d.ts +22 -0
  36. package/lib/coupon-server.test.d.ts +1 -0
  37. package/lib/coupons.d.ts +41 -0
  38. package/lib/currency-constants.d.ts +1 -0
  39. package/lib/currency-rest-client.d.ts +1 -0
  40. package/lib/currency-sale-schedule.test.d.ts +1 -0
  41. package/lib/currency-store.d.ts +20 -0
  42. package/lib/currency-sync.d.ts +19 -0
  43. package/lib/currency.d.ts +116 -0
  44. package/lib/customer-addresses.d.ts +19 -0
  45. package/lib/customer-orders.d.ts +23 -0
  46. package/lib/customer.d.ts +51 -0
  47. package/lib/export-helpers.d.ts +48 -0
  48. package/lib/factory.d.ts +2 -0
  49. package/lib/freemius-coupons.d.ts +58 -0
  50. package/lib/freemius-order-sync.d.ts +133 -0
  51. package/lib/freemius-order-sync.test.d.ts +1 -0
  52. package/lib/inventory-settings.d.ts +16 -0
  53. package/lib/invoice-server.d.ts +18 -0
  54. package/lib/invoice-ui.d.ts +29 -0
  55. package/lib/invoice.d.ts +75 -0
  56. package/lib/order-inventory.d.ts +7 -0
  57. package/lib/order-tax-details.d.ts +57 -0
  58. package/lib/pages/cms/coupons/CouponEditorForm.d.ts +23 -0
  59. package/lib/pages/cms/coupons/CouponsPage.d.ts +8 -0
  60. package/lib/pages/cms/coupons/CreateCouponDialog.d.ts +6 -0
  61. package/lib/pages/cms/coupons/EditCouponPage.d.ts +5 -0
  62. package/lib/pages/cms/coupons/ProductScopePicker.d.ts +16 -0
  63. package/lib/pages/cms/coupons/actions.d.ts +5 -0
  64. package/lib/pages/cms/coupons/index.d.ts +2 -0
  65. package/lib/pages/cms/coupons/product-options.d.ts +2 -0
  66. package/lib/pages/cms/orders/ExportReportsDialog.d.ts +2 -0
  67. package/lib/pages/cms/orders/MarkPaidButton.d.ts +3 -0
  68. package/lib/pages/cms/orders/OrderDetailPage.d.ts +5 -0
  69. package/lib/pages/cms/orders/OrderPrintButton.d.ts +3 -0
  70. package/lib/pages/cms/orders/OrderStatusForm.d.ts +4 -0
  71. package/lib/pages/cms/orders/OrdersPage.d.ts +6 -0
  72. package/lib/pages/cms/orders/actions.d.ts +7 -0
  73. package/lib/pages/cms/orders/export-actions.d.ts +2 -0
  74. package/lib/pages/cms/orders/index.d.ts +6 -0
  75. package/lib/pages/cms/orders/server-actions.d.ts +11 -0
  76. package/lib/pages/cms/orders/types.d.ts +60 -0
  77. package/lib/pages/cms/payments/PaymentsClient.d.ts +19 -0
  78. package/lib/pages/cms/payments/PaymentsPage.d.ts +1 -0
  79. package/lib/pages/cms/payments/actions.d.ts +4 -0
  80. package/lib/pages/cms/payments/index.d.ts +2 -0
  81. package/lib/pages/cms/payments/queries.d.ts +12 -0
  82. package/lib/pages/cms/products/ProductsPage.d.ts +7 -0
  83. package/lib/pages/cms/products/[id]/edit/EditProductPage.d.ts +12 -0
  84. package/lib/pages/cms/products/actions.d.ts +18201 -0
  85. package/lib/pages/cms/products/attributes/AttributeManagementPage.d.ts +1 -0
  86. package/lib/pages/cms/products/attributes/components/AttributeManager.d.ts +50 -0
  87. package/lib/pages/cms/products/categories/CategoryManagementPage.d.ts +1 -0
  88. package/lib/pages/cms/products/categories/components/CategoryManager.d.ts +47 -0
  89. package/lib/pages/cms/products/components/CopyProductFromLanguage.d.ts +9 -0
  90. package/lib/pages/cms/products/components/CurrencyPriceFields.d.ts +18 -0
  91. package/lib/pages/cms/products/components/DeleteProductButton.d.ts +9 -0
  92. package/lib/pages/cms/products/components/FreemiusPricingDashboard.d.ts +24 -0
  93. package/lib/pages/cms/products/components/ProductCategorySelector.d.ts +14 -0
  94. package/lib/pages/cms/products/components/ProductForm.d.ts +62 -0
  95. package/lib/pages/cms/products/components/ProductMediaManager.d.ts +17 -0
  96. package/lib/pages/cms/products/components/ProductsBulkTable.d.ts +32 -0
  97. package/lib/pages/cms/products/components/SaleScheduleFields.d.ts +16 -0
  98. package/lib/pages/cms/products/components/SyncFreemiusButton.d.ts +3 -0
  99. package/lib/pages/cms/products/components/SyncFreemiusPricingButton.d.ts +5 -0
  100. package/lib/pages/cms/products/components/SyncProductForm.d.ts +1 -0
  101. package/lib/pages/cms/products/components/VariationsEditor.d.ts +26 -0
  102. package/lib/pages/cms/products/index.d.ts +7 -0
  103. package/lib/pages/cms/products/inventory/InventoryPage.d.ts +1 -0
  104. package/lib/pages/cms/products/inventory/InventoryTableClient.d.ts +6 -0
  105. package/lib/pages/cms/products/inventory/actions.d.ts +38 -0
  106. package/lib/pages/cms/products/new/NewProductPage.d.ts +9 -0
  107. package/lib/pages/cms/products/product-price-sync.d.ts +43 -0
  108. package/lib/pages/cms/products/server-actions.d.ts +125 -0
  109. package/lib/pages/cms/shipping/ShippingPage.d.ts +6 -0
  110. package/lib/pages/cms/shipping/components/RateForm.d.ts +26 -0
  111. package/lib/pages/cms/shipping/components/ZoneForm.d.ts +13 -0
  112. package/lib/pages/cms/shipping/index.d.ts +2 -0
  113. package/lib/pages/cms/shipping/server-actions.d.ts +80 -0
  114. package/lib/pages/cms/taxes/TaxesPage.d.ts +5 -0
  115. package/lib/pages/cms/taxes/actions.d.ts +3 -0
  116. package/lib/pages/cms/taxes/components/TaxRateForm.d.ts +8 -0
  117. package/lib/pages/cms/taxes/index.d.ts +2 -0
  118. package/lib/product-actions.d.ts +18457 -0
  119. package/lib/product-context.d.ts +7 -0
  120. package/lib/product-schema.d.ts +73 -0
  121. package/lib/providers/freemius.d.ts +49 -0
  122. package/lib/providers/stripe.d.ts +13 -0
  123. package/lib/server-actions/coupon-actions.d.ts +17 -0
  124. package/lib/server-actions/customer-actions.d.ts +18 -0
  125. package/lib/server-actions/product-actions.d.ts +69 -0
  126. package/lib/server-actions/shipping-actions.d.ts +10 -0
  127. package/lib/server-actions/tax-actions.d.ts +7 -0
  128. package/lib/shared-inventory.d.ts +38 -0
  129. package/lib/shipping/resolver.d.ts +16 -0
  130. package/lib/shipping-rate-currency.d.ts +39 -0
  131. package/lib/states.d.ts +9 -0
  132. package/lib/stripe/checkout.d.ts +6 -0
  133. package/lib/stripe/client.d.ts +2 -0
  134. package/lib/stripe/order-sync.d.ts +18 -0
  135. package/lib/stripe/webhooks.d.ts +4 -0
  136. package/lib/tax-calculation.d.ts +23 -0
  137. package/lib/trials.d.ts +15 -0
  138. package/lib/types.d.ts +245 -0
  139. package/lib/use-cart.d.ts +11 -0
  140. package/lib/variation-utils.d.ts +72 -0
  141. package/lib/zod-config.d.ts +2 -0
  142. package/package.json +47 -2
  143. package/server.cjs.js +110 -0
  144. package/server.d.ts +31 -0
  145. package/server.es.js +6039 -0
  146. package/index.ts +0 -12
  147. package/tsconfig.lib.json +0 -10
package/index.es.js ADDED
@@ -0,0 +1,3226 @@
1
+ import { jsx as e, jsxs as r, Fragment as ot } from "react/jsx-runtime";
2
+ import { Sheet as Fr, SheetContent as Tr, SheetHeader as Rr, SheetTitle as $r, SheetDescription as Lr } from "@nextblock-cms/ui/sheet";
3
+ import { Badge as ie } from "@nextblock-cms/ui/badge";
4
+ import { Button as D } from "@nextblock-cms/ui/button";
5
+ import { useRouter as zt, usePathname as Ir } from "next/navigation";
6
+ import { Tag as jr, X as Mt, Minus as Ut, Plus as Vt, Trash2 as Dt, Truck as vt, Loader2 as Ve, Calculator as Or, FlaskConical as qr, CreditCard as zr, ChevronRight as Mr, Package as Bt, Download as Ht, MapPin as Ur, ShoppingBag as Nt, ShoppingCart as nt, KeyRound as Vr, Package2 as Dr, User as Ct, Upload as Br, Github as Ze, Phone as Hr, Globe as Kr, Mail as Gr, ShieldCheck as Jr } from "D:/Websites/nextblock-sandbox/node_modules/lucide-react/dist/esm/lucide-react.js";
7
+ import { create as Kt } from "D:/Websites/nextblock-sandbox/node_modules/zustand/esm/index.mjs";
8
+ import { persist as Gt, createJSONStorage as Jt } from "D:/Websites/nextblock-sandbox/node_modules/zustand/esm/middleware.mjs";
9
+ import { C as Wr, g as Wt, s as Qr, n as Xr, i as Yr, a as Y, r as ke, b as Qt, c as wt, d as dt, e as Zr, f as es, h as Be, j as Ke, k as ut, l as ts, m as rs, o as ss, p as lt, q as Xt, t as Ne, u as kt, v as Yt, w as as, x as Zt, y as St, z as er, A as ns, B as je, D as ls, E as Pt, F as At, G as cs, H as is } from "./invoice-ui-GJ1ADAjn.js";
10
+ import { I as Aa, J as Ea, K as Fa, L as Ta, M as Ra, N as $a, P as La, O as Ia, Q as ja, R as Oa, S as qa, T as za, U as Ma, V as Ua, W as Va, X as Da, Y as Ba, Z as Ha, _ as Ka, $ as Ga, a0 as Ja, a1 as Wa, a2 as Qa, a3 as Xa, a4 as Ya, a5 as Za, a6 as en, a7 as tn, a8 as rn, a9 as sn, aa as an, ab as nn, ac as ln, ad as cn, ae as on, af as dn, ag as un, ah as mn, ai as pn, aj as hn, ak as fn, al as gn, am as _n, an as yn, ao as bn, ap as xn, aq as vn, ar as Nn } from "./invoice-ui-GJ1ADAjn.js";
11
+ import we, { createContext as tr, useState as k, useEffect as G, useMemo as H, useContext as rr, useRef as os, useCallback as et } from "react";
12
+ import { normalizeCurrencyCode as Fe, useTranslations as Z, formatPrice as w, majorUnitAmountToMinor as me, cn as oe } from "@nextblock-cms/utils";
13
+ import { Input as U } from "@nextblock-cms/ui/input";
14
+ import { Label as A } from "@nextblock-cms/ui/label";
15
+ import { getServiceRoleSupabaseClient as sr, createClient as ar } from "@nextblock-cms/db/server";
16
+ import { Table as ds, TableHeader as us, TableRow as Et, TableHead as Ae, TableBody as ms, TableCell as Ee } from "@nextblock-cms/ui/table";
17
+ import { Card as ye, CardHeader as be, CardTitle as xe, CardContent as ve, CardFooter as ps } from "@nextblock-cms/ui/card";
18
+ import { Checkbox as nr } from "@nextblock-cms/ui/checkbox";
19
+ import { Separator as mt } from "@nextblock-cms/ui/separator";
20
+ import { RadioGroup as hs, RadioGroupItem as Ft } from "@nextblock-cms/ui/radio-group";
21
+ import { Checkout as fs } from "D:/Websites/nextblock-sandbox/node_modules/@freemius/checkout/lib/module/checkout.js";
22
+ import { Select as lr, SelectTrigger as cr, SelectValue as ir, SelectContent as or, SelectItem as De } from "@nextblock-cms/ui/select";
23
+ import { toast as He } from "D:/Websites/nextblock-sandbox/node_modules/sonner/dist/index.mjs";
24
+ import Se from "next/link";
25
+ import { useForm as gs } from "react-hook-form";
26
+ import { Avatar as _s, AvatarImage as ys, AvatarFallback as bs } from "@nextblock-cms/ui/avatar";
27
+ import { revalidatePath as Tt } from "next/cache";
28
+ import { createClient as Rt } from "@nextblock-cms/db";
29
+ import { Skeleton as $t } from "@nextblock-cms/ui/Skeleton";
30
+ const Oe = Kt()(
31
+ Gt(
32
+ (t) => ({
33
+ activeCurrencyCode: null,
34
+ hasHydrated: !1,
35
+ setActiveCurrencyCode: (n) => t({ activeCurrencyCode: Fe(n) }),
36
+ setHasHydrated: (n) => t({ hasHydrated: n })
37
+ }),
38
+ {
39
+ name: "currency-preference-storage",
40
+ storage: Jt(() => localStorage),
41
+ skipHydration: !0,
42
+ partialize: (t) => ({
43
+ activeCurrencyCode: t.activeCurrencyCode
44
+ }),
45
+ onRehydrateStorage: () => (t) => {
46
+ t?.setHasHydrated(!0);
47
+ }
48
+ }
49
+ )
50
+ ), dr = tr(null);
51
+ function tt(t) {
52
+ return Qr(
53
+ t.filter((n) => n.is_active !== !1)
54
+ );
55
+ }
56
+ function xs(t) {
57
+ const { currencies: n, storedCurrencyCode: s, hasHydrated: a, initialCurrencyCode: l, locale: c } = t, o = new Set(
58
+ n.map((p) => Fe(p.code))
59
+ ), m = Wt(n), _ = l ? Fe(l) : null, y = s ? Fe(s) : null;
60
+ if (a && y && o.has(y))
61
+ return y;
62
+ if (_ && o.has(_))
63
+ return _;
64
+ const h = Yr(c, n);
65
+ return o.has(h) ? h : m.code;
66
+ }
67
+ function ha({
68
+ children: t,
69
+ initialCurrencies: n,
70
+ initialCurrencyCode: s,
71
+ locale: a
72
+ }) {
73
+ const [l, c] = k(
74
+ () => tt(n)
75
+ ), o = Oe(
76
+ (b) => b.activeCurrencyCode
77
+ ), m = Oe((b) => b.hasHydrated), _ = Oe(
78
+ (b) => b.setActiveCurrencyCode
79
+ );
80
+ G(() => {
81
+ Oe.persist.rehydrate();
82
+ }, []), G(() => {
83
+ n.length > 0 && c(tt(n));
84
+ }, [n]), G(() => {
85
+ if (n.length > 0)
86
+ return;
87
+ async function b() {
88
+ const { fetchActiveCurrenciesFromRest: d } = await import("./currency-rest-client-CwoqdgAP.js"), E = await d();
89
+ E.length > 0 && c(
90
+ tt(E.map((v) => Xr(v)))
91
+ );
92
+ }
93
+ b();
94
+ }, [n.length]);
95
+ const y = H(
96
+ () => xs({
97
+ currencies: l,
98
+ storedCurrencyCode: o,
99
+ hasHydrated: m,
100
+ initialCurrencyCode: s,
101
+ locale: a
102
+ }),
103
+ [l, o, m, s, a]
104
+ );
105
+ G(() => {
106
+ y && o !== y && _(y);
107
+ }, [y, _, o]), G(() => {
108
+ !y || typeof document > "u" || (document.cookie = `${Wr}=${y}; Path=/; Max-Age=31536000; SameSite=Lax`);
109
+ }, [y]);
110
+ const h = H(
111
+ () => Wt(l),
112
+ [l]
113
+ ), p = H(
114
+ () => l.find((b) => b.code === y) ?? h,
115
+ [l, h, y]
116
+ ), f = H(
117
+ () => ({
118
+ currencies: l,
119
+ defaultCurrency: h,
120
+ activeCurrency: p,
121
+ activeCurrencyCode: p.code,
122
+ isHydrated: m,
123
+ setActiveCurrencyCode: (b) => {
124
+ const d = Fe(b);
125
+ l.some((v) => v.code === d) && _(d);
126
+ }
127
+ }),
128
+ [p, l, h, m, _]
129
+ );
130
+ return /* @__PURE__ */ e(dr.Provider, { value: f, children: t });
131
+ }
132
+ function le() {
133
+ const t = rr(dr);
134
+ if (!t)
135
+ throw new Error("useCurrency must be used inside a CurrencyProvider");
136
+ return t;
137
+ }
138
+ function rt(t, n, s) {
139
+ return t.reduce((a, l) => Y(l) || l.sku !== n || s && l.id === s ? a : a + l.quantity, 0);
140
+ }
141
+ const Te = Kt()(
142
+ Gt(
143
+ (t, n) => ({
144
+ items: [],
145
+ appliedCoupon: null,
146
+ isOpen: !1,
147
+ addItem: (s) => {
148
+ const { items: a } = n(), l = s.quantity ?? 1, c = typeof s.stock == "number" ? s.stock : null, o = c !== null ? rt(a, s.sku) : 0;
149
+ if (Y(s))
150
+ return a.find(
151
+ (y) => y.product_id === s.product_id && Y(y)
152
+ ) ? {
153
+ success: !1,
154
+ error: "This software license is already in your cart."
155
+ } : (t({
156
+ items: [...a, { ...s, quantity: 1 }],
157
+ isOpen: !0
158
+ }), { success: !0 });
159
+ const m = a.find((_) => _.id === s.id);
160
+ return c !== null && c <= 0 ? {
161
+ success: !1,
162
+ error: "This item is out of stock."
163
+ } : c !== null && o + l > c ? {
164
+ success: !1,
165
+ error: `Only ${c} available for this SKU.`
166
+ } : (t(m ? {
167
+ items: a.map(
168
+ (_) => _.id === s.id ? {
169
+ ..._,
170
+ ...s,
171
+ quantity: _.quantity + l
172
+ } : _
173
+ ),
174
+ isOpen: !0
175
+ } : {
176
+ items: [...a, { ...s, quantity: l }],
177
+ isOpen: !0
178
+ }), { success: !0 });
179
+ },
180
+ removeItem: (s) => {
181
+ const { items: a } = n();
182
+ t({
183
+ items: a.filter((l) => l.id !== s)
184
+ });
185
+ },
186
+ updateQuantity: (s, a) => {
187
+ const { items: l } = n(), c = l.find((o) => o.id === s);
188
+ c && Y(c) || (c && typeof c.stock == "number" && a + rt(l, c.sku, s) > c.stock && (a = Math.max(
189
+ c.stock - rt(l, c.sku, s),
190
+ 0
191
+ )), a <= 0 ? t({
192
+ items: l.filter((o) => o.id !== s)
193
+ }) : t({
194
+ items: l.map(
195
+ (o) => o.id === s ? { ...o, quantity: a } : o
196
+ )
197
+ }));
198
+ },
199
+ setAppliedCoupon: (s) => {
200
+ const a = n().appliedCoupon;
201
+ a?.code === s?.code && a?.couponId === s?.couponId || t({ appliedCoupon: s });
202
+ },
203
+ removeCoupon: () => {
204
+ n().appliedCoupon && t({ appliedCoupon: null });
205
+ },
206
+ clearCart: () => t({ items: [], appliedCoupon: null }),
207
+ toggleCart: () => t((s) => ({ isOpen: !s.isOpen })),
208
+ setIsOpen: (s) => t({ isOpen: s }),
209
+ setItems: (s) => t({ items: s })
210
+ }),
211
+ {
212
+ name: "cart-storage",
213
+ storage: Jt(() => localStorage),
214
+ skipHydration: !0
215
+ }
216
+ )
217
+ ), vs = () => Te((n) => n.items).reduce((n, s) => n + s.quantity, 0);
218
+ function Ce(t, n) {
219
+ return ke({
220
+ prices: t.prices,
221
+ salePrices: t.sale_prices,
222
+ fallbackPrice: t.price,
223
+ fallbackSalePrice: t.sale_price,
224
+ saleStartAt: t.sale_start_at,
225
+ saleEndAt: t.sale_end_at,
226
+ scheduledPrice: t.scheduled_price,
227
+ scheduledPrices: t.scheduled_prices,
228
+ scheduledPriceAt: t.scheduled_price_at,
229
+ currencyCode: n.currencyCode,
230
+ currencies: n.currencies
231
+ });
232
+ }
233
+ const ur = () => {
234
+ const t = Te((a) => a.items), { activeCurrencyCode: n, currencies: s } = le();
235
+ return t.reduce((a, l) => {
236
+ const { price: c, sale_price: o } = Ce(l, {
237
+ currencyCode: n,
238
+ currencies: s
239
+ });
240
+ return a + (o ?? c) * l.quantity;
241
+ }, 0);
242
+ };
243
+ let qe = null;
244
+ function Ge() {
245
+ return Te.persist;
246
+ }
247
+ function ct() {
248
+ return Ge()?.hasHydrated?.() ?? !1;
249
+ }
250
+ function mr() {
251
+ if (typeof window > "u")
252
+ return Promise.resolve();
253
+ const t = Ge();
254
+ return !t || t.hasHydrated() ? Promise.resolve() : (qe || (qe = Promise.resolve().then(() => t.rehydrate()).finally(() => {
255
+ qe = null;
256
+ })), qe);
257
+ }
258
+ const ue = (t) => {
259
+ const n = Te(t), [s, a] = k(!1);
260
+ return G(() => {
261
+ const l = Ge();
262
+ if (ct()) {
263
+ a(!0);
264
+ return;
265
+ }
266
+ const c = l?.onFinishHydration(() => a(!0));
267
+ return mr(), () => {
268
+ c?.();
269
+ };
270
+ }, []), s ? n : void 0;
271
+ }, fa = () => {
272
+ const [t, n] = k(!1);
273
+ return G(() => {
274
+ const a = Ge()?.onFinishHydration(() => n(!0));
275
+ return n(ct()), ct() || mr(), () => {
276
+ a?.();
277
+ };
278
+ }, []), t;
279
+ };
280
+ function it(t) {
281
+ const n = Number(t?.trial_period_days ?? 0);
282
+ return !Number.isFinite(n) || n <= 0 ? 0 : Math.round(n);
283
+ }
284
+ function Ns(t) {
285
+ return it(t) === 0 ? null : t?.trial_requires_payment_method ? "paid" : "free";
286
+ }
287
+ function Cs(t) {
288
+ const n = it(typeof t == "number" ? { trial_period_days: t } : t);
289
+ return n > 0 ? `${n}-day free trial` : null;
290
+ }
291
+ function ws(t) {
292
+ return t?.trial_requires_payment_method ? "Payment method required" : "No credit card required";
293
+ }
294
+ function pe(t) {
295
+ const n = Cs(t);
296
+ return n ? {
297
+ label: n,
298
+ paymentRequirementLabel: ws(t),
299
+ checkoutMode: Ns(t)
300
+ } : null;
301
+ }
302
+ async function ks(t) {
303
+ try {
304
+ const n = sr();
305
+ return await Qt({
306
+ client: n,
307
+ code: t.code,
308
+ items: Array.isArray(t.items) ? t.items : [],
309
+ currencyCode: t.currencyCode
310
+ });
311
+ } catch (n) {
312
+ return console.error("Failed to validate coupon:", n), {
313
+ success: !1,
314
+ error: n.message || "Failed to validate coupon.",
315
+ errorKey: "ecommerce.coupon_validation_failed"
316
+ };
317
+ }
318
+ }
319
+ function pt({
320
+ items: t,
321
+ currencyCode: n,
322
+ onQuoteChange: s,
323
+ compact: a = !1
324
+ }) {
325
+ const l = ue((i) => i.appliedCoupon), c = ue((i) => i.setAppliedCoupon), o = ue((i) => i.removeCoupon), { t: m } = Z(), [_, y] = k(""), [h, p] = k(null), [f, b] = k(""), [d, E] = k(!1), v = os(null), F = H(
326
+ () => t.map((i) => `${i.product_id}:${i.variant_id || "base"}:${i.quantity}`).sort().join("|"),
327
+ [t]
328
+ ), j = et((i, $) => {
329
+ const q = m(i);
330
+ return q === i ? $ : q;
331
+ }, [m]), R = et(
332
+ (i) => `${wt(i)}:${n}:${F}`,
333
+ [F, n]
334
+ ), L = et(async (i, $) => {
335
+ const q = wt(i);
336
+ if (!q) {
337
+ b(j("ecommerce.coupon_code_required", "Enter a coupon code."));
338
+ return;
339
+ }
340
+ E(!0), b("");
341
+ try {
342
+ const P = await ks({
343
+ code: q,
344
+ items: t,
345
+ currencyCode: n
346
+ });
347
+ if (!P.success) {
348
+ p(null), s?.(null), o?.(), b(P.errorKey ? j(P.errorKey, P.error) : P.error);
349
+ return;
350
+ }
351
+ v.current = R(P.quote.code), p(P.quote), s?.(P.quote), $?.silent || (c?.({
352
+ code: P.quote.code,
353
+ couponId: P.quote.couponId
354
+ }), y("")), $?.silent || b("");
355
+ } catch (P) {
356
+ console.error("Failed to validate coupon:", P), p(null), s?.(null), b(
357
+ j("ecommerce.coupon_validation_failed", "Failed to validate coupon.")
358
+ );
359
+ } finally {
360
+ E(!1);
361
+ }
362
+ }, [
363
+ o,
364
+ n,
365
+ R,
366
+ t,
367
+ s,
368
+ c,
369
+ j
370
+ ]);
371
+ if (G(() => {
372
+ if (!c || !o)
373
+ return;
374
+ if (!l || t.length === 0) {
375
+ v.current = null, p(null), s?.(null);
376
+ return;
377
+ }
378
+ const i = R(l.code);
379
+ v.current !== i && (v.current = i, L(l.code, { silent: !0 }));
380
+ }, [
381
+ l?.code,
382
+ L,
383
+ o,
384
+ R,
385
+ t.length,
386
+ s,
387
+ c
388
+ ]), !c || !o)
389
+ return null;
390
+ const S = () => {
391
+ o(), p(null), s?.(null), b("");
392
+ };
393
+ return /* @__PURE__ */ r("div", { className: a ? "space-y-2" : "rounded-lg border bg-muted/10 p-4 space-y-3", children: [
394
+ /* @__PURE__ */ r("div", { className: "flex items-center justify-between gap-3", children: [
395
+ /* @__PURE__ */ r(A, { htmlFor: a ? "coupon-code-compact" : "coupon-code", className: "flex items-center gap-2 text-sm font-medium", children: [
396
+ /* @__PURE__ */ e(jr, { className: "h-4 w-4" }),
397
+ j("ecommerce.coupon", "Coupon")
398
+ ] }),
399
+ h ? /* @__PURE__ */ r(ie, { variant: "secondary", className: "gap-1", children: [
400
+ h.code,
401
+ /* @__PURE__ */ e("button", { type: "button", onClick: S, "aria-label": `Remove coupon ${h.code}`, children: /* @__PURE__ */ e(Mt, { className: "h-3 w-3" }) })
402
+ ] }) : null
403
+ ] }),
404
+ h ? /* @__PURE__ */ r("div", { className: "flex items-center justify-between text-sm", children: [
405
+ /* @__PURE__ */ e("span", { className: "text-muted-foreground", children: h.name }),
406
+ /* @__PURE__ */ r("span", { className: "font-medium text-emerald-600", children: [
407
+ "-",
408
+ w(h.discountTotal, n)
409
+ ] })
410
+ ] }) : /* @__PURE__ */ r("div", { className: "flex gap-2", children: [
411
+ /* @__PURE__ */ e(
412
+ U,
413
+ {
414
+ id: a ? "coupon-code-compact" : "coupon-code",
415
+ value: _,
416
+ onChange: (i) => y(i.target.value.toUpperCase()),
417
+ placeholder: j("ecommerce.coupon_placeholder", "Code"),
418
+ className: "uppercase",
419
+ onKeyDown: (i) => {
420
+ i.key === "Enter" && (i.preventDefault(), L(_));
421
+ }
422
+ }
423
+ ),
424
+ /* @__PURE__ */ e(
425
+ D,
426
+ {
427
+ type: "button",
428
+ variant: "outline",
429
+ disabled: d || t.length === 0,
430
+ onClick: () => {
431
+ L(_);
432
+ },
433
+ children: d ? j("ecommerce.applying", "Applying...") : j("ecommerce.apply", "Apply")
434
+ }
435
+ )
436
+ ] }),
437
+ f ? /* @__PURE__ */ e("p", { className: "text-xs text-destructive", children: f }) : null
438
+ ] });
439
+ }
440
+ const ga = () => {
441
+ const t = zt(), n = ue((d) => d), s = ur(), { t: a } = Z(), { activeCurrencyCode: l, currencies: c } = le();
442
+ if (!n) return null;
443
+ const { isOpen: o, setIsOpen: m, items: _, updateQuantity: y, removeItem: h } = n, p = (d) => _.reduce((E, v) => Y(v) || v.sku !== d ? E : E + v.quantity, 0), f = () => {
444
+ m(!1), t.push("/cart");
445
+ }, b = () => {
446
+ m(!1), t.push("/checkout");
447
+ };
448
+ return /* @__PURE__ */ e(Fr, { open: o, onOpenChange: m, children: /* @__PURE__ */ r(Tr, { className: "flex w-full flex-col pr-0 sm:max-w-lg", children: [
449
+ /* @__PURE__ */ r(Rr, { className: "px-1 text-left", children: [
450
+ /* @__PURE__ */ r($r, { children: [
451
+ a("ecommerce.shopping_cart"),
452
+ " (",
453
+ _.length,
454
+ ")"
455
+ ] }),
456
+ /* @__PURE__ */ e(Lr, { className: "sr-only", children: a("ecommerce.shopping_cart") })
457
+ ] }),
458
+ _.length > 0 ? /* @__PURE__ */ e("div", { className: "flex flex-1 flex-col gap-5 overflow-y-auto p-1 pr-6 pt-4", children: _.map((d) => {
459
+ const E = p(d.sku);
460
+ return /* @__PURE__ */ e("div", { className: "flex gap-4", children: (() => {
461
+ const v = Ce(d, {
462
+ currencyCode: l,
463
+ currencies: c
464
+ }), F = pe(d);
465
+ return /* @__PURE__ */ r(ot, { children: [
466
+ d.image_url ? /* @__PURE__ */ e("div", { className: "relative aspect-square h-20 w-20 min-w-fit overflow-hidden rounded border bg-neutral-100", children: /* @__PURE__ */ e(
467
+ "img",
468
+ {
469
+ src: d.image_url,
470
+ alt: d.title,
471
+ className: "h-full w-full object-cover"
472
+ }
473
+ ) }) : /* @__PURE__ */ e("div", { className: "flex h-20 w-20 items-center justify-center rounded bg-secondary", children: /* @__PURE__ */ e("span", { className: "text-xs text-muted-foreground", children: a("ecommerce.no_image") }) }),
474
+ /* @__PURE__ */ r("div", { className: "flex flex-1 flex-col justify-between", children: [
475
+ /* @__PURE__ */ r("div", { className: "flex justify-between gap-2", children: [
476
+ /* @__PURE__ */ r("div", { children: [
477
+ /* @__PURE__ */ e("span", { className: "line-clamp-2 text-sm font-medium leading-tight", children: d.title }),
478
+ d.variant_label && /* @__PURE__ */ e("div", { className: "mt-1 text-xs text-muted-foreground", children: d.variant_label }),
479
+ F && /* @__PURE__ */ r("div", { className: "mt-1 text-xs font-medium text-emerald-700", children: [
480
+ F.label,
481
+ " - ",
482
+ F.paymentRequirementLabel
483
+ ] })
484
+ ] }),
485
+ /* @__PURE__ */ r("span", { className: "text-sm font-semibold", children: [
486
+ v.sale_price && /* @__PURE__ */ e("span", { className: "mr-1.5 text-xs font-normal text-muted-foreground line-through", children: w(v.price, l) }),
487
+ w(v.sale_price ?? v.price, l)
488
+ ] })
489
+ ] }),
490
+ /* @__PURE__ */ r("div", { className: "flex items-center justify-between text-sm", children: [
491
+ Y(d) ? /* @__PURE__ */ e(ie, { variant: "secondary", className: "font-normal text-xs", children: "1 (License)" }) : /* @__PURE__ */ r("div", { className: "flex items-center rounded-md border text-xs", children: [
492
+ /* @__PURE__ */ e(
493
+ "button",
494
+ {
495
+ onClick: () => y(d.id, d.quantity - 1),
496
+ className: "flex h-7 w-7 items-center justify-center border-r",
497
+ type: "button",
498
+ children: /* @__PURE__ */ e(Ut, { className: "h-3 w-3" })
499
+ }
500
+ ),
501
+ /* @__PURE__ */ e("span", { className: "flex h-7 w-8 items-center justify-center", children: d.quantity }),
502
+ /* @__PURE__ */ e(
503
+ "button",
504
+ {
505
+ onClick: () => y(d.id, d.quantity + 1),
506
+ className: "flex h-7 w-7 items-center justify-center border-l",
507
+ type: "button",
508
+ disabled: typeof d.stock == "number" && E >= d.stock,
509
+ children: /* @__PURE__ */ e(Vt, { className: "h-3 w-3" })
510
+ }
511
+ )
512
+ ] }),
513
+ /* @__PURE__ */ e(
514
+ "button",
515
+ {
516
+ onClick: () => h(d.id),
517
+ className: "text-muted-foreground hover:text-destructive",
518
+ type: "button",
519
+ children: /* @__PURE__ */ e(Dt, { className: "h-4 w-4" })
520
+ }
521
+ )
522
+ ] })
523
+ ] })
524
+ ] });
525
+ })() }, d.id);
526
+ }) }) : /* @__PURE__ */ r("div", { className: "flex h-full flex-col items-center justify-center space-y-2", children: [
527
+ /* @__PURE__ */ e("span", { className: "text-muted-foreground", children: a("ecommerce.cart_empty") }),
528
+ /* @__PURE__ */ e(D, { variant: "outline", onClick: () => m(!1), children: a("ecommerce.continue_shopping") })
529
+ ] }),
530
+ _.length > 0 && /* @__PURE__ */ r("div", { className: "border-t pr-6 pt-4", children: [
531
+ /* @__PURE__ */ r("div", { className: "flex items-center justify-between text-base font-medium", children: [
532
+ /* @__PURE__ */ e("span", { children: a("ecommerce.subtotal") }),
533
+ /* @__PURE__ */ e("span", { children: w(s, l) })
534
+ ] }),
535
+ /* @__PURE__ */ e("p", { className: "mb-4 mt-1 text-xs text-muted-foreground", children: a("ecommerce.shipping_taxes_calculated") }),
536
+ /* @__PURE__ */ e("div", { className: "mb-4", children: /* @__PURE__ */ e(pt, { items: _, currencyCode: l, compact: !0 }) }),
537
+ /* @__PURE__ */ e(D, { variant: "outline", className: "w-full mb-3", onClick: f, children: a("ecommerce.view_full_cart") }),
538
+ /* @__PURE__ */ e(D, { className: "w-full", onClick: b, children: a("ecommerce.ready_to_checkout") })
539
+ ] })
540
+ ] }) });
541
+ };
542
+ async function pr(t, n, s, a) {
543
+ try {
544
+ const l = dt(n.country);
545
+ return l ? { success: !0, methods: await Zr(t, {
546
+ ...n,
547
+ country: l,
548
+ state: es(l, n.state) || void 0
549
+ }, s, a) } : {
550
+ success: !1,
551
+ error: "Country is required for shipping calculation",
552
+ errorKey: "ecommerce.shipping_country_required"
553
+ };
554
+ } catch (l) {
555
+ return console.error("Failed to resolve shipping options:", l), {
556
+ success: !1,
557
+ error: l.message || "Failed to calculate shipping",
558
+ errorKey: "ecommerce.shipping_calculation_failed"
559
+ };
560
+ }
561
+ }
562
+ const Ss = ({ physicalSubtotal: t }) => {
563
+ const [n, s] = k("CA"), [a, l] = k(""), [c, o] = k(""), [m, _] = k(!1), [y, h] = k(null), [p, f] = k(null), { t: b, lang: d } = Z(), { activeCurrencyCode: E } = le(), v = (i, $) => {
564
+ const q = b(i);
565
+ return q === i ? $ : q;
566
+ }, F = Be(n), j = Ke(n), R = v("select_an_option", "Select an option"), L = v("state_province", "State / Province"), S = async () => {
567
+ _(!0), f(null), h(null);
568
+ const i = await pr(
569
+ t,
570
+ {
571
+ country: n,
572
+ state: a || void 0,
573
+ postal_code: c
574
+ },
575
+ d,
576
+ E
577
+ );
578
+ i.success && i.methods ? h(i.methods) : f(
579
+ i.errorKey ? v(
580
+ i.errorKey,
581
+ i.error || b("ecommerce.no_rates_found")
582
+ ) : i.error || b("ecommerce.no_rates_found")
583
+ ), _(!1);
584
+ };
585
+ return /* @__PURE__ */ r("div", { className: "space-y-4 rounded-lg border bg-muted/30 p-4 mt-6", children: [
586
+ /* @__PURE__ */ r("div", { className: "flex items-center gap-2 font-semibold text-sm", children: [
587
+ /* @__PURE__ */ e(vt, { className: "h-4 w-4" }),
588
+ /* @__PURE__ */ e("span", { children: b("ecommerce.estimate_shipping") })
589
+ ] }),
590
+ /* @__PURE__ */ r("div", { className: "grid gap-3", children: [
591
+ /* @__PURE__ */ r("div", { className: "space-y-1.5", children: [
592
+ /* @__PURE__ */ e(A, { htmlFor: "estimate-country", className: "text-xs uppercase tracking-wider text-muted-foreground", children: b("ecommerce.country") }),
593
+ /* @__PURE__ */ e(
594
+ "select",
595
+ {
596
+ id: "estimate-country",
597
+ value: n,
598
+ onChange: (i) => {
599
+ const $ = i.target.value, q = Be($);
600
+ s($), l(
601
+ q.some((P) => P.code === a) ? a : ""
602
+ );
603
+ },
604
+ className: "flex h-9 w-full rounded-md border border-input bg-background px-3 py-2 text-sm",
605
+ children: ut.map((i) => /* @__PURE__ */ e("option", { value: i.code, children: i.name }, i.code))
606
+ }
607
+ )
608
+ ] }),
609
+ j && /* @__PURE__ */ r("div", { className: "space-y-1.5", children: [
610
+ /* @__PURE__ */ e(A, { htmlFor: "estimate-state", className: "text-xs uppercase tracking-wider text-muted-foreground", children: b("state_province") }),
611
+ /* @__PURE__ */ r(
612
+ "select",
613
+ {
614
+ id: "estimate-state",
615
+ value: a,
616
+ onChange: (i) => l(i.target.value),
617
+ className: "flex h-9 w-full rounded-md border border-input bg-background px-3 py-2 text-sm",
618
+ children: [
619
+ /* @__PURE__ */ e("option", { value: "", children: `${R}: ${L}` }),
620
+ F.map((i) => /* @__PURE__ */ e("option", { value: i.code, children: i.name }, i.code))
621
+ ]
622
+ }
623
+ )
624
+ ] }),
625
+ /* @__PURE__ */ r("div", { className: "space-y-1.5", children: [
626
+ /* @__PURE__ */ e(A, { htmlFor: "estimate-postal", className: "text-xs uppercase tracking-wider text-muted-foreground", children: b("ecommerce.postal_code") }),
627
+ /* @__PURE__ */ r("div", { className: "flex gap-2", children: [
628
+ /* @__PURE__ */ e(
629
+ U,
630
+ {
631
+ id: "estimate-postal",
632
+ placeholder: "A1A 1A1",
633
+ value: c,
634
+ onChange: (i) => o(i.target.value),
635
+ className: "h-9 text-sm bg-background"
636
+ }
637
+ ),
638
+ /* @__PURE__ */ r(
639
+ D,
640
+ {
641
+ size: "sm",
642
+ variant: "secondary",
643
+ onClick: S,
644
+ disabled: m,
645
+ className: "shrink-0",
646
+ children: [
647
+ m ? /* @__PURE__ */ e(Ve, { className: "h-4 w-4 animate-spin" }) : /* @__PURE__ */ e(Or, { className: "h-4 w-4 mr-1.5" }),
648
+ b("ecommerce.calculate")
649
+ ]
650
+ }
651
+ )
652
+ ] })
653
+ ] })
654
+ ] }),
655
+ p && /* @__PURE__ */ e("p", { className: "text-xs text-destructive mt-2", children: p }),
656
+ y && y.length > 0 && /* @__PURE__ */ r("div", { className: "mt-4 space-y-2 border-t pt-3", children: [
657
+ /* @__PURE__ */ r("p", { className: "text-xs font-medium text-muted-foreground uppercase", children: [
658
+ b("ecommerce.available_rates"),
659
+ ":"
660
+ ] }),
661
+ y.map((i) => /* @__PURE__ */ r("div", { className: "flex justify-between items-center p-3 border rounded-lg bg-muted/30", children: [
662
+ /* @__PURE__ */ r("div", { className: "flex items-center gap-2", children: [
663
+ /* @__PURE__ */ e(vt, { className: "h-4 w-4 text-muted-foreground" }),
664
+ /* @__PURE__ */ e("span", { className: "text-sm font-medium", children: i.name })
665
+ ] }),
666
+ /* @__PURE__ */ e("span", { className: "text-sm font-bold", children: i.amount === 0 ? b("ecommerce.free") : w(i.amount, E) })
667
+ ] }, i.id))
668
+ ] }),
669
+ y && y.length === 0 && !p && /* @__PURE__ */ e("p", { className: "text-xs text-muted-foreground mt-2 italic", children: b("ecommerce.no_rates_found") })
670
+ ] });
671
+ }, _a = () => {
672
+ const t = zt(), n = ue((f) => f), s = ur(), { t: a } = Z(), { activeCurrencyCode: l, currencies: c } = le(), o = n?.items ?? [], m = H(
673
+ () => o.reduce((f, b) => {
674
+ if (Y(b))
675
+ return f;
676
+ const d = Ce(b, {
677
+ currencyCode: l,
678
+ currencies: c
679
+ });
680
+ return f + (d.sale_price ?? d.price) * b.quantity;
681
+ }, 0),
682
+ [l, c, o]
683
+ );
684
+ if (!n) return null;
685
+ const { updateQuantity: _, removeItem: y } = n, h = (f) => o.reduce((b, d) => Y(d) || d.sku !== f ? b : b + d.quantity, 0), p = () => {
686
+ t.push("/checkout");
687
+ };
688
+ return o.length === 0 ? /* @__PURE__ */ r("div", { className: "flex flex-col items-center justify-center space-y-4 py-12", children: [
689
+ /* @__PURE__ */ e("h2", { className: "text-2xl font-bold", children: a("ecommerce.cart_empty") }),
690
+ /* @__PURE__ */ e("p", { className: "text-muted-foreground", children: a("ecommerce.cart_empty_description") }),
691
+ /* @__PURE__ */ e(D, { asChild: !0, children: /* @__PURE__ */ e("a", { href: "/shop", children: a("ecommerce.continue_shopping") }) })
692
+ ] }) : /* @__PURE__ */ r("div", { className: "container mx-auto py-12", children: [
693
+ /* @__PURE__ */ e("h1", { className: "mb-8 text-3xl font-bold", children: a("ecommerce.shopping_cart") }),
694
+ /* @__PURE__ */ r("div", { className: "grid gap-12 lg:grid-cols-12 lg:items-start", children: [
695
+ /* @__PURE__ */ e("div", { className: "lg:col-span-8", children: /* @__PURE__ */ e("div", { className: "rounded-lg border overflow-hidden", children: /* @__PURE__ */ r(ds, { children: [
696
+ /* @__PURE__ */ e(us, { children: /* @__PURE__ */ r(Et, { children: [
697
+ /* @__PURE__ */ e(Ae, { children: a("ecommerce.product") }),
698
+ /* @__PURE__ */ e(Ae, { children: a("ecommerce.quantity") }),
699
+ /* @__PURE__ */ e(Ae, { className: "text-right", children: a("ecommerce.price") }),
700
+ /* @__PURE__ */ e(Ae, { className: "text-right", children: a("ecommerce.total") }),
701
+ /* @__PURE__ */ e(Ae, { className: "w-[50px]" })
702
+ ] }) }),
703
+ /* @__PURE__ */ e(ms, { children: o.map((f) => {
704
+ const b = h(f.sku), d = Ce(f, {
705
+ currencyCode: l,
706
+ currencies: c
707
+ }), E = pe(f);
708
+ return /* @__PURE__ */ r(Et, { children: [
709
+ /* @__PURE__ */ e(Ee, { children: /* @__PURE__ */ r("div", { className: "flex items-center gap-4", children: [
710
+ f.image_url ? /* @__PURE__ */ e("div", { className: "h-16 w-16 overflow-hidden rounded border bg-neutral-100", children: /* @__PURE__ */ e(
711
+ "img",
712
+ {
713
+ src: f.image_url,
714
+ alt: f.title,
715
+ className: "h-full w-full object-cover"
716
+ }
717
+ ) }) : /* @__PURE__ */ e("div", { className: "flex h-16 w-16 items-center justify-center rounded bg-secondary", children: /* @__PURE__ */ e("span", { className: "text-[10px] text-muted-foreground", children: a("ecommerce.no_image") }) }),
718
+ /* @__PURE__ */ r("div", { children: [
719
+ /* @__PURE__ */ e("div", { className: "font-medium", children: f.title }),
720
+ f.variant_label && /* @__PURE__ */ e("div", { className: "mt-1 text-xs text-muted-foreground", children: f.variant_label }),
721
+ Y(f) && f.billing_cycle && /* @__PURE__ */ r("div", { className: "mt-1 text-xs capitalize text-muted-foreground", children: [
722
+ f.billing_cycle,
723
+ " Subscription"
724
+ ] }),
725
+ E && /* @__PURE__ */ r("div", { className: "mt-1 text-xs font-medium text-emerald-700", children: [
726
+ E.label,
727
+ " - ",
728
+ E.paymentRequirementLabel
729
+ ] })
730
+ ] })
731
+ ] }) }),
732
+ /* @__PURE__ */ e(Ee, { children: Y(f) ? /* @__PURE__ */ e(ie, { variant: "secondary", className: "font-normal text-xs", children: "1 (License)" }) : /* @__PURE__ */ r("div", { className: "flex items-center gap-2", children: [
733
+ /* @__PURE__ */ e(
734
+ D,
735
+ {
736
+ variant: "outline",
737
+ size: "icon",
738
+ className: "h-8 w-8",
739
+ onClick: () => _(f.id, f.quantity - 1),
740
+ children: /* @__PURE__ */ e(Ut, { className: "h-4 w-4" })
741
+ }
742
+ ),
743
+ /* @__PURE__ */ e("span", { className: "w-8 text-center", children: f.quantity }),
744
+ /* @__PURE__ */ e(
745
+ D,
746
+ {
747
+ variant: "outline",
748
+ size: "icon",
749
+ className: "h-8 w-8",
750
+ onClick: () => _(f.id, f.quantity + 1),
751
+ disabled: typeof f.stock == "number" && b >= f.stock,
752
+ children: /* @__PURE__ */ e(Vt, { className: "h-4 w-4" })
753
+ }
754
+ )
755
+ ] }) }),
756
+ /* @__PURE__ */ e(Ee, { className: "text-right", children: /* @__PURE__ */ r("div", { className: "flex flex-col items-end", children: [
757
+ /* @__PURE__ */ e("span", { className: "font-medium", children: w(d.sale_price ?? d.price, l) }),
758
+ d.sale_price && /* @__PURE__ */ e("span", { className: "text-xs text-muted-foreground line-through", children: w(d.price, l) })
759
+ ] }) }),
760
+ /* @__PURE__ */ e(Ee, { className: "text-right font-medium", children: w(
761
+ (d.sale_price ?? d.price) * f.quantity,
762
+ l
763
+ ) }),
764
+ /* @__PURE__ */ e(Ee, { children: /* @__PURE__ */ e(
765
+ D,
766
+ {
767
+ variant: "ghost",
768
+ size: "icon",
769
+ onClick: () => y(f.id),
770
+ className: "text-muted-foreground hover:text-destructive",
771
+ children: /* @__PURE__ */ e(Dt, { className: "h-4 w-4" })
772
+ }
773
+ ) })
774
+ ] }, f.id);
775
+ }) })
776
+ ] }) }) }),
777
+ /* @__PURE__ */ e("div", { className: "lg:col-span-4", children: /* @__PURE__ */ r("div", { className: "rounded-lg border bg-card p-6 shadow-sm", children: [
778
+ /* @__PURE__ */ e("h2", { className: "mb-4 text-lg font-semibold", children: a("ecommerce.order_summary") }),
779
+ /* @__PURE__ */ r("div", { className: "flex justify-between border-b pb-4", children: [
780
+ /* @__PURE__ */ e("span", { children: a("ecommerce.subtotal") }),
781
+ /* @__PURE__ */ e("span", { className: "font-medium", children: w(s, l) })
782
+ ] }),
783
+ /* @__PURE__ */ r("div", { className: "mt-4 flex flex-col gap-4", children: [
784
+ /* @__PURE__ */ e("p", { className: "text-sm text-muted-foreground", children: a("ecommerce.shipping_taxes_calculated") }),
785
+ o.some((f) => !Y(f)) && /* @__PURE__ */ e(Ss, { physicalSubtotal: m }),
786
+ /* @__PURE__ */ e(
787
+ pt,
788
+ {
789
+ items: o,
790
+ currencyCode: l,
791
+ compact: !0
792
+ }
793
+ ),
794
+ /* @__PURE__ */ e(D, { className: "w-full mt-4", size: "lg", onClick: p, children: a("ecommerce.proceed_to_checkout") })
795
+ ] })
796
+ ] }) })
797
+ ] })
798
+ ] });
799
+ };
800
+ async function Ps(t, n, s = "USD", a, l) {
801
+ try {
802
+ const c = ar(), o = sr(), { data: m } = await c.from("currencies").select(
803
+ "code, symbol, exchange_rate, is_default, is_active, auto_sync_product_prices, auto_update_exchange_rate, exchange_rate_source, exchange_rate_updated_at, rounding_mode, rounding_increment, rounding_charm_amount"
804
+ ).eq("is_active", !0).order("code", { ascending: !0 }), _ = m ?? [];
805
+ let y;
806
+ if (a) {
807
+ const f = await Qt({
808
+ client: o,
809
+ code: a,
810
+ items: l && l.length > 0 ? l : t,
811
+ currencyCode: s
812
+ });
813
+ f.success && (y = ts(f.quote));
814
+ }
815
+ const h = await rs(
816
+ c,
817
+ t,
818
+ s,
819
+ _,
820
+ y
821
+ );
822
+ return { success: !0, tax: await ss(c, {
823
+ items: h,
824
+ destination: n
825
+ }) };
826
+ } catch (c) {
827
+ return console.error("Failed to estimate taxes:", c), {
828
+ success: !1,
829
+ error: c.message || "Failed to calculate taxes"
830
+ };
831
+ }
832
+ }
833
+ const As = process.env.NEXT_PUBLIC_IS_SANDBOX === "true", ze = "nextblock-checkout-draft-v1";
834
+ function Me(t, n) {
835
+ return {
836
+ ...Xt(),
837
+ company_name: t?.company_name || "",
838
+ recipient_name: t?.recipient_name || n || "",
839
+ line1: t?.line1 || "",
840
+ line2: t?.line2 || "",
841
+ city: t?.city || "",
842
+ state: t?.state || "",
843
+ postal_code: t?.postal_code || "",
844
+ country_code: dt(t?.country_code) || "CA"
845
+ };
846
+ }
847
+ function Es(t) {
848
+ const n = Ne(t);
849
+ return !(!n?.country_code || !n.postal_code || Ke(n.country_code) && !n.state);
850
+ }
851
+ function st(t, n, s) {
852
+ return t.reduce((a, l) => {
853
+ const { price: c, sale_price: o } = Ce(l, {
854
+ currencyCode: n,
855
+ currencies: s
856
+ });
857
+ return a + (o ?? c) * l.quantity;
858
+ }, 0);
859
+ }
860
+ function Lt({
861
+ idPrefix: t,
862
+ title: n,
863
+ description: s,
864
+ value: a,
865
+ onChange: l
866
+ }) {
867
+ const { t: c } = Z(), o = c("company_name") === "company_name" ? "Company name" : c("company_name"), m = c("select_an_option") === "select_an_option" ? "Select an option" : c("select_an_option"), _ = c("state_province") === "state_province" ? "State / Province" : c("state_province"), y = Be(a.country_code), h = Ke(a.country_code);
868
+ return /* @__PURE__ */ r(ye, { children: [
869
+ /* @__PURE__ */ r(be, { children: [
870
+ /* @__PURE__ */ r(xe, { className: "flex items-center gap-2", children: [
871
+ /* @__PURE__ */ e(Ur, { className: "w-5 h-5" }),
872
+ n
873
+ ] }),
874
+ /* @__PURE__ */ e("p", { className: "text-sm text-muted-foreground", children: s })
875
+ ] }),
876
+ /* @__PURE__ */ r(ve, { className: "space-y-4", children: [
877
+ /* @__PURE__ */ r("div", { className: "grid gap-4 sm:grid-cols-3", children: [
878
+ /* @__PURE__ */ r("div", { className: "space-y-2", children: [
879
+ /* @__PURE__ */ e(A, { htmlFor: `${t}-company`, children: o }),
880
+ /* @__PURE__ */ e(
881
+ U,
882
+ {
883
+ id: `${t}-company`,
884
+ value: a.company_name,
885
+ onChange: (p) => l({ ...a, company_name: p.target.value })
886
+ }
887
+ )
888
+ ] }),
889
+ /* @__PURE__ */ r("div", { className: "space-y-2", children: [
890
+ /* @__PURE__ */ e(A, { htmlFor: `${t}-name`, children: c("full_name") }),
891
+ /* @__PURE__ */ e(
892
+ U,
893
+ {
894
+ id: `${t}-name`,
895
+ value: a.recipient_name,
896
+ onChange: (p) => l({ ...a, recipient_name: p.target.value })
897
+ }
898
+ )
899
+ ] }),
900
+ /* @__PURE__ */ r("div", { className: "space-y-2", children: [
901
+ /* @__PURE__ */ e(A, { htmlFor: `${t}-country`, children: c("country") }),
902
+ /* @__PURE__ */ e(
903
+ "select",
904
+ {
905
+ id: `${t}-country`,
906
+ className: "flex h-10 w-full rounded-md border border-input bg-background px-3 py-2 text-sm",
907
+ value: a.country_code,
908
+ onChange: (p) => {
909
+ const f = p.target.value, b = Be(f);
910
+ l({
911
+ ...a,
912
+ country_code: f,
913
+ state: b.some((d) => d.code === a.state) ? a.state : ""
914
+ });
915
+ },
916
+ children: ut.map((p) => /* @__PURE__ */ e("option", { value: p.code, children: p.name }, p.code))
917
+ }
918
+ )
919
+ ] })
920
+ ] }),
921
+ /* @__PURE__ */ r("div", { className: "space-y-2", children: [
922
+ /* @__PURE__ */ e(A, { htmlFor: `${t}-line1`, children: c("address_line_1") }),
923
+ /* @__PURE__ */ e(
924
+ U,
925
+ {
926
+ id: `${t}-line1`,
927
+ value: a.line1,
928
+ onChange: (p) => l({ ...a, line1: p.target.value })
929
+ }
930
+ )
931
+ ] }),
932
+ /* @__PURE__ */ r("div", { className: "space-y-2", children: [
933
+ /* @__PURE__ */ e(A, { htmlFor: `${t}-line2`, children: c("address_line_2") }),
934
+ /* @__PURE__ */ e(
935
+ U,
936
+ {
937
+ id: `${t}-line2`,
938
+ value: a.line2,
939
+ onChange: (p) => l({ ...a, line2: p.target.value })
940
+ }
941
+ )
942
+ ] }),
943
+ /* @__PURE__ */ r("div", { className: "grid gap-4 sm:grid-cols-3", children: [
944
+ /* @__PURE__ */ r("div", { className: "space-y-2", children: [
945
+ /* @__PURE__ */ e(A, { htmlFor: `${t}-city`, children: c("city") }),
946
+ /* @__PURE__ */ e(
947
+ U,
948
+ {
949
+ id: `${t}-city`,
950
+ value: a.city,
951
+ onChange: (p) => l({ ...a, city: p.target.value })
952
+ }
953
+ )
954
+ ] }),
955
+ /* @__PURE__ */ r("div", { className: "space-y-2", children: [
956
+ /* @__PURE__ */ e(A, { htmlFor: `${t}-state`, children: c("state_province") }),
957
+ h ? /* @__PURE__ */ r(
958
+ "select",
959
+ {
960
+ id: `${t}-state`,
961
+ className: "flex h-10 w-full rounded-md border border-input bg-background px-3 py-2 text-sm",
962
+ value: a.state,
963
+ onChange: (p) => l({ ...a, state: p.target.value }),
964
+ children: [
965
+ /* @__PURE__ */ e("option", { value: "", children: `${m}: ${_}` }),
966
+ y.map((p) => /* @__PURE__ */ e("option", { value: p.code, children: p.name }, p.code))
967
+ ]
968
+ }
969
+ ) : /* @__PURE__ */ e(
970
+ U,
971
+ {
972
+ id: `${t}-state`,
973
+ value: a.state,
974
+ onChange: (p) => l({ ...a, state: p.target.value })
975
+ }
976
+ )
977
+ ] }),
978
+ /* @__PURE__ */ r("div", { className: "space-y-2", children: [
979
+ /* @__PURE__ */ e(A, { htmlFor: `${t}-postal`, children: c("postal_zip_code") }),
980
+ /* @__PURE__ */ e(
981
+ U,
982
+ {
983
+ id: `${t}-postal`,
984
+ value: a.postal_code,
985
+ onChange: (p) => l({ ...a, postal_code: p.target.value })
986
+ }
987
+ )
988
+ ] })
989
+ ] })
990
+ ] })
991
+ ] });
992
+ }
993
+ function It({
994
+ title: t,
995
+ description: n,
996
+ badgeLabel: s,
997
+ children: a
998
+ }) {
999
+ return /* @__PURE__ */ r(ye, { children: [
1000
+ /* @__PURE__ */ e(be, { children: /* @__PURE__ */ r("div", { className: "flex items-center justify-between gap-3 flex-wrap", children: [
1001
+ /* @__PURE__ */ r("div", { children: [
1002
+ /* @__PURE__ */ e(xe, { children: t }),
1003
+ /* @__PURE__ */ e("p", { className: "mt-1 text-sm text-muted-foreground", children: n })
1004
+ ] }),
1005
+ s ? /* @__PURE__ */ e(ie, { variant: "secondary", children: s }) : null
1006
+ ] }) }),
1007
+ /* @__PURE__ */ e(ve, { className: "space-y-4", children: a })
1008
+ ] });
1009
+ }
1010
+ const ya = ({ initialCustomer: t }) => {
1011
+ const [n, s] = k({}), [a, l] = k(null), [c, o] = k({}), [m, _] = k(t?.email || ""), [y, h] = k(""), [p, f] = k(t?.phone || ""), [b, d] = k(!1), [E, v] = k(null), [F, j] = k(!1), [R, L] = k(!1), [S, i] = k([]), [$, q] = k(null), [P, W] = k(null), [C, X] = k(null), [V, B] = k(
1012
+ () => Me(t?.billingAddress, t?.fullName)
1013
+ ), [Q, he] = k(
1014
+ () => Me(
1015
+ t?.shippingAddress ?? t?.billingAddress,
1016
+ t?.fullName
1017
+ )
1018
+ ), [J, Re] = k(
1019
+ !t?.shippingAddress || lt(t?.billingAddress, t?.shippingAddress)
1020
+ ), fe = ue((u) => u), { t: g, lang: ee } = Z(), { activeCurrencyCode: x, currencies: ne } = le(), te = fe?.items ?? [], re = H(
1021
+ () => te.filter((u) => !Y(u)),
1022
+ [te]
1023
+ ), se = H(
1024
+ () => te.filter((u) => Y(u)),
1025
+ [te]
1026
+ ), ge = t?.isAuthenticated ?? !1, N = (u, T, z) => {
1027
+ const O = g(u, z);
1028
+ if (O !== u)
1029
+ return O;
1030
+ if (!z)
1031
+ return T;
1032
+ let K = T;
1033
+ return Object.entries(z).forEach(([M, I]) => {
1034
+ K = K.replace(
1035
+ new RegExp(`\\{${M}\\}`, "g"),
1036
+ String(I)
1037
+ );
1038
+ }), K;
1039
+ }, ae = re.length > 0, _r = H(
1040
+ () => st(te, x, ne),
1041
+ [x, ne, te]
1042
+ ), Je = H(
1043
+ () => st(re, x, ne),
1044
+ [x, ne, re]
1045
+ ), We = H(
1046
+ () => st(se, x, ne),
1047
+ [x, ne, se]
1048
+ ), Qe = C?.providerDiscounts.stripe ?? 0, Xe = C?.providerDiscounts.freemius ?? 0, $e = Math.max(0, Je - Qe), yr = Math.max(0, We - Xe), ce = H(
1049
+ () => J ? V : Q,
1050
+ [V, Q, J]
1051
+ ), _e = H(
1052
+ () => ae ? ce : V,
1053
+ [V, ae, ce]
1054
+ ), Le = !ae || Es(ce), Ie = H(
1055
+ () => S.find((u) => u.id === $),
1056
+ [S, $]
1057
+ ), ft = H(
1058
+ () => $e + (Ie?.amount ?? 0) + (P && !P.isPendingExternalCalculation ? P.amount : 0),
1059
+ [$e, Ie, P]
1060
+ ), br = ft + yr;
1061
+ if (G(() => {
1062
+ if (!(ge || typeof window > "u"))
1063
+ try {
1064
+ const u = window.localStorage.getItem(ze);
1065
+ if (!u)
1066
+ return;
1067
+ const T = JSON.parse(u);
1068
+ T.email && _(T.email), T.phone && f(T.phone), T.billingAddress && B(Me(T.billingAddress)), T.shippingAddress && he(Me(T.shippingAddress)), typeof T.useBillingForShipping == "boolean" && Re(T.useBillingForShipping), (typeof T.selectedMethodId == "string" || T.selectedMethodId === null) && q(T.selectedMethodId);
1069
+ } catch (u) {
1070
+ console.error("[Checkout] Failed to restore checkout draft:", u);
1071
+ }
1072
+ }, [ge]), G(() => {
1073
+ if (!(typeof window > "u")) {
1074
+ if (ge) {
1075
+ window.localStorage.removeItem(ze);
1076
+ return;
1077
+ }
1078
+ window.localStorage.setItem(
1079
+ ze,
1080
+ JSON.stringify({
1081
+ email: m,
1082
+ phone: p,
1083
+ billingAddress: V,
1084
+ shippingAddress: Q,
1085
+ useBillingForShipping: J,
1086
+ selectedMethodId: $
1087
+ })
1088
+ );
1089
+ }
1090
+ }, [
1091
+ V,
1092
+ m,
1093
+ ge,
1094
+ p,
1095
+ $,
1096
+ Q,
1097
+ J
1098
+ ]), G(() => {
1099
+ if (!ae) {
1100
+ i([]), q(null), j(!1);
1101
+ return;
1102
+ }
1103
+ if (!Le) {
1104
+ i([]), q(null), j(!1);
1105
+ return;
1106
+ }
1107
+ let u = !1;
1108
+ const z = setTimeout(async () => {
1109
+ if (!ce.country_code)
1110
+ return;
1111
+ j(!0);
1112
+ const O = await pr(
1113
+ $e,
1114
+ {
1115
+ country: ce.country_code,
1116
+ state: ce.state,
1117
+ postal_code: ce.postal_code
1118
+ },
1119
+ ee,
1120
+ x
1121
+ );
1122
+ u || (O.success && O.methods ? (i(O.methods), O.methods.length > 0 && (!$ || !O.methods.find((K) => K.id === $)) && q(O.methods[0].id)) : (i([]), q(null)), j(!1));
1123
+ }, 400);
1124
+ return () => {
1125
+ u = !0, clearTimeout(z);
1126
+ };
1127
+ }, [
1128
+ x,
1129
+ ae,
1130
+ Le,
1131
+ ee,
1132
+ $,
1133
+ ce.country_code,
1134
+ ce.postal_code,
1135
+ ce.state,
1136
+ $e
1137
+ ]), G(() => {
1138
+ const T = setTimeout(async () => {
1139
+ if (!ae || !_e.country_code) {
1140
+ L(!1), W(null);
1141
+ return;
1142
+ }
1143
+ if (Ke(_e.country_code) && !_e.state) {
1144
+ L(!1), W(null);
1145
+ return;
1146
+ }
1147
+ L(!0);
1148
+ const z = await Ps(
1149
+ re,
1150
+ {
1151
+ country_code: _e.country_code,
1152
+ state: _e.state
1153
+ },
1154
+ x,
1155
+ C?.code ?? null,
1156
+ te
1157
+ );
1158
+ z.success && z.tax ? W(z.tax) : W(null), L(!1);
1159
+ }, 300);
1160
+ return () => clearTimeout(T);
1161
+ }, [
1162
+ x,
1163
+ ae,
1164
+ re,
1165
+ _e.country_code,
1166
+ _e.state,
1167
+ C?.code,
1168
+ te
1169
+ ]), !fe)
1170
+ return null;
1171
+ const gt = () => {
1172
+ d(!1), v(null);
1173
+ }, _t = b ? /* @__PURE__ */ e(
1174
+ "div",
1175
+ {
1176
+ className: "fixed inset-0 z-50 flex items-center justify-center bg-black/60 backdrop-blur-sm",
1177
+ onClick: gt,
1178
+ children: /* @__PURE__ */ r(
1179
+ "div",
1180
+ {
1181
+ className: "relative bg-background border rounded-xl shadow-2xl p-8 max-w-md mx-4",
1182
+ onClick: (u) => u.stopPropagation(),
1183
+ children: [
1184
+ /* @__PURE__ */ e(
1185
+ "button",
1186
+ {
1187
+ onClick: gt,
1188
+ className: "absolute top-4 right-4 text-muted-foreground hover:text-foreground transition-colors",
1189
+ children: /* @__PURE__ */ e(Mt, { className: "w-5 h-5" })
1190
+ }
1191
+ ),
1192
+ /* @__PURE__ */ r("div", { className: "flex items-center gap-3 mb-4", children: [
1193
+ /* @__PURE__ */ e("div", { className: "p-2 rounded-full bg-amber-100 dark:bg-amber-900/20", children: /* @__PURE__ */ e(qr, { className: "h-6 w-6 text-amber-600 dark:text-amber-400" }) }),
1194
+ /* @__PURE__ */ e("h2", { className: "text-xl font-semibold", children: g("ecommerce.checkout_successful") })
1195
+ ] }),
1196
+ /* @__PURE__ */ e("p", { className: "text-muted-foreground mb-2", children: g("ecommerce.sandbox_notice") }),
1197
+ /* @__PURE__ */ e("p", { className: "text-muted-foreground mb-2", children: E === "stripe" ? N(
1198
+ "ecommerce.sandbox_checkout_stripe_description",
1199
+ "This simulated step represents the Stripe checkout for physical products."
1200
+ ) : N(
1201
+ "ecommerce.sandbox_checkout_freemius_description",
1202
+ "This simulated step represents the Freemius checkout for digital products."
1203
+ ) }),
1204
+ /* @__PURE__ */ e("p", { className: "text-muted-foreground mb-6", children: g("ecommerce.license_notice") }),
1205
+ /* @__PURE__ */ e(
1206
+ "a",
1207
+ {
1208
+ href: "https://nextblock.ca",
1209
+ target: "_blank",
1210
+ rel: "noopener noreferrer",
1211
+ className: "block w-full text-center py-3 px-4 rounded-lg bg-primary text-primary-foreground font-semibold hover:opacity-90 transition-opacity",
1212
+ children: g("ecommerce.purchase_at")
1213
+ }
1214
+ )
1215
+ ]
1216
+ }
1217
+ )
1218
+ }
1219
+ ) : null, xr = (u) => {
1220
+ if (!ge && (!m || !/^\S+@\S+\.\S+$/.test(m)))
1221
+ return h(g("ecommerce.invalid_email")), null;
1222
+ const T = Ne(V);
1223
+ if (!kt(T))
1224
+ return alert(g("checkout_complete_billing_address")), null;
1225
+ const z = ae ? Ne(J ? V : Q) : null;
1226
+ if (u === "stripe") {
1227
+ if (!kt(z))
1228
+ return alert(g("checkout_complete_shipping_address")), null;
1229
+ if (!$)
1230
+ return alert(
1231
+ N(
1232
+ "ecommerce.shipping_method_required",
1233
+ "Please select a shipping method before continuing."
1234
+ )
1235
+ ), null;
1236
+ }
1237
+ return h(""), {
1238
+ normalizedBillingAddress: T,
1239
+ normalizedShippingAddress: z
1240
+ };
1241
+ }, yt = async (u, T, z) => {
1242
+ o((K) => ({
1243
+ ...K,
1244
+ [u]: ""
1245
+ }));
1246
+ const O = xr(u);
1247
+ if (O) {
1248
+ if (As) {
1249
+ const K = new Set(T.map((I) => I.id)), M = te.filter((I) => !K.has(I.id));
1250
+ fe.setItems(M), M.length === 0 && fe.removeCoupon(), v(u), d(!0), typeof window < "u" && M.length === 0 && window.localStorage.removeItem(ze);
1251
+ return;
1252
+ }
1253
+ l(z);
1254
+ try {
1255
+ const K = await fetch("/api/checkout", {
1256
+ method: "POST",
1257
+ headers: { "Content-Type": "application/json" },
1258
+ body: JSON.stringify({
1259
+ items: T,
1260
+ customerEmail: ge ? void 0 : m,
1261
+ customerPhone: p || null,
1262
+ billingAddress: O.normalizedBillingAddress,
1263
+ shippingAddress: u === "stripe" ? O.normalizedShippingAddress : null,
1264
+ shippingMethodId: u === "stripe" ? $ : null,
1265
+ locale: ee,
1266
+ currencyCode: x,
1267
+ couponCode: C?.code ?? fe.appliedCoupon?.code ?? null,
1268
+ couponContextItems: te
1269
+ })
1270
+ }), M = await K.json();
1271
+ if (!K.ok) {
1272
+ const I = M?.errorKey && typeof M.errorKey == "string" ? N(
1273
+ M.errorKey,
1274
+ M?.error || N("ecommerce.generic_error", "Something went wrong."),
1275
+ M.errorParams
1276
+ ) : M?.error || g("ecommerce.generic_error");
1277
+ o((Pe) => ({
1278
+ ...Pe,
1279
+ [u]: I
1280
+ })), l(null);
1281
+ return;
1282
+ }
1283
+ if (M.customProps && M.customProps.provider === "freemius") {
1284
+ const I = M.customProps;
1285
+ let Pe = null;
1286
+ const Sr = () => {
1287
+ window.location.href = `/checkout/success?session_id=${I.order_id}`;
1288
+ }, bt = (de) => (Pe || (Pe = fetch("/api/checkout/freemius/sync", {
1289
+ method: "POST",
1290
+ headers: { "Content-Type": "application/json" },
1291
+ body: JSON.stringify({
1292
+ orderId: I.order_id,
1293
+ checkoutResponse: de
1294
+ })
1295
+ }).then(async (xt) => {
1296
+ if (!xt.ok) {
1297
+ const Er = await xt.json().catch(() => null);
1298
+ console.error("Freemius checkout sync failed:", Er);
1299
+ }
1300
+ })), Pe), Pr = {
1301
+ product_id: I.plugin_id,
1302
+ public_key: I.public_key,
1303
+ sandbox: I.sandbox
1304
+ }, Ar = {
1305
+ name: g("ecommerce.checkout_overlay_title"),
1306
+ plan_id: I.plan_id,
1307
+ ...I.billing_cycle ? { billing_cycle: I.billing_cycle } : {},
1308
+ ...I.trial ? { trial: I.trial } : {},
1309
+ ...I.coupon ? { coupon: I.coupon } : {},
1310
+ user_email: I.user_email,
1311
+ user_firstname: I.user_firstname,
1312
+ user_lastname: I.user_lastname,
1313
+ sandbox: I.sandbox,
1314
+ purchaseCompleted: function(de) {
1315
+ bt(de);
1316
+ },
1317
+ success: function(de) {
1318
+ (async () => {
1319
+ try {
1320
+ await bt(de);
1321
+ } finally {
1322
+ Sr();
1323
+ }
1324
+ })();
1325
+ }
1326
+ };
1327
+ try {
1328
+ new fs(Pr).open(Ar), l(null);
1329
+ } catch (de) {
1330
+ alert(
1331
+ g("ecommerce.checkout_popup_blocked") + " " + (de.message || String(de))
1332
+ ), M.url && (window.location.href = M.url), l(null);
1333
+ }
1334
+ } else M.url ? window.location.href = M.url : (o((I) => ({
1335
+ ...I,
1336
+ [u]: g("ecommerce.checkout_failed") + (M.error || N("ecommerce.unknown_error", "Unknown error"))
1337
+ })), l(null));
1338
+ } catch (K) {
1339
+ console.error(K), o((M) => ({
1340
+ ...M,
1341
+ [u]: g("ecommerce.generic_error")
1342
+ })), l(null);
1343
+ }
1344
+ }
1345
+ };
1346
+ if (te.length === 0)
1347
+ return /* @__PURE__ */ r(ot, { children: [
1348
+ _t,
1349
+ /* @__PURE__ */ r("div", { className: "container mx-auto flex min-h-[50vh] flex-col items-center justify-center p-8 text-center", children: [
1350
+ /* @__PURE__ */ e("h1", { className: "mb-4 text-2xl font-bold", children: g("ecommerce.cart_empty") }),
1351
+ /* @__PURE__ */ e("p", { className: "mb-8 text-muted-foreground", children: g("ecommerce.cart_empty_description") }),
1352
+ /* @__PURE__ */ e(D, { asChild: !0, children: /* @__PURE__ */ e("a", { href: "/shop", children: g("ecommerce.go_to_shop") }) })
1353
+ ] })
1354
+ ] });
1355
+ const Ye = ae ? Le ? F ? N(
1356
+ "ecommerce.calculating_shipping",
1357
+ "Calculating shipping..."
1358
+ ) : $ ? null : S.length > 0 ? g("ecommerce.select_rate") : g("ecommerce.no_rates_for_region") : N(
1359
+ "ecommerce.waiting_on_address_info",
1360
+ "Complete your shipping address to view available shipping options."
1361
+ ) : null, vr = a !== null || Ye !== null, Nr = re.length === 1 ? N("ecommerce.item_count_one", "{count} item", {
1362
+ count: re.length
1363
+ }) : N("ecommerce.item_count_other", "{count} items", {
1364
+ count: re.length
1365
+ }), Cr = se.length === 1 ? N("ecommerce.license_count_one", "{count} license", {
1366
+ count: se.length
1367
+ }) : N("ecommerce.license_count_other", "{count} licenses", {
1368
+ count: se.length
1369
+ }), wr = (u) => Y(u) ? N("ecommerce.digital_label", "Digital") : N("ecommerce.physical_label", "Physical"), kr = (u) => u === "monthly" ? N(
1370
+ "ecommerce.checkout_billing_cycle_monthly",
1371
+ "Monthly subscription"
1372
+ ) : u === "annual" ? N(
1373
+ "ecommerce.checkout_billing_cycle_annual",
1374
+ "Annual subscription"
1375
+ ) : u === "lifetime" ? N(
1376
+ "ecommerce.checkout_billing_cycle_lifetime",
1377
+ "Lifetime subscription"
1378
+ ) : null;
1379
+ return /* @__PURE__ */ r("div", { className: "container mx-auto px-4 py-12 md:px-6", children: [
1380
+ _t,
1381
+ /* @__PURE__ */ r("div", { className: "mx-auto max-w-6xl", children: [
1382
+ /* @__PURE__ */ e("h1", { className: "mb-8 text-3xl font-bold", children: g("ecommerce.checkout") }),
1383
+ /* @__PURE__ */ r("div", { className: "grid gap-8 lg:grid-cols-12 lg:items-start", children: [
1384
+ /* @__PURE__ */ r("div", { className: "lg:col-span-8 space-y-6", children: [
1385
+ /* @__PURE__ */ r(ye, { children: [
1386
+ /* @__PURE__ */ e(be, { children: /* @__PURE__ */ r(xe, { className: "flex items-center gap-2", children: [
1387
+ /* @__PURE__ */ e(zr, { className: "w-5 h-5" }),
1388
+ g("ecommerce.contact_information")
1389
+ ] }) }),
1390
+ /* @__PURE__ */ r(ve, { className: "space-y-4", children: [
1391
+ ge ? /* @__PURE__ */ e("div", { className: "rounded-xl border bg-muted/20 p-4 text-sm text-muted-foreground", children: g("checkout_prefill_notice", { email: t?.email || "" }) }) : /* @__PURE__ */ r("div", { className: "space-y-2", children: [
1392
+ /* @__PURE__ */ r(A, { htmlFor: "checkout-email", children: [
1393
+ g("ecommerce.email_address"),
1394
+ " ",
1395
+ /* @__PURE__ */ e("span", { className: "text-destructive", children: "*" })
1396
+ ] }),
1397
+ /* @__PURE__ */ e(
1398
+ U,
1399
+ {
1400
+ id: "checkout-email",
1401
+ type: "email",
1402
+ placeholder: g("ecommerce.email_placeholder"),
1403
+ value: m,
1404
+ onChange: (u) => {
1405
+ _(u.target.value), y && h("");
1406
+ },
1407
+ required: !0
1408
+ }
1409
+ ),
1410
+ y ? /* @__PURE__ */ e("p", { className: "text-xs text-destructive mt-1", children: y }) : null
1411
+ ] }),
1412
+ /* @__PURE__ */ r("div", { className: "space-y-2", children: [
1413
+ /* @__PURE__ */ e(A, { htmlFor: "checkout-phone", children: g("phone_number") }),
1414
+ /* @__PURE__ */ e(
1415
+ U,
1416
+ {
1417
+ id: "checkout-phone",
1418
+ placeholder: g("optional"),
1419
+ value: p,
1420
+ onChange: (u) => f(u.target.value)
1421
+ }
1422
+ )
1423
+ ] })
1424
+ ] })
1425
+ ] }),
1426
+ /* @__PURE__ */ e(
1427
+ Lt,
1428
+ {
1429
+ idPrefix: "billing",
1430
+ title: g("billing_address"),
1431
+ description: g("checkout_billing_address_help"),
1432
+ value: V,
1433
+ onChange: B
1434
+ }
1435
+ ),
1436
+ ae ? /* @__PURE__ */ r("div", { className: "flex items-center space-x-3 rounded-xl border bg-muted/20 p-4", children: [
1437
+ /* @__PURE__ */ e(
1438
+ nr,
1439
+ {
1440
+ id: "use-billing-for-shipping",
1441
+ checked: J,
1442
+ onCheckedChange: (u) => Re(!!u)
1443
+ }
1444
+ ),
1445
+ /* @__PURE__ */ r("div", { className: "space-y-1", children: [
1446
+ /* @__PURE__ */ e(A, { htmlFor: "use-billing-for-shipping", className: "cursor-pointer", children: g("use_billing_for_shipping") }),
1447
+ /* @__PURE__ */ e("p", { className: "text-sm text-muted-foreground", children: g("checkout_use_billing_for_shipping_help") })
1448
+ ] })
1449
+ ] }) : null,
1450
+ ae && !J ? /* @__PURE__ */ e(
1451
+ Lt,
1452
+ {
1453
+ idPrefix: "shipping",
1454
+ title: g("shipping_address"),
1455
+ description: g("checkout_shipping_address_help"),
1456
+ value: Q,
1457
+ onChange: he
1458
+ }
1459
+ ) : null,
1460
+ ae ? /* @__PURE__ */ r(ye, { children: [
1461
+ /* @__PURE__ */ e(be, { children: /* @__PURE__ */ r(xe, { className: "flex items-center gap-2", children: [
1462
+ /* @__PURE__ */ e(Mr, { className: "w-5 h-5 text-primary" }),
1463
+ g("ecommerce.shipping_method")
1464
+ ] }) }),
1465
+ /* @__PURE__ */ e(ve, { children: F ? /* @__PURE__ */ e("div", { className: "flex items-center justify-center py-6", children: /* @__PURE__ */ e(Ve, { className: "w-6 h-6 animate-spin text-muted-foreground" }) }) : S.length > 0 ? /* @__PURE__ */ e("div", { className: "space-y-3", children: S.map((u) => /* @__PURE__ */ r(
1466
+ "div",
1467
+ {
1468
+ onClick: () => q(u.id),
1469
+ className: `flex items-center justify-between p-4 rounded-lg border-2 cursor-pointer transition-all ${$ === u.id ? "border-primary bg-primary/5" : "border-neutral-100 hover:border-neutral-200"}`,
1470
+ children: [
1471
+ /* @__PURE__ */ r("div", { className: "flex items-center gap-3", children: [
1472
+ /* @__PURE__ */ e(
1473
+ "div",
1474
+ {
1475
+ className: `w-4 h-4 rounded-full border flex items-center justify-center ${$ === u.id ? "border-primary" : "border-neutral-300"}`,
1476
+ children: $ === u.id ? /* @__PURE__ */ e("div", { className: "w-2 h-2 rounded-full bg-primary" }) : null
1477
+ }
1478
+ ),
1479
+ /* @__PURE__ */ e("span", { className: "font-medium", children: u.name })
1480
+ ] }),
1481
+ /* @__PURE__ */ e("span", { className: "font-bold", children: w(u.amount, x) })
1482
+ ]
1483
+ },
1484
+ u.id
1485
+ )) }) : /* @__PURE__ */ e("div", { className: "py-4 text-center text-muted-foreground bg-muted/30 rounded-lg italic", children: Le ? g("ecommerce.no_rates_for_region") : N(
1486
+ "ecommerce.waiting_on_address_info",
1487
+ "Complete your shipping address to view available shipping options."
1488
+ ) }) })
1489
+ ] }) : null
1490
+ ] }),
1491
+ /* @__PURE__ */ r("div", { className: "lg:col-span-4 space-y-6", children: [
1492
+ /* @__PURE__ */ r(ye, { className: "top-6", children: [
1493
+ /* @__PURE__ */ e(be, { children: /* @__PURE__ */ e(xe, { children: g("ecommerce.order_summary") }) }),
1494
+ /* @__PURE__ */ r(ve, { className: "space-y-4", children: [
1495
+ /* @__PURE__ */ e("div", { className: "space-y-3 max-h-[260px] overflow-y-auto pr-2", children: te.map((u) => {
1496
+ const T = Ce(u, {
1497
+ currencyCode: x,
1498
+ currencies: ne
1499
+ }), z = pe(u);
1500
+ return /* @__PURE__ */ r("div", { className: "flex items-start justify-between gap-4", children: [
1501
+ /* @__PURE__ */ r("div", { className: "flex gap-3", children: [
1502
+ u.image_url ? /* @__PURE__ */ e("div", { className: "h-10 w-10 shrink-0 overflow-hidden rounded border bg-neutral-100", children: /* @__PURE__ */ e("img", { src: u.image_url, alt: u.title, className: "h-full w-full object-cover" }) }) : null,
1503
+ /* @__PURE__ */ r("div", { className: "grid gap-0.5", children: [
1504
+ /* @__PURE__ */ r("div", { className: "flex items-center gap-2", children: [
1505
+ /* @__PURE__ */ e("span", { className: "font-medium text-xs line-clamp-1", children: u.title }),
1506
+ /* @__PURE__ */ e(ie, { variant: "outline", className: "text-[9px] uppercase", children: wr(u) })
1507
+ ] }),
1508
+ u.variant_label ? /* @__PURE__ */ e("span", { className: "text-[10px] text-muted-foreground line-clamp-1", children: u.variant_label }) : null,
1509
+ /* @__PURE__ */ r("span", { className: "text-[10px] text-muted-foreground", children: [
1510
+ g("ecommerce.qty"),
1511
+ ": ",
1512
+ u.quantity
1513
+ ] }),
1514
+ z ? /* @__PURE__ */ r("span", { className: "text-[10px] font-medium text-emerald-700", children: [
1515
+ z.label,
1516
+ " - ",
1517
+ z.paymentRequirementLabel
1518
+ ] }) : null
1519
+ ] })
1520
+ ] }),
1521
+ /* @__PURE__ */ r("div", { className: "flex flex-col items-end gap-0.5 shrink-0", children: [
1522
+ /* @__PURE__ */ e("span", { className: "font-medium text-xs", children: w(
1523
+ (T.sale_price ?? T.price) * u.quantity,
1524
+ x
1525
+ ) }),
1526
+ T.sale_price ? /* @__PURE__ */ e("span", { className: "text-[9px] text-muted-foreground line-through", children: w(T.price * u.quantity, x) }) : null
1527
+ ] })
1528
+ ] }, `${u.id}-${u.variant_id || "base"}`);
1529
+ }) }),
1530
+ /* @__PURE__ */ e(mt, {}),
1531
+ /* @__PURE__ */ e(
1532
+ pt,
1533
+ {
1534
+ items: te,
1535
+ currencyCode: x,
1536
+ onQuoteChange: X
1537
+ }
1538
+ ),
1539
+ /* @__PURE__ */ r("div", { className: "space-y-2 text-sm", children: [
1540
+ /* @__PURE__ */ r("div", { className: "flex justify-between", children: [
1541
+ /* @__PURE__ */ e("span", { children: g("ecommerce.subtotal") }),
1542
+ /* @__PURE__ */ e("span", { children: w(_r, x) })
1543
+ ] }),
1544
+ re.length > 0 ? /* @__PURE__ */ r("div", { className: "flex justify-between text-muted-foreground", children: [
1545
+ /* @__PURE__ */ e("span", { children: N(
1546
+ "ecommerce.physical_products",
1547
+ "Physical products"
1548
+ ) }),
1549
+ /* @__PURE__ */ e("span", { children: w(Je, x) })
1550
+ ] }) : null,
1551
+ se.length > 0 ? /* @__PURE__ */ r("div", { className: "flex justify-between text-muted-foreground", children: [
1552
+ /* @__PURE__ */ e("span", { children: N(
1553
+ "ecommerce.digital_products",
1554
+ "Digital products"
1555
+ ) }),
1556
+ /* @__PURE__ */ e("span", { children: w(We, x) })
1557
+ ] }) : null,
1558
+ C ? /* @__PURE__ */ r("div", { className: "flex justify-between text-emerald-600", children: [
1559
+ /* @__PURE__ */ r("span", { children: [
1560
+ N("ecommerce.discount", "Discount"),
1561
+ " (",
1562
+ C.code,
1563
+ ")"
1564
+ ] }),
1565
+ /* @__PURE__ */ r("span", { children: [
1566
+ "-",
1567
+ w(C.discountTotal, x)
1568
+ ] })
1569
+ ] }) : null,
1570
+ (re.length > 0 || se.length > 0) && /* @__PURE__ */ r("div", { className: "flex justify-between font-bold text-lg pt-2 border-t mt-2", children: [
1571
+ /* @__PURE__ */ e("span", { children: N(
1572
+ "ecommerce.estimated_total",
1573
+ "Estimated total"
1574
+ ) }),
1575
+ /* @__PURE__ */ e("span", { className: "text-primary", children: w(br, x) })
1576
+ ] })
1577
+ ] })
1578
+ ] })
1579
+ ] }),
1580
+ re.length > 0 ? /* @__PURE__ */ r(
1581
+ It,
1582
+ {
1583
+ title: N(
1584
+ "ecommerce.stripe_checkout_title",
1585
+ "Stripe Checkout"
1586
+ ),
1587
+ description: N(
1588
+ "ecommerce.stripe_checkout_description",
1589
+ "Pay for physical products in one Stripe checkout session."
1590
+ ),
1591
+ badgeLabel: Nr,
1592
+ children: [
1593
+ /* @__PURE__ */ r("div", { className: "space-y-2 text-sm", children: [
1594
+ /* @__PURE__ */ r("div", { className: "flex justify-between", children: [
1595
+ /* @__PURE__ */ e("span", { children: N(
1596
+ "ecommerce.physical_subtotal",
1597
+ "Physical subtotal"
1598
+ ) }),
1599
+ /* @__PURE__ */ e("span", { children: w(Je, x) })
1600
+ ] }),
1601
+ Qe > 0 ? /* @__PURE__ */ r("div", { className: "flex justify-between text-emerald-600", children: [
1602
+ /* @__PURE__ */ e("span", { children: N("ecommerce.discount", "Discount") }),
1603
+ /* @__PURE__ */ r("span", { children: [
1604
+ "-",
1605
+ w(Qe, x)
1606
+ ] })
1607
+ ] }) : null,
1608
+ /* @__PURE__ */ r("div", { className: "flex justify-between", children: [
1609
+ /* @__PURE__ */ e("span", { children: g("ecommerce.shipping") }),
1610
+ /* @__PURE__ */ e("span", { children: Ie ? w(Ie.amount, x) : "-" })
1611
+ ] }),
1612
+ /* @__PURE__ */ r("div", { className: "flex justify-between", children: [
1613
+ /* @__PURE__ */ e("span", { children: N("ecommerce.tax", "Tax") }),
1614
+ /* @__PURE__ */ e("span", { children: R ? "..." : P?.isPendingExternalCalculation ? N(
1615
+ "ecommerce.tax_calculated_on_stripe",
1616
+ "Calculated on Stripe"
1617
+ ) : P ? w(P.amount, x) : "-" })
1618
+ ] }),
1619
+ P && P.lines.length > 0 ? /* @__PURE__ */ e("div", { className: "rounded-lg bg-muted/20 px-3 py-2 text-xs text-muted-foreground", children: P.lines.map((u) => /* @__PURE__ */ r("div", { className: "flex justify-between gap-3", children: [
1620
+ /* @__PURE__ */ r("span", { children: [
1621
+ u.name,
1622
+ " (",
1623
+ u.rate.toFixed(4),
1624
+ "%)"
1625
+ ] }),
1626
+ /* @__PURE__ */ e("span", { children: w(u.amount, x) })
1627
+ ] }, u.id || `${u.name}-${u.rate}`)) }) : null,
1628
+ /* @__PURE__ */ r("div", { className: "flex justify-between font-semibold pt-2 border-t", children: [
1629
+ /* @__PURE__ */ e("span", { children: N(
1630
+ "ecommerce.total_on_stripe",
1631
+ "Total on Stripe"
1632
+ ) }),
1633
+ /* @__PURE__ */ e("span", { children: w(ft, x) })
1634
+ ] })
1635
+ ] }),
1636
+ /* @__PURE__ */ r(
1637
+ D,
1638
+ {
1639
+ className: "w-full",
1640
+ size: "lg",
1641
+ onClick: () => yt("stripe", re, "stripe"),
1642
+ disabled: vr,
1643
+ children: [
1644
+ a === "stripe" ? /* @__PURE__ */ e(Ve, { className: "mr-2 h-4 w-4 animate-spin" }) : /* @__PURE__ */ e(Bt, { className: "mr-2 h-4 w-4" }),
1645
+ a === "stripe" ? g("ecommerce.processing") : N(
1646
+ "ecommerce.checkout_physical_products",
1647
+ "Checkout Physical Products"
1648
+ )
1649
+ ]
1650
+ }
1651
+ ),
1652
+ Ye && a === null ? /* @__PURE__ */ e("p", { className: "text-[11px] text-muted-foreground", children: Ye }) : null,
1653
+ c.stripe ? /* @__PURE__ */ e("div", { className: "rounded-lg border border-destructive/20 bg-destructive/10 px-3 py-2 text-xs text-destructive", children: c.stripe }) : null,
1654
+ /* @__PURE__ */ e("p", { className: "text-[11px] text-muted-foreground", children: P?.isPendingExternalCalculation ? N(
1655
+ "checkout_stripe_tax_finalized_notice",
1656
+ "Tax will be finalized by Stripe Tax on the payment step."
1657
+ ) : N(
1658
+ "ecommerce.shipping_taxes_collected_on_stripe",
1659
+ "Shipping and taxes are only collected during the Stripe step for physical products."
1660
+ ) })
1661
+ ]
1662
+ }
1663
+ ) : null,
1664
+ se.length > 0 ? /* @__PURE__ */ r(
1665
+ It,
1666
+ {
1667
+ title: N(
1668
+ "ecommerce.freemius_checkout_title",
1669
+ "Freemius Checkout"
1670
+ ),
1671
+ description: N(
1672
+ "ecommerce.freemius_checkout_description",
1673
+ "Digital products use the Freemius checkout flow."
1674
+ ),
1675
+ badgeLabel: Cr,
1676
+ children: [
1677
+ /* @__PURE__ */ e("div", { className: "space-y-3", children: se.map((u) => {
1678
+ const T = Ce(u, {
1679
+ currencyCode: x,
1680
+ currencies: ne
1681
+ }), z = pe(u), O = `freemius:${u.id}`, K = z ? n[O] || "paid" : void 0;
1682
+ return /* @__PURE__ */ r("div", { className: "rounded-lg border p-3 space-y-3", children: [
1683
+ /* @__PURE__ */ r("div", { className: "flex items-start justify-between gap-3", children: [
1684
+ /* @__PURE__ */ r("div", { children: [
1685
+ /* @__PURE__ */ e("p", { className: "font-medium", children: u.title }),
1686
+ u.billing_cycle ? /* @__PURE__ */ e("p", { className: "text-xs text-muted-foreground capitalize", children: kr(u.billing_cycle) }) : null,
1687
+ z ? /* @__PURE__ */ r("p", { className: "text-xs font-medium text-emerald-700", children: [
1688
+ z.label,
1689
+ " - ",
1690
+ z.paymentRequirementLabel
1691
+ ] }) : null
1692
+ ] }),
1693
+ /* @__PURE__ */ e("span", { className: "font-medium", children: w(T.sale_price ?? T.price, x) })
1694
+ ] }),
1695
+ z && !u.trial_requires_payment_method && /* @__PURE__ */ r("div", { className: "bg-muted/30 p-3 rounded-md border text-sm mt-2 mb-3", children: [
1696
+ /* @__PURE__ */ e("p", { className: "font-medium mb-3", children: N(
1697
+ "ecommerce.freemius_trial_preference_title",
1698
+ "How would you like to start your trial?"
1699
+ ) }),
1700
+ /* @__PURE__ */ r(
1701
+ hs,
1702
+ {
1703
+ value: n[O] || "paid",
1704
+ onValueChange: (M) => s((I) => ({ ...I, [O]: M })),
1705
+ className: "gap-3",
1706
+ children: [
1707
+ /* @__PURE__ */ r("div", { className: "flex items-start space-x-3", children: [
1708
+ /* @__PURE__ */ e(Ft, { value: "paid", id: `${O}-paid`, className: "mt-1" }),
1709
+ /* @__PURE__ */ r("div", { className: "grid gap-1.5", children: [
1710
+ /* @__PURE__ */ e(A, { htmlFor: `${O}-paid`, className: "font-medium leading-none cursor-pointer", children: N(
1711
+ "ecommerce.freemius_trial_with_card",
1712
+ "Enter Payment Details Now (Still get full trial length free)"
1713
+ ) }),
1714
+ /* @__PURE__ */ e("p", { className: "text-xs text-muted-foreground", children: N(
1715
+ "ecommerce.freemius_trial_with_card_help",
1716
+ "You will not be billed until the trial ends. Cancel anytime."
1717
+ ) })
1718
+ ] })
1719
+ ] }),
1720
+ /* @__PURE__ */ r("div", { className: "flex items-start space-x-3", children: [
1721
+ /* @__PURE__ */ e(Ft, { value: "free", id: `${O}-free`, className: "mt-1" }),
1722
+ /* @__PURE__ */ e("div", { className: "grid gap-1.5", children: /* @__PURE__ */ e(A, { htmlFor: `${O}-free`, className: "font-medium leading-none cursor-pointer", children: N(
1723
+ "ecommerce.freemius_trial_no_card",
1724
+ "Start Free Trial (No card required)"
1725
+ ) }) })
1726
+ ] })
1727
+ ]
1728
+ }
1729
+ )
1730
+ ] }),
1731
+ /* @__PURE__ */ r(
1732
+ D,
1733
+ {
1734
+ className: "w-full h-auto min-h-[2.75rem] py-2",
1735
+ variant: se.length > 1 ? "outline" : "default",
1736
+ onClick: () => yt(
1737
+ "freemius",
1738
+ [
1739
+ {
1740
+ ...u,
1741
+ ...K ? { trial_preference: K } : {}
1742
+ }
1743
+ ],
1744
+ O
1745
+ ),
1746
+ disabled: a !== null,
1747
+ children: [
1748
+ a === O ? /* @__PURE__ */ e(Ve, { className: "mr-2 h-4 w-4 shrink-0 animate-spin" }) : /* @__PURE__ */ e(Ht, { className: "mr-2 h-4 w-4 shrink-0" }),
1749
+ /* @__PURE__ */ e("span", { className: "whitespace-normal text-left", children: a === O ? g("ecommerce.processing") : se.length > 1 ? N(
1750
+ "ecommerce.checkout_product",
1751
+ "Checkout {title}",
1752
+ { title: u.title }
1753
+ ) : N(
1754
+ "ecommerce.checkout_digital_product",
1755
+ "Checkout Digital Product"
1756
+ ) })
1757
+ ]
1758
+ }
1759
+ )
1760
+ ] }, O);
1761
+ }) }),
1762
+ /* @__PURE__ */ r("div", { className: "flex justify-between text-sm font-semibold border-t pt-3", children: [
1763
+ /* @__PURE__ */ e("span", { children: N(
1764
+ "ecommerce.digital_subtotal",
1765
+ "Digital subtotal"
1766
+ ) }),
1767
+ /* @__PURE__ */ e("span", { children: w(We, x) })
1768
+ ] }),
1769
+ Xe > 0 ? /* @__PURE__ */ r("div", { className: "flex justify-between text-sm font-semibold text-emerald-600", children: [
1770
+ /* @__PURE__ */ e("span", { children: N("ecommerce.discount", "Discount") }),
1771
+ /* @__PURE__ */ r("span", { children: [
1772
+ "-",
1773
+ w(Xe, x)
1774
+ ] })
1775
+ ] }) : null,
1776
+ c.freemius ? /* @__PURE__ */ e("div", { className: "rounded-lg border border-destructive/20 bg-destructive/10 px-3 py-2 text-xs text-destructive", children: c.freemius }) : null,
1777
+ /* @__PURE__ */ e("p", { className: "text-[11px] text-muted-foreground", children: se.length > 1 ? N(
1778
+ "ecommerce.freemius_multi_checkout_notice",
1779
+ "Freemius licenses are completed one at a time, so each digital product gets its own checkout action."
1780
+ ) : N(
1781
+ "ecommerce.freemius_tax_notice",
1782
+ "Taxes and compliance for digital products are handled inside the Freemius checkout."
1783
+ ) })
1784
+ ]
1785
+ }
1786
+ ) : null
1787
+ ] })
1788
+ ] })
1789
+ ] })
1790
+ ] });
1791
+ }, ba = () => {
1792
+ const t = Te((a) => a.toggleCart), n = vs();
1793
+ return ue((a) => a.isOpen) !== void 0 ? /* @__PURE__ */ r(
1794
+ D,
1795
+ {
1796
+ variant: "ghost",
1797
+ size: "icon",
1798
+ className: "relative",
1799
+ onClick: t,
1800
+ "aria-label": "Open cart",
1801
+ children: [
1802
+ /* @__PURE__ */ e(Nt, { className: "h-5 w-5" }),
1803
+ n > 0 && /* @__PURE__ */ e(
1804
+ ie,
1805
+ {
1806
+ variant: "destructive",
1807
+ className: "absolute -right-1 -top-1 h-4 w-4 items-center justify-center p-0 text-[10px]",
1808
+ children: n
1809
+ }
1810
+ )
1811
+ ]
1812
+ }
1813
+ ) : /* @__PURE__ */ e(D, { variant: "ghost", size: "icon", className: "relative", "aria-label": "Open cart", children: /* @__PURE__ */ e(Nt, { className: "h-5 w-5" }) });
1814
+ };
1815
+ function xa() {
1816
+ const {
1817
+ activeCurrencyCode: t,
1818
+ currencies: n,
1819
+ setActiveCurrencyCode: s
1820
+ } = le();
1821
+ return n.length <= 1 ? null : /* @__PURE__ */ r(lr, { value: t, onValueChange: s, children: [
1822
+ /* @__PURE__ */ e(cr, { className: "h-9 w-[88px] text-xs font-semibold", children: /* @__PURE__ */ e(ir, { placeholder: t }) }),
1823
+ /* @__PURE__ */ e(or, { children: n.map((a) => /* @__PURE__ */ e(De, { value: a.code, children: a.code }, a.code)) })
1824
+ ] });
1825
+ }
1826
+ const ht = ({ product: t, className: n, quantity: s }) => {
1827
+ const a = ue((y) => y), { t: l } = Z(), { activeCurrencyCode: c } = le();
1828
+ if (!!t.has_variants && !t.variant_id && !Yt(t))
1829
+ return /* @__PURE__ */ e(D, { asChild: !0, className: n, children: /* @__PURE__ */ e(Se, { href: `/product/${t.slug}`, children: "Select Options" }) });
1830
+ if (!a)
1831
+ return /* @__PURE__ */ r(D, { disabled: !0, className: n, children: [
1832
+ /* @__PURE__ */ e(nt, { className: "mr-2 h-4 w-4" }),
1833
+ l("ecommerce.add_to_cart")
1834
+ ] });
1835
+ const { addItem: m } = a;
1836
+ return /* @__PURE__ */ r(D, { onClick: () => {
1837
+ const y = as(t) ?? "stripe", { success: h, error: p } = m({
1838
+ id: t.variant_id || t.id,
1839
+ product_id: t.id,
1840
+ title: t.title,
1841
+ price: t.price,
1842
+ prices: t.prices,
1843
+ sale_price: t.sale_price,
1844
+ sale_prices: t.sale_prices,
1845
+ is_taxable: t.is_taxable,
1846
+ image_url: t.image_url,
1847
+ slug: t.slug,
1848
+ sku: t.sku,
1849
+ stock: t.stock,
1850
+ language_id: t.language_id,
1851
+ translation_group_id: t.translation_group_id,
1852
+ product_type: t.product_type,
1853
+ payment_provider: t.payment_provider ?? y,
1854
+ provider: y,
1855
+ freemius_product_id: t.freemius_product_id,
1856
+ // include just in case it wasn't intercepted
1857
+ freemius_plan_id: t.freemius_plan_id,
1858
+ trial_period_days: t.trial_period_days ?? 0,
1859
+ trial_requires_payment_method: t.trial_requires_payment_method ?? !1,
1860
+ has_variants: t.has_variants,
1861
+ variant_id: t.variant_id,
1862
+ variant_label: t.variant_label,
1863
+ selected_options: t.selected_options,
1864
+ currency_code: c,
1865
+ quantity: s
1866
+ });
1867
+ h ? He.success(l("ecommerce.added_to_cart_success", { item: t.title })) : He.error(p || l("ecommerce.added_to_cart_error"));
1868
+ }, className: n, children: [
1869
+ /* @__PURE__ */ e(nt, { className: "mr-2 h-4 w-4" }),
1870
+ l("ecommerce.add_to_cart")
1871
+ ] });
1872
+ }, Fs = ({ product: t, className: n }) => {
1873
+ const { activeCurrencyCode: s, currencies: a } = le(), l = Zt({
1874
+ entries: t.variants?.length ? t.variants : t.product_variants?.length ? t.product_variants : [],
1875
+ currencyCode: s,
1876
+ currencies: a
1877
+ }), c = !!(t.has_variants && l), o = ke({
1878
+ prices: t.prices,
1879
+ salePrices: t.sale_prices,
1880
+ fallbackPrice: t.price,
1881
+ fallbackSalePrice: t.sale_price,
1882
+ saleStartAt: t.sale_start_at,
1883
+ saleEndAt: t.sale_end_at,
1884
+ scheduledPrice: t.scheduled_price,
1885
+ scheduledPrices: t.scheduled_prices,
1886
+ scheduledPriceAt: t.scheduled_price_at,
1887
+ currencyCode: s,
1888
+ currencies: a
1889
+ }), m = c && l ? l.min === l.max ? w(l.min, s) : `${w(l.min, s)} - ${w(
1890
+ l.max,
1891
+ s
1892
+ )}` : w(o.sale_price ?? o.price, s), _ = t.variants?.length ? t.variants : t.product_variants?.length ? t.product_variants : [], y = c ? _.some(
1893
+ (i) => ke({
1894
+ prices: i.prices,
1895
+ salePrices: i.sale_prices,
1896
+ fallbackPrice: i.price,
1897
+ fallbackSalePrice: i.sale_price,
1898
+ saleStartAt: i.sale_start_at,
1899
+ saleEndAt: i.sale_end_at,
1900
+ scheduledPrice: i.scheduled_price,
1901
+ scheduledPrices: i.scheduled_prices,
1902
+ scheduledPriceAt: i.scheduled_price_at,
1903
+ currencyCode: s,
1904
+ currencies: a
1905
+ }).sale_price != null
1906
+ ) : o.sale_price != null, { t: h, lang: p } = Z(), f = h("ecommerce.on_sale"), b = f === "ecommerce.on_sale" ? "On Sale" : f, d = pe(t), v = t.freemius_plans?.[0]?.freemius_pricing?.[0], F = a.find((i) => i.is_default)?.code || "USD", j = v?.override_monthly_price ?? v?.api_monthly_price, R = v?.override_annual_price ?? v?.api_annual_price, L = typeof j == "number" ? St({
1907
+ prices: {
1908
+ [F]: me(
1909
+ j,
1910
+ F
1911
+ )
1912
+ },
1913
+ currencyCode: s,
1914
+ currencies: a
1915
+ }) : null, S = typeof R == "number" ? St({
1916
+ prices: {
1917
+ [F]: me(
1918
+ R,
1919
+ F
1920
+ )
1921
+ },
1922
+ currencyCode: s,
1923
+ currencies: a
1924
+ }) : null;
1925
+ return /* @__PURE__ */ r("div", { className: oe("group relative flex flex-col overflow-hidden rounded-lg border bg-card text-card-foreground shadow-sm transition-all hover:shadow-md", n), children: [
1926
+ /* @__PURE__ */ r(Se, { href: `/product/${t.slug}`, className: "relative aspect-square overflow-hidden bg-muted", children: [
1927
+ y && /* @__PURE__ */ e("span", { className: "absolute left-3 top-3 z-10 rounded-full bg-destructive px-2.5 py-1 text-[10px] font-bold uppercase tracking-wider text-destructive-foreground shadow-sm", children: b }),
1928
+ t.image_url ? /* @__PURE__ */ e(
1929
+ "img",
1930
+ {
1931
+ src: t.image_url,
1932
+ alt: t.title,
1933
+ className: "h-full w-full object-cover object-center transition-transform duration-300 group-hover:scale-105"
1934
+ }
1935
+ ) : /* @__PURE__ */ e("div", { className: "flex h-full items-center justify-center text-muted-foreground", children: "No Image" })
1936
+ ] }),
1937
+ /* @__PURE__ */ r("div", { className: "flex flex-1 flex-col p-4", children: [
1938
+ t.categories && t.categories.length > 0 && /* @__PURE__ */ e("div", { className: "text-[10px] font-bold uppercase tracking-widest text-amber-600 dark:text-amber-400 mb-1", children: t.categories.map((i) => er(i.name, i.name_translations, p)).join(" • ") }),
1939
+ /* @__PURE__ */ e(Se, { href: `/product/${t.slug}`, className: "mb-2", children: /* @__PURE__ */ e("h3", { className: "line-clamp-1 text-lg font-medium text-foreground group-hover:underline", children: t.title }) }),
1940
+ /* @__PURE__ */ e("div", { className: "mb-4", children: t.product_type === "digital" && (L || S) ? /* @__PURE__ */ r("div", { className: "flex flex-wrap items-baseline gap-x-3 gap-y-1", children: [
1941
+ L && /* @__PURE__ */ r("div", { className: "flex items-baseline gap-0.5", children: [
1942
+ /* @__PURE__ */ e("span", { className: "text-xl font-bold text-primary", children: w(L.price, s) }),
1943
+ /* @__PURE__ */ r("span", { className: "text-xs font-medium text-muted-foreground lowercase", children: [
1944
+ "/ ",
1945
+ h("ecommerce.month")
1946
+ ] })
1947
+ ] }),
1948
+ S && /* @__PURE__ */ r("div", { className: "flex items-baseline gap-0.5", children: [
1949
+ /* @__PURE__ */ e("span", { className: oe("font-bold text-primary", L ? "text-lg" : "text-xl"), children: w(S.price, s) }),
1950
+ /* @__PURE__ */ r("span", { className: "text-xs font-medium text-muted-foreground lowercase", children: [
1951
+ "/ ",
1952
+ h("ecommerce.year")
1953
+ ] })
1954
+ ] })
1955
+ ] }) : /* @__PURE__ */ r("div", { className: "flex items-baseline gap-2", children: [
1956
+ /* @__PURE__ */ e("span", { className: "text-xl font-bold text-primary", children: m }),
1957
+ !c && o.sale_price && /* @__PURE__ */ e("span", { className: "text-sm text-muted-foreground line-through", children: w(o.price, s) })
1958
+ ] }) }),
1959
+ d && /* @__PURE__ */ r("div", { className: "mb-4 rounded-md border border-emerald-200 bg-emerald-50 px-3 py-2 text-xs text-emerald-900", children: [
1960
+ /* @__PURE__ */ e("div", { className: "font-semibold", children: d.label }),
1961
+ /* @__PURE__ */ e("div", { className: "text-emerald-700", children: d.paymentRequirementLabel })
1962
+ ] }),
1963
+ /* @__PURE__ */ e("div", { className: "mt-auto", children: /* @__PURE__ */ e(
1964
+ ht,
1965
+ {
1966
+ product: {
1967
+ ...t,
1968
+ price: t.price,
1969
+ prices: t.prices,
1970
+ sale_price: t.sale_price,
1971
+ sale_prices: t.sale_prices
1972
+ },
1973
+ className: "w-full"
1974
+ }
1975
+ ) })
1976
+ ] })
1977
+ ] });
1978
+ }, va = ({ products: t, columns: n = 3, className: s }) => t.length ? /* @__PURE__ */ e(
1979
+ "div",
1980
+ {
1981
+ className: oe(
1982
+ "grid gap-6 sm:grid-cols-2",
1983
+ n === 3 && "lg:grid-cols-3",
1984
+ n === 4 && "lg:grid-cols-4",
1985
+ s
1986
+ ),
1987
+ children: t.map((a) => /* @__PURE__ */ e(Fs, { product: a }, a.id))
1988
+ }
1989
+ ) : /* @__PURE__ */ e("div", { className: "py-12 text-center text-muted-foreground", children: "No products found." }), Ts = ({ images: t = [], className: n }) => {
1990
+ const [s, a] = k(0);
1991
+ return G(() => {
1992
+ a(0);
1993
+ }, [t]), t.length ? /* @__PURE__ */ r("div", { className: oe("flex flex-col gap-4", n), children: [
1994
+ /* @__PURE__ */ e("div", { className: "relative aspect-square w-full overflow-hidden rounded-lg border bg-white", children: /* @__PURE__ */ e(
1995
+ "img",
1996
+ {
1997
+ src: t[s].url,
1998
+ alt: t[s].alt,
1999
+ className: "h-full w-full object-cover object-center"
2000
+ }
2001
+ ) }),
2002
+ t.length > 1 && /* @__PURE__ */ e("div", { className: "flex gap-4 overflow-x-auto pb-2", children: t.map((l, c) => /* @__PURE__ */ e(
2003
+ "button",
2004
+ {
2005
+ onClick: () => a(c),
2006
+ className: oe(
2007
+ "relative aspect-square w-20 flex-shrink-0 overflow-hidden rounded-md border",
2008
+ s === c ? "ring-2 ring-primary" : "ring-1 ring-transparent hover:ring-primary/50"
2009
+ ),
2010
+ children: /* @__PURE__ */ e(
2011
+ "img",
2012
+ {
2013
+ src: l.url,
2014
+ alt: l.alt,
2015
+ className: "h-full w-full object-cover object-center"
2016
+ }
2017
+ )
2018
+ },
2019
+ c
2020
+ )) })
2021
+ ] }) : /* @__PURE__ */ e("div", { className: oe("relative aspect-square w-full overflow-hidden rounded-lg bg-secondary", n), children: /* @__PURE__ */ e("div", { className: "flex h-full items-center justify-center text-muted-foreground", children: "No Image" }) });
2022
+ }, Na = ({ product: t, className: n, imagePosition: s = "left" }) => {
2023
+ const { t: a } = Z(), { activeCurrencyCode: l, currencies: c } = le(), o = Zt({
2024
+ entries: t.variants?.length ? t.variants : t.product_variants?.length ? t.product_variants : [],
2025
+ currencyCode: l,
2026
+ currencies: c
2027
+ }), m = !!(t.has_variants && o), _ = ke({
2028
+ prices: t.prices,
2029
+ salePrices: t.sale_prices,
2030
+ fallbackPrice: t.price,
2031
+ fallbackSalePrice: t.sale_price,
2032
+ saleStartAt: t.sale_start_at,
2033
+ saleEndAt: t.sale_end_at,
2034
+ scheduledPrice: t.scheduled_price,
2035
+ scheduledPrices: t.scheduled_prices,
2036
+ scheduledPriceAt: t.scheduled_price_at,
2037
+ currencyCode: l,
2038
+ currencies: c
2039
+ }), y = m && o ? o.min === o.max ? w(o.min, l) : `${w(o.min, l)} - ${w(
2040
+ o.max,
2041
+ l
2042
+ )}` : w(_.sale_price ?? _.price, l), h = pe(t);
2043
+ return /* @__PURE__ */ e("div", { className: oe("overflow-hidden rounded-xl border bg-card shadow-sm", n), children: /* @__PURE__ */ r("div", { className: oe("flex flex-col gap-8 md:flex-row", s === "right" && "md:flex-row-reverse"), children: [
2044
+ /* @__PURE__ */ e("div", { className: "relative aspect-square w-full md:w-1/2", children: t.image_url ? /* @__PURE__ */ e(
2045
+ "img",
2046
+ {
2047
+ src: t.image_url,
2048
+ alt: t.title,
2049
+ className: "h-full w-full object-cover"
2050
+ }
2051
+ ) : /* @__PURE__ */ e("div", { className: "flex h-full w-full items-center justify-center bg-secondary text-muted-foreground", children: a("ecommerce.no_image") }) }),
2052
+ /* @__PURE__ */ r("div", { className: "flex flex-1 flex-col justify-center p-6 md:p-12", children: [
2053
+ /* @__PURE__ */ e(Se, { href: `/product/${t.slug}`, children: /* @__PURE__ */ e("h2", { className: "mb-4 text-3xl font-bold tracking-tight hover:underline md:text-4xl", children: t.title }) }),
2054
+ /* @__PURE__ */ r("div", { className: "mb-6 flex items-baseline gap-3", children: [
2055
+ /* @__PURE__ */ e("span", { className: "text-3xl font-bold text-primary", children: y }),
2056
+ !m && _.sale_price && /* @__PURE__ */ e("span", { className: "text-lg text-muted-foreground line-through", children: w(_.price, l) })
2057
+ ] }),
2058
+ h && /* @__PURE__ */ r("div", { className: "mb-6 inline-flex w-fit flex-col rounded-md border border-emerald-200 bg-emerald-50 px-3 py-2 text-sm text-emerald-900", children: [
2059
+ /* @__PURE__ */ e("span", { className: "font-semibold", children: h.label }),
2060
+ /* @__PURE__ */ e("span", { className: "text-emerald-700", children: h.paymentRequirementLabel })
2061
+ ] }),
2062
+ t.short_description && /* @__PURE__ */ e("p", { className: "mb-8 text-lg text-muted-foreground", children: t.short_description }),
2063
+ /* @__PURE__ */ r("div", { className: "flex flex-col gap-4 sm:flex-row", children: [
2064
+ /* @__PURE__ */ e(
2065
+ ht,
2066
+ {
2067
+ product: t,
2068
+ className: "h-12 w-full px-8 text-lg sm:w-auto"
2069
+ }
2070
+ ),
2071
+ /* @__PURE__ */ e(
2072
+ Se,
2073
+ {
2074
+ href: `/product/${t.slug}`,
2075
+ className: "inline-flex h-12 items-center justify-center rounded-md border border-input bg-background px-8 text-sm font-medium transition-colors hover:bg-accent hover:text-accent-foreground",
2076
+ children: a("ecommerce.view_details")
2077
+ }
2078
+ )
2079
+ ] })
2080
+ ] })
2081
+ ] }) });
2082
+ };
2083
+ function jt(t, n, s) {
2084
+ const a = t(n);
2085
+ return a === n ? s : a;
2086
+ }
2087
+ function Rs(t) {
2088
+ return t === "password" ? Vr : Dr;
2089
+ }
2090
+ function $s({
2091
+ links: t,
2092
+ title: n,
2093
+ className: s
2094
+ }) {
2095
+ const a = Ir(), { t: l } = Z();
2096
+ return t.length ? /* @__PURE__ */ r("div", { className: oe("w-full space-y-3", s), children: [
2097
+ /* @__PURE__ */ e("div", { className: "text-sm font-medium text-muted-foreground uppercase tracking-wider", children: n || jt(l, "account_navigation", "Account") }),
2098
+ /* @__PURE__ */ e("div", { className: "space-y-2", children: t.map((c) => {
2099
+ const o = Rs(c.icon), m = a === c.href || a.startsWith(`${c.href}/`);
2100
+ return /* @__PURE__ */ r(
2101
+ Se,
2102
+ {
2103
+ href: c.href,
2104
+ className: oe(
2105
+ "flex items-center gap-3 rounded-xl border px-3 py-2.5 text-sm font-medium transition-colors",
2106
+ m ? "border-slate-900 bg-slate-900 text-white" : "border-border bg-background hover:bg-muted/40"
2107
+ ),
2108
+ children: [
2109
+ /* @__PURE__ */ e(o, { className: "h-4 w-4 shrink-0" }),
2110
+ /* @__PURE__ */ e("span", { children: jt(l, c.labelKey, c.fallbackLabel) })
2111
+ ]
2112
+ },
2113
+ c.href
2114
+ );
2115
+ }) })
2116
+ ] }) : null;
2117
+ }
2118
+ async function Ls(t) {
2119
+ const n = ar(), { data: { user: s }, error: a } = await n.auth.getUser();
2120
+ if (a || !s)
2121
+ throw new Error("Unauthorized");
2122
+ const l = {
2123
+ full_name: t.full_name || null,
2124
+ avatar_url: t.avatar_url || null,
2125
+ website: t.website || null,
2126
+ github_username: t.github_username || null,
2127
+ phone: t.phone || null,
2128
+ updated_at: (/* @__PURE__ */ new Date()).toISOString()
2129
+ }, { error: c } = await n.from("profiles").update(l).eq("id", s.id);
2130
+ if (c)
2131
+ throw console.error("Error updating profile:", c), new Error("Failed to update profile");
2132
+ const o = Ne(t.billing_address), m = t.use_billing_for_shipping ? o : Ne(t.shipping_address);
2133
+ return await ns({
2134
+ userId: s.id,
2135
+ billingAddress: o,
2136
+ shippingAddress: m,
2137
+ client: n
2138
+ }), Tt("/profile"), Tt("/checkout"), { success: !0 };
2139
+ }
2140
+ function Ue(t) {
2141
+ return {
2142
+ company_name: t?.company_name || "",
2143
+ recipient_name: t?.recipient_name || "",
2144
+ line1: t?.line1 || "",
2145
+ line2: t?.line2 || "",
2146
+ city: t?.city || "",
2147
+ state: t?.state || "",
2148
+ postal_code: t?.postal_code || "",
2149
+ country_code: dt(t?.country_code) || "CA"
2150
+ };
2151
+ }
2152
+ function Ot({
2153
+ prefix: t,
2154
+ title: n,
2155
+ register: s
2156
+ }) {
2157
+ const { t: a } = Z(), l = a("company_name") === "company_name" ? "Company name" : a("company_name");
2158
+ return /* @__PURE__ */ r("div", { className: "space-y-4 rounded-xl border p-4", children: [
2159
+ /* @__PURE__ */ r("div", { children: [
2160
+ /* @__PURE__ */ e("h3", { className: "text-lg font-medium", children: n }),
2161
+ /* @__PURE__ */ e("p", { className: "text-sm text-muted-foreground", children: a("profile_address_defaults_help") })
2162
+ ] }),
2163
+ /* @__PURE__ */ r("div", { className: "grid gap-4 md:grid-cols-3", children: [
2164
+ /* @__PURE__ */ r("div", { className: "space-y-2", children: [
2165
+ /* @__PURE__ */ e(A, { htmlFor: `${t}-company_name`, children: l }),
2166
+ /* @__PURE__ */ e(U, { id: `${t}-company_name`, ...s(`${t}.company_name`) })
2167
+ ] }),
2168
+ /* @__PURE__ */ r("div", { className: "space-y-2", children: [
2169
+ /* @__PURE__ */ e(A, { htmlFor: `${t}-recipient_name`, children: a("full_name") }),
2170
+ /* @__PURE__ */ e(U, { id: `${t}-recipient_name`, ...s(`${t}.recipient_name`) })
2171
+ ] }),
2172
+ /* @__PURE__ */ r("div", { className: "space-y-2", children: [
2173
+ /* @__PURE__ */ e(A, { htmlFor: `${t}-country_code`, children: a("country") }),
2174
+ /* @__PURE__ */ e(
2175
+ "select",
2176
+ {
2177
+ id: `${t}-country_code`,
2178
+ className: "flex h-10 w-full rounded-md border border-input bg-background px-3 py-2 text-sm",
2179
+ ...s(`${t}.country_code`),
2180
+ children: ut.map((c) => /* @__PURE__ */ e("option", { value: c.code, children: c.name }, c.code))
2181
+ }
2182
+ )
2183
+ ] })
2184
+ ] }),
2185
+ /* @__PURE__ */ r("div", { className: "space-y-2", children: [
2186
+ /* @__PURE__ */ e(A, { htmlFor: `${t}-line1`, children: a("address_line_1") }),
2187
+ /* @__PURE__ */ e(U, { id: `${t}-line1`, ...s(`${t}.line1`) })
2188
+ ] }),
2189
+ /* @__PURE__ */ r("div", { className: "space-y-2", children: [
2190
+ /* @__PURE__ */ e(A, { htmlFor: `${t}-line2`, children: a("address_line_2") }),
2191
+ /* @__PURE__ */ e(U, { id: `${t}-line2`, ...s(`${t}.line2`) })
2192
+ ] }),
2193
+ /* @__PURE__ */ r("div", { className: "grid gap-4 md:grid-cols-3", children: [
2194
+ /* @__PURE__ */ r("div", { className: "space-y-2", children: [
2195
+ /* @__PURE__ */ e(A, { htmlFor: `${t}-city`, children: a("city") }),
2196
+ /* @__PURE__ */ e(U, { id: `${t}-city`, ...s(`${t}.city`) })
2197
+ ] }),
2198
+ /* @__PURE__ */ r("div", { className: "space-y-2", children: [
2199
+ /* @__PURE__ */ e(A, { htmlFor: `${t}-state`, children: a("state_province") }),
2200
+ /* @__PURE__ */ e(U, { id: `${t}-state`, ...s(`${t}.state`) })
2201
+ ] }),
2202
+ /* @__PURE__ */ r("div", { className: "space-y-2", children: [
2203
+ /* @__PURE__ */ e(A, { htmlFor: `${t}-postal_code`, children: a("postal_zip_code") }),
2204
+ /* @__PURE__ */ e(U, { id: `${t}-postal_code`, ...s(`${t}.postal_code`) })
2205
+ ] })
2206
+ ] })
2207
+ ] });
2208
+ }
2209
+ function Ca({
2210
+ initialData: t,
2211
+ MediaPickerComponent: n,
2212
+ isAdmin: s,
2213
+ email: a,
2214
+ accountLinks: l,
2215
+ onAction: c,
2216
+ initialSuccessMessage: o
2217
+ }) {
2218
+ const { t: m } = Z(), [_, y] = k(!1), [h, p] = k(
2219
+ o ? { type: "success", text: o } : null
2220
+ ), [f, b] = k(!1), [d, E] = k(null), v = t?.use_billing_for_shipping ?? (!t?.shipping_address || lt(t?.billing_address, t?.shipping_address)), {
2221
+ register: F,
2222
+ handleSubmit: j,
2223
+ setValue: R,
2224
+ getValues: L,
2225
+ watch: S,
2226
+ reset: i
2227
+ } = gs({
2228
+ defaultValues: {
2229
+ full_name: t?.full_name || "",
2230
+ avatar_url: t?.avatar_url || "",
2231
+ website: t?.website || "",
2232
+ github_username: t?.github_username || "",
2233
+ phone: t?.phone || "",
2234
+ role: t?.role,
2235
+ use_billing_for_shipping: v,
2236
+ billing_address: Ue(t?.billing_address),
2237
+ shipping_address: Ue(t?.shipping_address)
2238
+ }
2239
+ });
2240
+ we.useEffect(() => {
2241
+ t && i({
2242
+ full_name: t.full_name || "",
2243
+ avatar_url: t.avatar_url || "",
2244
+ website: t.website || "",
2245
+ github_username: t.github_username || "",
2246
+ phone: t.phone || "",
2247
+ role: t.role,
2248
+ use_billing_for_shipping: t.use_billing_for_shipping ?? (!t.shipping_address || lt(t.billing_address, t.shipping_address)),
2249
+ billing_address: Ue(t.billing_address),
2250
+ shipping_address: Ue(t.shipping_address)
2251
+ });
2252
+ }, [t, i]), we.useEffect(() => {
2253
+ o && p({ type: "success", text: o });
2254
+ }, [o]), we.useEffect(() => {
2255
+ const C = Rt();
2256
+ (async () => {
2257
+ const {
2258
+ data: { user: V }
2259
+ } = await C.auth.getUser();
2260
+ if (!V)
2261
+ return;
2262
+ const B = V.identities?.find((Q) => Q.provider === "github");
2263
+ if (B) {
2264
+ b(!0);
2265
+ const Q = B.identity_data?.email || (V.app_metadata.provider === "github" ? V.email : null);
2266
+ if (E(Q), !L("website")) {
2267
+ const J = B.identity_data?.custom_claims?.blog || B.identity_data?.blog || B.identity_data?.html_url;
2268
+ J && R("website", J);
2269
+ }
2270
+ if (!L("avatar_url")) {
2271
+ const J = B.identity_data?.avatar_url;
2272
+ J && R("avatar_url", J);
2273
+ }
2274
+ const he = B.identity_data?.user_name || B.identity_data?.preferred_username;
2275
+ he && R("github_username", he);
2276
+ }
2277
+ !L("full_name") && V.user_metadata?.full_name && R("full_name", V.user_metadata.full_name);
2278
+ })();
2279
+ }, [L, R]);
2280
+ const $ = async () => {
2281
+ const C = Rt(), { error: X } = await C.auth.linkIdentity({ provider: "github" });
2282
+ X && (console.error("Error linking GitHub:", X), p({
2283
+ type: "error",
2284
+ text: m("github_link_failed") || "Failed to link GitHub account"
2285
+ }));
2286
+ }, q = (C) => {
2287
+ const V = `${process.env.NEXT_PUBLIC_R2_BASE_URL || "https://assets.nextblock.com"}/${C.object_key}`;
2288
+ R("avatar_url", V);
2289
+ }, P = async (C) => {
2290
+ y(!0), p(null);
2291
+ const X = Ne(C.billing_address) ?? Xt(), V = C.use_billing_for_shipping ? X : Ne(C.shipping_address);
2292
+ try {
2293
+ const B = {
2294
+ ...C,
2295
+ billing_address: X,
2296
+ shipping_address: V
2297
+ };
2298
+ if (c) {
2299
+ const Q = await c(B);
2300
+ if (Q?.error)
2301
+ throw new Error(Q.error);
2302
+ } else
2303
+ await Ls(B);
2304
+ p({ type: "success", text: m("profile_updated_success") });
2305
+ } catch (B) {
2306
+ if (B.message === "NEXT_REDIRECT" || B.message?.includes("NEXT_REDIRECT"))
2307
+ return;
2308
+ console.error(B), p({ type: "error", text: B.message || m("profile_update_failed") });
2309
+ } finally {
2310
+ y(!1);
2311
+ }
2312
+ }, W = S("use_billing_for_shipping");
2313
+ return /* @__PURE__ */ r("div", { className: "grid gap-6 md:grid-cols-12 max-w-5xl mx-auto", children: [
2314
+ /* @__PURE__ */ r(ye, { className: "md:col-span-4 h-fit", children: [
2315
+ /* @__PURE__ */ e(be, { children: /* @__PURE__ */ e(xe, { className: "text-xl", children: m("public_profile") }) }),
2316
+ /* @__PURE__ */ r(ve, { className: "flex flex-col items-center text-center space-y-4", children: [
2317
+ /* @__PURE__ */ r("div", { className: "relative group", children: [
2318
+ /* @__PURE__ */ r(_s, { className: "h-32 w-32 border-4 border-muted", children: [
2319
+ /* @__PURE__ */ e(ys, { src: S("avatar_url") || void 0, className: "object-cover" }),
2320
+ /* @__PURE__ */ e(bs, { className: "text-4xl bg-secondary", children: S("full_name")?.charAt(0)?.toUpperCase() || /* @__PURE__ */ e(Ct, { className: "h-12 w-12" }) })
2321
+ ] }),
2322
+ n && /* @__PURE__ */ e("div", { className: "absolute inset-0 flex items-center justify-center opacity-0 group-hover:opacity-100 transition-opacity bg-black/40 rounded-full cursor-pointer", children: /* @__PURE__ */ e(
2323
+ n,
2324
+ {
2325
+ triggerLabel: /* @__PURE__ */ e(Br, { className: "h-6 w-6 text-white" }),
2326
+ triggerVariant: "ghost",
2327
+ title: m("customer_profile"),
2328
+ onSelect: q,
2329
+ accept: (C) => C.file_type.startsWith("image/"),
2330
+ hideTrigger: !1
2331
+ }
2332
+ ) })
2333
+ ] }),
2334
+ !n && /* @__PURE__ */ r("div", { className: "w-full", children: [
2335
+ /* @__PURE__ */ e(A, { htmlFor: "avatar_url", className: "sr-only", children: m("avatar_url") }),
2336
+ /* @__PURE__ */ e(U, { id: "avatar_url", ...F("avatar_url"), placeholder: "https://...", className: "mt-2" })
2337
+ ] }),
2338
+ /* @__PURE__ */ r("div", { className: "w-full space-y-1 text-left mt-4", children: [
2339
+ /* @__PURE__ */ e("div", { className: "text-sm font-medium text-muted-foreground uppercase tracking-wider", children: m("identity") }),
2340
+ /* @__PURE__ */ e("div", { className: "flex items-center gap-2", children: /* @__PURE__ */ e("span", { className: "font-semibold text-lg", children: S("full_name") || m("full_name") }) }),
2341
+ f && /* @__PURE__ */ r(ie, { variant: "secondary", className: "mt-2 w-fit gap-1", children: [
2342
+ /* @__PURE__ */ e(Ze, { className: "h-3 w-3" }),
2343
+ " ",
2344
+ m("github_connected") || "GitHub Connected"
2345
+ ] })
2346
+ ] }),
2347
+ l?.length ? /* @__PURE__ */ e(
2348
+ $s,
2349
+ {
2350
+ links: l,
2351
+ className: "mt-2 text-left"
2352
+ }
2353
+ ) : null
2354
+ ] })
2355
+ ] }),
2356
+ /* @__PURE__ */ e(ye, { className: "md:col-span-8", children: /* @__PURE__ */ r("form", { onSubmit: j(P), children: [
2357
+ /* @__PURE__ */ e(be, { children: /* @__PURE__ */ e(xe, { children: m("details") }) }),
2358
+ /* @__PURE__ */ r(ve, { className: "space-y-6", children: [
2359
+ a && /* @__PURE__ */ r("div", { className: "space-y-2", children: [
2360
+ /* @__PURE__ */ r(A, { htmlFor: "email", children: [
2361
+ m("email") || "Email",
2362
+ " (Read-only)"
2363
+ ] }),
2364
+ /* @__PURE__ */ e(U, { id: "email", value: a, readOnly: !0, disabled: !0, className: "bg-muted/50" })
2365
+ ] }),
2366
+ /* @__PURE__ */ e("div", { className: "rounded-xl border bg-muted/20 p-4 text-sm text-muted-foreground", children: m("profile_basic_info_help") }),
2367
+ /* @__PURE__ */ r("div", { className: "grid gap-4 md:grid-cols-2", children: [
2368
+ /* @__PURE__ */ r("div", { className: "space-y-2", children: [
2369
+ /* @__PURE__ */ r(A, { htmlFor: "full_name", className: "flex items-center gap-2", children: [
2370
+ /* @__PURE__ */ e(Ct, { className: "h-4 w-4" }),
2371
+ " ",
2372
+ m("full_name")
2373
+ ] }),
2374
+ /* @__PURE__ */ e(U, { id: "full_name", ...F("full_name") })
2375
+ ] }),
2376
+ /* @__PURE__ */ r("div", { className: "space-y-2", children: [
2377
+ /* @__PURE__ */ r(A, { htmlFor: "phone", className: "flex items-center gap-2", children: [
2378
+ /* @__PURE__ */ e(Hr, { className: "h-4 w-4" }),
2379
+ " ",
2380
+ m("phone_number")
2381
+ ] }),
2382
+ /* @__PURE__ */ e(U, { id: "phone", ...F("phone") })
2383
+ ] })
2384
+ ] }),
2385
+ /* @__PURE__ */ r("div", { className: "grid gap-4 md:grid-cols-2", children: [
2386
+ /* @__PURE__ */ r("div", { className: "space-y-2", children: [
2387
+ /* @__PURE__ */ r(A, { htmlFor: "website", className: "flex items-center gap-2", children: [
2388
+ /* @__PURE__ */ e(Kr, { className: "h-4 w-4" }),
2389
+ " ",
2390
+ m("website")
2391
+ ] }),
2392
+ /* @__PURE__ */ e(U, { id: "website", ...F("website"), placeholder: "https://example.com" })
2393
+ ] }),
2394
+ /* @__PURE__ */ r("div", { className: "space-y-2", children: [
2395
+ /* @__PURE__ */ r(A, { htmlFor: "github_username", className: "flex items-center gap-2", children: [
2396
+ /* @__PURE__ */ e(Ze, { className: "h-4 w-4" }),
2397
+ " ",
2398
+ m("github_username")
2399
+ ] }),
2400
+ f ? /* @__PURE__ */ r("div", { className: "space-y-2", children: [
2401
+ /* @__PURE__ */ e(U, { id: "github_username", ...F("github_username"), disabled: !0, className: "bg-muted" }),
2402
+ d && /* @__PURE__ */ r("p", { className: "text-xs text-muted-foreground flex items-center gap-1", children: [
2403
+ /* @__PURE__ */ e(Gr, { className: "h-3 w-3" }),
2404
+ " ",
2405
+ m("linked_to") || "Linked to",
2406
+ " ",
2407
+ d
2408
+ ] })
2409
+ ] }) : /* @__PURE__ */ r(D, { type: "button", variant: "outline", className: "w-full", onClick: $, children: [
2410
+ /* @__PURE__ */ e(Ze, { className: "mr-2 h-4 w-4" }),
2411
+ m("connect_github")
2412
+ ] })
2413
+ ] })
2414
+ ] }),
2415
+ /* @__PURE__ */ e(mt, { className: "my-2" }),
2416
+ /* @__PURE__ */ e(Ot, { prefix: "billing_address", title: m("billing_address"), register: F }),
2417
+ /* @__PURE__ */ r("div", { className: "flex items-center space-x-3 rounded-lg border p-4", children: [
2418
+ /* @__PURE__ */ e(
2419
+ nr,
2420
+ {
2421
+ id: "use_billing_for_shipping",
2422
+ checked: !!W,
2423
+ onCheckedChange: (C) => R("use_billing_for_shipping", !!C, { shouldDirty: !0 })
2424
+ }
2425
+ ),
2426
+ /* @__PURE__ */ r("div", { className: "space-y-1", children: [
2427
+ /* @__PURE__ */ e(A, { htmlFor: "use_billing_for_shipping", className: "cursor-pointer", children: m("use_billing_for_shipping") }),
2428
+ /* @__PURE__ */ e("p", { className: "text-sm text-muted-foreground", children: m("profile_use_billing_for_shipping_help") })
2429
+ ] })
2430
+ ] }),
2431
+ !W && /* @__PURE__ */ e(
2432
+ Ot,
2433
+ {
2434
+ prefix: "shipping_address",
2435
+ title: m("shipping_address"),
2436
+ register: F
2437
+ }
2438
+ ),
2439
+ h && /* @__PURE__ */ e(
2440
+ "div",
2441
+ {
2442
+ className: `mt-4 rounded-xl border p-4 text-sm ${h.type === "success" ? "border-emerald-200 bg-emerald-50 text-emerald-700" : "border-red-200 bg-red-50 text-red-700"}`,
2443
+ children: h.text
2444
+ }
2445
+ ),
2446
+ s && /* @__PURE__ */ r("div", { className: "border-t pt-4 mt-4", children: [
2447
+ /* @__PURE__ */ e("h3", { className: "text-sm font-medium mb-3", children: "Admin Settings" }),
2448
+ /* @__PURE__ */ r("div", { className: "grid gap-2", children: [
2449
+ /* @__PURE__ */ e(A, { htmlFor: "role", children: "Role" }),
2450
+ /* @__PURE__ */ r(
2451
+ lr,
2452
+ {
2453
+ value: S("role") || "USER",
2454
+ onValueChange: (C) => R("role", C),
2455
+ children: [
2456
+ /* @__PURE__ */ e(cr, { children: /* @__PURE__ */ e(ir, { placeholder: "Select role" }) }),
2457
+ /* @__PURE__ */ r(or, { children: [
2458
+ /* @__PURE__ */ e(De, { value: "USER", children: "User" }),
2459
+ /* @__PURE__ */ e(De, { value: "WRITER", children: "Writer" }),
2460
+ /* @__PURE__ */ e(De, { value: "ADMIN", children: "Admin" })
2461
+ ] })
2462
+ ]
2463
+ }
2464
+ )
2465
+ ] })
2466
+ ] })
2467
+ ] }),
2468
+ /* @__PURE__ */ e(ps, { className: "flex justify-end", children: /* @__PURE__ */ e(D, { type: "submit", disabled: _, size: "lg", children: m(_ ? "saving" : "save_changes") }) })
2469
+ ] }) })
2470
+ ] });
2471
+ }
2472
+ const Is = ({ product: t }) => {
2473
+ const n = ue((S) => S), { t: s } = Z(), { activeCurrencyCode: a, currencies: l, defaultCurrency: c } = le(), [o, m] = k([]), [_, y] = k(!0), [h, p] = k("annual");
2474
+ if (G(() => {
2475
+ async function S() {
2476
+ try {
2477
+ if (!t.id) return;
2478
+ const i = await ls(t.id);
2479
+ m(i);
2480
+ } catch (i) {
2481
+ console.error("Failed to load pricing:", i);
2482
+ } finally {
2483
+ y(!1);
2484
+ }
2485
+ }
2486
+ S();
2487
+ }, [t.id]), !n)
2488
+ return /* @__PURE__ */ e($t, { className: "h-14 w-full" });
2489
+ const { addItem: f } = n, b = o[0], d = b?.pricing?.[0], E = () => {
2490
+ let S = t.price, i = t.freemius_plan_id;
2491
+ d && (h === "monthly" && d.monthly_price != null && (S = me(d.monthly_price, c.code)), h === "annual" && d.annual_price != null && (S = me(d.annual_price, c.code)), h === "lifetime" && d.lifetime_price != null && (S = me(d.lifetime_price, c.code)));
2492
+ const $ = l.reduce((C, X) => (C[X.code] = je({
2493
+ amount: S,
2494
+ fromCurrencyCode: c.code,
2495
+ toCurrencyCode: X.code,
2496
+ currencies: l,
2497
+ applyRounding: !0
2498
+ }), C), {}), q = $[a] ?? S;
2499
+ b && b.id && (i = b.id);
2500
+ const { success: P, error: W } = f({
2501
+ id: t.id,
2502
+ product_id: t.id,
2503
+ title: t.title,
2504
+ price: q,
2505
+ prices: $,
2506
+ image_url: t.image_url,
2507
+ slug: t.slug,
2508
+ sku: t.sku,
2509
+ language_id: t.language_id,
2510
+ translation_group_id: t.translation_group_id,
2511
+ product_type: "digital",
2512
+ payment_provider: "freemius",
2513
+ provider: "freemius",
2514
+ billing_cycle: h,
2515
+ freemius_product_id: t.freemius_product_id,
2516
+ freemius_plan_id: i,
2517
+ // Overwrite if we got a real plan id
2518
+ trial_period_days: t.trial_period_days ?? 0,
2519
+ trial_requires_payment_method: t.trial_requires_payment_method ?? !1,
2520
+ is_taxable: t.is_taxable,
2521
+ currency_code: a
2522
+ });
2523
+ P ? He.success(s("ecommerce.added_to_cart_success", { item: t.title })) : He.error(W || s("ecommerce.added_to_cart_error"));
2524
+ };
2525
+ if (_)
2526
+ return /* @__PURE__ */ e($t, { className: "h-32 w-full" });
2527
+ if (!b || !d)
2528
+ return /* @__PURE__ */ e("div", { className: "p-4 border border-dashed rounded-lg text-center text-muted-foreground", children: s("ecommerce.pricing_unavailable") });
2529
+ const v = d.monthly_price != null, F = d.annual_price != null, j = d.lifetime_price != null;
2530
+ h === "annual" && !F && (v ? p("monthly") : j && p("lifetime"));
2531
+ const R = pe(t);
2532
+ let L = t.price;
2533
+ return h === "monthly" && d.monthly_price != null && (L = je({
2534
+ amount: me(d.monthly_price, c.code),
2535
+ fromCurrencyCode: c.code,
2536
+ toCurrencyCode: a,
2537
+ currencies: l,
2538
+ applyRounding: !0
2539
+ })), h === "annual" && d.annual_price != null && (L = je({
2540
+ amount: me(d.annual_price, c.code),
2541
+ fromCurrencyCode: c.code,
2542
+ toCurrencyCode: a,
2543
+ currencies: l,
2544
+ applyRounding: !0
2545
+ })), h === "lifetime" && d.lifetime_price != null && (L = je({
2546
+ amount: me(d.lifetime_price, c.code),
2547
+ fromCurrencyCode: c.code,
2548
+ toCurrencyCode: a,
2549
+ currencies: l,
2550
+ applyRounding: !0
2551
+ })), /* @__PURE__ */ r("div", { className: "flex flex-col gap-4", children: [
2552
+ /* @__PURE__ */ r("div", { className: "flex bg-secondary/35 p-1 rounded-lg w-full max-w-sm mx-auto shadow-inner", children: [
2553
+ v && /* @__PURE__ */ e(
2554
+ "button",
2555
+ {
2556
+ onClick: () => p("monthly"),
2557
+ className: `flex-1 py-1.5 text-xs font-semibold rounded-md transition-all ${h === "monthly" ? "bg-background shadow-sm text-foreground" : "text-muted-foreground hover:text-foreground"}`,
2558
+ children: s("ecommerce.monthly")
2559
+ }
2560
+ ),
2561
+ F && /* @__PURE__ */ e(
2562
+ "button",
2563
+ {
2564
+ onClick: () => p("annual"),
2565
+ className: `flex-1 py-1.5 text-xs font-semibold rounded-md transition-all ${h === "annual" ? "bg-background shadow-sm text-foreground" : "text-muted-foreground hover:text-foreground"}`,
2566
+ children: s("ecommerce.annual")
2567
+ }
2568
+ ),
2569
+ j && /* @__PURE__ */ e(
2570
+ "button",
2571
+ {
2572
+ onClick: () => p("lifetime"),
2573
+ className: `flex-1 py-1.5 text-xs font-semibold rounded-md transition-all ${h === "lifetime" ? "bg-background shadow-sm text-foreground" : "text-muted-foreground hover:text-foreground"}`,
2574
+ children: s("ecommerce.lifetime")
2575
+ }
2576
+ )
2577
+ ] }),
2578
+ /* @__PURE__ */ r("div", { className: "text-center", children: [
2579
+ /* @__PURE__ */ e("span", { className: "text-3xl font-extrabold text-foreground", children: w(L, a) }),
2580
+ h !== "lifetime" && /* @__PURE__ */ r("span", { className: "text-muted-foreground text-sm ml-1.5", children: [
2581
+ "/ ",
2582
+ s(h === "annual" ? "ecommerce.year" : "ecommerce.month")
2583
+ ] }),
2584
+ R && /* @__PURE__ */ r("div", { className: "mt-1 text-xs font-medium text-emerald-600 dark:text-emerald-400", children: [
2585
+ R.label,
2586
+ /* @__PURE__ */ e("span", { className: "mx-2 text-muted-foreground/50", children: "|" }),
2587
+ /* @__PURE__ */ e("span", { className: "text-muted-foreground", children: R.paymentRequirementLabel })
2588
+ ] })
2589
+ ] }),
2590
+ /* @__PURE__ */ r(D, { onClick: E, className: "w-full h-12 text-md font-bold shadow-md transition-all hover:shadow-lg active:scale-[0.98]", children: [
2591
+ /* @__PURE__ */ e(nt, { className: "mr-2 h-4 w-4" }),
2592
+ R?.label ? `Start ${R.label}` : s("ecommerce.get_license")
2593
+ ] })
2594
+ ] });
2595
+ }, js = (t, n) => n.reduce((s, a) => {
2596
+ switch (a.type) {
2597
+ case "bold":
2598
+ return /* @__PURE__ */ e("strong", { children: s });
2599
+ case "italic":
2600
+ return /* @__PURE__ */ e("em", { children: s });
2601
+ case "underline":
2602
+ case "u":
2603
+ return /* @__PURE__ */ e("u", { children: s });
2604
+ case "strike":
2605
+ return /* @__PURE__ */ e("s", { children: s });
2606
+ case "code":
2607
+ return /* @__PURE__ */ e("code", { className: "bg-muted px-1.5 py-0.5 rounded text-[0.875em] font-mono", children: s });
2608
+ case "link": {
2609
+ const l = a.attrs?.href || "#", c = a.attrs?.target || "_blank";
2610
+ return /* @__PURE__ */ e("a", { href: l, target: c, rel: "noopener noreferrer", className: "underline text-primary hover:text-primary/80", children: s });
2611
+ }
2612
+ case "highlight": {
2613
+ const l = a.attrs?.color;
2614
+ return /* @__PURE__ */ e("mark", { style: l ? { backgroundColor: l } : {}, className: l ? void 0 : "bg-yellow-200 dark:bg-yellow-800/50", children: s });
2615
+ }
2616
+ case "subscript":
2617
+ return /* @__PURE__ */ e("sub", { children: s });
2618
+ case "superscript":
2619
+ return /* @__PURE__ */ e("sup", { children: s });
2620
+ case "textStyle": {
2621
+ const l = {};
2622
+ return a.attrs?.color && (l.color = a.attrs.color), a.attrs?.fontSize && (l.fontSize = a.attrs.fontSize), a.attrs?.fontFamily && (l.fontFamily = a.attrs.fontFamily), Object.keys(l).length > 0 ? /* @__PURE__ */ e("span", { style: l, children: s }) : /* @__PURE__ */ e(ot, { children: s });
2623
+ }
2624
+ default:
2625
+ return s;
2626
+ }
2627
+ }, t), Os = ["h1", "h2", "h3", "h4", "h5", "h6"], qs = (t, n, s, a) => {
2628
+ const l = Math.max(1, Math.min(6, t)), c = Os[l - 1], o = a?.id;
2629
+ return we.createElement(c, { key: s, className: "font-bold my-4", id: o }, n);
2630
+ }, qt = (t) => {
2631
+ const n = {}, s = {}, a = t?.colspan, l = t?.rowspan, c = t?.colwidth;
2632
+ return a && a > 1 && (n.colSpan = a), l && l > 1 && (n.rowSpan = l), c && Array.isArray(c) && c[0] && (s.minWidth = c[0]), Object.keys(s).length > 0 && (n.style = s), n;
2633
+ }, hr = (t, n) => {
2634
+ if (t.type === "text") {
2635
+ const a = t.text ?? "";
2636
+ return /* @__PURE__ */ e(we.Fragment, { children: t.marks?.length ? js(a, t.marks) : a }, n);
2637
+ }
2638
+ const s = t.content?.map((a, l) => hr(a, l)) ?? null;
2639
+ switch (t.type) {
2640
+ // ── Document ────────────────────────────────────────────────
2641
+ case "doc":
2642
+ return /* @__PURE__ */ e("div", { children: s }, n);
2643
+ // ── Block-level text ────────────────────────────────────────
2644
+ case "paragraph": {
2645
+ if (!t.content?.length || t.content.every(
2646
+ (o) => o.type === "text" && (!o.text || !o.text.trim())
2647
+ )) return null;
2648
+ const l = t.attrs?.textAlign, c = l ? { textAlign: l } : {};
2649
+ return /* @__PURE__ */ e("p", { className: "mb-4", style: Object.keys(c).length ? c : void 0, children: s }, n);
2650
+ }
2651
+ case "heading":
2652
+ return qs(
2653
+ t.attrs?.level || 1,
2654
+ s,
2655
+ n,
2656
+ t.attrs ?? void 0
2657
+ );
2658
+ // ── Lists ───────────────────────────────────────────────────
2659
+ case "bulletList":
2660
+ return /* @__PURE__ */ e("ul", { className: "list-disc pl-5 mb-4", children: s }, n);
2661
+ case "orderedList": {
2662
+ const a = t.attrs?.start ?? 1;
2663
+ return /* @__PURE__ */ e("ol", { className: "list-decimal pl-5 mb-4", start: a !== 1 ? a : void 0, children: s }, n);
2664
+ }
2665
+ case "listItem":
2666
+ return /* @__PURE__ */ e("li", { children: s }, n);
2667
+ case "taskList":
2668
+ return /* @__PURE__ */ e("ul", { className: "list-none pl-0 mb-4 space-y-1", children: s }, n);
2669
+ case "taskItem": {
2670
+ const a = !!t.attrs?.checked;
2671
+ return /* @__PURE__ */ r("li", { className: "flex items-start gap-2", children: [
2672
+ /* @__PURE__ */ e("input", { type: "checkbox", checked: a, readOnly: !0, className: "mt-1.5 rounded" }),
2673
+ /* @__PURE__ */ e("div", { className: a ? "line-through text-muted-foreground" : "", children: s })
2674
+ ] }, n);
2675
+ }
2676
+ // ── Quotes & code ───────────────────────────────────────────
2677
+ case "blockquote":
2678
+ return /* @__PURE__ */ e("blockquote", { className: "border-l-4 border-border pl-4 italic my-4", children: s }, n);
2679
+ case "codeBlock": {
2680
+ const a = t.attrs?.language;
2681
+ return /* @__PURE__ */ e("pre", { className: "bg-muted rounded-lg p-4 mb-4 overflow-x-auto", "data-language": a || void 0, children: /* @__PURE__ */ e("code", { className: "text-sm font-mono", children: s }) }, n);
2682
+ }
2683
+ // ── Inline / void ───────────────────────────────────────────
2684
+ case "horizontalRule":
2685
+ return /* @__PURE__ */ e("hr", { className: "my-6 border-border" }, n);
2686
+ case "hardBreak":
2687
+ return /* @__PURE__ */ e("br", {}, n);
2688
+ case "image": {
2689
+ const a = t.attrs?.src, l = t.attrs?.alt || "", c = t.attrs?.title, o = t.attrs?.width, m = t.attrs?.height, _ = {};
2690
+ return o && (_.width = typeof o == "number" ? `${o}px` : o), m && (_.height = typeof m == "number" ? `${m}px` : m), /* @__PURE__ */ e(
2691
+ "img",
2692
+ {
2693
+ src: a,
2694
+ alt: l,
2695
+ title: c,
2696
+ style: Object.keys(_).length ? _ : void 0,
2697
+ className: "max-w-full h-auto rounded my-4"
2698
+ },
2699
+ n
2700
+ );
2701
+ }
2702
+ // ── Table ───────────────────────────────────────────────────
2703
+ case "table":
2704
+ return /* @__PURE__ */ e("div", { className: "overflow-x-auto my-4", children: /* @__PURE__ */ e("table", { className: "w-full border-collapse border border-gray-300 dark:border-gray-700", style: { minWidth: 500 }, children: /* @__PURE__ */ e("tbody", { children: s }) }) }, n);
2705
+ case "tableRow":
2706
+ return /* @__PURE__ */ e("tr", { className: "border-b border-gray-300 dark:border-gray-700", children: s }, n);
2707
+ case "tableHeader":
2708
+ return /* @__PURE__ */ e(
2709
+ "th",
2710
+ {
2711
+ ...qt(t.attrs ?? void 0),
2712
+ className: "bg-gray-100 dark:bg-gray-800 font-bold p-3 text-left border border-gray-300 dark:border-gray-700",
2713
+ children: s
2714
+ },
2715
+ n
2716
+ );
2717
+ case "tableCell":
2718
+ return /* @__PURE__ */ e(
2719
+ "td",
2720
+ {
2721
+ ...qt(t.attrs ?? void 0),
2722
+ className: "p-3 border border-gray-300 dark:border-gray-700",
2723
+ children: s
2724
+ },
2725
+ n
2726
+ );
2727
+ // ── Details / collapsible ───────────────────────────────────
2728
+ case "details":
2729
+ return /* @__PURE__ */ e("details", { className: "my-4 border rounded-lg overflow-hidden", children: s }, n);
2730
+ case "detailsSummary":
2731
+ return /* @__PURE__ */ e("summary", { className: "cursor-pointer p-3 font-semibold bg-muted/30 hover:bg-muted/50", children: s }, n);
2732
+ case "detailsContent":
2733
+ return /* @__PURE__ */ e("div", { className: "p-3 border-t", children: s }, n);
2734
+ // ── Embeds ──────────────────────────────────────────────────
2735
+ case "youtube": {
2736
+ const a = t.attrs?.src, l = t.attrs?.width || 640, c = t.attrs?.height || 480;
2737
+ return /* @__PURE__ */ e("div", { className: "relative my-4 overflow-hidden rounded-lg", style: { aspectRatio: `${l}/${c}`, maxWidth: l }, children: /* @__PURE__ */ e(
2738
+ "iframe",
2739
+ {
2740
+ src: a,
2741
+ allow: "accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture",
2742
+ allowFullScreen: !0,
2743
+ className: "absolute inset-0 w-full h-full"
2744
+ }
2745
+ ) }, n);
2746
+ }
2747
+ case "iframe": {
2748
+ const a = t.attrs?.src;
2749
+ return /* @__PURE__ */ e("div", { className: "my-4 overflow-hidden rounded-lg", style: { aspectRatio: "16/9" }, children: /* @__PURE__ */ e("iframe", { src: a, allowFullScreen: !0, className: "w-full h-full border-0" }) }, n);
2750
+ }
2751
+ // ── Mention ─────────────────────────────────────────────────
2752
+ case "mention": {
2753
+ const a = t.attrs?.label || t.attrs?.id || "";
2754
+ return /* @__PURE__ */ r("span", { className: "text-primary font-medium", children: [
2755
+ "@",
2756
+ a
2757
+ ] }, n);
2758
+ }
2759
+ // ── Fallback ────────────────────────────────────────────────
2760
+ default:
2761
+ return /* @__PURE__ */ e("div", { children: s }, n);
2762
+ }
2763
+ }, fr = ({ content: t, className: n }) => {
2764
+ if (!t) return null;
2765
+ if (typeof t == "string") {
2766
+ if (t.trim().startsWith("{") || t.trim().startsWith("["))
2767
+ try {
2768
+ const a = JSON.parse(t);
2769
+ return /* @__PURE__ */ e(fr, { content: a, className: n });
2770
+ } catch {
2771
+ }
2772
+ return /* @__PURE__ */ e("div", { className: n, dangerouslySetInnerHTML: { __html: t } });
2773
+ }
2774
+ const s = t;
2775
+ return !s.content || !Array.isArray(s.content) ? null : /* @__PURE__ */ e("div", { className: n, children: s.content.map((a, l) => hr(a, l)) });
2776
+ }, gr = tr(void 0), wa = ({
2777
+ product: t,
2778
+ children: n
2779
+ }) => /* @__PURE__ */ e(gr.Provider, { value: { product: t }, children: n }), zs = () => {
2780
+ const t = rr(gr);
2781
+ if (!t)
2782
+ throw new Error("useProduct must be used within a ProductProvider. Ensure the component is wrapped in a ProductProvider.");
2783
+ return t.product;
2784
+ };
2785
+ function at(t, n, s, a) {
2786
+ const l = {
2787
+ kind: "product-field",
2788
+ field: n,
2789
+ input: s,
2790
+ label: a
2791
+ }, c = typeof window < "u" ? window.location.origin : process.env.NEXT_PUBLIC_URL || process.env.TARGET_URL || (process.env.VERCEL_URL ? `https://${process.env.VERCEL_URL}` : "") || "http://localhost:3000";
2792
+ let m = (typeof window < "u" ? window.location.origin : process.env.NEXT_PUBLIC_URL || process.env.TARGET_URL || (process.env.VERCEL_URL ? `https://${process.env.VERCEL_URL}` : "") || "http://localhost:3000").replace(/\/+$/, "");
2793
+ try {
2794
+ (m.startsWith("http://") || m.startsWith("https://")) && (m = new URL(m).hostname);
2795
+ } catch {
2796
+ }
2797
+ const _ = process.env.NEXTBLOCK_VERCEL_PROJECT_ID || process.env.VERCEL_PROJECT_ID, y = process.env.NEXTBLOCK_VERCEL_WORKSPACE_ID || process.env.VERCEL_ORG_ID, h = {
2798
+ origin: m,
2799
+ editUrl: `${c}/cms/products/${t.id}/edit`,
2800
+ data: {
2801
+ parentType: "product",
2802
+ parentId: t.id,
2803
+ slug: t.slug,
2804
+ languageId: t.language_id,
2805
+ draftId: null,
2806
+ target: l
2807
+ }
2808
+ };
2809
+ return _ && (h.projectId = _), y && (h.workspaceId = y), {
2810
+ "data-vercel-edit-info": JSON.stringify(h),
2811
+ "data-vercel-edit-target": JSON.stringify(l),
2812
+ "data-nextblock-visual-edit": `product:${n}`
2813
+ };
2814
+ }
2815
+ const ka = ({
2816
+ visualEditingEnabled: t = !1,
2817
+ descriptionNode: n
2818
+ }) => {
2819
+ const s = zs(), { t: a, lang: l } = Z(), { activeCurrencyCode: c, currencies: o } = le(), m = t ? at(
2820
+ s,
2821
+ "title",
2822
+ "plain-text",
2823
+ "Product title"
2824
+ ) : void 0, _ = t ? at(
2825
+ s,
2826
+ "short_description",
2827
+ "plain-text",
2828
+ "Short description"
2829
+ ) : void 0, y = t ? at(
2830
+ s,
2831
+ "description_json",
2832
+ "tiptap",
2833
+ "Product description"
2834
+ ) : void 0, h = (g, ee, x) => {
2835
+ const ne = a(g, x);
2836
+ return ne === g ? ee : ne;
2837
+ }, p = s.images && s.images.length > 0 ? s.images : s.image_url ? [{ url: s.image_url, alt: s.title }] : [], f = s.custom_props?.provider === "freemius" || Yt(s), b = pe(s), d = !f && !!(s.has_variants && s.attributes?.length && s.variants?.length), E = s.attributes || [], v = s.variants || [], [F, j] = k(() => Pt(E, v)), [R, L] = k(1);
2838
+ G(() => {
2839
+ L(1);
2840
+ }, [s.id]), G(() => {
2841
+ d && j(Pt(E, v));
2842
+ }, [E, d, s.id, v]);
2843
+ const S = H(() => d ? At(
2844
+ E,
2845
+ v,
2846
+ F
2847
+ ) : F, [E, d, F, v]);
2848
+ G(() => {
2849
+ JSON.stringify(S) !== JSON.stringify(F) && j(S);
2850
+ }, [S, F]);
2851
+ const i = H(() => d ? cs(v, S) : null, [d, S, v]), $ = ke({
2852
+ prices: s.prices,
2853
+ salePrices: s.sale_prices,
2854
+ fallbackPrice: s.price,
2855
+ fallbackSalePrice: s.sale_price,
2856
+ saleStartAt: s.sale_start_at,
2857
+ saleEndAt: s.sale_end_at,
2858
+ scheduledPrice: s.scheduled_price,
2859
+ scheduledPrices: s.scheduled_prices,
2860
+ scheduledPriceAt: s.scheduled_price_at,
2861
+ currencyCode: c,
2862
+ currencies: o
2863
+ }), q = d && i ? ke({
2864
+ prices: i.prices,
2865
+ salePrices: i.sale_prices,
2866
+ fallbackPrice: i.price,
2867
+ fallbackSalePrice: i.sale_price,
2868
+ saleStartAt: i.sale_start_at,
2869
+ saleEndAt: i.sale_end_at,
2870
+ scheduledPrice: i.scheduled_price,
2871
+ scheduledPrices: i.scheduled_prices,
2872
+ scheduledPriceAt: i.scheduled_price_at,
2873
+ currencyCode: c,
2874
+ currencies: o
2875
+ }) : null, P = q?.price ?? $.price, W = q?.sale_price ?? $.sale_price, C = d ? i?.stock_quantity ?? 0 : s.stock ?? 0, X = H(() => {
2876
+ if (!i?.image_url)
2877
+ return p;
2878
+ const g = {
2879
+ url: i.image_url,
2880
+ alt: `${s.title} ${i.label}`
2881
+ }, ee = p.filter(
2882
+ (x) => x.url !== i.image_url
2883
+ );
2884
+ return [g, ...ee];
2885
+ }, [p, s.title, i]), V = typeof W == "number" && P > 0 ? Math.round(
2886
+ (P - W) / P * 100
2887
+ ) : 0, B = d && i ? {
2888
+ ...s,
2889
+ sku: i.sku,
2890
+ price: i.price,
2891
+ prices: i.prices,
2892
+ sale_price: typeof i.sale_price == "number" ? i.sale_price : null,
2893
+ sale_prices: i.sale_prices,
2894
+ image_url: i.image_url || s.image_url,
2895
+ stock: i.stock_quantity,
2896
+ variant_id: i.id,
2897
+ variant_label: i.label,
2898
+ selected_options: i.selected_options,
2899
+ currency_code: c
2900
+ } : {
2901
+ ...s,
2902
+ currency_code: c
2903
+ }, Q = (g, ee) => {
2904
+ j(
2905
+ (x) => At(E, v, {
2906
+ ...x,
2907
+ [g]: ee
2908
+ })
2909
+ );
2910
+ }, he = h(
2911
+ "ecommerce.in_stock",
2912
+ `${C} in stock`,
2913
+ { count: String(C) }
2914
+ ), J = h(
2915
+ "ecommerce.out_of_stock",
2916
+ "Out of stock"
2917
+ ), Re = h(
2918
+ "ecommerce.select_options",
2919
+ "Select Options"
2920
+ ), fe = h(
2921
+ "ecommerce.variant_selection_required",
2922
+ "Select one term from every dropdown to resolve a variation."
2923
+ );
2924
+ return /* @__PURE__ */ r("div", { className: "w-full animate-in fade-in slide-in-from-bottom-4 duration-700 ease-out", children: [
2925
+ /* @__PURE__ */ e("div", { className: "container mx-auto px-4 md:px-6 py-12", children: /* @__PURE__ */ r("div", { className: "grid gap-12 lg:grid-cols-[2fr_3fr] items-start", children: [
2926
+ /* @__PURE__ */ e("div", { className: "w-full max-w-2xl mx-auto lg:max-w-none", children: /* @__PURE__ */ e(Ts, { images: X, className: "w-full" }) }),
2927
+ /* @__PURE__ */ r("div", { className: "flex flex-col gap-4 pb-2 max-w-xl mx-auto lg:mx-0 lg:max-w-none", children: [
2928
+ /* @__PURE__ */ e("div", { className: "space-y-6", children: /* @__PURE__ */ r("div", { className: "space-y-4", children: [
2929
+ /* @__PURE__ */ e(
2930
+ "h1",
2931
+ {
2932
+ className: "text-3xl sm:text-4xl lg:text-5xl font-extrabold tracking-tight text-foreground leading-[1.1] lg:mt-0",
2933
+ ...m,
2934
+ children: s.title
2935
+ }
2936
+ ),
2937
+ s.categories && s.categories.length > 0 && /* @__PURE__ */ e("div", { className: "flex flex-wrap items-center gap-1.5 text-xs font-bold uppercase tracking-widest text-amber-600 dark:text-amber-400", children: s.categories.map((g, ee) => {
2938
+ const x = er(
2939
+ g.name,
2940
+ g.name_translations,
2941
+ l
2942
+ );
2943
+ return /* @__PURE__ */ r(we.Fragment, { children: [
2944
+ ee > 0 && /* @__PURE__ */ e("span", { className: "text-muted-foreground/30", children: "•" }),
2945
+ /* @__PURE__ */ e("span", { children: x })
2946
+ ] }, g.id);
2947
+ }) }),
2948
+ /* @__PURE__ */ e(
2949
+ "div",
2950
+ {
2951
+ className: "prose prose-neutral dark:prose-invert max-w-none text-muted-foreground leading-relaxed text-left",
2952
+ ..._,
2953
+ children: s.short_description ? /* @__PURE__ */ e(
2954
+ "div",
2955
+ {
2956
+ className: "text-lg mb-4 leading-relaxed",
2957
+ dangerouslySetInnerHTML: {
2958
+ __html: s.short_description
2959
+ }
2960
+ }
2961
+ ) : t ? /* @__PURE__ */ e("p", { className: "text-lg mb-4 italic text-muted-foreground", children: "Add a short product description." }) : null
2962
+ }
2963
+ ),
2964
+ /* @__PURE__ */ r("div", { className: "flex items-center gap-3", children: [
2965
+ typeof W == "number" && /* @__PURE__ */ e(
2966
+ ie,
2967
+ {
2968
+ variant: "destructive",
2969
+ className: "px-2.5 py-1 text-xs font-bold uppercase tracking-wide animate-pulse shadow-sm",
2970
+ children: a("ecommerce.sale_badge", {
2971
+ percent: String(V)
2972
+ })
2973
+ }
2974
+ ),
2975
+ !f && C > 0 && C < 10 && /* @__PURE__ */ e(
2976
+ ie,
2977
+ {
2978
+ variant: "outline",
2979
+ className: "text-amber-600 border-amber-200 bg-amber-50",
2980
+ children: a("ecommerce.low_stock", {
2981
+ count: String(C)
2982
+ })
2983
+ }
2984
+ ),
2985
+ b && /* @__PURE__ */ e(
2986
+ ie,
2987
+ {
2988
+ variant: "secondary",
2989
+ className: "border border-emerald-200 bg-emerald-50 text-emerald-800",
2990
+ children: b.label
2991
+ }
2992
+ )
2993
+ ] })
2994
+ ] }) }),
2995
+ /* @__PURE__ */ r("div", { className: "p-5 rounded-2xl bg-card/60 border border-border/80 shadow-md backdrop-blur-md space-y-4", children: [
2996
+ f ? /* @__PURE__ */ e(Is, { product: s }) : /* @__PURE__ */ r("div", { className: "space-y-3.5", children: [
2997
+ /* @__PURE__ */ r("div", { className: "flex items-center justify-between gap-4", children: [
2998
+ /* @__PURE__ */ r("div", { className: "space-y-1", children: [
2999
+ /* @__PURE__ */ e("span", { className: "text-[10px] font-bold text-muted-foreground uppercase tracking-widest", children: h("ecommerce.price", "Price") }),
3000
+ /* @__PURE__ */ r("div", { className: "flex items-baseline gap-2.5", children: [
3001
+ /* @__PURE__ */ e("span", { className: "text-3xl font-extrabold text-foreground", children: w(
3002
+ W ?? P,
3003
+ c
3004
+ ) }),
3005
+ typeof W == "number" && /* @__PURE__ */ e("span", { className: "text-lg text-muted-foreground line-through decoration-destructive/20 decoration-1", children: w(P, c) })
3006
+ ] })
3007
+ ] }),
3008
+ !f && (i || !d) && /* @__PURE__ */ r("div", { className: "text-right space-y-1", children: [
3009
+ /* @__PURE__ */ r("span", { className: "text-[10px] font-bold text-muted-foreground uppercase tracking-widest block", children: [
3010
+ !d && s.sku && /* @__PURE__ */ r("span", { className: "mr-2 font-normal lowercase normal-case text-muted-foreground/70", children: [
3011
+ "SKU: ",
3012
+ s.sku
3013
+ ] }),
3014
+ h("ecommerce.status", "Status")
3015
+ ] }),
3016
+ /* @__PURE__ */ e("div", { className: (C ?? 0) > 0 ? "text-emerald-600 dark:text-emerald-400 font-semibold text-sm" : "text-destructive font-semibold text-sm", children: (C ?? 0) > 0 ? he : J })
3017
+ ] })
3018
+ ] }),
3019
+ d && /* @__PURE__ */ e("div", { className: "space-y-3", children: /* @__PURE__ */ e("div", { className: "grid gap-3 sm:grid-cols-2", children: E.map((g) => {
3020
+ const ee = is(
3021
+ v,
3022
+ g.id,
3023
+ S
3024
+ );
3025
+ return /* @__PURE__ */ r("div", { className: "space-y-1", children: [
3026
+ /* @__PURE__ */ r("div", { className: "flex items-center justify-between", children: [
3027
+ /* @__PURE__ */ e(
3028
+ A,
3029
+ {
3030
+ htmlFor: `attribute-${g.id}`,
3031
+ className: "text-[11px] font-semibold text-muted-foreground uppercase tracking-wider",
3032
+ children: g.name
3033
+ }
3034
+ ),
3035
+ i?.sku && /* @__PURE__ */ e("span", { className: "text-[10px] text-muted-foreground font-mono", children: i.sku })
3036
+ ] }),
3037
+ /* @__PURE__ */ e(
3038
+ "select",
3039
+ {
3040
+ id: `attribute-${g.id}`,
3041
+ className: "flex h-9 w-full rounded-md border border-input bg-background px-3 py-1 text-sm focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring",
3042
+ value: S[g.id] || "",
3043
+ onChange: (x) => Q(
3044
+ g.id,
3045
+ x.target.value
3046
+ ),
3047
+ children: g.terms.map((x) => /* @__PURE__ */ e(
3048
+ "option",
3049
+ {
3050
+ value: x.id,
3051
+ disabled: !ee.has(x.id),
3052
+ children: x.value
3053
+ },
3054
+ x.id
3055
+ ))
3056
+ }
3057
+ )
3058
+ ] }, g.id);
3059
+ }) }) }),
3060
+ d && !i && /* @__PURE__ */ e("p", { className: "text-xs text-muted-foreground italic pt-1", children: fe }),
3061
+ /* @__PURE__ */ r("div", { className: "flex items-center gap-3 pt-1", children: [
3062
+ !f && (C ?? 0) > 0 && /* @__PURE__ */ r("div", { className: "flex items-center border rounded-lg h-12 bg-background border-input select-none", children: [
3063
+ /* @__PURE__ */ e(
3064
+ "button",
3065
+ {
3066
+ type: "button",
3067
+ onClick: () => L((g) => Math.max(1, g - 1)),
3068
+ className: "px-3 h-full flex items-center justify-center text-muted-foreground hover:text-foreground active:scale-95 transition-all text-lg font-medium",
3069
+ disabled: R <= 1,
3070
+ children: "-"
3071
+ }
3072
+ ),
3073
+ /* @__PURE__ */ e("span", { className: "w-8 text-center text-sm font-semibold", children: R }),
3074
+ /* @__PURE__ */ e(
3075
+ "button",
3076
+ {
3077
+ type: "button",
3078
+ onClick: () => L(
3079
+ (g) => C !== null && g >= C ? g : g + 1
3080
+ ),
3081
+ className: "px-3 h-full flex items-center justify-center text-muted-foreground hover:text-foreground active:scale-95 transition-all text-lg font-medium",
3082
+ disabled: C !== null && R >= C,
3083
+ children: "+"
3084
+ }
3085
+ )
3086
+ ] }),
3087
+ d && (!i || (C ?? 0) <= 0) ? /* @__PURE__ */ e(
3088
+ D,
3089
+ {
3090
+ disabled: !0,
3091
+ className: "flex-1 h-12 text-md font-bold shadow-md",
3092
+ children: i ? J : Re
3093
+ }
3094
+ ) : /* @__PURE__ */ e(
3095
+ ht,
3096
+ {
3097
+ product: B,
3098
+ quantity: R,
3099
+ className: "flex-1 h-12 text-md font-bold shadow-md transition-all hover:shadow-lg active:scale-[0.98]"
3100
+ }
3101
+ )
3102
+ ] })
3103
+ ] }),
3104
+ /* @__PURE__ */ e(mt, { className: "opacity-60 my-0.5" }),
3105
+ /* @__PURE__ */ r("div", { className: "grid grid-cols-2 gap-4 text-center text-[11px] font-medium text-muted-foreground pt-1", children: [
3106
+ /* @__PURE__ */ e("div", { className: "flex items-center justify-center gap-2", children: f ? /* @__PURE__ */ r("span", { className: "inline-flex items-center gap-1.5", children: [
3107
+ /* @__PURE__ */ e(Ht, { className: "h-3.5 w-3.5" }),
3108
+ a("ecommerce.instant_digital_delivery")
3109
+ ] }) : /* @__PURE__ */ r("span", { className: "inline-flex items-center gap-1.5", children: [
3110
+ /* @__PURE__ */ e(Bt, { className: "h-3.5 w-3.5" }),
3111
+ a("ecommerce.free_shipping")
3112
+ ] }) }),
3113
+ /* @__PURE__ */ e("div", { className: "flex items-center justify-center gap-2", children: /* @__PURE__ */ r("span", { className: "inline-flex items-center gap-1.5", children: [
3114
+ /* @__PURE__ */ e(Jr, { className: "h-3.5 w-3.5" }),
3115
+ a("ecommerce.secure_checkout")
3116
+ ] }) })
3117
+ ] })
3118
+ ] })
3119
+ ] })
3120
+ ] }) }),
3121
+ /* @__PURE__ */ e("div", { className: "min-w-0 w-full", ...n ? void 0 : y, children: n || (s.description_json ? /* @__PURE__ */ e("div", { className: "container mx-auto px-4 md:px-6 pb-12 prose prose-neutral dark:prose-invert max-w-none leading-relaxed", children: /* @__PURE__ */ e(fr, { content: s.description_json }) }) : /* @__PURE__ */ e("div", { className: "container mx-auto px-4 md:px-6 pb-12", children: /* @__PURE__ */ e("p", { className: "italic text-sm text-muted-foreground", children: a("ecommerce.no_description") }) })) })
3122
+ ] });
3123
+ };
3124
+ export {
3125
+ $s as AccountNavigationMenu,
3126
+ ht as AddToCartButton,
3127
+ Aa as CURRENCY_ROUNDING_MODES,
3128
+ _a as Cart,
3129
+ ga as CartDrawer,
3130
+ ba as CartIcon,
3131
+ ya as Checkout,
3132
+ pt as CouponForm,
3133
+ ha as CurrencyProvider,
3134
+ xa as CurrencySwitcher,
3135
+ Ca as CustomerProfileForm,
3136
+ Ea as DEFAULT_ENABLED_PAYMENT_PROVIDERS,
3137
+ Fa as DEFAULT_INVOICE_SETTINGS,
3138
+ Na as FeaturedProduct,
3139
+ Ta as INVOICE_SETTINGS_KEY,
3140
+ Ra as InvoiceDocument,
3141
+ $a as InvoiceViewerShell,
3142
+ Fs as ProductCard,
3143
+ La as ProductCategorySelector,
3144
+ ka as ProductDetailsLayout,
3145
+ Ia as ProductForm,
3146
+ Ts as ProductGallery,
3147
+ va as ProductGrid,
3148
+ wa as ProductProvider,
3149
+ fr as SimpleTiptapRenderer,
3150
+ Is as SubscriptionSelector,
3151
+ lt as addressesMatch,
3152
+ ja as aggregateOrderTaxLines,
3153
+ Oa as applyCurrencyRounding,
3154
+ qa as buildCombinationKey,
3155
+ za as buildInvoiceDocumentLabels,
3156
+ Ma as buildOrderTaxDetailsFromCalculation,
3157
+ Ua as buildOrderTaxDetailsFromStripeSession,
3158
+ Va as buildVariantLabel,
3159
+ Pt as chooseInitialVariantSelections,
3160
+ je as convertMinorUnitAmount,
3161
+ Da as derivePaymentProviderFromProductType,
3162
+ Ba as describeCurrencyRoundingRule,
3163
+ Xt as emptyCustomerAddress,
3164
+ Ha as emptyProviderDiscounts,
3165
+ Ka as extractSelectedTermsByAttribute,
3166
+ cs as findMatchingVariant,
3167
+ Ga as formatInvoiceCurrency,
3168
+ Ja as formatInvoiceDate,
3169
+ Wa as generateVariantDrafts,
3170
+ is as getAvailableTermIdsForAttribute,
3171
+ Ce as getCartItemActivePrice,
3172
+ Qa as getCartLineCouponKey,
3173
+ Xa as getCurrencyLookup,
3174
+ Wt as getDefaultCurrency,
3175
+ Ya as getExchangeRateForCurrency,
3176
+ Za as getInvoiceAddressLines,
3177
+ en as getInvoiceLocale,
3178
+ tn as getOrderTaxRateJurisdiction,
3179
+ rn as getOrderTaxRateLabel,
3180
+ sn as getOrderTaxRatePercentage,
3181
+ as as getProductPaymentProvider,
3182
+ Ns as getTrialCheckoutMode,
3183
+ Cs as getTrialLabel,
3184
+ ws as getTrialPaymentRequirementLabel,
3185
+ it as getTrialPeriodDays,
3186
+ pe as getTrialSummary,
3187
+ an as getVariantEffectivePriceRange,
3188
+ Yr as inferCurrencyCodeFromLocale,
3189
+ kt as isCustomerAddressComplete,
3190
+ Y as isDigitalItem,
3191
+ Yt as isDigitalProduct,
3192
+ nn as isSaleWindowActive,
3193
+ ln as isScheduledPriceDue,
3194
+ cn as localizeInvoicePresentationData,
3195
+ on as mapRawVariantRelations,
3196
+ wt as normalizeCouponCode,
3197
+ Xr as normalizeCurrencyRecord,
3198
+ dn as normalizeCurrencyRoundingMode,
3199
+ Ne as normalizeCustomerAddress,
3200
+ un as normalizeEnabledPaymentProviders,
3201
+ mn as normalizeInvoiceSettings,
3202
+ pn as normalizeOrderCustomerDetails,
3203
+ hn as normalizeOrderTaxDetails,
3204
+ fn as normalizePriceMap,
3205
+ gn as normalizeSalePriceMap,
3206
+ At as normalizeSelectionsToAvailableVariants,
3207
+ _n as productSchema,
3208
+ yn as resolveAttributeName,
3209
+ ke as resolveEffectivePriceForCurrency,
3210
+ St as resolvePriceForCurrency,
3211
+ Zt as resolvePriceRangeForCurrency,
3212
+ bn as resolveTermValue,
3213
+ er as resolveTranslatedText,
3214
+ xn as serializeInvoiceSettings,
3215
+ Qr as sortCurrencies,
3216
+ vn as translateOrFallback,
3217
+ Nn as translateOrderStatus,
3218
+ ue as useCart,
3219
+ Te as useCartStore,
3220
+ ur as useCartSubtotal,
3221
+ vs as useCartTotalItems,
3222
+ le as useCurrency,
3223
+ Oe as useCurrencyPreferenceStore,
3224
+ fa as useIsCartHydrated,
3225
+ zs as useProduct
3226
+ };