@rovela-ai/sdk 0.1.2 → 0.1.4
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/dist/admin/api/auth.d.ts +32 -0
- package/dist/admin/api/auth.d.ts.map +1 -0
- package/dist/admin/api/auth.js +43 -0
- package/dist/admin/api/auth.js.map +1 -0
- package/dist/admin/api/categories.d.ts +68 -0
- package/dist/admin/api/categories.d.ts.map +1 -0
- package/dist/admin/api/categories.js +247 -0
- package/dist/admin/api/categories.js.map +1 -0
- package/dist/admin/api/customers.d.ts +41 -0
- package/dist/admin/api/customers.d.ts.map +1 -0
- package/dist/admin/api/customers.js +113 -0
- package/dist/admin/api/customers.js.map +1 -0
- package/dist/admin/api/index.d.ts +56 -0
- package/dist/admin/api/index.d.ts.map +1 -0
- package/dist/admin/api/index.js +87 -0
- package/dist/admin/api/index.js.map +1 -0
- package/dist/admin/api/orders.d.ts +59 -0
- package/dist/admin/api/orders.d.ts.map +1 -0
- package/dist/admin/api/orders.js +209 -0
- package/dist/admin/api/orders.js.map +1 -0
- package/dist/admin/api/products.d.ts +103 -0
- package/dist/admin/api/products.d.ts.map +1 -0
- package/dist/admin/api/products.js +329 -0
- package/dist/admin/api/products.js.map +1 -0
- package/dist/admin/api/refund.d.ts +29 -0
- package/dist/admin/api/refund.d.ts.map +1 -0
- package/dist/admin/api/refund.js +136 -0
- package/dist/admin/api/refund.js.map +1 -0
- package/dist/admin/api/stats.d.ts +40 -0
- package/dist/admin/api/stats.d.ts.map +1 -0
- package/dist/admin/api/stats.js +74 -0
- package/dist/admin/api/stats.js.map +1 -0
- package/dist/admin/components/AdminGuard.d.ts +40 -0
- package/dist/admin/components/AdminGuard.d.ts.map +1 -0
- package/dist/admin/components/AdminGuard.js +97 -0
- package/dist/admin/components/AdminGuard.js.map +1 -0
- package/dist/admin/components/AdminHeader.d.ts +18 -0
- package/dist/admin/components/AdminHeader.d.ts.map +1 -0
- package/dist/admin/components/AdminHeader.js +33 -0
- package/dist/admin/components/AdminHeader.js.map +1 -0
- package/dist/admin/components/AdminLayout.d.ts +50 -0
- package/dist/admin/components/AdminLayout.d.ts.map +1 -0
- package/dist/admin/components/AdminLayout.js +46 -0
- package/dist/admin/components/AdminLayout.js.map +1 -0
- package/dist/admin/components/AdminLoginForm.d.ts +18 -0
- package/dist/admin/components/AdminLoginForm.d.ts.map +1 -0
- package/dist/admin/components/AdminLoginForm.js +58 -0
- package/dist/admin/components/AdminLoginForm.js.map +1 -0
- package/dist/admin/components/AdminNav.d.ts +34 -0
- package/dist/admin/components/AdminNav.d.ts.map +1 -0
- package/dist/admin/components/AdminNav.js +61 -0
- package/dist/admin/components/AdminNav.js.map +1 -0
- package/dist/admin/components/InventoryEditor.d.ts +15 -0
- package/dist/admin/components/InventoryEditor.d.ts.map +1 -0
- package/dist/admin/components/InventoryEditor.js +83 -0
- package/dist/admin/components/InventoryEditor.js.map +1 -0
- package/dist/admin/components/LowStockAlert.d.ts +11 -0
- package/dist/admin/components/LowStockAlert.d.ts.map +1 -0
- package/dist/admin/components/LowStockAlert.js +35 -0
- package/dist/admin/components/LowStockAlert.js.map +1 -0
- package/dist/admin/components/OrderDetails.d.ts +14 -0
- package/dist/admin/components/OrderDetails.d.ts.map +1 -0
- package/dist/admin/components/OrderDetails.js +94 -0
- package/dist/admin/components/OrderDetails.js.map +1 -0
- package/dist/admin/components/OrderTable.d.ts +13 -0
- package/dist/admin/components/OrderTable.d.ts.map +1 -0
- package/dist/admin/components/OrderTable.js +89 -0
- package/dist/admin/components/OrderTable.js.map +1 -0
- package/dist/admin/components/ProductForm.d.ts +18 -0
- package/dist/admin/components/ProductForm.d.ts.map +1 -0
- package/dist/admin/components/ProductForm.js +127 -0
- package/dist/admin/components/ProductForm.js.map +1 -0
- package/dist/admin/components/ProductTable.d.ts +13 -0
- package/dist/admin/components/ProductTable.d.ts.map +1 -0
- package/dist/admin/components/ProductTable.js +81 -0
- package/dist/admin/components/ProductTable.js.map +1 -0
- package/dist/admin/components/RecentOrders.d.ts +11 -0
- package/dist/admin/components/RecentOrders.d.ts.map +1 -0
- package/dist/admin/components/RecentOrders.js +58 -0
- package/dist/admin/components/RecentOrders.js.map +1 -0
- package/dist/admin/components/RefundDialog.d.ts +17 -0
- package/dist/admin/components/RefundDialog.d.ts.map +1 -0
- package/dist/admin/components/RefundDialog.js +86 -0
- package/dist/admin/components/RefundDialog.js.map +1 -0
- package/dist/admin/components/StatsCards.d.ts +23 -0
- package/dist/admin/components/StatsCards.d.ts.map +1 -0
- package/dist/admin/components/StatsCards.js +82 -0
- package/dist/admin/components/StatsCards.js.map +1 -0
- package/dist/admin/components/StoreSettings.d.ts +14 -0
- package/dist/admin/components/StoreSettings.d.ts.map +1 -0
- package/dist/admin/components/StoreSettings.js +88 -0
- package/dist/admin/components/StoreSettings.js.map +1 -0
- package/dist/admin/components/index.d.ts +21 -0
- package/dist/admin/components/index.d.ts.map +1 -0
- package/dist/admin/components/index.js +57 -0
- package/dist/admin/components/index.js.map +1 -0
- package/dist/admin/config.d.ts +74 -0
- package/dist/admin/config.d.ts.map +1 -0
- package/dist/admin/config.js +229 -0
- package/dist/admin/config.js.map +1 -0
- package/dist/admin/hooks/index.d.ts +10 -0
- package/dist/admin/hooks/index.d.ts.map +1 -0
- package/dist/admin/hooks/index.js +17 -0
- package/dist/admin/hooks/index.js.map +1 -0
- package/dist/admin/hooks/useAdminOrders.d.ts +41 -0
- package/dist/admin/hooks/useAdminOrders.d.ts.map +1 -0
- package/dist/admin/hooks/useAdminOrders.js +191 -0
- package/dist/admin/hooks/useAdminOrders.js.map +1 -0
- package/dist/admin/hooks/useAdminProducts.d.ts +39 -0
- package/dist/admin/hooks/useAdminProducts.d.ts.map +1 -0
- package/dist/admin/hooks/useAdminProducts.js +235 -0
- package/dist/admin/hooks/useAdminProducts.js.map +1 -0
- package/dist/admin/hooks/useAdminStats.d.ts +50 -0
- package/dist/admin/hooks/useAdminStats.d.ts.map +1 -0
- package/dist/admin/hooks/useAdminStats.js +111 -0
- package/dist/admin/hooks/useAdminStats.js.map +1 -0
- package/dist/admin/index.d.ts +63 -0
- package/dist/admin/index.d.ts.map +1 -0
- package/dist/admin/index.js +148 -0
- package/dist/admin/index.js.map +1 -0
- package/dist/admin/server/admin-service.d.ts +130 -0
- package/dist/admin/server/admin-service.d.ts.map +1 -0
- package/dist/admin/server/admin-service.js +298 -0
- package/dist/admin/server/admin-service.js.map +1 -0
- package/dist/admin/server/index.d.ts +8 -0
- package/dist/admin/server/index.d.ts.map +1 -0
- package/dist/admin/server/index.js +25 -0
- package/dist/admin/server/index.js.map +1 -0
- package/dist/admin/types.d.ts +549 -0
- package/dist/admin/types.d.ts.map +1 -0
- package/dist/admin/types.js +11 -0
- package/dist/admin/types.js.map +1 -0
- package/dist/auth/api/auth.d.ts +54 -0
- package/dist/auth/api/auth.d.ts.map +1 -0
- package/dist/auth/api/auth.js +67 -0
- package/dist/auth/api/auth.js.map +1 -0
- package/dist/auth/api/forgot-password.d.ts +41 -0
- package/dist/auth/api/forgot-password.d.ts.map +1 -0
- package/dist/auth/api/forgot-password.js +68 -0
- package/dist/auth/api/forgot-password.js.map +1 -0
- package/dist/auth/api/index.d.ts +34 -0
- package/dist/auth/api/index.d.ts.map +1 -0
- package/dist/auth/api/index.js +52 -0
- package/dist/auth/api/index.js.map +1 -0
- package/dist/auth/api/register.d.ts +41 -0
- package/dist/auth/api/register.d.ts.map +1 -0
- package/dist/auth/api/register.js +93 -0
- package/dist/auth/api/register.js.map +1 -0
- package/dist/auth/api/resend-verification.d.ts +41 -0
- package/dist/auth/api/resend-verification.d.ts.map +1 -0
- package/dist/auth/api/resend-verification.js +71 -0
- package/dist/auth/api/resend-verification.js.map +1 -0
- package/dist/auth/api/reset-password.d.ts +67 -0
- package/dist/auth/api/reset-password.d.ts.map +1 -0
- package/dist/auth/api/reset-password.js +110 -0
- package/dist/auth/api/reset-password.js.map +1 -0
- package/dist/auth/api/verify-email.d.ts +47 -0
- package/dist/auth/api/verify-email.d.ts.map +1 -0
- package/dist/auth/api/verify-email.js +94 -0
- package/dist/auth/api/verify-email.js.map +1 -0
- package/dist/auth/components/AuthGuard.d.ts +52 -0
- package/dist/auth/components/AuthGuard.d.ts.map +1 -0
- package/dist/auth/components/AuthGuard.js +113 -0
- package/dist/auth/components/AuthGuard.js.map +1 -0
- package/dist/auth/components/ForgotPasswordForm.d.ts +15 -0
- package/dist/auth/components/ForgotPasswordForm.d.ts.map +1 -0
- package/dist/auth/components/ForgotPasswordForm.js +44 -0
- package/dist/auth/components/ForgotPasswordForm.js.map +1 -0
- package/dist/auth/components/ResetPasswordForm.d.ts +18 -0
- package/dist/auth/components/ResetPasswordForm.d.ts.map +1 -0
- package/dist/auth/components/ResetPasswordForm.js +88 -0
- package/dist/auth/components/ResetPasswordForm.js.map +1 -0
- package/dist/auth/components/SignInForm.d.ts +21 -0
- package/dist/auth/components/SignInForm.d.ts.map +1 -0
- package/dist/auth/components/SignInForm.js +63 -0
- package/dist/auth/components/SignInForm.js.map +1 -0
- package/dist/auth/components/SignUpForm.d.ts +18 -0
- package/dist/auth/components/SignUpForm.d.ts.map +1 -0
- package/dist/auth/components/SignUpForm.js +79 -0
- package/dist/auth/components/SignUpForm.js.map +1 -0
- package/dist/auth/components/UserMenu.d.ts +18 -0
- package/dist/auth/components/UserMenu.d.ts.map +1 -0
- package/dist/auth/components/UserMenu.js +75 -0
- package/dist/auth/components/UserMenu.js.map +1 -0
- package/dist/auth/components/VerifyEmailNotice.d.ts +20 -0
- package/dist/auth/components/VerifyEmailNotice.d.ts.map +1 -0
- package/dist/auth/components/VerifyEmailNotice.js +59 -0
- package/dist/auth/components/VerifyEmailNotice.js.map +1 -0
- package/dist/auth/components/index.d.ts +13 -0
- package/dist/auth/components/index.d.ts.map +1 -0
- package/dist/auth/components/index.js +24 -0
- package/dist/auth/components/index.js.map +1 -0
- package/dist/auth/config.d.ts +42 -0
- package/dist/auth/config.d.ts.map +1 -0
- package/dist/auth/config.js +174 -0
- package/dist/auth/config.js.map +1 -0
- package/dist/auth/hooks/index.d.ts +7 -0
- package/dist/auth/hooks/index.d.ts.map +1 -0
- package/dist/auth/hooks/index.js +11 -0
- package/dist/auth/hooks/index.js.map +1 -0
- package/dist/auth/index.d.ts +54 -0
- package/dist/auth/index.d.ts.map +1 -0
- package/dist/auth/index.js +88 -0
- package/dist/auth/index.js.map +1 -0
- package/dist/auth/server/customer-service.d.ts +138 -0
- package/dist/auth/server/customer-service.d.ts.map +1 -0
- package/dist/auth/server/customer-service.js +309 -0
- package/dist/auth/server/customer-service.js.map +1 -0
- package/dist/auth/server/email-sender.d.ts +64 -0
- package/dist/auth/server/email-sender.d.ts.map +1 -0
- package/dist/auth/server/email-sender.js +112 -0
- package/dist/auth/server/email-sender.js.map +1 -0
- package/dist/auth/server/index.d.ts +13 -0
- package/dist/auth/server/index.d.ts.map +1 -0
- package/dist/auth/server/index.js +48 -0
- package/dist/auth/server/index.js.map +1 -0
- package/dist/auth/server/password-reset-service.d.ts +86 -0
- package/dist/auth/server/password-reset-service.d.ts.map +1 -0
- package/dist/auth/server/password-reset-service.js +236 -0
- package/dist/auth/server/password-reset-service.js.map +1 -0
- package/dist/auth/server/password.d.ts +58 -0
- package/dist/auth/server/password.d.ts.map +1 -0
- package/dist/auth/server/password.js +94 -0
- package/dist/auth/server/password.js.map +1 -0
- package/dist/auth/server/verification-service.d.ts +87 -0
- package/dist/auth/server/verification-service.d.ts.map +1 -0
- package/dist/auth/server/verification-service.js +268 -0
- package/dist/auth/server/verification-service.js.map +1 -0
- package/dist/auth/types.d.ts +305 -0
- package/dist/auth/types.d.ts.map +1 -0
- package/dist/auth/types.js +8 -0
- package/dist/auth/types.js.map +1 -0
- package/dist/cart/CartProvider.d.ts +65 -0
- package/dist/cart/CartProvider.d.ts.map +1 -0
- package/dist/cart/CartProvider.js +101 -0
- package/dist/cart/CartProvider.js.map +1 -0
- package/dist/cart/components/AddToCartButton.d.ts +77 -0
- package/dist/cart/components/AddToCartButton.d.ts.map +1 -0
- package/dist/cart/components/AddToCartButton.js +124 -0
- package/dist/cart/components/AddToCartButton.js.map +1 -0
- package/dist/cart/components/CartDrawer.d.ts +71 -0
- package/dist/cart/components/CartDrawer.d.ts.map +1 -0
- package/dist/cart/components/CartDrawer.js +108 -0
- package/dist/cart/components/CartDrawer.js.map +1 -0
- package/dist/cart/components/CartIcon.d.ts +36 -0
- package/dist/cart/components/CartIcon.d.ts.map +1 -0
- package/dist/cart/components/CartIcon.js +70 -0
- package/dist/cart/components/CartIcon.js.map +1 -0
- package/dist/cart/components/CartItem.d.ts +52 -0
- package/dist/cart/components/CartItem.d.ts.map +1 -0
- package/dist/cart/components/CartItem.js +55 -0
- package/dist/cart/components/CartItem.js.map +1 -0
- package/dist/cart/components/CartSummary.d.ts +43 -0
- package/dist/cart/components/CartSummary.d.ts.map +1 -0
- package/dist/cart/components/CartSummary.js +58 -0
- package/dist/cart/components/CartSummary.js.map +1 -0
- package/dist/cart/components/QuantitySelector.d.ts +39 -0
- package/dist/cart/components/QuantitySelector.d.ts.map +1 -0
- package/dist/cart/components/QuantitySelector.js +87 -0
- package/dist/cart/components/QuantitySelector.js.map +1 -0
- package/dist/cart/components/index.d.ts +18 -0
- package/dist/cart/components/index.d.ts.map +1 -0
- package/dist/cart/components/index.js +21 -0
- package/dist/cart/components/index.js.map +1 -0
- package/dist/cart/index.d.ts +109 -0
- package/dist/cart/index.d.ts.map +1 -0
- package/dist/cart/index.js +129 -0
- package/dist/cart/index.js.map +1 -0
- package/dist/cart/store.d.ts +101 -0
- package/dist/cart/store.d.ts.map +1 -0
- package/dist/cart/store.js +207 -0
- package/dist/cart/store.js.map +1 -0
- package/dist/checkout/api/checkout.d.ts +31 -0
- package/dist/checkout/api/checkout.d.ts.map +1 -0
- package/dist/checkout/api/checkout.js +103 -0
- package/dist/checkout/api/checkout.js.map +1 -0
- package/dist/checkout/api/index.d.ts +8 -0
- package/dist/checkout/api/index.d.ts.map +1 -0
- package/dist/checkout/api/index.js +13 -0
- package/dist/checkout/api/index.js.map +1 -0
- package/dist/checkout/api/webhook.d.ts +30 -0
- package/dist/checkout/api/webhook.d.ts.map +1 -0
- package/dist/checkout/api/webhook.js +58 -0
- package/dist/checkout/api/webhook.js.map +1 -0
- package/dist/checkout/components/CheckoutButton.d.ts +44 -0
- package/dist/checkout/components/CheckoutButton.d.ts.map +1 -0
- package/dist/checkout/components/CheckoutButton.js +97 -0
- package/dist/checkout/components/CheckoutButton.js.map +1 -0
- package/dist/checkout/components/CheckoutSuccess.d.ts +29 -0
- package/dist/checkout/components/CheckoutSuccess.d.ts.map +1 -0
- package/dist/checkout/components/CheckoutSuccess.js +60 -0
- package/dist/checkout/components/CheckoutSuccess.js.map +1 -0
- package/dist/checkout/components/OrderSummary.d.ts +37 -0
- package/dist/checkout/components/OrderSummary.d.ts.map +1 -0
- package/dist/checkout/components/OrderSummary.js +70 -0
- package/dist/checkout/components/OrderSummary.js.map +1 -0
- package/dist/checkout/components/ShippingForm.d.ts +30 -0
- package/dist/checkout/components/ShippingForm.d.ts.map +1 -0
- package/dist/checkout/components/ShippingForm.js +125 -0
- package/dist/checkout/components/ShippingForm.js.map +1 -0
- package/dist/checkout/components/index.d.ts +10 -0
- package/dist/checkout/components/index.d.ts.map +1 -0
- package/dist/checkout/components/index.js +17 -0
- package/dist/checkout/components/index.js.map +1 -0
- package/dist/checkout/hooks/index.d.ts +7 -0
- package/dist/checkout/hooks/index.d.ts.map +1 -0
- package/dist/checkout/hooks/index.js +12 -0
- package/dist/checkout/hooks/index.js.map +1 -0
- package/dist/checkout/hooks/useCheckout.d.ts +61 -0
- package/dist/checkout/hooks/useCheckout.d.ts.map +1 -0
- package/dist/checkout/hooks/useCheckout.js +174 -0
- package/dist/checkout/hooks/useCheckout.js.map +1 -0
- package/dist/checkout/index.d.ts +111 -0
- package/dist/checkout/index.d.ts.map +1 -0
- package/dist/checkout/index.js +148 -0
- package/dist/checkout/index.js.map +1 -0
- package/dist/checkout/server/create-checkout-session.d.ts +69 -0
- package/dist/checkout/server/create-checkout-session.d.ts.map +1 -0
- package/dist/checkout/server/create-checkout-session.js +190 -0
- package/dist/checkout/server/create-checkout-session.js.map +1 -0
- package/dist/checkout/server/handle-webhook.d.ts +35 -0
- package/dist/checkout/server/handle-webhook.d.ts.map +1 -0
- package/dist/checkout/server/handle-webhook.js +279 -0
- package/dist/checkout/server/handle-webhook.js.map +1 -0
- package/dist/checkout/server/index.d.ts +10 -0
- package/dist/checkout/server/index.d.ts.map +1 -0
- package/dist/checkout/server/index.js +19 -0
- package/dist/checkout/server/index.js.map +1 -0
- package/dist/checkout/server/order-service.d.ts +43 -0
- package/dist/checkout/server/order-service.d.ts.map +1 -0
- package/dist/checkout/server/order-service.js +196 -0
- package/dist/checkout/server/order-service.js.map +1 -0
- package/dist/checkout/stripe/client.d.ts +72 -0
- package/dist/checkout/stripe/client.d.ts.map +1 -0
- package/dist/checkout/stripe/client.js +189 -0
- package/dist/checkout/stripe/client.js.map +1 -0
- package/dist/checkout/stripe/index.d.ts +7 -0
- package/dist/checkout/stripe/index.d.ts.map +1 -0
- package/dist/checkout/stripe/index.js +21 -0
- package/dist/checkout/stripe/index.js.map +1 -0
- package/dist/checkout/types.d.ts +263 -0
- package/dist/checkout/types.d.ts.map +1 -0
- package/dist/checkout/types.js +9 -0
- package/dist/checkout/types.js.map +1 -0
- package/dist/core/config.d.ts +296 -0
- package/dist/core/config.d.ts.map +1 -0
- package/dist/core/config.js +162 -0
- package/dist/core/config.js.map +1 -0
- package/dist/core/db/client.d.ts +69 -0
- package/dist/core/db/client.d.ts.map +1 -0
- package/dist/core/db/client.js +202 -0
- package/dist/core/db/client.js.map +1 -0
- package/dist/core/db/index.d.ts +11 -0
- package/dist/core/db/index.d.ts.map +1 -0
- package/dist/core/db/index.js +109 -0
- package/dist/core/db/index.js.map +1 -0
- package/dist/core/db/queries.d.ts +627 -0
- package/dist/core/db/queries.d.ts.map +1 -0
- package/dist/core/db/queries.js +730 -0
- package/dist/core/db/queries.js.map +1 -0
- package/dist/core/db/schema.d.ts +1628 -0
- package/dist/core/db/schema.d.ts.map +1 -0
- package/dist/core/db/schema.js +262 -0
- package/dist/core/db/schema.js.map +1 -0
- package/dist/core/index.d.ts +20 -0
- package/dist/core/index.d.ts.map +1 -0
- package/dist/core/index.js +71 -0
- package/dist/core/index.js.map +1 -0
- package/dist/core/server/index.d.ts +17 -0
- package/dist/core/server/index.d.ts.map +1 -0
- package/dist/core/server/index.js +96 -0
- package/dist/core/server/index.js.map +1 -0
- package/dist/core/types.d.ts +230 -0
- package/dist/core/types.d.ts.map +1 -0
- package/dist/core/types.js +9 -0
- package/dist/core/types.js.map +1 -0
- package/dist/core/utils.d.ts +153 -0
- package/dist/core/utils.d.ts.map +1 -0
- package/dist/core/utils.js +356 -0
- package/dist/core/utils.js.map +1 -0
- package/dist/emails/config.d.ts +42 -0
- package/dist/emails/config.d.ts.map +1 -0
- package/dist/emails/config.js +89 -0
- package/dist/emails/config.js.map +1 -0
- package/dist/emails/index.d.ts +85 -0
- package/dist/emails/index.d.ts.map +1 -0
- package/dist/emails/index.js +170 -0
- package/dist/emails/index.js.map +1 -0
- package/dist/emails/send/auth.d.ts +91 -0
- package/dist/emails/send/auth.d.ts.map +1 -0
- package/dist/emails/send/auth.js +132 -0
- package/dist/emails/send/auth.js.map +1 -0
- package/dist/emails/send/index.d.ts +10 -0
- package/dist/emails/send/index.d.ts.map +1 -0
- package/dist/emails/send/index.js +33 -0
- package/dist/emails/send/index.js.map +1 -0
- package/dist/emails/send/orders.d.ts +180 -0
- package/dist/emails/send/orders.d.ts.map +1 -0
- package/dist/emails/send/orders.js +259 -0
- package/dist/emails/send/orders.js.map +1 -0
- package/dist/emails/sender.d.ts +72 -0
- package/dist/emails/sender.d.ts.map +1 -0
- package/dist/emails/sender.js +118 -0
- package/dist/emails/sender.js.map +1 -0
- package/dist/emails/templates/base.d.ts +105 -0
- package/dist/emails/templates/base.d.ts.map +1 -0
- package/dist/emails/templates/base.js +291 -0
- package/dist/emails/templates/base.js.map +1 -0
- package/dist/emails/templates/email-verification.d.ts +28 -0
- package/dist/emails/templates/email-verification.d.ts.map +1 -0
- package/dist/emails/templates/email-verification.js +56 -0
- package/dist/emails/templates/email-verification.js.map +1 -0
- package/dist/emails/templates/index.d.ts +15 -0
- package/dist/emails/templates/index.d.ts.map +1 -0
- package/dist/emails/templates/index.js +58 -0
- package/dist/emails/templates/index.js.map +1 -0
- package/dist/emails/templates/order-cancelled.d.ts +30 -0
- package/dist/emails/templates/order-cancelled.d.ts.map +1 -0
- package/dist/emails/templates/order-cancelled.js +87 -0
- package/dist/emails/templates/order-cancelled.js.map +1 -0
- package/dist/emails/templates/order-confirmation.d.ts +36 -0
- package/dist/emails/templates/order-confirmation.d.ts.map +1 -0
- package/dist/emails/templates/order-confirmation.js +161 -0
- package/dist/emails/templates/order-confirmation.js.map +1 -0
- package/dist/emails/templates/order-delivered.d.ts +31 -0
- package/dist/emails/templates/order-delivered.d.ts.map +1 -0
- package/dist/emails/templates/order-delivered.js +95 -0
- package/dist/emails/templates/order-delivered.js.map +1 -0
- package/dist/emails/templates/order-shipped.d.ts +32 -0
- package/dist/emails/templates/order-shipped.d.ts.map +1 -0
- package/dist/emails/templates/order-shipped.js +87 -0
- package/dist/emails/templates/order-shipped.js.map +1 -0
- package/dist/emails/templates/password-reset.d.ts +27 -0
- package/dist/emails/templates/password-reset.d.ts.map +1 -0
- package/dist/emails/templates/password-reset.js +55 -0
- package/dist/emails/templates/password-reset.js.map +1 -0
- package/dist/emails/templates/refund-processed.d.ts +32 -0
- package/dist/emails/templates/refund-processed.d.ts.map +1 -0
- package/dist/emails/templates/refund-processed.js +96 -0
- package/dist/emails/templates/refund-processed.js.map +1 -0
- package/dist/emails/templates/welcome.d.ts +27 -0
- package/dist/emails/templates/welcome.d.ts.map +1 -0
- package/dist/emails/templates/welcome.js +56 -0
- package/dist/emails/templates/welcome.js.map +1 -0
- package/dist/emails/types.d.ts +202 -0
- package/dist/emails/types.d.ts.map +1 -0
- package/dist/emails/types.js +8 -0
- package/dist/emails/types.js.map +1 -0
- package/dist/emails/utils.d.ts +94 -0
- package/dist/emails/utils.d.ts.map +1 -0
- package/dist/emails/utils.js +229 -0
- package/dist/emails/utils.js.map +1 -0
- package/dist/index.d.ts +40 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +225 -0
- package/dist/index.js.map +1 -0
- package/dist/products/api/categories.d.ts +29 -0
- package/dist/products/api/categories.d.ts.map +1 -0
- package/dist/products/api/categories.js +49 -0
- package/dist/products/api/categories.js.map +1 -0
- package/dist/products/api/index.d.ts +24 -0
- package/dist/products/api/index.d.ts.map +1 -0
- package/dist/products/api/index.js +30 -0
- package/dist/products/api/index.js.map +1 -0
- package/dist/products/api/product.d.ts +36 -0
- package/dist/products/api/product.d.ts.map +1 -0
- package/dist/products/api/product.js +70 -0
- package/dist/products/api/product.js.map +1 -0
- package/dist/products/api/products.d.ts +41 -0
- package/dist/products/api/products.d.ts.map +1 -0
- package/dist/products/api/products.js +102 -0
- package/dist/products/api/products.js.map +1 -0
- package/dist/products/components/CategoryNav.d.ts +51 -0
- package/dist/products/components/CategoryNav.d.ts.map +1 -0
- package/dist/products/components/CategoryNav.js +115 -0
- package/dist/products/components/CategoryNav.js.map +1 -0
- package/dist/products/components/ProductBreadcrumb.d.ts +52 -0
- package/dist/products/components/ProductBreadcrumb.d.ts.map +1 -0
- package/dist/products/components/ProductBreadcrumb.js +78 -0
- package/dist/products/components/ProductBreadcrumb.js.map +1 -0
- package/dist/products/components/ProductCard.d.ts +54 -0
- package/dist/products/components/ProductCard.d.ts.map +1 -0
- package/dist/products/components/ProductCard.js +65 -0
- package/dist/products/components/ProductCard.js.map +1 -0
- package/dist/products/components/ProductDetails.d.ts +63 -0
- package/dist/products/components/ProductDetails.d.ts.map +1 -0
- package/dist/products/components/ProductDetails.js +105 -0
- package/dist/products/components/ProductDetails.js.map +1 -0
- package/dist/products/components/ProductFilters.d.ts +70 -0
- package/dist/products/components/ProductFilters.d.ts.map +1 -0
- package/dist/products/components/ProductFilters.js +127 -0
- package/dist/products/components/ProductFilters.js.map +1 -0
- package/dist/products/components/ProductGallery.d.ts +37 -0
- package/dist/products/components/ProductGallery.d.ts.map +1 -0
- package/dist/products/components/ProductGallery.js +80 -0
- package/dist/products/components/ProductGallery.js.map +1 -0
- package/dist/products/components/ProductGrid.d.ts +50 -0
- package/dist/products/components/ProductGrid.d.ts.map +1 -0
- package/dist/products/components/ProductGrid.js +83 -0
- package/dist/products/components/ProductGrid.js.map +1 -0
- package/dist/products/components/ProductSearch.d.ts +43 -0
- package/dist/products/components/ProductSearch.d.ts.map +1 -0
- package/dist/products/components/ProductSearch.js +99 -0
- package/dist/products/components/ProductSearch.js.map +1 -0
- package/dist/products/components/ProductSort.d.ts +43 -0
- package/dist/products/components/ProductSort.d.ts.map +1 -0
- package/dist/products/components/ProductSort.js +61 -0
- package/dist/products/components/ProductSort.js.map +1 -0
- package/dist/products/components/VariantSelector.d.ts +43 -0
- package/dist/products/components/VariantSelector.d.ts.map +1 -0
- package/dist/products/components/VariantSelector.js +147 -0
- package/dist/products/components/VariantSelector.js.map +1 -0
- package/dist/products/components/index.d.ts +26 -0
- package/dist/products/components/index.d.ts.map +1 -0
- package/dist/products/components/index.js +32 -0
- package/dist/products/components/index.js.map +1 -0
- package/dist/products/hooks/index.d.ts +14 -0
- package/dist/products/hooks/index.d.ts.map +1 -0
- package/dist/products/hooks/index.js +17 -0
- package/dist/products/hooks/index.js.map +1 -0
- package/dist/products/hooks/useCategories.d.ts +56 -0
- package/dist/products/hooks/useCategories.d.ts.map +1 -0
- package/dist/products/hooks/useCategories.js +126 -0
- package/dist/products/hooks/useCategories.js.map +1 -0
- package/dist/products/hooks/useProduct.d.ts +44 -0
- package/dist/products/hooks/useProduct.d.ts.map +1 -0
- package/dist/products/hooks/useProduct.js +86 -0
- package/dist/products/hooks/useProduct.js.map +1 -0
- package/dist/products/hooks/useProductAttributes.d.ts +59 -0
- package/dist/products/hooks/useProductAttributes.d.ts.map +1 -0
- package/dist/products/hooks/useProductAttributes.js +148 -0
- package/dist/products/hooks/useProductAttributes.js.map +1 -0
- package/dist/products/hooks/useProducts.d.ts +67 -0
- package/dist/products/hooks/useProducts.d.ts.map +1 -0
- package/dist/products/hooks/useProducts.js +132 -0
- package/dist/products/hooks/useProducts.js.map +1 -0
- package/dist/products/index.d.ts +94 -0
- package/dist/products/index.d.ts.map +1 -0
- package/dist/products/index.js +123 -0
- package/dist/products/index.js.map +1 -0
- package/dist/theme/ThemeProvider.d.ts +70 -0
- package/dist/theme/ThemeProvider.d.ts.map +1 -0
- package/dist/theme/ThemeProvider.js +77 -0
- package/dist/theme/ThemeProvider.js.map +1 -0
- package/dist/theme/colors.d.ts +148 -0
- package/dist/theme/colors.d.ts.map +1 -0
- package/dist/theme/colors.js +219 -0
- package/dist/theme/colors.js.map +1 -0
- package/dist/theme/defaults.d.ts +212 -0
- package/dist/theme/defaults.d.ts.map +1 -0
- package/dist/theme/defaults.js +278 -0
- package/dist/theme/defaults.js.map +1 -0
- package/dist/theme/fonts.d.ts +59 -0
- package/dist/theme/fonts.d.ts.map +1 -0
- package/dist/theme/fonts.js +202 -0
- package/dist/theme/fonts.js.map +1 -0
- package/dist/theme/generator.d.ts +50 -0
- package/dist/theme/generator.d.ts.map +1 -0
- package/dist/theme/generator.js +322 -0
- package/dist/theme/generator.js.map +1 -0
- package/dist/theme/hooks.d.ts +110 -0
- package/dist/theme/hooks.d.ts.map +1 -0
- package/dist/theme/hooks.js +106 -0
- package/dist/theme/hooks.js.map +1 -0
- package/dist/theme/index.d.ts +37 -0
- package/dist/theme/index.d.ts.map +1 -0
- package/dist/theme/index.js +85 -0
- package/dist/theme/index.js.map +1 -0
- package/package.json +7 -2
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* @rovela/sdk/products/api/products
|
|
4
|
+
*
|
|
5
|
+
* API route handler for product listing endpoint.
|
|
6
|
+
* Provides GET /api/products with filtering, sorting, and pagination.
|
|
7
|
+
*
|
|
8
|
+
* Usage in Next.js App Router:
|
|
9
|
+
* ```typescript
|
|
10
|
+
* // app/api/products/route.ts
|
|
11
|
+
* export { GET } from '@rovela/sdk/products/api'
|
|
12
|
+
* ```
|
|
13
|
+
*/
|
|
14
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
15
|
+
exports.GET = GET;
|
|
16
|
+
const server_1 = require("next/server");
|
|
17
|
+
const queries_1 = require("../../core/db/queries");
|
|
18
|
+
// =============================================================================
|
|
19
|
+
// Handler
|
|
20
|
+
// =============================================================================
|
|
21
|
+
/**
|
|
22
|
+
* GET /api/products
|
|
23
|
+
*
|
|
24
|
+
* Query Parameters:
|
|
25
|
+
* - category: string - Filter by category ID
|
|
26
|
+
* - search: string - Search by product name
|
|
27
|
+
* - sort: 'newest' | 'price-asc' | 'price-desc' | 'name'
|
|
28
|
+
* - status: 'draft' | 'active' | 'archived' (defaults to 'active')
|
|
29
|
+
* - minPrice: number - Minimum price filter
|
|
30
|
+
* - maxPrice: number - Maximum price filter
|
|
31
|
+
* - limit: number - Page size (default 12, max 100)
|
|
32
|
+
* - page: number - Page number (1-based, default 1)
|
|
33
|
+
* - attributes: JSON string - Attribute filters { color: ['Red'], size: ['L'] }
|
|
34
|
+
*/
|
|
35
|
+
async function GET(request) {
|
|
36
|
+
try {
|
|
37
|
+
const searchParams = request.nextUrl.searchParams;
|
|
38
|
+
// Parse pagination
|
|
39
|
+
const page = Math.max(1, parseInt(searchParams.get('page') || '1', 10));
|
|
40
|
+
const limit = Math.min(100, Math.max(1, parseInt(searchParams.get('limit') || '12', 10)));
|
|
41
|
+
const offset = (page - 1) * limit;
|
|
42
|
+
// Parse sort
|
|
43
|
+
const sortParam = searchParams.get('sort');
|
|
44
|
+
const sort = isValidSort(sortParam) ? sortParam : 'newest';
|
|
45
|
+
// Parse status (default to 'active' for public API)
|
|
46
|
+
const statusParam = searchParams.get('status');
|
|
47
|
+
const status = isValidStatus(statusParam) ? statusParam : 'active';
|
|
48
|
+
// Build query options
|
|
49
|
+
const options = {
|
|
50
|
+
categoryId: searchParams.get('category') || undefined,
|
|
51
|
+
search: searchParams.get('search') || undefined,
|
|
52
|
+
sort,
|
|
53
|
+
status,
|
|
54
|
+
limit,
|
|
55
|
+
offset,
|
|
56
|
+
};
|
|
57
|
+
// Execute queries in parallel
|
|
58
|
+
const [products, total] = await Promise.all([
|
|
59
|
+
(0, queries_1.findProducts)(options),
|
|
60
|
+
(0, queries_1.countProducts)({
|
|
61
|
+
categoryId: options.categoryId,
|
|
62
|
+
status: options.status,
|
|
63
|
+
search: options.search,
|
|
64
|
+
}),
|
|
65
|
+
]);
|
|
66
|
+
const hasMore = offset + products.length < total;
|
|
67
|
+
return server_1.NextResponse.json({
|
|
68
|
+
data: products,
|
|
69
|
+
total,
|
|
70
|
+
page,
|
|
71
|
+
pageSize: limit,
|
|
72
|
+
hasMore,
|
|
73
|
+
});
|
|
74
|
+
}
|
|
75
|
+
catch (error) {
|
|
76
|
+
console.error('[Products API] Error:', error);
|
|
77
|
+
// Handle tenant not set error gracefully
|
|
78
|
+
if (error instanceof Error && error.message.includes('Tenant ID not set')) {
|
|
79
|
+
return server_1.NextResponse.json({
|
|
80
|
+
error: 'Store not configured. Please set TENANT_ID environment variable.',
|
|
81
|
+
code: 'TENANT_NOT_SET',
|
|
82
|
+
}, { status: 500 });
|
|
83
|
+
}
|
|
84
|
+
return server_1.NextResponse.json({
|
|
85
|
+
error: 'Failed to fetch products',
|
|
86
|
+
code: 'INTERNAL_ERROR',
|
|
87
|
+
}, { status: 500 });
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
// =============================================================================
|
|
91
|
+
// Helpers
|
|
92
|
+
// =============================================================================
|
|
93
|
+
function isValidSort(value) {
|
|
94
|
+
return (value === 'newest' ||
|
|
95
|
+
value === 'price-asc' ||
|
|
96
|
+
value === 'price-desc' ||
|
|
97
|
+
value === 'name');
|
|
98
|
+
}
|
|
99
|
+
function isValidStatus(value) {
|
|
100
|
+
return value === 'draft' || value === 'active' || value === 'archived';
|
|
101
|
+
}
|
|
102
|
+
//# sourceMappingURL=products.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"products.js","sourceRoot":"","sources":["../../../src/products/api/products.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
import type { Category } from '../../core/types';
|
|
2
|
+
import type { CategoryWithChildren } from '../hooks/useCategories';
|
|
3
|
+
export interface CategoryNavProps {
|
|
4
|
+
/** Categories (flat or tree structure) */
|
|
5
|
+
categories: Category[] | CategoryWithChildren[];
|
|
6
|
+
/** Currently active category slug */
|
|
7
|
+
activeSlug?: string | null;
|
|
8
|
+
/** Custom className */
|
|
9
|
+
className?: string;
|
|
10
|
+
/** Navigation style */
|
|
11
|
+
variant?: 'horizontal' | 'vertical' | 'dropdown';
|
|
12
|
+
/** Link href pattern (default: /categories/[slug]) */
|
|
13
|
+
hrefPattern?: string;
|
|
14
|
+
/** Show product count */
|
|
15
|
+
showCount?: boolean;
|
|
16
|
+
/** Product counts by category ID */
|
|
17
|
+
counts?: Record<string, number>;
|
|
18
|
+
/** Show all products link */
|
|
19
|
+
showAllLink?: boolean;
|
|
20
|
+
/** All products link label */
|
|
21
|
+
allLinkLabel?: string;
|
|
22
|
+
/** Collapse nested categories */
|
|
23
|
+
collapsible?: boolean;
|
|
24
|
+
/** Maximum depth to render */
|
|
25
|
+
maxDepth?: number;
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* CategoryNav component for displaying category navigation.
|
|
29
|
+
*
|
|
30
|
+
* @example
|
|
31
|
+
* ```tsx
|
|
32
|
+
* import { CategoryNav, useCategories } from '@rovela/sdk/products'
|
|
33
|
+
*
|
|
34
|
+
* function Sidebar({ activeCategory }) {
|
|
35
|
+
* const { tree, isLoading } = useCategories()
|
|
36
|
+
*
|
|
37
|
+
* if (isLoading) return <div>Loading...</div>
|
|
38
|
+
*
|
|
39
|
+
* return (
|
|
40
|
+
* <CategoryNav
|
|
41
|
+
* categories={tree}
|
|
42
|
+
* activeSlug={activeCategory}
|
|
43
|
+
* variant="vertical"
|
|
44
|
+
* collapsible
|
|
45
|
+
* />
|
|
46
|
+
* )
|
|
47
|
+
* }
|
|
48
|
+
* ```
|
|
49
|
+
*/
|
|
50
|
+
export declare function CategoryNav({ categories, activeSlug, className, variant, hrefPattern, showCount, counts, showAllLink, allLinkLabel, collapsible, maxDepth, }: CategoryNavProps): import("react/jsx-runtime").JSX.Element;
|
|
51
|
+
//# sourceMappingURL=CategoryNav.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"CategoryNav.d.ts","sourceRoot":"","sources":["../../../src/products/components/CategoryNav.tsx"],"names":[],"mappings":"AAWA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAA;AAChD,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAA;AAMlE,MAAM,WAAW,gBAAgB;IAC/B,0CAA0C;IAC1C,UAAU,EAAE,QAAQ,EAAE,GAAG,oBAAoB,EAAE,CAAA;IAC/C,qCAAqC;IACrC,UAAU,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IAC1B,uBAAuB;IACvB,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,uBAAuB;IACvB,OAAO,CAAC,EAAE,YAAY,GAAG,UAAU,GAAG,UAAU,CAAA;IAChD,sDAAsD;IACtD,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,yBAAyB;IACzB,SAAS,CAAC,EAAE,OAAO,CAAA;IACnB,oCAAoC;IACpC,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IAC/B,6BAA6B;IAC7B,WAAW,CAAC,EAAE,OAAO,CAAA;IACrB,8BAA8B;IAC9B,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,iCAAiC;IACjC,WAAW,CAAC,EAAE,OAAO,CAAA;IACrB,8BAA8B;IAC9B,QAAQ,CAAC,EAAE,MAAM,CAAA;CAClB;AAMD;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,wBAAgB,WAAW,CAAC,EAC1B,UAAU,EACV,UAAU,EACV,SAAS,EACT,OAAoB,EACpB,WAAkC,EAClC,SAAiB,EACjB,MAAW,EACX,WAAkB,EAClB,YAA6B,EAC7B,WAAmB,EACnB,QAAY,GACb,EAAE,gBAAgB,2CAmElB"}
|
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
'use client';
|
|
3
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
4
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
5
|
+
};
|
|
6
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
7
|
+
exports.CategoryNav = CategoryNav;
|
|
8
|
+
const jsx_runtime_1 = require("react/jsx-runtime");
|
|
9
|
+
/**
|
|
10
|
+
* @rovela/sdk/products/components/CategoryNav
|
|
11
|
+
*
|
|
12
|
+
* Category navigation component with hierarchical support.
|
|
13
|
+
*/
|
|
14
|
+
const react_1 = require("react");
|
|
15
|
+
const link_1 = __importDefault(require("next/link"));
|
|
16
|
+
const utils_1 = require("../../core/utils");
|
|
17
|
+
// =============================================================================
|
|
18
|
+
// Component
|
|
19
|
+
// =============================================================================
|
|
20
|
+
/**
|
|
21
|
+
* CategoryNav component for displaying category navigation.
|
|
22
|
+
*
|
|
23
|
+
* @example
|
|
24
|
+
* ```tsx
|
|
25
|
+
* import { CategoryNav, useCategories } from '@rovela/sdk/products'
|
|
26
|
+
*
|
|
27
|
+
* function Sidebar({ activeCategory }) {
|
|
28
|
+
* const { tree, isLoading } = useCategories()
|
|
29
|
+
*
|
|
30
|
+
* if (isLoading) return <div>Loading...</div>
|
|
31
|
+
*
|
|
32
|
+
* return (
|
|
33
|
+
* <CategoryNav
|
|
34
|
+
* categories={tree}
|
|
35
|
+
* activeSlug={activeCategory}
|
|
36
|
+
* variant="vertical"
|
|
37
|
+
* collapsible
|
|
38
|
+
* />
|
|
39
|
+
* )
|
|
40
|
+
* }
|
|
41
|
+
* ```
|
|
42
|
+
*/
|
|
43
|
+
function CategoryNav({ categories, activeSlug, className, variant = 'vertical', hrefPattern = '/categories/[slug]', showCount = false, counts = {}, showAllLink = true, allLinkLabel = 'All Products', collapsible = false, maxDepth = 3, }) {
|
|
44
|
+
// Check if categories have children (tree structure)
|
|
45
|
+
const isTree = categories.length > 0 && 'children' in categories[0];
|
|
46
|
+
const baseClasses = {
|
|
47
|
+
horizontal: 'flex flex-wrap gap-2',
|
|
48
|
+
vertical: 'flex flex-col space-y-1',
|
|
49
|
+
dropdown: 'relative',
|
|
50
|
+
};
|
|
51
|
+
if (variant === 'dropdown') {
|
|
52
|
+
return ((0, jsx_runtime_1.jsx)(CategoryDropdown, { categories: categories, activeSlug: activeSlug, className: className, hrefPattern: hrefPattern, showCount: showCount, counts: counts, showAllLink: showAllLink, allLinkLabel: allLinkLabel }));
|
|
53
|
+
}
|
|
54
|
+
return ((0, jsx_runtime_1.jsxs)("nav", { className: (0, utils_1.cn)(baseClasses[variant], className), "aria-label": "Categories", children: [showAllLink && ((0, jsx_runtime_1.jsx)(CategoryLink, { href: "/products", label: allLinkLabel, isActive: !activeSlug, variant: variant })), isTree ? (
|
|
55
|
+
// Render tree structure
|
|
56
|
+
categories.map((category) => ((0, jsx_runtime_1.jsx)(CategoryTreeItem, { category: category, activeSlug: activeSlug, hrefPattern: hrefPattern, showCount: showCount, counts: counts, collapsible: collapsible, variant: variant, depth: 0, maxDepth: maxDepth }, category.id)))) : (
|
|
57
|
+
// Render flat structure
|
|
58
|
+
categories.map((category) => ((0, jsx_runtime_1.jsx)(CategoryLink, { href: hrefPattern.replace('[slug]', category.slug), label: category.name, isActive: category.slug === activeSlug, count: showCount ? counts[category.id] : undefined, variant: variant }, category.id))))] }));
|
|
59
|
+
}
|
|
60
|
+
function CategoryLink({ href, label, isActive = false, count, variant = 'vertical', className, depth = 0, }) {
|
|
61
|
+
const linkClasses = (0, utils_1.cn)('block transition-colors', variant === 'horizontal'
|
|
62
|
+
? (0, utils_1.cn)('rounded-full px-4 py-2 text-sm', isActive
|
|
63
|
+
? 'bg-primary text-primary-foreground'
|
|
64
|
+
: 'bg-muted text-muted-foreground hover:bg-muted/80 hover:text-foreground')
|
|
65
|
+
: (0, utils_1.cn)('rounded-md px-3 py-2 text-sm', isActive
|
|
66
|
+
? 'bg-primary/10 font-medium text-primary'
|
|
67
|
+
: 'text-muted-foreground hover:bg-muted hover:text-foreground'), depth > 0 && variant === 'vertical' && `ml-${Math.min(depth * 4, 12)}`, className);
|
|
68
|
+
return ((0, jsx_runtime_1.jsx)(link_1.default, { href: href, className: linkClasses, children: (0, jsx_runtime_1.jsxs)("span", { className: "flex items-center justify-between", children: [(0, jsx_runtime_1.jsx)("span", { children: label }), count !== undefined && ((0, jsx_runtime_1.jsxs)("span", { className: "ml-2 text-xs text-muted-foreground", children: ["(", count, ")"] }))] }) }));
|
|
69
|
+
}
|
|
70
|
+
function CategoryTreeItem({ category, activeSlug, hrefPattern, showCount, counts, collapsible, variant, depth, maxDepth, }) {
|
|
71
|
+
const hasChildren = category.children && category.children.length > 0;
|
|
72
|
+
const isActive = category.slug === activeSlug;
|
|
73
|
+
const isActiveParent = hasChildren &&
|
|
74
|
+
category.children.some(child => child.slug === activeSlug ||
|
|
75
|
+
(child.children && child.children.some(gc => gc.slug === activeSlug)));
|
|
76
|
+
const [isExpanded, setIsExpanded] = (0, react_1.useState)(isActive || isActiveParent);
|
|
77
|
+
const handleToggle = (0, react_1.useCallback)((e) => {
|
|
78
|
+
if (collapsible && hasChildren) {
|
|
79
|
+
e.preventDefault();
|
|
80
|
+
setIsExpanded(!isExpanded);
|
|
81
|
+
}
|
|
82
|
+
}, [collapsible, hasChildren, isExpanded]);
|
|
83
|
+
// Don't render beyond max depth
|
|
84
|
+
if (depth >= maxDepth)
|
|
85
|
+
return null;
|
|
86
|
+
return ((0, jsx_runtime_1.jsxs)("div", { className: variant === 'vertical' ? 'space-y-1' : '', children: [(0, jsx_runtime_1.jsxs)("div", { className: "flex items-center", children: [collapsible && hasChildren && variant === 'vertical' && ((0, jsx_runtime_1.jsx)("button", { onClick: handleToggle, className: "mr-1 flex h-6 w-6 items-center justify-center rounded text-muted-foreground hover:bg-muted", "aria-label": isExpanded ? 'Collapse' : 'Expand', children: (0, jsx_runtime_1.jsx)("svg", { className: (0, utils_1.cn)('h-4 w-4 transition-transform', isExpanded && 'rotate-90'), fill: "none", stroke: "currentColor", viewBox: "0 0 24 24", children: (0, jsx_runtime_1.jsx)("path", { strokeLinecap: "round", strokeLinejoin: "round", strokeWidth: 2, d: "M9 5l7 7-7 7" }) }) })), (0, jsx_runtime_1.jsx)(CategoryLink, { href: hrefPattern.replace('[slug]', category.slug), label: category.name, isActive: isActive, count: showCount ? counts[category.id] : undefined, variant: variant, depth: collapsible ? 0 : depth, className: "flex-1" })] }), hasChildren && (collapsible ? isExpanded : true) && ((0, jsx_runtime_1.jsx)("div", { className: (0, utils_1.cn)(variant === 'vertical' && 'ml-4 space-y-1'), children: category.children.map((child) => ((0, jsx_runtime_1.jsx)(CategoryTreeItem, { category: child, activeSlug: activeSlug, hrefPattern: hrefPattern, showCount: showCount, counts: counts, collapsible: collapsible, variant: variant, depth: depth + 1, maxDepth: maxDepth }, child.id))) }))] }));
|
|
87
|
+
}
|
|
88
|
+
function CategoryDropdown({ categories, activeSlug, className, hrefPattern, showCount, counts, showAllLink, allLinkLabel, }) {
|
|
89
|
+
const [isOpen, setIsOpen] = (0, react_1.useState)(false);
|
|
90
|
+
// Find active category name
|
|
91
|
+
const flatCategories = flattenCategories(categories);
|
|
92
|
+
const activeCategory = flatCategories.find((c) => c.slug === activeSlug);
|
|
93
|
+
return ((0, jsx_runtime_1.jsxs)("div", { className: (0, utils_1.cn)('relative', className), children: [(0, jsx_runtime_1.jsxs)("button", { onClick: () => setIsOpen(!isOpen), className: "flex w-full items-center justify-between rounded-md border border-border bg-background px-4 py-2 text-sm", children: [(0, jsx_runtime_1.jsx)("span", { children: activeCategory?.name || allLinkLabel }), (0, jsx_runtime_1.jsx)("svg", { className: (0, utils_1.cn)('h-4 w-4 transition-transform', isOpen && 'rotate-180'), fill: "none", stroke: "currentColor", viewBox: "0 0 24 24", children: (0, jsx_runtime_1.jsx)("path", { strokeLinecap: "round", strokeLinejoin: "round", strokeWidth: 2, d: "M19 9l-7 7-7-7" }) })] }), isOpen && ((0, jsx_runtime_1.jsxs)(jsx_runtime_1.Fragment, { children: [(0, jsx_runtime_1.jsx)("div", { className: "fixed inset-0 z-10", onClick: () => setIsOpen(false) }), (0, jsx_runtime_1.jsxs)("div", { className: "absolute z-20 mt-1 w-full rounded-md border border-border bg-background py-1 shadow-lg", children: [showAllLink && ((0, jsx_runtime_1.jsx)(link_1.default, { href: "/products", onClick: () => setIsOpen(false), className: (0, utils_1.cn)('block px-4 py-2 text-sm', !activeSlug
|
|
94
|
+
? 'bg-primary/10 text-primary'
|
|
95
|
+
: 'text-foreground hover:bg-muted'), children: allLinkLabel })), flatCategories.map((category) => ((0, jsx_runtime_1.jsx)(link_1.default, { href: hrefPattern.replace('[slug]', category.slug), onClick: () => setIsOpen(false), className: (0, utils_1.cn)('block px-4 py-2 text-sm', category.slug === activeSlug
|
|
96
|
+
? 'bg-primary/10 text-primary'
|
|
97
|
+
: 'text-foreground hover:bg-muted'), children: (0, jsx_runtime_1.jsxs)("span", { className: "flex items-center justify-between", children: [(0, jsx_runtime_1.jsx)("span", { children: category.name }), showCount && counts[category.id] !== undefined && ((0, jsx_runtime_1.jsxs)("span", { className: "text-xs text-muted-foreground", children: ["(", counts[category.id], ")"] }))] }) }, category.id)))] })] }))] }));
|
|
98
|
+
}
|
|
99
|
+
// =============================================================================
|
|
100
|
+
// Helpers
|
|
101
|
+
// =============================================================================
|
|
102
|
+
function flattenCategories(categories) {
|
|
103
|
+
const result = [];
|
|
104
|
+
function flatten(items) {
|
|
105
|
+
items.forEach((item) => {
|
|
106
|
+
result.push(item);
|
|
107
|
+
if ('children' in item && Array.isArray(item.children) && item.children.length > 0) {
|
|
108
|
+
flatten(item.children);
|
|
109
|
+
}
|
|
110
|
+
});
|
|
111
|
+
}
|
|
112
|
+
flatten(categories);
|
|
113
|
+
return result;
|
|
114
|
+
}
|
|
115
|
+
//# sourceMappingURL=CategoryNav.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"CategoryNav.js","sourceRoot":"","sources":["../../../src/products/components/CategoryNav.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
import type { Category, Product } from '../../core/types';
|
|
2
|
+
export interface BreadcrumbItem {
|
|
3
|
+
label: string;
|
|
4
|
+
href?: string;
|
|
5
|
+
}
|
|
6
|
+
export interface ProductBreadcrumbProps {
|
|
7
|
+
/** Category path (from root to current) */
|
|
8
|
+
categories?: Category[];
|
|
9
|
+
/** Current product (optional, for product pages) */
|
|
10
|
+
product?: Product | null;
|
|
11
|
+
/** Custom className */
|
|
12
|
+
className?: string;
|
|
13
|
+
/** Show home link */
|
|
14
|
+
showHome?: boolean;
|
|
15
|
+
/** Home label */
|
|
16
|
+
homeLabel?: string;
|
|
17
|
+
/** Home href */
|
|
18
|
+
homeHref?: string;
|
|
19
|
+
/** Category href pattern */
|
|
20
|
+
categoryHrefPattern?: string;
|
|
21
|
+
/** Custom separator */
|
|
22
|
+
separator?: React.ReactNode;
|
|
23
|
+
/** Custom items (overrides categories/product) */
|
|
24
|
+
items?: BreadcrumbItem[];
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* ProductBreadcrumb component for navigation context.
|
|
28
|
+
*
|
|
29
|
+
* @example
|
|
30
|
+
* ```tsx
|
|
31
|
+
* import { ProductBreadcrumb, useCategories } from '@rovela/sdk/products'
|
|
32
|
+
*
|
|
33
|
+
* function ProductPage({ product, categorySlug }) {
|
|
34
|
+
* const { getBreadcrumb, getCategoryBySlug } = useCategories()
|
|
35
|
+
* const category = getCategoryBySlug(categorySlug)
|
|
36
|
+
* const categoryPath = category ? getBreadcrumb(category.id) : []
|
|
37
|
+
*
|
|
38
|
+
* return (
|
|
39
|
+
* <div>
|
|
40
|
+
* <ProductBreadcrumb
|
|
41
|
+
* categories={categoryPath}
|
|
42
|
+
* product={product}
|
|
43
|
+
* showHome
|
|
44
|
+
* />
|
|
45
|
+
* {// ... product content}
|
|
46
|
+
* </div>
|
|
47
|
+
* )
|
|
48
|
+
* }
|
|
49
|
+
* ```
|
|
50
|
+
*/
|
|
51
|
+
export declare function ProductBreadcrumb({ categories, product, className, showHome, homeLabel, homeHref, categoryHrefPattern, separator, items: customItems, }: ProductBreadcrumbProps): import("react/jsx-runtime").JSX.Element;
|
|
52
|
+
//# sourceMappingURL=ProductBreadcrumb.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ProductBreadcrumb.d.ts","sourceRoot":"","sources":["../../../src/products/components/ProductBreadcrumb.tsx"],"names":[],"mappings":"AAUA,OAAO,KAAK,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,kBAAkB,CAAA;AAMzD,MAAM,WAAW,cAAc;IAC7B,KAAK,EAAE,MAAM,CAAA;IACb,IAAI,CAAC,EAAE,MAAM,CAAA;CACd;AAED,MAAM,WAAW,sBAAsB;IACrC,2CAA2C;IAC3C,UAAU,CAAC,EAAE,QAAQ,EAAE,CAAA;IACvB,oDAAoD;IACpD,OAAO,CAAC,EAAE,OAAO,GAAG,IAAI,CAAA;IACxB,uBAAuB;IACvB,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,qBAAqB;IACrB,QAAQ,CAAC,EAAE,OAAO,CAAA;IAClB,iBAAiB;IACjB,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,gBAAgB;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,4BAA4B;IAC5B,mBAAmB,CAAC,EAAE,MAAM,CAAA;IAC5B,uBAAuB;IACvB,SAAS,CAAC,EAAE,KAAK,CAAC,SAAS,CAAA;IAC3B,kDAAkD;IAClD,KAAK,CAAC,EAAE,cAAc,EAAE,CAAA;CACzB;AAMD;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,wBAAgB,iBAAiB,CAAC,EAChC,UAAe,EACf,OAAO,EACP,SAAS,EACT,QAAe,EACf,SAAkB,EAClB,QAAc,EACd,mBAA0C,EAC1C,SAAS,EACT,KAAK,EAAE,WAAW,GACnB,EAAE,sBAAsB,2CAwFxB"}
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
'use client';
|
|
3
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
4
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
5
|
+
};
|
|
6
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
7
|
+
exports.ProductBreadcrumb = ProductBreadcrumb;
|
|
8
|
+
const jsx_runtime_1 = require("react/jsx-runtime");
|
|
9
|
+
/**
|
|
10
|
+
* @rovela/sdk/products/components/ProductBreadcrumb
|
|
11
|
+
*
|
|
12
|
+
* Breadcrumb navigation for product and category pages.
|
|
13
|
+
*/
|
|
14
|
+
const link_1 = __importDefault(require("next/link"));
|
|
15
|
+
const utils_1 = require("../../core/utils");
|
|
16
|
+
// =============================================================================
|
|
17
|
+
// Component
|
|
18
|
+
// =============================================================================
|
|
19
|
+
/**
|
|
20
|
+
* ProductBreadcrumb component for navigation context.
|
|
21
|
+
*
|
|
22
|
+
* @example
|
|
23
|
+
* ```tsx
|
|
24
|
+
* import { ProductBreadcrumb, useCategories } from '@rovela/sdk/products'
|
|
25
|
+
*
|
|
26
|
+
* function ProductPage({ product, categorySlug }) {
|
|
27
|
+
* const { getBreadcrumb, getCategoryBySlug } = useCategories()
|
|
28
|
+
* const category = getCategoryBySlug(categorySlug)
|
|
29
|
+
* const categoryPath = category ? getBreadcrumb(category.id) : []
|
|
30
|
+
*
|
|
31
|
+
* return (
|
|
32
|
+
* <div>
|
|
33
|
+
* <ProductBreadcrumb
|
|
34
|
+
* categories={categoryPath}
|
|
35
|
+
* product={product}
|
|
36
|
+
* showHome
|
|
37
|
+
* />
|
|
38
|
+
* {// ... product content}
|
|
39
|
+
* </div>
|
|
40
|
+
* )
|
|
41
|
+
* }
|
|
42
|
+
* ```
|
|
43
|
+
*/
|
|
44
|
+
function ProductBreadcrumb({ categories = [], product, className, showHome = true, homeLabel = 'Home', homeHref = '/', categoryHrefPattern = '/categories/[slug]', separator, items: customItems, }) {
|
|
45
|
+
// Build breadcrumb items
|
|
46
|
+
const items = [];
|
|
47
|
+
if (customItems) {
|
|
48
|
+
// Use custom items if provided
|
|
49
|
+
items.push(...customItems);
|
|
50
|
+
}
|
|
51
|
+
else {
|
|
52
|
+
// Build from categories and product
|
|
53
|
+
if (showHome) {
|
|
54
|
+
items.push({ label: homeLabel, href: homeHref });
|
|
55
|
+
}
|
|
56
|
+
// Add "Shop" or "Products" link
|
|
57
|
+
items.push({ label: 'Products', href: '/products' });
|
|
58
|
+
// Add category path
|
|
59
|
+
categories.forEach((category) => {
|
|
60
|
+
items.push({
|
|
61
|
+
label: category.name,
|
|
62
|
+
href: categoryHrefPattern.replace('[slug]', category.slug),
|
|
63
|
+
});
|
|
64
|
+
});
|
|
65
|
+
// Add product (no link, it's the current page)
|
|
66
|
+
if (product) {
|
|
67
|
+
items.push({ label: product.name });
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
const defaultSeparator = ((0, jsx_runtime_1.jsx)("svg", { className: "h-4 w-4 flex-shrink-0 text-muted-foreground", fill: "none", stroke: "currentColor", viewBox: "0 0 24 24", children: (0, jsx_runtime_1.jsx)("path", { strokeLinecap: "round", strokeLinejoin: "round", strokeWidth: 2, d: "M9 5l7 7-7 7" }) }));
|
|
71
|
+
return ((0, jsx_runtime_1.jsx)("nav", { className: (0, utils_1.cn)('flex items-center text-sm', className), "aria-label": "Breadcrumb", children: (0, jsx_runtime_1.jsx)("ol", { className: "flex flex-wrap items-center gap-1.5", children: items.map((item, index) => {
|
|
72
|
+
const isLast = index === items.length - 1;
|
|
73
|
+
return ((0, jsx_runtime_1.jsxs)("li", { className: "flex items-center gap-1.5", children: [index > 0 && ((0, jsx_runtime_1.jsx)("span", { className: "flex-shrink-0", "aria-hidden": "true", children: separator || defaultSeparator })), item.href && !isLast ? ((0, jsx_runtime_1.jsx)(link_1.default, { href: item.href, className: "text-muted-foreground transition-colors hover:text-foreground", children: item.label })) : ((0, jsx_runtime_1.jsx)("span", { className: (0, utils_1.cn)(isLast
|
|
74
|
+
? 'font-medium text-foreground'
|
|
75
|
+
: 'text-muted-foreground'), "aria-current": isLast ? 'page' : undefined, children: item.label }))] }, index));
|
|
76
|
+
}) }) }));
|
|
77
|
+
}
|
|
78
|
+
//# sourceMappingURL=ProductBreadcrumb.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ProductBreadcrumb.js","sourceRoot":"","sources":["../../../src/products/components/ProductBreadcrumb.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @rovela/sdk/products/components/ProductCard
|
|
3
|
+
*
|
|
4
|
+
* Product card component for catalog display.
|
|
5
|
+
*/
|
|
6
|
+
import { type ReactNode } from 'react';
|
|
7
|
+
import type { Product } from '../../core/types';
|
|
8
|
+
export interface ProductCardProps {
|
|
9
|
+
/** Product data */
|
|
10
|
+
product: Product;
|
|
11
|
+
/** Show quick add button */
|
|
12
|
+
showQuickAdd?: boolean;
|
|
13
|
+
/** Quick add handler */
|
|
14
|
+
onQuickAdd?: (product: Product) => void;
|
|
15
|
+
/** Image aspect ratio */
|
|
16
|
+
imageAspect?: 'square' | 'portrait' | 'landscape';
|
|
17
|
+
/** Custom className */
|
|
18
|
+
className?: string;
|
|
19
|
+
/** Currency for price formatting */
|
|
20
|
+
currency?: string;
|
|
21
|
+
/** Locale for price formatting */
|
|
22
|
+
locale?: string;
|
|
23
|
+
/** Custom quick add button content */
|
|
24
|
+
quickAddContent?: ReactNode;
|
|
25
|
+
/** Link href pattern (default: /products/[slug]) */
|
|
26
|
+
href?: string;
|
|
27
|
+
/** Show discount badge */
|
|
28
|
+
showDiscount?: boolean;
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* ProductCard component for displaying products in a grid.
|
|
32
|
+
*
|
|
33
|
+
* @example
|
|
34
|
+
* ```tsx
|
|
35
|
+
* import { ProductCard } from '@rovela/sdk/products'
|
|
36
|
+
*
|
|
37
|
+
* function ProductGrid({ products }) {
|
|
38
|
+
* return (
|
|
39
|
+
* <div className="grid grid-cols-3 gap-4">
|
|
40
|
+
* {products.map(product => (
|
|
41
|
+
* <ProductCard
|
|
42
|
+
* key={product.id}
|
|
43
|
+
* product={product}
|
|
44
|
+
* showQuickAdd
|
|
45
|
+
* onQuickAdd={handleQuickAdd}
|
|
46
|
+
* />
|
|
47
|
+
* ))}
|
|
48
|
+
* </div>
|
|
49
|
+
* )
|
|
50
|
+
* }
|
|
51
|
+
* ```
|
|
52
|
+
*/
|
|
53
|
+
export declare function ProductCard({ product, showQuickAdd, onQuickAdd, imageAspect, className, currency, locale, quickAddContent, href, showDiscount, }: ProductCardProps): import("react/jsx-runtime").JSX.Element;
|
|
54
|
+
//# sourceMappingURL=ProductCard.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ProductCard.d.ts","sourceRoot":"","sources":["../../../src/products/components/ProductCard.tsx"],"names":[],"mappings":"AAEA;;;;GAIG;AAEH,OAAO,EAAE,KAAK,SAAS,EAAE,MAAM,OAAO,CAAA;AAItC,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,kBAAkB,CAAA;AAM/C,MAAM,WAAW,gBAAgB;IAC/B,mBAAmB;IACnB,OAAO,EAAE,OAAO,CAAA;IAChB,4BAA4B;IAC5B,YAAY,CAAC,EAAE,OAAO,CAAA;IACtB,wBAAwB;IACxB,UAAU,CAAC,EAAE,CAAC,OAAO,EAAE,OAAO,KAAK,IAAI,CAAA;IACvC,yBAAyB;IACzB,WAAW,CAAC,EAAE,QAAQ,GAAG,UAAU,GAAG,WAAW,CAAA;IACjD,uBAAuB;IACvB,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,oCAAoC;IACpC,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,kCAAkC;IAClC,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,sCAAsC;IACtC,eAAe,CAAC,EAAE,SAAS,CAAA;IAC3B,oDAAoD;IACpD,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,0BAA0B;IAC1B,YAAY,CAAC,EAAE,OAAO,CAAA;CACvB;AAMD;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,wBAAgB,WAAW,CAAC,EAC1B,OAAO,EACP,YAAoB,EACpB,UAAU,EACV,WAAsB,EACtB,SAAS,EACT,QAAgB,EAChB,MAAgB,EAChB,eAAe,EACf,IAAI,EACJ,YAAmB,GACpB,EAAE,gBAAgB,2CAqHlB"}
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
'use client';
|
|
3
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
4
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
5
|
+
};
|
|
6
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
7
|
+
exports.ProductCard = ProductCard;
|
|
8
|
+
const jsx_runtime_1 = require("react/jsx-runtime");
|
|
9
|
+
const image_1 = __importDefault(require("next/image"));
|
|
10
|
+
const link_1 = __importDefault(require("next/link"));
|
|
11
|
+
const utils_1 = require("../../core/utils");
|
|
12
|
+
// =============================================================================
|
|
13
|
+
// Component
|
|
14
|
+
// =============================================================================
|
|
15
|
+
/**
|
|
16
|
+
* ProductCard component for displaying products in a grid.
|
|
17
|
+
*
|
|
18
|
+
* @example
|
|
19
|
+
* ```tsx
|
|
20
|
+
* import { ProductCard } from '@rovela/sdk/products'
|
|
21
|
+
*
|
|
22
|
+
* function ProductGrid({ products }) {
|
|
23
|
+
* return (
|
|
24
|
+
* <div className="grid grid-cols-3 gap-4">
|
|
25
|
+
* {products.map(product => (
|
|
26
|
+
* <ProductCard
|
|
27
|
+
* key={product.id}
|
|
28
|
+
* product={product}
|
|
29
|
+
* showQuickAdd
|
|
30
|
+
* onQuickAdd={handleQuickAdd}
|
|
31
|
+
* />
|
|
32
|
+
* ))}
|
|
33
|
+
* </div>
|
|
34
|
+
* )
|
|
35
|
+
* }
|
|
36
|
+
* ```
|
|
37
|
+
*/
|
|
38
|
+
function ProductCard({ product, showQuickAdd = false, onQuickAdd, imageAspect = 'square', className, currency = 'USD', locale = 'en-US', quickAddContent, href, showDiscount = true, }) {
|
|
39
|
+
const aspectClasses = {
|
|
40
|
+
square: 'aspect-square',
|
|
41
|
+
portrait: 'aspect-[3/4]',
|
|
42
|
+
landscape: 'aspect-[4/3]',
|
|
43
|
+
};
|
|
44
|
+
const productHref = href || `/products/${product.slug}`;
|
|
45
|
+
const mainImage = product.images?.[0];
|
|
46
|
+
// Calculate discount percentage
|
|
47
|
+
const price = typeof product.price === 'string'
|
|
48
|
+
? parseFloat(product.price)
|
|
49
|
+
: product.price;
|
|
50
|
+
const comparePrice = product.comparePrice
|
|
51
|
+
? typeof product.comparePrice === 'string'
|
|
52
|
+
? parseFloat(product.comparePrice)
|
|
53
|
+
: product.comparePrice
|
|
54
|
+
: null;
|
|
55
|
+
const discountPercent = comparePrice && comparePrice > price
|
|
56
|
+
? Math.round(((comparePrice - price) / comparePrice) * 100)
|
|
57
|
+
: null;
|
|
58
|
+
const handleQuickAdd = (e) => {
|
|
59
|
+
e.preventDefault();
|
|
60
|
+
e.stopPropagation();
|
|
61
|
+
onQuickAdd?.(product);
|
|
62
|
+
};
|
|
63
|
+
return ((0, jsx_runtime_1.jsxs)("article", { className: (0, utils_1.cn)('group relative flex flex-col overflow-hidden rounded-lg border bg-card text-card-foreground transition-shadow hover:shadow-md', className), children: [(0, jsx_runtime_1.jsx)(link_1.default, { href: productHref, className: "relative block overflow-hidden", children: (0, jsx_runtime_1.jsxs)("div", { className: (0, utils_1.cn)('relative w-full bg-muted', aspectClasses[imageAspect]), children: [mainImage ? ((0, jsx_runtime_1.jsx)(image_1.default, { src: mainImage, alt: product.name, fill: true, sizes: "(max-width: 640px) 100vw, (max-width: 1024px) 50vw, 33vw", className: "object-cover transition-transform duration-300 group-hover:scale-105" })) : ((0, jsx_runtime_1.jsx)("div", { className: "absolute inset-0 flex items-center justify-center text-muted-foreground", children: (0, jsx_runtime_1.jsx)("svg", { className: "h-12 w-12", fill: "none", stroke: "currentColor", viewBox: "0 0 24 24", children: (0, jsx_runtime_1.jsx)("path", { strokeLinecap: "round", strokeLinejoin: "round", strokeWidth: 1, d: "M4 16l4.586-4.586a2 2 0 012.828 0L16 16m-2-2l1.586-1.586a2 2 0 012.828 0L20 14m-6-6h.01M6 20h12a2 2 0 002-2V6a2 2 0 00-2-2H6a2 2 0 00-2 2v12a2 2 0 002 2z" }) }) })), showDiscount && discountPercent && ((0, jsx_runtime_1.jsxs)("span", { className: "absolute left-2 top-2 rounded-full bg-destructive px-2 py-0.5 text-xs font-medium text-destructive-foreground", children: ["-", discountPercent, "%"] })), showQuickAdd && ((0, jsx_runtime_1.jsx)("div", { className: "absolute inset-x-0 bottom-0 translate-y-full bg-gradient-to-t from-black/60 to-transparent p-4 opacity-0 transition-all duration-200 group-hover:translate-y-0 group-hover:opacity-100", children: (0, jsx_runtime_1.jsx)("button", { onClick: handleQuickAdd, className: "w-full rounded-md bg-primary px-4 py-2 text-sm font-medium text-primary-foreground transition-colors hover:bg-primary/90", children: quickAddContent || 'Quick Add' }) }))] }) }), (0, jsx_runtime_1.jsxs)("div", { className: "flex flex-1 flex-col p-4", children: [(0, jsx_runtime_1.jsx)(link_1.default, { href: productHref, className: "flex-1", children: (0, jsx_runtime_1.jsx)("h3", { className: "line-clamp-2 font-medium text-foreground transition-colors hover:text-primary", children: product.name }) }), (0, jsx_runtime_1.jsxs)("div", { className: "mt-2 flex items-baseline gap-2", children: [(0, jsx_runtime_1.jsx)("span", { className: "text-lg font-semibold text-foreground", children: (0, utils_1.formatPrice)(price, { currency, locale }) }), comparePrice && comparePrice > price && ((0, jsx_runtime_1.jsx)("span", { className: "text-sm text-muted-foreground line-through", children: (0, utils_1.formatPrice)(comparePrice, { currency, locale }) }))] }), product.hasVariants && ((0, jsx_runtime_1.jsx)("p", { className: "mt-1 text-xs text-muted-foreground", children: "Multiple options available" }))] })] }));
|
|
64
|
+
}
|
|
65
|
+
//# sourceMappingURL=ProductCard.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ProductCard.js","sourceRoot":"","sources":["../../../src/products/components/ProductCard.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @rovela/sdk/products/components/ProductDetails
|
|
3
|
+
*
|
|
4
|
+
* Full product details component for product pages.
|
|
5
|
+
*/
|
|
6
|
+
import { type ReactNode } from 'react';
|
|
7
|
+
import type { Product, ProductVariant } from '../../core/types';
|
|
8
|
+
export interface ProductDetailsProps {
|
|
9
|
+
/** Product data */
|
|
10
|
+
product: Product;
|
|
11
|
+
/** Product variants */
|
|
12
|
+
variants?: ProductVariant[];
|
|
13
|
+
/** Custom className */
|
|
14
|
+
className?: string;
|
|
15
|
+
/** Currency for price formatting */
|
|
16
|
+
currency?: string;
|
|
17
|
+
/** Locale for price formatting */
|
|
18
|
+
locale?: string;
|
|
19
|
+
/** Add to cart handler */
|
|
20
|
+
onAddToCart?: (product: Product, variant: ProductVariant | null, quantity: number) => void;
|
|
21
|
+
/** Buy now handler */
|
|
22
|
+
onBuyNow?: (product: Product, variant: ProductVariant | null, quantity: number) => void;
|
|
23
|
+
/** Custom add to cart button content */
|
|
24
|
+
addToCartContent?: ReactNode;
|
|
25
|
+
/** Custom buy now button content */
|
|
26
|
+
buyNowContent?: ReactNode;
|
|
27
|
+
/** Show buy now button */
|
|
28
|
+
showBuyNow?: boolean;
|
|
29
|
+
/** Show quantity selector */
|
|
30
|
+
showQuantity?: boolean;
|
|
31
|
+
/** Maximum quantity allowed */
|
|
32
|
+
maxQuantity?: number;
|
|
33
|
+
/** Show stock status */
|
|
34
|
+
showStock?: boolean;
|
|
35
|
+
/** Show variant selector labels */
|
|
36
|
+
variantLabels?: Record<string, string>;
|
|
37
|
+
/** Gallery position */
|
|
38
|
+
galleryPosition?: 'left' | 'top';
|
|
39
|
+
/** Children rendered after description */
|
|
40
|
+
children?: ReactNode;
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* ProductDetails component for product pages.
|
|
44
|
+
*
|
|
45
|
+
* @example
|
|
46
|
+
* ```tsx
|
|
47
|
+
* import { ProductDetails } from '@rovela/sdk/products'
|
|
48
|
+
*
|
|
49
|
+
* function ProductPage({ product, variants }) {
|
|
50
|
+
* return (
|
|
51
|
+
* <ProductDetails
|
|
52
|
+
* product={product}
|
|
53
|
+
* variants={variants}
|
|
54
|
+
* onAddToCart={handleAddToCart}
|
|
55
|
+
* showBuyNow
|
|
56
|
+
* showStock
|
|
57
|
+
* />
|
|
58
|
+
* )
|
|
59
|
+
* }
|
|
60
|
+
* ```
|
|
61
|
+
*/
|
|
62
|
+
export declare function ProductDetails({ product, variants, className, currency, locale, onAddToCart, onBuyNow, addToCartContent, buyNowContent, showBuyNow, showQuantity, maxQuantity, showStock, variantLabels, galleryPosition, children, }: ProductDetailsProps): import("react/jsx-runtime").JSX.Element;
|
|
63
|
+
//# sourceMappingURL=ProductDetails.d.ts.map
|