@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.
- package/README.md +43 -0
- package/index.cjs +1 -0
- package/lib/CurrencyProvider.cjs +1 -0
- package/lib/CurrencyProvider.es.js +1 -1
- package/lib/PaymentReadinessProvider.cjs +1 -0
- package/lib/PaymentReadinessProvider.es.js +1 -1
- package/lib/cart-store.cjs +1 -0
- package/lib/cart-store.es.js +1 -1
- package/lib/components/AccountNavigationMenu.cjs +1 -0
- package/lib/components/AccountNavigationMenu.es.js +1 -1
- package/lib/components/AddToCartButton.cjs +1 -0
- package/lib/components/AddToCartButton.es.js +1 -1
- package/lib/components/Cart.cjs +1 -0
- package/lib/components/Cart.es.js +1 -1
- package/lib/components/CartDrawer.cjs +1 -0
- package/lib/components/CartDrawer.es.js +1 -1
- package/lib/components/CartIcon.cjs +1 -0
- package/lib/components/CartIcon.es.js +1 -1
- package/lib/components/Checkout.cjs +1 -0
- package/lib/components/Checkout.es.js +1 -1
- package/lib/components/CouponForm.cjs +1 -0
- package/lib/components/CouponForm.es.js +1 -1
- package/lib/components/CurrencySwitcher.cjs +1 -0
- package/lib/components/CurrencySwitcher.es.js +1 -1
- package/lib/components/CustomerProfileForm.cjs +1 -0
- package/lib/components/CustomerProfileForm.es.js +1 -1
- package/lib/components/FeaturedProduct.cjs +1 -0
- package/lib/components/FeaturedProduct.es.js +1 -1
- package/lib/components/FreemiusLicensePanel.cjs +1 -0
- package/lib/components/FreemiusLicensePanel.es.js +1 -1
- package/lib/components/InvoiceDocument.cjs +1 -0
- package/lib/components/InvoiceDocument.es.js +1 -1
- package/lib/components/{InvoiceViewerShell.cjs.js → InvoiceViewerShell.cjs} +1 -1
- package/lib/components/InvoiceViewerShell.es.js +1 -1
- package/lib/components/ProductCard.cjs +1 -0
- package/lib/components/ProductCard.es.js +1 -1
- package/lib/components/ProductDetailsLayout.cjs +1 -0
- package/lib/components/ProductDetailsLayout.es.js +1 -1
- package/lib/components/ProductGallery.cjs +1 -0
- package/lib/components/ProductGallery.es.js +1 -1
- package/lib/components/ProductGrid.cjs +1 -0
- package/lib/components/ProductGrid.es.js +1 -1
- package/lib/components/ShippingEstimator.cjs +1 -0
- package/lib/components/ShippingEstimator.es.js +1 -1
- package/lib/components/ShortDescription.cjs +1 -0
- package/lib/components/ShortDescription.es.js +1 -1
- package/lib/components/SimpleTiptapRenderer.cjs +1 -0
- package/lib/components/SimpleTiptapRenderer.es.js +1 -1
- package/lib/components/SubscriptionSelector.cjs +1 -0
- package/lib/components/SubscriptionSelector.es.js +1 -1
- package/lib/countries.es.js +1 -1
- package/lib/coupon-server.cjs +1 -0
- package/lib/coupon-server.es.js +1 -1
- package/lib/coupons.es.js +1 -1
- package/lib/currency-constants.es.js +1 -1
- package/lib/currency-rest-client.es.js +1 -1
- package/lib/currency-store.es.js +1 -1
- package/lib/currency-sync.cjs +1 -0
- package/lib/currency-sync.es.js +1 -1
- package/lib/currency.es.js +1 -1
- package/lib/customer-addresses.cjs +1 -0
- package/lib/customer-addresses.es.js +1 -1
- package/lib/customer-orders.cjs +1 -0
- package/lib/customer-orders.es.js +1 -1
- package/lib/customer.cjs +1 -0
- package/lib/customer.es.js +1 -1
- package/lib/export-helpers.cjs +1 -0
- package/lib/export-helpers.es.js +1 -1
- package/lib/factory.cjs +1 -0
- package/lib/factory.es.js +1 -1
- package/lib/freemius-coupons.cjs +1 -0
- package/lib/freemius-coupons.es.js +1 -1
- package/lib/freemius-license-claim.cjs +1 -0
- package/lib/freemius-license-claim.es.js +1 -1
- package/lib/freemius-license.cjs +1 -0
- package/lib/freemius-license.es.js +1 -1
- package/lib/freemius-order-sync.cjs +1 -0
- package/lib/freemius-order-sync.es.js +1 -1
- package/lib/freemius-trial-provision.cjs +1 -0
- package/lib/freemius-trial-provision.es.js +1 -1
- package/lib/inventory-settings.es.js +1 -1
- package/lib/{invoice-server.cjs.js → invoice-server.cjs} +1 -1
- package/lib/invoice-server.es.js +1 -1
- package/lib/invoice-ui.es.js +1 -1
- package/lib/invoice.es.js +1 -1
- package/lib/{order-inventory.cjs.js → order-inventory.cjs} +1 -1
- package/lib/order-inventory.es.js +1 -1
- package/lib/order-tax-details.es.js +1 -1
- package/lib/pages/cms/coupons/CouponEditorForm.cjs +1 -0
- package/lib/pages/cms/coupons/CouponEditorForm.es.js +1 -1
- package/lib/pages/cms/coupons/{CouponsPage.cjs.js → CouponsPage.cjs} +1 -1
- package/lib/pages/cms/coupons/CouponsPage.es.js +1 -1
- package/lib/pages/cms/coupons/CreateCouponDialog.cjs +1 -0
- package/lib/pages/cms/coupons/CreateCouponDialog.es.js +1 -1
- package/lib/pages/cms/coupons/EditCouponPage.cjs +1 -0
- package/lib/pages/cms/coupons/EditCouponPage.es.js +1 -1
- package/lib/pages/cms/coupons/ProductScopePicker.es.js +1 -1
- package/lib/pages/cms/coupons/actions.cjs +1 -0
- package/lib/pages/cms/coupons/actions.es.js +1 -1
- package/lib/pages/cms/coupons/index.cjs +1 -0
- package/lib/pages/cms/coupons/product-options.es.js +1 -1
- package/lib/pages/cms/orders/ExportReportsDialog.cjs +1 -0
- package/lib/pages/cms/orders/ExportReportsDialog.es.js +1 -1
- package/lib/pages/cms/orders/OrderDetailPage.cjs +1 -0
- package/lib/pages/cms/orders/OrderDetailPage.es.js +1 -1
- package/lib/pages/cms/orders/OrderPrintButton.es.js +1 -1
- package/lib/pages/cms/orders/OrderStatusForm.cjs +1 -0
- package/lib/pages/cms/orders/OrderStatusForm.es.js +1 -1
- package/lib/pages/cms/orders/OrdersPage.cjs +1 -0
- package/lib/pages/cms/orders/OrdersPage.es.js +1 -1
- package/lib/pages/cms/orders/actions.es.js +1 -1
- package/lib/pages/cms/orders/export-actions.es.js +1 -1
- package/lib/pages/cms/orders/index.cjs +1 -0
- package/lib/pages/cms/orders/server-actions.cjs +1 -0
- package/lib/pages/cms/orders/server-actions.es.js +1 -1
- package/lib/pages/cms/payments/PaymentsClient.es.js +1 -1
- package/lib/pages/cms/payments/PaymentsPage.cjs +1 -0
- package/lib/pages/cms/payments/PaymentsPage.es.js +1 -1
- package/lib/pages/cms/payments/actions.cjs +1 -0
- package/lib/pages/cms/payments/actions.es.js +1 -1
- package/lib/pages/cms/payments/index.cjs +1 -0
- package/lib/pages/cms/payments/queries.cjs +1 -0
- package/lib/pages/cms/payments/queries.es.js +1 -1
- package/lib/pages/cms/products/ProductsPage.cjs +1 -0
- package/lib/pages/cms/products/ProductsPage.es.js +1 -1
- package/lib/pages/cms/products/[id]/edit/EditProductPage.cjs +1 -0
- package/lib/pages/cms/products/{_id_ → [id]}/edit/EditProductPage.es.js +1 -1
- package/lib/pages/cms/products/{actions.cjs.js → actions.cjs} +1 -1
- package/lib/pages/cms/products/actions.es.js +1 -1
- package/lib/pages/cms/products/attributes/AttributeManagementPage.cjs +1 -0
- package/lib/pages/cms/products/attributes/AttributeManagementPage.es.js +1 -1
- package/lib/pages/cms/products/attributes/components/AttributeManager.es.js +1 -1
- package/lib/pages/cms/products/categories/CategoryManagementPage.cjs +1 -0
- package/lib/pages/cms/products/categories/CategoryManagementPage.es.js +1 -1
- package/lib/pages/cms/products/categories/components/CategoryManager.cjs +1 -0
- package/lib/pages/cms/products/categories/components/CategoryManager.es.js +1 -1
- package/lib/pages/cms/products/components/CopyProductFromLanguage.cjs +1 -0
- package/lib/pages/cms/products/components/CopyProductFromLanguage.es.js +1 -1
- package/lib/pages/cms/products/components/CurrencyPriceFields.cjs +1 -0
- package/lib/pages/cms/products/components/CurrencyPriceFields.es.js +1 -1
- package/lib/pages/cms/products/components/DeleteProductButton.es.js +1 -1
- package/lib/pages/cms/products/components/FreemiusPricingDashboard.cjs +1 -0
- package/lib/pages/cms/products/components/FreemiusPricingDashboard.es.js +1 -1
- package/lib/pages/cms/products/components/ProductCategorySelector.cjs +1 -0
- package/lib/pages/cms/products/components/ProductCategorySelector.es.js +1 -1
- package/lib/pages/cms/products/components/ProductForm.cjs +1 -0
- package/lib/pages/cms/products/components/ProductForm.es.js +1 -1
- package/lib/pages/cms/products/components/ProductMediaManager.cjs +1 -0
- package/lib/pages/cms/products/components/ProductMediaManager.es.js +1 -1
- package/lib/pages/cms/products/components/ProductsBulkTable.cjs +1 -0
- package/lib/pages/cms/products/components/ProductsBulkTable.es.js +1 -1
- package/lib/pages/cms/products/components/SaleScheduleFields.es.js +1 -1
- package/lib/pages/cms/products/components/SyncFreemiusButton.cjs +1 -0
- package/lib/pages/cms/products/components/SyncFreemiusButton.es.js +1 -1
- package/lib/pages/cms/products/components/{SyncFreemiusPricingButton.cjs.js → SyncFreemiusPricingButton.cjs} +1 -1
- package/lib/pages/cms/products/components/SyncFreemiusPricingButton.es.js +1 -1
- package/lib/pages/cms/products/components/VariationsEditor.cjs +1 -0
- package/lib/pages/cms/products/components/VariationsEditor.es.js +1 -1
- package/lib/pages/cms/products/index.cjs +1 -0
- package/lib/pages/cms/products/index.es.js +1 -1
- package/lib/pages/cms/products/inventory/InventoryPage.cjs +1 -0
- package/lib/pages/cms/products/inventory/InventoryPage.es.js +1 -1
- package/lib/pages/cms/products/inventory/{InventoryTableClient.cjs.js → InventoryTableClient.cjs} +1 -1
- package/lib/pages/cms/products/inventory/InventoryTableClient.es.js +1 -1
- package/lib/pages/cms/products/inventory/{actions.cjs.js → actions.cjs} +1 -1
- package/lib/pages/cms/products/inventory/actions.es.js +1 -1
- package/lib/pages/cms/products/new/NewProductPage.cjs +1 -0
- package/lib/pages/cms/products/new/NewProductPage.es.js +1 -1
- package/lib/pages/cms/products/product-price-sync.cjs +1 -0
- package/lib/pages/cms/products/product-price-sync.es.js +1 -1
- package/lib/pages/cms/products/server-actions.cjs +1 -0
- package/lib/pages/cms/products/server-actions.es.js +1 -1
- package/lib/pages/cms/shipping/{ShippingPage.cjs.js → ShippingPage.cjs} +1 -1
- package/lib/pages/cms/shipping/ShippingPage.es.js +1 -1
- package/lib/pages/cms/shipping/components/RateForm.cjs +1 -0
- package/lib/pages/cms/shipping/components/RateForm.es.js +1 -1
- package/lib/pages/cms/shipping/components/ZoneForm.cjs +1 -0
- package/lib/pages/cms/shipping/components/ZoneForm.es.js +1 -1
- package/lib/pages/cms/shipping/index.cjs +1 -0
- package/lib/pages/cms/shipping/server-actions.cjs +1 -0
- package/lib/pages/cms/shipping/server-actions.es.js +1 -1
- package/lib/pages/cms/taxes/TaxesPage.cjs +1 -0
- package/lib/pages/cms/taxes/TaxesPage.es.js +1 -1
- package/lib/pages/cms/taxes/actions.cjs +1 -0
- package/lib/pages/cms/taxes/actions.es.js +1 -1
- package/lib/pages/cms/taxes/components/TaxRateForm.cjs +1 -0
- package/lib/pages/cms/taxes/components/TaxRateForm.es.js +1 -1
- package/lib/pages/cms/taxes/index.cjs +1 -0
- package/lib/payment-config.es.js +1 -1
- package/lib/{product-actions.cjs.js → product-actions.cjs} +1 -1
- package/lib/product-actions.es.js +1 -1
- package/lib/product-context.cjs +1 -0
- package/lib/product-context.es.js +1 -1
- package/lib/product-schema.cjs +1 -0
- package/lib/product-schema.es.js +1 -1
- package/lib/providers/freemius.cjs +1 -0
- package/lib/providers/freemius.es.js +1 -1
- package/lib/providers/stripe.cjs +1 -0
- package/lib/providers/stripe.es.js +1 -1
- package/lib/server-actions/coupon-actions.cjs +1 -0
- package/lib/server-actions/coupon-actions.es.js +1 -1
- package/lib/server-actions/customer-actions.cjs +1 -0
- package/lib/server-actions/customer-actions.es.js +1 -1
- package/lib/server-actions/product-actions.cjs +1 -0
- package/lib/server-actions/product-actions.es.js +1 -1
- package/lib/server-actions/shipping-actions.cjs +1 -0
- package/lib/server-actions/shipping-actions.es.js +1 -1
- package/lib/server-actions/tax-actions.cjs +1 -0
- package/lib/server-actions/tax-actions.es.js +1 -1
- package/lib/shared-inventory.es.js +1 -1
- package/lib/shipping/{resolver.cjs.js → resolver.cjs} +1 -1
- package/lib/shipping/resolver.es.js +1 -1
- package/lib/shipping-rate-currency.cjs +1 -0
- package/lib/shipping-rate-currency.es.js +1 -1
- package/lib/states.cjs +1 -0
- package/lib/stripe/checkout.cjs +1 -0
- package/lib/stripe/checkout.es.js +1 -1
- package/lib/stripe/client.cjs +1 -0
- package/lib/stripe/client.es.js +1 -1
- package/lib/stripe/order-sync.cjs +1 -0
- package/lib/stripe/order-sync.es.js +1 -1
- package/lib/stripe/webhooks.cjs +1 -0
- package/lib/stripe/webhooks.es.js +1 -1
- package/lib/tax-calculation.cjs +1 -0
- package/lib/tax-calculation.es.js +1 -1
- package/lib/trials.es.js +1 -1
- package/lib/types.es.js +1 -1
- package/lib/use-cart.cjs +1 -0
- package/lib/use-cart.es.js +1 -1
- package/lib/use-price-formatter.es.js +1 -1
- package/lib/variation-utils.cjs +1 -0
- package/lib/variation-utils.es.js +1 -1
- package/lib/zod-config.es.js +1 -1
- package/package.json +10 -9
- package/server.cjs +1 -0
- package/server.es.js +1 -1
- package/index.cjs.js +0 -1
- package/lib/CurrencyProvider.cjs.js +0 -1
- package/lib/PaymentReadinessProvider.cjs.js +0 -1
- package/lib/cart-store.cjs.js +0 -1
- package/lib/components/AccountNavigationMenu.cjs.js +0 -1
- package/lib/components/AddToCartButton.cjs.js +0 -1
- package/lib/components/Cart.cjs.js +0 -1
- package/lib/components/CartDrawer.cjs.js +0 -1
- package/lib/components/CartIcon.cjs.js +0 -1
- package/lib/components/Checkout.cjs.js +0 -1
- package/lib/components/CouponForm.cjs.js +0 -1
- package/lib/components/CurrencySwitcher.cjs.js +0 -1
- package/lib/components/CustomerProfileForm.cjs.js +0 -1
- package/lib/components/FeaturedProduct.cjs.js +0 -1
- package/lib/components/FreemiusLicensePanel.cjs.js +0 -1
- package/lib/components/InvoiceDocument.cjs.js +0 -1
- package/lib/components/ProductCard.cjs.js +0 -1
- package/lib/components/ProductDetailsLayout.cjs.js +0 -1
- package/lib/components/ProductGallery.cjs.js +0 -1
- package/lib/components/ProductGrid.cjs.js +0 -1
- package/lib/components/ShippingEstimator.cjs.js +0 -1
- package/lib/components/ShortDescription.cjs.js +0 -1
- package/lib/components/SimpleTiptapRenderer.cjs.js +0 -1
- package/lib/components/SubscriptionSelector.cjs.js +0 -1
- package/lib/coupon-server.cjs.js +0 -1
- package/lib/currency-sync.cjs.js +0 -1
- package/lib/customer-addresses.cjs.js +0 -1
- package/lib/customer-orders.cjs.js +0 -1
- package/lib/customer.cjs.js +0 -1
- package/lib/export-helpers.cjs.js +0 -1
- package/lib/factory.cjs.js +0 -1
- package/lib/freemius-coupons.cjs.js +0 -1
- package/lib/freemius-license-claim.cjs.js +0 -1
- package/lib/freemius-license.cjs.js +0 -1
- package/lib/freemius-order-sync.cjs.js +0 -1
- package/lib/freemius-trial-provision.cjs.js +0 -1
- package/lib/pages/cms/coupons/CouponEditorForm.cjs.js +0 -1
- package/lib/pages/cms/coupons/CreateCouponDialog.cjs.js +0 -1
- package/lib/pages/cms/coupons/EditCouponPage.cjs.js +0 -1
- package/lib/pages/cms/coupons/actions.cjs.js +0 -1
- package/lib/pages/cms/coupons/index.cjs.js +0 -1
- package/lib/pages/cms/orders/ExportReportsDialog.cjs.js +0 -1
- package/lib/pages/cms/orders/OrderDetailPage.cjs.js +0 -1
- package/lib/pages/cms/orders/OrderStatusForm.cjs.js +0 -1
- package/lib/pages/cms/orders/OrdersPage.cjs.js +0 -1
- package/lib/pages/cms/orders/index.cjs.js +0 -1
- package/lib/pages/cms/orders/server-actions.cjs.js +0 -1
- package/lib/pages/cms/payments/PaymentsPage.cjs.js +0 -1
- package/lib/pages/cms/payments/actions.cjs.js +0 -1
- package/lib/pages/cms/payments/index.cjs.js +0 -1
- package/lib/pages/cms/payments/queries.cjs.js +0 -1
- package/lib/pages/cms/products/ProductsPage.cjs.js +0 -1
- package/lib/pages/cms/products/_id_/edit/EditProductPage.cjs.js +0 -1
- package/lib/pages/cms/products/attributes/AttributeManagementPage.cjs.js +0 -1
- package/lib/pages/cms/products/categories/CategoryManagementPage.cjs.js +0 -1
- package/lib/pages/cms/products/categories/components/CategoryManager.cjs.js +0 -1
- package/lib/pages/cms/products/components/CopyProductFromLanguage.cjs.js +0 -1
- package/lib/pages/cms/products/components/CurrencyPriceFields.cjs.js +0 -1
- package/lib/pages/cms/products/components/FreemiusPricingDashboard.cjs.js +0 -1
- package/lib/pages/cms/products/components/ProductCategorySelector.cjs.js +0 -1
- package/lib/pages/cms/products/components/ProductForm.cjs.js +0 -1
- package/lib/pages/cms/products/components/ProductMediaManager.cjs.js +0 -1
- package/lib/pages/cms/products/components/ProductsBulkTable.cjs.js +0 -1
- package/lib/pages/cms/products/components/SyncFreemiusButton.cjs.js +0 -1
- package/lib/pages/cms/products/components/VariationsEditor.cjs.js +0 -1
- package/lib/pages/cms/products/index.cjs.js +0 -1
- package/lib/pages/cms/products/inventory/InventoryPage.cjs.js +0 -1
- package/lib/pages/cms/products/new/NewProductPage.cjs.js +0 -1
- package/lib/pages/cms/products/product-price-sync.cjs.js +0 -1
- package/lib/pages/cms/products/server-actions.cjs.js +0 -1
- package/lib/pages/cms/shipping/components/RateForm.cjs.js +0 -1
- package/lib/pages/cms/shipping/components/ZoneForm.cjs.js +0 -1
- package/lib/pages/cms/shipping/index.cjs.js +0 -1
- package/lib/pages/cms/shipping/server-actions.cjs.js +0 -1
- package/lib/pages/cms/taxes/TaxesPage.cjs.js +0 -1
- package/lib/pages/cms/taxes/actions.cjs.js +0 -1
- package/lib/pages/cms/taxes/components/TaxRateForm.cjs.js +0 -1
- package/lib/pages/cms/taxes/index.cjs.js +0 -1
- package/lib/product-context.cjs.js +0 -1
- package/lib/product-schema.cjs.js +0 -1
- package/lib/providers/freemius.cjs.js +0 -1
- package/lib/providers/stripe.cjs.js +0 -1
- package/lib/server-actions/coupon-actions.cjs.js +0 -1
- package/lib/server-actions/customer-actions.cjs.js +0 -1
- package/lib/server-actions/product-actions.cjs.js +0 -1
- package/lib/server-actions/shipping-actions.cjs.js +0 -1
- package/lib/server-actions/tax-actions.cjs.js +0 -1
- package/lib/shipping-rate-currency.cjs.js +0 -1
- package/lib/states.cjs.js +0 -1
- package/lib/stripe/checkout.cjs.js +0 -1
- package/lib/stripe/client.cjs.js +0 -1
- package/lib/stripe/order-sync.cjs.js +0 -1
- package/lib/stripe/webhooks.cjs.js +0 -1
- package/lib/tax-calculation.cjs.js +0 -1
- package/lib/use-cart.cjs.js +0 -1
- package/lib/variation-utils.cjs.js +0 -1
- package/server.cjs.js +0 -1
- /package/_virtual/_rolldown/{runtime.cjs.js → runtime.cjs} +0 -0
- /package/lib/{countries.cjs.js → countries.cjs} +0 -0
- /package/lib/{coupons.cjs.js → coupons.cjs} +0 -0
- /package/lib/{currency-constants.cjs.js → currency-constants.cjs} +0 -0
- /package/lib/{currency-rest-client.cjs.js → currency-rest-client.cjs} +0 -0
- /package/lib/{currency-store.cjs.js → currency-store.cjs} +0 -0
- /package/lib/{currency.cjs.js → currency.cjs} +0 -0
- /package/lib/{inventory-settings.cjs.js → inventory-settings.cjs} +0 -0
- /package/lib/{invoice-ui.cjs.js → invoice-ui.cjs} +0 -0
- /package/lib/{invoice.cjs.js → invoice.cjs} +0 -0
- /package/lib/{order-tax-details.cjs.js → order-tax-details.cjs} +0 -0
- /package/lib/pages/cms/coupons/{ProductScopePicker.cjs.js → ProductScopePicker.cjs} +0 -0
- /package/lib/pages/cms/coupons/{product-options.cjs.js → product-options.cjs} +0 -0
- /package/lib/pages/cms/orders/{OrderPrintButton.cjs.js → OrderPrintButton.cjs} +0 -0
- /package/lib/pages/cms/orders/{actions.cjs.js → actions.cjs} +0 -0
- /package/lib/pages/cms/orders/{export-actions.cjs.js → export-actions.cjs} +0 -0
- /package/lib/pages/cms/payments/{PaymentsClient.cjs.js → PaymentsClient.cjs} +0 -0
- /package/lib/pages/cms/products/attributes/components/{AttributeManager.cjs.js → AttributeManager.cjs} +0 -0
- /package/lib/pages/cms/products/components/{DeleteProductButton.cjs.js → DeleteProductButton.cjs} +0 -0
- /package/lib/pages/cms/products/components/{SaleScheduleFields.cjs.js → SaleScheduleFields.cjs} +0 -0
- /package/lib/{payment-config.cjs.js → payment-config.cjs} +0 -0
- /package/lib/{shared-inventory.cjs.js → shared-inventory.cjs} +0 -0
- /package/lib/{trials.cjs.js → trials.cjs} +0 -0
- /package/lib/{types.cjs.js → types.cjs} +0 -0
- /package/lib/{use-price-formatter.cjs.js → use-price-formatter.cjs} +0 -0
- /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
|
|
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
|
|
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;
|
package/lib/cart-store.es.js
CHANGED
|
@@ -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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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", {
|