@nextblock-cms/ecom 0.8.1 → 0.8.7

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 (241) hide show
  1. package/index.cjs.js +1 -1
  2. package/index.es.js +136 -3224
  3. package/lib/CurrencyProvider.cjs.js +1 -0
  4. package/lib/CurrencyProvider.es.js +99 -0
  5. package/lib/cart-store.cjs.js +1 -0
  6. package/lib/cart-store.es.js +116 -0
  7. package/lib/components/AccountNavigationMenu.cjs.js +1 -0
  8. package/lib/components/AccountNavigationMenu.es.js +44 -0
  9. package/lib/components/AddToCartButton.cjs.js +1 -0
  10. package/lib/components/AddToCartButton.es.js +60 -0
  11. package/lib/components/Cart.cjs.js +1 -0
  12. package/lib/components/Cart.es.js +148 -0
  13. package/lib/components/CartDrawer.cjs.js +1 -0
  14. package/lib/components/CartDrawer.es.js +119 -0
  15. package/lib/components/CartIcon.cjs.js +1 -0
  16. package/lib/components/CartIcon.es.js +34 -0
  17. package/lib/components/Checkout.cjs.js +1 -0
  18. package/lib/components/Checkout.es.js +987 -0
  19. package/lib/components/CouponForm.cjs.js +1 -0
  20. package/lib/components/CouponForm.es.js +136 -0
  21. package/lib/components/CurrencySwitcher.cjs.js +1 -0
  22. package/lib/components/CurrencySwitcher.es.js +18 -0
  23. package/lib/components/CustomerProfileForm.cjs.js +1 -0
  24. package/lib/components/CustomerProfileForm.es.js +355 -0
  25. package/lib/components/FeaturedProduct.cjs.js +1 -0
  26. package/lib/components/FeaturedProduct.es.js +72 -0
  27. package/lib/components/InvoiceDocument.cjs.js +1 -0
  28. package/lib/components/InvoiceDocument.es.js +196 -0
  29. package/lib/components/InvoiceViewerShell.cjs.js +29 -0
  30. package/lib/components/InvoiceViewerShell.es.js +100 -0
  31. package/lib/components/ProductCard.cjs.js +1 -0
  32. package/lib/components/ProductCard.es.js +119 -0
  33. package/lib/components/ProductDetailsLayout.cjs.js +1 -0
  34. package/lib/components/ProductDetailsLayout.es.js +361 -0
  35. package/lib/components/ProductGallery.cjs.js +1 -0
  36. package/lib/components/ProductGallery.es.js +41 -0
  37. package/lib/components/ProductGrid.cjs.js +1 -0
  38. package/lib/components/ProductGrid.es.js +19 -0
  39. package/lib/components/ShippingEstimator.cjs.js +1 -0
  40. package/lib/components/ShippingEstimator.es.js +125 -0
  41. package/lib/components/SimpleTiptapRenderer.cjs.js +1 -0
  42. package/lib/components/SimpleTiptapRenderer.es.js +187 -0
  43. package/lib/components/SubscriptionSelector.cjs.js +1 -0
  44. package/lib/components/SubscriptionSelector.es.js +140 -0
  45. package/lib/countries.cjs.js +1 -0
  46. package/lib/countries.es.js +77 -0
  47. package/lib/coupon-server.cjs.js +1 -0
  48. package/lib/coupon-server.es.js +234 -0
  49. package/lib/coupons.cjs.js +1 -0
  50. package/lib/coupons.es.js +17 -0
  51. package/lib/currency-constants.cjs.js +1 -0
  52. package/lib/currency-constants.es.js +4 -0
  53. package/lib/currency-store.cjs.js +1 -0
  54. package/lib/currency-store.es.js +27 -0
  55. package/lib/currency-sync.cjs.js +1 -0
  56. package/lib/currency-sync.es.js +180 -0
  57. package/lib/currency.cjs.js +1 -0
  58. package/lib/currency.es.js +312 -0
  59. package/lib/customer-addresses.cjs.js +1 -0
  60. package/lib/customer-addresses.es.js +116 -0
  61. package/lib/customer-orders.cjs.js +1 -0
  62. package/lib/customer-orders.es.js +45 -0
  63. package/lib/customer.cjs.js +1 -0
  64. package/lib/customer.es.js +58 -0
  65. package/lib/export-helpers.cjs.js +1 -0
  66. package/lib/export-helpers.es.js +56 -0
  67. package/lib/factory.cjs.js +1 -0
  68. package/lib/factory.es.js +8 -0
  69. package/lib/freemius-coupons.cjs.js +1 -0
  70. package/lib/freemius-coupons.es.js +272 -0
  71. package/lib/freemius-order-sync.cjs.js +1 -0
  72. package/lib/freemius-order-sync.es.js +284 -0
  73. package/lib/inventory-settings.cjs.js +1 -0
  74. package/lib/inventory-settings.es.js +86 -0
  75. package/lib/invoice-server.cjs.js +33 -0
  76. package/lib/invoice-server.es.js +141 -0
  77. package/lib/invoice-ui.cjs.js +1 -0
  78. package/lib/invoice-ui.es.js +71 -0
  79. package/lib/invoice.cjs.js +1 -0
  80. package/lib/invoice.es.js +102 -0
  81. package/lib/order-inventory.cjs.js +61 -0
  82. package/lib/order-inventory.es.js +128 -0
  83. package/lib/order-tax-details.cjs.js +1 -0
  84. package/lib/order-tax-details.es.js +164 -0
  85. package/lib/pages/cms/coupons/CouponEditorForm.cjs.js +1 -0
  86. package/lib/pages/cms/coupons/CouponEditorForm.es.js +189 -0
  87. package/lib/pages/cms/coupons/CouponsPage.cjs.js +5 -0
  88. package/lib/pages/cms/coupons/CouponsPage.es.js +171 -0
  89. package/lib/pages/cms/coupons/CreateCouponDialog.cjs.js +1 -0
  90. package/lib/pages/cms/coupons/CreateCouponDialog.es.js +35 -0
  91. package/lib/pages/cms/coupons/EditCouponPage.cjs.js +1 -0
  92. package/lib/pages/cms/coupons/EditCouponPage.es.js +48 -0
  93. package/lib/pages/cms/coupons/ProductScopePicker.cjs.js +1 -0
  94. package/lib/pages/cms/coupons/ProductScopePicker.es.js +120 -0
  95. package/lib/pages/cms/coupons/actions.cjs.js +1 -0
  96. package/lib/pages/cms/coupons/actions.es.js +128 -0
  97. package/lib/pages/cms/coupons/product-options.cjs.js +1 -0
  98. package/lib/pages/cms/coupons/product-options.es.js +27 -0
  99. package/lib/pages/cms/orders/ExportReportsDialog.cjs.js +1 -0
  100. package/lib/pages/cms/orders/ExportReportsDialog.es.js +130 -0
  101. package/lib/pages/cms/orders/OrderDetailPage.cjs.js +1 -0
  102. package/lib/pages/cms/orders/OrderDetailPage.es.js +137 -0
  103. package/lib/pages/cms/orders/OrderPrintButton.cjs.js +1 -0
  104. package/lib/pages/cms/orders/OrderPrintButton.es.js +22 -0
  105. package/lib/pages/cms/orders/OrderStatusForm.cjs.js +1 -0
  106. package/lib/pages/cms/orders/OrderStatusForm.es.js +71 -0
  107. package/lib/pages/cms/orders/OrdersPage.cjs.js +1 -0
  108. package/lib/pages/cms/orders/OrdersPage.es.js +104 -0
  109. package/lib/pages/cms/orders/actions.cjs.js +7 -0
  110. package/lib/pages/cms/orders/actions.es.js +71 -0
  111. package/lib/pages/cms/orders/export-actions.cjs.js +1 -0
  112. package/lib/pages/cms/orders/export-actions.es.js +27 -0
  113. package/lib/pages/cms/orders/server-actions.cjs.js +1 -0
  114. package/lib/pages/cms/orders/server-actions.es.js +55 -0
  115. package/lib/pages/cms/payments/PaymentsClient.cjs.js +1 -0
  116. package/lib/pages/cms/payments/PaymentsClient.es.js +188 -0
  117. package/lib/pages/cms/payments/PaymentsPage.cjs.js +1 -0
  118. package/lib/pages/cms/payments/PaymentsPage.es.js +29 -0
  119. package/lib/pages/cms/payments/actions.cjs.js +1 -0
  120. package/lib/pages/cms/payments/actions.es.js +23 -0
  121. package/lib/pages/cms/payments/queries.cjs.js +1 -0
  122. package/lib/pages/cms/payments/queries.es.js +30 -0
  123. package/lib/pages/cms/products/ProductsPage.cjs.js +1 -0
  124. package/lib/pages/cms/products/ProductsPage.es.js +46 -0
  125. package/lib/pages/cms/products/_id_/edit/EditProductPage.cjs.js +1 -0
  126. package/lib/pages/cms/products/_id_/edit/EditProductPage.es.js +156 -0
  127. package/lib/pages/cms/products/actions.cjs.js +44 -0
  128. package/lib/pages/cms/products/actions.es.js +175 -0
  129. package/lib/pages/cms/products/attributes/AttributeManagementPage.cjs.js +1 -0
  130. package/lib/pages/cms/products/attributes/AttributeManagementPage.es.js +48 -0
  131. package/lib/pages/cms/products/attributes/components/AttributeManager.cjs.js +1 -0
  132. package/lib/pages/cms/products/attributes/components/AttributeManager.es.js +291 -0
  133. package/lib/pages/cms/products/categories/CategoryManagementPage.cjs.js +1 -0
  134. package/lib/pages/cms/products/categories/CategoryManagementPage.es.js +36 -0
  135. package/lib/pages/cms/products/categories/components/CategoryManager.cjs.js +1 -0
  136. package/lib/pages/cms/products/categories/components/CategoryManager.es.js +263 -0
  137. package/lib/pages/cms/products/components/CopyProductFromLanguage.cjs.js +1 -0
  138. package/lib/pages/cms/products/components/CopyProductFromLanguage.es.js +114 -0
  139. package/lib/pages/cms/products/components/CurrencyPriceFields.cjs.js +1 -0
  140. package/lib/pages/cms/products/components/CurrencyPriceFields.es.js +107 -0
  141. package/lib/pages/cms/products/components/DeleteProductButton.cjs.js +1 -0
  142. package/lib/pages/cms/products/components/DeleteProductButton.es.js +48 -0
  143. package/lib/pages/cms/products/components/FreemiusPricingDashboard.cjs.js +1 -0
  144. package/lib/pages/cms/products/components/FreemiusPricingDashboard.es.js +86 -0
  145. package/lib/pages/cms/products/components/ProductCategorySelector.cjs.js +1 -0
  146. package/lib/pages/cms/products/components/ProductCategorySelector.es.js +160 -0
  147. package/lib/pages/cms/products/components/ProductForm.cjs.js +1 -0
  148. package/lib/pages/cms/products/components/ProductForm.es.js +702 -0
  149. package/lib/pages/cms/products/components/ProductMediaManager.cjs.js +1 -0
  150. package/lib/pages/cms/products/components/ProductMediaManager.es.js +104 -0
  151. package/lib/pages/cms/products/components/ProductsBulkTable.cjs.js +1 -0
  152. package/lib/pages/cms/products/components/ProductsBulkTable.es.js +228 -0
  153. package/lib/pages/cms/products/components/SaleScheduleFields.cjs.js +1 -0
  154. package/lib/pages/cms/products/components/SaleScheduleFields.es.js +137 -0
  155. package/lib/pages/cms/products/components/SyncFreemiusButton.cjs.js +1 -0
  156. package/lib/pages/cms/products/components/SyncFreemiusButton.es.js +36 -0
  157. package/lib/pages/cms/products/components/SyncFreemiusPricingButton.cjs.js +1 -0
  158. package/lib/pages/cms/products/components/SyncFreemiusPricingButton.es.js +40 -0
  159. package/lib/pages/cms/products/components/VariationsEditor.cjs.js +1 -0
  160. package/lib/pages/cms/products/components/VariationsEditor.es.js +408 -0
  161. package/lib/pages/cms/products/inventory/InventoryPage.cjs.js +1 -0
  162. package/lib/pages/cms/products/inventory/InventoryPage.es.js +16 -0
  163. package/lib/pages/cms/products/inventory/InventoryTableClient.cjs.js +2 -0
  164. package/lib/pages/cms/products/inventory/InventoryTableClient.es.js +214 -0
  165. package/lib/pages/cms/products/inventory/actions.cjs.js +3 -0
  166. package/lib/pages/cms/products/inventory/actions.es.js +95 -0
  167. package/lib/pages/cms/products/new/NewProductPage.cjs.js +1 -0
  168. package/lib/pages/cms/products/new/NewProductPage.es.js +76 -0
  169. package/lib/pages/cms/products/product-price-sync.cjs.js +1 -0
  170. package/lib/pages/cms/products/product-price-sync.es.js +98 -0
  171. package/lib/pages/cms/products/server-actions.cjs.js +1 -0
  172. package/lib/pages/cms/products/server-actions.es.js +193 -0
  173. package/lib/pages/cms/shipping/ShippingPage.cjs.js +5 -0
  174. package/lib/pages/cms/shipping/ShippingPage.es.js +211 -0
  175. package/lib/pages/cms/shipping/components/RateForm.cjs.js +1 -0
  176. package/lib/pages/cms/shipping/components/RateForm.es.js +441 -0
  177. package/lib/pages/cms/shipping/components/ZoneForm.cjs.js +1 -0
  178. package/lib/pages/cms/shipping/components/ZoneForm.es.js +228 -0
  179. package/lib/pages/cms/shipping/server-actions.cjs.js +1 -0
  180. package/lib/pages/cms/shipping/server-actions.es.js +159 -0
  181. package/lib/pages/cms/taxes/TaxesPage.cjs.js +1 -0
  182. package/lib/pages/cms/taxes/TaxesPage.es.js +172 -0
  183. package/lib/pages/cms/taxes/actions.cjs.js +1 -0
  184. package/lib/pages/cms/taxes/actions.es.js +57 -0
  185. package/lib/pages/cms/taxes/components/TaxRateForm.cjs.js +1 -0
  186. package/lib/pages/cms/taxes/components/TaxRateForm.es.js +100 -0
  187. package/lib/product-actions.cjs.js +237 -0
  188. package/lib/product-actions.es.js +524 -0
  189. package/lib/product-context.cjs.js +1 -0
  190. package/lib/product-context.es.js +16 -0
  191. package/lib/product-schema.cjs.js +1 -0
  192. package/lib/product-schema.es.js +134 -0
  193. package/lib/providers/freemius.cjs.js +5 -0
  194. package/lib/providers/freemius.es.js +538 -0
  195. package/lib/providers/stripe.cjs.js +1 -0
  196. package/lib/providers/stripe.es.js +473 -0
  197. package/lib/server-actions/coupon-actions.cjs.js +1 -0
  198. package/lib/server-actions/coupon-actions.es.js +23 -0
  199. package/lib/server-actions/customer-actions.cjs.js +1 -0
  200. package/lib/server-actions/customer-actions.es.js +30 -0
  201. package/lib/server-actions/product-actions.cjs.js +1 -0
  202. package/lib/server-actions/product-actions.es.js +16 -0
  203. package/lib/server-actions/shipping-actions.cjs.js +1 -0
  204. package/lib/server-actions/shipping-actions.es.js +27 -0
  205. package/lib/server-actions/tax-actions.cjs.js +1 -0
  206. package/lib/server-actions/tax-actions.es.js +40 -0
  207. package/lib/shared-inventory.cjs.js +15 -0
  208. package/lib/shared-inventory.es.js +171 -0
  209. package/lib/shipping/resolver.cjs.js +7 -0
  210. package/lib/shipping/resolver.es.js +62 -0
  211. package/lib/shipping-rate-currency.cjs.js +1 -0
  212. package/lib/shipping-rate-currency.es.js +72 -0
  213. package/lib/states.cjs.js +1 -0
  214. package/lib/states.es.js +127 -0
  215. package/lib/stripe/checkout.cjs.js +1 -0
  216. package/lib/stripe/checkout.es.js +182 -0
  217. package/lib/stripe/client.cjs.js +1 -0
  218. package/lib/stripe/client.es.js +7 -0
  219. package/lib/stripe/order-sync.cjs.js +1 -0
  220. package/lib/stripe/order-sync.es.js +130 -0
  221. package/lib/stripe/webhooks.cjs.js +1 -0
  222. package/lib/stripe/webhooks.es.js +30 -0
  223. package/lib/tax-calculation.cjs.js +1 -0
  224. package/lib/tax-calculation.es.js +101 -0
  225. package/lib/trials.cjs.js +1 -0
  226. package/lib/trials.es.js +29 -0
  227. package/lib/types.cjs.js +1 -0
  228. package/lib/types.es.js +33 -0
  229. package/lib/use-cart.cjs.js +1 -0
  230. package/lib/use-cart.es.js +44 -0
  231. package/lib/variation-utils.cjs.js +1 -0
  232. package/lib/variation-utils.es.js +246 -0
  233. package/lib/zod-config.cjs.js +1 -0
  234. package/lib/zod-config.es.js +6 -0
  235. package/package.json +10 -5
  236. package/server.cjs.js +1 -110
  237. package/server.es.js +178 -6037
  238. package/invoice-ui-BJZfedDd.cjs +0 -332
  239. package/invoice-ui-GJ1ADAjn.js +0 -5759
  240. /package/{currency-rest-client-uolJxUkL.cjs → lib/currency-rest-client.cjs.js} +0 -0
  241. /package/{currency-rest-client-CwoqdgAP.js → lib/currency-rest-client.es.js} +0 -0
package/index.es.js CHANGED
@@ -1,3226 +1,138 @@
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
- };
1
+ import { CartDrawer as o } from "./lib/components/CartDrawer.es.js";
2
+ import { Cart as a } from "./lib/components/Cart.es.js";
3
+ import { Checkout as n } from "./lib/components/Checkout.es.js";
4
+ import { CartIcon as m } from "./lib/components/CartIcon.es.js";
5
+ import { CouponForm as l } from "./lib/components/CouponForm.es.js";
6
+ import { CurrencySwitcher as d } from "./lib/components/CurrencySwitcher.es.js";
7
+ import { AddToCartButton as C } from "./lib/components/AddToCartButton.es.js";
8
+ import { ProductCard as x } from "./lib/components/ProductCard.es.js";
9
+ import { ProductGrid as g } from "./lib/components/ProductGrid.es.js";
10
+ import { ProductGallery as v } from "./lib/components/ProductGallery.es.js";
11
+ import { FeaturedProduct as S } from "./lib/components/FeaturedProduct.es.js";
12
+ import { CustomerProfileForm as D } from "./lib/components/CustomerProfileForm.es.js";
13
+ import { SubscriptionSelector as R } from "./lib/components/SubscriptionSelector.es.js";
14
+ import { InvoiceDocument as E } from "./lib/components/InvoiceDocument.es.js";
15
+ import { InvoiceViewerShell as L } from "./lib/components/InvoiceViewerShell.es.js";
16
+ import { AccountNavigationMenu as z } from "./lib/components/AccountNavigationMenu.es.js";
17
+ import { SimpleTiptapRenderer as N } from "./lib/components/SimpleTiptapRenderer.es.js";
18
+ import { ProductForm as M } from "./lib/pages/cms/products/components/ProductForm.es.js";
19
+ import { ProductCategorySelector as w } from "./lib/pages/cms/products/components/ProductCategorySelector.es.js";
20
+ import { getCartItemActivePrice as U, useCartStore as k, useCartSubtotal as B, useCartTotalItems as K } from "./lib/cart-store.es.js";
21
+ import { emptyProviderDiscounts as q, getCartLineCouponKey as H, normalizeCouponCode as J } from "./lib/coupons.es.js";
22
+ import { CurrencyProvider as j, useCurrency as Q } from "./lib/CurrencyProvider.es.js";
23
+ import { CURRENCY_ROUNDING_MODES as Z, applyCurrencyRounding as $, convertMinorUnitAmount as ee, describeCurrencyRoundingRule as re, getCurrencyLookup as oe, getDefaultCurrency as te, getExchangeRateForCurrency as ae, inferCurrencyCodeFromLocale as ie, isSaleWindowActive as ne, isScheduledPriceDue as ce, normalizeCurrencyRecord as me, normalizeCurrencyRoundingMode as ue, normalizePriceMap as le, normalizeSalePriceMap as se, resolveEffectivePriceForCurrency as de, resolvePriceForCurrency as pe, resolvePriceRangeForCurrency as Ce, sortCurrencies as fe } from "./lib/currency.es.js";
24
+ import { useCurrencyPreferenceStore as Pe } from "./lib/currency-store.es.js";
25
+ import { useCart as ye, useIsCartHydrated as ve } from "./lib/use-cart.es.js";
26
+ import { addressesMatch as Se, emptyCustomerAddress as Ie, isCustomerAddressComplete as De, normalizeCustomerAddress as be, normalizeOrderCustomerDetails as Re } from "./lib/customer.es.js";
27
+ import { DEFAULT_ENABLED_PAYMENT_PROVIDERS as Ee, derivePaymentProviderFromProductType as Fe, getProductPaymentProvider as Le, isDigitalItem as Oe, isDigitalProduct as ze, normalizeEnabledPaymentProviders as Ve } from "./lib/types.es.js";
28
+ import { getTrialCheckoutMode as he, getTrialLabel as Me, getTrialPaymentRequirementLabel as _e, getTrialPeriodDays as we, getTrialSummary as Ge } from "./lib/trials.es.js";
29
+ import { aggregateOrderTaxLines as ke, buildOrderTaxDetailsFromCalculation as Be, buildOrderTaxDetailsFromStripeSession as Ke, getOrderTaxRateJurisdiction as Ye, getOrderTaxRateLabel as qe, getOrderTaxRatePercentage as He, normalizeOrderTaxDetails as Je } from "./lib/order-tax-details.es.js";
30
+ import { DEFAULT_INVOICE_SETTINGS as je, INVOICE_SETTINGS_KEY as Qe, formatInvoiceCurrency as Xe, formatInvoiceDate as Ze, getInvoiceAddressLines as $e, normalizeInvoiceSettings as er, serializeInvoiceSettings as rr } from "./lib/invoice.es.js";
31
+ import { buildInvoiceDocumentLabels as tr, getInvoiceLocale as ar, localizeInvoicePresentationData as ir, translateOrFallback as nr, translateOrderStatus as cr } from "./lib/invoice-ui.es.js";
32
+ import { productSchema as ur } from "./lib/product-schema.es.js";
33
+ import { ProductProvider as sr, useProduct as dr } from "./lib/product-context.es.js";
34
+ import { ProductDetailsLayout as Cr } from "./lib/components/ProductDetailsLayout.es.js";
35
+ import { buildCombinationKey as xr, buildVariantLabel as Pr, chooseInitialVariantSelections as gr, extractSelectedTermsByAttribute as yr, findMatchingVariant as vr, generateVariantDrafts as Tr, getAvailableTermIdsForAttribute as Sr, getVariantEffectivePriceRange as Ir, mapRawVariantRelations as Dr, normalizeSelectionsToAvailableVariants as br, resolveAttributeName as Rr, resolveTermValue as Ar, resolveTranslatedText as Er } from "./lib/variation-utils.es.js";
3124
36
  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
37
+ z as AccountNavigationMenu,
38
+ C as AddToCartButton,
39
+ Z as CURRENCY_ROUNDING_MODES,
40
+ a as Cart,
41
+ o as CartDrawer,
42
+ m as CartIcon,
43
+ n as Checkout,
44
+ l as CouponForm,
45
+ j as CurrencyProvider,
46
+ d as CurrencySwitcher,
47
+ D as CustomerProfileForm,
48
+ Ee as DEFAULT_ENABLED_PAYMENT_PROVIDERS,
49
+ je as DEFAULT_INVOICE_SETTINGS,
50
+ S as FeaturedProduct,
51
+ Qe as INVOICE_SETTINGS_KEY,
52
+ E as InvoiceDocument,
53
+ L as InvoiceViewerShell,
54
+ x as ProductCard,
55
+ w as ProductCategorySelector,
56
+ Cr as ProductDetailsLayout,
57
+ M as ProductForm,
58
+ v as ProductGallery,
59
+ g as ProductGrid,
60
+ sr as ProductProvider,
61
+ N as SimpleTiptapRenderer,
62
+ R as SubscriptionSelector,
63
+ Se as addressesMatch,
64
+ ke as aggregateOrderTaxLines,
65
+ $ as applyCurrencyRounding,
66
+ xr as buildCombinationKey,
67
+ tr as buildInvoiceDocumentLabels,
68
+ Be as buildOrderTaxDetailsFromCalculation,
69
+ Ke as buildOrderTaxDetailsFromStripeSession,
70
+ Pr as buildVariantLabel,
71
+ gr as chooseInitialVariantSelections,
72
+ ee as convertMinorUnitAmount,
73
+ Fe as derivePaymentProviderFromProductType,
74
+ re as describeCurrencyRoundingRule,
75
+ Ie as emptyCustomerAddress,
76
+ q as emptyProviderDiscounts,
77
+ yr as extractSelectedTermsByAttribute,
78
+ vr as findMatchingVariant,
79
+ Xe as formatInvoiceCurrency,
80
+ Ze as formatInvoiceDate,
81
+ Tr as generateVariantDrafts,
82
+ Sr as getAvailableTermIdsForAttribute,
83
+ U as getCartItemActivePrice,
84
+ H as getCartLineCouponKey,
85
+ oe as getCurrencyLookup,
86
+ te as getDefaultCurrency,
87
+ ae as getExchangeRateForCurrency,
88
+ $e as getInvoiceAddressLines,
89
+ ar as getInvoiceLocale,
90
+ Ye as getOrderTaxRateJurisdiction,
91
+ qe as getOrderTaxRateLabel,
92
+ He as getOrderTaxRatePercentage,
93
+ Le as getProductPaymentProvider,
94
+ he as getTrialCheckoutMode,
95
+ Me as getTrialLabel,
96
+ _e as getTrialPaymentRequirementLabel,
97
+ we as getTrialPeriodDays,
98
+ Ge as getTrialSummary,
99
+ Ir as getVariantEffectivePriceRange,
100
+ ie as inferCurrencyCodeFromLocale,
101
+ De as isCustomerAddressComplete,
102
+ Oe as isDigitalItem,
103
+ ze as isDigitalProduct,
104
+ ne as isSaleWindowActive,
105
+ ce as isScheduledPriceDue,
106
+ ir as localizeInvoicePresentationData,
107
+ Dr as mapRawVariantRelations,
108
+ J as normalizeCouponCode,
109
+ me as normalizeCurrencyRecord,
110
+ ue as normalizeCurrencyRoundingMode,
111
+ be as normalizeCustomerAddress,
112
+ Ve as normalizeEnabledPaymentProviders,
113
+ er as normalizeInvoiceSettings,
114
+ Re as normalizeOrderCustomerDetails,
115
+ Je as normalizeOrderTaxDetails,
116
+ le as normalizePriceMap,
117
+ se as normalizeSalePriceMap,
118
+ br as normalizeSelectionsToAvailableVariants,
119
+ ur as productSchema,
120
+ Rr as resolveAttributeName,
121
+ de as resolveEffectivePriceForCurrency,
122
+ pe as resolvePriceForCurrency,
123
+ Ce as resolvePriceRangeForCurrency,
124
+ Ar as resolveTermValue,
125
+ Er as resolveTranslatedText,
126
+ rr as serializeInvoiceSettings,
127
+ fe as sortCurrencies,
128
+ nr as translateOrFallback,
129
+ cr as translateOrderStatus,
130
+ ye as useCart,
131
+ k as useCartStore,
132
+ B as useCartSubtotal,
133
+ K as useCartTotalItems,
134
+ Q as useCurrency,
135
+ Pe as useCurrencyPreferenceStore,
136
+ ve as useIsCartHydrated,
137
+ dr as useProduct
3226
138
  };