@nextblock-cms/ecom 0.21.0 → 0.21.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (359) hide show
  1. package/README.md +43 -0
  2. package/index.cjs +1 -0
  3. package/lib/CurrencyProvider.cjs +1 -0
  4. package/lib/CurrencyProvider.es.js +1 -1
  5. package/lib/PaymentReadinessProvider.cjs +1 -0
  6. package/lib/PaymentReadinessProvider.es.js +1 -1
  7. package/lib/cart-store.cjs +1 -0
  8. package/lib/cart-store.es.js +1 -1
  9. package/lib/components/AccountNavigationMenu.cjs +1 -0
  10. package/lib/components/AccountNavigationMenu.es.js +1 -1
  11. package/lib/components/AddToCartButton.cjs +1 -0
  12. package/lib/components/AddToCartButton.es.js +1 -1
  13. package/lib/components/Cart.cjs +1 -0
  14. package/lib/components/Cart.es.js +1 -1
  15. package/lib/components/CartDrawer.cjs +1 -0
  16. package/lib/components/CartDrawer.es.js +1 -1
  17. package/lib/components/CartIcon.cjs +1 -0
  18. package/lib/components/CartIcon.es.js +1 -1
  19. package/lib/components/Checkout.cjs +1 -0
  20. package/lib/components/Checkout.es.js +1 -1
  21. package/lib/components/CouponForm.cjs +1 -0
  22. package/lib/components/CouponForm.es.js +1 -1
  23. package/lib/components/CurrencySwitcher.cjs +1 -0
  24. package/lib/components/CurrencySwitcher.es.js +1 -1
  25. package/lib/components/CustomerProfileForm.cjs +1 -0
  26. package/lib/components/CustomerProfileForm.es.js +1 -1
  27. package/lib/components/FeaturedProduct.cjs +1 -0
  28. package/lib/components/FeaturedProduct.es.js +1 -1
  29. package/lib/components/FreemiusLicensePanel.cjs +1 -0
  30. package/lib/components/FreemiusLicensePanel.es.js +1 -1
  31. package/lib/components/InvoiceDocument.cjs +1 -0
  32. package/lib/components/InvoiceDocument.es.js +1 -1
  33. package/lib/components/{InvoiceViewerShell.cjs.js → InvoiceViewerShell.cjs} +1 -1
  34. package/lib/components/InvoiceViewerShell.es.js +1 -1
  35. package/lib/components/ProductCard.cjs +1 -0
  36. package/lib/components/ProductCard.es.js +1 -1
  37. package/lib/components/ProductDetailsLayout.cjs +1 -0
  38. package/lib/components/ProductDetailsLayout.es.js +1 -1
  39. package/lib/components/ProductGallery.cjs +1 -0
  40. package/lib/components/ProductGallery.es.js +1 -1
  41. package/lib/components/ProductGrid.cjs +1 -0
  42. package/lib/components/ProductGrid.es.js +1 -1
  43. package/lib/components/ShippingEstimator.cjs +1 -0
  44. package/lib/components/ShippingEstimator.es.js +1 -1
  45. package/lib/components/ShortDescription.cjs +1 -0
  46. package/lib/components/ShortDescription.es.js +1 -1
  47. package/lib/components/SimpleTiptapRenderer.cjs +1 -0
  48. package/lib/components/SimpleTiptapRenderer.es.js +1 -1
  49. package/lib/components/SubscriptionSelector.cjs +1 -0
  50. package/lib/components/SubscriptionSelector.es.js +1 -1
  51. package/lib/countries.es.js +1 -1
  52. package/lib/coupon-server.cjs +1 -0
  53. package/lib/coupon-server.es.js +1 -1
  54. package/lib/coupons.es.js +1 -1
  55. package/lib/currency-constants.es.js +1 -1
  56. package/lib/currency-rest-client.es.js +1 -1
  57. package/lib/currency-store.es.js +1 -1
  58. package/lib/currency-sync.cjs +1 -0
  59. package/lib/currency-sync.es.js +1 -1
  60. package/lib/currency.es.js +1 -1
  61. package/lib/customer-addresses.cjs +1 -0
  62. package/lib/customer-addresses.es.js +1 -1
  63. package/lib/customer-orders.cjs +1 -0
  64. package/lib/customer-orders.es.js +1 -1
  65. package/lib/customer.cjs +1 -0
  66. package/lib/customer.es.js +1 -1
  67. package/lib/export-helpers.cjs +1 -0
  68. package/lib/export-helpers.es.js +1 -1
  69. package/lib/factory.cjs +1 -0
  70. package/lib/factory.es.js +1 -1
  71. package/lib/freemius-coupons.cjs +1 -0
  72. package/lib/freemius-coupons.es.js +1 -1
  73. package/lib/freemius-license-claim.cjs +1 -0
  74. package/lib/freemius-license-claim.es.js +1 -1
  75. package/lib/freemius-license.cjs +1 -0
  76. package/lib/freemius-license.es.js +1 -1
  77. package/lib/freemius-order-sync.cjs +1 -0
  78. package/lib/freemius-order-sync.es.js +1 -1
  79. package/lib/freemius-trial-provision.cjs +1 -0
  80. package/lib/freemius-trial-provision.es.js +1 -1
  81. package/lib/inventory-settings.es.js +1 -1
  82. package/lib/{invoice-server.cjs.js → invoice-server.cjs} +1 -1
  83. package/lib/invoice-server.es.js +1 -1
  84. package/lib/invoice-ui.es.js +1 -1
  85. package/lib/invoice.es.js +1 -1
  86. package/lib/{order-inventory.cjs.js → order-inventory.cjs} +1 -1
  87. package/lib/order-inventory.es.js +1 -1
  88. package/lib/order-tax-details.es.js +1 -1
  89. package/lib/pages/cms/coupons/CouponEditorForm.cjs +1 -0
  90. package/lib/pages/cms/coupons/CouponEditorForm.es.js +1 -1
  91. package/lib/pages/cms/coupons/{CouponsPage.cjs.js → CouponsPage.cjs} +1 -1
  92. package/lib/pages/cms/coupons/CouponsPage.es.js +1 -1
  93. package/lib/pages/cms/coupons/CreateCouponDialog.cjs +1 -0
  94. package/lib/pages/cms/coupons/CreateCouponDialog.es.js +1 -1
  95. package/lib/pages/cms/coupons/EditCouponPage.cjs +1 -0
  96. package/lib/pages/cms/coupons/EditCouponPage.es.js +1 -1
  97. package/lib/pages/cms/coupons/ProductScopePicker.es.js +1 -1
  98. package/lib/pages/cms/coupons/actions.cjs +1 -0
  99. package/lib/pages/cms/coupons/actions.es.js +1 -1
  100. package/lib/pages/cms/coupons/index.cjs +1 -0
  101. package/lib/pages/cms/coupons/product-options.es.js +1 -1
  102. package/lib/pages/cms/orders/ExportReportsDialog.cjs +1 -0
  103. package/lib/pages/cms/orders/ExportReportsDialog.es.js +1 -1
  104. package/lib/pages/cms/orders/OrderDetailPage.cjs +1 -0
  105. package/lib/pages/cms/orders/OrderDetailPage.es.js +1 -1
  106. package/lib/pages/cms/orders/OrderPrintButton.es.js +1 -1
  107. package/lib/pages/cms/orders/OrderStatusForm.cjs +1 -0
  108. package/lib/pages/cms/orders/OrderStatusForm.es.js +1 -1
  109. package/lib/pages/cms/orders/OrdersPage.cjs +1 -0
  110. package/lib/pages/cms/orders/OrdersPage.es.js +1 -1
  111. package/lib/pages/cms/orders/actions.es.js +1 -1
  112. package/lib/pages/cms/orders/export-actions.es.js +1 -1
  113. package/lib/pages/cms/orders/index.cjs +1 -0
  114. package/lib/pages/cms/orders/server-actions.cjs +1 -0
  115. package/lib/pages/cms/orders/server-actions.es.js +1 -1
  116. package/lib/pages/cms/payments/PaymentsClient.es.js +1 -1
  117. package/lib/pages/cms/payments/PaymentsPage.cjs +1 -0
  118. package/lib/pages/cms/payments/PaymentsPage.es.js +1 -1
  119. package/lib/pages/cms/payments/actions.cjs +1 -0
  120. package/lib/pages/cms/payments/actions.es.js +1 -1
  121. package/lib/pages/cms/payments/index.cjs +1 -0
  122. package/lib/pages/cms/payments/queries.cjs +1 -0
  123. package/lib/pages/cms/payments/queries.es.js +1 -1
  124. package/lib/pages/cms/products/ProductsPage.cjs +1 -0
  125. package/lib/pages/cms/products/ProductsPage.es.js +1 -1
  126. package/lib/pages/cms/products/[id]/edit/EditProductPage.cjs +1 -0
  127. package/lib/pages/cms/products/{_id_ → [id]}/edit/EditProductPage.es.js +1 -1
  128. package/lib/pages/cms/products/{actions.cjs.js → actions.cjs} +1 -1
  129. package/lib/pages/cms/products/actions.es.js +1 -1
  130. package/lib/pages/cms/products/attributes/AttributeManagementPage.cjs +1 -0
  131. package/lib/pages/cms/products/attributes/AttributeManagementPage.es.js +1 -1
  132. package/lib/pages/cms/products/attributes/components/AttributeManager.es.js +1 -1
  133. package/lib/pages/cms/products/categories/CategoryManagementPage.cjs +1 -0
  134. package/lib/pages/cms/products/categories/CategoryManagementPage.es.js +1 -1
  135. package/lib/pages/cms/products/categories/components/CategoryManager.cjs +1 -0
  136. package/lib/pages/cms/products/categories/components/CategoryManager.es.js +1 -1
  137. package/lib/pages/cms/products/components/CopyProductFromLanguage.cjs +1 -0
  138. package/lib/pages/cms/products/components/CopyProductFromLanguage.es.js +1 -1
  139. package/lib/pages/cms/products/components/CurrencyPriceFields.cjs +1 -0
  140. package/lib/pages/cms/products/components/CurrencyPriceFields.es.js +1 -1
  141. package/lib/pages/cms/products/components/DeleteProductButton.es.js +1 -1
  142. package/lib/pages/cms/products/components/FreemiusPricingDashboard.cjs +1 -0
  143. package/lib/pages/cms/products/components/FreemiusPricingDashboard.es.js +1 -1
  144. package/lib/pages/cms/products/components/ProductCategorySelector.cjs +1 -0
  145. package/lib/pages/cms/products/components/ProductCategorySelector.es.js +1 -1
  146. package/lib/pages/cms/products/components/ProductForm.cjs +1 -0
  147. package/lib/pages/cms/products/components/ProductForm.es.js +1 -1
  148. package/lib/pages/cms/products/components/ProductMediaManager.cjs +1 -0
  149. package/lib/pages/cms/products/components/ProductMediaManager.es.js +1 -1
  150. package/lib/pages/cms/products/components/ProductsBulkTable.cjs +1 -0
  151. package/lib/pages/cms/products/components/ProductsBulkTable.es.js +1 -1
  152. package/lib/pages/cms/products/components/SaleScheduleFields.es.js +1 -1
  153. package/lib/pages/cms/products/components/SyncFreemiusButton.cjs +1 -0
  154. package/lib/pages/cms/products/components/SyncFreemiusButton.es.js +1 -1
  155. package/lib/pages/cms/products/components/{SyncFreemiusPricingButton.cjs.js → SyncFreemiusPricingButton.cjs} +1 -1
  156. package/lib/pages/cms/products/components/SyncFreemiusPricingButton.es.js +1 -1
  157. package/lib/pages/cms/products/components/VariationsEditor.cjs +1 -0
  158. package/lib/pages/cms/products/components/VariationsEditor.es.js +1 -1
  159. package/lib/pages/cms/products/index.cjs +1 -0
  160. package/lib/pages/cms/products/index.es.js +1 -1
  161. package/lib/pages/cms/products/inventory/InventoryPage.cjs +1 -0
  162. package/lib/pages/cms/products/inventory/InventoryPage.es.js +1 -1
  163. package/lib/pages/cms/products/inventory/{InventoryTableClient.cjs.js → InventoryTableClient.cjs} +1 -1
  164. package/lib/pages/cms/products/inventory/InventoryTableClient.es.js +1 -1
  165. package/lib/pages/cms/products/inventory/{actions.cjs.js → actions.cjs} +1 -1
  166. package/lib/pages/cms/products/inventory/actions.es.js +1 -1
  167. package/lib/pages/cms/products/new/NewProductPage.cjs +1 -0
  168. package/lib/pages/cms/products/new/NewProductPage.es.js +1 -1
  169. package/lib/pages/cms/products/product-price-sync.cjs +1 -0
  170. package/lib/pages/cms/products/product-price-sync.es.js +1 -1
  171. package/lib/pages/cms/products/server-actions.cjs +1 -0
  172. package/lib/pages/cms/products/server-actions.es.js +1 -1
  173. package/lib/pages/cms/shipping/{ShippingPage.cjs.js → ShippingPage.cjs} +1 -1
  174. package/lib/pages/cms/shipping/ShippingPage.es.js +1 -1
  175. package/lib/pages/cms/shipping/components/RateForm.cjs +1 -0
  176. package/lib/pages/cms/shipping/components/RateForm.es.js +1 -1
  177. package/lib/pages/cms/shipping/components/ZoneForm.cjs +1 -0
  178. package/lib/pages/cms/shipping/components/ZoneForm.es.js +1 -1
  179. package/lib/pages/cms/shipping/index.cjs +1 -0
  180. package/lib/pages/cms/shipping/server-actions.cjs +1 -0
  181. package/lib/pages/cms/shipping/server-actions.es.js +1 -1
  182. package/lib/pages/cms/taxes/TaxesPage.cjs +1 -0
  183. package/lib/pages/cms/taxes/TaxesPage.es.js +1 -1
  184. package/lib/pages/cms/taxes/actions.cjs +1 -0
  185. package/lib/pages/cms/taxes/actions.es.js +1 -1
  186. package/lib/pages/cms/taxes/components/TaxRateForm.cjs +1 -0
  187. package/lib/pages/cms/taxes/components/TaxRateForm.es.js +1 -1
  188. package/lib/pages/cms/taxes/index.cjs +1 -0
  189. package/lib/payment-config.es.js +1 -1
  190. package/lib/{product-actions.cjs.js → product-actions.cjs} +1 -1
  191. package/lib/product-actions.es.js +1 -1
  192. package/lib/product-context.cjs +1 -0
  193. package/lib/product-context.es.js +1 -1
  194. package/lib/product-schema.cjs +1 -0
  195. package/lib/product-schema.es.js +1 -1
  196. package/lib/providers/freemius.cjs +1 -0
  197. package/lib/providers/freemius.es.js +1 -1
  198. package/lib/providers/stripe.cjs +1 -0
  199. package/lib/providers/stripe.es.js +1 -1
  200. package/lib/server-actions/coupon-actions.cjs +1 -0
  201. package/lib/server-actions/coupon-actions.es.js +1 -1
  202. package/lib/server-actions/customer-actions.cjs +1 -0
  203. package/lib/server-actions/customer-actions.es.js +1 -1
  204. package/lib/server-actions/product-actions.cjs +1 -0
  205. package/lib/server-actions/product-actions.es.js +1 -1
  206. package/lib/server-actions/shipping-actions.cjs +1 -0
  207. package/lib/server-actions/shipping-actions.es.js +1 -1
  208. package/lib/server-actions/tax-actions.cjs +1 -0
  209. package/lib/server-actions/tax-actions.es.js +1 -1
  210. package/lib/shared-inventory.es.js +1 -1
  211. package/lib/shipping/{resolver.cjs.js → resolver.cjs} +1 -1
  212. package/lib/shipping/resolver.es.js +1 -1
  213. package/lib/shipping-rate-currency.cjs +1 -0
  214. package/lib/shipping-rate-currency.es.js +1 -1
  215. package/lib/states.cjs +1 -0
  216. package/lib/stripe/checkout.cjs +1 -0
  217. package/lib/stripe/checkout.es.js +1 -1
  218. package/lib/stripe/client.cjs +1 -0
  219. package/lib/stripe/client.es.js +1 -1
  220. package/lib/stripe/order-sync.cjs +1 -0
  221. package/lib/stripe/order-sync.es.js +1 -1
  222. package/lib/stripe/webhooks.cjs +1 -0
  223. package/lib/stripe/webhooks.es.js +1 -1
  224. package/lib/tax-calculation.cjs +1 -0
  225. package/lib/tax-calculation.es.js +1 -1
  226. package/lib/trials.es.js +1 -1
  227. package/lib/types.es.js +1 -1
  228. package/lib/use-cart.cjs +1 -0
  229. package/lib/use-cart.es.js +1 -1
  230. package/lib/use-price-formatter.es.js +1 -1
  231. package/lib/variation-utils.cjs +1 -0
  232. package/lib/variation-utils.es.js +1 -1
  233. package/lib/zod-config.es.js +1 -1
  234. package/package.json +10 -9
  235. package/server.cjs +1 -0
  236. package/server.es.js +1 -1
  237. package/index.cjs.js +0 -1
  238. package/lib/CurrencyProvider.cjs.js +0 -1
  239. package/lib/PaymentReadinessProvider.cjs.js +0 -1
  240. package/lib/cart-store.cjs.js +0 -1
  241. package/lib/components/AccountNavigationMenu.cjs.js +0 -1
  242. package/lib/components/AddToCartButton.cjs.js +0 -1
  243. package/lib/components/Cart.cjs.js +0 -1
  244. package/lib/components/CartDrawer.cjs.js +0 -1
  245. package/lib/components/CartIcon.cjs.js +0 -1
  246. package/lib/components/Checkout.cjs.js +0 -1
  247. package/lib/components/CouponForm.cjs.js +0 -1
  248. package/lib/components/CurrencySwitcher.cjs.js +0 -1
  249. package/lib/components/CustomerProfileForm.cjs.js +0 -1
  250. package/lib/components/FeaturedProduct.cjs.js +0 -1
  251. package/lib/components/FreemiusLicensePanel.cjs.js +0 -1
  252. package/lib/components/InvoiceDocument.cjs.js +0 -1
  253. package/lib/components/ProductCard.cjs.js +0 -1
  254. package/lib/components/ProductDetailsLayout.cjs.js +0 -1
  255. package/lib/components/ProductGallery.cjs.js +0 -1
  256. package/lib/components/ProductGrid.cjs.js +0 -1
  257. package/lib/components/ShippingEstimator.cjs.js +0 -1
  258. package/lib/components/ShortDescription.cjs.js +0 -1
  259. package/lib/components/SimpleTiptapRenderer.cjs.js +0 -1
  260. package/lib/components/SubscriptionSelector.cjs.js +0 -1
  261. package/lib/coupon-server.cjs.js +0 -1
  262. package/lib/currency-sync.cjs.js +0 -1
  263. package/lib/customer-addresses.cjs.js +0 -1
  264. package/lib/customer-orders.cjs.js +0 -1
  265. package/lib/customer.cjs.js +0 -1
  266. package/lib/export-helpers.cjs.js +0 -1
  267. package/lib/factory.cjs.js +0 -1
  268. package/lib/freemius-coupons.cjs.js +0 -1
  269. package/lib/freemius-license-claim.cjs.js +0 -1
  270. package/lib/freemius-license.cjs.js +0 -1
  271. package/lib/freemius-order-sync.cjs.js +0 -1
  272. package/lib/freemius-trial-provision.cjs.js +0 -1
  273. package/lib/pages/cms/coupons/CouponEditorForm.cjs.js +0 -1
  274. package/lib/pages/cms/coupons/CreateCouponDialog.cjs.js +0 -1
  275. package/lib/pages/cms/coupons/EditCouponPage.cjs.js +0 -1
  276. package/lib/pages/cms/coupons/actions.cjs.js +0 -1
  277. package/lib/pages/cms/coupons/index.cjs.js +0 -1
  278. package/lib/pages/cms/orders/ExportReportsDialog.cjs.js +0 -1
  279. package/lib/pages/cms/orders/OrderDetailPage.cjs.js +0 -1
  280. package/lib/pages/cms/orders/OrderStatusForm.cjs.js +0 -1
  281. package/lib/pages/cms/orders/OrdersPage.cjs.js +0 -1
  282. package/lib/pages/cms/orders/index.cjs.js +0 -1
  283. package/lib/pages/cms/orders/server-actions.cjs.js +0 -1
  284. package/lib/pages/cms/payments/PaymentsPage.cjs.js +0 -1
  285. package/lib/pages/cms/payments/actions.cjs.js +0 -1
  286. package/lib/pages/cms/payments/index.cjs.js +0 -1
  287. package/lib/pages/cms/payments/queries.cjs.js +0 -1
  288. package/lib/pages/cms/products/ProductsPage.cjs.js +0 -1
  289. package/lib/pages/cms/products/_id_/edit/EditProductPage.cjs.js +0 -1
  290. package/lib/pages/cms/products/attributes/AttributeManagementPage.cjs.js +0 -1
  291. package/lib/pages/cms/products/categories/CategoryManagementPage.cjs.js +0 -1
  292. package/lib/pages/cms/products/categories/components/CategoryManager.cjs.js +0 -1
  293. package/lib/pages/cms/products/components/CopyProductFromLanguage.cjs.js +0 -1
  294. package/lib/pages/cms/products/components/CurrencyPriceFields.cjs.js +0 -1
  295. package/lib/pages/cms/products/components/FreemiusPricingDashboard.cjs.js +0 -1
  296. package/lib/pages/cms/products/components/ProductCategorySelector.cjs.js +0 -1
  297. package/lib/pages/cms/products/components/ProductForm.cjs.js +0 -1
  298. package/lib/pages/cms/products/components/ProductMediaManager.cjs.js +0 -1
  299. package/lib/pages/cms/products/components/ProductsBulkTable.cjs.js +0 -1
  300. package/lib/pages/cms/products/components/SyncFreemiusButton.cjs.js +0 -1
  301. package/lib/pages/cms/products/components/VariationsEditor.cjs.js +0 -1
  302. package/lib/pages/cms/products/index.cjs.js +0 -1
  303. package/lib/pages/cms/products/inventory/InventoryPage.cjs.js +0 -1
  304. package/lib/pages/cms/products/new/NewProductPage.cjs.js +0 -1
  305. package/lib/pages/cms/products/product-price-sync.cjs.js +0 -1
  306. package/lib/pages/cms/products/server-actions.cjs.js +0 -1
  307. package/lib/pages/cms/shipping/components/RateForm.cjs.js +0 -1
  308. package/lib/pages/cms/shipping/components/ZoneForm.cjs.js +0 -1
  309. package/lib/pages/cms/shipping/index.cjs.js +0 -1
  310. package/lib/pages/cms/shipping/server-actions.cjs.js +0 -1
  311. package/lib/pages/cms/taxes/TaxesPage.cjs.js +0 -1
  312. package/lib/pages/cms/taxes/actions.cjs.js +0 -1
  313. package/lib/pages/cms/taxes/components/TaxRateForm.cjs.js +0 -1
  314. package/lib/pages/cms/taxes/index.cjs.js +0 -1
  315. package/lib/product-context.cjs.js +0 -1
  316. package/lib/product-schema.cjs.js +0 -1
  317. package/lib/providers/freemius.cjs.js +0 -1
  318. package/lib/providers/stripe.cjs.js +0 -1
  319. package/lib/server-actions/coupon-actions.cjs.js +0 -1
  320. package/lib/server-actions/customer-actions.cjs.js +0 -1
  321. package/lib/server-actions/product-actions.cjs.js +0 -1
  322. package/lib/server-actions/shipping-actions.cjs.js +0 -1
  323. package/lib/server-actions/tax-actions.cjs.js +0 -1
  324. package/lib/shipping-rate-currency.cjs.js +0 -1
  325. package/lib/states.cjs.js +0 -1
  326. package/lib/stripe/checkout.cjs.js +0 -1
  327. package/lib/stripe/client.cjs.js +0 -1
  328. package/lib/stripe/order-sync.cjs.js +0 -1
  329. package/lib/stripe/webhooks.cjs.js +0 -1
  330. package/lib/tax-calculation.cjs.js +0 -1
  331. package/lib/use-cart.cjs.js +0 -1
  332. package/lib/variation-utils.cjs.js +0 -1
  333. package/server.cjs.js +0 -1
  334. /package/_virtual/_rolldown/{runtime.cjs.js → runtime.cjs} +0 -0
  335. /package/lib/{countries.cjs.js → countries.cjs} +0 -0
  336. /package/lib/{coupons.cjs.js → coupons.cjs} +0 -0
  337. /package/lib/{currency-constants.cjs.js → currency-constants.cjs} +0 -0
  338. /package/lib/{currency-rest-client.cjs.js → currency-rest-client.cjs} +0 -0
  339. /package/lib/{currency-store.cjs.js → currency-store.cjs} +0 -0
  340. /package/lib/{currency.cjs.js → currency.cjs} +0 -0
  341. /package/lib/{inventory-settings.cjs.js → inventory-settings.cjs} +0 -0
  342. /package/lib/{invoice-ui.cjs.js → invoice-ui.cjs} +0 -0
  343. /package/lib/{invoice.cjs.js → invoice.cjs} +0 -0
  344. /package/lib/{order-tax-details.cjs.js → order-tax-details.cjs} +0 -0
  345. /package/lib/pages/cms/coupons/{ProductScopePicker.cjs.js → ProductScopePicker.cjs} +0 -0
  346. /package/lib/pages/cms/coupons/{product-options.cjs.js → product-options.cjs} +0 -0
  347. /package/lib/pages/cms/orders/{OrderPrintButton.cjs.js → OrderPrintButton.cjs} +0 -0
  348. /package/lib/pages/cms/orders/{actions.cjs.js → actions.cjs} +0 -0
  349. /package/lib/pages/cms/orders/{export-actions.cjs.js → export-actions.cjs} +0 -0
  350. /package/lib/pages/cms/payments/{PaymentsClient.cjs.js → PaymentsClient.cjs} +0 -0
  351. /package/lib/pages/cms/products/attributes/components/{AttributeManager.cjs.js → AttributeManager.cjs} +0 -0
  352. /package/lib/pages/cms/products/components/{DeleteProductButton.cjs.js → DeleteProductButton.cjs} +0 -0
  353. /package/lib/pages/cms/products/components/{SaleScheduleFields.cjs.js → SaleScheduleFields.cjs} +0 -0
  354. /package/lib/{payment-config.cjs.js → payment-config.cjs} +0 -0
  355. /package/lib/{shared-inventory.cjs.js → shared-inventory.cjs} +0 -0
  356. /package/lib/{trials.cjs.js → trials.cjs} +0 -0
  357. /package/lib/{types.cjs.js → types.cjs} +0 -0
  358. /package/lib/{use-price-formatter.cjs.js → use-price-formatter.cjs} +0 -0
  359. /package/lib/{zod-config.cjs.js → zod-config.cjs} +0 -0
package/README.md ADDED
@@ -0,0 +1,43 @@
1
+ # @nextblock-cms/ecom
2
+
3
+ The premium commerce module of [NextBlock](https://github.com/nextblock-cms/nextblock), the
4
+ open-core CMS for Next.js and Supabase: products and variants, cart and checkout, orders,
5
+ coupons, currencies, shipping zones, tax rates and invoices. Physical products are paid through
6
+ Stripe and digital products through Freemius.
7
+
8
+ NextBlock projects install it under the alias `@nextblock-cms/ecommerce`, and every import uses
9
+ that name. Projects created with `npm create nextblock@latest` already have it:
10
+
11
+ ```json
12
+ "@nextblock-cms/ecommerce": "npm:@nextblock-cms/ecom@latest"
13
+ ```
14
+
15
+ It needs Next.js 16 and React 19 (peer dependencies), plus the NextBlock database schema that
16
+ `@nextblock-cms/db` ships.
17
+
18
+ ## Licensing
19
+
20
+ The source is public under AGPL-3.0-or-later, and the features are license-gated. A NextBlock
21
+ project turns on its checkout API and commerce CMS screens only after an ecommerce license is
22
+ active: start a trial or buy one in the CMS under **Settings → Packages**. The app checks it
23
+ with `verifyPackageOnline('ecommerce')` from `@nextblock-cms/db/server`.
24
+
25
+ ## Entry points
26
+
27
+ | Import | Use it from | What it holds |
28
+ | :-- | :-- | :-- |
29
+ | `@nextblock-cms/ecommerce` | client or server | Storefront and account components (`Cart`, `CartDrawer`, `Checkout`, `ProductGrid`, `ProductCard`, `FeaturedProduct`, `AddToCartButton`, `CurrencySwitcher`, …), the cart store, `CurrencyProvider`, and the CMS `ProductForm` |
30
+ | `@nextblock-cms/ecommerce/server` | server only | Stripe checkout, webhooks and order sync, payment configuration, inventory, invoices, tax details and coupons |
31
+ | `@nextblock-cms/ecommerce/<module>` | depends on the module | One compiled module, for example `@nextblock-cms/ecommerce/cart-store`, `/components/Cart` or `/server-actions/product-actions` |
32
+
33
+ The package keeps each module's `'use client'` or `'use server'` directive, so the consuming
34
+ Next.js build splits client and server code correctly.
35
+
36
+ ## Documentation
37
+
38
+ - [Ecommerce capabilities](https://github.com/nextblock-cms/nextblock/blob/master/docs/02-ECOMMERCE-CAPABILITIES.md)
39
+ - [Project overview](https://github.com/nextblock-cms/nextblock/blob/master/docs/01-PROJECT-OVERVIEW.md)
40
+
41
+ ## License
42
+
43
+ AGPL-3.0-or-later.
package/index.cjs ADDED
@@ -0,0 +1 @@
1
+ Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require("./lib/types.cjs"),t=require("./lib/currency.cjs"),n=require("./lib/currency-store.cjs"),r=require("./lib/CurrencyProvider.cjs"),i=require("./lib/cart-store.cjs"),a=require("./lib/use-cart.cjs"),o=require("./lib/trials.cjs"),s=require("./lib/coupons.cjs"),c=require("./lib/components/CouponForm.cjs"),l=require("./lib/components/CartDrawer.cjs"),u=require("./lib/variation-utils.cjs"),d=require("./lib/components/Cart.cjs"),f=require("./lib/PaymentReadinessProvider.cjs"),p=require("./lib/customer.cjs"),m=require("./lib/components/Checkout.cjs"),h=require("./lib/components/CartIcon.cjs"),g=require("./lib/components/CurrencySwitcher.cjs"),_=require("./lib/components/AddToCartButton.cjs"),v=require("./lib/components/ProductCard.cjs"),y=require("./lib/components/ProductGrid.cjs"),b=require("./lib/invoice-ui.cjs"),x=require("./lib/components/ProductGallery.cjs"),S=require("./lib/components/SimpleTiptapRenderer.cjs"),C=require("./lib/components/FeaturedProduct.cjs"),w=require("./lib/components/AccountNavigationMenu.cjs"),T=require("./lib/components/CustomerProfileForm.cjs"),E=require("./lib/components/SubscriptionSelector.cjs"),D=require("./lib/invoice.cjs"),O=require("./lib/order-tax-details.cjs"),k=require("./lib/components/InvoiceDocument.cjs"),A=require("./lib/components/InvoiceViewerShell.cjs"),j=require("./lib/components/FreemiusLicensePanel.cjs"),M=require("./lib/product-schema.cjs"),N=require("./lib/pages/cms/products/components/ProductCategorySelector.cjs"),P=require("./lib/pages/cms/products/components/ProductForm.cjs"),F=require("./lib/product-context.cjs"),I=require("./lib/components/ProductDetailsLayout.cjs");exports.AccountNavigationMenu=w.AccountNavigationMenu,exports.AddToCartButton=_.AddToCartButton,exports.CURRENCY_ROUNDING_MODES=t.CURRENCY_ROUNDING_MODES,exports.Cart=d.Cart,exports.CartDrawer=l.CartDrawer,exports.CartIcon=h.CartIcon,exports.Checkout=m.Checkout,exports.CouponForm=c.CouponForm,exports.CurrencyProvider=r.CurrencyProvider,exports.CurrencySwitcher=g.CurrencySwitcher,exports.CustomerProfileForm=T.CustomerProfileForm,exports.DEFAULT_ENABLED_PAYMENT_PROVIDERS=e.DEFAULT_ENABLED_PAYMENT_PROVIDERS,exports.DEFAULT_INVOICE_SETTINGS=D.DEFAULT_INVOICE_SETTINGS,exports.FeaturedProduct=C.FeaturedProduct,exports.FreemiusLicensePanel=j.FreemiusLicensePanel,exports.INVOICE_SETTINGS_KEY=D.INVOICE_SETTINGS_KEY,exports.InvoiceDocument=k.InvoiceDocument,exports.InvoiceViewerShell=A.InvoiceViewerShell,exports.PaymentReadinessProvider=f.PaymentReadinessProvider,exports.ProductCard=v.ProductCard,exports.ProductCategorySelector=N.ProductCategorySelector,exports.ProductDetailsLayout=I.ProductDetailsLayout,exports.ProductForm=P.ProductForm,exports.ProductGallery=x.ProductGallery,exports.ProductGrid=y.ProductGrid,exports.ProductProvider=F.ProductProvider,exports.SimpleTiptapRenderer=S.SimpleTiptapRenderer,exports.SubscriptionSelector=E.SubscriptionSelector,exports.addressesMatch=p.addressesMatch,exports.aggregateOrderTaxLines=O.aggregateOrderTaxLines,exports.applyCurrencyRounding=t.applyCurrencyRounding,exports.applyVariantSelection=u.applyVariantSelection,exports.buildCombinationKey=u.buildCombinationKey,exports.buildInvoiceDocumentLabels=b.buildInvoiceDocumentLabels,exports.buildOrderTaxDetailsFromCalculation=O.buildOrderTaxDetailsFromCalculation,exports.buildOrderTaxDetailsFromStripeSession=O.buildOrderTaxDetailsFromStripeSession,exports.buildVariantLabel=u.buildVariantLabel,exports.chooseInitialVariantSelections=u.chooseInitialVariantSelections,exports.convertMinorUnitAmount=t.convertMinorUnitAmount,exports.derivePaymentProviderFromProductType=e.derivePaymentProviderFromProductType,exports.describeCurrencyRoundingRule=t.describeCurrencyRoundingRule,exports.emptyCustomerAddress=p.emptyCustomerAddress,exports.emptyProviderDiscounts=s.emptyProviderDiscounts,exports.extractSelectedTermsByAttribute=u.extractSelectedTermsByAttribute,exports.findMatchingVariant=u.findMatchingVariant,exports.formatInvoiceCurrency=D.formatInvoiceCurrency,exports.formatInvoiceDate=D.formatInvoiceDate,exports.generateVariantDrafts=u.generateVariantDrafts,exports.getAvailableTermIdsForAttribute=u.getAvailableTermIdsForAttribute,exports.getCartItemActivePrice=i.getCartItemActivePrice,exports.getCartLineCouponKey=s.getCartLineCouponKey,exports.getCurrencyLookup=t.getCurrencyLookup,exports.getDefaultCurrency=t.getDefaultCurrency,exports.getExchangeRateForCurrency=t.getExchangeRateForCurrency,exports.getInvoiceAddressLines=D.getInvoiceAddressLines,exports.getInvoiceLocale=b.getInvoiceLocale,exports.getOrderTaxRateJurisdiction=O.getOrderTaxRateJurisdiction,exports.getOrderTaxRateLabel=O.getOrderTaxRateLabel,exports.getOrderTaxRatePercentage=O.getOrderTaxRatePercentage,exports.getProductPaymentProvider=e.getProductPaymentProvider,exports.getTrialCheckoutMode=o.getTrialCheckoutMode,exports.getTrialLabel=o.getTrialLabel,exports.getTrialPaymentRequirementLabel=o.getTrialPaymentRequirementLabel,exports.getTrialPeriodDays=o.getTrialPeriodDays,exports.getTrialSummary=o.getTrialSummary,exports.getVariantEffectivePriceRange=u.getVariantEffectivePriceRange,exports.inferCurrencyCodeFromLocale=t.inferCurrencyCodeFromLocale,exports.isCustomerAddressComplete=p.isCustomerAddressComplete,exports.isDigitalItem=e.isDigitalItem,exports.isDigitalProduct=e.isDigitalProduct,exports.isSaleWindowActive=t.isSaleWindowActive,exports.isScheduledPriceDue=t.isScheduledPriceDue,exports.localizeInvoicePresentationData=b.localizeInvoicePresentationData,exports.mapRawVariantRelations=u.mapRawVariantRelations,exports.normalizeCouponCode=s.normalizeCouponCode,exports.normalizeCurrencyRecord=t.normalizeCurrencyRecord,exports.normalizeCurrencyRoundingMode=t.normalizeCurrencyRoundingMode,exports.normalizeCustomerAddress=p.normalizeCustomerAddress,exports.normalizeEnabledPaymentProviders=e.normalizeEnabledPaymentProviders,exports.normalizeInvoiceSettings=D.normalizeInvoiceSettings,exports.normalizeOrderCustomerDetails=p.normalizeOrderCustomerDetails,exports.normalizeOrderTaxDetails=O.normalizeOrderTaxDetails,exports.normalizePriceMap=t.normalizePriceMap,exports.normalizeSalePriceMap=t.normalizeSalePriceMap,exports.normalizeSelectionsToAvailableVariants=u.normalizeSelectionsToAvailableVariants,exports.productSchema=M.productSchema,exports.resolveAttributeName=u.resolveAttributeName,exports.resolveEffectivePriceForCurrency=t.resolveEffectivePriceForCurrency,exports.resolvePriceForCurrency=t.resolvePriceForCurrency,exports.resolvePriceRangeForCurrency=t.resolvePriceRangeForCurrency,exports.resolveTermValue=u.resolveTermValue,exports.resolveTranslatedText=u.resolveTranslatedText,exports.serializeInvoiceSettings=D.serializeInvoiceSettings,exports.sortCurrencies=t.sortCurrencies,exports.toNoCookieEmbedSrc=S.toNoCookieEmbedSrc,exports.translateOrFallback=b.translateOrFallback,exports.translateOrderStatus=b.translateOrderStatus,exports.useCanPurchase=f.useCanPurchase,exports.useCart=a.useCart,exports.useCartStore=i.useCartStore,exports.useCartSubtotal=i.useCartSubtotal,exports.useCartTotalItems=i.useCartTotalItems,exports.useCurrency=r.useCurrency,exports.useCurrencyPreferenceStore=n.useCurrencyPreferenceStore,exports.useIsCartHydrated=a.useIsCartHydrated,exports.usePaymentReadiness=f.usePaymentReadiness,exports.useProduct=F.useProduct;
@@ -0,0 +1 @@
1
+ "use client";Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require("./currency.cjs"),t=require("./currency-store.cjs"),n=require("./currency-constants.cjs");let r=require("react"),i=require("@nextblock-cms/utils"),a=require("react/jsx-runtime");var o=(0,r.createContext)(null);function s(t){return e.sortCurrencies(t.filter(e=>e.is_active!==!1))}function c(t){let{currencies:n,storedCurrencyCode:r,hasHydrated:a,initialCurrencyCode:o,locale:s}=t,c=new Set(n.map(e=>(0,i.normalizeCurrencyCode)(e.code))),l=e.getDefaultCurrency(n),u=o?(0,i.normalizeCurrencyCode)(o):null,d=r?(0,i.normalizeCurrencyCode)(r):null;if(a&&d&&c.has(d))return d;if(u&&c.has(u))return u;let f=e.inferCurrencyCodeFromLocale(s,n);return c.has(f)?f:l.code}function l({children:l,initialCurrencies:u,initialCurrencyCode:d,locale:f}){let[p,m]=(0,r.useState)(()=>s(u)),h=t.useCurrencyPreferenceStore(e=>e.activeCurrencyCode),g=t.useCurrencyPreferenceStore(e=>e.hasHydrated),_=t.useCurrencyPreferenceStore(e=>e.setActiveCurrencyCode);(0,r.useEffect)(()=>{t.useCurrencyPreferenceStore.persist.rehydrate()},[]),(0,r.useEffect)(()=>{u.length>0&&m(s(u))},[u]),(0,r.useEffect)(()=>{if(u.length>0)return;async function t(){let{fetchActiveCurrenciesFromRest:t}=await Promise.resolve().then(()=>require("./currency-rest-client.cjs")),n=await t();n.length>0&&m(s(n.map(t=>e.normalizeCurrencyRecord(t))))}t()},[u.length]);let v=(0,r.useMemo)(()=>c({currencies:p,storedCurrencyCode:h,hasHydrated:g,initialCurrencyCode:d,locale:f}),[p,h,g,d,f]);(0,r.useEffect)(()=>{g&&v&&h!==v&&_(v)},[g,v,_,h]),(0,r.useEffect)(()=>{v&&typeof document<`u`&&(document.cookie=`${n.CURRENCY_COOKIE_NAME}=${v}; Path=/; Max-Age=31536000; SameSite=Lax`)},[v]);let y=(0,r.useMemo)(()=>e.getDefaultCurrency(p),[p]),b=(0,r.useMemo)(()=>p.find(e=>e.code===v)??y,[p,y,v]),x=(0,r.useMemo)(()=>({currencies:p,defaultCurrency:y,activeCurrency:b,activeCurrencyCode:b.code,isHydrated:g,setActiveCurrencyCode:e=>{let t=(0,i.normalizeCurrencyCode)(e);p.some(e=>e.code===t)&&_(t)}}),[b,p,y,g,_]);return(0,a.jsx)(o.Provider,{value:x,children:l})}function u(){let e=(0,r.useContext)(o);if(!e)throw Error(`useCurrency must be used inside a CurrencyProvider`);return e}exports.CurrencyProvider=l,exports.useCurrency=u;
@@ -5,7 +5,7 @@ import { CURRENCY_COOKIE_NAME as a } from "./currency-constants.es.js";
5
5
  import { createContext as o, useContext as s, useEffect as c, useMemo as l, useState as u } from "react";
6
6
  import { normalizeCurrencyCode as d } from "@nextblock-cms/utils";
7
7
  import { jsx as f } from "react/jsx-runtime";
8
- //#region libs/ecommerce/src/lib/CurrencyProvider.tsx
8
+ //#region src/lib/CurrencyProvider.tsx
9
9
  var p = o(null);
10
10
  function m(e) {
11
11
  return r(e.filter((e) => e.is_active !== !1));
@@ -0,0 +1 @@
1
+ "use client";const e=require("./types.cjs");let t=require("react"),n=require("react/jsx-runtime");var r=(0,t.createContext)({stripe:!0,freemius:!0});function i({readiness:e,children:i}){let a=(0,t.useMemo)(()=>({stripe:e?.stripe??!0,freemius:e?.freemius??!0}),[e?.stripe,e?.freemius]);return(0,n.jsx)(r.Provider,{value:a,children:i})}function a(){return(0,t.useContext)(r)}function o(t){return a()[e.getProductPaymentProvider(t)??`stripe`]??!0}exports.PaymentReadinessProvider=i,exports.useCanPurchase=o,exports.usePaymentReadiness=a;
@@ -2,7 +2,7 @@
2
2
  import { getProductPaymentProvider as e } from "./types.es.js";
3
3
  import { createContext as t, useContext as n, useMemo as r } from "react";
4
4
  import { jsx as i } from "react/jsx-runtime";
5
- //#region libs/ecommerce/src/lib/PaymentReadinessProvider.tsx
5
+ //#region src/lib/PaymentReadinessProvider.tsx
6
6
  var a = t({
7
7
  stripe: !0,
8
8
  freemius: !0
@@ -0,0 +1 @@
1
+ Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require("./types.cjs"),t=require("./currency.cjs"),n=require("./CurrencyProvider.cjs");let r=require("zustand"),i=require("zustand/middleware");function a(t,n,r){return t.reduce((t,i)=>e.isDigitalItem(i)||i.sku!==n||r&&i.id===r?t:t+i.quantity,0)}var o=(0,r.create)()((0,i.persist)((t,n)=>({items:[],appliedCoupon:null,isOpen:!1,addItem:r=>{let{items:i}=n(),o=r.quantity??1,s=typeof r.stock==`number`?r.stock:null,c=s===null?0:a(i,r.sku);if(e.isDigitalItem(r))return i.find(t=>t.product_id===r.product_id&&e.isDigitalItem(t))?{success:!1,error:`This software license is already in your cart.`,errorKey:`ecommerce.cart_error_license_in_cart`}:(t({items:[...i,{...r,quantity:1}],isOpen:!0}),{success:!0});let l=i.find(e=>e.id===r.id);return s!==null&&s<=0?{success:!1,error:`This item is out of stock.`,errorKey:`ecommerce.cart_error_out_of_stock`}:s!==null&&c+o>s?{success:!1,error:`Only ${s} available for this SKU.`,errorKey:`ecommerce.cart_error_stock_limit`,errorParams:{count:s}}:(t(l?{items:i.map(e=>e.id===r.id?{...e,...r,quantity:e.quantity+o}:e),isOpen:!0}:{items:[...i,{...r,quantity:o}],isOpen:!0}),{success:!0})},removeItem:e=>{let{items:r}=n();t({items:r.filter(t=>t.id!==e)})},updateQuantity:(r,i)=>{let{items:o}=n(),s=o.find(e=>e.id===r);s&&e.isDigitalItem(s)||(s&&typeof s.stock==`number`&&i+a(o,s.sku,r)>s.stock&&(i=Math.max(s.stock-a(o,s.sku,r),0)),t(i<=0?{items:o.filter(e=>e.id!==r)}:{items:o.map(e=>e.id===r?{...e,quantity:i}:e)}))},setAppliedCoupon:e=>{let r=n().appliedCoupon;(r?.code!==e?.code||r?.couponId!==e?.couponId)&&t({appliedCoupon:e})},removeCoupon:()=>{n().appliedCoupon&&t({appliedCoupon:null})},clearCart:()=>t({items:[],appliedCoupon:null}),toggleCart:()=>t(e=>({isOpen:!e.isOpen})),setIsOpen:e=>t({isOpen:e}),setItems:e=>t({items:e})}),{name:`cart-storage`,storage:(0,i.createJSONStorage)(()=>localStorage),skipHydration:!0,partialize:e=>({items:e.items,appliedCoupon:e.appliedCoupon})})),s=()=>o(e=>e.items).reduce((e,t)=>e+t.quantity,0);function c(e,n){return t.resolveEffectivePriceForCurrency({prices:e.prices,salePrices:e.sale_prices,fallbackPrice:e.price,fallbackSalePrice:e.sale_price,saleStartAt:e.sale_start_at,saleEndAt:e.sale_end_at,scheduledPrice:e.scheduled_price,scheduledPrices:e.scheduled_prices,scheduledPriceAt:e.scheduled_price_at,currencyCode:n.currencyCode,currencies:n.currencies})}var l=()=>{let e=o(e=>e.items),{activeCurrencyCode:t,currencies:r}=n.useCurrency();return e.reduce((e,n)=>{let{price:i,sale_price:a}=c(n,{currencyCode:t,currencies:r});return e+(a??i)*n.quantity},0)};exports.getCartItemActivePrice=c,exports.useCartStore=o,exports.useCartSubtotal=l,exports.useCartTotalItems=s;
@@ -3,7 +3,7 @@ import { resolveEffectivePriceForCurrency as t } from "./currency.es.js";
3
3
  import { useCurrency as n } from "./CurrencyProvider.es.js";
4
4
  import { create as r } from "zustand";
5
5
  import { createJSONStorage as i, persist as a } from "zustand/middleware";
6
- //#region libs/ecommerce/src/lib/cart-store.ts
6
+ //#region src/lib/cart-store.ts
7
7
  function o(t, n, r) {
8
8
  return t.reduce((t, i) => e(i) || i.sku !== n || r && i.id === r ? t : t + i.quantity, 0);
9
9
  }
@@ -0,0 +1 @@
1
+ "use client";const e=require("../../_virtual/_rolldown/runtime.cjs");let t=require("next/link");t=e.__toESM(t,1);let n=require("lucide-react"),r=require("@nextblock-cms/utils"),i=require("react/jsx-runtime"),a=require("next/navigation");function o(e,t,n){let r=e(t);return r===t?n:r}function s(e){return e===`password`?n.KeyRound:n.Package2}function c({links:e,title:n,className:c}){let l=(0,a.usePathname)(),{t:u}=(0,r.useTranslations)();return e.length?(0,i.jsxs)(`nav`,{"aria-label":n||o(u,`account_navigation`,`Account`),className:(0,r.cn)(`w-full space-y-3`,c),children:[(0,i.jsx)(`div`,{"aria-hidden":`true`,className:`text-sm font-medium text-muted-foreground uppercase tracking-wider`,children:n||o(u,`account_navigation`,`Account`)}),(0,i.jsx)(`div`,{className:`space-y-2`,children:e.map(e=>{let n=s(e.icon),a=l===e.href||l.startsWith(`${e.href}/`);return(0,i.jsxs)(t.default,{href:e.href,"aria-current":a?`page`:void 0,className:(0,r.cn)(`flex items-center gap-3 rounded-xl border px-3 py-2.5 text-sm font-medium transition-colors`,a?`border-primary bg-primary text-primary-foreground`:`border-border bg-background hover:bg-muted/40`),children:[(0,i.jsx)(n,{className:`h-4 w-4 shrink-0`}),(0,i.jsx)(`span`,{children:o(u,e.labelKey,e.fallbackLabel)})]},e.href)})})]}):null}exports.AccountNavigationMenu=c;
@@ -4,7 +4,7 @@ import { KeyRound as t, Package2 as n } from "lucide-react";
4
4
  import { cn as r, useTranslations as i } from "@nextblock-cms/utils";
5
5
  import { jsx as a, jsxs as o } from "react/jsx-runtime";
6
6
  import { usePathname as s } from "next/navigation";
7
- //#region libs/ecommerce/src/lib/components/AccountNavigationMenu.tsx
7
+ //#region src/lib/components/AccountNavigationMenu.tsx
8
8
  function c(e, t, n) {
9
9
  let r = e(t);
10
10
  return r === t ? n : r;
@@ -0,0 +1 @@
1
+ "use client";const e=require("../../_virtual/_rolldown/runtime.cjs"),t=require("../types.cjs"),n=require("../CurrencyProvider.cjs"),r=require("../use-cart.cjs"),i=require("../PaymentReadinessProvider.cjs");let a=require("@nextblock-cms/ui/button"),o=require("next/link");o=e.__toESM(o,1);let s=require("lucide-react"),c=require("@nextblock-cms/utils"),l=require("react/jsx-runtime"),u=require("sonner");var d=({product:e,className:d,quantity:f})=>{let p=r.useCart(e=>e),{t:m}=(0,c.useTranslations)(),{activeCurrencyCode:h}=n.useCurrency(),g=i.useCanPurchase(e),_=t.isDigitalProduct(e),v=!!e.has_variants&&!e.variant_id&&!_,y=!_&&typeof e.stock==`number`&&e.stock<=0;if(!g){let t=m(`ecommerce.contact_seller`);return(0,l.jsx)(a.Button,{asChild:!0,variant:`outline`,className:d,children:(0,l.jsxs)(o.default,{href:`/product/${e.slug}#contact-seller`,children:[(0,l.jsx)(s.Mail,{className:`mr-2 h-4 w-4`}),t===`ecommerce.contact_seller`?`Contact the seller`:t]})})}if(v)return(0,l.jsx)(a.Button,{asChild:!0,className:d,children:(0,l.jsx)(o.default,{href:`/product/${e.slug}`,children:m(`ecommerce.select_options`)===`ecommerce.select_options`?`Select options`:m(`ecommerce.select_options`)})});if(y){let e=m(`ecommerce.out_of_stock`);return(0,l.jsxs)(a.Button,{disabled:!0,className:d,children:[(0,l.jsx)(s.ShoppingCart,{className:`mr-2 h-4 w-4`}),e===`ecommerce.out_of_stock`?`Out of stock`:e]})}if(!p)return(0,l.jsxs)(a.Button,{disabled:!0,className:d,children:[(0,l.jsx)(s.ShoppingCart,{className:`mr-2 h-4 w-4`}),m(`ecommerce.add_to_cart`)]});let{addItem:b}=p;return(0,l.jsxs)(a.Button,{onClick:()=>{let n=t.getProductPaymentProvider(e)??`stripe`,{success:r,error:i,errorKey:a,errorParams:o}=b({id:e.variant_id||e.id,product_id:e.id,title:e.title,price:e.price,prices:e.prices,sale_price:e.sale_price,sale_prices:e.sale_prices,sale_start_at:e.sale_start_at,sale_end_at:e.sale_end_at,scheduled_price:e.scheduled_price,scheduled_prices:e.scheduled_prices,scheduled_price_at:e.scheduled_price_at,is_taxable:e.is_taxable,image_url:e.image_url,slug:e.slug,sku:e.sku,stock:e.stock,language_id:e.language_id,translation_group_id:e.translation_group_id,product_type:e.product_type,payment_provider:e.payment_provider??n,provider:n,freemius_product_id:e.freemius_product_id,freemius_plan_id:e.freemius_plan_id,trial_period_days:e.trial_period_days??0,trial_requires_payment_method:e.trial_requires_payment_method??!1,has_variants:e.has_variants,variant_id:e.variant_id,variant_label:e.variant_label,selected_options:e.selected_options,currency_code:h,quantity:f});if(r)u.toast.success(m(`ecommerce.added_to_cart_success`,{item:e.title}));else{let e=a?m(a,o):null;u.toast.error(e&&e!==a?e:i||m(`ecommerce.added_to_cart_error`))}},className:d,children:[(0,l.jsx)(s.ShoppingCart,{className:`mr-2 h-4 w-4`}),m(`ecommerce.add_to_cart`)]})};exports.AddToCartButton=d;
@@ -9,7 +9,7 @@ import { Mail as s, ShoppingCart as c } from "lucide-react";
9
9
  import { useTranslations as l } from "@nextblock-cms/utils";
10
10
  import { jsx as u, jsxs as d } from "react/jsx-runtime";
11
11
  import { toast as f } from "sonner";
12
- //#region libs/ecommerce/src/lib/components/AddToCartButton.tsx
12
+ //#region src/lib/components/AddToCartButton.tsx
13
13
  var p = ({ product: p, className: m, quantity: h }) => {
14
14
  let g = r((e) => e), { t: _ } = l(), { activeCurrencyCode: v } = n(), y = i(p), b = t(p), x = !!p.has_variants && !p.variant_id && !b, S = !b && typeof p.stock == "number" && p.stock <= 0;
15
15
  if (!y) {
@@ -0,0 +1 @@
1
+ "use client";Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require("../../_virtual/_rolldown/runtime.cjs"),t=require("../types.cjs"),n=require("../CurrencyProvider.cjs"),r=require("../cart-store.cjs"),i=require("../use-cart.cjs"),a=require("../use-price-formatter.cjs"),o=require("../trials.cjs"),s=require("./CouponForm.cjs"),c=require("./ShippingEstimator.cjs");let l=require("@nextblock-cms/ui/badge"),u=require("@nextblock-cms/ui/button"),d=require("next/link");d=e.__toESM(d,1);let f=require("react"),p=require("lucide-react"),m=require("@nextblock-cms/utils"),h=require("react/jsx-runtime"),g=require("@nextblock-cms/ui/table");var _=()=>{let e=a.usePriceFormatter(),_=i.useCart(e=>e),v=r.useCartSubtotal(),{t:y}=(0,m.useTranslations)(),b=(e,t,n)=>{let r=y(e,n);return r===e?t:r},{activeCurrencyCode:x,currencies:S}=n.useCurrency(),C=_?.items??[],w=(0,f.useMemo)(()=>C.reduce((e,n)=>{if(t.isDigitalItem(n))return e;let i=r.getCartItemActivePrice(n,{currencyCode:x,currencies:S});return e+(i.sale_price??i.price)*n.quantity},0),[x,S,C]);if(!_)return(0,h.jsxs)(`div`,{role:`status`,"aria-busy":`true`,className:`container mx-auto py-12`,children:[(0,h.jsx)(`span`,{className:`sr-only`,children:y(`loading`)===`loading`?`Loading…`:y(`loading`)}),(0,h.jsx)(`div`,{className:`mb-8 h-9 w-56 rounded-md bg-muted`}),(0,h.jsxs)(`div`,{className:`grid gap-12 lg:grid-cols-12 lg:items-start`,children:[(0,h.jsx)(`div`,{className:`h-64 rounded-lg border bg-muted/40 lg:col-span-8`}),(0,h.jsx)(`div`,{className:`h-64 rounded-lg border bg-muted/40 lg:col-span-4`})]})]});let{updateQuantity:T,removeItem:E}=_,D=e=>C.reduce((n,r)=>t.isDigitalItem(r)||r.sku!==e?n:n+r.quantity,0);return C.length===0?(0,h.jsxs)(`div`,{className:`flex flex-col items-center justify-center space-y-4 py-12`,children:[(0,h.jsx)(`h1`,{className:`text-2xl font-bold`,children:y(`ecommerce.cart_empty`)}),(0,h.jsx)(`p`,{className:`text-muted-foreground`,children:y(`ecommerce.cart_empty_description`)}),(0,h.jsx)(u.Button,{asChild:!0,children:(0,h.jsx)(d.default,{href:`/shop`,children:y(`ecommerce.continue_shopping`)})})]}):(0,h.jsxs)(`div`,{className:`container mx-auto py-12`,children:[(0,h.jsx)(`h1`,{className:`mb-8 text-3xl font-bold`,children:y(`ecommerce.shopping_cart`)}),(0,h.jsxs)(`div`,{className:`grid gap-12 lg:grid-cols-12 lg:items-start`,children:[(0,h.jsx)(`div`,{className:`lg:col-span-8`,children:(0,h.jsx)(`div`,{className:`rounded-lg border overflow-hidden`,children:(0,h.jsxs)(g.Table,{children:[(0,h.jsx)(g.TableHeader,{children:(0,h.jsxs)(g.TableRow,{children:[(0,h.jsx)(g.TableHead,{children:y(`ecommerce.product`)}),(0,h.jsx)(g.TableHead,{children:y(`ecommerce.quantity`)}),(0,h.jsx)(g.TableHead,{className:`text-right`,children:y(`ecommerce.price`)}),(0,h.jsx)(g.TableHead,{className:`text-right`,children:y(`ecommerce.total`)}),(0,h.jsx)(g.TableHead,{className:`w-[50px]`,children:(0,h.jsx)(`span`,{className:`sr-only`,children:b(`ecommerce.actions`,`Actions`)})})]})}),(0,h.jsx)(g.TableBody,{children:C.map(n=>{let i=D(n.sku),a=r.getCartItemActivePrice(n,{currencyCode:x,currencies:S}),s=o.getTrialSummary(n,y);return(0,h.jsxs)(g.TableRow,{children:[(0,h.jsx)(g.TableCell,{children:(0,h.jsxs)(`div`,{className:`flex items-center gap-4`,children:[n.image_url?(0,h.jsx)(`div`,{className:`h-16 w-16 overflow-hidden rounded border bg-neutral-100`,children:(0,h.jsx)(`img`,{src:n.image_url,alt:n.title,className:`h-full w-full object-cover`})}):(0,h.jsx)(`div`,{className:`flex h-16 w-16 items-center justify-center rounded bg-secondary`,children:(0,h.jsx)(`span`,{className:`text-[10px] text-muted-foreground`,children:y(`ecommerce.no_image`)})}),(0,h.jsxs)(`div`,{className:`min-w-0 break-words`,children:[(0,h.jsx)(`div`,{className:`font-medium`,children:n.title}),n.variant_label&&(0,h.jsx)(`div`,{className:`mt-1 text-xs text-muted-foreground`,children:n.variant_label}),t.isDigitalItem(n)&&n.billing_cycle&&(0,h.jsx)(`div`,{className:`mt-1 text-xs text-muted-foreground`,children:b(`ecommerce.checkout_billing_cycle_${n.billing_cycle}`,`${n.billing_cycle} subscription`)}),s&&(0,h.jsxs)(`div`,{className:`mt-1 text-xs font-medium text-emerald-700`,children:[s.label,` - `,s.paymentRequirementLabel]})]})]})}),(0,h.jsx)(g.TableCell,{children:t.isDigitalItem(n)?(0,h.jsx)(l.Badge,{variant:`secondary`,className:`font-normal text-xs`,children:b(`ecommerce.license_count_one`,`1 license`,{count:1})}):(0,h.jsxs)(`div`,{role:`group`,"aria-label":`${b(`ecommerce.quantity`,`Quantity`)}: ${n.title}`,className:`flex items-center gap-2`,children:[(0,h.jsx)(u.Button,{variant:`outline`,size:`icon`,className:`h-8 w-8`,"aria-label":b(`ecommerce.decrease_quantity`,`Decrease quantity`),onClick:()=>T(n.id,n.quantity-1),children:(0,h.jsx)(p.Minus,{className:`h-4 w-4`})}),(0,h.jsx)(`span`,{"aria-live":`polite`,"aria-atomic":`true`,className:`w-8 text-center tabular-nums`,children:n.quantity}),(0,h.jsx)(u.Button,{variant:`outline`,size:`icon`,className:`h-8 w-8`,"aria-label":b(`ecommerce.increase_quantity`,`Increase quantity`),onClick:()=>T(n.id,n.quantity+1),disabled:typeof n.stock==`number`&&i>=n.stock,children:(0,h.jsx)(p.Plus,{className:`h-4 w-4`})})]})}),(0,h.jsx)(g.TableCell,{className:`text-right`,children:(0,h.jsxs)(`div`,{className:`flex flex-col items-end tabular-nums`,children:[(0,h.jsxs)(`span`,{className:`font-medium`,children:[a.sale_price&&(0,h.jsxs)(`span`,{className:`sr-only`,children:[b(`ecommerce.sale_price`,`Sale price`),` `]}),e(a.sale_price??a.price,x)]}),a.sale_price&&(0,h.jsxs)(`span`,{className:`text-xs text-muted-foreground`,children:[(0,h.jsxs)(`span`,{className:`sr-only`,children:[b(`ecommerce.regular_price`,`Regular price`),` `]}),(0,h.jsx)(`s`,{children:e(a.price,x)})]})]})}),(0,h.jsx)(g.TableCell,{className:`text-right font-medium tabular-nums`,children:e((a.sale_price??a.price)*n.quantity,x)}),(0,h.jsx)(g.TableCell,{children:(0,h.jsx)(u.Button,{variant:`ghost`,size:`icon`,onClick:()=>E(n.id),"aria-label":b(`ecommerce.remove_item`,`Remove ${n.title} from cart`,{item:n.title}),className:`text-muted-foreground hover:text-destructive`,children:(0,h.jsx)(p.Trash2,{className:`h-4 w-4`})})})]},n.id)})})]})})}),(0,h.jsx)(`div`,{className:`lg:col-span-4`,children:(0,h.jsxs)(`div`,{className:`rounded-lg border bg-card p-6 shadow-sm`,children:[(0,h.jsx)(`h2`,{className:`mb-4 text-lg font-semibold`,children:y(`ecommerce.order_summary`)}),(0,h.jsxs)(`div`,{className:`flex justify-between border-b pb-4`,children:[(0,h.jsx)(`span`,{children:y(`ecommerce.subtotal`)}),(0,h.jsx)(`span`,{className:`font-medium tabular-nums`,children:e(v,x)})]}),(0,h.jsxs)(`div`,{className:`mt-4 flex flex-col gap-4`,children:[(0,h.jsx)(`p`,{className:`text-sm text-muted-foreground`,children:y(`ecommerce.shipping_taxes_calculated`)}),C.some(e=>!t.isDigitalItem(e))&&(0,h.jsx)(c.ShippingEstimator,{physicalSubtotal:w}),(0,h.jsx)(s.CouponForm,{items:C,currencyCode:x,compact:!0}),(0,h.jsx)(u.Button,{asChild:!0,className:`w-full mt-4`,size:`lg`,children:(0,h.jsx)(d.default,{href:`/checkout`,children:y(`ecommerce.proceed_to_checkout`)})})]})]})})]})]})};exports.Cart=_;
@@ -15,7 +15,7 @@ import { Minus as p, Plus as m, Trash2 as h } from "lucide-react";
15
15
  import { useTranslations as g } from "@nextblock-cms/utils";
16
16
  import { jsx as _, jsxs as v } from "react/jsx-runtime";
17
17
  import { Table as y, TableBody as b, TableCell as x, TableHead as S, TableHeader as C, TableRow as w } from "@nextblock-cms/ui/table";
18
- //#region libs/ecommerce/src/lib/components/Cart.tsx
18
+ //#region src/lib/components/Cart.tsx
19
19
  var T = () => {
20
20
  let T = a(), E = i((e) => e), D = r(), { t: O } = g(), k = (e, t, n) => {
21
21
  let r = O(e, n);
@@ -0,0 +1 @@
1
+ "use client";Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require("../../_virtual/_rolldown/runtime.cjs"),t=require("../types.cjs"),n=require("../CurrencyProvider.cjs"),r=require("../cart-store.cjs"),i=require("../use-cart.cjs"),a=require("../use-price-formatter.cjs"),o=require("../trials.cjs"),s=require("./CouponForm.cjs");let c=require("@nextblock-cms/ui/sheet"),l=require("@nextblock-cms/ui/badge"),u=require("@nextblock-cms/ui/button"),d=require("next/link");d=e.__toESM(d,1);let f=require("react"),p=require("lucide-react"),m=require("@nextblock-cms/utils"),h=require("react/jsx-runtime");var g=()=>{let e=a.usePriceFormatter(),g=i.useCart(e=>e),_=r.useCartSubtotal(),{t:v}=(0,m.useTranslations)(),y=(0,f.useRef)(null),b=(e,t,n)=>{let r=v(e,n);return r===e?t:r},{activeCurrencyCode:x,currencies:S}=n.useCurrency();if(!g)return null;let{isOpen:C,setIsOpen:w,items:T,updateQuantity:E,removeItem:D}=g,O=e=>T.reduce((n,r)=>t.isDigitalItem(r)||r.sku!==e?n:n+r.quantity,0);return(0,h.jsx)(c.Sheet,{open:C,onOpenChange:w,children:(0,h.jsxs)(c.SheetContent,{className:`flex w-full flex-col pr-0 sm:max-w-lg`,onOpenAutoFocus:()=>{y.current=document.activeElement},onCloseAutoFocus:e=>{e.preventDefault(),y.current?.focus()},children:[(0,h.jsxs)(c.SheetHeader,{className:`px-1 text-left`,children:[(0,h.jsxs)(c.SheetTitle,{children:[v(`ecommerce.shopping_cart`),` (`,T.length,`)`]}),(0,h.jsx)(c.SheetDescription,{className:`sr-only`,children:v(`ecommerce.shopping_cart`)})]}),T.length>0?(0,h.jsx)(`div`,{className:`flex flex-1 flex-col gap-5 overflow-y-auto overscroll-contain p-1 pr-6 pt-4`,children:T.map(n=>{let i=O(n.sku);return(0,h.jsx)(`div`,{className:`flex gap-4`,children:(()=>{let a=r.getCartItemActivePrice(n,{currencyCode:x,currencies:S}),s=o.getTrialSummary(n,v);return(0,h.jsxs)(h.Fragment,{children:[n.image_url?(0,h.jsx)(`div`,{className:`relative aspect-square h-20 w-20 min-w-fit overflow-hidden rounded border bg-neutral-100`,children:(0,h.jsx)(`img`,{src:n.image_url,alt:``,width:80,height:80,loading:`lazy`,decoding:`async`,className:`h-full w-full object-cover`})}):(0,h.jsx)(`div`,{className:`flex h-20 w-20 items-center justify-center rounded bg-secondary`,children:(0,h.jsx)(`span`,{className:`text-xs text-muted-foreground`,children:v(`ecommerce.no_image`)})}),(0,h.jsxs)(`div`,{className:`flex min-w-0 flex-1 flex-col justify-between`,children:[(0,h.jsxs)(`div`,{className:`flex justify-between gap-2`,children:[(0,h.jsxs)(`div`,{className:`min-w-0`,children:[(0,h.jsx)(`span`,{className:`line-clamp-2 text-sm font-medium leading-tight`,children:n.title}),n.variant_label&&(0,h.jsx)(`div`,{className:`mt-1 text-xs text-muted-foreground`,children:n.variant_label}),s&&(0,h.jsxs)(`div`,{className:`mt-1 text-xs font-medium text-emerald-700`,children:[s.label,` - `,s.paymentRequirementLabel]})]}),(0,h.jsxs)(`span`,{className:`text-sm font-semibold tabular-nums`,children:[a.sale_price&&(0,h.jsxs)(h.Fragment,{children:[(0,h.jsxs)(`span`,{className:`sr-only`,children:[b(`ecommerce.regular_price`,`Regular price`),` `]}),(0,h.jsx)(`s`,{className:`mr-1.5 text-xs font-normal text-muted-foreground`,children:e(a.price,x)}),(0,h.jsxs)(`span`,{className:`sr-only`,children:[b(`ecommerce.sale_price`,`Sale price`),` `]})]}),e(a.sale_price??a.price,x)]})]}),(0,h.jsxs)(`div`,{className:`flex items-center justify-between text-sm`,children:[t.isDigitalItem(n)?(0,h.jsx)(l.Badge,{variant:`secondary`,className:`font-normal text-xs`,children:b(`ecommerce.license_count_one`,`1 license`,{count:1})}):(0,h.jsxs)(`div`,{role:`group`,"aria-label":`${b(`ecommerce.quantity`,`Quantity`)}: ${n.title}`,className:`flex items-center rounded-md border text-xs`,children:[(0,h.jsx)(`button`,{onClick:()=>E(n.id,n.quantity-1),className:`flex h-7 w-7 items-center justify-center rounded-l-md border-r focus-visible:outline-hidden focus-visible:ring-2 focus-visible:ring-ring`,type:`button`,"aria-label":b(`ecommerce.decrease_quantity`,`Decrease quantity`),children:(0,h.jsx)(p.Minus,{className:`h-3 w-3`})}),(0,h.jsx)(`span`,{"aria-live":`polite`,"aria-atomic":`true`,className:`flex h-7 w-8 items-center justify-center tabular-nums`,children:n.quantity}),(0,h.jsx)(`button`,{onClick:()=>E(n.id,n.quantity+1),className:`flex h-7 w-7 items-center justify-center rounded-r-md border-l focus-visible:outline-hidden focus-visible:ring-2 focus-visible:ring-ring`,type:`button`,"aria-label":b(`ecommerce.increase_quantity`,`Increase quantity`),disabled:typeof n.stock==`number`&&i>=n.stock,children:(0,h.jsx)(p.Plus,{className:`h-3 w-3`})})]}),(0,h.jsx)(`button`,{onClick:()=>D(n.id),className:`inline-flex h-8 w-8 items-center justify-center rounded-md text-muted-foreground transition-colors hover:text-destructive focus-visible:outline-hidden focus-visible:ring-2 focus-visible:ring-ring`,type:`button`,"aria-label":b(`ecommerce.remove_item`,`Remove ${n.title} from cart`,{item:n.title}),children:(0,h.jsx)(p.Trash2,{className:`h-4 w-4`})})]})]})]})})()},n.id)})}):(0,h.jsxs)(`div`,{className:`flex h-full flex-col items-center justify-center space-y-2`,children:[(0,h.jsx)(`span`,{className:`text-muted-foreground`,children:v(`ecommerce.cart_empty`)}),(0,h.jsx)(u.Button,{variant:`outline`,onClick:()=>w(!1),children:v(`ecommerce.continue_shopping`)})]}),T.length>0&&(0,h.jsxs)(`div`,{className:`border-t pr-6 pt-4`,children:[(0,h.jsxs)(`div`,{className:`flex items-center justify-between text-base font-medium`,children:[(0,h.jsx)(`span`,{children:v(`ecommerce.subtotal`)}),(0,h.jsx)(`span`,{children:e(_,x)})]}),(0,h.jsx)(`p`,{className:`mb-4 mt-1 text-xs text-muted-foreground`,children:v(`ecommerce.shipping_taxes_calculated`)}),(0,h.jsx)(`div`,{className:`mb-4`,children:(0,h.jsx)(s.CouponForm,{items:T,currencyCode:x,compact:!0})}),(0,h.jsx)(u.Button,{asChild:!0,variant:`outline`,className:`w-full mb-3`,children:(0,h.jsx)(d.default,{href:`/cart`,onClick:()=>w(!1),children:v(`ecommerce.view_full_cart`)})}),(0,h.jsx)(u.Button,{asChild:!0,className:`w-full`,children:(0,h.jsx)(d.default,{href:`/checkout`,onClick:()=>w(!1),children:v(`ecommerce.ready_to_checkout`)})})]})]})})};exports.CartDrawer=g;
@@ -14,7 +14,7 @@ import { useRef as g } from "react";
14
14
  import { Minus as _, Plus as v, Trash2 as y } from "lucide-react";
15
15
  import { useTranslations as b } from "@nextblock-cms/utils";
16
16
  import { Fragment as x, jsx as S, jsxs as C } from "react/jsx-runtime";
17
- //#region libs/ecommerce/src/lib/components/CartDrawer.tsx
17
+ //#region src/lib/components/CartDrawer.tsx
18
18
  var w = () => {
19
19
  let w = a(), T = i((e) => e), E = r(), { t: D } = b(), O = g(null), k = (e, t, n) => {
20
20
  let r = D(e, n);
@@ -0,0 +1 @@
1
+ "use client";Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require("../cart-store.cjs"),t=require("../use-cart.cjs");let n=require("@nextblock-cms/ui/badge"),r=require("@nextblock-cms/ui/button"),i=require("lucide-react"),a=require("@nextblock-cms/utils"),o=require("react/jsx-runtime");var s=()=>{let s=e.useCartStore(e=>e.toggleCart),c=e.useCartTotalItems(),l=t.useCart(e=>e.isOpen)!==void 0,{t:u}=(0,a.useTranslations)(),d=u(`ecommerce.open_cart_count`,{count:c}),f=d===`ecommerce.open_cart_count`?`Open cart (${c} items)`:d;return l?(0,o.jsxs)(r.Button,{variant:`ghost`,size:`icon`,className:`relative`,onClick:s,"aria-label":f,"aria-haspopup":`dialog`,children:[(0,o.jsx)(i.ShoppingBag,{className:`h-5 w-5`}),c>0&&(0,o.jsx)(n.Badge,{variant:`destructive`,className:`absolute -right-1 -top-1 h-4 w-4 items-center justify-center p-0 text-[10px]`,children:c})]}):(0,o.jsx)(r.Button,{variant:`ghost`,size:`icon`,className:`relative`,"aria-label":f,"aria-haspopup":`dialog`,children:(0,o.jsx)(i.ShoppingBag,{className:`h-5 w-5`})})};exports.CartIcon=s;
@@ -6,7 +6,7 @@ import { Button as i } from "@nextblock-cms/ui/button";
6
6
  import { ShoppingBag as a } from "lucide-react";
7
7
  import { useTranslations as o } from "@nextblock-cms/utils";
8
8
  import { jsx as s, jsxs as c } from "react/jsx-runtime";
9
- //#region libs/ecommerce/src/lib/components/CartIcon.tsx
9
+ //#region src/lib/components/CartIcon.tsx
10
10
  var l = () => {
11
11
  let l = e((e) => e.toggleCart), u = t(), d = n((e) => e.isOpen) !== void 0, { t: f } = o(), p = f("ecommerce.open_cart_count", { count: u }), m = p === "ecommerce.open_cart_count" ? `Open cart (${u} items)` : p;
12
12
  return d ? /* @__PURE__ */ c(i, {
@@ -0,0 +1 @@
1
+ "use client";Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require("../types.cjs"),t=require("../CurrencyProvider.cjs"),n=require("../cart-store.cjs"),r=require("../use-cart.cjs"),i=require("../use-price-formatter.cjs"),a=require("../trials.cjs"),o=require("./CouponForm.cjs"),s=require("../countries.cjs"),c=require("../states.cjs"),ee=require("../server-actions/shipping-actions.cjs"),te=require("../PaymentReadinessProvider.cjs"),ne=require("../server-actions/tax-actions.cjs"),l=require("../customer.cjs");let re=require("@nextblock-cms/ui/badge"),ie=require("@nextblock-cms/ui/button"),u=require("react"),d=require("lucide-react"),ae=require("@nextblock-cms/utils"),f=require("react/jsx-runtime"),p=require("@nextblock-cms/ui/input"),m=require("@nextblock-cms/ui/label"),h=require("@nextblock-cms/ui/card"),oe=require("@nextblock-cms/ui/checkbox"),se=require("@nextblock-cms/ui/separator"),g=require("@nextblock-cms/ui/radio-group"),ce=require("@freemius/checkout");var le=process.env.NEXT_PUBLIC_IS_SANDBOX===`true`,_=`nextblock-checkout-draft-v1`;function v(e,t){return{...l.emptyCustomerAddress(),company_name:e?.company_name||``,recipient_name:e?.recipient_name||t||``,line1:e?.line1||``,line2:e?.line2||``,city:e?.city||``,state:e?.state||``,postal_code:e?.postal_code||``,country_code:s.normalizeCountryCode(e?.country_code)||`CA`}}function ue(e){let t=l.normalizeCustomerAddress(e);return!(!t?.country_code||!t.postal_code||c.countryUsesStructuredStates(t.country_code)&&!t.state)}function de(e,t,r){return e.reduce((e,i)=>{let{price:a,sale_price:o}=n.getCartItemActivePrice(i,{currencyCode:t,currencies:r});return e+(o??a)*i.quantity},0)}function fe({idPrefix:e,title:t,description:n,value:r,onChange:i}){let{t:a,lang:o}=(0,ae.useTranslations)(),ee=(0,u.useMemo)(()=>{try{return new Intl.DisplayNames([o],{type:`region`})}catch{return null}},[o]),te=a(`company_name`)===`company_name`?`Company name`:a(`company_name`),ne=a(`select_an_option`)===`select_an_option`?`Select an option`:a(`select_an_option`),l=a(`state_province`)===`state_province`?`State / Province`:a(`state_province`),re=c.getStatesForCountry(r.country_code),ie=c.countryUsesStructuredStates(r.country_code);return(0,f.jsxs)(h.Card,{children:[(0,f.jsxs)(h.CardHeader,{children:[(0,f.jsxs)(h.CardTitle,{role:`heading`,"aria-level":2,className:`flex items-center gap-2`,children:[(0,f.jsx)(d.MapPin,{className:`w-5 h-5`}),t]}),(0,f.jsx)(`p`,{className:`text-sm text-muted-foreground`,children:n})]}),(0,f.jsxs)(h.CardContent,{className:`space-y-4`,children:[(0,f.jsxs)(`div`,{className:`grid gap-4 sm:grid-cols-3`,children:[(0,f.jsxs)(`div`,{className:`space-y-2`,children:[(0,f.jsx)(m.Label,{htmlFor:`${e}-company`,children:te}),(0,f.jsx)(p.Input,{id:`${e}-company`,name:`${e}-company`,autoComplete:`${e} organization`,value:r.company_name,onChange:e=>i({...r,company_name:e.target.value})})]}),(0,f.jsxs)(`div`,{className:`space-y-2`,children:[(0,f.jsx)(m.Label,{htmlFor:`${e}-name`,children:a(`full_name`)}),(0,f.jsx)(p.Input,{id:`${e}-name`,name:`${e}-name`,autoComplete:`${e} name`,required:!0,value:r.recipient_name,onChange:e=>i({...r,recipient_name:e.target.value})})]}),(0,f.jsxs)(`div`,{className:`space-y-2`,children:[(0,f.jsx)(m.Label,{htmlFor:`${e}-country`,children:a(`country`)}),(0,f.jsx)(`select`,{id:`${e}-country`,name:`${e}-country`,autoComplete:`${e} country`,required:!0,className:`flex h-10 w-full rounded-md border border-input bg-background px-3 py-2 text-sm focus-visible:outline-hidden focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2`,value:r.country_code,onChange:e=>{let t=e.target.value,n=c.getStatesForCountry(t);i({...r,country_code:t,state:n.some(e=>e.code===r.state)?r.state:``})},children:s.countries.map(e=>(0,f.jsx)(`option`,{value:e.code,children:ee?.of(e.code)??e.name},e.code))})]})]}),(0,f.jsxs)(`div`,{className:`space-y-2`,children:[(0,f.jsx)(m.Label,{htmlFor:`${e}-line1`,children:a(`address_line_1`)}),(0,f.jsx)(p.Input,{id:`${e}-line1`,name:`${e}-line1`,autoComplete:`${e} address-line1`,required:!0,value:r.line1,onChange:e=>i({...r,line1:e.target.value})})]}),(0,f.jsxs)(`div`,{className:`space-y-2`,children:[(0,f.jsx)(m.Label,{htmlFor:`${e}-line2`,children:a(`address_line_2`)}),(0,f.jsx)(p.Input,{id:`${e}-line2`,name:`${e}-line2`,autoComplete:`${e} address-line2`,value:r.line2,onChange:e=>i({...r,line2:e.target.value})})]}),(0,f.jsxs)(`div`,{className:`grid gap-4 sm:grid-cols-3`,children:[(0,f.jsxs)(`div`,{className:`space-y-2`,children:[(0,f.jsx)(m.Label,{htmlFor:`${e}-city`,children:a(`city`)}),(0,f.jsx)(p.Input,{id:`${e}-city`,name:`${e}-city`,autoComplete:`${e} address-level2`,required:!0,value:r.city,onChange:e=>i({...r,city:e.target.value})})]}),(0,f.jsxs)(`div`,{className:`space-y-2`,children:[(0,f.jsx)(m.Label,{htmlFor:`${e}-state`,children:a(`state_province`)}),ie?(0,f.jsxs)(`select`,{id:`${e}-state`,name:`${e}-state`,autoComplete:`${e} address-level1`,required:!0,className:`flex h-10 w-full rounded-md border border-input bg-background px-3 py-2 text-sm focus-visible:outline-hidden focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2`,value:r.state,onChange:e=>i({...r,state:e.target.value}),children:[(0,f.jsx)(`option`,{value:``,children:`${ne}: ${l}`}),re.map(e=>(0,f.jsx)(`option`,{value:e.code,children:c.getSubdivisionLabel(r.country_code,e,o)},e.code))]}):(0,f.jsx)(p.Input,{id:`${e}-state`,name:`${e}-state`,autoComplete:`${e} address-level1`,value:r.state,onChange:e=>i({...r,state:e.target.value})})]}),(0,f.jsxs)(`div`,{className:`space-y-2`,children:[(0,f.jsx)(m.Label,{htmlFor:`${e}-postal`,children:a(`postal_zip_code`)}),(0,f.jsx)(p.Input,{id:`${e}-postal`,name:`${e}-postal`,autoComplete:`${e} postal-code`,required:!0,value:r.postal_code,onChange:e=>i({...r,postal_code:e.target.value})})]})]})]})]})}function pe({title:e,description:t,badgeLabel:n,children:r}){return(0,f.jsxs)(h.Card,{children:[(0,f.jsx)(h.CardHeader,{children:(0,f.jsxs)(`div`,{className:`flex items-center justify-between gap-3 flex-wrap`,children:[(0,f.jsxs)(`div`,{children:[(0,f.jsx)(h.CardTitle,{role:`heading`,"aria-level":2,children:e}),(0,f.jsx)(`p`,{className:`mt-1 text-sm text-muted-foreground`,children:t})]}),n?(0,f.jsx)(re.Badge,{variant:`secondary`,children:n}):null]})}),(0,f.jsx)(h.CardContent,{className:`space-y-4`,children:r})]})}var y=({initialCustomer:s})=>{let y=i.usePriceFormatter(),[me,he]=(0,u.useState)({}),[b,x]=(0,u.useState)(null),[S,C]=(0,u.useState)({}),[w,ge]=(0,u.useState)(s?.email||``),[T,_e]=(0,u.useState)(``),[E,ve]=(0,u.useState)(s?.phone||``),[ye,be]=(0,u.useState)(!1),[xe,Se]=(0,u.useState)(null),[Ce,D]=(0,u.useState)(!1),[we,Te]=(0,u.useState)(!1),[Ee,O]=(0,u.useState)(!1),[k,A]=(0,u.useState)([]),[j,M]=(0,u.useState)(null),[N,P]=(0,u.useState)(null),[F,De]=(0,u.useState)(null),[I,Oe]=(0,u.useState)(()=>v(s?.billingAddress,s?.fullName)),[L,ke]=(0,u.useState)(()=>v(s?.shippingAddress??s?.billingAddress,s?.fullName)),[R,Ae]=(0,u.useState)(!s?.shippingAddress||l.addressesMatch(s?.billingAddress,s?.shippingAddress)),z=r.useCart(e=>e),{t:B,lang:je}=(0,ae.useTranslations)(),{activeCurrencyCode:V,currencies:H}=t.useCurrency(),Me=te.usePaymentReadiness(),U=z?.items??[],W=(0,u.useMemo)(()=>U.filter(t=>!e.isDigitalItem(t)),[U]),G=(0,u.useMemo)(()=>U.filter(t=>e.isDigitalItem(t)),[U]),K=s?.isAuthenticated??!1,q=(e,t,n)=>{let r=B(e,n);if(r!==e)return r;if(!n)return t;let i=t;return Object.entries(n).forEach(([e,t])=>{i=i.replace(RegExp(`\\{${e}\\}`,`g`),String(t))}),i},J=W.length>0,Ne=(0,u.useMemo)(()=>de(U,V,H),[V,H,U]),Pe=(0,u.useMemo)(()=>de(W,V,H),[V,H,W]),Fe=(0,u.useMemo)(()=>de(G,V,H),[V,H,G]),Ie=F?.providerDiscounts.stripe??0,Le=F?.providerDiscounts.freemius??0,Y=Math.max(0,Pe-Ie),Re=Math.max(0,Fe-Le),X=(0,u.useMemo)(()=>R?I:L,[I,L,R]),Z=(0,u.useMemo)(()=>J?X:I,[I,J,X]),Q=!J||ue(X),$=(0,u.useMemo)(()=>k.find(e=>e.id===j),[k,j]),ze=(0,u.useMemo)(()=>Y+($?.amount??0)+(N&&!N.isPendingExternalCalculation?N.amount:0),[Y,$,N]),Be=ze+Re;if((0,u.useEffect)(()=>{if(!(K||typeof window>`u`))try{let e=window.localStorage.getItem(_);if(!e)return;let t=JSON.parse(e);t.email&&ge(t.email),t.phone&&ve(t.phone),t.billingAddress&&Oe(v(t.billingAddress)),t.shippingAddress&&ke(v(t.shippingAddress)),typeof t.useBillingForShipping==`boolean`&&Ae(t.useBillingForShipping),(typeof t.selectedMethodId==`string`||t.selectedMethodId===null)&&M(t.selectedMethodId)}catch(e){console.error(`[Checkout] Failed to restore checkout draft:`,e)}},[K]),(0,u.useEffect)(()=>{if(typeof window<`u`)try{if(K){window.localStorage.removeItem(_);return}window.localStorage.setItem(_,JSON.stringify({email:w,phone:E,billingAddress:I,shippingAddress:L,useBillingForShipping:R,selectedMethodId:j}))}catch{}},[I,w,K,E,j,L,R]),(0,u.useEffect)(()=>{if(!J){A([]),M(null),D(!1);return}if(!Q){A([]),M(null),D(!1);return}let e=!1,t=setTimeout(async()=>{if(X.country_code){D(!0),Te(!1);try{let t=await ee.getShippingEstimates(Y,{country:X.country_code,state:X.state,postal_code:X.postal_code},je,V);if(e)return;if(t.success&&t.methods){let e=t.methods;A(e),M(t=>t&&e.some(e=>e.id===t)?t:e[0]?.id??null)}else A([]),M(null)}catch(t){if(e)return;console.error(`[Checkout] Failed to load shipping rates:`,t),A([]),M(null),Te(!0)}finally{e||D(!1)}}},400);return()=>{e=!0,clearTimeout(t)}},[V,J,Q,je,X.country_code,X.postal_code,X.state,Y]),(0,u.useEffect)(()=>{let e=!1,t=setTimeout(async()=>{if(!J||!Z.country_code){O(!1),P(null);return}if(c.countryUsesStructuredStates(Z.country_code)&&!Z.state){O(!1),P(null);return}O(!0);try{let t=await ne.getTaxEstimate(W,{country_code:Z.country_code,state:Z.state},V,F?.code??null,U);if(e)return;P(t.success&&t.tax?t.tax:null)}catch(t){if(e)return;console.error(`[Checkout] Failed to load the tax estimate:`,t),P(null)}finally{e||O(!1)}},300);return()=>{e=!0,clearTimeout(t)}},[V,J,W,Z.country_code,Z.state,F?.code,U]),(0,u.useEffect)(()=>{let e=e=>{e.persisted&&x(null)};return window.addEventListener(`pageshow`,e),()=>window.removeEventListener(`pageshow`,e)},[]),!z)return(0,f.jsxs)(`div`,{role:`status`,"aria-busy":`true`,className:`container mx-auto px-4 py-12 md:px-6`,children:[(0,f.jsx)(`span`,{className:`sr-only`,children:B(`loading`)===`loading`?`Loading…`:B(`loading`)}),(0,f.jsxs)(`div`,{className:`mx-auto max-w-6xl`,children:[(0,f.jsx)(`div`,{className:`mb-8 h-9 w-48 rounded-md bg-muted`}),(0,f.jsxs)(`div`,{className:`grid gap-8 lg:grid-cols-12 lg:items-start`,children:[(0,f.jsxs)(`div`,{className:`space-y-6 lg:col-span-8`,children:[(0,f.jsx)(`div`,{className:`h-56 rounded-xl border bg-muted/40`}),(0,f.jsx)(`div`,{className:`h-96 rounded-xl border bg-muted/40`})]}),(0,f.jsx)(`div`,{className:`lg:col-span-4`,children:(0,f.jsx)(`div`,{className:`h-72 rounded-xl border bg-muted/40`})})]})]})]});let Ve=()=>{be(!1),Se(null)},He=ye?(0,f.jsx)(`div`,{className:`fixed inset-0 z-50 flex items-center justify-center overscroll-contain bg-black/60 backdrop-blur-sm`,onClick:Ve,onKeyDown:e=>{e.key===`Escape`&&Ve()},children:(0,f.jsxs)(`div`,{role:`dialog`,"aria-modal":`true`,"aria-labelledby":`sandbox-checkout-title`,className:`relative bg-background border rounded-xl shadow-2xl p-8 max-w-md mx-4`,onClick:e=>e.stopPropagation(),children:[(0,f.jsx)(`button`,{type:`button`,autoFocus:!0,onClick:Ve,"aria-label":q(`close`,`Close`),className:`absolute top-4 right-4 inline-flex h-8 w-8 items-center justify-center rounded-md text-muted-foreground hover:text-foreground transition-colors focus-visible:outline-hidden focus-visible:ring-2 focus-visible:ring-ring`,children:(0,f.jsx)(d.X,{className:`w-5 h-5`})}),(0,f.jsxs)(`div`,{className:`flex items-center gap-3 mb-4`,children:[(0,f.jsx)(`div`,{className:`p-2 rounded-full bg-amber-100 dark:bg-amber-900/20`,children:(0,f.jsx)(d.FlaskConical,{className:`h-6 w-6 text-amber-600 dark:text-amber-400`})}),(0,f.jsx)(`h2`,{id:`sandbox-checkout-title`,className:`text-xl font-semibold`,children:B(`ecommerce.checkout_successful`)})]}),(0,f.jsx)(`p`,{className:`text-muted-foreground mb-2`,children:B(`ecommerce.sandbox_notice`)}),(0,f.jsx)(`p`,{className:`text-muted-foreground mb-2`,children:xe===`stripe`?q(`ecommerce.sandbox_checkout_stripe_description`,`This simulated step represents the Stripe checkout for physical products.`):q(`ecommerce.sandbox_checkout_freemius_description`,`This simulated step represents the Freemius checkout for digital products.`)}),(0,f.jsx)(`p`,{className:`text-muted-foreground mb-6`,children:B(`ecommerce.license_notice`)}),(0,f.jsx)(`a`,{href:`https://nextblock.dev`,target:`_blank`,rel:`noopener noreferrer`,className:`block w-full text-center py-3 px-4 rounded-lg bg-primary text-primary-foreground font-semibold hover:opacity-90 transition-opacity`,children:B(`ecommerce.purchase_at`)})]})}):null,Ue=(e,t,n)=>(C(n=>({...n,[e]:t})),n&&document.getElementById(n)?.focus(),null),We=(e,t)=>t.recipient_name.trim()?t.line1.trim()?t.city.trim()?c.countryUsesStructuredStates(t.country_code)&&!t.state?`${e}-state`:t.postal_code.trim()?`${e}-line1`:`${e}-postal`:`${e}-city`:`${e}-line1`:`${e}-name`,Ge=e=>{if(!K&&(!w||!/^\S+@\S+\.\S+$/.test(w)))return _e(B(`ecommerce.invalid_email`)),Ue(e,B(`ecommerce.invalid_email`),`checkout-email`);let t=l.normalizeCustomerAddress(I);if(!l.isCustomerAddressComplete(t))return Ue(e,B(`checkout_complete_billing_address`),We(`billing`,I));let n=J?l.normalizeCustomerAddress(R?I:L):null;if(e===`stripe`){if(!l.isCustomerAddressComplete(n))return Ue(e,B(`checkout_complete_shipping_address`),R?We(`billing`,I):We(`shipping`,L));if(!j)return Ue(e,q(`ecommerce.shipping_method_required`,`Please select a shipping method before continuing.`))}return _e(``),{normalizedBillingAddress:t,normalizedShippingAddress:n}},Ke=async(e,t,n)=>{C(t=>({...t,[e]:``}));let r=Ge(e);if(r){if(le){let n=new Set(t.map(e=>e.id)),r=U.filter(e=>!n.has(e.id));if(z.setItems(r),r.length===0&&z.removeCoupon(),Se(e),be(!0),typeof window<`u`&&r.length===0)try{window.localStorage.removeItem(_)}catch{}return}x(n);try{let n=await fetch(`/api/checkout`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({items:t,customerEmail:K?void 0:w,customerPhone:E||null,billingAddress:r.normalizedBillingAddress,shippingAddress:e===`stripe`?r.normalizedShippingAddress:null,shippingMethodId:e===`stripe`?j:null,locale:je,currencyCode:V,couponCode:F?.code??z.appliedCoupon?.code??null,couponContextItems:U})}),i=await n.json();if(!n.ok){let t=i?.errorKey&&typeof i.errorKey==`string`?q(i.errorKey,i?.error||q(`ecommerce.generic_error`,`Something went wrong.`),i.errorParams):i?.error||B(`ecommerce.generic_error`);C(n=>({...n,[e]:t})),x(null);return}if(i.customProps&&i.customProps.provider===`freemius`){let t=i.customProps,n=null,r=()=>{window.location.href=`/checkout/success?session_id=${t.order_id}`},a=e=>(n||=fetch(`/api/checkout/freemius/sync`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({orderId:t.order_id,checkoutResponse:e})}).then(async e=>{if(!e.ok){let t=await e.json().catch(()=>null);console.error(`Freemius checkout sync failed:`,t)}}),n),o={product_id:t.plugin_id,public_key:t.public_key,sandbox:t.sandbox},s={name:B(`ecommerce.checkout_overlay_title`),plan_id:t.plan_id,...t.billing_cycle?{billing_cycle:t.billing_cycle}:{},...t.trial?{trial:t.trial}:{},...t.coupon?{coupon:t.coupon}:{},user_email:t.user_email,user_firstname:t.user_firstname,user_lastname:t.user_lastname,sandbox:t.sandbox,purchaseCompleted:function(e){a(e)},success:function(e){(async()=>{try{await a(e)}finally{r()}})()}};try{new ce.Checkout(o).open(s),x(null)}catch(t){console.error(`[Checkout] Freemius overlay failed to open:`,t),C(t=>({...t,[e]:B(`ecommerce.checkout_popup_blocked`)})),i.url&&(window.location.href=i.url),x(null)}}else i.url?window.location.href=i.url:(C(t=>({...t,[e]:B(`ecommerce.checkout_failed`)+(i.error||q(`ecommerce.unknown_error`,`Unknown error`))})),x(null))}catch(t){console.error(t),C(t=>({...t,[e]:B(`ecommerce.generic_error`)})),x(null)}}};if(U.length===0)return(0,f.jsxs)(f.Fragment,{children:[He,(0,f.jsxs)(`div`,{className:`container mx-auto flex min-h-[50vh] flex-col items-center justify-center p-8 text-center`,children:[(0,f.jsx)(`h1`,{className:`mb-4 text-2xl font-bold`,children:B(`ecommerce.cart_empty`)}),(0,f.jsx)(`p`,{className:`mb-8 text-muted-foreground`,children:B(`ecommerce.cart_empty_description`)}),(0,f.jsx)(ie.Button,{asChild:!0,children:(0,f.jsx)(`a`,{href:`/shop`,children:B(`ecommerce.go_to_shop`)})})]})]});let qe=q(`ecommerce.checkout_payments_unavailable`,`This store is not able to take payments right now. Please contact the seller to complete your purchase.`),Je=Me.stripe?null:qe,Ye=Me.freemius?null:qe,Xe=Je||(J?Q?Ce?q(`ecommerce.calculating_shipping`,`Calculating shipping...`):j?null:k.length>0?B(`ecommerce.select_rate`):B(`ecommerce.no_rates_for_region`):q(`ecommerce.waiting_on_address_info`,`Complete your shipping address to view available shipping options.`):null),Ze=b!==null||Xe!==null,Qe=W.length===1?q(`ecommerce.item_count_one`,`{count} item`,{count:W.length}):q(`ecommerce.item_count_other`,`{count} items`,{count:W.length}),$e=G.length===1?q(`ecommerce.license_count_one`,`{count} license`,{count:G.length}):q(`ecommerce.license_count_other`,`{count} licenses`,{count:G.length}),et=t=>e.isDigitalItem(t)?q(`ecommerce.digital_label`,`Digital`):q(`ecommerce.physical_label`,`Physical`),tt=e=>e===`monthly`?q(`ecommerce.checkout_billing_cycle_monthly`,`Monthly subscription`):e===`annual`?q(`ecommerce.checkout_billing_cycle_annual`,`Annual subscription`):e===`lifetime`?q(`ecommerce.checkout_billing_cycle_lifetime`,`Lifetime subscription`):null;return(0,f.jsxs)(`div`,{className:`container mx-auto px-4 py-12 md:px-6`,children:[He,(0,f.jsxs)(`div`,{className:`mx-auto max-w-6xl`,children:[(0,f.jsx)(`h1`,{className:`mb-8 text-3xl font-bold`,children:B(`ecommerce.checkout`)}),(0,f.jsxs)(`div`,{className:`grid gap-8 lg:grid-cols-12 lg:items-start`,children:[(0,f.jsxs)(`div`,{className:`lg:col-span-8 space-y-6`,children:[(0,f.jsxs)(h.Card,{children:[(0,f.jsx)(h.CardHeader,{children:(0,f.jsxs)(h.CardTitle,{role:`heading`,"aria-level":2,className:`flex items-center gap-2`,children:[(0,f.jsx)(d.CreditCard,{className:`w-5 h-5`}),B(`ecommerce.contact_information`)]})}),(0,f.jsxs)(h.CardContent,{className:`space-y-4`,children:[K?(0,f.jsx)(`div`,{className:`rounded-xl border bg-muted/20 p-4 text-sm text-muted-foreground`,children:B(`checkout_prefill_notice`,{email:s?.email||``})}):(0,f.jsxs)(`div`,{className:`space-y-2`,children:[(0,f.jsxs)(m.Label,{htmlFor:`checkout-email`,children:[B(`ecommerce.email_address`),` `,(0,f.jsx)(`span`,{className:`text-destructive`,children:`*`})]}),(0,f.jsx)(p.Input,{id:`checkout-email`,name:`email`,type:`email`,autoComplete:`email`,spellCheck:!1,"aria-invalid":T?!0:void 0,"aria-describedby":T?`checkout-email-error`:void 0,placeholder:B(`ecommerce.email_placeholder`),value:w,onChange:e=>{ge(e.target.value),T&&_e(``)},required:!0}),T?(0,f.jsx)(`p`,{id:`checkout-email-error`,role:`alert`,className:`text-xs text-destructive mt-1`,children:T}):null]}),(0,f.jsxs)(`div`,{className:`space-y-2`,children:[(0,f.jsx)(m.Label,{htmlFor:`checkout-phone`,children:B(`phone_number`)}),(0,f.jsx)(p.Input,{id:`checkout-phone`,name:`phone`,type:`tel`,inputMode:`tel`,autoComplete:`tel`,placeholder:B(`optional`),value:E,onChange:e=>ve(e.target.value)})]})]})]}),(0,f.jsx)(fe,{idPrefix:`billing`,title:B(`billing_address`),description:B(`checkout_billing_address_help`),value:I,onChange:Oe}),J?(0,f.jsxs)(`div`,{className:`flex items-center space-x-3 rounded-xl border bg-muted/20 p-4`,children:[(0,f.jsx)(oe.Checkbox,{id:`use-billing-for-shipping`,checked:R,onCheckedChange:e=>Ae(!!e)}),(0,f.jsxs)(`div`,{className:`space-y-1`,children:[(0,f.jsx)(m.Label,{htmlFor:`use-billing-for-shipping`,className:`cursor-pointer`,children:B(`use_billing_for_shipping`)}),(0,f.jsx)(`p`,{className:`text-sm text-muted-foreground`,children:B(`checkout_use_billing_for_shipping_help`)})]})]}):null,J&&!R?(0,f.jsx)(fe,{idPrefix:`shipping`,title:B(`shipping_address`),description:B(`checkout_shipping_address_help`),value:L,onChange:ke}):null,J?(0,f.jsxs)(h.Card,{children:[(0,f.jsx)(h.CardHeader,{children:(0,f.jsxs)(h.CardTitle,{role:`heading`,"aria-level":2,className:`flex items-center gap-2`,children:[(0,f.jsx)(d.ChevronRight,{className:`w-5 h-5 text-primary`}),B(`ecommerce.shipping_method`)]})}),(0,f.jsx)(h.CardContent,{children:Ce?(0,f.jsxs)(`div`,{role:`status`,className:`flex items-center justify-center py-6`,children:[(0,f.jsx)(d.Loader2,{className:`w-6 h-6 animate-spin text-muted-foreground`}),(0,f.jsx)(`span`,{className:`sr-only`,children:q(`ecommerce.calculating_shipping`,`Calculating shipping…`)})]}):we?(0,f.jsx)(`div`,{role:`alert`,className:`rounded-lg bg-destructive/10 px-4 py-3 text-center text-sm text-destructive`,children:q(`ecommerce.shipping_calculation_failed`,`We couldn't calculate shipping right now. Please try again.`)}):k.length>0?(0,f.jsx)(g.RadioGroup,{value:j??``,onValueChange:M,"aria-label":B(`ecommerce.shipping_method`),className:`space-y-3`,children:k.map(e=>(0,f.jsxs)(m.Label,{htmlFor:`shipping-method-${e.id}`,className:`flex items-center justify-between gap-3 p-4 rounded-lg border-2 cursor-pointer transition-colors ${j===e.id?`border-primary bg-primary/5`:`border-border hover:border-muted-foreground/40`}`,children:[(0,f.jsxs)(`span`,{className:`flex min-w-0 items-center gap-3`,children:[(0,f.jsx)(g.RadioGroupItem,{id:`shipping-method-${e.id}`,value:e.id}),(0,f.jsx)(`span`,{className:`font-medium break-words`,children:e.name})]}),(0,f.jsx)(`span`,{className:`font-bold tabular-nums`,children:y(e.amount,V)})]},e.id))}):(0,f.jsx)(`div`,{className:`py-4 text-center text-muted-foreground bg-muted/30 rounded-lg italic`,children:Q?B(`ecommerce.no_rates_for_region`):q(`ecommerce.waiting_on_address_info`,`Complete your shipping address to view available shipping options.`)})})]}):null]}),(0,f.jsxs)(`div`,{className:`lg:col-span-4 space-y-6`,children:[(0,f.jsxs)(h.Card,{className:`top-6`,children:[(0,f.jsx)(h.CardHeader,{children:(0,f.jsx)(h.CardTitle,{role:`heading`,"aria-level":2,children:B(`ecommerce.order_summary`)})}),(0,f.jsxs)(h.CardContent,{className:`space-y-4`,children:[(0,f.jsx)(`div`,{className:`space-y-3 max-h-[260px] overflow-y-auto pr-2`,children:U.map(e=>{let t=n.getCartItemActivePrice(e,{currencyCode:V,currencies:H}),r=a.getTrialSummary(e,B);return(0,f.jsxs)(`div`,{className:`flex items-start justify-between gap-4`,children:[(0,f.jsxs)(`div`,{className:`flex gap-3`,children:[e.image_url?(0,f.jsx)(`div`,{className:`h-10 w-10 shrink-0 overflow-hidden rounded border bg-neutral-100`,children:(0,f.jsx)(`img`,{src:e.image_url,alt:e.title,className:`h-full w-full object-cover`})}):null,(0,f.jsxs)(`div`,{className:`grid gap-0.5`,children:[(0,f.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,f.jsx)(`span`,{className:`font-medium text-xs line-clamp-1`,children:e.title}),(0,f.jsx)(re.Badge,{variant:`outline`,className:`text-[9px] uppercase`,children:et(e)})]}),e.variant_label?(0,f.jsx)(`span`,{className:`text-[10px] text-muted-foreground line-clamp-1`,children:e.variant_label}):null,(0,f.jsxs)(`span`,{className:`text-[10px] text-muted-foreground`,children:[B(`ecommerce.qty`),`: `,e.quantity]}),r?(0,f.jsxs)(`span`,{className:`text-[10px] font-medium text-emerald-700`,children:[r.label,` - `,r.paymentRequirementLabel]}):null]})]}),(0,f.jsxs)(`div`,{className:`flex flex-col items-end gap-0.5 shrink-0`,children:[(0,f.jsx)(`span`,{className:`font-medium text-xs`,children:y((t.sale_price??t.price)*e.quantity,V)}),t.sale_price?(0,f.jsx)(`span`,{className:`text-[9px] text-muted-foreground line-through`,children:y(t.price*e.quantity,V)}):null]})]},`${e.id}-${e.variant_id||`base`}`)})}),(0,f.jsx)(se.Separator,{}),(0,f.jsx)(o.CouponForm,{items:U,currencyCode:V,onQuoteChange:De}),(0,f.jsxs)(`div`,{className:`space-y-2 text-sm`,children:[(0,f.jsxs)(`div`,{className:`flex justify-between`,children:[(0,f.jsx)(`span`,{children:B(`ecommerce.subtotal`)}),(0,f.jsx)(`span`,{children:y(Ne,V)})]}),W.length>0?(0,f.jsxs)(`div`,{className:`flex justify-between text-muted-foreground`,children:[(0,f.jsx)(`span`,{children:q(`ecommerce.physical_products`,`Physical products`)}),(0,f.jsx)(`span`,{children:y(Pe,V)})]}):null,G.length>0?(0,f.jsxs)(`div`,{className:`flex justify-between text-muted-foreground`,children:[(0,f.jsx)(`span`,{children:q(`ecommerce.digital_products`,`Digital products`)}),(0,f.jsx)(`span`,{children:y(Fe,V)})]}):null,F?(0,f.jsxs)(`div`,{className:`flex justify-between text-emerald-600`,children:[(0,f.jsxs)(`span`,{children:[q(`ecommerce.discount`,`Discount`),` (`,F.code,`)`]}),(0,f.jsxs)(`span`,{children:[`-`,y(F.discountTotal,V)]})]}):null,(W.length>0||G.length>0)&&(0,f.jsxs)(`div`,{className:`flex justify-between font-bold text-lg pt-2 border-t mt-2`,children:[(0,f.jsx)(`span`,{children:q(`ecommerce.estimated_total`,`Estimated total`)}),(0,f.jsx)(`span`,{className:`text-primary`,children:y(Be,V)})]})]})]})]}),W.length>0?(0,f.jsxs)(pe,{title:q(`ecommerce.stripe_checkout_title`,`Stripe Checkout`),description:q(`ecommerce.stripe_checkout_description`,`Pay for physical products in one Stripe checkout session.`),badgeLabel:Qe,children:[(0,f.jsxs)(`div`,{className:`space-y-2 text-sm`,children:[(0,f.jsxs)(`div`,{className:`flex justify-between`,children:[(0,f.jsx)(`span`,{children:q(`ecommerce.physical_subtotal`,`Physical subtotal`)}),(0,f.jsx)(`span`,{children:y(Pe,V)})]}),Ie>0?(0,f.jsxs)(`div`,{className:`flex justify-between text-emerald-600`,children:[(0,f.jsx)(`span`,{children:q(`ecommerce.discount`,`Discount`)}),(0,f.jsxs)(`span`,{children:[`-`,y(Ie,V)]})]}):null,(0,f.jsxs)(`div`,{className:`flex justify-between`,children:[(0,f.jsx)(`span`,{children:B(`ecommerce.shipping`)}),(0,f.jsx)(`span`,{children:$?y($.amount,V):`-`})]}),(0,f.jsxs)(`div`,{className:`flex justify-between`,children:[(0,f.jsx)(`span`,{children:q(`ecommerce.tax`,`Tax`)}),(0,f.jsx)(`span`,{children:Ee?`...`:N?.isPendingExternalCalculation?q(`ecommerce.tax_calculated_on_stripe`,`Calculated on Stripe`):N?y(N.amount,V):`-`})]}),N&&N.lines.length>0?(0,f.jsx)(`div`,{className:`rounded-lg bg-muted/20 px-3 py-2 text-xs text-muted-foreground`,children:N.lines.map(e=>(0,f.jsxs)(`div`,{className:`flex justify-between gap-3`,children:[(0,f.jsxs)(`span`,{children:[e.name,` (`,e.rate.toFixed(4),`%)`]}),(0,f.jsx)(`span`,{children:y(e.amount,V)})]},e.id||`${e.name}-${e.rate}`))}):null,(0,f.jsxs)(`div`,{className:`flex justify-between font-semibold pt-2 border-t`,children:[(0,f.jsx)(`span`,{children:q(`ecommerce.total_on_stripe`,`Total on Stripe`)}),(0,f.jsx)(`span`,{children:y(ze,V)})]})]}),(0,f.jsxs)(ie.Button,{className:`w-full`,size:`lg`,onClick:()=>Ke(`stripe`,W,`stripe`),disabled:Ze,children:[b===`stripe`?(0,f.jsx)(d.Loader2,{className:`mr-2 h-4 w-4 animate-spin`}):(0,f.jsx)(d.Package,{className:`mr-2 h-4 w-4`}),b===`stripe`?B(`ecommerce.processing`):q(`ecommerce.checkout_physical_products`,`Checkout Physical Products`)]}),Xe&&b===null?(0,f.jsx)(`p`,{className:`text-[11px] text-muted-foreground`,children:Xe}):null,S.stripe?(0,f.jsx)(`div`,{role:`alert`,className:`rounded-lg border border-destructive/20 bg-destructive/10 px-3 py-2 text-xs text-destructive`,children:S.stripe}):null,(0,f.jsx)(`p`,{className:`text-[11px] text-muted-foreground`,children:N?.isPendingExternalCalculation?q(`checkout_stripe_tax_finalized_notice`,`Tax will be finalized by Stripe Tax on the payment step.`):q(`ecommerce.shipping_taxes_collected_on_stripe`,`Shipping and taxes are only collected during the Stripe step for physical products.`)})]}):null,G.length>0?(0,f.jsxs)(pe,{title:q(`ecommerce.freemius_checkout_title`,`Freemius Checkout`),description:q(`ecommerce.freemius_checkout_description`,`Digital products use the Freemius checkout flow.`),badgeLabel:$e,children:[(0,f.jsx)(`div`,{className:`space-y-3`,children:G.map(e=>{let t=n.getCartItemActivePrice(e,{currencyCode:V,currencies:H}),r=a.getTrialSummary(e,B),i=`freemius:${e.id}`,o=r?me[i]||`paid`:void 0;return(0,f.jsxs)(`div`,{className:`rounded-lg border p-3 space-y-3`,children:[(0,f.jsxs)(`div`,{className:`flex items-start justify-between gap-3`,children:[(0,f.jsxs)(`div`,{children:[(0,f.jsx)(`p`,{className:`font-medium`,children:e.title}),e.billing_cycle?(0,f.jsx)(`p`,{className:`text-xs text-muted-foreground capitalize`,children:tt(e.billing_cycle)}):null,r?(0,f.jsxs)(`p`,{className:`text-xs font-medium text-emerald-700`,children:[r.label,` - `,r.paymentRequirementLabel]}):null]}),(0,f.jsx)(`span`,{className:`font-medium`,children:y(t.sale_price??t.price,V)})]}),r&&!e.trial_requires_payment_method&&(0,f.jsxs)(`div`,{className:`bg-muted/30 p-3 rounded-md border text-sm mt-2 mb-3`,children:[(0,f.jsx)(`p`,{className:`font-medium mb-3`,children:q(`ecommerce.freemius_trial_preference_title`,`How would you like to start your trial?`)}),(0,f.jsxs)(g.RadioGroup,{value:me[i]||`paid`,onValueChange:e=>he(t=>({...t,[i]:e})),className:`gap-3`,children:[(0,f.jsxs)(`div`,{className:`flex items-start space-x-3`,children:[(0,f.jsx)(g.RadioGroupItem,{value:`paid`,id:`${i}-paid`,className:`mt-1`}),(0,f.jsxs)(`div`,{className:`grid gap-1.5`,children:[(0,f.jsx)(m.Label,{htmlFor:`${i}-paid`,className:`font-medium leading-none cursor-pointer`,children:q(`ecommerce.freemius_trial_with_card`,`Enter Payment Details Now (Still get full trial length free)`)}),(0,f.jsx)(`p`,{className:`text-xs text-muted-foreground`,children:q(`ecommerce.freemius_trial_with_card_help`,`You will not be billed until the trial ends. Cancel anytime.`)})]})]}),(0,f.jsxs)(`div`,{className:`flex items-start space-x-3`,children:[(0,f.jsx)(g.RadioGroupItem,{value:`free`,id:`${i}-free`,className:`mt-1`}),(0,f.jsx)(`div`,{className:`grid gap-1.5`,children:(0,f.jsx)(m.Label,{htmlFor:`${i}-free`,className:`font-medium leading-none cursor-pointer`,children:q(`ecommerce.freemius_trial_no_card`,`Start Free Trial (No card required)`)})})]})]})]}),(0,f.jsxs)(ie.Button,{className:`w-full h-auto min-h-[2.75rem] py-2`,onClick:()=>Ke(`freemius`,[{...e,...o?{trial_preference:o}:{}}],i),disabled:b!==null||Ye!==null,children:[b===i?(0,f.jsx)(d.Loader2,{className:`mr-2 h-4 w-4 shrink-0 animate-spin`}):(0,f.jsx)(d.Download,{className:`mr-2 h-4 w-4 shrink-0`}),(0,f.jsx)(`span`,{className:`whitespace-normal text-left`,children:b===i?B(`ecommerce.processing`):G.length>1?q(`ecommerce.checkout_product`,`Checkout {title}`,{title:e.title}):q(`ecommerce.checkout_digital_product`,`Checkout Digital Product`)})]})]},i)})}),(0,f.jsxs)(`div`,{className:`flex justify-between text-sm font-semibold border-t pt-3`,children:[(0,f.jsx)(`span`,{children:q(`ecommerce.digital_subtotal`,`Digital subtotal`)}),(0,f.jsx)(`span`,{children:y(Fe,V)})]}),Le>0?(0,f.jsxs)(`div`,{className:`flex justify-between text-sm font-semibold text-emerald-600`,children:[(0,f.jsx)(`span`,{children:q(`ecommerce.discount`,`Discount`)}),(0,f.jsxs)(`span`,{children:[`-`,y(Le,V)]})]}):null,Ye?(0,f.jsx)(`div`,{className:`rounded-lg border border-amber-500/40 bg-amber-500/10 px-3 py-2 text-xs`,children:Ye}):null,S.freemius?(0,f.jsx)(`div`,{role:`alert`,className:`rounded-lg border border-destructive/20 bg-destructive/10 px-3 py-2 text-xs text-destructive`,children:S.freemius}):null,(0,f.jsx)(`p`,{className:`text-[11px] text-muted-foreground`,children:G.length>1?q(`ecommerce.freemius_multi_checkout_notice`,`Freemius licenses are completed one at a time, so each digital product gets its own checkout action.`):q(`ecommerce.freemius_tax_notice`,`Taxes and compliance for digital products are handled inside the Freemius checkout.`)})]}):null]})]})]})]})};exports.Checkout=y;
@@ -25,7 +25,7 @@ import { Checkbox as ye } from "@nextblock-cms/ui/checkbox";
25
25
  import { Separator as be } from "@nextblock-cms/ui/separator";
26
26
  import { RadioGroup as xe, RadioGroupItem as Se } from "@nextblock-cms/ui/radio-group";
27
27
  import { Checkout as Ce } from "@freemius/checkout";
28
- //#region libs/ecommerce/src/lib/components/Checkout.tsx
28
+ //#region src/lib/components/Checkout.tsx
29
29
  var we = process.env.NEXT_PUBLIC_IS_SANDBOX === "true", C = "nextblock-checkout-draft-v1";
30
30
  function w(e, t) {
31
31
  return {
@@ -0,0 +1 @@
1
+ "use client";const e=require("../use-cart.cjs"),t=require("../use-price-formatter.cjs"),n=require("../coupons.cjs"),r=require("../server-actions/coupon-actions.cjs");let i=require("@nextblock-cms/ui/badge"),a=require("@nextblock-cms/ui/button"),o=require("react"),s=require("lucide-react"),c=require("@nextblock-cms/utils"),l=require("react/jsx-runtime"),u=require("@nextblock-cms/ui/input"),d=require("@nextblock-cms/ui/label");function f({items:f,currencyCode:p,onQuoteChange:m,compact:h=!1}){let g=e.useCart(e=>e.appliedCoupon),_=e.useCart(e=>e.setAppliedCoupon),v=e.useCart(e=>e.removeCoupon),{t:y}=(0,c.useTranslations)(),b=t.usePriceFormatter(),[x,S]=(0,o.useState)(``),[C,w]=(0,o.useState)(null),[T,E]=(0,o.useState)(``),[D,O]=(0,o.useState)(!1),k=(0,o.useRef)(null),A=(0,o.useMemo)(()=>f.map(e=>`${e.product_id}:${e.variant_id||`base`}:${e.quantity}`).sort().join(`|`),[f]),j=(0,o.useCallback)((e,t)=>{let n=y(e);return n===e?t:n},[y]),M=(0,o.useCallback)(e=>`${n.normalizeCouponCode(e)}:${p}:${A}`,[A,p]),N=(0,o.useCallback)(async(e,t)=>{let i=n.normalizeCouponCode(e);if(!i){E(j(`ecommerce.coupon_code_required`,`Enter a coupon code.`));return}O(!0),E(``);try{let e=await r.getCouponQuoteAction({code:i,items:f,currencyCode:p});if(!e.success){w(null),m?.(null),v?.(),E(e.errorKey?j(e.errorKey,e.error):e.error);return}k.current=M(e.quote.code),w(e.quote),m?.(e.quote),t?.silent||(_?.({code:e.quote.code,couponId:e.quote.couponId}),S(``)),t?.silent||E(``)}catch(e){console.error(`Failed to validate coupon:`,e),k.current=null,w(null),m?.(null),E(j(`ecommerce.coupon_validation_failed`,`Failed to validate coupon.`))}finally{O(!1)}},[v,p,M,f,m,_,j]);return(0,o.useEffect)(()=>{if(!_||!v)return;if(!g||f.length===0){k.current=null,w(null),m?.(null);return}let e=M(g.code);k.current!==e&&(k.current=e,N(g.code,{silent:!0}))},[g?.code,N,v,M,f.length,m,_]),!_||!v?null:(0,l.jsxs)(`div`,{className:h?`space-y-2`:`rounded-lg border bg-muted/10 p-4 space-y-3`,children:[(0,l.jsxs)(`div`,{className:`flex items-center justify-between gap-3`,children:[(0,l.jsxs)(d.Label,{htmlFor:h?`coupon-code-compact`:`coupon-code`,className:`flex items-center gap-2 text-sm font-medium`,children:[(0,l.jsx)(s.Tag,{className:`h-4 w-4`}),j(`ecommerce.coupon`,`Coupon`)]}),C?(0,l.jsxs)(i.Badge,{variant:`secondary`,className:`gap-1`,children:[C.code,(0,l.jsx)(`button`,{type:`button`,onClick:()=>{v(),w(null),m?.(null),E(``)},"aria-label":j(`ecommerce.remove_coupon`,`Remove coupon {code}`).replace(`{code}`,C.code),className:`-mr-1 inline-flex h-6 w-6 items-center justify-center rounded-full focus-visible:outline-hidden focus-visible:ring-2 focus-visible:ring-ring`,children:(0,l.jsx)(s.X,{className:`h-3 w-3`})})]}):null]}),C?(0,l.jsxs)(`div`,{className:`flex items-center justify-between gap-3 text-sm`,children:[(0,l.jsx)(`span`,{className:`min-w-0 truncate text-muted-foreground`,children:C.name}),(0,l.jsx)(`span`,{className:`shrink-0 font-medium tabular-nums text-emerald-600 dark:text-emerald-400`,children:b(-C.discountTotal,p)})]}):(0,l.jsxs)(`div`,{className:`flex gap-2`,children:[(0,l.jsx)(u.Input,{id:h?`coupon-code-compact`:`coupon-code`,name:`coupon`,autoComplete:`off`,autoCapitalize:`characters`,spellCheck:!1,"aria-invalid":T?!0:void 0,"aria-describedby":T?h?`coupon-error-compact`:`coupon-error`:void 0,value:x,onChange:e=>S(e.target.value),placeholder:j(`ecommerce.coupon_placeholder`,`SAVE10…`),className:`uppercase`,onKeyDown:e=>{e.key===`Enter`&&!D&&(e.preventDefault(),N(x))}}),(0,l.jsx)(a.Button,{type:`button`,variant:`outline`,disabled:D||f.length===0,onClick:()=>void N(x),children:D?j(`ecommerce.applying`,`Applying…`):j(`ecommerce.apply`,`Apply`)})]}),T?(0,l.jsx)(`p`,{id:h?`coupon-error-compact`:`coupon-error`,role:`alert`,className:`text-xs text-destructive`,children:T}):null]})}exports.CouponForm=f;
@@ -11,7 +11,7 @@ import { useTranslations as p } from "@nextblock-cms/utils";
11
11
  import { jsx as m, jsxs as h } from "react/jsx-runtime";
12
12
  import { Input as g } from "@nextblock-cms/ui/input";
13
13
  import { Label as _ } from "@nextblock-cms/ui/label";
14
- //#region libs/ecommerce/src/lib/components/CouponForm.tsx
14
+ //#region src/lib/components/CouponForm.tsx
15
15
  function v({ items: v, currencyCode: y, onQuoteChange: b, compact: x = !1 }) {
16
16
  let S = e((e) => e.appliedCoupon), C = e((e) => e.setAppliedCoupon), w = e((e) => e.removeCoupon), { t: T } = p(), E = t(), [D, O] = u(""), [k, A] = u(null), [j, M] = u(""), [N, P] = u(!1), F = l(null), I = c(() => v.map((e) => `${e.product_id}:${e.variant_id || "base"}:${e.quantity}`).sort().join("|"), [v]), L = o((e, t) => {
17
17
  let n = T(e);
@@ -0,0 +1 @@
1
+ "use client";Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require("../CurrencyProvider.cjs");let t=require("@nextblock-cms/utils"),n=require("react/jsx-runtime"),r=require("@nextblock-cms/ui/select");function i(){let{activeCurrencyCode:i,currencies:a,setActiveCurrencyCode:o}=e.useCurrency(),{t:s}=(0,t.useTranslations)(),c=s(`ecommerce.currency`)===`ecommerce.currency`?`Currency`:s(`ecommerce.currency`);return a.length<=1?null:(0,n.jsxs)(r.Select,{value:i,onValueChange:o,children:[(0,n.jsx)(r.SelectTrigger,{"aria-label":c,className:`h-9 w-[88px] text-xs font-semibold`,children:(0,n.jsx)(r.SelectValue,{placeholder:i})}),(0,n.jsx)(r.SelectContent,{children:a.map(e=>(0,n.jsx)(r.SelectItem,{value:e.code,children:e.code},e.code))})]})}exports.CurrencySwitcher=i;
@@ -3,7 +3,7 @@ import { useCurrency as e } from "../CurrencyProvider.es.js";
3
3
  import { useTranslations as t } from "@nextblock-cms/utils";
4
4
  import { jsx as n, jsxs as r } from "react/jsx-runtime";
5
5
  import { Select as i, SelectContent as a, SelectItem as o, SelectTrigger as s, SelectValue as c } from "@nextblock-cms/ui/select";
6
- //#region libs/ecommerce/src/lib/components/CurrencySwitcher.tsx
6
+ //#region src/lib/components/CurrencySwitcher.tsx
7
7
  function l() {
8
8
  let { activeCurrencyCode: l, currencies: u, setActiveCurrencyCode: d } = e(), { t: f } = t(), p = f("ecommerce.currency") === "ecommerce.currency" ? "Currency" : f("ecommerce.currency");
9
9
  return u.length <= 1 ? null : /* @__PURE__ */ r(i, {
@@ -0,0 +1 @@
1
+ "use client";const e=require("../../_virtual/_rolldown/runtime.cjs"),t=require("../countries.cjs"),n=require("../customer.cjs"),r=require("./AccountNavigationMenu.cjs"),i=require("../server-actions/customer-actions.cjs");let a=require("@nextblock-cms/ui/button"),o=require("react");o=e.__toESM(o,1);let s=require("lucide-react"),c=require("@nextblock-cms/utils"),l=require("react/jsx-runtime"),u=require("@nextblock-cms/ui/input"),d=require("@nextblock-cms/ui/label"),f=require("@nextblock-cms/ui/card"),p=require("@nextblock-cms/ui/checkbox"),m=require("@nextblock-cms/ui/separator"),h=require("@nextblock-cms/ui/select"),g=require("react-hook-form"),_=require("@nextblock-cms/ui/avatar"),v=require("@nextblock-cms/db");function y(e){return e?e.startsWith(`http`)?e:process.env.NEXT_PUBLIC_R2_BASE_URL?`${process.env.NEXT_PUBLIC_R2_BASE_URL}/${e}`:process.env.NEXT_PUBLIC_SUPABASE_URL?`${process.env.NEXT_PUBLIC_SUPABASE_URL}/storage/v1/object/public/media/${e}`:e:null}function b(e){return{company_name:e?.company_name||``,recipient_name:e?.recipient_name||``,line1:e?.line1||``,line2:e?.line2||``,city:e?.city||``,state:e?.state||``,postal_code:e?.postal_code||``,country_code:t.normalizeCountryCode(e?.country_code)||`CA`}}function x({prefix:e,title:n,register:r}){let{t:i}=(0,c.useTranslations)(),a=i(`company_name`)===`company_name`?`Company name`:i(`company_name`);return(0,l.jsxs)(`div`,{className:`space-y-4 rounded-xl border p-4`,children:[(0,l.jsxs)(`div`,{children:[(0,l.jsx)(`h3`,{className:`text-lg font-medium`,children:n}),(0,l.jsx)(`p`,{className:`text-sm text-muted-foreground`,children:i(`profile_address_defaults_help`)})]}),(0,l.jsxs)(`div`,{className:`grid gap-4 md:grid-cols-3`,children:[(0,l.jsxs)(`div`,{className:`space-y-2`,children:[(0,l.jsx)(d.Label,{htmlFor:`${e}-company_name`,children:a}),(0,l.jsx)(u.Input,{id:`${e}-company_name`,...r(`${e}.company_name`)})]}),(0,l.jsxs)(`div`,{className:`space-y-2`,children:[(0,l.jsx)(d.Label,{htmlFor:`${e}-recipient_name`,children:i(`full_name`)}),(0,l.jsx)(u.Input,{id:`${e}-recipient_name`,...r(`${e}.recipient_name`)})]}),(0,l.jsxs)(`div`,{className:`space-y-2`,children:[(0,l.jsx)(d.Label,{htmlFor:`${e}-country_code`,children:i(`country`)}),(0,l.jsx)(`select`,{id:`${e}-country_code`,className:`flex h-10 w-full rounded-md border border-input bg-background px-3 py-2 text-sm`,...r(`${e}.country_code`),children:t.countries.map(e=>(0,l.jsx)(`option`,{value:e.code,children:e.name},e.code))})]})]}),(0,l.jsxs)(`div`,{className:`space-y-2`,children:[(0,l.jsx)(d.Label,{htmlFor:`${e}-line1`,children:i(`address_line_1`)}),(0,l.jsx)(u.Input,{id:`${e}-line1`,...r(`${e}.line1`)})]}),(0,l.jsxs)(`div`,{className:`space-y-2`,children:[(0,l.jsx)(d.Label,{htmlFor:`${e}-line2`,children:i(`address_line_2`)}),(0,l.jsx)(u.Input,{id:`${e}-line2`,...r(`${e}.line2`)})]}),(0,l.jsxs)(`div`,{className:`grid gap-4 md:grid-cols-3`,children:[(0,l.jsxs)(`div`,{className:`space-y-2`,children:[(0,l.jsx)(d.Label,{htmlFor:`${e}-city`,children:i(`city`)}),(0,l.jsx)(u.Input,{id:`${e}-city`,...r(`${e}.city`)})]}),(0,l.jsxs)(`div`,{className:`space-y-2`,children:[(0,l.jsx)(d.Label,{htmlFor:`${e}-state`,children:i(`state_province`)}),(0,l.jsx)(u.Input,{id:`${e}-state`,...r(`${e}.state`)})]}),(0,l.jsxs)(`div`,{className:`space-y-2`,children:[(0,l.jsx)(d.Label,{htmlFor:`${e}-postal_code`,children:i(`postal_zip_code`)}),(0,l.jsx)(u.Input,{id:`${e}-postal_code`,...r(`${e}.postal_code`)})]})]})]})}function S({initialData:e,MediaPickerComponent:t,isAdmin:S,email:C,accountLinks:w,onAction:T,initialSuccessMessage:E,lockRole:D,lockRoleReason:O}){let{t:k}=(0,c.useTranslations)(),[A,j]=(0,o.useState)(!1),[M,N]=(0,o.useState)(E?{type:`success`,text:E}:null),P=e?.use_billing_for_shipping??(!e?.shipping_address||n.addressesMatch(e?.billing_address,e?.shipping_address)),{register:F,handleSubmit:I,setValue:L,getValues:R,watch:z,reset:B}=(0,g.useForm)({defaultValues:{full_name:e?.full_name||``,avatar_url:e?.avatar_url||``,website:e?.website||``,phone:e?.phone||``,role:e?.role,use_billing_for_shipping:P,billing_address:b(e?.billing_address),shipping_address:b(e?.shipping_address)}});o.default.useEffect(()=>{e&&B({full_name:e.full_name||``,avatar_url:e.avatar_url||``,website:e.website||``,phone:e.phone||``,role:e.role,use_billing_for_shipping:e.use_billing_for_shipping??(!e.shipping_address||n.addressesMatch(e.billing_address,e.shipping_address)),billing_address:b(e.billing_address),shipping_address:b(e.shipping_address)})},[e,B]),o.default.useEffect(()=>{E&&N({type:`success`,text:E})},[E]),o.default.useEffect(()=>{let e=(0,v.createClient)();(async()=>{let{data:{user:t}}=await e.auth.getUser();t&&!R(`full_name`)&&t.user_metadata?.full_name&&L(`full_name`,t.user_metadata.full_name)})()},[R,L]);let V=e=>{let t=y(e?.object_key??e?.file_path);t&&L(`avatar_url`,t)},H=async e=>{j(!0),N(null);let t=n.normalizeCustomerAddress(e.billing_address)??n.emptyCustomerAddress(),r=e.use_billing_for_shipping?t:n.normalizeCustomerAddress(e.shipping_address);try{let n={...e,billing_address:t,shipping_address:r};if(T){let e=await T(n);if(e?.error)throw Error(e.error)}else await i.updateProfile(n);N({type:`success`,text:k(`profile_updated_success`)})}catch(e){if(e.message===`NEXT_REDIRECT`||e.message?.includes(`NEXT_REDIRECT`))return;console.error(e),N({type:`error`,text:k(`profile_update_failed`)})}finally{j(!1)}},U=z(`use_billing_for_shipping`);return(0,l.jsxs)(`div`,{className:`grid gap-6 md:grid-cols-12 max-w-5xl mx-auto`,children:[(0,l.jsxs)(f.Card,{className:`md:col-span-4 h-fit`,children:[(0,l.jsx)(f.CardHeader,{children:(0,l.jsx)(f.CardTitle,{className:`text-xl`,children:k(`public_profile`)})}),(0,l.jsxs)(f.CardContent,{className:`flex flex-col items-center text-center space-y-4`,children:[(0,l.jsxs)(`div`,{className:`relative group`,children:[(0,l.jsxs)(_.Avatar,{className:`h-32 w-32 border-4 border-muted`,children:[(0,l.jsx)(_.AvatarImage,{src:z(`avatar_url`)||void 0,alt:z(`full_name`)||``,className:`object-cover`}),(0,l.jsx)(_.AvatarFallback,{className:`text-4xl bg-secondary`,children:z(`full_name`)?.charAt(0)?.toUpperCase()||(0,l.jsx)(s.User,{className:`h-12 w-12`})})]}),t&&(0,l.jsx)(`div`,{className:`absolute inset-0 flex items-center justify-center opacity-0 group-hover:opacity-100 group-focus-within:opacity-100 [@media(hover:none)]:opacity-100 transition-opacity bg-black/40 rounded-full cursor-pointer`,children:(0,l.jsx)(t,{triggerLabel:(0,l.jsxs)(l.Fragment,{children:[(0,l.jsx)(s.Upload,{className:`h-6 w-6 text-white`}),(0,l.jsx)(`span`,{className:`sr-only`,children:k(`profile_change_avatar`)===`profile_change_avatar`?`Change profile picture`:k(`profile_change_avatar`)})]}),triggerVariant:`ghost`,title:k(`customer_profile`),onSelect:V,accept:e=>e.file_type.startsWith(`image/`),hideTrigger:!1})})]}),!t&&(0,l.jsxs)(`div`,{className:`w-full`,children:[(0,l.jsx)(d.Label,{htmlFor:`avatar_url`,className:`sr-only`,children:k(`avatar_url`)}),(0,l.jsx)(u.Input,{id:`avatar_url`,type:`url`,autoComplete:`off`,...F(`avatar_url`),placeholder:`https://…`,className:`mt-2`})]}),(0,l.jsxs)(`div`,{className:`w-full space-y-1 text-left mt-4`,children:[(0,l.jsx)(`div`,{className:`text-sm font-medium text-muted-foreground uppercase tracking-wider`,children:k(`identity`)}),(0,l.jsx)(`div`,{className:`flex items-center gap-2`,children:(0,l.jsx)(`span`,{className:`font-semibold text-lg`,children:z(`full_name`)||k(`full_name`)})})]}),w?.length?(0,l.jsx)(r.AccountNavigationMenu,{links:w,className:`mt-2 text-left`}):null]})]}),(0,l.jsx)(f.Card,{className:`md:col-span-8`,children:(0,l.jsxs)(`form`,{onSubmit:I(H),children:[(0,l.jsx)(f.CardHeader,{children:(0,l.jsx)(f.CardTitle,{children:k(`details`)})}),(0,l.jsxs)(f.CardContent,{className:`space-y-6`,children:[C&&(0,l.jsxs)(`div`,{className:`space-y-2`,children:[(0,l.jsxs)(d.Label,{htmlFor:`email`,children:[k(`email`)===`email`?`Email`:k(`email`),` (`,k(`read_only`)===`read_only`?`read-only`:k(`read_only`),`)`]}),(0,l.jsx)(u.Input,{id:`email`,value:C,readOnly:!0,disabled:!0,className:`bg-muted/50`})]}),(0,l.jsx)(`div`,{className:`rounded-xl border bg-muted/20 p-4 text-sm text-muted-foreground`,children:k(`profile_basic_info_help`)}),(0,l.jsxs)(`div`,{className:`grid gap-4 md:grid-cols-2`,children:[(0,l.jsxs)(`div`,{className:`space-y-2`,children:[(0,l.jsxs)(d.Label,{htmlFor:`full_name`,className:`flex items-center gap-2`,children:[(0,l.jsx)(s.User,{className:`h-4 w-4`}),` `,k(`full_name`)]}),(0,l.jsx)(u.Input,{id:`full_name`,autoComplete:`name`,...F(`full_name`)})]}),(0,l.jsxs)(`div`,{className:`space-y-2`,children:[(0,l.jsxs)(d.Label,{htmlFor:`phone`,className:`flex items-center gap-2`,children:[(0,l.jsx)(s.Phone,{className:`h-4 w-4`}),` `,k(`phone_number`)]}),(0,l.jsx)(u.Input,{id:`phone`,type:`tel`,inputMode:`tel`,autoComplete:`tel`,...F(`phone`)})]})]}),(0,l.jsxs)(`div`,{className:`space-y-2`,children:[(0,l.jsxs)(d.Label,{htmlFor:`website`,className:`flex items-center gap-2`,children:[(0,l.jsx)(s.Globe,{className:`h-4 w-4`}),` `,k(`website`)]}),(0,l.jsx)(u.Input,{id:`website`,type:`url`,autoComplete:`url`,...F(`website`),placeholder:`https://example.com`})]}),(0,l.jsx)(m.Separator,{className:`my-2`}),(0,l.jsx)(x,{prefix:`billing_address`,title:k(`billing_address`),register:F}),(0,l.jsxs)(`div`,{className:`flex items-center space-x-3 rounded-lg border p-4`,children:[(0,l.jsx)(p.Checkbox,{id:`use_billing_for_shipping`,checked:!!U,onCheckedChange:e=>L(`use_billing_for_shipping`,!!e,{shouldDirty:!0})}),(0,l.jsxs)(`div`,{className:`space-y-1`,children:[(0,l.jsx)(d.Label,{htmlFor:`use_billing_for_shipping`,className:`cursor-pointer`,children:k(`use_billing_for_shipping`)}),(0,l.jsx)(`p`,{className:`text-sm text-muted-foreground`,children:k(`profile_use_billing_for_shipping_help`)})]})]}),!U&&(0,l.jsx)(x,{prefix:`shipping_address`,title:k(`shipping_address`),register:F}),M&&(0,l.jsx)(`div`,{role:M.type===`error`?`alert`:`status`,className:`mt-4 rounded-xl border p-4 text-sm ${M.type===`success`?`border-emerald-200 bg-emerald-50 text-emerald-700`:`border-red-200 bg-red-50 text-red-700`}`,children:M.text}),S&&(0,l.jsxs)(`div`,{className:`border-t pt-4 mt-4`,children:[(0,l.jsx)(`h3`,{className:`text-sm font-medium mb-3`,children:`Admin Settings`}),(0,l.jsxs)(`div`,{className:`grid gap-2`,children:[(0,l.jsx)(d.Label,{htmlFor:`role`,children:`Role`}),(0,l.jsxs)(h.Select,{value:z(`role`)||`USER`,onValueChange:e=>L(`role`,e),disabled:D,children:[(0,l.jsx)(h.SelectTrigger,{children:(0,l.jsx)(h.SelectValue,{placeholder:`Select role`})}),(0,l.jsxs)(h.SelectContent,{children:[(0,l.jsx)(h.SelectItem,{value:`USER`,children:`User`}),(0,l.jsx)(h.SelectItem,{value:`WRITER`,children:`Writer`}),(0,l.jsx)(h.SelectItem,{value:`ADMIN`,children:`Admin`})]})]}),D&&(0,l.jsx)(`p`,{className:`text-xs text-muted-foreground`,children:O||`This is the only Admin account, so its role can't be changed. Promote another user to Admin first.`})]})]})]}),(0,l.jsx)(f.CardFooter,{className:`flex justify-end`,children:(0,l.jsx)(a.Button,{type:`submit`,disabled:A,size:`lg`,children:k(A?`saving`:`save_changes`)})})]})})]})}exports.CustomerProfileForm=S;
@@ -17,7 +17,7 @@ import { Select as D, SelectContent as O, SelectItem as k, SelectTrigger as A, S
17
17
  import { useForm as M } from "react-hook-form";
18
18
  import { Avatar as ee, AvatarFallback as te, AvatarImage as ne } from "@nextblock-cms/ui/avatar";
19
19
  import { createClient as re } from "@nextblock-cms/db";
20
- //#region libs/ecommerce/src/lib/components/CustomerProfileForm.tsx
20
+ //#region src/lib/components/CustomerProfileForm.tsx
21
21
  function ie(e) {
22
22
  return e ? e.startsWith("http") ? e : process.env.NEXT_PUBLIC_R2_BASE_URL ? `${process.env.NEXT_PUBLIC_R2_BASE_URL}/${e}` : process.env.NEXT_PUBLIC_SUPABASE_URL ? `${process.env.NEXT_PUBLIC_SUPABASE_URL}/storage/v1/object/public/media/${e}` : e : null;
23
23
  }
@@ -0,0 +1 @@
1
+ "use client";Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require("../../_virtual/_rolldown/runtime.cjs"),t=require("../currency.cjs"),n=require("../CurrencyProvider.cjs"),r=require("../use-price-formatter.cjs"),i=require("../trials.cjs"),a=require("./AddToCartButton.cjs"),o=require("./ShortDescription.cjs");let s=require("next/link");s=e.__toESM(s,1);let c=require("@nextblock-cms/utils"),l=require("react/jsx-runtime");var u=({product:e,className:u,imagePosition:d=`left`})=>{let f=r.usePriceFormatter(),{t:p}=(0,c.useTranslations)(),{activeCurrencyCode:m,currencies:h}=n.useCurrency(),g=t.resolvePriceRangeForCurrency({entries:e.variants?.length?e.variants:e.product_variants?.length?e.product_variants:[],currencyCode:m,currencies:h}),_=!!(e.has_variants&&g),v=t.resolveEffectivePriceForCurrency({prices:e.prices,salePrices:e.sale_prices,fallbackPrice:e.price,fallbackSalePrice:e.sale_price,saleStartAt:e.sale_start_at,saleEndAt:e.sale_end_at,scheduledPrice:e.scheduled_price,scheduledPrices:e.scheduled_prices,scheduledPriceAt:e.scheduled_price_at,currencyCode:m,currencies:h}),y=_&&g?g.min===g.max?f(g.min,m):`${f(g.min,m)} - ${f(g.max,m)}`:f(v.sale_price??v.price,m),b=i.getTrialSummary(e,p);return(0,l.jsx)(`div`,{className:(0,c.cn)(`overflow-hidden rounded-xl border bg-card shadow-sm`,u),children:(0,l.jsxs)(`div`,{className:(0,c.cn)(`flex flex-col gap-8 md:flex-row`,d===`right`&&`md:flex-row-reverse`),children:[(0,l.jsx)(`div`,{className:`relative aspect-square w-full md:w-1/2`,children:e.image_url?(0,l.jsx)(`img`,{src:e.image_url,alt:e.title,width:800,height:800,loading:`lazy`,decoding:`async`,className:`h-full w-full object-cover`}):(0,l.jsx)(`div`,{className:`flex h-full w-full items-center justify-center bg-secondary text-muted-foreground`,children:p(`ecommerce.no_image`)})}),(0,l.jsxs)(`div`,{className:`flex flex-1 flex-col justify-center p-6 md:p-12`,children:[(0,l.jsx)(s.default,{href:`/product/${e.slug}`,children:(0,l.jsx)(`h2`,{className:`mb-4 text-3xl font-bold tracking-tight hover:underline md:text-4xl`,children:e.title})}),(0,l.jsxs)(`div`,{className:`mb-6 flex items-baseline gap-3`,children:[(0,l.jsx)(`span`,{className:`text-3xl font-bold text-primary`,children:y}),!_&&v.sale_price&&(0,l.jsx)(`span`,{className:`text-lg text-muted-foreground line-through`,children:f(v.price,m)})]}),b&&(0,l.jsxs)(`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:[(0,l.jsx)(`span`,{className:`font-semibold`,children:b.label}),(0,l.jsx)(`span`,{className:`text-emerald-700`,children:b.paymentRequirementLabel})]}),(0,l.jsx)(o.ShortDescription,{value:e.short_description,className:`mb-8 text-lg text-muted-foreground`}),(0,l.jsxs)(`div`,{className:`flex flex-col gap-4 sm:flex-row`,children:[(0,l.jsx)(a.AddToCartButton,{product:e,className:`h-12 w-full px-8 text-lg sm:w-auto`}),(0,l.jsx)(s.default,{href:`/product/${e.slug}`,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`,children:p(`ecommerce.view_details`)})]})]})]})})};exports.FeaturedProduct=u;
@@ -8,7 +8,7 @@ import { ShortDescription as o } from "./ShortDescription.es.js";
8
8
  import s from "next/link";
9
9
  import { cn as c, useTranslations as l } from "@nextblock-cms/utils";
10
10
  import { jsx as u, jsxs as d } from "react/jsx-runtime";
11
- //#region libs/ecommerce/src/lib/components/FeaturedProduct.tsx
11
+ //#region src/lib/components/FeaturedProduct.tsx
12
12
  var f = ({ product: f, className: p, imagePosition: m = "left" }) => {
13
13
  let h = r(), { t: g } = l(), { activeCurrencyCode: _, currencies: v } = n(), y = t({
14
14
  entries: f.variants?.length ? f.variants : f.product_variants?.length ? f.product_variants : [],
@@ -0,0 +1 @@
1
+ "use client";const e=require("../invoice-ui.cjs"),t=require("../invoice.cjs");let n=require("@nextblock-cms/ui/button"),r=require("react"),i=require("lucide-react"),a=require("@nextblock-cms/utils"),o=require("react/jsx-runtime");function s({license:s}){let{t:c,lang:l}=(0,a.useTranslations)(),[u,d]=(0,r.useState)(!1);if(!s)return null;let f=e.getInvoiceLocale(l),p=s.expiration??s.trialEndsAt,m=p?t.formatInvoiceDate(p,f):null;return(0,o.jsxs)(`div`,{className:`mb-6 rounded-2xl border border-primary/30 bg-primary/5 p-5 print:hidden`,children:[(0,o.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,o.jsx)(i.KeyRound,{className:`h-5 w-5 text-primary`}),(0,o.jsx)(`h2`,{className:`text-lg font-semibold`,children:e.translateOrFallback(c,`ecommerce.license_panel_title`,`Your license`)})]}),s.licenseKey?(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(`p`,{className:`mt-1 text-sm text-muted-foreground`,children:e.translateOrFallback(c,`ecommerce.license_panel_help`,`Activate this key in your NextBlock install under Settings → Packages.`)}),(0,o.jsxs)(`div`,{className:`mt-3 flex flex-col gap-2 sm:flex-row sm:items-center`,children:[(0,o.jsx)(`code`,{translate:`no`,className:`flex-1 select-all overflow-x-auto rounded-lg border bg-background px-3 py-2 font-mono text-sm`,children:s.licenseKey}),(0,o.jsxs)(n.Button,{type:`button`,variant:`default`,onClick:async()=>{if(s.licenseKey&&typeof navigator<`u`&&navigator.clipboard)try{await navigator.clipboard.writeText(s.licenseKey),d(!0),window.setTimeout(()=>d(!1),2e3)}catch{}},className:`shrink-0`,children:[u?(0,o.jsx)(i.Check,{className:`mr-2 h-4 w-4`}):(0,o.jsx)(i.Copy,{className:`mr-2 h-4 w-4`}),u?e.translateOrFallback(c,`ecommerce.license_copied`,`Copied`):e.translateOrFallback(c,`ecommerce.license_copy`,`Copy key`)]})]})]}):(0,o.jsx)(`p`,{className:`mt-1 text-sm text-muted-foreground`,children:e.translateOrFallback(c,`ecommerce.license_panel_email_fallback`,`Your license key was sent to your email. It will also appear here once your purchase is confirmed.`)}),(0,o.jsxs)(`dl`,{className:`mt-4 grid gap-x-6 gap-y-1 text-xs text-muted-foreground sm:grid-cols-2`,children:[(0,o.jsxs)(`div`,{className:`flex justify-between gap-3 sm:block`,children:[(0,o.jsx)(`dt`,{className:`font-medium`,children:e.translateOrFallback(c,`ecommerce.license_number`,`License #`)}),(0,o.jsx)(`dd`,{className:`font-mono`,children:s.licenseId})]}),m?(0,o.jsxs)(`div`,{className:`flex justify-between gap-3 sm:block`,children:[(0,o.jsx)(`dt`,{className:`font-medium`,children:s.isCancelled?e.translateOrFallback(c,`ecommerce.license_expires`,`Expires`):s.trialEndsAt?e.translateOrFallback(c,`ecommerce.license_trial_ends`,`Trial ends`):e.translateOrFallback(c,`ecommerce.license_renews`,`Renews / expires`)}),(0,o.jsx)(`dd`,{children:m})]}):null]})]})}exports.FreemiusLicensePanel=s;
@@ -6,7 +6,7 @@ import { useState as i } from "react";
6
6
  import { Check as a, Copy as o, KeyRound as s } from "lucide-react";
7
7
  import { useTranslations as c } from "@nextblock-cms/utils";
8
8
  import { Fragment as l, jsx as u, jsxs as d } from "react/jsx-runtime";
9
- //#region libs/ecommerce/src/lib/components/FreemiusLicensePanel.tsx
9
+ //#region src/lib/components/FreemiusLicensePanel.tsx
10
10
  function f({ license: f }) {
11
11
  let { t: p, lang: m } = c(), [h, g] = i(!1);
12
12
  if (!f) return null;
@@ -0,0 +1 @@
1
+ const e=require("../../_virtual/_rolldown/runtime.cjs"),t=require("../invoice.cjs"),n=require("../order-tax-details.cjs");let r=require("react");r=e.__toESM(r,1);let i=require("react/jsx-runtime"),a=require("next/image");a=e.__toESM(a,1);function o({data:e,labels:r,locale:o=`en-US`,className:u=``}){let d=t.getInvoiceAddressLines(e.settings.address),f=t.getInvoiceAddressLines(e.order.customer_details?.billing),p=t.getInvoiceAddressLines(e.order.customer_details?.shipping);return(0,i.jsxs)(`section`,{className:`rounded-2xl border bg-white text-slate-900 shadow-sm print:rounded-none print:border-0 print:text-[10px] print:shadow-none ${u}`,children:[(0,i.jsx)(`div`,{className:`border-b px-6 py-6 print:px-0`,children:(0,i.jsxs)(`div`,{className:`grid gap-6 md:grid-cols-[minmax(0,1fr)_auto_minmax(0,1fr)] md:items-start print:grid-cols-[minmax(0,1fr)_72px_280px] print:items-start print:gap-4`,children:[(0,i.jsxs)(`div`,{className:`order-2 max-w-md space-y-4 print:order-none print:max-w-none print:space-y-2 md:order-none`,children:[(0,i.jsxs)(`div`,{className:`space-y-1 text-sm print:text-[10px]`,children:[(0,i.jsx)(`p`,{className:`text-xs font-semibold uppercase tracking-[0.2em] text-slate-500`,children:r.from}),e.settings.businessName?(0,i.jsx)(`p`,{className:`text-base font-semibold`,children:e.settings.businessName}):null,d.map((e,t)=>(0,i.jsx)(`p`,{children:e},`seller-${t}-${e}`)),e.settings.email?(0,i.jsx)(`p`,{children:e.settings.email}):null,e.settings.phone?(0,i.jsx)(`p`,{children:e.settings.phone}):null]}),e.settings.taxRegistrations.length>0?(0,i.jsxs)(`div`,{className:`rounded-xl border bg-slate-50 px-4 py-3 text-sm print:px-3 print:py-2 print:text-[10px]`,children:[(0,i.jsx)(`p`,{className:`mb-2 font-semibold`,children:r.taxRegistrations}),(0,i.jsx)(`div`,{className:`space-y-1`,children:e.settings.taxRegistrations.map((e,t)=>(0,i.jsxs)(`p`,{children:[(0,i.jsx)(`span`,{className:`font-medium`,children:e.label}),e.label&&e.value?`: `:``,e.value]},`${e.label}-${e.value}-${t}`))})]}):null]}),(0,i.jsx)(`div`,{className:`order-1 flex justify-center md:order-none md:pt-2 print:order-none print:pt-1`,children:e.logo?.url?(0,i.jsx)(a.default,{src:e.logo.url,alt:e.logo.name||e.settings.businessName||`Logo`,className:`mx-auto h-24 w-auto object-contain print:h-14`,width:e.logo.width||320,height:e.logo.height||120}):null}),(0,i.jsx)(`div`,{className:`order-3 flex justify-start md:order-none md:justify-end print:order-none`,children:(0,i.jsxs)(`div`,{className:`w-full max-w-[380px] rounded-2xl bg-slate-950 px-5 py-5 text-white print:max-w-none print:border print:border-slate-300 print:bg-white print:px-3 print:py-3 print:text-[10px] print:text-slate-950`,children:[(0,i.jsx)(`p`,{className:`text-xs uppercase tracking-[0.2em] text-white/70 print:text-slate-500`,children:r.invoice}),(0,i.jsxs)(`div`,{className:`mt-4 space-y-3 text-sm print:mt-3 print:space-y-2 print:text-[10px]`,children:[(0,i.jsx)(c,{label:r.invoiceNumber,value:e.order.invoice_number||`--`}),(0,i.jsx)(c,{label:r.orderNumber,value:e.order.id}),(0,i.jsx)(c,{label:r.paidOn,value:t.formatInvoiceDate(e.order.paid_at||e.order.created_at,o)||`--`}),(0,i.jsx)(c,{label:r.status,value:e.order.status})]})]})})]})}),(0,i.jsxs)(`div`,{className:`grid gap-4 border-b px-6 py-6 md:grid-cols-2 print:grid-cols-2 print:gap-3 print:px-0 print:py-3`,children:[(0,i.jsx)(s,{title:r.billTo,lines:f}),(0,i.jsx)(s,{title:r.shipTo,lines:p})]}),(0,i.jsxs)(`div`,{className:`px-6 py-6 print:px-0 print:py-3`,children:[(0,i.jsx)(`div`,{className:`overflow-x-auto rounded-2xl border print:overflow-visible`,children:(0,i.jsxs)(`table`,{className:`w-full border-collapse text-sm tabular-nums print:table-fixed print:text-[9px]`,children:[(0,i.jsx)(`thead`,{className:`bg-slate-50`,children:(0,i.jsxs)(`tr`,{children:[(0,i.jsx)(`th`,{className:`px-4 py-3 text-left font-semibold print:w-[22%] print:px-2 print:py-1.5`,children:r.item}),(0,i.jsx)(`th`,{className:`px-4 py-3 text-left font-semibold print:w-[38%] print:px-2 print:py-1.5`,children:r.details}),(0,i.jsx)(`th`,{className:`px-4 py-3 text-right font-semibold print:w-[10%] print:px-2 print:py-1.5`,children:r.quantity}),(0,i.jsx)(`th`,{className:`px-4 py-3 text-right font-semibold print:w-[15%] print:px-2 print:py-1.5`,children:r.price}),(0,i.jsx)(`th`,{className:`px-4 py-3 text-right font-semibold print:w-[15%] print:px-2 print:py-1.5`,children:r.amount})]})}),(0,i.jsx)(`tbody`,{children:e.order.items.map(n=>(0,i.jsxs)(`tr`,{className:`border-t`,children:[(0,i.jsx)(`td`,{className:`px-4 py-4 font-medium print:px-2 print:py-1.5`,children:n.title}),(0,i.jsx)(`td`,{className:`px-4 py-4 text-slate-600 print:px-2 print:py-1.5`,children:n.description||`--`}),(0,i.jsx)(`td`,{className:`px-4 py-4 text-right print:px-2 print:py-1.5`,children:n.quantity}),(0,i.jsx)(`td`,{className:`px-4 py-4 text-right print:px-2 print:py-1.5`,children:t.formatInvoiceCurrency(n.unit_amount,e.order.currency,o)}),(0,i.jsx)(`td`,{className:`px-4 py-4 text-right font-medium print:px-2 print:py-1.5`,children:t.formatInvoiceCurrency(n.total_amount,e.order.currency,o)})]},n.id))})]})}),(0,i.jsxs)(`div`,{className:`mt-6 grid gap-6 md:grid-cols-[minmax(0,1fr)_320px] print:mt-4 print:grid-cols-[minmax(0,1fr)_220px] print:items-start print:gap-4`,children:[(0,i.jsx)(`div`,{children:e.order.tax_details?.lines?.length?(0,i.jsxs)(`div`,{className:`rounded-xl border bg-slate-50 px-5 py-4 print:break-inside-avoid print:px-3 print:py-2.5 print:text-[10px]`,children:[(0,i.jsx)(`p`,{className:`mb-3 font-semibold`,children:r.taxBreakdown}),(0,i.jsx)(`div`,{className:`space-y-3 text-sm print:space-y-2 print:text-[10px]`,children:e.order.tax_details.lines.map((r,a)=>{let s=n.getOrderTaxRatePercentage(r.rate);return(0,i.jsxs)(`div`,{className:`flex items-start justify-between gap-4`,children:[(0,i.jsxs)(`div`,{children:[(0,i.jsxs)(`p`,{className:`font-medium`,children:[n.getOrderTaxRateLabel(r.rate),typeof s==`number`?` - ${s.toFixed(4)}%`:``]}),n.getOrderTaxRateJurisdiction(r.rate)?(0,i.jsx)(`p`,{className:`text-xs text-slate-500 print:text-[9px]`,children:n.getOrderTaxRateJurisdiction(r.rate)}):null]}),(0,i.jsx)(`span`,{children:t.formatInvoiceCurrency(r.amount,e.order.currency,o)})]},`${r.rate.display_name}-${r.description||`tax`}-${a}`)})})]}):null}),(0,i.jsxs)(`div`,{className:`rounded-xl border bg-slate-950 px-5 py-5 text-sm text-white print:break-inside-avoid print:border-slate-300 print:bg-white print:px-3 print:py-3 print:text-[10px] print:text-slate-950`,children:[(0,i.jsxs)(`div`,{className:`space-y-3 print:space-y-2`,children:[(0,i.jsx)(l,{label:r.subtotal,value:t.formatInvoiceCurrency(e.order.subtotal,e.order.currency,o)}),e.order.discount_total>0?(0,i.jsx)(l,{label:e.order.coupon_code?`${r.discount} (${e.order.coupon_code})`:r.discount,value:`-${t.formatInvoiceCurrency(e.order.discount_total,e.order.currency,o)}`}):null,(0,i.jsx)(l,{label:r.shipping,value:t.formatInvoiceCurrency(e.order.shipping_total,e.order.currency,o)}),(0,i.jsx)(l,{label:r.tax,value:t.formatInvoiceCurrency(e.order.tax_total,e.order.currency,o)})]}),(0,i.jsx)(`div`,{className:`mt-4 border-t border-white/15 pt-4 print:mt-3 print:border-slate-300 print:pt-3`,children:(0,i.jsx)(l,{label:r.total,value:t.formatInvoiceCurrency(e.order.total,e.order.currency,o),strong:!0})})]})]})]})]})}function s({title:e,lines:t}){return(0,i.jsxs)(`div`,{className:`rounded-xl border bg-slate-50 px-5 py-4 print:break-inside-avoid print:px-3 print:py-2.5 print:text-[10px]`,children:[(0,i.jsx)(`p`,{className:`mb-3 text-xs font-semibold uppercase tracking-[0.2em] text-slate-500`,children:e}),t.length?(0,i.jsx)(`div`,{className:`space-y-1 text-sm print:text-[10px]`,children:t.map((t,n)=>(0,i.jsx)(`p`,{children:t},`${e}-${n}-${t}`))}):(0,i.jsx)(`p`,{className:`text-sm text-slate-500`,children:`--`})]})}function c({label:e,value:t}){return(0,i.jsxs)(`div`,{className:`flex items-center justify-between gap-4`,children:[(0,i.jsx)(`span`,{className:`text-white/70 print:text-[9px] print:text-slate-500`,children:e}),(0,i.jsx)(`span`,{className:`text-right font-medium`,children:t})]})}function l({label:e,value:t,strong:n=!1}){return(0,i.jsxs)(`div`,{className:`flex items-center justify-between gap-4`,children:[(0,i.jsx)(`span`,{className:n?`text-base font-semibold print:text-sm`:`text-white/75 print:text-[9px] print:text-slate-500`,children:e}),(0,i.jsx)(`span`,{className:n?`text-lg font-semibold print:text-base`:`font-medium`,children:t})]})}exports.InvoiceDocument=o;
@@ -3,7 +3,7 @@ import { getOrderTaxRateJurisdiction as r, getOrderTaxRateLabel as i, getOrderTa
3
3
  import "react";
4
4
  import { jsx as o, jsxs as s } from "react/jsx-runtime";
5
5
  import c from "next/image";
6
- //#region libs/ecommerce/src/lib/components/InvoiceDocument.tsx
6
+ //#region src/lib/components/InvoiceDocument.tsx
7
7
  function l({ data: l, labels: p, locale: m = "en-US", className: h = "" }) {
8
8
  let g = n(l.settings.address), _ = n(l.order.customer_details?.billing), v = n(l.order.customer_details?.shipping);
9
9
  return /* @__PURE__ */ s("section", {
@@ -1,4 +1,4 @@
1
- "use client";const e=require("../../_virtual/_rolldown/runtime.cjs.js"),t=require("./InvoiceDocument.cjs.js");let n=require("@nextblock-cms/ui/button"),r=require("next/link");r=e.__toESM(r,1);let i=require("lucide-react"),a=require("react/jsx-runtime");function o({invoice:e,labels:o,locale:s,title:c,description:l,printLabel:u,headerVisual:d,action:f,loading:p=!1,loadingMessage:m,error:h,onRetry:g,retryLabel:_,emptyMessage:v,className:y=``,showHeader:b=!0,beforeInvoice:x}){return(0,a.jsxs)(a.Fragment,{children:[(0,a.jsx)(`style`,{children:`
1
+ "use client";const e=require("../../_virtual/_rolldown/runtime.cjs"),t=require("./InvoiceDocument.cjs");let n=require("@nextblock-cms/ui/button"),r=require("next/link");r=e.__toESM(r,1);let i=require("lucide-react"),a=require("react/jsx-runtime");function o({invoice:e,labels:o,locale:s,title:c,description:l,printLabel:u,headerVisual:d,action:f,loading:p=!1,loadingMessage:m,error:h,onRetry:g,retryLabel:_,emptyMessage:v,className:y=``,showHeader:b=!0,beforeInvoice:x}){return(0,a.jsxs)(a.Fragment,{children:[(0,a.jsx)(`style`,{children:`
2
2
  @media print {
3
3
  @page {
4
4
  size: portrait;
@@ -4,7 +4,7 @@ import { Button as t } from "@nextblock-cms/ui/button";
4
4
  import n from "next/link";
5
5
  import { Printer as r } from "lucide-react";
6
6
  import { Fragment as i, jsx as a, jsxs as o } from "react/jsx-runtime";
7
- //#region libs/ecommerce/src/lib/components/InvoiceViewerShell.tsx
7
+ //#region src/lib/components/InvoiceViewerShell.tsx
8
8
  function s({ invoice: s, labels: c, locale: l, title: u, description: d, printLabel: f, headerVisual: p, action: m, loading: h = !1, loadingMessage: g, error: _, onRetry: v, retryLabel: y, emptyMessage: b, className: x = "", showHeader: S = !0, beforeInvoice: C }) {
9
9
  return /* @__PURE__ */ o(i, { children: [/* @__PURE__ */ a("style", { children: "\n @media print {\n @page {\n size: portrait;\n margin: 12mm;\n }\n\n body {\n background: white !important;\n }\n\n body * {\n visibility: hidden;\n }\n\n [data-print-invoice-root],\n [data-print-invoice-root] * {\n visibility: visible;\n }\n\n [data-print-invoice-root] {\n position: absolute;\n inset: 0;\n width: 100%;\n margin: 0;\n padding: 0;\n }\n }\n " }), /* @__PURE__ */ o("div", {
10
10
  className: `mx-auto max-w-6xl px-4 py-10 md:px-6 print:max-w-none print:px-0 print:py-0 ${x}`,
@@ -0,0 +1 @@
1
+ "use client";const e=require("../../_virtual/_rolldown/runtime.cjs"),t=require("../currency.cjs"),n=require("../CurrencyProvider.cjs"),r=require("../use-price-formatter.cjs"),i=require("../trials.cjs"),a=require("../variation-utils.cjs"),o=require("./AddToCartButton.cjs");let s=require("next/link");s=e.__toESM(s,1);let c=require("@nextblock-cms/utils"),l=require("react/jsx-runtime");var u=({product:e,className:u,priority:d=!1})=>{let f=r.usePriceFormatter(),{activeCurrencyCode:p,currencies:m}=n.useCurrency(),h=t.resolvePriceRangeForCurrency({entries:e.variants?.length?e.variants:e.product_variants?.length?e.product_variants:[],currencyCode:p,currencies:m}),g=!!(e.has_variants&&h),_=t.resolveEffectivePriceForCurrency({prices:e.prices,salePrices:e.sale_prices,fallbackPrice:e.price,fallbackSalePrice:e.sale_price,saleStartAt:e.sale_start_at,saleEndAt:e.sale_end_at,scheduledPrice:e.scheduled_price,scheduledPrices:e.scheduled_prices,scheduledPriceAt:e.scheduled_price_at,currencyCode:p,currencies:m}),v=g&&h?h.min===h.max?f(h.min,p):`${f(h.min,p)} - ${f(h.max,p)}`:f(_.sale_price??_.price,p),y=e.variants?.length?e.variants:e.product_variants?.length?e.product_variants:[],b=g?y.some(e=>t.resolveEffectivePriceForCurrency({prices:e.prices,salePrices:e.sale_prices,fallbackPrice:e.price,fallbackSalePrice:e.sale_price,saleStartAt:e.sale_start_at,saleEndAt:e.sale_end_at,scheduledPrice:e.scheduled_price,scheduledPrices:e.scheduled_prices,scheduledPriceAt:e.scheduled_price_at,currencyCode:p,currencies:m}).sale_price!=null):_.sale_price!=null,{t:x,lang:S}=(0,c.useTranslations)(),C=x(`ecommerce.on_sale`),w=C===`ecommerce.on_sale`?`On Sale`:C,T=i.getTrialSummary(e,x),E=(e.freemius_plans?.[0])?.freemius_pricing?.[0],D=m.find(e=>e.is_default)?.code||`USD`,O=E?.override_monthly_price??E?.api_monthly_price,k=E?.override_annual_price??E?.api_annual_price,A=typeof O==`number`?t.resolvePriceForCurrency({prices:{[D]:(0,c.majorUnitAmountToMinor)(O,D)},currencyCode:p,currencies:m}):null,j=typeof k==`number`?t.resolvePriceForCurrency({prices:{[D]:(0,c.majorUnitAmountToMinor)(k,D)},currencyCode:p,currencies:m}):null;return(0,l.jsxs)(`div`,{className:(0,c.cn)(`group relative flex flex-col overflow-hidden rounded-lg border bg-card text-card-foreground shadow-sm transition-shadow hover:shadow-md`,u),children:[(0,l.jsxs)(s.default,{href:`/product/${e.slug}`,tabIndex:-1,"aria-hidden":`true`,className:`relative aspect-square overflow-hidden bg-muted`,children:[b&&(0,l.jsx)(`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:w}),e.image_url?(0,l.jsx)(`img`,{src:e.image_url,alt:``,width:600,height:600,loading:d?`eager`:`lazy`,decoding:`async`,className:`h-full w-full object-cover object-center transition-transform duration-300 group-hover:scale-105`}):(0,l.jsx)(`div`,{className:`flex h-full items-center justify-center text-muted-foreground`,children:x(`ecommerce.no_image`)===`ecommerce.no_image`?`No image`:x(`ecommerce.no_image`)})]}),(0,l.jsxs)(`div`,{className:`flex flex-1 flex-col p-4`,children:[e.categories&&e.categories.length>0&&(0,l.jsx)(`div`,{className:`text-[10px] font-bold uppercase tracking-widest text-amber-600 dark:text-amber-400 mb-1`,children:e.categories.map(e=>a.resolveTranslatedText(e.name,e.name_translations,S)).join(` • `)}),(0,l.jsx)(s.default,{href:`/product/${e.slug}`,className:`mb-2`,children:(0,l.jsx)(`h3`,{className:`line-clamp-1 text-lg font-medium text-foreground group-hover:underline`,children:e.title})}),(0,l.jsx)(`div`,{className:`flex items-center gap-1 mb-2 mt-0.5 text-xs text-muted-foreground min-h-[1.25rem] select-none`,children:e.total_reviews&&e.total_reviews>0?(0,l.jsxs)(l.Fragment,{children:[(0,l.jsx)(`div`,{role:`img`,"aria-label":x(`ecommerce.rating_out_of_5`,{rating:Number(e.average_rating??0).toFixed(1)})===`ecommerce.rating_out_of_5`?`Rated ${Number(e.average_rating??0).toFixed(1)} out of 5`:x(`ecommerce.rating_out_of_5`,{rating:Number(e.average_rating??0).toFixed(1)}),className:`flex items-center text-amber-500 mr-1`,children:Array.from({length:5}).map((t,n)=>{let r=e.average_rating??0;return(0,l.jsx)(`svg`,{className:(0,c.cn)(`h-3.5 w-3.5 fill-current`,n<Math.round(r)?`text-amber-500`:`text-slate-200 dark:text-slate-800`),viewBox:`0 0 20 20`,fill:`currentColor`,"aria-hidden":`true`,children:(0,l.jsx)(`path`,{d:`M9.049 2.927c.3-.921 1.603-.921 1.902 0l1.07 3.292a1 1 0 00.95.69h3.462c.969 0 1.371 1.24.588 1.81l-2.8 2.034a1 1 0 00-.364 1.118l1.07 3.292c.3.921-.755 1.688-1.54 1.118l-2.8-2.034a1 1 0 00-1.175 0l-2.8 2.034c-.784.57-1.838-.197-1.539-1.118l1.07-3.292a1 1 0 00-.364-1.118L2.98 8.72c-.783-.57-.38-1.81.588-1.81h3.461a1 1 0 00.951-.69l1.07-3.292z`})},n)})}),(0,l.jsx)(`span`,{className:`font-semibold text-slate-700 dark:text-slate-300`,children:Number(e.average_rating).toFixed(1)}),(0,l.jsxs)(`span`,{className:`ml-0.5`,children:[`(`,e.total_reviews,`)`]})]}):(0,l.jsx)(`span`,{className:`text-slate-400 dark:text-slate-600`,children:x(`reviews.no_reviews`)})}),(0,l.jsx)(`div`,{className:`mb-4`,children:e.product_type===`digital`&&(A||j)?(0,l.jsxs)(`div`,{className:`flex flex-wrap items-baseline gap-x-3 gap-y-1`,children:[A&&(0,l.jsxs)(`div`,{className:`flex items-baseline gap-0.5`,children:[(0,l.jsx)(`span`,{className:`text-xl font-bold text-primary`,children:f(A.price,p)}),(0,l.jsxs)(`span`,{className:`text-xs font-medium text-muted-foreground lowercase`,children:[`/ `,x(`ecommerce.month`)]})]}),j&&(0,l.jsxs)(`div`,{className:`flex items-baseline gap-0.5`,children:[(0,l.jsx)(`span`,{className:(0,c.cn)(`font-bold text-primary`,A?`text-lg`:`text-xl`),children:f(j.price,p)}),(0,l.jsxs)(`span`,{className:`text-xs font-medium text-muted-foreground lowercase`,children:[`/ `,x(`ecommerce.year`)]})]})]}):(0,l.jsxs)(`div`,{className:`flex items-baseline gap-2`,children:[(0,l.jsx)(`span`,{className:`text-xl font-bold text-primary`,children:v}),!g&&_.sale_price&&(0,l.jsxs)(`span`,{className:`text-sm text-muted-foreground tabular-nums`,children:[(0,l.jsxs)(`span`,{className:`sr-only`,children:[x(`ecommerce.regular_price`)===`ecommerce.regular_price`?`Regular price`:x(`ecommerce.regular_price`),` `]}),(0,l.jsx)(`s`,{children:f(_.price,p)})]})]})}),T&&(0,l.jsxs)(`div`,{className:`mb-4 rounded-md border border-emerald-200 bg-emerald-50 px-3 py-2 text-xs text-emerald-900`,children:[(0,l.jsx)(`div`,{className:`font-semibold`,children:T.label}),(0,l.jsx)(`div`,{className:`text-emerald-700`,children:T.paymentRequirementLabel})]}),(0,l.jsx)(`div`,{className:`mt-auto`,children:(0,l.jsx)(o.AddToCartButton,{product:{...e,price:e.price,prices:e.prices,sale_price:e.sale_price,sale_prices:e.sale_prices},className:`w-full`})})]})]})};exports.ProductCard=u;
@@ -8,7 +8,7 @@ import { AddToCartButton as s } from "./AddToCartButton.es.js";
8
8
  import c from "next/link";
9
9
  import { cn as l, majorUnitAmountToMinor as u, useTranslations as d } from "@nextblock-cms/utils";
10
10
  import { Fragment as f, jsx as p, jsxs as m } from "react/jsx-runtime";
11
- //#region libs/ecommerce/src/lib/components/ProductCard.tsx
11
+ //#region src/lib/components/ProductCard.tsx
12
12
  var h = ({ product: h, className: g, priority: _ = !1 }) => {
13
13
  let v = i(), { activeCurrencyCode: y, currencies: b } = r(), x = n({
14
14
  entries: h.variants?.length ? h.variants : h.product_variants?.length ? h.product_variants : [],
@@ -0,0 +1 @@
1
+ "use client";Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require("../../_virtual/_rolldown/runtime.cjs"),t=require("../types.cjs"),n=require("../currency.cjs"),r=require("../CurrencyProvider.cjs"),i=require("../use-price-formatter.cjs"),a=require("../trials.cjs"),o=require("../variation-utils.cjs"),s=require("./AddToCartButton.cjs"),c=require("./ProductGallery.cjs"),l=require("./SimpleTiptapRenderer.cjs"),u=require("./ShortDescription.cjs"),d=require("./SubscriptionSelector.cjs"),f=require("../product-context.cjs");let p=require("@nextblock-cms/ui/badge"),m=require("@nextblock-cms/ui/button"),h=require("react");h=e.__toESM(h,1);let g=require("lucide-react"),_=require("@nextblock-cms/utils"),v=require("react/jsx-runtime"),y=require("@nextblock-cms/ui/label"),b=require("@nextblock-cms/ui/separator");function x(e,t,n,r){let i={kind:`product-field`,field:t,input:n,label:r},a=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`,o=(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(/\/+$/,``);try{(o.startsWith(`http://`)||o.startsWith(`https://`))&&(o=new URL(o).hostname)}catch{}let s=process.env.NEXTBLOCK_VERCEL_PROJECT_ID||process.env.VERCEL_PROJECT_ID,c=process.env.NEXTBLOCK_VERCEL_WORKSPACE_ID||process.env.VERCEL_ORG_ID,l={origin:o,editUrl:`${a}/cms/products/${e.id}/edit`,data:{parentType:`product`,parentId:e.id,slug:e.slug,languageId:e.language_id,draftId:null,target:i}};return s&&(l.projectId=s),c&&(l.workspaceId=c),{"data-vercel-edit-info":JSON.stringify(l),"data-vercel-edit-target":JSON.stringify(i),"data-nextblock-visual-edit":`product:${t}`}}var S=({visualEditingEnabled:e=!1,descriptionNode:S,reviewsNode:C,canPurchase:w=!0,purchaseFallbackNode:T})=>{let E=f.useProduct(),{t:D,lang:O}=(0,_.useTranslations)(),k=i.usePriceFormatter(),{activeCurrencyCode:A,currencies:j}=r.useCurrency(),M=e?x(E,`title`,`plain-text`,`Product title`):void 0,ee=e?x(E,`short_description`,`plain-text`,`Short description`):void 0,te=e?x(E,`description_json`,`tiptap`,`Product description`):void 0,N=(e,t,n)=>{let r=D(e,n);return r===e?t:r},P=E.images&&E.images.length>0?E.images:E.image_url?[{url:E.image_url,alt:E.title}]:[],F=E.custom_props?.provider===`freemius`||t.isDigitalProduct(E),I=a.getTrialSummary(E,D),L=!F&&!!(E.has_variants&&E.attributes?.length&&E.variants?.length),R=E.attributes||[],z=E.variants||[],[B,V]=(0,h.useState)(()=>o.chooseInitialVariantSelections(R,z)),[H,U]=(0,h.useState)(1);(0,h.useEffect)(()=>{U(1)},[E.id]),(0,h.useEffect)(()=>{L&&V(o.chooseInitialVariantSelections(R,z))},[R,L,E.id,z]);let W=(0,h.useMemo)(()=>L?o.normalizeSelectionsToAvailableVariants(R,z,B):B,[R,L,B,z]);(0,h.useEffect)(()=>{JSON.stringify(W)!==JSON.stringify(B)&&V(W)},[W,B]);let G=(0,h.useMemo)(()=>L?o.findMatchingVariant(z,W):null,[L,W,z]),K=n.resolveEffectivePriceForCurrency({prices:E.prices,salePrices:E.sale_prices,fallbackPrice:E.price,fallbackSalePrice:E.sale_price,saleStartAt:E.sale_start_at,saleEndAt:E.sale_end_at,scheduledPrice:E.scheduled_price,scheduledPrices:E.scheduled_prices,scheduledPriceAt:E.scheduled_price_at,currencyCode:A,currencies:j}),q=L&&G?n.resolveEffectivePriceForCurrency({prices:G.prices,salePrices:G.sale_prices,fallbackPrice:G.price,fallbackSalePrice:G.sale_price,saleStartAt:G.sale_start_at,saleEndAt:G.sale_end_at,scheduledPrice:G.scheduled_price,scheduledPrices:G.scheduled_prices,scheduledPriceAt:G.scheduled_price_at,currencyCode:A,currencies:j}):null,J=q?.price??K.price,Y=q?.sale_price??K.sale_price,X=L?G?.stock_quantity??0:E.stock??null,Z=X===null||X>0,Q=X===null?H:Math.max(1,Math.min(H,Math.max(X,1))),ne=(0,h.useMemo)(()=>G?.image_url?[{url:G.image_url,alt:`${E.title} ${G.label}`},...P.filter(e=>e.url!==G.image_url)]:P,[P,E.title,G]),re=typeof Y==`number`&&J>0?Math.round((J-Y)/J*100):0,ie=L&&G?{...E,sku:G.sku,price:G.price,prices:G.prices,sale_price:typeof G.sale_price==`number`?G.sale_price:null,sale_prices:G.sale_prices,sale_start_at:G.sale_start_at,sale_end_at:G.sale_end_at,scheduled_price:G.scheduled_price,scheduled_prices:G.scheduled_prices,scheduled_price_at:G.scheduled_price_at,image_url:G.image_url||E.image_url,stock:G.stock_quantity,variant_id:G.id,variant_label:G.label,selected_options:G.selected_options,currency_code:A}:{...E,currency_code:A},ae=(e,t)=>{V(n=>o.applyVariantSelection(R,z,n,e,t))},oe=X===null?N(`ecommerce.in_stock_untracked`,`In stock`):N(`ecommerce.in_stock`,`${X} in stock`,{count:String(X)}),$=N(`ecommerce.out_of_stock`,`Out of stock`),se=N(`ecommerce.select_options`,`Select Options`),ce=N(`ecommerce.variant_selection_required`,`Select one term from every dropdown to resolve a variation.`);return(0,v.jsxs)(`div`,{className:`w-full animate-in fade-in slide-in-from-bottom-4 duration-700 ease-out`,children:[(0,v.jsx)(`div`,{className:`container mx-auto px-4 md:px-6 py-12`,children:(0,v.jsxs)(`div`,{className:`grid gap-12 lg:grid-cols-[2fr_3fr] items-start`,children:[(0,v.jsx)(`div`,{className:`w-full max-w-2xl mx-auto lg:max-w-none`,children:(0,v.jsx)(c.ProductGallery,{images:ne,className:`w-full`})}),(0,v.jsxs)(`div`,{className:`flex flex-col gap-4 pb-2 max-w-xl mx-auto lg:mx-0 lg:max-w-none`,children:[(0,v.jsx)(`div`,{className:`space-y-6`,children:(0,v.jsxs)(`div`,{className:`space-y-4`,children:[(0,v.jsx)(`h1`,{className:`text-3xl sm:text-4xl lg:text-5xl font-extrabold tracking-tight text-foreground leading-[1.1] lg:mt-0`,...M,children:E.title}),(0,v.jsx)(`div`,{className:`flex items-center gap-2 mt-2`,children:(0,v.jsxs)(`a`,{href:`#reviews-section`,className:`flex items-center gap-1.5 group hover:opacity-85 transition-opacity`,children:[(0,v.jsx)(`div`,{className:`flex items-center text-amber-500`,children:Array.from({length:5}).map((e,t)=>(0,v.jsx)(`svg`,{className:(0,_.cn)(`h-4 w-4 fill-current`,t<Math.round(E.average_rating||0)?`text-amber-500`:`text-slate-300 dark:text-slate-700`),viewBox:`0 0 20 20`,fill:`currentColor`,children:(0,v.jsx)(`path`,{d:`M9.049 2.927c.3-.921 1.603-.921 1.902 0l1.07 3.292a1 1 0 00.95.69h3.462c.969 0 1.371 1.24.588 1.81l-2.8 2.034a1 1 0 00-.364 1.118l1.07 3.292c.3.921-.755 1.688-1.54 1.118l-2.8-2.034a1 1 0 00-1.175 0l-2.8 2.034c-.784.57-1.838-.197-1.539-1.118l1.07-3.292a1 1 0 00-.364-1.118L2.98 8.72c-.783-.57-.38-1.81.588-1.81h3.461a1 1 0 00.951-.69l1.07-3.292z`})},t))}),E.total_reviews&&E.total_reviews>0?(0,v.jsxs)(v.Fragment,{children:[(0,v.jsx)(`span`,{className:`text-sm font-semibold text-slate-700 dark:text-slate-300`,children:E.average_rating?.toFixed(1)}),(0,v.jsxs)(`span`,{className:`text-sm text-muted-foreground underline decoration-dotted group-hover:text-primary`,children:[`(`,E.total_reviews===1?D(`reviews.review_count_one`,{count:E.total_reviews}):D(`reviews.review_count_other`,{count:E.total_reviews}),`)`]})]}):(0,v.jsx)(`span`,{className:`text-xs text-muted-foreground group-hover:text-primary underline decoration-dotted`,children:D(`reviews.be_the_first`)})]})}),E.categories&&E.categories.length>0&&(0,v.jsx)(`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:E.categories.map((e,t)=>{let n=o.resolveTranslatedText(e.name,e.name_translations,O);return(0,v.jsxs)(h.default.Fragment,{children:[t>0&&(0,v.jsx)(`span`,{className:`text-muted-foreground/30`,children:`•`}),(0,v.jsx)(`span`,{children:n})]},e.id)})}),(0,v.jsx)(`div`,{className:`prose prose-neutral dark:prose-invert max-w-none text-muted-foreground leading-relaxed text-left`,...ee,children:E.short_description?(0,v.jsx)(u.ShortDescription,{value:E.short_description,className:`text-lg mb-4 leading-relaxed`}):e?(0,v.jsx)(`p`,{className:`text-lg mb-4 italic text-muted-foreground`,children:`Add a short product description.`}):null}),(0,v.jsxs)(`div`,{className:`flex items-center gap-3`,children:[typeof Y==`number`&&(0,v.jsx)(p.Badge,{variant:`destructive`,className:`px-2.5 py-1 text-xs font-bold uppercase tracking-wide animate-pulse shadow-sm`,children:D(`ecommerce.sale_badge`,{percent:String(re)})}),!F&&X!==null&&X>0&&X<10&&(0,v.jsx)(p.Badge,{variant:`outline`,className:`text-amber-600 border-amber-200 bg-amber-50`,children:D(`ecommerce.low_stock`,{count:String(X)})}),I&&(0,v.jsx)(p.Badge,{variant:`secondary`,className:`border border-emerald-200 bg-emerald-50 text-emerald-800`,children:I.label})]})]})}),(0,v.jsxs)(`div`,{className:`p-5 rounded-2xl bg-card border border-border/80 shadow-md space-y-4`,children:[w?F?(0,v.jsx)(d.SubscriptionSelector,{product:E}):(0,v.jsxs)(`div`,{className:`space-y-3.5`,children:[(0,v.jsxs)(`div`,{className:`flex items-center justify-between gap-4`,children:[(0,v.jsxs)(`div`,{className:`space-y-1`,children:[(0,v.jsx)(`span`,{className:`text-[10px] font-bold text-muted-foreground uppercase tracking-widest`,children:N(`ecommerce.price`,`Price`)}),(0,v.jsxs)(`div`,{className:`flex items-baseline gap-2.5`,children:[(0,v.jsx)(`span`,{className:`text-3xl font-extrabold text-foreground`,children:k(Y??J,A)}),typeof Y==`number`&&(0,v.jsx)(`span`,{className:`text-lg text-muted-foreground line-through decoration-destructive/20 decoration-1`,children:k(J,A)})]})]}),!F&&(G||!L)&&(0,v.jsxs)(`div`,{className:`text-right space-y-1`,children:[(0,v.jsxs)(`span`,{className:`text-[10px] font-bold text-muted-foreground uppercase tracking-widest block`,children:[!L&&E.sku&&(0,v.jsxs)(`span`,{className:`mr-2 font-normal lowercase normal-case text-muted-foreground/70`,children:[N(`ecommerce.sku`,`SKU`),`: `,E.sku]}),N(`ecommerce.status`,`Status`)]}),(0,v.jsx)(`div`,{className:Z?`text-emerald-600 dark:text-emerald-400 font-semibold text-sm`:`text-destructive font-semibold text-sm`,children:Z?oe:$})]})]}),L&&(0,v.jsx)(`div`,{className:`space-y-3`,children:(0,v.jsx)(`div`,{className:`grid gap-3 sm:grid-cols-2`,children:R.map((e,t)=>{let n=o.getAvailableTermIdsForAttribute(z,e.id,{});return(0,v.jsxs)(`div`,{className:`space-y-1`,children:[(0,v.jsxs)(`div`,{className:`flex items-center justify-between`,children:[(0,v.jsx)(y.Label,{htmlFor:`attribute-${e.id}`,className:`text-[11px] font-semibold text-muted-foreground uppercase tracking-wider`,children:e.name}),t===0&&G?.sku&&(0,v.jsx)(`span`,{className:`text-[10px] text-muted-foreground font-mono`,children:G.sku})]}),(0,v.jsx)(`select`,{id:`attribute-${e.id}`,className:`flex h-9 w-full rounded-md border border-input bg-background px-3 py-1 text-sm focus-visible:outline-hidden focus-visible:ring-1 focus-visible:ring-ring`,value:W[e.id]||``,onChange:t=>ae(e.id,t.target.value),children:e.terms.map(e=>(0,v.jsx)(`option`,{value:e.id,disabled:!n.has(e.id),children:e.value},e.id))})]},e.id)})})}),L&&!G&&(0,v.jsx)(`p`,{className:`text-xs text-muted-foreground italic pt-1`,children:ce}),(0,v.jsxs)(`div`,{className:`flex items-center gap-3 pt-1`,children:[!F&&Z&&(0,v.jsxs)(`div`,{role:`group`,"aria-label":N(`ecommerce.quantity`,`Quantity`),className:`flex items-center border rounded-lg h-12 bg-background border-input select-none`,children:[(0,v.jsx)(`button`,{type:`button`,onClick:()=>U(Math.max(1,Q-1)),"aria-label":N(`ecommerce.decrease_quantity`,`Decrease quantity`),className:`px-3 h-full flex items-center justify-center rounded-l-lg text-muted-foreground hover:text-foreground active:scale-95 transition-colors text-lg font-medium focus-visible:outline-hidden focus-visible:ring-2 focus-visible:ring-ring`,disabled:Q<=1,children:(0,v.jsx)(`span`,{"aria-hidden":`true`,children:`-`})}),(0,v.jsx)(`span`,{"aria-live":`polite`,"aria-atomic":`true`,className:`w-8 text-center text-sm font-semibold tabular-nums`,children:Q}),(0,v.jsx)(`button`,{type:`button`,onClick:()=>U(X!==null&&Q>=X?Q:Q+1),"aria-label":N(`ecommerce.increase_quantity`,`Increase quantity`),className:`px-3 h-full flex items-center justify-center rounded-r-lg text-muted-foreground hover:text-foreground active:scale-95 transition-colors text-lg font-medium focus-visible:outline-hidden focus-visible:ring-2 focus-visible:ring-ring`,disabled:X!==null&&Q>=X,children:(0,v.jsx)(`span`,{"aria-hidden":`true`,children:`+`})})]}),L&&(!G||!Z)?(0,v.jsx)(m.Button,{disabled:!0,className:`flex-1 h-12 text-md font-bold shadow-md`,children:G?$:se}):(0,v.jsx)(s.AddToCartButton,{product:ie,quantity:Q,className:`flex-1 h-12 text-base font-bold shadow-md transition-shadow hover:shadow-lg active:scale-[0.98]`})]})]}):T,(0,v.jsx)(b.Separator,{className:`opacity-60 my-0.5`}),(0,v.jsxs)(`div`,{className:`grid grid-cols-2 gap-4 text-center text-[11px] font-medium text-muted-foreground pt-1`,children:[(0,v.jsx)(`div`,{className:`flex items-center justify-center gap-2`,children:F?(0,v.jsxs)(`span`,{className:`inline-flex items-center gap-1.5`,children:[(0,v.jsx)(g.Download,{className:`h-3.5 w-3.5`}),D(`ecommerce.instant_digital_delivery`)]}):(0,v.jsxs)(`span`,{className:`inline-flex items-center gap-1.5`,children:[(0,v.jsx)(g.Package,{className:`h-3.5 w-3.5`}),D(`ecommerce.free_shipping`)]})}),(0,v.jsx)(`div`,{className:`flex items-center justify-center gap-2`,children:(0,v.jsxs)(`span`,{className:`inline-flex items-center gap-1.5`,children:[(0,v.jsx)(g.ShieldCheck,{className:`h-3.5 w-3.5`}),D(`ecommerce.secure_checkout`)]})})]})]})]})]})}),(0,v.jsx)(`div`,{className:`min-w-0 w-full`,...S?void 0:te,children:S||(E.description_json?(0,v.jsx)(`div`,{className:`container mx-auto px-4 md:px-6 pb-12 prose prose-neutral dark:prose-invert max-w-none leading-relaxed`,children:(0,v.jsx)(l.SimpleTiptapRenderer,{content:E.description_json})}):(0,v.jsx)(`div`,{className:`container mx-auto px-4 md:px-6 pb-12`,children:(0,v.jsx)(`p`,{className:`italic text-sm text-muted-foreground`,children:D(`ecommerce.no_description`)})}))}),C&&(0,v.jsx)(`div`,{id:`reviews-section`,className:`border-t border-border mt-12 pt-12`,children:C})]})};exports.ProductDetailsLayout=S;
@@ -19,7 +19,7 @@ import { cn as v, useTranslations as y } from "@nextblock-cms/utils";
19
19
  import { Fragment as b, jsx as x, jsxs as S } from "react/jsx-runtime";
20
20
  import { Label as ce } from "@nextblock-cms/ui/label";
21
21
  import { Separator as le } from "@nextblock-cms/ui/separator";
22
- //#region libs/ecommerce/src/lib/components/ProductDetailsLayout.tsx
22
+ //#region src/lib/components/ProductDetailsLayout.tsx
23
23
  function C(e, t, n, r) {
24
24
  let i = {
25
25
  kind: "product-field",
@@ -0,0 +1 @@
1
+ "use client";const e=require("../invoice-ui.cjs");let t=require("react"),n=require("@nextblock-cms/utils"),r=require("react/jsx-runtime");var i=({images:i=[],className:a})=>{let{t:o}=(0,n.useTranslations)(),[s,c]=(0,t.useState)(0);if(!i.length)return(0,r.jsx)(`div`,{className:(0,n.cn)(`relative aspect-square w-full overflow-hidden rounded-lg bg-secondary`,a),children:(0,r.jsx)(`div`,{className:`flex h-full items-center justify-center text-muted-foreground`,children:e.translateOrFallback(o,`ecommerce.no_image`,`No image`)})});let l=s<i.length?s:0,u=i[l];return(0,r.jsxs)(`div`,{className:(0,n.cn)(`flex flex-col gap-4`,a),children:[(0,r.jsx)(`div`,{className:`relative aspect-square w-full overflow-hidden rounded-lg border bg-white`,children:(0,r.jsx)(`img`,{src:u.url,alt:u.alt??``,width:u.width??1e3,height:u.height??1e3,fetchPriority:`high`,decoding:`async`,className:`h-full w-full object-cover object-center`})}),i.length>1&&(0,r.jsx)(`div`,{className:`flex gap-4 overflow-x-auto p-1 pb-2`,children:i.map((t,a)=>(0,r.jsx)(`button`,{type:`button`,onClick:()=>c(a),"aria-current":l===a?`true`:void 0,"aria-label":e.translateOrFallback(o,`ecommerce.gallery_show_image`,`Show image {index} of {total}`).replace(`{index}`,String(a+1)).replace(`{total}`,String(i.length)),className:(0,n.cn)(`relative aspect-square w-20 flex-shrink-0 overflow-hidden rounded-md border focus-visible:outline-hidden focus-visible:ring-2 focus-visible:ring-ring`,l===a?`ring-2 ring-primary`:`ring-1 ring-transparent hover:ring-primary/50`),children:(0,r.jsx)(`img`,{src:t.url,alt:``,width:80,height:80,loading:`lazy`,decoding:`async`,className:`h-full w-full object-cover object-center`})},a))})]})};exports.ProductGallery=i;
@@ -3,7 +3,7 @@ import { translateOrFallback as e } from "../invoice-ui.es.js";
3
3
  import { useState as t } from "react";
4
4
  import { cn as n, useTranslations as r } from "@nextblock-cms/utils";
5
5
  import { jsx as i, jsxs as a } from "react/jsx-runtime";
6
- //#region libs/ecommerce/src/lib/components/ProductGallery.tsx
6
+ //#region src/lib/components/ProductGallery.tsx
7
7
  var o = ({ images: o = [], className: s }) => {
8
8
  let { t: c } = r(), [l, u] = t(0);
9
9
  if (!o.length) return /* @__PURE__ */ i("div", {