@rovela-ai/sdk 0.1.0 → 0.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (577) hide show
  1. package/dist/admin/api/auth.d.ts +32 -0
  2. package/dist/admin/api/auth.d.ts.map +1 -0
  3. package/dist/admin/api/auth.js +43 -0
  4. package/dist/admin/api/auth.js.map +1 -0
  5. package/dist/admin/api/categories.d.ts +68 -0
  6. package/dist/admin/api/categories.d.ts.map +1 -0
  7. package/dist/admin/api/categories.js +247 -0
  8. package/dist/admin/api/categories.js.map +1 -0
  9. package/dist/admin/api/customers.d.ts +41 -0
  10. package/dist/admin/api/customers.d.ts.map +1 -0
  11. package/dist/admin/api/customers.js +113 -0
  12. package/dist/admin/api/customers.js.map +1 -0
  13. package/dist/admin/api/index.d.ts +56 -0
  14. package/dist/admin/api/index.d.ts.map +1 -0
  15. package/dist/admin/api/index.js +87 -0
  16. package/dist/admin/api/index.js.map +1 -0
  17. package/dist/admin/api/orders.d.ts +59 -0
  18. package/dist/admin/api/orders.d.ts.map +1 -0
  19. package/dist/admin/api/orders.js +209 -0
  20. package/dist/admin/api/orders.js.map +1 -0
  21. package/dist/admin/api/products.d.ts +103 -0
  22. package/dist/admin/api/products.d.ts.map +1 -0
  23. package/dist/admin/api/products.js +329 -0
  24. package/dist/admin/api/products.js.map +1 -0
  25. package/dist/admin/api/refund.d.ts +29 -0
  26. package/dist/admin/api/refund.d.ts.map +1 -0
  27. package/dist/admin/api/refund.js +136 -0
  28. package/dist/admin/api/refund.js.map +1 -0
  29. package/dist/admin/api/stats.d.ts +40 -0
  30. package/dist/admin/api/stats.d.ts.map +1 -0
  31. package/dist/admin/api/stats.js +74 -0
  32. package/dist/admin/api/stats.js.map +1 -0
  33. package/dist/admin/components/AdminGuard.d.ts +40 -0
  34. package/dist/admin/components/AdminGuard.d.ts.map +1 -0
  35. package/dist/admin/components/AdminGuard.js +97 -0
  36. package/dist/admin/components/AdminGuard.js.map +1 -0
  37. package/dist/admin/components/AdminHeader.d.ts +18 -0
  38. package/dist/admin/components/AdminHeader.d.ts.map +1 -0
  39. package/dist/admin/components/AdminHeader.js +33 -0
  40. package/dist/admin/components/AdminHeader.js.map +1 -0
  41. package/dist/admin/components/AdminLayout.d.ts +50 -0
  42. package/dist/admin/components/AdminLayout.d.ts.map +1 -0
  43. package/dist/admin/components/AdminLayout.js +46 -0
  44. package/dist/admin/components/AdminLayout.js.map +1 -0
  45. package/dist/admin/components/AdminLoginForm.d.ts +18 -0
  46. package/dist/admin/components/AdminLoginForm.d.ts.map +1 -0
  47. package/dist/admin/components/AdminLoginForm.js +58 -0
  48. package/dist/admin/components/AdminLoginForm.js.map +1 -0
  49. package/dist/admin/components/AdminNav.d.ts +34 -0
  50. package/dist/admin/components/AdminNav.d.ts.map +1 -0
  51. package/dist/admin/components/AdminNav.js +61 -0
  52. package/dist/admin/components/AdminNav.js.map +1 -0
  53. package/dist/admin/components/InventoryEditor.d.ts +15 -0
  54. package/dist/admin/components/InventoryEditor.d.ts.map +1 -0
  55. package/dist/admin/components/InventoryEditor.js +83 -0
  56. package/dist/admin/components/InventoryEditor.js.map +1 -0
  57. package/dist/admin/components/LowStockAlert.d.ts +11 -0
  58. package/dist/admin/components/LowStockAlert.d.ts.map +1 -0
  59. package/dist/admin/components/LowStockAlert.js +35 -0
  60. package/dist/admin/components/LowStockAlert.js.map +1 -0
  61. package/dist/admin/components/OrderDetails.d.ts +14 -0
  62. package/dist/admin/components/OrderDetails.d.ts.map +1 -0
  63. package/dist/admin/components/OrderDetails.js +94 -0
  64. package/dist/admin/components/OrderDetails.js.map +1 -0
  65. package/dist/admin/components/OrderTable.d.ts +13 -0
  66. package/dist/admin/components/OrderTable.d.ts.map +1 -0
  67. package/dist/admin/components/OrderTable.js +89 -0
  68. package/dist/admin/components/OrderTable.js.map +1 -0
  69. package/dist/admin/components/ProductForm.d.ts +18 -0
  70. package/dist/admin/components/ProductForm.d.ts.map +1 -0
  71. package/dist/admin/components/ProductForm.js +127 -0
  72. package/dist/admin/components/ProductForm.js.map +1 -0
  73. package/dist/admin/components/ProductTable.d.ts +13 -0
  74. package/dist/admin/components/ProductTable.d.ts.map +1 -0
  75. package/dist/admin/components/ProductTable.js +81 -0
  76. package/dist/admin/components/ProductTable.js.map +1 -0
  77. package/dist/admin/components/RecentOrders.d.ts +11 -0
  78. package/dist/admin/components/RecentOrders.d.ts.map +1 -0
  79. package/dist/admin/components/RecentOrders.js +58 -0
  80. package/dist/admin/components/RecentOrders.js.map +1 -0
  81. package/dist/admin/components/RefundDialog.d.ts +17 -0
  82. package/dist/admin/components/RefundDialog.d.ts.map +1 -0
  83. package/dist/admin/components/RefundDialog.js +86 -0
  84. package/dist/admin/components/RefundDialog.js.map +1 -0
  85. package/dist/admin/components/StatsCards.d.ts +23 -0
  86. package/dist/admin/components/StatsCards.d.ts.map +1 -0
  87. package/dist/admin/components/StatsCards.js +82 -0
  88. package/dist/admin/components/StatsCards.js.map +1 -0
  89. package/dist/admin/components/StoreSettings.d.ts +14 -0
  90. package/dist/admin/components/StoreSettings.d.ts.map +1 -0
  91. package/dist/admin/components/StoreSettings.js +88 -0
  92. package/dist/admin/components/StoreSettings.js.map +1 -0
  93. package/dist/admin/components/index.d.ts +21 -0
  94. package/dist/admin/components/index.d.ts.map +1 -0
  95. package/dist/admin/components/index.js +57 -0
  96. package/dist/admin/components/index.js.map +1 -0
  97. package/dist/admin/config.d.ts +74 -0
  98. package/dist/admin/config.d.ts.map +1 -0
  99. package/dist/admin/config.js +229 -0
  100. package/dist/admin/config.js.map +1 -0
  101. package/dist/admin/hooks/index.d.ts +10 -0
  102. package/dist/admin/hooks/index.d.ts.map +1 -0
  103. package/dist/admin/hooks/index.js +17 -0
  104. package/dist/admin/hooks/index.js.map +1 -0
  105. package/dist/admin/hooks/useAdminAuth.d.ts +36 -0
  106. package/dist/admin/hooks/useAdminAuth.d.ts.map +1 -0
  107. package/dist/admin/hooks/useAdminAuth.js +115 -0
  108. package/dist/admin/hooks/useAdminAuth.js.map +1 -0
  109. package/dist/admin/hooks/useAdminOrders.d.ts +41 -0
  110. package/dist/admin/hooks/useAdminOrders.d.ts.map +1 -0
  111. package/dist/admin/hooks/useAdminOrders.js +191 -0
  112. package/dist/admin/hooks/useAdminOrders.js.map +1 -0
  113. package/dist/admin/hooks/useAdminProducts.d.ts +39 -0
  114. package/dist/admin/hooks/useAdminProducts.d.ts.map +1 -0
  115. package/dist/admin/hooks/useAdminProducts.js +235 -0
  116. package/dist/admin/hooks/useAdminProducts.js.map +1 -0
  117. package/dist/admin/hooks/useAdminStats.d.ts +50 -0
  118. package/dist/admin/hooks/useAdminStats.d.ts.map +1 -0
  119. package/dist/admin/hooks/useAdminStats.js +111 -0
  120. package/dist/admin/hooks/useAdminStats.js.map +1 -0
  121. package/dist/admin/index.d.ts +63 -0
  122. package/dist/admin/index.d.ts.map +1 -0
  123. package/dist/admin/index.js +148 -0
  124. package/dist/admin/index.js.map +1 -0
  125. package/dist/admin/server/admin-service.d.ts +130 -0
  126. package/dist/admin/server/admin-service.d.ts.map +1 -0
  127. package/dist/admin/server/admin-service.js +298 -0
  128. package/dist/admin/server/admin-service.js.map +1 -0
  129. package/dist/admin/server/index.d.ts +8 -0
  130. package/dist/admin/server/index.d.ts.map +1 -0
  131. package/dist/admin/server/index.js +25 -0
  132. package/dist/admin/server/index.js.map +1 -0
  133. package/dist/admin/types.d.ts +549 -0
  134. package/dist/admin/types.d.ts.map +1 -0
  135. package/dist/admin/types.js +11 -0
  136. package/dist/admin/types.js.map +1 -0
  137. package/dist/auth/api/auth.d.ts +54 -0
  138. package/dist/auth/api/auth.d.ts.map +1 -0
  139. package/dist/auth/api/auth.js +67 -0
  140. package/dist/auth/api/auth.js.map +1 -0
  141. package/dist/auth/api/forgot-password.d.ts +41 -0
  142. package/dist/auth/api/forgot-password.d.ts.map +1 -0
  143. package/dist/auth/api/forgot-password.js +68 -0
  144. package/dist/auth/api/forgot-password.js.map +1 -0
  145. package/dist/auth/api/index.d.ts +34 -0
  146. package/dist/auth/api/index.d.ts.map +1 -0
  147. package/dist/auth/api/index.js +52 -0
  148. package/dist/auth/api/index.js.map +1 -0
  149. package/dist/auth/api/register.d.ts +41 -0
  150. package/dist/auth/api/register.d.ts.map +1 -0
  151. package/dist/auth/api/register.js +93 -0
  152. package/dist/auth/api/register.js.map +1 -0
  153. package/dist/auth/api/resend-verification.d.ts +41 -0
  154. package/dist/auth/api/resend-verification.d.ts.map +1 -0
  155. package/dist/auth/api/resend-verification.js +71 -0
  156. package/dist/auth/api/resend-verification.js.map +1 -0
  157. package/dist/auth/api/reset-password.d.ts +67 -0
  158. package/dist/auth/api/reset-password.d.ts.map +1 -0
  159. package/dist/auth/api/reset-password.js +110 -0
  160. package/dist/auth/api/reset-password.js.map +1 -0
  161. package/dist/auth/api/verify-email.d.ts +47 -0
  162. package/dist/auth/api/verify-email.d.ts.map +1 -0
  163. package/dist/auth/api/verify-email.js +94 -0
  164. package/dist/auth/api/verify-email.js.map +1 -0
  165. package/dist/auth/components/AuthGuard.d.ts +52 -0
  166. package/dist/auth/components/AuthGuard.d.ts.map +1 -0
  167. package/dist/auth/components/AuthGuard.js +113 -0
  168. package/dist/auth/components/AuthGuard.js.map +1 -0
  169. package/dist/auth/components/ForgotPasswordForm.d.ts +15 -0
  170. package/dist/auth/components/ForgotPasswordForm.d.ts.map +1 -0
  171. package/dist/auth/components/ForgotPasswordForm.js +44 -0
  172. package/dist/auth/components/ForgotPasswordForm.js.map +1 -0
  173. package/dist/auth/components/ResetPasswordForm.d.ts +18 -0
  174. package/dist/auth/components/ResetPasswordForm.d.ts.map +1 -0
  175. package/dist/auth/components/ResetPasswordForm.js +88 -0
  176. package/dist/auth/components/ResetPasswordForm.js.map +1 -0
  177. package/dist/auth/components/SignInForm.d.ts +21 -0
  178. package/dist/auth/components/SignInForm.d.ts.map +1 -0
  179. package/dist/auth/components/SignInForm.js +63 -0
  180. package/dist/auth/components/SignInForm.js.map +1 -0
  181. package/dist/auth/components/SignUpForm.d.ts +18 -0
  182. package/dist/auth/components/SignUpForm.d.ts.map +1 -0
  183. package/dist/auth/components/SignUpForm.js +79 -0
  184. package/dist/auth/components/SignUpForm.js.map +1 -0
  185. package/dist/auth/components/UserMenu.d.ts +18 -0
  186. package/dist/auth/components/UserMenu.d.ts.map +1 -0
  187. package/dist/auth/components/UserMenu.js +75 -0
  188. package/dist/auth/components/UserMenu.js.map +1 -0
  189. package/dist/auth/components/VerifyEmailNotice.d.ts +20 -0
  190. package/dist/auth/components/VerifyEmailNotice.d.ts.map +1 -0
  191. package/dist/auth/components/VerifyEmailNotice.js +59 -0
  192. package/dist/auth/components/VerifyEmailNotice.js.map +1 -0
  193. package/dist/auth/components/index.d.ts +13 -0
  194. package/dist/auth/components/index.d.ts.map +1 -0
  195. package/dist/auth/components/index.js +24 -0
  196. package/dist/auth/components/index.js.map +1 -0
  197. package/dist/auth/config.d.ts +42 -0
  198. package/dist/auth/config.d.ts.map +1 -0
  199. package/dist/auth/config.js +174 -0
  200. package/dist/auth/config.js.map +1 -0
  201. package/dist/auth/hooks/index.d.ts +7 -0
  202. package/dist/auth/hooks/index.d.ts.map +1 -0
  203. package/dist/auth/hooks/index.js +11 -0
  204. package/dist/auth/hooks/index.js.map +1 -0
  205. package/dist/auth/hooks/useAuth.d.ts +30 -0
  206. package/dist/auth/hooks/useAuth.d.ts.map +1 -0
  207. package/dist/auth/hooks/useAuth.js +248 -0
  208. package/dist/auth/hooks/useAuth.js.map +1 -0
  209. package/dist/auth/index.d.ts +54 -0
  210. package/dist/auth/index.d.ts.map +1 -0
  211. package/dist/auth/index.js +88 -0
  212. package/dist/auth/index.js.map +1 -0
  213. package/dist/auth/server/customer-service.d.ts +138 -0
  214. package/dist/auth/server/customer-service.d.ts.map +1 -0
  215. package/dist/auth/server/customer-service.js +309 -0
  216. package/dist/auth/server/customer-service.js.map +1 -0
  217. package/dist/auth/server/email-sender.d.ts +64 -0
  218. package/dist/auth/server/email-sender.d.ts.map +1 -0
  219. package/dist/auth/server/email-sender.js +112 -0
  220. package/dist/auth/server/email-sender.js.map +1 -0
  221. package/dist/auth/server/index.d.ts +13 -0
  222. package/dist/auth/server/index.d.ts.map +1 -0
  223. package/dist/auth/server/index.js +48 -0
  224. package/dist/auth/server/index.js.map +1 -0
  225. package/dist/auth/server/password-reset-service.d.ts +86 -0
  226. package/dist/auth/server/password-reset-service.d.ts.map +1 -0
  227. package/dist/auth/server/password-reset-service.js +236 -0
  228. package/dist/auth/server/password-reset-service.js.map +1 -0
  229. package/dist/auth/server/password.d.ts +58 -0
  230. package/dist/auth/server/password.d.ts.map +1 -0
  231. package/dist/auth/server/password.js +94 -0
  232. package/dist/auth/server/password.js.map +1 -0
  233. package/dist/auth/server/verification-service.d.ts +87 -0
  234. package/dist/auth/server/verification-service.d.ts.map +1 -0
  235. package/dist/auth/server/verification-service.js +268 -0
  236. package/dist/auth/server/verification-service.js.map +1 -0
  237. package/dist/auth/types.d.ts +305 -0
  238. package/dist/auth/types.d.ts.map +1 -0
  239. package/dist/auth/types.js +8 -0
  240. package/dist/auth/types.js.map +1 -0
  241. package/dist/cart/CartProvider.d.ts +65 -0
  242. package/dist/cart/CartProvider.d.ts.map +1 -0
  243. package/dist/cart/CartProvider.js +101 -0
  244. package/dist/cart/CartProvider.js.map +1 -0
  245. package/dist/cart/components/AddToCartButton.d.ts +77 -0
  246. package/dist/cart/components/AddToCartButton.d.ts.map +1 -0
  247. package/dist/cart/components/AddToCartButton.js +124 -0
  248. package/dist/cart/components/AddToCartButton.js.map +1 -0
  249. package/dist/cart/components/CartDrawer.d.ts +71 -0
  250. package/dist/cart/components/CartDrawer.d.ts.map +1 -0
  251. package/dist/cart/components/CartDrawer.js +108 -0
  252. package/dist/cart/components/CartDrawer.js.map +1 -0
  253. package/dist/cart/components/CartIcon.d.ts +36 -0
  254. package/dist/cart/components/CartIcon.d.ts.map +1 -0
  255. package/dist/cart/components/CartIcon.js +70 -0
  256. package/dist/cart/components/CartIcon.js.map +1 -0
  257. package/dist/cart/components/CartItem.d.ts +52 -0
  258. package/dist/cart/components/CartItem.d.ts.map +1 -0
  259. package/dist/cart/components/CartItem.js +55 -0
  260. package/dist/cart/components/CartItem.js.map +1 -0
  261. package/dist/cart/components/CartSummary.d.ts +43 -0
  262. package/dist/cart/components/CartSummary.d.ts.map +1 -0
  263. package/dist/cart/components/CartSummary.js +58 -0
  264. package/dist/cart/components/CartSummary.js.map +1 -0
  265. package/dist/cart/components/QuantitySelector.d.ts +39 -0
  266. package/dist/cart/components/QuantitySelector.d.ts.map +1 -0
  267. package/dist/cart/components/QuantitySelector.js +87 -0
  268. package/dist/cart/components/QuantitySelector.js.map +1 -0
  269. package/dist/cart/components/index.d.ts +18 -0
  270. package/dist/cart/components/index.d.ts.map +1 -0
  271. package/dist/cart/components/index.js +21 -0
  272. package/dist/cart/components/index.js.map +1 -0
  273. package/dist/cart/index.d.ts +109 -0
  274. package/dist/cart/index.d.ts.map +1 -0
  275. package/dist/cart/index.js +129 -0
  276. package/dist/cart/index.js.map +1 -0
  277. package/dist/cart/store.d.ts +101 -0
  278. package/dist/cart/store.d.ts.map +1 -0
  279. package/dist/cart/store.js +207 -0
  280. package/dist/cart/store.js.map +1 -0
  281. package/dist/checkout/api/checkout.d.ts +31 -0
  282. package/dist/checkout/api/checkout.d.ts.map +1 -0
  283. package/dist/checkout/api/checkout.js +103 -0
  284. package/dist/checkout/api/checkout.js.map +1 -0
  285. package/dist/checkout/api/index.d.ts +8 -0
  286. package/dist/checkout/api/index.d.ts.map +1 -0
  287. package/dist/checkout/api/index.js +13 -0
  288. package/dist/checkout/api/index.js.map +1 -0
  289. package/dist/checkout/api/webhook.d.ts +30 -0
  290. package/dist/checkout/api/webhook.d.ts.map +1 -0
  291. package/dist/checkout/api/webhook.js +58 -0
  292. package/dist/checkout/api/webhook.js.map +1 -0
  293. package/dist/checkout/components/CheckoutButton.d.ts +44 -0
  294. package/dist/checkout/components/CheckoutButton.d.ts.map +1 -0
  295. package/dist/checkout/components/CheckoutButton.js +97 -0
  296. package/dist/checkout/components/CheckoutButton.js.map +1 -0
  297. package/dist/checkout/components/CheckoutSuccess.d.ts +29 -0
  298. package/dist/checkout/components/CheckoutSuccess.d.ts.map +1 -0
  299. package/dist/checkout/components/CheckoutSuccess.js +60 -0
  300. package/dist/checkout/components/CheckoutSuccess.js.map +1 -0
  301. package/dist/checkout/components/OrderSummary.d.ts +37 -0
  302. package/dist/checkout/components/OrderSummary.d.ts.map +1 -0
  303. package/dist/checkout/components/OrderSummary.js +70 -0
  304. package/dist/checkout/components/OrderSummary.js.map +1 -0
  305. package/dist/checkout/components/ShippingForm.d.ts +30 -0
  306. package/dist/checkout/components/ShippingForm.d.ts.map +1 -0
  307. package/dist/checkout/components/ShippingForm.js +125 -0
  308. package/dist/checkout/components/ShippingForm.js.map +1 -0
  309. package/dist/checkout/components/index.d.ts +10 -0
  310. package/dist/checkout/components/index.d.ts.map +1 -0
  311. package/dist/checkout/components/index.js +17 -0
  312. package/dist/checkout/components/index.js.map +1 -0
  313. package/dist/checkout/hooks/index.d.ts +7 -0
  314. package/dist/checkout/hooks/index.d.ts.map +1 -0
  315. package/dist/checkout/hooks/index.js +12 -0
  316. package/dist/checkout/hooks/index.js.map +1 -0
  317. package/dist/checkout/hooks/useCheckout.d.ts +61 -0
  318. package/dist/checkout/hooks/useCheckout.d.ts.map +1 -0
  319. package/dist/checkout/hooks/useCheckout.js +174 -0
  320. package/dist/checkout/hooks/useCheckout.js.map +1 -0
  321. package/dist/checkout/index.d.ts +111 -0
  322. package/dist/checkout/index.d.ts.map +1 -0
  323. package/dist/checkout/index.js +148 -0
  324. package/dist/checkout/index.js.map +1 -0
  325. package/dist/checkout/server/create-checkout-session.d.ts +69 -0
  326. package/dist/checkout/server/create-checkout-session.d.ts.map +1 -0
  327. package/dist/checkout/server/create-checkout-session.js +190 -0
  328. package/dist/checkout/server/create-checkout-session.js.map +1 -0
  329. package/dist/checkout/server/handle-webhook.d.ts +35 -0
  330. package/dist/checkout/server/handle-webhook.d.ts.map +1 -0
  331. package/dist/checkout/server/handle-webhook.js +279 -0
  332. package/dist/checkout/server/handle-webhook.js.map +1 -0
  333. package/dist/checkout/server/index.d.ts +10 -0
  334. package/dist/checkout/server/index.d.ts.map +1 -0
  335. package/dist/checkout/server/index.js +19 -0
  336. package/dist/checkout/server/index.js.map +1 -0
  337. package/dist/checkout/server/order-service.d.ts +43 -0
  338. package/dist/checkout/server/order-service.d.ts.map +1 -0
  339. package/dist/checkout/server/order-service.js +196 -0
  340. package/dist/checkout/server/order-service.js.map +1 -0
  341. package/dist/checkout/stripe/client.d.ts +72 -0
  342. package/dist/checkout/stripe/client.d.ts.map +1 -0
  343. package/dist/checkout/stripe/client.js +189 -0
  344. package/dist/checkout/stripe/client.js.map +1 -0
  345. package/dist/checkout/stripe/index.d.ts +7 -0
  346. package/dist/checkout/stripe/index.d.ts.map +1 -0
  347. package/dist/checkout/stripe/index.js +21 -0
  348. package/dist/checkout/stripe/index.js.map +1 -0
  349. package/dist/checkout/types.d.ts +263 -0
  350. package/dist/checkout/types.d.ts.map +1 -0
  351. package/dist/checkout/types.js +9 -0
  352. package/dist/checkout/types.js.map +1 -0
  353. package/dist/core/config.d.ts +296 -0
  354. package/dist/core/config.d.ts.map +1 -0
  355. package/dist/core/config.js +162 -0
  356. package/dist/core/config.js.map +1 -0
  357. package/dist/core/db/client.d.ts +69 -0
  358. package/dist/core/db/client.d.ts.map +1 -0
  359. package/dist/core/db/client.js +202 -0
  360. package/dist/core/db/client.js.map +1 -0
  361. package/dist/core/db/index.d.ts +11 -0
  362. package/dist/core/db/index.d.ts.map +1 -0
  363. package/dist/core/db/index.js +87 -0
  364. package/dist/core/db/index.js.map +1 -0
  365. package/dist/core/db/queries.d.ts +658 -0
  366. package/dist/core/db/queries.d.ts.map +1 -0
  367. package/dist/core/db/queries.js +735 -0
  368. package/dist/core/db/queries.js.map +1 -0
  369. package/dist/core/db/schema.d.ts +1628 -0
  370. package/dist/core/db/schema.d.ts.map +1 -0
  371. package/dist/core/db/schema.js +262 -0
  372. package/dist/core/db/schema.js.map +1 -0
  373. package/dist/core/index.d.ts +20 -0
  374. package/dist/core/index.d.ts.map +1 -0
  375. package/dist/core/index.js +71 -0
  376. package/dist/core/index.js.map +1 -0
  377. package/dist/core/server/index.d.ts +17 -0
  378. package/dist/core/server/index.d.ts.map +1 -0
  379. package/dist/core/server/index.js +68 -0
  380. package/dist/core/server/index.js.map +1 -0
  381. package/dist/core/types.d.ts +230 -0
  382. package/dist/core/types.d.ts.map +1 -0
  383. package/dist/core/types.js +9 -0
  384. package/dist/core/types.js.map +1 -0
  385. package/dist/core/utils.d.ts +153 -0
  386. package/dist/core/utils.d.ts.map +1 -0
  387. package/dist/core/utils.js +356 -0
  388. package/dist/core/utils.js.map +1 -0
  389. package/dist/emails/config.d.ts +42 -0
  390. package/dist/emails/config.d.ts.map +1 -0
  391. package/dist/emails/config.js +89 -0
  392. package/dist/emails/config.js.map +1 -0
  393. package/dist/emails/index.d.ts +85 -0
  394. package/dist/emails/index.d.ts.map +1 -0
  395. package/dist/emails/index.js +170 -0
  396. package/dist/emails/index.js.map +1 -0
  397. package/dist/emails/send/auth.d.ts +91 -0
  398. package/dist/emails/send/auth.d.ts.map +1 -0
  399. package/dist/emails/send/auth.js +132 -0
  400. package/dist/emails/send/auth.js.map +1 -0
  401. package/dist/emails/send/index.d.ts +10 -0
  402. package/dist/emails/send/index.d.ts.map +1 -0
  403. package/dist/emails/send/index.js +33 -0
  404. package/dist/emails/send/index.js.map +1 -0
  405. package/dist/emails/send/orders.d.ts +180 -0
  406. package/dist/emails/send/orders.d.ts.map +1 -0
  407. package/dist/emails/send/orders.js +259 -0
  408. package/dist/emails/send/orders.js.map +1 -0
  409. package/dist/emails/sender.d.ts +72 -0
  410. package/dist/emails/sender.d.ts.map +1 -0
  411. package/dist/emails/sender.js +118 -0
  412. package/dist/emails/sender.js.map +1 -0
  413. package/dist/emails/templates/base.d.ts +105 -0
  414. package/dist/emails/templates/base.d.ts.map +1 -0
  415. package/dist/emails/templates/base.js +291 -0
  416. package/dist/emails/templates/base.js.map +1 -0
  417. package/dist/emails/templates/email-verification.d.ts +28 -0
  418. package/dist/emails/templates/email-verification.d.ts.map +1 -0
  419. package/dist/emails/templates/email-verification.js +56 -0
  420. package/dist/emails/templates/email-verification.js.map +1 -0
  421. package/dist/emails/templates/index.d.ts +15 -0
  422. package/dist/emails/templates/index.d.ts.map +1 -0
  423. package/dist/emails/templates/index.js +58 -0
  424. package/dist/emails/templates/index.js.map +1 -0
  425. package/dist/emails/templates/order-cancelled.d.ts +30 -0
  426. package/dist/emails/templates/order-cancelled.d.ts.map +1 -0
  427. package/dist/emails/templates/order-cancelled.js +87 -0
  428. package/dist/emails/templates/order-cancelled.js.map +1 -0
  429. package/dist/emails/templates/order-confirmation.d.ts +36 -0
  430. package/dist/emails/templates/order-confirmation.d.ts.map +1 -0
  431. package/dist/emails/templates/order-confirmation.js +161 -0
  432. package/dist/emails/templates/order-confirmation.js.map +1 -0
  433. package/dist/emails/templates/order-delivered.d.ts +31 -0
  434. package/dist/emails/templates/order-delivered.d.ts.map +1 -0
  435. package/dist/emails/templates/order-delivered.js +95 -0
  436. package/dist/emails/templates/order-delivered.js.map +1 -0
  437. package/dist/emails/templates/order-shipped.d.ts +32 -0
  438. package/dist/emails/templates/order-shipped.d.ts.map +1 -0
  439. package/dist/emails/templates/order-shipped.js +87 -0
  440. package/dist/emails/templates/order-shipped.js.map +1 -0
  441. package/dist/emails/templates/password-reset.d.ts +27 -0
  442. package/dist/emails/templates/password-reset.d.ts.map +1 -0
  443. package/dist/emails/templates/password-reset.js +55 -0
  444. package/dist/emails/templates/password-reset.js.map +1 -0
  445. package/dist/emails/templates/refund-processed.d.ts +32 -0
  446. package/dist/emails/templates/refund-processed.d.ts.map +1 -0
  447. package/dist/emails/templates/refund-processed.js +96 -0
  448. package/dist/emails/templates/refund-processed.js.map +1 -0
  449. package/dist/emails/templates/welcome.d.ts +27 -0
  450. package/dist/emails/templates/welcome.d.ts.map +1 -0
  451. package/dist/emails/templates/welcome.js +56 -0
  452. package/dist/emails/templates/welcome.js.map +1 -0
  453. package/dist/emails/types.d.ts +202 -0
  454. package/dist/emails/types.d.ts.map +1 -0
  455. package/dist/emails/types.js +8 -0
  456. package/dist/emails/types.js.map +1 -0
  457. package/dist/emails/utils.d.ts +94 -0
  458. package/dist/emails/utils.d.ts.map +1 -0
  459. package/dist/emails/utils.js +229 -0
  460. package/dist/emails/utils.js.map +1 -0
  461. package/dist/index.d.ts +40 -0
  462. package/dist/index.d.ts.map +1 -0
  463. package/dist/index.js +225 -0
  464. package/dist/index.js.map +1 -0
  465. package/dist/products/api/categories.d.ts +29 -0
  466. package/dist/products/api/categories.d.ts.map +1 -0
  467. package/dist/products/api/categories.js +49 -0
  468. package/dist/products/api/categories.js.map +1 -0
  469. package/dist/products/api/index.d.ts +24 -0
  470. package/dist/products/api/index.d.ts.map +1 -0
  471. package/dist/products/api/index.js +30 -0
  472. package/dist/products/api/index.js.map +1 -0
  473. package/dist/products/api/product.d.ts +36 -0
  474. package/dist/products/api/product.d.ts.map +1 -0
  475. package/dist/products/api/product.js +70 -0
  476. package/dist/products/api/product.js.map +1 -0
  477. package/dist/products/api/products.d.ts +41 -0
  478. package/dist/products/api/products.d.ts.map +1 -0
  479. package/dist/products/api/products.js +102 -0
  480. package/dist/products/api/products.js.map +1 -0
  481. package/dist/products/components/CategoryNav.d.ts +51 -0
  482. package/dist/products/components/CategoryNav.d.ts.map +1 -0
  483. package/dist/products/components/CategoryNav.js +115 -0
  484. package/dist/products/components/CategoryNav.js.map +1 -0
  485. package/dist/products/components/ProductBreadcrumb.d.ts +52 -0
  486. package/dist/products/components/ProductBreadcrumb.d.ts.map +1 -0
  487. package/dist/products/components/ProductBreadcrumb.js +78 -0
  488. package/dist/products/components/ProductBreadcrumb.js.map +1 -0
  489. package/dist/products/components/ProductCard.d.ts +54 -0
  490. package/dist/products/components/ProductCard.d.ts.map +1 -0
  491. package/dist/products/components/ProductCard.js +65 -0
  492. package/dist/products/components/ProductCard.js.map +1 -0
  493. package/dist/products/components/ProductDetails.d.ts +63 -0
  494. package/dist/products/components/ProductDetails.d.ts.map +1 -0
  495. package/dist/products/components/ProductDetails.js +105 -0
  496. package/dist/products/components/ProductDetails.js.map +1 -0
  497. package/dist/products/components/ProductFilters.d.ts +70 -0
  498. package/dist/products/components/ProductFilters.d.ts.map +1 -0
  499. package/dist/products/components/ProductFilters.js +127 -0
  500. package/dist/products/components/ProductFilters.js.map +1 -0
  501. package/dist/products/components/ProductGallery.d.ts +37 -0
  502. package/dist/products/components/ProductGallery.d.ts.map +1 -0
  503. package/dist/products/components/ProductGallery.js +80 -0
  504. package/dist/products/components/ProductGallery.js.map +1 -0
  505. package/dist/products/components/ProductGrid.d.ts +50 -0
  506. package/dist/products/components/ProductGrid.d.ts.map +1 -0
  507. package/dist/products/components/ProductGrid.js +83 -0
  508. package/dist/products/components/ProductGrid.js.map +1 -0
  509. package/dist/products/components/ProductSearch.d.ts +43 -0
  510. package/dist/products/components/ProductSearch.d.ts.map +1 -0
  511. package/dist/products/components/ProductSearch.js +99 -0
  512. package/dist/products/components/ProductSearch.js.map +1 -0
  513. package/dist/products/components/ProductSort.d.ts +43 -0
  514. package/dist/products/components/ProductSort.d.ts.map +1 -0
  515. package/dist/products/components/ProductSort.js +61 -0
  516. package/dist/products/components/ProductSort.js.map +1 -0
  517. package/dist/products/components/VariantSelector.d.ts +43 -0
  518. package/dist/products/components/VariantSelector.d.ts.map +1 -0
  519. package/dist/products/components/VariantSelector.js +147 -0
  520. package/dist/products/components/VariantSelector.js.map +1 -0
  521. package/dist/products/components/index.d.ts +26 -0
  522. package/dist/products/components/index.d.ts.map +1 -0
  523. package/dist/products/components/index.js +32 -0
  524. package/dist/products/components/index.js.map +1 -0
  525. package/dist/products/hooks/index.d.ts +14 -0
  526. package/dist/products/hooks/index.d.ts.map +1 -0
  527. package/dist/products/hooks/index.js +17 -0
  528. package/dist/products/hooks/index.js.map +1 -0
  529. package/dist/products/hooks/useCategories.d.ts +56 -0
  530. package/dist/products/hooks/useCategories.d.ts.map +1 -0
  531. package/dist/products/hooks/useCategories.js +126 -0
  532. package/dist/products/hooks/useCategories.js.map +1 -0
  533. package/dist/products/hooks/useProduct.d.ts +44 -0
  534. package/dist/products/hooks/useProduct.d.ts.map +1 -0
  535. package/dist/products/hooks/useProduct.js +86 -0
  536. package/dist/products/hooks/useProduct.js.map +1 -0
  537. package/dist/products/hooks/useProductAttributes.d.ts +59 -0
  538. package/dist/products/hooks/useProductAttributes.d.ts.map +1 -0
  539. package/dist/products/hooks/useProductAttributes.js +148 -0
  540. package/dist/products/hooks/useProductAttributes.js.map +1 -0
  541. package/dist/products/hooks/useProducts.d.ts +67 -0
  542. package/dist/products/hooks/useProducts.d.ts.map +1 -0
  543. package/dist/products/hooks/useProducts.js +132 -0
  544. package/dist/products/hooks/useProducts.js.map +1 -0
  545. package/dist/products/index.d.ts +94 -0
  546. package/dist/products/index.d.ts.map +1 -0
  547. package/dist/products/index.js +123 -0
  548. package/dist/products/index.js.map +1 -0
  549. package/dist/theme/ThemeProvider.d.ts +70 -0
  550. package/dist/theme/ThemeProvider.d.ts.map +1 -0
  551. package/dist/theme/ThemeProvider.js +77 -0
  552. package/dist/theme/ThemeProvider.js.map +1 -0
  553. package/dist/theme/colors.d.ts +148 -0
  554. package/dist/theme/colors.d.ts.map +1 -0
  555. package/dist/theme/colors.js +219 -0
  556. package/dist/theme/colors.js.map +1 -0
  557. package/dist/theme/defaults.d.ts +212 -0
  558. package/dist/theme/defaults.d.ts.map +1 -0
  559. package/dist/theme/defaults.js +278 -0
  560. package/dist/theme/defaults.js.map +1 -0
  561. package/dist/theme/fonts.d.ts +59 -0
  562. package/dist/theme/fonts.d.ts.map +1 -0
  563. package/dist/theme/fonts.js +202 -0
  564. package/dist/theme/fonts.js.map +1 -0
  565. package/dist/theme/generator.d.ts +50 -0
  566. package/dist/theme/generator.d.ts.map +1 -0
  567. package/dist/theme/generator.js +322 -0
  568. package/dist/theme/generator.js.map +1 -0
  569. package/dist/theme/hooks.d.ts +110 -0
  570. package/dist/theme/hooks.d.ts.map +1 -0
  571. package/dist/theme/hooks.js +106 -0
  572. package/dist/theme/hooks.js.map +1 -0
  573. package/dist/theme/index.d.ts +37 -0
  574. package/dist/theme/index.d.ts.map +1 -0
  575. package/dist/theme/index.js +85 -0
  576. package/dist/theme/index.js.map +1 -0
  577. package/package.json +1 -1
@@ -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