storefront-layouts 1.0.0

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 (1210) hide show
  1. package/README.md +546 -0
  2. package/dist/components/auth/LoginForm.d.ts +9 -0
  3. package/dist/components/auth/LoginForm.d.ts.map +1 -0
  4. package/dist/components/auth/LoginForm.js +21 -0
  5. package/dist/components/auth/LoginSheet.d.ts +7 -0
  6. package/dist/components/auth/LoginSheet.d.ts.map +1 -0
  7. package/dist/components/auth/LoginSheet.js +8 -0
  8. package/dist/components/auth/login-form-core.d.ts +11 -0
  9. package/dist/components/auth/login-form-core.d.ts.map +1 -0
  10. package/dist/components/auth/login-form-core.js +19 -0
  11. package/dist/components/auth/login-sheet-header.d.ts +10 -0
  12. package/dist/components/auth/login-sheet-header.d.ts.map +1 -0
  13. package/dist/components/auth/login-sheet-header.js +10 -0
  14. package/dist/components/auth/login-sheet-registry.d.ts +11 -0
  15. package/dist/components/auth/login-sheet-registry.d.ts.map +1 -0
  16. package/dist/components/auth/login-sheet-registry.js +9 -0
  17. package/dist/components/auth/login-sheet-theme.types.d.ts +29 -0
  18. package/dist/components/auth/login-sheet-theme.types.d.ts.map +1 -0
  19. package/dist/components/auth/login-sheet-theme.types.js +1 -0
  20. package/dist/components/auth/login-sheet-themes/booking-agenda.theme.d.ts +3 -0
  21. package/dist/components/auth/login-sheet-themes/booking-agenda.theme.d.ts.map +1 -0
  22. package/dist/components/auth/login-sheet-themes/booking-agenda.theme.js +21 -0
  23. package/dist/components/auth/login-sheet-themes/booking.theme.d.ts +3 -0
  24. package/dist/components/auth/login-sheet-themes/booking.theme.d.ts.map +1 -0
  25. package/dist/components/auth/login-sheet-themes/booking.theme.js +20 -0
  26. package/dist/components/auth/login-sheet-themes/clothing-minimal.theme.d.ts +3 -0
  27. package/dist/components/auth/login-sheet-themes/clothing-minimal.theme.d.ts.map +1 -0
  28. package/dist/components/auth/login-sheet-themes/clothing-minimal.theme.js +20 -0
  29. package/dist/components/auth/login-sheet-themes/clothing.theme.d.ts +3 -0
  30. package/dist/components/auth/login-sheet-themes/clothing.theme.d.ts.map +1 -0
  31. package/dist/components/auth/login-sheet-themes/clothing.theme.js +21 -0
  32. package/dist/components/auth/login-sheet-themes/electronics-grid.theme.d.ts +3 -0
  33. package/dist/components/auth/login-sheet-themes/electronics-grid.theme.d.ts.map +1 -0
  34. package/dist/components/auth/login-sheet-themes/electronics-grid.theme.js +20 -0
  35. package/dist/components/auth/login-sheet-themes/electronics.theme.d.ts +3 -0
  36. package/dist/components/auth/login-sheet-themes/electronics.theme.d.ts.map +1 -0
  37. package/dist/components/auth/login-sheet-themes/electronics.theme.js +20 -0
  38. package/dist/components/auth/login-sheet-themes/food-modern.theme.d.ts +3 -0
  39. package/dist/components/auth/login-sheet-themes/food-modern.theme.d.ts.map +1 -0
  40. package/dist/components/auth/login-sheet-themes/food-modern.theme.js +22 -0
  41. package/dist/components/auth/login-sheet-themes/food.theme.d.ts +3 -0
  42. package/dist/components/auth/login-sheet-themes/food.theme.d.ts.map +1 -0
  43. package/dist/components/auth/login-sheet-themes/food.theme.js +22 -0
  44. package/dist/components/auth/login-sheet-themes/index.d.ts +14 -0
  45. package/dist/components/auth/login-sheet-themes/index.d.ts.map +1 -0
  46. package/dist/components/auth/login-sheet-themes/index.js +29 -0
  47. package/dist/components/auth/login-sheet-themes/motivational-speaker.theme.d.ts +3 -0
  48. package/dist/components/auth/login-sheet-themes/motivational-speaker.theme.d.ts.map +1 -0
  49. package/dist/components/auth/login-sheet-themes/motivational-speaker.theme.js +20 -0
  50. package/dist/components/auth/login-sheet-themes/theme-input-baselines.d.ts +24 -0
  51. package/dist/components/auth/login-sheet-themes/theme-input-baselines.d.ts.map +1 -0
  52. package/dist/components/auth/login-sheet-themes/theme-input-baselines.js +23 -0
  53. package/dist/components/auth/login-sheets/StoreLoginSheetShell.d.ts +13 -0
  54. package/dist/components/auth/login-sheets/StoreLoginSheetShell.d.ts.map +1 -0
  55. package/dist/components/auth/login-sheets/StoreLoginSheetShell.js +14 -0
  56. package/dist/components/auth/use-login-submit.d.ts +22 -0
  57. package/dist/components/auth/use-login-submit.d.ts.map +1 -0
  58. package/dist/components/auth/use-login-submit.js +99 -0
  59. package/dist/components/cart/InventoryHoldCountdown.d.ts +8 -0
  60. package/dist/components/cart/InventoryHoldCountdown.d.ts.map +1 -0
  61. package/dist/components/cart/InventoryHoldCountdown.js +73 -0
  62. package/dist/components/categories/category-masonry-grid.d.ts +18 -0
  63. package/dist/components/categories/category-masonry-grid.d.ts.map +1 -0
  64. package/dist/components/categories/category-masonry-grid.js +50 -0
  65. package/dist/components/categories/category-masonry-utils.d.ts +9 -0
  66. package/dist/components/categories/category-masonry-utils.d.ts.map +1 -0
  67. package/dist/components/categories/category-masonry-utils.js +67 -0
  68. package/dist/components/checkout/CheckoutFeeLines.d.ts +12 -0
  69. package/dist/components/checkout/CheckoutFeeLines.d.ts.map +1 -0
  70. package/dist/components/checkout/CheckoutFeeLines.js +9 -0
  71. package/dist/components/checkout/ShippingOptionsPanel.d.ts +54 -0
  72. package/dist/components/checkout/ShippingOptionsPanel.d.ts.map +1 -0
  73. package/dist/components/checkout/ShippingOptionsPanel.js +115 -0
  74. package/dist/components/learning/CertificateTemplates.d.ts +25 -0
  75. package/dist/components/learning/CertificateTemplates.d.ts.map +1 -0
  76. package/dist/components/learning/CertificateTemplates.js +31 -0
  77. package/dist/components/learning/CertificateViewer.d.ts +11 -0
  78. package/dist/components/learning/CertificateViewer.d.ts.map +1 -0
  79. package/dist/components/learning/CertificateViewer.js +114 -0
  80. package/dist/components/learning/MentorshipProgress.d.ts +18 -0
  81. package/dist/components/learning/MentorshipProgress.d.ts.map +1 -0
  82. package/dist/components/learning/MentorshipProgress.js +20 -0
  83. package/dist/components/product/ProductVariationSelectors.d.ts +12 -0
  84. package/dist/components/product/ProductVariationSelectors.d.ts.map +1 -0
  85. package/dist/components/product/ProductVariationSelectors.js +46 -0
  86. package/dist/components/rich-text/CategoryDescription.d.ts +7 -0
  87. package/dist/components/rich-text/CategoryDescription.d.ts.map +1 -0
  88. package/dist/components/rich-text/CategoryDescription.js +11 -0
  89. package/dist/components/rich-text/ProductDescription.d.ts +9 -0
  90. package/dist/components/rich-text/ProductDescription.d.ts.map +1 -0
  91. package/dist/components/rich-text/ProductDescription.js +10 -0
  92. package/dist/components/rich-text/RichTextExcerpt.d.ts +10 -0
  93. package/dist/components/rich-text/RichTextExcerpt.d.ts.map +1 -0
  94. package/dist/components/rich-text/RichTextExcerpt.js +12 -0
  95. package/dist/components/rich-text/SafeRichHtml.d.ts +14 -0
  96. package/dist/components/rich-text/SafeRichHtml.d.ts.map +1 -0
  97. package/dist/components/rich-text/SafeRichHtml.js +15 -0
  98. package/dist/components/shipping/MerchantHandledDeliveryNotice.d.ts +7 -0
  99. package/dist/components/shipping/MerchantHandledDeliveryNotice.d.ts.map +1 -0
  100. package/dist/components/shipping/MerchantHandledDeliveryNotice.js +7 -0
  101. package/dist/components/shipping/ProductDeliveryInfoSection.d.ts +21 -0
  102. package/dist/components/shipping/ProductDeliveryInfoSection.d.ts.map +1 -0
  103. package/dist/components/shipping/ProductDeliveryInfoSection.js +22 -0
  104. package/dist/components/shipping/ShippingQuoteAddressForm.d.ts +11 -0
  105. package/dist/components/shipping/ShippingQuoteAddressForm.d.ts.map +1 -0
  106. package/dist/components/shipping/ShippingQuoteAddressForm.js +66 -0
  107. package/dist/components/ui/address-selector.d.ts +11 -0
  108. package/dist/components/ui/address-selector.d.ts.map +1 -0
  109. package/dist/components/ui/address-selector.js +21 -0
  110. package/dist/components/ui/alert-modal.d.ts +21 -0
  111. package/dist/components/ui/alert-modal.d.ts.map +1 -0
  112. package/dist/components/ui/alert-modal.js +59 -0
  113. package/dist/components/ui/avatar-image.d.ts +11 -0
  114. package/dist/components/ui/avatar-image.d.ts.map +1 -0
  115. package/dist/components/ui/avatar-image.js +39 -0
  116. package/dist/components/ui/background-patterns.d.ts +27 -0
  117. package/dist/components/ui/background-patterns.d.ts.map +1 -0
  118. package/dist/components/ui/background-patterns.js +5 -0
  119. package/dist/components/ui/badge.d.ts +10 -0
  120. package/dist/components/ui/badge.d.ts.map +1 -0
  121. package/dist/components/ui/badge.js +20 -0
  122. package/dist/components/ui/breadcrumbs.d.ts +12 -0
  123. package/dist/components/ui/breadcrumbs.d.ts.map +1 -0
  124. package/dist/components/ui/breadcrumbs.js +12 -0
  125. package/dist/components/ui/button.d.ts +11 -0
  126. package/dist/components/ui/button.d.ts.map +1 -0
  127. package/dist/components/ui/button.js +34 -0
  128. package/dist/components/ui/card.d.ts +10 -0
  129. package/dist/components/ui/card.d.ts.map +1 -0
  130. package/dist/components/ui/card.js +24 -0
  131. package/dist/components/ui/category-tree.d.ts +16 -0
  132. package/dist/components/ui/category-tree.d.ts.map +1 -0
  133. package/dist/components/ui/category-tree.js +74 -0
  134. package/dist/components/ui/checkout-button.d.ts +11 -0
  135. package/dist/components/ui/checkout-button.d.ts.map +1 -0
  136. package/dist/components/ui/checkout-button.js +298 -0
  137. package/dist/components/ui/dynamic-icon.d.ts +11 -0
  138. package/dist/components/ui/dynamic-icon.d.ts.map +1 -0
  139. package/dist/components/ui/dynamic-icon.js +77 -0
  140. package/dist/components/ui/guest-checkout-modal.d.ts +19 -0
  141. package/dist/components/ui/guest-checkout-modal.d.ts.map +1 -0
  142. package/dist/components/ui/guest-checkout-modal.js +95 -0
  143. package/dist/components/ui/image-skeleton.d.ts +7 -0
  144. package/dist/components/ui/image-skeleton.d.ts.map +1 -0
  145. package/dist/components/ui/image-skeleton.js +15 -0
  146. package/dist/components/ui/image-with-fallback.d.ts +10 -0
  147. package/dist/components/ui/image-with-fallback.d.ts.map +1 -0
  148. package/dist/components/ui/image-with-fallback.js +165 -0
  149. package/dist/components/ui/input.d.ts +6 -0
  150. package/dist/components/ui/input.d.ts.map +1 -0
  151. package/dist/components/ui/input.js +8 -0
  152. package/dist/components/ui/limited-time-offer-badge.d.ts +12 -0
  153. package/dist/components/ui/limited-time-offer-badge.d.ts.map +1 -0
  154. package/dist/components/ui/limited-time-offer-badge.js +13 -0
  155. package/dist/components/ui/loading-skeleton-wrapper.d.ts +6 -0
  156. package/dist/components/ui/loading-skeleton-wrapper.d.ts.map +1 -0
  157. package/dist/components/ui/loading-skeleton-wrapper.js +10 -0
  158. package/dist/components/ui/modal.d.ts +11 -0
  159. package/dist/components/ui/modal.d.ts.map +1 -0
  160. package/dist/components/ui/modal.js +26 -0
  161. package/dist/components/ui/otp-input.d.ts +10 -0
  162. package/dist/components/ui/otp-input.d.ts.map +1 -0
  163. package/dist/components/ui/otp-input.js +57 -0
  164. package/dist/components/ui/out-of-stock-overlay.d.ts +8 -0
  165. package/dist/components/ui/out-of-stock-overlay.d.ts.map +1 -0
  166. package/dist/components/ui/out-of-stock-overlay.js +12 -0
  167. package/dist/components/ui/page-animate-wrapper.d.ts +7 -0
  168. package/dist/components/ui/page-animate-wrapper.d.ts.map +1 -0
  169. package/dist/components/ui/page-animate-wrapper.js +13 -0
  170. package/dist/components/ui/page-content-loader.d.ts +13 -0
  171. package/dist/components/ui/page-content-loader.d.ts.map +1 -0
  172. package/dist/components/ui/page-content-loader.js +12 -0
  173. package/dist/components/ui/page-loader.d.ts +20 -0
  174. package/dist/components/ui/page-loader.d.ts.map +1 -0
  175. package/dist/components/ui/page-loader.js +31 -0
  176. package/dist/components/ui/product-card.d.ts +11 -0
  177. package/dist/components/ui/product-card.d.ts.map +1 -0
  178. package/dist/components/ui/product-card.js +139 -0
  179. package/dist/components/ui/product-rating.d.ts +17 -0
  180. package/dist/components/ui/product-rating.d.ts.map +1 -0
  181. package/dist/components/ui/product-rating.js +54 -0
  182. package/dist/components/ui/product-stock-badge.d.ts +9 -0
  183. package/dist/components/ui/product-stock-badge.d.ts.map +1 -0
  184. package/dist/components/ui/product-stock-badge.js +20 -0
  185. package/dist/components/ui/review-form.d.ts +9 -0
  186. package/dist/components/ui/review-form.d.ts.map +1 -0
  187. package/dist/components/ui/review-form.js +28 -0
  188. package/dist/components/ui/route-skeleton-loader.d.ts +7 -0
  189. package/dist/components/ui/route-skeleton-loader.d.ts.map +1 -0
  190. package/dist/components/ui/route-skeleton-loader.js +75 -0
  191. package/dist/components/ui/sheet.d.ts +29 -0
  192. package/dist/components/ui/sheet.d.ts.map +1 -0
  193. package/dist/components/ui/sheet.js +45 -0
  194. package/dist/components/ui/skeleton.d.ts +3 -0
  195. package/dist/components/ui/skeleton.d.ts.map +1 -0
  196. package/dist/components/ui/skeleton.js +6 -0
  197. package/dist/components/ui/skeletons/category-grid-skeleton.d.ts +6 -0
  198. package/dist/components/ui/skeletons/category-grid-skeleton.d.ts.map +1 -0
  199. package/dist/components/ui/skeletons/category-grid-skeleton.js +9 -0
  200. package/dist/components/ui/skeletons/checkout-skeleton.d.ts +2 -0
  201. package/dist/components/ui/skeletons/checkout-skeleton.d.ts.map +1 -0
  202. package/dist/components/ui/skeletons/checkout-skeleton.js +4 -0
  203. package/dist/components/ui/skeletons/index.d.ts +6 -0
  204. package/dist/components/ui/skeletons/index.d.ts.map +1 -0
  205. package/dist/components/ui/skeletons/index.js +5 -0
  206. package/dist/components/ui/skeletons/page-skeleton.d.ts +2 -0
  207. package/dist/components/ui/skeletons/page-skeleton.d.ts.map +1 -0
  208. package/dist/components/ui/skeletons/page-skeleton.js +4 -0
  209. package/dist/components/ui/skeletons/product-card-skeleton.d.ts +2 -0
  210. package/dist/components/ui/skeletons/product-card-skeleton.d.ts.map +1 -0
  211. package/dist/components/ui/skeletons/product-card-skeleton.js +4 -0
  212. package/dist/components/ui/skeletons/product-detail-skeleton.d.ts +2 -0
  213. package/dist/components/ui/skeletons/product-detail-skeleton.d.ts.map +1 -0
  214. package/dist/components/ui/skeletons/product-detail-skeleton.js +4 -0
  215. package/dist/components/ui/skeletons/product-grid-skeleton.d.ts +7 -0
  216. package/dist/components/ui/skeletons/product-grid-skeleton.d.ts.map +1 -0
  217. package/dist/components/ui/skeletons/product-grid-skeleton.js +12 -0
  218. package/dist/components/ui/store-logos.d.ts +43 -0
  219. package/dist/components/ui/store-logos.d.ts.map +1 -0
  220. package/dist/components/ui/store-logos.js +83 -0
  221. package/dist/components/ui/toast.d.ts +20 -0
  222. package/dist/components/ui/toast.d.ts.map +1 -0
  223. package/dist/components/ui/toast.js +33 -0
  224. package/dist/components/ui/video-player.d.ts +48 -0
  225. package/dist/components/ui/video-player.d.ts.map +1 -0
  226. package/dist/components/ui/video-player.js +101 -0
  227. package/dist/editor/alignment-schemas/booking-agenda.d.ts +3 -0
  228. package/dist/editor/alignment-schemas/booking-agenda.d.ts.map +1 -0
  229. package/dist/editor/alignment-schemas/booking-agenda.js +145 -0
  230. package/dist/editor/alignment-schemas/booking-footer-section.d.ts +4 -0
  231. package/dist/editor/alignment-schemas/booking-footer-section.d.ts.map +1 -0
  232. package/dist/editor/alignment-schemas/booking-footer-section.js +69 -0
  233. package/dist/editor/alignment-schemas/booking.d.ts +3 -0
  234. package/dist/editor/alignment-schemas/booking.d.ts.map +1 -0
  235. package/dist/editor/alignment-schemas/booking.js +476 -0
  236. package/dist/editor/alignment-schemas/clothing-minimal.d.ts +3 -0
  237. package/dist/editor/alignment-schemas/clothing-minimal.d.ts.map +1 -0
  238. package/dist/editor/alignment-schemas/clothing-minimal.js +363 -0
  239. package/dist/editor/alignment-schemas/clothing.d.ts +3 -0
  240. package/dist/editor/alignment-schemas/clothing.d.ts.map +1 -0
  241. package/dist/editor/alignment-schemas/clothing.js +477 -0
  242. package/dist/editor/alignment-schemas/electronics-grid.d.ts +3 -0
  243. package/dist/editor/alignment-schemas/electronics-grid.d.ts.map +1 -0
  244. package/dist/editor/alignment-schemas/electronics-grid.js +97 -0
  245. package/dist/editor/alignment-schemas/electronics.d.ts +3 -0
  246. package/dist/editor/alignment-schemas/electronics.d.ts.map +1 -0
  247. package/dist/editor/alignment-schemas/electronics.js +145 -0
  248. package/dist/editor/alignment-schemas/food-modern.d.ts +3 -0
  249. package/dist/editor/alignment-schemas/food-modern.d.ts.map +1 -0
  250. package/dist/editor/alignment-schemas/food-modern.js +237 -0
  251. package/dist/editor/alignment-schemas/food.d.ts +3 -0
  252. package/dist/editor/alignment-schemas/food.d.ts.map +1 -0
  253. package/dist/editor/alignment-schemas/food.js +494 -0
  254. package/dist/editor/alignment-schemas/index.d.ts +15 -0
  255. package/dist/editor/alignment-schemas/index.d.ts.map +1 -0
  256. package/dist/editor/alignment-schemas/index.js +50 -0
  257. package/dist/editor/alignment-schemas/lazy-loader.d.ts +14 -0
  258. package/dist/editor/alignment-schemas/lazy-loader.d.ts.map +1 -0
  259. package/dist/editor/alignment-schemas/lazy-loader.js +80 -0
  260. package/dist/editor/alignment-schemas/metadata.d.ts +25 -0
  261. package/dist/editor/alignment-schemas/metadata.d.ts.map +1 -0
  262. package/dist/editor/alignment-schemas/metadata.js +225 -0
  263. package/dist/editor/alignment-schemas/motivational-speaker.d.ts +3 -0
  264. package/dist/editor/alignment-schemas/motivational-speaker.d.ts.map +1 -0
  265. package/dist/editor/alignment-schemas/motivational-speaker.js +185 -0
  266. package/dist/editor/alignment-schemas/resolve-canvas-inspector-leaf.d.ts +18 -0
  267. package/dist/editor/alignment-schemas/resolve-canvas-inspector-leaf.d.ts.map +1 -0
  268. package/dist/editor/alignment-schemas/resolve-canvas-inspector-leaf.js +166 -0
  269. package/dist/editor/alignment-schemas/resolve-field.d.ts +9 -0
  270. package/dist/editor/alignment-schemas/resolve-field.d.ts.map +1 -0
  271. package/dist/editor/alignment-schemas/resolve-field.js +56 -0
  272. package/dist/editor/alignment-schemas/types.d.ts +53 -0
  273. package/dist/editor/alignment-schemas/types.d.ts.map +1 -0
  274. package/dist/editor/alignment-schemas/types.js +1 -0
  275. package/dist/editor/blocks/defaults/clothing-minimal-home.d.ts +9 -0
  276. package/dist/editor/blocks/defaults/clothing-minimal-home.d.ts.map +1 -0
  277. package/dist/editor/blocks/defaults/clothing-minimal-home.js +207 -0
  278. package/dist/editor/blocks/index.d.ts +4 -0
  279. package/dist/editor/blocks/index.d.ts.map +1 -0
  280. package/dist/editor/blocks/index.js +3 -0
  281. package/dist/editor/blocks/migrate-clothing-minimal.d.ts +5 -0
  282. package/dist/editor/blocks/migrate-clothing-minimal.d.ts.map +1 -0
  283. package/dist/editor/blocks/migrate-clothing-minimal.js +140 -0
  284. package/dist/editor/blocks/nav-outline-utils.d.ts +47 -0
  285. package/dist/editor/blocks/nav-outline-utils.d.ts.map +1 -0
  286. package/dist/editor/blocks/nav-outline-utils.js +201 -0
  287. package/dist/editor/blocks/registry.d.ts +19 -0
  288. package/dist/editor/blocks/registry.d.ts.map +1 -0
  289. package/dist/editor/blocks/registry.js +118 -0
  290. package/dist/editor/blocks/types.d.ts +14 -0
  291. package/dist/editor/blocks/types.d.ts.map +1 -0
  292. package/dist/editor/blocks/types.js +14 -0
  293. package/dist/editor/document/adapter.d.ts +44 -0
  294. package/dist/editor/document/adapter.d.ts.map +1 -0
  295. package/dist/editor/document/adapter.js +159 -0
  296. package/dist/editor/document/block-tree.d.ts +46 -0
  297. package/dist/editor/document/block-tree.d.ts.map +1 -0
  298. package/dist/editor/document/block-tree.js +345 -0
  299. package/dist/editor/document/constants.d.ts +6 -0
  300. package/dist/editor/document/constants.d.ts.map +1 -0
  301. package/dist/editor/document/constants.js +14 -0
  302. package/dist/editor/document/index.d.ts +7 -0
  303. package/dist/editor/document/index.d.ts.map +1 -0
  304. package/dist/editor/document/index.js +6 -0
  305. package/dist/editor/document/layout-id.d.ts +3 -0
  306. package/dist/editor/document/layout-id.d.ts.map +1 -0
  307. package/dist/editor/document/layout-id.js +17 -0
  308. package/dist/editor/document/types.d.ts +91 -0
  309. package/dist/editor/document/types.d.ts.map +1 -0
  310. package/dist/editor/document/types.js +1 -0
  311. package/dist/editor/document/validate.d.ts +11 -0
  312. package/dist/editor/document/validate.d.ts.map +1 -0
  313. package/dist/editor/document/validate.js +92 -0
  314. package/dist/editor/feature-flags.d.ts +11 -0
  315. package/dist/editor/feature-flags.d.ts.map +1 -0
  316. package/dist/editor/feature-flags.js +19 -0
  317. package/dist/editor/index.d.ts +28 -0
  318. package/dist/editor/index.d.ts.map +1 -0
  319. package/dist/editor/index.js +72 -0
  320. package/dist/editor/layout-content-loader.d.ts +13 -0
  321. package/dist/editor/layout-content-loader.d.ts.map +1 -0
  322. package/dist/editor/layout-content-loader.js +222 -0
  323. package/dist/editor/payaza-form/ActiveArrayFocusContext.d.ts +20 -0
  324. package/dist/editor/payaza-form/ActiveArrayFocusContext.d.ts.map +1 -0
  325. package/dist/editor/payaza-form/ActiveArrayFocusContext.js +31 -0
  326. package/dist/editor/payaza-form/ArrayItemManager.d.ts +19 -0
  327. package/dist/editor/payaza-form/ArrayItemManager.d.ts.map +1 -0
  328. package/dist/editor/payaza-form/ArrayItemManager.js +62 -0
  329. package/dist/editor/payaza-form/AssetSelectionContext.d.ts +17 -0
  330. package/dist/editor/payaza-form/AssetSelectionContext.d.ts.map +1 -0
  331. package/dist/editor/payaza-form/AssetSelectionContext.js +81 -0
  332. package/dist/editor/payaza-form/EditorCanvasPreview.d.ts +41 -0
  333. package/dist/editor/payaza-form/EditorCanvasPreview.d.ts.map +1 -0
  334. package/dist/editor/payaza-form/EditorCanvasPreview.js +56 -0
  335. package/dist/editor/payaza-form/EditorLayoutContext.d.ts +8 -0
  336. package/dist/editor/payaza-form/EditorLayoutContext.d.ts.map +1 -0
  337. package/dist/editor/payaza-form/EditorLayoutContext.js +6 -0
  338. package/dist/editor/payaza-form/FieldRenderer.d.ts +16 -0
  339. package/dist/editor/payaza-form/FieldRenderer.d.ts.map +1 -0
  340. package/dist/editor/payaza-form/FieldRenderer.js +192 -0
  341. package/dist/editor/payaza-form/IframePreviewMessageBridge.d.ts +29 -0
  342. package/dist/editor/payaza-form/IframePreviewMessageBridge.d.ts.map +1 -0
  343. package/dist/editor/payaza-form/IframePreviewMessageBridge.js +46 -0
  344. package/dist/editor/payaza-form/PayazaFormEditor.d.ts +12 -0
  345. package/dist/editor/payaza-form/PayazaFormEditor.d.ts.map +1 -0
  346. package/dist/editor/payaza-form/PayazaFormEditor.js +1226 -0
  347. package/dist/editor/payaza-form/PayazaFormEditorFullPage.d.ts +9 -0
  348. package/dist/editor/payaza-form/PayazaFormEditorFullPage.d.ts.map +1 -0
  349. package/dist/editor/payaza-form/PayazaFormEditorFullPage.js +6 -0
  350. package/dist/editor/payaza-form/SliderArrayEditor.d.ts +17 -0
  351. package/dist/editor/payaza-form/SliderArrayEditor.d.ts.map +1 -0
  352. package/dist/editor/payaza-form/SliderArrayEditor.js +96 -0
  353. package/dist/editor/payaza-form/components/ArrayField.d.ts +21 -0
  354. package/dist/editor/payaza-form/components/ArrayField.d.ts.map +1 -0
  355. package/dist/editor/payaza-form/components/ArrayField.js +18 -0
  356. package/dist/editor/payaza-form/components/BlockStylesInspector.d.ts +9 -0
  357. package/dist/editor/payaza-form/components/BlockStylesInspector.d.ts.map +1 -0
  358. package/dist/editor/payaza-form/components/BlockStylesInspector.js +150 -0
  359. package/dist/editor/payaza-form/components/BlocksField.d.ts +17 -0
  360. package/dist/editor/payaza-form/components/BlocksField.d.ts.map +1 -0
  361. package/dist/editor/payaza-form/components/BlocksField.js +108 -0
  362. package/dist/editor/payaza-form/components/ButtonField.d.ts +15 -0
  363. package/dist/editor/payaza-form/components/ButtonField.d.ts.map +1 -0
  364. package/dist/editor/payaza-form/components/ButtonField.js +17 -0
  365. package/dist/editor/payaza-form/components/CanvasGranularInspector.d.ts +16 -0
  366. package/dist/editor/payaza-form/components/CanvasGranularInspector.d.ts.map +1 -0
  367. package/dist/editor/payaza-form/components/CanvasGranularInspector.js +32 -0
  368. package/dist/editor/payaza-form/components/FieldDensityContext.d.ts +10 -0
  369. package/dist/editor/payaza-form/components/FieldDensityContext.d.ts.map +1 -0
  370. package/dist/editor/payaza-form/components/FieldDensityContext.js +13 -0
  371. package/dist/editor/payaza-form/components/IconField.d.ts +12 -0
  372. package/dist/editor/payaza-form/components/IconField.d.ts.map +1 -0
  373. package/dist/editor/payaza-form/components/IconField.js +42 -0
  374. package/dist/editor/payaza-form/components/ImageField.d.ts +10 -0
  375. package/dist/editor/payaza-form/components/ImageField.d.ts.map +1 -0
  376. package/dist/editor/payaza-form/components/ImageField.js +30 -0
  377. package/dist/editor/payaza-form/components/NumberField.d.ts +14 -0
  378. package/dist/editor/payaza-form/components/NumberField.d.ts.map +1 -0
  379. package/dist/editor/payaza-form/components/NumberField.js +23 -0
  380. package/dist/editor/payaza-form/components/ObjectField.d.ts +11 -0
  381. package/dist/editor/payaza-form/components/ObjectField.d.ts.map +1 -0
  382. package/dist/editor/payaza-form/components/ObjectField.js +7 -0
  383. package/dist/editor/payaza-form/components/RichTextField.d.ts +15 -0
  384. package/dist/editor/payaza-form/components/RichTextField.d.ts.map +1 -0
  385. package/dist/editor/payaza-form/components/RichTextField.js +88 -0
  386. package/dist/editor/payaza-form/components/SectionField.d.ts +14 -0
  387. package/dist/editor/payaza-form/components/SectionField.d.ts.map +1 -0
  388. package/dist/editor/payaza-form/components/SectionField.js +8 -0
  389. package/dist/editor/payaza-form/components/SectionSchemaInspector.d.ts +18 -0
  390. package/dist/editor/payaza-form/components/SectionSchemaInspector.d.ts.map +1 -0
  391. package/dist/editor/payaza-form/components/SectionSchemaInspector.js +64 -0
  392. package/dist/editor/payaza-form/components/SegmentedControlField.d.ts +13 -0
  393. package/dist/editor/payaza-form/components/SegmentedControlField.d.ts.map +1 -0
  394. package/dist/editor/payaza-form/components/SegmentedControlField.js +7 -0
  395. package/dist/editor/payaza-form/components/StarRatingField.d.ts +13 -0
  396. package/dist/editor/payaza-form/components/StarRatingField.d.ts.map +1 -0
  397. package/dist/editor/payaza-form/components/StarRatingField.js +16 -0
  398. package/dist/editor/payaza-form/components/TextField.d.ts +13 -0
  399. package/dist/editor/payaza-form/components/TextField.d.ts.map +1 -0
  400. package/dist/editor/payaza-form/components/TextField.js +12 -0
  401. package/dist/editor/payaza-form/components/TextareaField.d.ts +11 -0
  402. package/dist/editor/payaza-form/components/TextareaField.d.ts.map +1 -0
  403. package/dist/editor/payaza-form/components/TextareaField.js +6 -0
  404. package/dist/editor/payaza-form/components/ToggleField.d.ts +12 -0
  405. package/dist/editor/payaza-form/components/ToggleField.d.ts.map +1 -0
  406. package/dist/editor/payaza-form/components/ToggleField.js +15 -0
  407. package/dist/editor/payaza-form/data-merger.d.ts +28 -0
  408. package/dist/editor/payaza-form/data-merger.d.ts.map +1 -0
  409. package/dist/editor/payaza-form/data-merger.js +878 -0
  410. package/dist/editor/payaza-form/data-transformer.d.ts +28 -0
  411. package/dist/editor/payaza-form/data-transformer.d.ts.map +1 -0
  412. package/dist/editor/payaza-form/data-transformer.js +304 -0
  413. package/dist/editor/payaza-form/engine.d.ts +72 -0
  414. package/dist/editor/payaza-form/engine.d.ts.map +1 -0
  415. package/dist/editor/payaza-form/engine.js +140 -0
  416. package/dist/editor/payaza-form/examples/custom-widgets.example.d.ts +8 -0
  417. package/dist/editor/payaza-form/examples/custom-widgets.example.d.ts.map +1 -0
  418. package/dist/editor/payaza-form/examples/custom-widgets.example.js +51 -0
  419. package/dist/editor/payaza-form/field-renderer-ref.d.ts +4 -0
  420. package/dist/editor/payaza-form/field-renderer-ref.d.ts.map +1 -0
  421. package/dist/editor/payaza-form/field-renderer-ref.js +16 -0
  422. package/dist/editor/payaza-form/index.d.ts +11 -0
  423. package/dist/editor/payaza-form/index.d.ts.map +1 -0
  424. package/dist/editor/payaza-form/index.js +8 -0
  425. package/dist/editor/payaza-form/layout-loader.d.ts +12 -0
  426. package/dist/editor/payaza-form/layout-loader.d.ts.map +1 -0
  427. package/dist/editor/payaza-form/layout-loader.js +43 -0
  428. package/dist/editor/payaza-form/payaza-style-sanitize.d.ts +14 -0
  429. package/dist/editor/payaza-form/payaza-style-sanitize.d.ts.map +1 -0
  430. package/dist/editor/payaza-form/payaza-style-sanitize.js +76 -0
  431. package/dist/editor/payaza-form/preview-message-handler.d.ts +18 -0
  432. package/dist/editor/payaza-form/preview-message-handler.d.ts.map +1 -0
  433. package/dist/editor/payaza-form/preview-message-handler.js +89 -0
  434. package/dist/editor/payaza-form/schema-bridge.d.ts +12 -0
  435. package/dist/editor/payaza-form/schema-bridge.d.ts.map +1 -0
  436. package/dist/editor/payaza-form/schema-bridge.js +90 -0
  437. package/dist/editor/payaza-form/widget-registry.d.ts +94 -0
  438. package/dist/editor/payaza-form/widget-registry.d.ts.map +1 -0
  439. package/dist/editor/payaza-form/widget-registry.js +107 -0
  440. package/dist/editor/shared/AIGenerateModal.d.ts +17 -0
  441. package/dist/editor/shared/AIGenerateModal.d.ts.map +1 -0
  442. package/dist/editor/shared/AIGenerateModal.js +59 -0
  443. package/dist/editor/shared/BlockOutlineTree.d.ts +14 -0
  444. package/dist/editor/shared/BlockOutlineTree.d.ts.map +1 -0
  445. package/dist/editor/shared/BlockOutlineTree.js +47 -0
  446. package/dist/editor/shared/EditorHeader.d.ts +61 -0
  447. package/dist/editor/shared/EditorHeader.d.ts.map +1 -0
  448. package/dist/editor/shared/EditorHeader.js +181 -0
  449. package/dist/editor/shared/EditorNavigator.d.ts +42 -0
  450. package/dist/editor/shared/EditorNavigator.d.ts.map +1 -0
  451. package/dist/editor/shared/EditorNavigator.js +44 -0
  452. package/dist/editor/shared/IframePreview.d.ts +36 -0
  453. package/dist/editor/shared/IframePreview.d.ts.map +1 -0
  454. package/dist/editor/shared/IframePreview.js +217 -0
  455. package/dist/editor/shared/InlineCanvasPreview.d.ts +36 -0
  456. package/dist/editor/shared/InlineCanvasPreview.d.ts.map +1 -0
  457. package/dist/editor/shared/InlineCanvasPreview.js +174 -0
  458. package/dist/editor/shared/LayoutRenderer.d.ts +11 -0
  459. package/dist/editor/shared/LayoutRenderer.d.ts.map +1 -0
  460. package/dist/editor/shared/LayoutRenderer.js +7 -0
  461. package/dist/editor/shared/PageTabs.d.ts +13 -0
  462. package/dist/editor/shared/PageTabs.d.ts.map +1 -0
  463. package/dist/editor/shared/PageTabs.js +6 -0
  464. package/dist/editor/shared/ResizableSidebar.d.ts +14 -0
  465. package/dist/editor/shared/ResizableSidebar.d.ts.map +1 -0
  466. package/dist/editor/shared/ResizableSidebar.js +45 -0
  467. package/dist/editor/shared/index.d.ts +8 -0
  468. package/dist/editor/shared/index.d.ts.map +1 -0
  469. package/dist/editor/shared/index.js +7 -0
  470. package/dist/editor/shared/preview-viewport.d.ts +9 -0
  471. package/dist/editor/shared/preview-viewport.d.ts.map +1 -0
  472. package/dist/editor/shared/preview-viewport.js +17 -0
  473. package/dist/editor/shared/useEditorChromeMetrics.d.ts +15 -0
  474. package/dist/editor/shared/useEditorChromeMetrics.d.ts.map +1 -0
  475. package/dist/editor/shared/useEditorChromeMetrics.js +52 -0
  476. package/dist/editor/types.d.ts +162 -0
  477. package/dist/editor/types.d.ts.map +1 -0
  478. package/dist/editor/types.js +1 -0
  479. package/dist/hooks/use-analytics.d.ts +15 -0
  480. package/dist/hooks/use-analytics.d.ts.map +1 -0
  481. package/dist/hooks/use-analytics.js +62 -0
  482. package/dist/hooks/use-api.d.ts +17 -0
  483. package/dist/hooks/use-api.d.ts.map +1 -0
  484. package/dist/hooks/use-api.js +53 -0
  485. package/dist/hooks/use-cart-api.d.ts +28 -0
  486. package/dist/hooks/use-cart-api.d.ts.map +1 -0
  487. package/dist/hooks/use-cart-api.js +116 -0
  488. package/dist/hooks/use-catalog-loader.d.ts +19 -0
  489. package/dist/hooks/use-catalog-loader.d.ts.map +1 -0
  490. package/dist/hooks/use-catalog-loader.js +107 -0
  491. package/dist/hooks/use-catalog-price-range.d.ts +17 -0
  492. package/dist/hooks/use-catalog-price-range.d.ts.map +1 -0
  493. package/dist/hooks/use-catalog-price-range.js +26 -0
  494. package/dist/hooks/use-checkout-fees.d.ts +16 -0
  495. package/dist/hooks/use-checkout-fees.d.ts.map +1 -0
  496. package/dist/hooks/use-checkout-fees.js +105 -0
  497. package/dist/hooks/use-content-ready.d.ts +17 -0
  498. package/dist/hooks/use-content-ready.d.ts.map +1 -0
  499. package/dist/hooks/use-content-ready.js +197 -0
  500. package/dist/hooks/use-debounce.d.ts +6 -0
  501. package/dist/hooks/use-debounce.d.ts.map +1 -0
  502. package/dist/hooks/use-debounce.js +17 -0
  503. package/dist/hooks/use-multi-store-checkout-fees.d.ts +25 -0
  504. package/dist/hooks/use-multi-store-checkout-fees.d.ts.map +1 -0
  505. package/dist/hooks/use-multi-store-checkout-fees.js +116 -0
  506. package/dist/hooks/use-navigation-loading.d.ts +4 -0
  507. package/dist/hooks/use-navigation-loading.d.ts.map +1 -0
  508. package/dist/hooks/use-navigation-loading.js +14 -0
  509. package/dist/hooks/use-payaza-checkout.d.ts +15 -0
  510. package/dist/hooks/use-payaza-checkout.d.ts.map +1 -0
  511. package/dist/hooks/use-payaza-checkout.js +123 -0
  512. package/dist/hooks/use-product-variation-selection.d.ts +28 -0
  513. package/dist/hooks/use-product-variation-selection.d.ts.map +1 -0
  514. package/dist/hooks/use-product-variation-selection.js +53 -0
  515. package/dist/hooks/use-products-api.d.ts +19 -0
  516. package/dist/hooks/use-products-api.d.ts.map +1 -0
  517. package/dist/hooks/use-products-api.js +84 -0
  518. package/dist/hooks/use-shipping-quote.d.ts +25 -0
  519. package/dist/hooks/use-shipping-quote.d.ts.map +1 -0
  520. package/dist/hooks/use-shipping-quote.js +80 -0
  521. package/dist/hooks/use-store-api.d.ts +12 -0
  522. package/dist/hooks/use-store-api.d.ts.map +1 -0
  523. package/dist/hooks/use-store-api.js +73 -0
  524. package/dist/hooks/usePreviewSlideSync.d.ts +5 -0
  525. package/dist/hooks/usePreviewSlideSync.d.ts.map +1 -0
  526. package/dist/hooks/usePreviewSlideSync.js +28 -0
  527. package/dist/index.d.ts +150 -0
  528. package/dist/index.d.ts.map +1 -0
  529. package/dist/index.js +164 -0
  530. package/dist/json/booking-agenda.json +166 -0
  531. package/dist/json/booking.json +224 -0
  532. package/dist/json/clothing-minimal.json +203 -0
  533. package/dist/json/clothing.json +418 -0
  534. package/dist/json/electronics-grid.json +246 -0
  535. package/dist/json/electronics.json +303 -0
  536. package/dist/json/food-modern.json +191 -0
  537. package/dist/json/food.json +283 -0
  538. package/dist/json/json-map.d.ts +7 -0
  539. package/dist/json/json-map.d.ts.map +1 -0
  540. package/dist/json/json-map.js +36 -0
  541. package/dist/json/motivational-speaker.json +361 -0
  542. package/dist/layouts/booking/components/BookingHomePage.d.ts +7 -0
  543. package/dist/layouts/booking/components/BookingHomePage.d.ts.map +1 -0
  544. package/dist/layouts/booking/components/BookingHomePage.js +107 -0
  545. package/dist/layouts/booking/components/BookingMultilineHeading.d.ts +20 -0
  546. package/dist/layouts/booking/components/BookingMultilineHeading.d.ts.map +1 -0
  547. package/dist/layouts/booking/components/BookingMultilineHeading.js +32 -0
  548. package/dist/layouts/booking/components/BookingTestimonialCard.d.ts +10 -0
  549. package/dist/layouts/booking/components/BookingTestimonialCard.d.ts.map +1 -0
  550. package/dist/layouts/booking/components/BookingTestimonialCard.js +11 -0
  551. package/dist/layouts/booking/components/BookingTestimonialsEmptyState.d.ts +9 -0
  552. package/dist/layouts/booking/components/BookingTestimonialsEmptyState.d.ts.map +1 -0
  553. package/dist/layouts/booking/components/BookingTestimonialsEmptyState.js +19 -0
  554. package/dist/layouts/booking/components/booking-about-defaults.d.ts +26 -0
  555. package/dist/layouts/booking/components/booking-about-defaults.d.ts.map +1 -0
  556. package/dist/layouts/booking/components/booking-about-defaults.js +99 -0
  557. package/dist/layouts/booking/components/booking-footer-defaults.d.ts +19 -0
  558. package/dist/layouts/booking/components/booking-footer-defaults.d.ts.map +1 -0
  559. package/dist/layouts/booking/components/booking-footer-defaults.js +52 -0
  560. package/dist/layouts/booking/components/booking-testimonial-defaults.d.ts +21 -0
  561. package/dist/layouts/booking/components/booking-testimonial-defaults.d.ts.map +1 -0
  562. package/dist/layouts/booking/components/booking-testimonial-defaults.js +112 -0
  563. package/dist/layouts/booking/index.d.ts +9 -0
  564. package/dist/layouts/booking/index.d.ts.map +1 -0
  565. package/dist/layouts/booking/index.js +9 -0
  566. package/dist/layouts/booking/pages/AboutPage.d.ts +7 -0
  567. package/dist/layouts/booking/pages/AboutPage.d.ts.map +1 -0
  568. package/dist/layouts/booking/pages/AboutPage.js +69 -0
  569. package/dist/layouts/booking/pages/BookPage.d.ts +8 -0
  570. package/dist/layouts/booking/pages/BookPage.d.ts.map +1 -0
  571. package/dist/layouts/booking/pages/BookPage.js +482 -0
  572. package/dist/layouts/booking/pages/CategoriesPage.d.ts +7 -0
  573. package/dist/layouts/booking/pages/CategoriesPage.d.ts.map +1 -0
  574. package/dist/layouts/booking/pages/CategoriesPage.js +30 -0
  575. package/dist/layouts/booking/pages/CategoryPage.d.ts +8 -0
  576. package/dist/layouts/booking/pages/CategoryPage.d.ts.map +1 -0
  577. package/dist/layouts/booking/pages/CategoryPage.js +51 -0
  578. package/dist/layouts/booking/pages/ContactPage.d.ts +7 -0
  579. package/dist/layouts/booking/pages/ContactPage.d.ts.map +1 -0
  580. package/dist/layouts/booking/pages/ContactPage.js +59 -0
  581. package/dist/layouts/booking/pages/ProductDetailPage.d.ts +8 -0
  582. package/dist/layouts/booking/pages/ProductDetailPage.d.ts.map +1 -0
  583. package/dist/layouts/booking/pages/ProductDetailPage.js +456 -0
  584. package/dist/layouts/booking/pages/ServicesPage.d.ts +9 -0
  585. package/dist/layouts/booking/pages/ServicesPage.d.ts.map +1 -0
  586. package/dist/layouts/booking/pages/ServicesPage.js +54 -0
  587. package/dist/layouts/booking-agenda/components/BookingHomePageAgenda.d.ts +7 -0
  588. package/dist/layouts/booking-agenda/components/BookingHomePageAgenda.d.ts.map +1 -0
  589. package/dist/layouts/booking-agenda/components/BookingHomePageAgenda.js +283 -0
  590. package/dist/layouts/booking-agenda/index.d.ts +9 -0
  591. package/dist/layouts/booking-agenda/index.d.ts.map +1 -0
  592. package/dist/layouts/booking-agenda/index.js +9 -0
  593. package/dist/layouts/booking-agenda/pages/AboutPage.d.ts +7 -0
  594. package/dist/layouts/booking-agenda/pages/AboutPage.d.ts.map +1 -0
  595. package/dist/layouts/booking-agenda/pages/AboutPage.js +51 -0
  596. package/dist/layouts/booking-agenda/pages/BookPage.d.ts +8 -0
  597. package/dist/layouts/booking-agenda/pages/BookPage.d.ts.map +1 -0
  598. package/dist/layouts/booking-agenda/pages/BookPage.js +468 -0
  599. package/dist/layouts/booking-agenda/pages/CategoriesPage.d.ts +7 -0
  600. package/dist/layouts/booking-agenda/pages/CategoriesPage.d.ts.map +1 -0
  601. package/dist/layouts/booking-agenda/pages/CategoriesPage.js +23 -0
  602. package/dist/layouts/booking-agenda/pages/CategoryPage.d.ts +8 -0
  603. package/dist/layouts/booking-agenda/pages/CategoryPage.d.ts.map +1 -0
  604. package/dist/layouts/booking-agenda/pages/CategoryPage.js +48 -0
  605. package/dist/layouts/booking-agenda/pages/ContactPage.d.ts +7 -0
  606. package/dist/layouts/booking-agenda/pages/ContactPage.d.ts.map +1 -0
  607. package/dist/layouts/booking-agenda/pages/ContactPage.js +57 -0
  608. package/dist/layouts/booking-agenda/pages/ProductDetailPage.d.ts +8 -0
  609. package/dist/layouts/booking-agenda/pages/ProductDetailPage.d.ts.map +1 -0
  610. package/dist/layouts/booking-agenda/pages/ProductDetailPage.js +456 -0
  611. package/dist/layouts/booking-agenda/pages/ServicesPage.d.ts +9 -0
  612. package/dist/layouts/booking-agenda/pages/ServicesPage.d.ts.map +1 -0
  613. package/dist/layouts/booking-agenda/pages/ServicesPage.js +46 -0
  614. package/dist/layouts/clothing/components/ClothingHomePage.d.ts +7 -0
  615. package/dist/layouts/clothing/components/ClothingHomePage.d.ts.map +1 -0
  616. package/dist/layouts/clothing/components/ClothingHomePage.js +268 -0
  617. package/dist/layouts/clothing/index.d.ts +8 -0
  618. package/dist/layouts/clothing/index.d.ts.map +1 -0
  619. package/dist/layouts/clothing/index.js +8 -0
  620. package/dist/layouts/clothing/pages/AboutPage.d.ts +7 -0
  621. package/dist/layouts/clothing/pages/AboutPage.d.ts.map +1 -0
  622. package/dist/layouts/clothing/pages/AboutPage.js +55 -0
  623. package/dist/layouts/clothing/pages/CategoriesPage.d.ts +7 -0
  624. package/dist/layouts/clothing/pages/CategoriesPage.d.ts.map +1 -0
  625. package/dist/layouts/clothing/pages/CategoriesPage.js +34 -0
  626. package/dist/layouts/clothing/pages/CategoryPage.d.ts +8 -0
  627. package/dist/layouts/clothing/pages/CategoryPage.d.ts.map +1 -0
  628. package/dist/layouts/clothing/pages/CategoryPage.js +77 -0
  629. package/dist/layouts/clothing/pages/ContactPage.d.ts +7 -0
  630. package/dist/layouts/clothing/pages/ContactPage.d.ts.map +1 -0
  631. package/dist/layouts/clothing/pages/ContactPage.js +58 -0
  632. package/dist/layouts/clothing/pages/ProductDetailPage.d.ts +8 -0
  633. package/dist/layouts/clothing/pages/ProductDetailPage.d.ts.map +1 -0
  634. package/dist/layouts/clothing/pages/ProductDetailPage.js +416 -0
  635. package/dist/layouts/clothing/pages/ProductsPage.d.ts +7 -0
  636. package/dist/layouts/clothing/pages/ProductsPage.d.ts.map +1 -0
  637. package/dist/layouts/clothing/pages/ProductsPage.js +269 -0
  638. package/dist/layouts/clothing/payaza-bindings.d.ts +23 -0
  639. package/dist/layouts/clothing/payaza-bindings.d.ts.map +1 -0
  640. package/dist/layouts/clothing/payaza-bindings.js +17 -0
  641. package/dist/layouts/clothing/styles/clothing.css +80 -0
  642. package/dist/layouts/clothing-minimal/components/ClothingHomePageMinimal.d.ts +7 -0
  643. package/dist/layouts/clothing-minimal/components/ClothingHomePageMinimal.d.ts.map +1 -0
  644. package/dist/layouts/clothing-minimal/components/ClothingHomePageMinimal.js +171 -0
  645. package/dist/layouts/clothing-minimal/components/clothing-minimal-block-render.d.ts +40 -0
  646. package/dist/layouts/clothing-minimal/components/clothing-minimal-block-render.d.ts.map +1 -0
  647. package/dist/layouts/clothing-minimal/components/clothing-minimal-block-render.js +180 -0
  648. package/dist/layouts/clothing-minimal/index.d.ts +8 -0
  649. package/dist/layouts/clothing-minimal/index.d.ts.map +1 -0
  650. package/dist/layouts/clothing-minimal/index.js +8 -0
  651. package/dist/layouts/clothing-minimal/pages/AboutPage.d.ts +7 -0
  652. package/dist/layouts/clothing-minimal/pages/AboutPage.d.ts.map +1 -0
  653. package/dist/layouts/clothing-minimal/pages/AboutPage.js +71 -0
  654. package/dist/layouts/clothing-minimal/pages/CategoriesPage.d.ts +7 -0
  655. package/dist/layouts/clothing-minimal/pages/CategoriesPage.d.ts.map +1 -0
  656. package/dist/layouts/clothing-minimal/pages/CategoriesPage.js +35 -0
  657. package/dist/layouts/clothing-minimal/pages/CategoryPage.d.ts +8 -0
  658. package/dist/layouts/clothing-minimal/pages/CategoryPage.d.ts.map +1 -0
  659. package/dist/layouts/clothing-minimal/pages/CategoryPage.js +56 -0
  660. package/dist/layouts/clothing-minimal/pages/ContactPage.d.ts +7 -0
  661. package/dist/layouts/clothing-minimal/pages/ContactPage.d.ts.map +1 -0
  662. package/dist/layouts/clothing-minimal/pages/ContactPage.js +53 -0
  663. package/dist/layouts/clothing-minimal/pages/ProductDetailPage.d.ts +8 -0
  664. package/dist/layouts/clothing-minimal/pages/ProductDetailPage.d.ts.map +1 -0
  665. package/dist/layouts/clothing-minimal/pages/ProductDetailPage.js +455 -0
  666. package/dist/layouts/clothing-minimal/pages/ProductsPage.d.ts +7 -0
  667. package/dist/layouts/clothing-minimal/pages/ProductsPage.d.ts.map +1 -0
  668. package/dist/layouts/clothing-minimal/pages/ProductsPage.js +274 -0
  669. package/dist/layouts/electronics/components/ElectronicsCategoriesPage.d.ts +7 -0
  670. package/dist/layouts/electronics/components/ElectronicsCategoriesPage.d.ts.map +1 -0
  671. package/dist/layouts/electronics/components/ElectronicsCategoriesPage.js +40 -0
  672. package/dist/layouts/electronics/components/ElectronicsGridProductCard.d.ts +10 -0
  673. package/dist/layouts/electronics/components/ElectronicsGridProductCard.d.ts.map +1 -0
  674. package/dist/layouts/electronics/components/ElectronicsGridProductCard.js +122 -0
  675. package/dist/layouts/electronics/components/ElectronicsHomePage.d.ts +7 -0
  676. package/dist/layouts/electronics/components/ElectronicsHomePage.d.ts.map +1 -0
  677. package/dist/layouts/electronics/components/ElectronicsHomePage.js +104 -0
  678. package/dist/layouts/electronics/components/ElectronicsPageWrapper.d.ts +8 -0
  679. package/dist/layouts/electronics/components/ElectronicsPageWrapper.d.ts.map +1 -0
  680. package/dist/layouts/electronics/components/ElectronicsPageWrapper.js +10 -0
  681. package/dist/layouts/electronics/components/ElectronicsProductsPage.d.ts +7 -0
  682. package/dist/layouts/electronics/components/ElectronicsProductsPage.d.ts.map +1 -0
  683. package/dist/layouts/electronics/components/ElectronicsProductsPage.js +99 -0
  684. package/dist/layouts/electronics/components/ElectronicsStoreFooter.d.ts +7 -0
  685. package/dist/layouts/electronics/components/ElectronicsStoreFooter.d.ts.map +1 -0
  686. package/dist/layouts/electronics/components/ElectronicsStoreFooter.js +11 -0
  687. package/dist/layouts/electronics/components/ElectronicsStoreHeader.d.ts +7 -0
  688. package/dist/layouts/electronics/components/ElectronicsStoreHeader.d.ts.map +1 -0
  689. package/dist/layouts/electronics/components/ElectronicsStoreHeader.js +39 -0
  690. package/dist/layouts/electronics/index.d.ts +19 -0
  691. package/dist/layouts/electronics/index.d.ts.map +1 -0
  692. package/dist/layouts/electronics/index.js +19 -0
  693. package/dist/layouts/electronics/pages/AboutPage.d.ts +7 -0
  694. package/dist/layouts/electronics/pages/AboutPage.d.ts.map +1 -0
  695. package/dist/layouts/electronics/pages/AboutPage.js +51 -0
  696. package/dist/layouts/electronics/pages/CategoriesPage.d.ts +7 -0
  697. package/dist/layouts/electronics/pages/CategoriesPage.d.ts.map +1 -0
  698. package/dist/layouts/electronics/pages/CategoriesPage.js +6 -0
  699. package/dist/layouts/electronics/pages/CategoryPage.d.ts +8 -0
  700. package/dist/layouts/electronics/pages/CategoryPage.d.ts.map +1 -0
  701. package/dist/layouts/electronics/pages/CategoryPage.js +55 -0
  702. package/dist/layouts/electronics/pages/ContactPage.d.ts +7 -0
  703. package/dist/layouts/electronics/pages/ContactPage.d.ts.map +1 -0
  704. package/dist/layouts/electronics/pages/ContactPage.js +57 -0
  705. package/dist/layouts/electronics/pages/HelpCenterPage.d.ts +7 -0
  706. package/dist/layouts/electronics/pages/HelpCenterPage.d.ts.map +1 -0
  707. package/dist/layouts/electronics/pages/HelpCenterPage.js +55 -0
  708. package/dist/layouts/electronics/pages/PrivacyPolicyPage.d.ts +7 -0
  709. package/dist/layouts/electronics/pages/PrivacyPolicyPage.d.ts.map +1 -0
  710. package/dist/layouts/electronics/pages/PrivacyPolicyPage.js +9 -0
  711. package/dist/layouts/electronics/pages/ProductDetailPage.d.ts +8 -0
  712. package/dist/layouts/electronics/pages/ProductDetailPage.d.ts.map +1 -0
  713. package/dist/layouts/electronics/pages/ProductDetailPage.js +453 -0
  714. package/dist/layouts/electronics/pages/ProductsPage.d.ts +7 -0
  715. package/dist/layouts/electronics/pages/ProductsPage.d.ts.map +1 -0
  716. package/dist/layouts/electronics/pages/ProductsPage.js +273 -0
  717. package/dist/layouts/electronics/pages/ShippingReturnsPage.d.ts +7 -0
  718. package/dist/layouts/electronics/pages/ShippingReturnsPage.d.ts.map +1 -0
  719. package/dist/layouts/electronics/pages/ShippingReturnsPage.js +7 -0
  720. package/dist/layouts/electronics/pages/TermsPage.d.ts +7 -0
  721. package/dist/layouts/electronics/pages/TermsPage.d.ts.map +1 -0
  722. package/dist/layouts/electronics/pages/TermsPage.js +9 -0
  723. package/dist/layouts/electronics/pages/TrackOrderPage.d.ts +7 -0
  724. package/dist/layouts/electronics/pages/TrackOrderPage.d.ts.map +1 -0
  725. package/dist/layouts/electronics/pages/TrackOrderPage.js +376 -0
  726. package/dist/layouts/electronics-grid/components/ElectronicsGridProductCard.d.ts +10 -0
  727. package/dist/layouts/electronics-grid/components/ElectronicsGridProductCard.d.ts.map +1 -0
  728. package/dist/layouts/electronics-grid/components/ElectronicsGridProductCard.js +122 -0
  729. package/dist/layouts/electronics-grid/components/ElectronicsHomePageGrid.d.ts +7 -0
  730. package/dist/layouts/electronics-grid/components/ElectronicsHomePageGrid.d.ts.map +1 -0
  731. package/dist/layouts/electronics-grid/components/ElectronicsHomePageGrid.js +112 -0
  732. package/dist/layouts/electronics-grid/index.d.ts +15 -0
  733. package/dist/layouts/electronics-grid/index.d.ts.map +1 -0
  734. package/dist/layouts/electronics-grid/index.js +15 -0
  735. package/dist/layouts/electronics-grid/pages/AboutPage.d.ts +7 -0
  736. package/dist/layouts/electronics-grid/pages/AboutPage.d.ts.map +1 -0
  737. package/dist/layouts/electronics-grid/pages/AboutPage.js +51 -0
  738. package/dist/layouts/electronics-grid/pages/CategoriesPage.d.ts +7 -0
  739. package/dist/layouts/electronics-grid/pages/CategoriesPage.d.ts.map +1 -0
  740. package/dist/layouts/electronics-grid/pages/CategoriesPage.js +6 -0
  741. package/dist/layouts/electronics-grid/pages/CategoryPage.d.ts +8 -0
  742. package/dist/layouts/electronics-grid/pages/CategoryPage.d.ts.map +1 -0
  743. package/dist/layouts/electronics-grid/pages/CategoryPage.js +55 -0
  744. package/dist/layouts/electronics-grid/pages/ContactPage.d.ts +7 -0
  745. package/dist/layouts/electronics-grid/pages/ContactPage.d.ts.map +1 -0
  746. package/dist/layouts/electronics-grid/pages/ContactPage.js +57 -0
  747. package/dist/layouts/electronics-grid/pages/ElectronicsGridCategoriesPage.d.ts +7 -0
  748. package/dist/layouts/electronics-grid/pages/ElectronicsGridCategoriesPage.d.ts.map +1 -0
  749. package/dist/layouts/electronics-grid/pages/ElectronicsGridCategoriesPage.js +26 -0
  750. package/dist/layouts/electronics-grid/pages/HelpCenterPage.d.ts +7 -0
  751. package/dist/layouts/electronics-grid/pages/HelpCenterPage.d.ts.map +1 -0
  752. package/dist/layouts/electronics-grid/pages/HelpCenterPage.js +55 -0
  753. package/dist/layouts/electronics-grid/pages/PrivacyPolicyPage.d.ts +7 -0
  754. package/dist/layouts/electronics-grid/pages/PrivacyPolicyPage.d.ts.map +1 -0
  755. package/dist/layouts/electronics-grid/pages/PrivacyPolicyPage.js +9 -0
  756. package/dist/layouts/electronics-grid/pages/ProductDetailPage.d.ts +8 -0
  757. package/dist/layouts/electronics-grid/pages/ProductDetailPage.d.ts.map +1 -0
  758. package/dist/layouts/electronics-grid/pages/ProductDetailPage.js +453 -0
  759. package/dist/layouts/electronics-grid/pages/ProductsPage.d.ts +7 -0
  760. package/dist/layouts/electronics-grid/pages/ProductsPage.d.ts.map +1 -0
  761. package/dist/layouts/electronics-grid/pages/ProductsPage.js +273 -0
  762. package/dist/layouts/electronics-grid/pages/ShippingReturnsPage.d.ts +7 -0
  763. package/dist/layouts/electronics-grid/pages/ShippingReturnsPage.d.ts.map +1 -0
  764. package/dist/layouts/electronics-grid/pages/ShippingReturnsPage.js +7 -0
  765. package/dist/layouts/electronics-grid/pages/TermsPage.d.ts +7 -0
  766. package/dist/layouts/electronics-grid/pages/TermsPage.d.ts.map +1 -0
  767. package/dist/layouts/electronics-grid/pages/TermsPage.js +9 -0
  768. package/dist/layouts/electronics-grid/pages/TrackOrderPage.d.ts +7 -0
  769. package/dist/layouts/electronics-grid/pages/TrackOrderPage.d.ts.map +1 -0
  770. package/dist/layouts/electronics-grid/pages/TrackOrderPage.js +376 -0
  771. package/dist/layouts/food/components/FoodHomePage.d.ts +7 -0
  772. package/dist/layouts/food/components/FoodHomePage.d.ts.map +1 -0
  773. package/dist/layouts/food/components/FoodHomePage.js +387 -0
  774. package/dist/layouts/food/index.d.ts +9 -0
  775. package/dist/layouts/food/index.d.ts.map +1 -0
  776. package/dist/layouts/food/index.js +9 -0
  777. package/dist/layouts/food/pages/AboutPage.d.ts +7 -0
  778. package/dist/layouts/food/pages/AboutPage.d.ts.map +1 -0
  779. package/dist/layouts/food/pages/AboutPage.js +67 -0
  780. package/dist/layouts/food/pages/CategoriesPage.d.ts +7 -0
  781. package/dist/layouts/food/pages/CategoriesPage.d.ts.map +1 -0
  782. package/dist/layouts/food/pages/CategoriesPage.js +26 -0
  783. package/dist/layouts/food/pages/CategoryPage.d.ts +8 -0
  784. package/dist/layouts/food/pages/CategoryPage.d.ts.map +1 -0
  785. package/dist/layouts/food/pages/CategoryPage.js +65 -0
  786. package/dist/layouts/food/pages/ContactPage.d.ts +7 -0
  787. package/dist/layouts/food/pages/ContactPage.d.ts.map +1 -0
  788. package/dist/layouts/food/pages/ContactPage.js +55 -0
  789. package/dist/layouts/food/pages/MenuPage.d.ts +8 -0
  790. package/dist/layouts/food/pages/MenuPage.d.ts.map +1 -0
  791. package/dist/layouts/food/pages/MenuPage.js +107 -0
  792. package/dist/layouts/food/pages/ProductDetailPage.d.ts +8 -0
  793. package/dist/layouts/food/pages/ProductDetailPage.d.ts.map +1 -0
  794. package/dist/layouts/food/pages/ProductDetailPage.js +506 -0
  795. package/dist/layouts/food/pages/ProductsPage.d.ts +7 -0
  796. package/dist/layouts/food/pages/ProductsPage.d.ts.map +1 -0
  797. package/dist/layouts/food/pages/ProductsPage.js +174 -0
  798. package/dist/layouts/food-modern/components/FoodHomePageModern.d.ts +7 -0
  799. package/dist/layouts/food-modern/components/FoodHomePageModern.d.ts.map +1 -0
  800. package/dist/layouts/food-modern/components/FoodHomePageModern.js +101 -0
  801. package/dist/layouts/food-modern/index.d.ts +9 -0
  802. package/dist/layouts/food-modern/index.d.ts.map +1 -0
  803. package/dist/layouts/food-modern/index.js +9 -0
  804. package/dist/layouts/food-modern/pages/AboutPage.d.ts +7 -0
  805. package/dist/layouts/food-modern/pages/AboutPage.d.ts.map +1 -0
  806. package/dist/layouts/food-modern/pages/AboutPage.js +52 -0
  807. package/dist/layouts/food-modern/pages/CategoriesPage.d.ts +7 -0
  808. package/dist/layouts/food-modern/pages/CategoriesPage.d.ts.map +1 -0
  809. package/dist/layouts/food-modern/pages/CategoriesPage.js +23 -0
  810. package/dist/layouts/food-modern/pages/CategoryPage.d.ts +8 -0
  811. package/dist/layouts/food-modern/pages/CategoryPage.d.ts.map +1 -0
  812. package/dist/layouts/food-modern/pages/CategoryPage.js +64 -0
  813. package/dist/layouts/food-modern/pages/ContactPage.d.ts +7 -0
  814. package/dist/layouts/food-modern/pages/ContactPage.d.ts.map +1 -0
  815. package/dist/layouts/food-modern/pages/ContactPage.js +55 -0
  816. package/dist/layouts/food-modern/pages/MenuPage.d.ts +8 -0
  817. package/dist/layouts/food-modern/pages/MenuPage.d.ts.map +1 -0
  818. package/dist/layouts/food-modern/pages/MenuPage.js +110 -0
  819. package/dist/layouts/food-modern/pages/ProductDetailPage.d.ts +8 -0
  820. package/dist/layouts/food-modern/pages/ProductDetailPage.d.ts.map +1 -0
  821. package/dist/layouts/food-modern/pages/ProductDetailPage.js +450 -0
  822. package/dist/layouts/food-modern/pages/ProductsPage.d.ts +7 -0
  823. package/dist/layouts/food-modern/pages/ProductsPage.d.ts.map +1 -0
  824. package/dist/layouts/food-modern/pages/ProductsPage.js +175 -0
  825. package/dist/layouts/motivational-speaker/components/MotivationalHomePage.d.ts +7 -0
  826. package/dist/layouts/motivational-speaker/components/MotivationalHomePage.d.ts.map +1 -0
  827. package/dist/layouts/motivational-speaker/components/MotivationalHomePage.js +131 -0
  828. package/dist/layouts/motivational-speaker/components/MotivationalSpeakerPageWrapper.d.ts +3 -0
  829. package/dist/layouts/motivational-speaker/components/MotivationalSpeakerPageWrapper.d.ts.map +1 -0
  830. package/dist/layouts/motivational-speaker/components/MotivationalSpeakerPageWrapper.js +7 -0
  831. package/dist/layouts/motivational-speaker/index.d.ts +10 -0
  832. package/dist/layouts/motivational-speaker/index.d.ts.map +1 -0
  833. package/dist/layouts/motivational-speaker/index.js +10 -0
  834. package/dist/layouts/motivational-speaker/pages/AboutPage.d.ts +7 -0
  835. package/dist/layouts/motivational-speaker/pages/AboutPage.d.ts.map +1 -0
  836. package/dist/layouts/motivational-speaker/pages/AboutPage.js +51 -0
  837. package/dist/layouts/motivational-speaker/pages/CategoryPage.d.ts +8 -0
  838. package/dist/layouts/motivational-speaker/pages/CategoryPage.d.ts.map +1 -0
  839. package/dist/layouts/motivational-speaker/pages/CategoryPage.js +72 -0
  840. package/dist/layouts/motivational-speaker/pages/ContactPage.d.ts +7 -0
  841. package/dist/layouts/motivational-speaker/pages/ContactPage.d.ts.map +1 -0
  842. package/dist/layouts/motivational-speaker/pages/ContactPage.js +57 -0
  843. package/dist/layouts/motivational-speaker/pages/ProductsPage.d.ts +7 -0
  844. package/dist/layouts/motivational-speaker/pages/ProductsPage.d.ts.map +1 -0
  845. package/dist/layouts/motivational-speaker/pages/ProductsPage.js +273 -0
  846. package/dist/layouts/motivational-speaker/pages/ServiceDetailPage.d.ts +8 -0
  847. package/dist/layouts/motivational-speaker/pages/ServiceDetailPage.d.ts.map +1 -0
  848. package/dist/layouts/motivational-speaker/pages/ServiceDetailPage.js +153 -0
  849. package/dist/layouts/motivational-speaker/pages/ServicesPage.d.ts +9 -0
  850. package/dist/layouts/motivational-speaker/pages/ServicesPage.d.ts.map +1 -0
  851. package/dist/layouts/motivational-speaker/pages/ServicesPage.js +46 -0
  852. package/dist/layouts/motivational-speaker/pages/SubscriptionPage.d.ts +7 -0
  853. package/dist/layouts/motivational-speaker/pages/SubscriptionPage.d.ts.map +1 -0
  854. package/dist/layouts/motivational-speaker/pages/SubscriptionPage.js +137 -0
  855. package/dist/layouts/shared/components/BaseStoreLayout.d.ts +8 -0
  856. package/dist/layouts/shared/components/BaseStoreLayout.d.ts.map +1 -0
  857. package/dist/layouts/shared/components/BaseStoreLayout.js +49 -0
  858. package/dist/layouts/shared/components/CartLineQuantityControl.d.ts +12 -0
  859. package/dist/layouts/shared/components/CartLineQuantityControl.d.ts.map +1 -0
  860. package/dist/layouts/shared/components/CartLineQuantityControl.js +99 -0
  861. package/dist/layouts/shared/components/GenericPageWrapper.d.ts +8 -0
  862. package/dist/layouts/shared/components/GenericPageWrapper.d.ts.map +1 -0
  863. package/dist/layouts/shared/components/GenericPageWrapper.js +24 -0
  864. package/dist/layouts/shared/components/ProductPriceFilterSection.d.ts +17 -0
  865. package/dist/layouts/shared/components/ProductPriceFilterSection.d.ts.map +1 -0
  866. package/dist/layouts/shared/components/ProductPriceFilterSection.js +128 -0
  867. package/dist/layouts/shared/components/PromoBanner.d.ts +12 -0
  868. package/dist/layouts/shared/components/PromoBanner.d.ts.map +1 -0
  869. package/dist/layouts/shared/components/PromoBanner.js +17 -0
  870. package/dist/layouts/shared/components/StoreFooter.d.ts +7 -0
  871. package/dist/layouts/shared/components/StoreFooter.d.ts.map +1 -0
  872. package/dist/layouts/shared/components/StoreFooter.js +156 -0
  873. package/dist/layouts/shared/components/StoreHeader.d.ts +8 -0
  874. package/dist/layouts/shared/components/StoreHeader.d.ts.map +1 -0
  875. package/dist/layouts/shared/components/StoreHeader.js +111 -0
  876. package/dist/layouts/shared/components/TestimonialCard.d.ts +8 -0
  877. package/dist/layouts/shared/components/TestimonialCard.d.ts.map +1 -0
  878. package/dist/layouts/shared/components/TestimonialCard.js +10 -0
  879. package/dist/layouts/shared/components/headers/BookingAgendaSidebar.d.ts +8 -0
  880. package/dist/layouts/shared/components/headers/BookingAgendaSidebar.d.ts.map +1 -0
  881. package/dist/layouts/shared/components/headers/BookingAgendaSidebar.js +16 -0
  882. package/dist/layouts/shared/components/headers/ClothingMinimalHeader.d.ts +7 -0
  883. package/dist/layouts/shared/components/headers/ClothingMinimalHeader.d.ts.map +1 -0
  884. package/dist/layouts/shared/components/headers/ClothingMinimalHeader.js +39 -0
  885. package/dist/layouts/shared/components/headers/FoodModernHeader.d.ts +7 -0
  886. package/dist/layouts/shared/components/headers/FoodModernHeader.d.ts.map +1 -0
  887. package/dist/layouts/shared/components/headers/FoodModernHeader.js +61 -0
  888. package/dist/layouts/shared/index.d.ts +23 -0
  889. package/dist/layouts/shared/index.d.ts.map +1 -0
  890. package/dist/layouts/shared/index.js +23 -0
  891. package/dist/layouts/shared/pages/AccountPage.d.ts +7 -0
  892. package/dist/layouts/shared/pages/AccountPage.d.ts.map +1 -0
  893. package/dist/layouts/shared/pages/AccountPage.js +549 -0
  894. package/dist/layouts/shared/pages/CartPage.d.ts +7 -0
  895. package/dist/layouts/shared/pages/CartPage.d.ts.map +1 -0
  896. package/dist/layouts/shared/pages/CartPage.js +135 -0
  897. package/dist/layouts/shared/pages/CheckoutPage.d.ts +7 -0
  898. package/dist/layouts/shared/pages/CheckoutPage.d.ts.map +1 -0
  899. package/dist/layouts/shared/pages/CheckoutPage.js +1450 -0
  900. package/dist/layouts/shared/pages/CookiePolicyPage.d.ts +7 -0
  901. package/dist/layouts/shared/pages/CookiePolicyPage.d.ts.map +1 -0
  902. package/dist/layouts/shared/pages/CookiePolicyPage.js +9 -0
  903. package/dist/layouts/shared/pages/FeatureDisabledPage.d.ts +9 -0
  904. package/dist/layouts/shared/pages/FeatureDisabledPage.d.ts.map +1 -0
  905. package/dist/layouts/shared/pages/FeatureDisabledPage.js +8 -0
  906. package/dist/layouts/shared/pages/HelpCenterPage.d.ts +7 -0
  907. package/dist/layouts/shared/pages/HelpCenterPage.d.ts.map +1 -0
  908. package/dist/layouts/shared/pages/HelpCenterPage.js +55 -0
  909. package/dist/layouts/shared/pages/MaintenancePage.d.ts +7 -0
  910. package/dist/layouts/shared/pages/MaintenancePage.d.ts.map +1 -0
  911. package/dist/layouts/shared/pages/MaintenancePage.js +10 -0
  912. package/dist/layouts/shared/pages/PortfolioPage.d.ts +7 -0
  913. package/dist/layouts/shared/pages/PortfolioPage.d.ts.map +1 -0
  914. package/dist/layouts/shared/pages/PortfolioPage.js +130 -0
  915. package/dist/layouts/shared/pages/PrivacyPolicyPage.d.ts +7 -0
  916. package/dist/layouts/shared/pages/PrivacyPolicyPage.d.ts.map +1 -0
  917. package/dist/layouts/shared/pages/PrivacyPolicyPage.js +9 -0
  918. package/dist/layouts/shared/pages/ShippingReturnsPage.d.ts +7 -0
  919. package/dist/layouts/shared/pages/ShippingReturnsPage.d.ts.map +1 -0
  920. package/dist/layouts/shared/pages/ShippingReturnsPage.js +7 -0
  921. package/dist/layouts/shared/pages/SizeGuidePage.d.ts +7 -0
  922. package/dist/layouts/shared/pages/SizeGuidePage.d.ts.map +1 -0
  923. package/dist/layouts/shared/pages/SizeGuidePage.js +10 -0
  924. package/dist/layouts/shared/pages/StyleGuidePage.d.ts +7 -0
  925. package/dist/layouts/shared/pages/StyleGuidePage.d.ts.map +1 -0
  926. package/dist/layouts/shared/pages/StyleGuidePage.js +126 -0
  927. package/dist/layouts/shared/pages/TeamPage.d.ts +7 -0
  928. package/dist/layouts/shared/pages/TeamPage.d.ts.map +1 -0
  929. package/dist/layouts/shared/pages/TeamPage.js +39 -0
  930. package/dist/layouts/shared/pages/TermsPage.d.ts +7 -0
  931. package/dist/layouts/shared/pages/TermsPage.d.ts.map +1 -0
  932. package/dist/layouts/shared/pages/TermsPage.js +9 -0
  933. package/dist/layouts/shared/pages/TrackOrderPage.d.ts +7 -0
  934. package/dist/layouts/shared/pages/TrackOrderPage.d.ts.map +1 -0
  935. package/dist/layouts/shared/pages/TrackOrderPage.js +379 -0
  936. package/dist/layouts/shared/pages/WishlistPage.d.ts +7 -0
  937. package/dist/layouts/shared/pages/WishlistPage.d.ts.map +1 -0
  938. package/dist/layouts/shared/pages/WishlistPage.js +144 -0
  939. package/dist/layouts/shared/wrappers/BookingAgendaLayout.d.ts +14 -0
  940. package/dist/layouts/shared/wrappers/BookingAgendaLayout.d.ts.map +1 -0
  941. package/dist/layouts/shared/wrappers/BookingAgendaLayout.js +152 -0
  942. package/dist/layouts/shared/wrappers/ClothingLayout.d.ts +10 -0
  943. package/dist/layouts/shared/wrappers/ClothingLayout.d.ts.map +1 -0
  944. package/dist/layouts/shared/wrappers/ClothingLayout.js +44 -0
  945. package/dist/layouts/shared/wrappers/ClothingMinimalLayout.d.ts +8 -0
  946. package/dist/layouts/shared/wrappers/ClothingMinimalLayout.d.ts.map +1 -0
  947. package/dist/layouts/shared/wrappers/ClothingMinimalLayout.js +48 -0
  948. package/dist/layouts/shared/wrappers/ElectronicsLayout.d.ts +8 -0
  949. package/dist/layouts/shared/wrappers/ElectronicsLayout.d.ts.map +1 -0
  950. package/dist/layouts/shared/wrappers/ElectronicsLayout.js +40 -0
  951. package/dist/layouts/shared/wrappers/FoodModernLayout.d.ts +8 -0
  952. package/dist/layouts/shared/wrappers/FoodModernLayout.d.ts.map +1 -0
  953. package/dist/layouts/shared/wrappers/FoodModernLayout.js +48 -0
  954. package/dist/layouts/shared/wrappers/MotivationalLayout.d.ts +8 -0
  955. package/dist/layouts/shared/wrappers/MotivationalLayout.d.ts.map +1 -0
  956. package/dist/layouts/shared/wrappers/MotivationalLayout.js +51 -0
  957. package/dist/layouts/shared/wrappers/StandardLayout.d.ts +8 -0
  958. package/dist/layouts/shared/wrappers/StandardLayout.d.ts.map +1 -0
  959. package/dist/layouts/shared/wrappers/StandardLayout.js +45 -0
  960. package/dist/lib/alignment-schemas.d.ts +51 -0
  961. package/dist/lib/alignment-schemas.d.ts.map +1 -0
  962. package/dist/lib/alignment-schemas.js +637 -0
  963. package/dist/lib/api.d.ts +11 -0
  964. package/dist/lib/api.d.ts.map +1 -0
  965. package/dist/lib/api.js +167 -0
  966. package/dist/lib/auth-context.d.ts +49 -0
  967. package/dist/lib/auth-context.d.ts.map +1 -0
  968. package/dist/lib/auth-context.js +296 -0
  969. package/dist/lib/checkout-availability.d.ts +10 -0
  970. package/dist/lib/checkout-availability.d.ts.map +1 -0
  971. package/dist/lib/checkout-availability.js +16 -0
  972. package/dist/lib/compact-array-items.d.ts +7 -0
  973. package/dist/lib/compact-array-items.d.ts.map +1 -0
  974. package/dist/lib/compact-array-items.js +13 -0
  975. package/dist/lib/content-selectors.d.ts +21 -0
  976. package/dist/lib/content-selectors.d.ts.map +1 -0
  977. package/dist/lib/content-selectors.js +75 -0
  978. package/dist/lib/countries.d.ts +13 -0
  979. package/dist/lib/countries.d.ts.map +1 -0
  980. package/dist/lib/countries.js +292 -0
  981. package/dist/lib/currency-symbols.d.ts +36 -0
  982. package/dist/lib/currency-symbols.d.ts.map +1 -0
  983. package/dist/lib/currency-symbols.js +153 -0
  984. package/dist/lib/guest-user.d.ts +27 -0
  985. package/dist/lib/guest-user.d.ts.map +1 -0
  986. package/dist/lib/guest-user.js +71 -0
  987. package/dist/lib/inventory-utils.d.ts +41 -0
  988. package/dist/lib/inventory-utils.d.ts.map +1 -0
  989. package/dist/lib/inventory-utils.js +180 -0
  990. package/dist/lib/layout-badges.d.ts +4 -0
  991. package/dist/lib/layout-badges.d.ts.map +1 -0
  992. package/dist/lib/layout-badges.js +5 -0
  993. package/dist/lib/layout-config-hydration.d.ts +25 -0
  994. package/dist/lib/layout-config-hydration.d.ts.map +1 -0
  995. package/dist/lib/layout-config-hydration.js +264 -0
  996. package/dist/lib/layout-field-normalize.d.ts +18 -0
  997. package/dist/lib/layout-field-normalize.d.ts.map +1 -0
  998. package/dist/lib/layout-field-normalize.js +190 -0
  999. package/dist/lib/layout-route-utils.d.ts +30 -0
  1000. package/dist/lib/layout-route-utils.d.ts.map +1 -0
  1001. package/dist/lib/layout-route-utils.js +79 -0
  1002. package/dist/lib/limited-time-offer.d.ts +6 -0
  1003. package/dist/lib/limited-time-offer.d.ts.map +1 -0
  1004. package/dist/lib/limited-time-offer.js +24 -0
  1005. package/dist/lib/loading-context.d.ts +20 -0
  1006. package/dist/lib/loading-context.d.ts.map +1 -0
  1007. package/dist/lib/loading-context.js +212 -0
  1008. package/dist/lib/mixpanel.d.ts +11 -0
  1009. package/dist/lib/mixpanel.d.ts.map +1 -0
  1010. package/dist/lib/mixpanel.js +61 -0
  1011. package/dist/lib/mock-stores.d.ts +24 -0
  1012. package/dist/lib/mock-stores.d.ts.map +1 -0
  1013. package/dist/lib/mock-stores.js +2106 -0
  1014. package/dist/lib/order-success-cart.d.ts +5 -0
  1015. package/dist/lib/order-success-cart.d.ts.map +1 -0
  1016. package/dist/lib/order-success-cart.js +50 -0
  1017. package/dist/lib/payaza-checkout.d.ts +147 -0
  1018. package/dist/lib/payaza-checkout.d.ts.map +1 -0
  1019. package/dist/lib/payaza-checkout.js +717 -0
  1020. package/dist/lib/payaza-section-styles.d.ts +16 -0
  1021. package/dist/lib/payaza-section-styles.d.ts.map +1 -0
  1022. package/dist/lib/payaza-section-styles.js +93 -0
  1023. package/dist/lib/preview-data.d.ts +58 -0
  1024. package/dist/lib/preview-data.d.ts.map +1 -0
  1025. package/dist/lib/preview-data.js +2576 -0
  1026. package/dist/lib/product-variation-utils.d.ts +19 -0
  1027. package/dist/lib/product-variation-utils.d.ts.map +1 -0
  1028. package/dist/lib/product-variation-utils.js +185 -0
  1029. package/dist/lib/rich-html.d.ts +38 -0
  1030. package/dist/lib/rich-html.d.ts.map +1 -0
  1031. package/dist/lib/rich-html.js +272 -0
  1032. package/dist/lib/services/analytics.service.d.ts +59 -0
  1033. package/dist/lib/services/analytics.service.d.ts.map +1 -0
  1034. package/dist/lib/services/analytics.service.js +382 -0
  1035. package/dist/lib/services/auth.service.d.ts +63 -0
  1036. package/dist/lib/services/auth.service.d.ts.map +1 -0
  1037. package/dist/lib/services/auth.service.js +101 -0
  1038. package/dist/lib/services/booking.service.d.ts +53 -0
  1039. package/dist/lib/services/booking.service.d.ts.map +1 -0
  1040. package/dist/lib/services/booking.service.js +52 -0
  1041. package/dist/lib/services/category.service.d.ts +21 -0
  1042. package/dist/lib/services/category.service.d.ts.map +1 -0
  1043. package/dist/lib/services/category.service.js +41 -0
  1044. package/dist/lib/services/checkout.service.d.ts +168 -0
  1045. package/dist/lib/services/checkout.service.d.ts.map +1 -0
  1046. package/dist/lib/services/checkout.service.js +48 -0
  1047. package/dist/lib/services/contact.service.d.ts +26 -0
  1048. package/dist/lib/services/contact.service.d.ts.map +1 -0
  1049. package/dist/lib/services/contact.service.js +23 -0
  1050. package/dist/lib/services/customer.service.d.ts +54 -0
  1051. package/dist/lib/services/customer.service.d.ts.map +1 -0
  1052. package/dist/lib/services/customer.service.js +64 -0
  1053. package/dist/lib/services/fees.service.d.ts +85 -0
  1054. package/dist/lib/services/fees.service.d.ts.map +1 -0
  1055. package/dist/lib/services/fees.service.js +147 -0
  1056. package/dist/lib/services/index.d.ts +19 -0
  1057. package/dist/lib/services/index.d.ts.map +1 -0
  1058. package/dist/lib/services/index.js +18 -0
  1059. package/dist/lib/services/location.service.d.ts +31 -0
  1060. package/dist/lib/services/location.service.d.ts.map +1 -0
  1061. package/dist/lib/services/location.service.js +25 -0
  1062. package/dist/lib/services/order.service.d.ts +5 -0
  1063. package/dist/lib/services/order.service.d.ts.map +1 -0
  1064. package/dist/lib/services/order.service.js +12 -0
  1065. package/dist/lib/services/payment.service.d.ts +56 -0
  1066. package/dist/lib/services/payment.service.d.ts.map +1 -0
  1067. package/dist/lib/services/payment.service.js +122 -0
  1068. package/dist/lib/services/product.service.d.ts +92 -0
  1069. package/dist/lib/services/product.service.d.ts.map +1 -0
  1070. package/dist/lib/services/product.service.js +86 -0
  1071. package/dist/lib/services/promo.service.d.ts +31 -0
  1072. package/dist/lib/services/promo.service.d.ts.map +1 -0
  1073. package/dist/lib/services/promo.service.js +29 -0
  1074. package/dist/lib/services/review.service.d.ts +47 -0
  1075. package/dist/lib/services/review.service.d.ts.map +1 -0
  1076. package/dist/lib/services/review.service.js +54 -0
  1077. package/dist/lib/services/service.service.d.ts +55 -0
  1078. package/dist/lib/services/service.service.d.ts.map +1 -0
  1079. package/dist/lib/services/service.service.js +37 -0
  1080. package/dist/lib/services/shipping.service.d.ts +62 -0
  1081. package/dist/lib/services/shipping.service.d.ts.map +1 -0
  1082. package/dist/lib/services/shipping.service.js +39 -0
  1083. package/dist/lib/services/store.service.d.ts +89 -0
  1084. package/dist/lib/services/store.service.d.ts.map +1 -0
  1085. package/dist/lib/services/store.service.js +41 -0
  1086. package/dist/lib/shipping-address.util.d.ts +76 -0
  1087. package/dist/lib/shipping-address.util.d.ts.map +1 -0
  1088. package/dist/lib/shipping-address.util.js +149 -0
  1089. package/dist/lib/shipping-settings.util.d.ts +4 -0
  1090. package/dist/lib/shipping-settings.util.d.ts.map +1 -0
  1091. package/dist/lib/shipping-settings.util.js +6 -0
  1092. package/dist/lib/store-config-utils.d.ts +50 -0
  1093. package/dist/lib/store-config-utils.d.ts.map +1 -0
  1094. package/dist/lib/store-config-utils.js +1737 -0
  1095. package/dist/lib/store-config.d.ts +4 -0
  1096. package/dist/lib/store-config.d.ts.map +1 -0
  1097. package/dist/lib/store-config.js +4 -0
  1098. package/dist/lib/store-context.d.ts +69 -0
  1099. package/dist/lib/store-context.d.ts.map +1 -0
  1100. package/dist/lib/store-context.js +483 -0
  1101. package/dist/lib/store-types.d.ts +921 -0
  1102. package/dist/lib/store-types.d.ts.map +1 -0
  1103. package/dist/lib/store-types.js +1 -0
  1104. package/dist/lib/template-pages.d.ts +8 -0
  1105. package/dist/lib/template-pages.d.ts.map +1 -0
  1106. package/dist/lib/template-pages.js +62 -0
  1107. package/dist/lib/utils/asset-helpers.d.ts +111 -0
  1108. package/dist/lib/utils/asset-helpers.d.ts.map +1 -0
  1109. package/dist/lib/utils/asset-helpers.js +462 -0
  1110. package/dist/lib/utils/catalog-price-bounds.d.ts +13 -0
  1111. package/dist/lib/utils/catalog-price-bounds.d.ts.map +1 -0
  1112. package/dist/lib/utils/catalog-price-bounds.js +24 -0
  1113. package/dist/lib/utils/category-tree.d.ts +25 -0
  1114. package/dist/lib/utils/category-tree.d.ts.map +1 -0
  1115. package/dist/lib/utils/category-tree.js +85 -0
  1116. package/dist/lib/utils/demo-detection.d.ts +23 -0
  1117. package/dist/lib/utils/demo-detection.d.ts.map +1 -0
  1118. package/dist/lib/utils/demo-detection.js +36 -0
  1119. package/dist/lib/utils/editor-preview.d.ts +42 -0
  1120. package/dist/lib/utils/editor-preview.d.ts.map +1 -0
  1121. package/dist/lib/utils/editor-preview.js +214 -0
  1122. package/dist/lib/utils/fee-calculations.d.ts +35 -0
  1123. package/dist/lib/utils/fee-calculations.d.ts.map +1 -0
  1124. package/dist/lib/utils/fee-calculations.js +81 -0
  1125. package/dist/lib/utils/footer-nav-defaults.d.ts +11 -0
  1126. package/dist/lib/utils/footer-nav-defaults.d.ts.map +1 -0
  1127. package/dist/lib/utils/footer-nav-defaults.js +67 -0
  1128. package/dist/lib/utils/idempotency-key.d.ts +15 -0
  1129. package/dist/lib/utils/idempotency-key.d.ts.map +1 -0
  1130. package/dist/lib/utils/idempotency-key.js +22 -0
  1131. package/dist/lib/utils/index.d.ts +45 -0
  1132. package/dist/lib/utils/index.d.ts.map +1 -0
  1133. package/dist/lib/utils/index.js +197 -0
  1134. package/dist/lib/utils/mobile-editor.d.ts +13 -0
  1135. package/dist/lib/utils/mobile-editor.d.ts.map +1 -0
  1136. package/dist/lib/utils/mobile-editor.js +34 -0
  1137. package/dist/lib/utils/phone-format.d.ts +6 -0
  1138. package/dist/lib/utils/phone-format.d.ts.map +1 -0
  1139. package/dist/lib/utils/phone-format.js +17 -0
  1140. package/dist/lib/utils/product-catalog.d.ts +11 -0
  1141. package/dist/lib/utils/product-catalog.d.ts.map +1 -0
  1142. package/dist/lib/utils/product-catalog.js +40 -0
  1143. package/dist/lib/utils/product-images.d.ts +20 -0
  1144. package/dist/lib/utils/product-images.d.ts.map +1 -0
  1145. package/dist/lib/utils/product-images.js +31 -0
  1146. package/dist/lib/utils/product-share.d.ts +17 -0
  1147. package/dist/lib/utils/product-share.d.ts.map +1 -0
  1148. package/dist/lib/utils/product-share.js +48 -0
  1149. package/dist/lib/utils/scroll-to-top.util.d.ts +9 -0
  1150. package/dist/lib/utils/scroll-to-top.util.d.ts.map +1 -0
  1151. package/dist/lib/utils/scroll-to-top.util.js +18 -0
  1152. package/dist/lib/utils/url-helpers.d.ts +30 -0
  1153. package/dist/lib/utils/url-helpers.d.ts.map +1 -0
  1154. package/dist/lib/utils/url-helpers.js +61 -0
  1155. package/dist/lib/utils/video-helpers.d.ts +32 -0
  1156. package/dist/lib/utils/video-helpers.d.ts.map +1 -0
  1157. package/dist/lib/utils/video-helpers.js +210 -0
  1158. package/dist/preview/LayoutPreview.d.ts +14 -0
  1159. package/dist/preview/LayoutPreview.d.ts.map +1 -0
  1160. package/dist/preview/LayoutPreview.js +122 -0
  1161. package/dist/preview/PreviewRouter.d.ts +9 -0
  1162. package/dist/preview/PreviewRouter.d.ts.map +1 -0
  1163. package/dist/preview/PreviewRouter.js +332 -0
  1164. package/dist/preview/ShadowDOMWrapper.d.ts +18 -0
  1165. package/dist/preview/ShadowDOMWrapper.d.ts.map +1 -0
  1166. package/dist/preview/ShadowDOMWrapper.js +80 -0
  1167. package/dist/preview/canvas/PreviewBlockToolbar.d.ts +23 -0
  1168. package/dist/preview/canvas/PreviewBlockToolbar.d.ts.map +1 -0
  1169. package/dist/preview/canvas/PreviewBlockToolbar.js +113 -0
  1170. package/dist/preview/canvas/PreviewCanvasEnhancer.d.ts +17 -0
  1171. package/dist/preview/canvas/PreviewCanvasEnhancer.d.ts.map +1 -0
  1172. package/dist/preview/canvas/PreviewCanvasEnhancer.js +741 -0
  1173. package/dist/preview/canvas/PreviewCanvasStyles.d.ts +4 -0
  1174. package/dist/preview/canvas/PreviewCanvasStyles.d.ts.map +1 -0
  1175. package/dist/preview/canvas/PreviewCanvasStyles.js +51 -0
  1176. package/dist/preview/canvas/extract-editable-plain-text.d.ts +11 -0
  1177. package/dist/preview/canvas/extract-editable-plain-text.d.ts.map +1 -0
  1178. package/dist/preview/canvas/extract-editable-plain-text.js +65 -0
  1179. package/dist/preview/canvas/field-key.d.ts +34 -0
  1180. package/dist/preview/canvas/field-key.d.ts.map +1 -0
  1181. package/dist/preview/canvas/field-key.js +62 -0
  1182. package/dist/preview/canvas/preview-editable-commit.util.d.ts +3 -0
  1183. package/dist/preview/canvas/preview-editable-commit.util.d.ts.map +1 -0
  1184. package/dist/preview/canvas/preview-editable-commit.util.js +11 -0
  1185. package/dist/preview/canvas/preview-flush-await.d.ts +6 -0
  1186. package/dist/preview/canvas/preview-flush-await.d.ts.map +1 -0
  1187. package/dist/preview/canvas/preview-flush-await.js +23 -0
  1188. package/dist/preview/canvas/preview-flush-handle.d.ts +13 -0
  1189. package/dist/preview/canvas/preview-flush-handle.d.ts.map +1 -0
  1190. package/dist/preview/canvas/preview-flush-handle.js +3 -0
  1191. package/dist/preview/canvas/preview-isolation.d.ts +9 -0
  1192. package/dist/preview/canvas/preview-isolation.d.ts.map +1 -0
  1193. package/dist/preview/canvas/preview-isolation.js +10 -0
  1194. package/dist/preview/canvas/preview-messages.d.ts +65 -0
  1195. package/dist/preview/canvas/preview-messages.d.ts.map +1 -0
  1196. package/dist/preview/canvas/preview-messages.js +17 -0
  1197. package/dist/preview/canvas/preview-route.d.ts +4 -0
  1198. package/dist/preview/canvas/preview-route.d.ts.map +1 -0
  1199. package/dist/preview/canvas/preview-route.js +76 -0
  1200. package/dist/preview/index.d.ts +13 -0
  1201. package/dist/preview/index.d.ts.map +1 -0
  1202. package/dist/preview/index.js +12 -0
  1203. package/dist/preview/route-audit.d.ts +17 -0
  1204. package/dist/preview/route-audit.d.ts.map +1 -0
  1205. package/dist/preview/route-audit.js +54 -0
  1206. package/dist/styles/index.css +10602 -0
  1207. package/dist/utils/date.d.ts +20 -0
  1208. package/dist/utils/date.d.ts.map +1 -0
  1209. package/dist/utils/date.js +47 -0
  1210. package/package.json +199 -0
@@ -0,0 +1,1450 @@
1
+ 'use client';
2
+ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
3
+ import { Button } from '../../../components/ui/button.js';
4
+ import { ArrowLeft, ShieldCheck, CheckCircle, MapPin, Lock, ChevronRight, Tag, Truck, ChevronDown, Loader2, AlertCircle } from 'lucide-react';
5
+ import Link from 'next/link';
6
+ import Image from 'next/image';
7
+ import { useState, useEffect, useRef, useCallback, useMemo } from 'react';
8
+ import { cn } from '../../../lib/utils/index.js';
9
+ import { usePayazaCheckout } from '../../../hooks/use-payaza-checkout.js';
10
+ import { generateCheckoutConfig } from '../../../lib/payaza-checkout.js';
11
+ import { useToast } from '../../../components/ui/toast.js';
12
+ import { useStore } from '../../../lib/store-context.js';
13
+ import { useRouter } from 'next/navigation';
14
+ import { normalizePrice, formatCurrency, getUserFriendlyErrorMessage } from '../../../lib/utils/index.js';
15
+ import { checkoutService } from '../../../lib/services/checkout.service.js';
16
+ import { orderService } from '../../../lib/services/order.service.js';
17
+ import { paymentService, isPaymentConfirmed } from '../../../lib/services/payment.service.js';
18
+ import { ApiError } from '../../../lib/api.js';
19
+ import { useAuth } from '../../../lib/auth-context.js';
20
+ import { customerService } from '../../../lib/services/customer.service.js';
21
+ import { AddressSelector } from '../../../components/ui/address-selector.js';
22
+ import { countries, getCountryByName, getCitiesByCountry, getNigerianCitiesByState } from '../../../lib/countries.js';
23
+ import { useCheckoutFees } from '../../../hooks/use-checkout-fees.js';
24
+ import { useMultiStoreCheckoutFees } from '../../../hooks/use-multi-store-checkout-fees.js';
25
+ import { CheckoutFeeLines } from '../../../components/checkout/CheckoutFeeLines.js';
26
+ import { shippingService } from '../../../lib/services/shipping.service.js';
27
+ import { CHECKOUT_UNAVAILABLE_MESSAGE } from '../../../lib/checkout-availability.js';
28
+ import { getCartLineImage } from '../../../lib/product-variation-utils.js';
29
+ import { enrichShippingQuoteAddress, buildShippingCalculatePayload, canRequestShippingQuote, isNigeria, deriveNigerianStateFromCity, NIGERIAN_STATES } from '../../../lib/shipping-address.util.js';
30
+ import { ShippingOptionsPanel } from '../../../components/checkout/ShippingOptionsPanel.js';
31
+ import { CheckoutSkeleton } from '../../../components/ui/skeletons/checkout-skeleton.js';
32
+ const CHECKOUT_ITEM_UUID_REGEX = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;
33
+ function normalizeCheckoutPayloadItem(item) {
34
+ const product = item.product;
35
+ return {
36
+ productId: item.productId,
37
+ storeId: product?.storeId,
38
+ quantity: Number(item.quantity) || 1,
39
+ price: normalizePrice(item.price),
40
+ variationId: item.variantId && CHECKOUT_ITEM_UUID_REGEX.test(item.variantId)
41
+ ? item.variantId
42
+ : undefined,
43
+ variantId: item.variantId ?? undefined,
44
+ };
45
+ }
46
+ import { useAnalytics } from '../../../hooks/use-analytics.js';
47
+ import { getOrCreateIdempotencyKey, resetIdempotencyKey } from '../../../lib/utils/idempotency-key.js';
48
+ import { formatPhoneInput, validatePhone, getPhonePlaceholder, normalizePhoneForPayaza } from '../../../lib/utils/phone-format.js';
49
+ import { saveGuestUserInfo } from '../../../lib/guest-user.js';
50
+ import { InventoryHoldCountdown } from '../../../components/cart/InventoryHoldCountdown.js';
51
+ import { formatCheckoutStockError, getCartLineStockInfo, isInventoryHoldExpired } from '../../../lib/inventory-utils.js';
52
+ import { MerchantHandledDeliveryNotice } from '../../../components/shipping/MerchantHandledDeliveryNotice.js';
53
+ import { isAutomatedShippingEnabled } from '../../../lib/shipping-settings.util.js';
54
+ import { setOrderSuccessJustCompleted, isOrderSuccessPending } from '../../../lib/order-success-cart.js';
55
+ import { trackStorefrontEvent } from '../../../lib/mixpanel.js';
56
+ const PROMO_CODE_ENABLED = false;
57
+ function isPaymentInventoryError(error) {
58
+ if (!error || typeof error !== 'object')
59
+ return false;
60
+ const candidate = error;
61
+ if (candidate.status === 409)
62
+ return true;
63
+ const message = (candidate.message || '').toLowerCase();
64
+ return (message.includes('insufficient stock') ||
65
+ message.includes('insufficient inventory') ||
66
+ message.includes('out of stock'));
67
+ }
68
+ function buildOrderSuccessUrl(storeSlug, params) {
69
+ const search = new URLSearchParams({
70
+ orderId: params.orderId,
71
+ ref: params.ref,
72
+ });
73
+ if (params.orderNumber)
74
+ search.set('orderNumber', params.orderNumber);
75
+ if (params.email)
76
+ search.set('email', params.email);
77
+ if (params.fulfillmentPending)
78
+ search.set('fulfillmentPending', 'true');
79
+ return `/${storeSlug}/order/success?${search.toString()}`;
80
+ }
81
+ function RequiredLabel({ children }) {
82
+ return (_jsxs("label", { className: "text-sm font-bold text-gray-700 ml-1", children: [children, " ", _jsx("span", { className: "text-red-500", children: "*" })] }));
83
+ }
84
+ export function CheckoutPage({ storeConfig }) {
85
+ const primaryColor = storeConfig.branding.primaryColor;
86
+ const checkoutDisabled = storeConfig.checkoutEnabled === false;
87
+ const { cart, cartTotal, buyNowItem, clearBuyNowItem, setBuyNowItem, inventoryHoldUntil, setInventoryHoldUntil, handleInventoryHoldExpired, isCartRefreshing, refreshCart, finalizeCartAfterOrder, removeOrderItemsFromCart, isCartHydrated } = useStore();
88
+ const { addToast } = useToast();
89
+ const router = useRouter();
90
+ const { user, isAuthenticated } = useAuth();
91
+ const { trackEvent } = useAnalytics();
92
+ const [isHoldExpired, setIsHoldExpired] = useState(false);
93
+ useEffect(() => {
94
+ setIsHoldExpired(isInventoryHoldExpired(inventoryHoldUntil));
95
+ }, [inventoryHoldUntil]);
96
+ const isHoldBlocking = !!inventoryHoldUntil && (isHoldExpired || isInventoryHoldExpired(inventoryHoldUntil));
97
+ // Read from sessionStorage synchronously on mount if buyNowItem is not in context
98
+ const [sessionBuyNowItem] = useState(() => {
99
+ if (typeof window === 'undefined')
100
+ return null;
101
+ try {
102
+ const stored = sessionStorage.getItem('buyNowItem');
103
+ if (stored) {
104
+ return JSON.parse(stored);
105
+ }
106
+ }
107
+ catch (error) {
108
+ console.error('Failed to read buyNowItem from sessionStorage:', error);
109
+ }
110
+ return null;
111
+ });
112
+ // State to track buy-now restoration from sessionStorage
113
+ const hasRestoredRef = useRef(false);
114
+ // Restore buyNowItem from sessionStorage to context if needed (only once on mount)
115
+ useEffect(() => {
116
+ if (hasRestoredRef.current) {
117
+ return;
118
+ }
119
+ hasRestoredRef.current = true;
120
+ if (!buyNowItem && sessionBuyNowItem) {
121
+ setBuyNowItem(sessionBuyNowItem);
122
+ }
123
+ // eslint-disable-next-line react-hooks/exhaustive-deps
124
+ }, []);
125
+ // Ensure cart is loaded before rendering checkout (API-backed stores)
126
+ useEffect(() => {
127
+ if (!isCartHydrated) {
128
+ void refreshCart?.();
129
+ }
130
+ }, [isCartHydrated, refreshCart]);
131
+ // Use buyNowItem from context or sessionStorage, otherwise use cart
132
+ const effectiveBuyNowItem = buyNowItem || sessionBuyNowItem;
133
+ const checkoutItems = effectiveBuyNowItem ? [effectiveBuyNowItem] : cart;
134
+ const isMarketplaceCheckout = storeConfig.layout === 'marketplace' || storeConfig.slug === 'marketplace';
135
+ // Group checkout items by their real storeId regardless of context (marketplace or not) — a
136
+ // cart can end up spanning more than one store, and fee calculation needs to be done per store
137
+ // group either way. For marketplace checkouts specifically, the backend also creates one Order
138
+ // (and settles one Payment) per store even though the customer pays once — group the summary
139
+ // the same way so the customer sees this before submitting, mirroring Amazon's "split into N
140
+ // shipments" pattern.
141
+ const storeBreakdown = useMemo(() => {
142
+ const groups = new Map();
143
+ for (const item of checkoutItems) {
144
+ const product = item.product;
145
+ const storeId = product?.storeId || storeConfig.id;
146
+ const storeName = product?.storeName || `Store ${storeId.slice(0, 8)}`;
147
+ const existing = groups.get(storeId) || { storeId, storeName, subtotal: 0, itemCount: 0 };
148
+ existing.subtotal += normalizePrice(item.price) * item.quantity;
149
+ existing.itemCount += item.quantity;
150
+ groups.set(storeId, existing);
151
+ }
152
+ return Array.from(groups.values());
153
+ }, [checkoutItems, storeConfig.id]);
154
+ // Fees must be split per store whenever the cart spans more than one — this isn't limited to
155
+ // the "marketplace" virtual storefront, it's whatever the item data says.
156
+ const isMultiStoreCheckout = storeBreakdown.length > 1;
157
+ const checkoutStockIssues = useMemo(() => {
158
+ return checkoutItems
159
+ .map((item) => {
160
+ const stockInfo = getCartLineStockInfo(item.product, item.quantity);
161
+ const message = stockInfo.stockError || formatCheckoutStockError(item.product, item.quantity);
162
+ if (!message)
163
+ return null;
164
+ return { id: item.id, name: item.product.name, message };
165
+ })
166
+ .filter((issue) => issue != null);
167
+ }, [checkoutItems]);
168
+ const hasCheckoutStockIssues = checkoutStockIssues.length > 0;
169
+ const checkoutTotal = effectiveBuyNowItem
170
+ ? effectiveBuyNowItem.price * effectiveBuyNowItem.quantity
171
+ : cartTotal;
172
+ const checkoutEntireCart = !effectiveBuyNowItem;
173
+ const completingOrderRef = useRef(false);
174
+ const [isCompletingOrder, setIsCompletingOrder] = useState(false);
175
+ const isPostPaymentNavigationPending = () => completingOrderRef.current || isCompletingOrder || isOrderSuccessPending();
176
+ const beginPostPaymentNavigation = (orderId) => {
177
+ completingOrderRef.current = true;
178
+ setIsCompletingOrder(true);
179
+ setOrderSuccessJustCompleted(orderId);
180
+ };
181
+ const redirectToPaymentCallback = (transactionRef) => {
182
+ beginPostPaymentNavigation(transactionRef);
183
+ router.replace(buildPaymentCallbackUrl(transactionRef));
184
+ };
185
+ const redirectToPaymentError = (reason, transactionRef, detailMessage) => {
186
+ const params = new URLSearchParams({ reason });
187
+ if (transactionRef)
188
+ params.set('ref', transactionRef);
189
+ if (detailMessage)
190
+ params.set('message', detailMessage);
191
+ setLoading(false);
192
+ router.replace(`/${storeConfig.slug}/payment/error?${params.toString()}`);
193
+ };
194
+ const completeOrderAndRedirect = async (orderId, transactionRef, orderNumber, customerEmail, fulfillmentPending) => {
195
+ beginPostPaymentNavigation(orderId);
196
+ if (fulfillmentPending) {
197
+ addToast('Payment received. Your order is under review — we will contact you if any items are unavailable.', 'info');
198
+ }
199
+ router.replace(buildOrderSuccessUrl(storeConfig.slug, {
200
+ orderId,
201
+ ref: transactionRef,
202
+ orderNumber: orderNumber || undefined,
203
+ email: customerEmail || undefined,
204
+ fulfillmentPending,
205
+ }));
206
+ const purchasedItems = checkoutItems.map((item) => ({
207
+ productId: item.productId,
208
+ variantId: item.variantId,
209
+ quantity: item.quantity,
210
+ }));
211
+ try {
212
+ if (finalizeCartAfterOrder) {
213
+ await finalizeCartAfterOrder(purchasedItems, { checkoutEntireCart });
214
+ }
215
+ else if (removeOrderItemsFromCart) {
216
+ await removeOrderItemsFromCart(purchasedItems);
217
+ }
218
+ }
219
+ catch (error) {
220
+ console.error('[Checkout] Failed to clear cart after order:', error);
221
+ }
222
+ if (effectiveBuyNowItem) {
223
+ clearBuyNowItem();
224
+ }
225
+ };
226
+ const [step, setStep] = useState('details');
227
+ const [loading, setLoading] = useState(false);
228
+ const lastMerchantReferenceRef = useRef(null);
229
+ const lastTransactionReferenceRef = useRef(null);
230
+ const lastCheckoutOrderIdRef = useRef(null);
231
+ const checkoutIdempotencyKeyRef = useRef(null);
232
+ const checkoutCartFingerprintRef = useRef('');
233
+ const checkoutItemsFingerprint = useMemo(() => {
234
+ return JSON.stringify(checkoutItems.map((item) => ({
235
+ productId: item.productId,
236
+ variantId: item.variantId,
237
+ quantity: item.quantity,
238
+ price: item.price,
239
+ })));
240
+ }, [checkoutItems]);
241
+ useEffect(() => {
242
+ if (checkoutCartFingerprintRef.current && checkoutCartFingerprintRef.current !== checkoutItemsFingerprint) {
243
+ resetIdempotencyKey(checkoutIdempotencyKeyRef);
244
+ }
245
+ checkoutCartFingerprintRef.current = checkoutItemsFingerprint;
246
+ }, [checkoutItemsFingerprint]);
247
+ const handlePaymentCancelCleanup = useCallback(async () => {
248
+ const orderId = lastCheckoutOrderIdRef.current;
249
+ if (orderId) {
250
+ try {
251
+ await orderService.abandonPaymentAttempt(orderId);
252
+ }
253
+ catch (error) {
254
+ console.error('[Checkout] Failed to abandon payment attempt:', error);
255
+ }
256
+ lastCheckoutOrderIdRef.current = null;
257
+ }
258
+ resetIdempotencyKey(checkoutIdempotencyKeyRef);
259
+ lastMerchantReferenceRef.current = null;
260
+ lastTransactionReferenceRef.current = null;
261
+ setInventoryHoldUntil?.(null);
262
+ try {
263
+ await refreshCart?.();
264
+ }
265
+ catch (error) {
266
+ console.error('[Checkout] Failed to refresh cart after payment cancel:', error);
267
+ }
268
+ }, [refreshCart, setInventoryHoldUntil]);
269
+ const buildPaymentCallbackUrl = (transactionRef) => {
270
+ const params = new URLSearchParams({
271
+ reference: transactionRef,
272
+ storeId: storeConfig.id,
273
+ });
274
+ const merchantRef = lastMerchantReferenceRef.current;
275
+ if (merchantRef) {
276
+ params.set('merchantReference', merchantRef);
277
+ params.set('orderNumber', merchantRef);
278
+ }
279
+ return `/${storeConfig.slug}/payment/callback?${params.toString()}`;
280
+ };
281
+ const enrichPayazaCallbackData = (callbackData) => {
282
+ const merchantRef = lastMerchantReferenceRef.current || undefined;
283
+ const internalTrx = lastTransactionReferenceRef.current || undefined;
284
+ return {
285
+ ...callbackData,
286
+ type: 'success',
287
+ status: callbackData.status || 201,
288
+ data: {
289
+ ...callbackData.data,
290
+ merchant_reference: callbackData.data?.merchant_reference || merchantRef,
291
+ additional_details: {
292
+ ...(callbackData.data?.additional_details || {}),
293
+ storeId: storeConfig.id,
294
+ merchantReference: merchantRef,
295
+ orderNumber: merchantRef,
296
+ internalTransactionReference: internalTrx,
297
+ },
298
+ },
299
+ };
300
+ };
301
+ const resolvePostPaymentRefs = (response) => {
302
+ const merchantRef = lastMerchantReferenceRef.current || undefined;
303
+ const internalTrx = lastTransactionReferenceRef.current || undefined;
304
+ const payazaRef = response.callbackData?.data?.payaza_reference ||
305
+ (response.callbackData?.data?.transaction_reference?.startsWith('P-C-')
306
+ ? response.callbackData.data.transaction_reference
307
+ : undefined);
308
+ const callbackTrx = response.callbackData?.data?.transaction_reference;
309
+ const transactionRef = (callbackTrx?.startsWith('TRX-') ? callbackTrx : undefined) ||
310
+ (response.transactionRef?.startsWith('TRX-') ? response.transactionRef : undefined) ||
311
+ internalTrx ||
312
+ response.transactionRef ||
313
+ callbackTrx ||
314
+ payazaRef ||
315
+ '';
316
+ return { transactionRef, payazaRef, merchantRef };
317
+ };
318
+ const tryConfirmFromReference = async (transactionRef, merchantRef) => {
319
+ return paymentService.confirmPaymentFromReference(transactionRef, storeConfig.id, merchantRef);
320
+ };
321
+ // Address management state
322
+ const [savedAddresses, setSavedAddresses] = useState([]);
323
+ const [selectedAddressId, setSelectedAddressId] = useState(null);
324
+ const [saveNewAddress, setSaveNewAddress] = useState(false);
325
+ const [addressLabel, setAddressLabel] = useState('');
326
+ const [loadingAddresses, setLoadingAddresses] = useState(false);
327
+ // Shipping calculation state
328
+ const [shippingMethods, setShippingMethods] = useState([]);
329
+ const [selectedShippingMethod, setSelectedShippingMethod] = useState(null);
330
+ const [isCalculatingShipping, setIsCalculatingShipping] = useState(false);
331
+ const [shippingError, setShippingError] = useState(null);
332
+ const [freeShippingEligible, setFreeShippingEligible] = useState(false);
333
+ const [freeShippingThreshold, setFreeShippingThreshold] = useState(undefined);
334
+ const [isCourierMode, setIsCourierMode] = useState(false);
335
+ const [checkingDeliveryStatus, setCheckingDeliveryStatus] = useState(false);
336
+ const [selectedCourier, setSelectedCourier] = useState(null);
337
+ // Payaza Configuration
338
+ // Fallback key only — the authoritative key is resolved per-currency by the
339
+ // backend from the database-managed registry and returned by /checkout/process
340
+ // as `payazaPublicKey`. Priority: backend-resolved key → storeConfig → env.
341
+ const payazaPublicKey = storeConfig.payment?.payazaPublicKey || process.env.NEXT_PUBLIC_PAYAZA_PUBLIC_KEY || '';
342
+ const { checkout: initiateCheckout, isLoading: isPayazaLoading } = usePayazaCheckout({
343
+ publicKey: payazaPublicKey,
344
+ onSuccess: async (response) => {
345
+ try {
346
+ setLoading(true);
347
+ const { transactionRef, payazaRef, merchantRef } = resolvePostPaymentRefs(response);
348
+ if (!transactionRef) {
349
+ addToast('Payment successful but no transaction reference. Please contact support.', 'info');
350
+ setLoading(false);
351
+ return;
352
+ }
353
+ console.log('[Checkout] SDK callback received, verifying payment...', {
354
+ transactionRef,
355
+ payazaRef,
356
+ merchantRef,
357
+ });
358
+ addToast('Verifying payment...', 'info');
359
+ // Step 1: Immediate check if payment already completed
360
+ let immediateVerification;
361
+ try {
362
+ immediateVerification = await paymentService.verifyPayment(transactionRef, storeConfig.id, merchantRef);
363
+ if (immediateVerification.verified && isPaymentConfirmed(immediateVerification.paymentStatus)) {
364
+ console.log('[Checkout] Payment already completed, proceeding to success page');
365
+ await completeOrderAndRedirect(immediateVerification.orderId || transactionRef, transactionRef, immediateVerification.orderNumber || undefined, formData.email || undefined);
366
+ return;
367
+ }
368
+ }
369
+ catch (error) {
370
+ console.log('[Checkout] Immediate verification failed, proceeding with confirmation');
371
+ }
372
+ const confirmAndRedirect = async (confirmation) => {
373
+ await completeOrderAndRedirect(confirmation.orderId, transactionRef, confirmation.orderNumber || undefined, formData.email || undefined, confirmation.fulfillmentBlocked);
374
+ };
375
+ let inventoryConfirmationError = null;
376
+ const recordConfirmationError = (error) => {
377
+ if (isPaymentInventoryError(error)) {
378
+ inventoryConfirmationError = error;
379
+ }
380
+ };
381
+ // Step 2: Confirm from enriched Payaza callback payload
382
+ if (response.callbackData) {
383
+ console.log('[Checkout] Processing Payaza callback confirmation immediately');
384
+ const enrichedCallback = enrichPayazaCallbackData(response.callbackData);
385
+ const MAX_RETRIES = 3;
386
+ const RETRY_DELAY = 1000;
387
+ let confirmation;
388
+ for (let attempt = 1; attempt <= MAX_RETRIES; attempt++) {
389
+ try {
390
+ confirmation = await paymentService.confirmPaymentFromCallback(enrichedCallback);
391
+ break;
392
+ }
393
+ catch (error) {
394
+ console.error(`[Checkout] Payment confirmation attempt ${attempt} failed:`, error);
395
+ recordConfirmationError(error);
396
+ if (inventoryConfirmationError)
397
+ break;
398
+ if (attempt < MAX_RETRIES) {
399
+ await new Promise(resolve => setTimeout(resolve, RETRY_DELAY * attempt));
400
+ }
401
+ }
402
+ }
403
+ if (inventoryConfirmationError) {
404
+ redirectToPaymentError('insufficient_stock', transactionRef, inventoryConfirmationError instanceof ApiError
405
+ ? inventoryConfirmationError.message
406
+ : undefined);
407
+ return;
408
+ }
409
+ if (confirmation) {
410
+ await confirmAndRedirect(confirmation);
411
+ return;
412
+ }
413
+ }
414
+ // Step 3: Confirm by transaction / merchant reference (covers transfer + P-C refs)
415
+ console.log('[Checkout] Trying confirm-from-reference fallback');
416
+ const refsToTry = [transactionRef, payazaRef, lastTransactionReferenceRef.current].filter((ref, index, arr) => Boolean(ref) && arr.indexOf(ref) === index);
417
+ for (const ref of refsToTry) {
418
+ try {
419
+ const confirmation = await tryConfirmFromReference(ref, merchantRef);
420
+ if (isPaymentConfirmed(confirmation.paymentStatus)) {
421
+ await confirmAndRedirect(confirmation);
422
+ return;
423
+ }
424
+ }
425
+ catch (error) {
426
+ console.error(`[Checkout] confirm-from-reference failed for ${ref}:`, error);
427
+ recordConfirmationError(error);
428
+ if (inventoryConfirmationError) {
429
+ redirectToPaymentError('insufficient_stock', transactionRef, inventoryConfirmationError instanceof ApiError
430
+ ? inventoryConfirmationError.message
431
+ : undefined);
432
+ return;
433
+ }
434
+ }
435
+ }
436
+ // Step 4: Poll for webhook / async processing
437
+ console.log('[Checkout] Polling payment status after SDK success...');
438
+ try {
439
+ const polledVerification = await paymentService.pollPaymentStatus(transactionRef, storeConfig.id, {
440
+ maxAttempts: 10,
441
+ intervalMs: 1500,
442
+ merchantReference: merchantRef,
443
+ onProgress: (attempt, maxAttempts) => {
444
+ console.log(`[Checkout] Polling payment status (${attempt}/${maxAttempts})...`);
445
+ },
446
+ });
447
+ if (polledVerification?.verified && isPaymentConfirmed(polledVerification.paymentStatus)) {
448
+ await completeOrderAndRedirect(polledVerification.orderId || transactionRef, transactionRef, polledVerification.orderNumber || undefined, formData.email || undefined);
449
+ return;
450
+ }
451
+ }
452
+ catch (pollError) {
453
+ console.error('[Checkout] Polling failed:', pollError);
454
+ }
455
+ // Step 5: Final fallback — callback page with merchant reference in URL
456
+ if (inventoryConfirmationError) {
457
+ redirectToPaymentError('insufficient_stock', transactionRef, inventoryConfirmationError instanceof ApiError
458
+ ? inventoryConfirmationError.message
459
+ : undefined);
460
+ return;
461
+ }
462
+ console.log('[Checkout] Redirecting to callback page for verification');
463
+ addToast('Payment successful. Verifying transaction...', 'info');
464
+ redirectToPaymentCallback(transactionRef);
465
+ }
466
+ catch (error) {
467
+ console.error('[Checkout] Error processing payment callback:', error);
468
+ const { transactionRef } = resolvePostPaymentRefs(response);
469
+ if (isPaymentInventoryError(error) && transactionRef) {
470
+ redirectToPaymentError('insufficient_stock', transactionRef, error instanceof ApiError ? error.message : undefined);
471
+ return;
472
+ }
473
+ if (transactionRef) {
474
+ addToast('Payment successful. Verifying transaction...', 'info');
475
+ redirectToPaymentCallback(transactionRef);
476
+ }
477
+ else {
478
+ addToast('Payment successful but verification failed. Please contact support with your transaction details.', 'error');
479
+ setLoading(false);
480
+ }
481
+ }
482
+ },
483
+ onError: async (error) => {
484
+ const message = String(error || '');
485
+ const shouldResetCheckoutState = /reference already/i.test(message) ||
486
+ /reservation expired/i.test(message) ||
487
+ /already being processed/i.test(message);
488
+ if (shouldResetCheckoutState) {
489
+ await handlePaymentCancelCleanup();
490
+ }
491
+ addToast(`Checkout error: ${error}`, 'error');
492
+ setLoading(false);
493
+ },
494
+ onClose: async () => {
495
+ await handlePaymentCancelCleanup();
496
+ addToast('Payment canceled', 'info');
497
+ setLoading(false);
498
+ },
499
+ });
500
+ // Track checkout_start event when checkout page loads with items
501
+ useEffect(() => {
502
+ if (!isCartHydrated || !storeConfig?.id || (checkoutItems.length === 0 && !effectiveBuyNowItem)) {
503
+ return;
504
+ }
505
+ const totalValue = checkoutTotal;
506
+ const itemCount = checkoutItems.length;
507
+ trackEvent({
508
+ eventType: 'checkout_start',
509
+ metadata: {
510
+ totalValue,
511
+ itemCount,
512
+ items: checkoutItems.map(item => ({
513
+ productId: item.productId,
514
+ quantity: item.quantity,
515
+ price: item.price,
516
+ })),
517
+ },
518
+ }).catch(err => console.warn('Failed to track checkout_start:', err));
519
+ trackStorefrontEvent('Checkout_started', {
520
+ storeId: storeConfig.id,
521
+ storeSlug: storeConfig.slug,
522
+ totalValue,
523
+ itemCount,
524
+ items: checkoutItems.map(item => ({
525
+ productId: item.productId,
526
+ quantity: item.quantity,
527
+ price: item.price,
528
+ })),
529
+ });
530
+ }, [isCartHydrated, storeConfig?.id, checkoutItems, effectiveBuyNowItem, checkoutTotal, trackEvent]);
531
+ // Redirect to home if checkout items are empty (with delay to allow state propagation)
532
+ useEffect(() => {
533
+ if (!isCartHydrated) {
534
+ return;
535
+ }
536
+ const redirectTimer = setTimeout(() => {
537
+ if (isPostPaymentNavigationPending()) {
538
+ return;
539
+ }
540
+ const hasBuyNowInStorage = typeof window !== 'undefined' && sessionStorage.getItem('buyNowItem');
541
+ if (hasBuyNowInStorage) {
542
+ if (!effectiveBuyNowItem) {
543
+ try {
544
+ const stored = sessionStorage.getItem('buyNowItem');
545
+ if (stored) {
546
+ const parsedItem = JSON.parse(stored);
547
+ setBuyNowItem(parsedItem);
548
+ return;
549
+ }
550
+ }
551
+ catch (error) {
552
+ console.error('Failed to restore buyNowItem:', error);
553
+ }
554
+ }
555
+ else {
556
+ return;
557
+ }
558
+ }
559
+ if (!checkoutItems || checkoutItems.length === 0) {
560
+ router.push(`/${storeConfig.slug}`);
561
+ }
562
+ }, 400);
563
+ return () => clearTimeout(redirectTimer);
564
+ }, [checkoutItems, isCartHydrated, router, storeConfig.slug, effectiveBuyNowItem, setBuyNowItem]);
565
+ // Clear buyNowItem when component unmounts or user navigates away (not during order completion)
566
+ useEffect(() => {
567
+ return () => {
568
+ if (effectiveBuyNowItem && !completingOrderRef.current) {
569
+ clearBuyNowItem();
570
+ }
571
+ };
572
+ }, [effectiveBuyNowItem, clearBuyNowItem]);
573
+ // Load saved addresses for authenticated users (runs on mount and when auth state changes)
574
+ useEffect(() => {
575
+ const loadAddresses = async () => {
576
+ if (isAuthenticated) {
577
+ setLoadingAddresses(true);
578
+ try {
579
+ const addresses = await customerService.getAddresses();
580
+ setSavedAddresses(addresses);
581
+ // Priority 1: Auto-select default address if available
582
+ const defaultAddress = addresses.find(a => a.isDefault);
583
+ if (defaultAddress) {
584
+ handleAddressSelect(defaultAddress.id);
585
+ return; // Don't pre-fill from profile if we have a saved address
586
+ }
587
+ // Priority 2: If no saved addresses, pre-fill from profile data
588
+ if (addresses.length === 0 && user) {
589
+ setFormData(prev => ({
590
+ email: user.email || prev.email,
591
+ firstName: user.firstName || prev.firstName,
592
+ lastName: user.lastName || prev.lastName,
593
+ phone: user.phone || prev.phone,
594
+ address: user.address || prev.address,
595
+ city: user.city || prev.city,
596
+ state: deriveNigerianStateFromCity(user.city || prev.city) || prev.state || '',
597
+ country: user.country || prev.country || 'Nigeria',
598
+ postalCode: user.zipCode || prev.postalCode,
599
+ }));
600
+ }
601
+ }
602
+ catch (error) {
603
+ console.error('Failed to load addresses:', error);
604
+ // Don't show error toast - addresses are optional
605
+ // Guest users can still checkout without saved addresses
606
+ // If address loading fails but user is authenticated, still try to pre-fill from profile
607
+ if (user) {
608
+ setFormData(prev => ({
609
+ email: user.email || prev.email,
610
+ firstName: user.firstName || prev.firstName,
611
+ lastName: user.lastName || prev.lastName,
612
+ phone: user.phone || prev.phone,
613
+ address: user.address || prev.address,
614
+ city: user.city || prev.city,
615
+ state: deriveNigerianStateFromCity(user.city || prev.city) || prev.state || '',
616
+ country: user.country || prev.country || 'Nigeria',
617
+ postalCode: user.zipCode || prev.postalCode,
618
+ }));
619
+ }
620
+ }
621
+ finally {
622
+ setLoadingAddresses(false);
623
+ }
624
+ }
625
+ };
626
+ loadAddresses();
627
+ // eslint-disable-next-line react-hooks/exhaustive-deps
628
+ }, [isAuthenticated]);
629
+ // Pre-fill form data for authenticated users when no saved address is selected
630
+ // This runs after addresses are loaded to ensure proper priority
631
+ useEffect(() => {
632
+ if (isAuthenticated && user && !selectedAddressId && savedAddresses.length === 0 && !loadingAddresses) {
633
+ setFormData(prev => ({
634
+ email: user.email || prev.email,
635
+ firstName: user.firstName || prev.firstName,
636
+ lastName: user.lastName || prev.lastName,
637
+ phone: user.phone || prev.phone,
638
+ address: user.address || prev.address,
639
+ city: user.city || prev.city,
640
+ state: deriveNigerianStateFromCity(user.city || prev.city) || prev.state || '',
641
+ country: user.country || prev.country || 'Nigeria',
642
+ postalCode: user.zipCode || prev.postalCode,
643
+ }));
644
+ }
645
+ // eslint-disable-next-line react-hooks/exhaustive-deps
646
+ }, [isAuthenticated, user, selectedAddressId, savedAddresses.length, loadingAddresses]);
647
+ // Calculate legacy shipping when address is filled (flat-rate / zone methods)
648
+ const calculateShipping = async () => {
649
+ const quoteAddress = enrichShippingQuoteAddress({
650
+ street: formData.address,
651
+ address1: formData.address,
652
+ city: formData.city,
653
+ state: formData.state || formData.city,
654
+ zipCode: formData.postalCode,
655
+ country: formData.country,
656
+ phone: formData.phone,
657
+ email: formData.email,
658
+ });
659
+ if (!canRequestShippingQuote(quoteAddress) || checkoutItems.length === 0) {
660
+ setShippingMethods([]);
661
+ setSelectedShippingMethod(null);
662
+ return;
663
+ }
664
+ setIsCalculatingShipping(true);
665
+ setShippingError(null);
666
+ try {
667
+ const result = await shippingService.calculateShipping(buildShippingCalculatePayload({
668
+ storeId: storeConfig.id,
669
+ address: quoteAddress,
670
+ customerInfo: {
671
+ firstName: formData.firstName,
672
+ lastName: formData.lastName,
673
+ phone: formData.phone,
674
+ email: formData.email,
675
+ },
676
+ items: checkoutItems.map((item) => ({
677
+ productId: item.productId,
678
+ quantity: item.quantity,
679
+ })),
680
+ subtotal,
681
+ currency,
682
+ }));
683
+ // Filter out any methods with invalid costs before storing
684
+ const validMethods = (result.methods || []).filter(method => Number.isFinite(method.cost) && method.cost >= 0);
685
+ setShippingMethods(validMethods);
686
+ setFreeShippingEligible(result.freeShippingEligible || false);
687
+ setFreeShippingThreshold(result.freeShippingThreshold);
688
+ // Auto-select first method or selected method, but only if it has valid cost
689
+ if (validMethods.length > 0) {
690
+ // Find the selected method in valid methods, or use first valid method
691
+ const methodToSelect = result.selectedMethod &&
692
+ validMethods.find(m => m.code === result.selectedMethod?.code)
693
+ ? validMethods.find(m => m.code === result.selectedMethod?.code)
694
+ : validMethods[0];
695
+ if (methodToSelect) {
696
+ setSelectedShippingMethod(methodToSelect);
697
+ }
698
+ else {
699
+ setSelectedShippingMethod(null);
700
+ }
701
+ }
702
+ else {
703
+ setSelectedShippingMethod(null);
704
+ }
705
+ }
706
+ catch (error) {
707
+ console.error('Shipping calculation error:', error);
708
+ setShippingError(error.message || 'Failed to calculate shipping. Please try again.');
709
+ setShippingMethods([]);
710
+ setSelectedShippingMethod(null);
711
+ }
712
+ finally {
713
+ setIsCalculatingShipping(false);
714
+ }
715
+ };
716
+ // Determine currency from checkout items or store config (avoid switching to USD at checkout)
717
+ const getCurrency = () => {
718
+ if (checkoutItems.length > 0) {
719
+ const itemCurrency = checkoutItems[0]?.currency ?? checkoutItems[0]?.product?.currency;
720
+ if (itemCurrency)
721
+ return itemCurrency;
722
+ }
723
+ return storeConfig.settings?.currency || 'USD';
724
+ };
725
+ const currency = getCurrency();
726
+ // Calculations
727
+ const subtotal = checkoutTotal;
728
+ // Only use shipping cost if it's a valid number and from a properly selected method
729
+ const shipping = (selectedShippingMethod &&
730
+ Number.isFinite(selectedShippingMethod.cost) &&
731
+ selectedShippingMethod.cost >= 0)
732
+ ? selectedShippingMethod.cost
733
+ : 0;
734
+ // Any cart spanning more than one real store (the marketplace virtual store or otherwise) needs
735
+ // fees split per store rather than a single /fees/calculate call against storeConfig.id — that
736
+ // id may not even be a real store row (e.g. the marketplace "virtual store"). The multi-store
737
+ // hook fetches every store's breakdown in one batched request and sums them (mirrors how the
738
+ // backend computes fees per-store during process-marketplace).
739
+ const multiStoreSubtotals = useMemo(() => storeBreakdown.map((s) => ({ storeId: s.storeId, subtotal: s.subtotal })), [storeBreakdown]);
740
+ const singleStoreFees = useCheckoutFees({
741
+ storeId: isMultiStoreCheckout ? undefined : storeConfig.id,
742
+ subtotal,
743
+ currency,
744
+ shippingCost: shipping,
745
+ onError: (message) => addToast(message, 'error'),
746
+ });
747
+ const multiStoreFees = useMultiStoreCheckoutFees({
748
+ stores: isMultiStoreCheckout ? multiStoreSubtotals : [],
749
+ currency,
750
+ onError: (message) => addToast(message, 'error'),
751
+ });
752
+ const { feeBreakdown, loading: feesLoading, totalPayable, displayLines } = isMultiStoreCheckout
753
+ ? multiStoreFees
754
+ : singleStoreFees;
755
+ const safeSubtotal = Number.isFinite(subtotal) && subtotal >= 0 ? subtotal : 0;
756
+ const total = feeBreakdown?.totalPayable ?? Math.max(safeSubtotal, totalPayable);
757
+ // Debug logging in development
758
+ if (process.env.NODE_ENV === 'development' && safeSubtotal > 0 && total === 0) {
759
+ console.warn('[CheckoutPage] Total calculation issue detected:', {
760
+ subtotal: safeSubtotal,
761
+ shipping,
762
+ total,
763
+ feeBreakdown,
764
+ checkoutTotal,
765
+ checkoutItemsCount: checkoutItems.length,
766
+ effectiveBuyNowItem: !!effectiveBuyNowItem,
767
+ });
768
+ }
769
+ // Mock Form Data
770
+ const [formData, setFormData] = useState({
771
+ email: '',
772
+ firstName: '',
773
+ lastName: '',
774
+ address: '',
775
+ city: '',
776
+ state: '',
777
+ country: 'Nigeria',
778
+ postalCode: '',
779
+ phone: ''
780
+ });
781
+ const [errors, setErrors] = useState({});
782
+ const [isCountryDropdownOpen, setIsCountryDropdownOpen] = useState(false);
783
+ const [isCityDropdownOpen, setIsCityDropdownOpen] = useState(false);
784
+ const [isStateDropdownOpen, setIsStateDropdownOpen] = useState(false);
785
+ const [countrySearch, setCountrySearch] = useState('');
786
+ const [citySearch, setCitySearch] = useState('');
787
+ const deliveryEnabled = storeConfig.features?.delivery !== false;
788
+ const automatedShippingEnabled = isAutomatedShippingEnabled(storeConfig);
789
+ const buildQuoteAddress = () => enrichShippingQuoteAddress({
790
+ street: formData.address,
791
+ address1: formData.address,
792
+ city: formData.city,
793
+ state: formData.state || formData.city,
794
+ zipCode: formData.postalCode,
795
+ country: formData.country,
796
+ phone: formData.phone,
797
+ email: formData.email,
798
+ });
799
+ const handleCourierSelect = useCallback((selection) => {
800
+ setSelectedCourier(selection);
801
+ if (!selection) {
802
+ setSelectedShippingMethod(null);
803
+ return;
804
+ }
805
+ setSelectedShippingMethod({
806
+ code: selection.serviceCode,
807
+ name: selection.courierName,
808
+ cost: selection.price,
809
+ estimatedDays: 0,
810
+ providerKey: selection.providerKey,
811
+ deliveryMethodId: selection.serviceCode,
812
+ deliveryQuoteId: selection.quoteId,
813
+ });
814
+ }, []);
815
+ // Hybrid shipping: courier quotes when providers enabled, else legacy calculate
816
+ useEffect(() => {
817
+ if (!deliveryEnabled || !automatedShippingEnabled || checkoutItems.length === 0) {
818
+ setIsCourierMode(false);
819
+ setShippingMethods([]);
820
+ setSelectedShippingMethod(null);
821
+ setSelectedCourier(null);
822
+ return;
823
+ }
824
+ const quoteAddress = buildQuoteAddress();
825
+ if (!canRequestShippingQuote(quoteAddress)) {
826
+ setIsCourierMode(false);
827
+ setShippingMethods([]);
828
+ setSelectedShippingMethod(null);
829
+ setSelectedCourier(null);
830
+ return;
831
+ }
832
+ const timer = setTimeout(async () => {
833
+ setCheckingDeliveryStatus(true);
834
+ setShippingError(null);
835
+ try {
836
+ const status = await shippingService.getDeliveryStatus(storeConfig.id);
837
+ const anyProvider = status.enabled && Object.values(status.providers || {}).some(Boolean);
838
+ setIsCourierMode(anyProvider);
839
+ if (anyProvider) {
840
+ setShippingMethods([]);
841
+ setSelectedShippingMethod(null);
842
+ setSelectedCourier(null);
843
+ }
844
+ else {
845
+ await calculateShipping();
846
+ }
847
+ }
848
+ catch {
849
+ setIsCourierMode(false);
850
+ await calculateShipping();
851
+ }
852
+ finally {
853
+ setCheckingDeliveryStatus(false);
854
+ }
855
+ }, 500);
856
+ return () => clearTimeout(timer);
857
+ // eslint-disable-next-line react-hooks/exhaustive-deps
858
+ }, [deliveryEnabled, automatedShippingEnabled, formData.address, formData.city, formData.state, formData.country, formData.postalCode, formData.email, formData.phone, formData.firstName, formData.lastName, checkoutItems.length, subtotal, currency, storeConfig.id]);
859
+ const validateForm = () => {
860
+ const newErrors = {};
861
+ if (!formData.email)
862
+ newErrors.email = 'Email is required';
863
+ else if (!/\S+@\S+\.\S+/.test(formData.email))
864
+ newErrors.email = 'Invalid email address';
865
+ if (!formData.firstName)
866
+ newErrors.firstName = 'First name is required';
867
+ if (!formData.lastName)
868
+ newErrors.lastName = 'Last name is required';
869
+ if (!formData.address)
870
+ newErrors.address = 'Address is required';
871
+ if (!formData.country)
872
+ newErrors.country = 'Country is required';
873
+ if (!formData.city)
874
+ newErrors.city = 'City is required';
875
+ if (isNigeria(formData.country) && !formData.state) {
876
+ newErrors.state = 'State is required for Nigeria';
877
+ }
878
+ if (!formData.phone)
879
+ newErrors.phone = 'Phone is required';
880
+ else if (!validatePhone(formData.phone)) {
881
+ newErrors.phone = 'Please enter a valid phone number';
882
+ }
883
+ setErrors(newErrors);
884
+ return Object.keys(newErrors).length === 0;
885
+ };
886
+ const [promoCode, setPromoCode] = useState('');
887
+ const [isPromoApplied, setIsPromoApplied] = useState(false);
888
+ const handleApplyPromo = () => {
889
+ if (!promoCode)
890
+ return;
891
+ setIsPromoApplied(true);
892
+ addToast('Promo code applied successfully!', 'success');
893
+ };
894
+ const phonePlaceholder = getPhonePlaceholder();
895
+ const handlePhoneChange = (value) => {
896
+ setFormData({ ...formData, phone: formatPhoneInput(value) });
897
+ };
898
+ // Handle address selection
899
+ const handleAddressSelect = (addressId) => {
900
+ if (addressId === null) {
901
+ const profileAddress = user?.address && typeof user.address === 'object'
902
+ ? user.address.address1 ||
903
+ user.address.street ||
904
+ ''
905
+ : typeof user?.address === 'string'
906
+ ? user.address
907
+ : '';
908
+ // "Add new address" selected - pre-fill with profile data if available, otherwise clear
909
+ setFormData(prev => ({
910
+ email: user?.email || prev.email,
911
+ firstName: user?.firstName || prev.firstName,
912
+ lastName: user?.lastName || prev.lastName,
913
+ phone: user?.phone || prev.phone,
914
+ address: profileAddress,
915
+ city: (user?.address && typeof user.address === 'object'
916
+ ? user.address.city
917
+ : undefined) ||
918
+ user?.city ||
919
+ '',
920
+ state: '',
921
+ country: (user?.address && typeof user.address === 'object'
922
+ ? user.address.country
923
+ : undefined) ||
924
+ user?.country ||
925
+ prev.country ||
926
+ 'Nigeria',
927
+ postalCode: (user?.address && typeof user.address === 'object'
928
+ ? user.address.zipCode
929
+ : undefined) ||
930
+ user?.zipCode ||
931
+ '',
932
+ }));
933
+ setSelectedAddressId(null);
934
+ setSaveNewAddress(false);
935
+ setAddressLabel('');
936
+ return;
937
+ }
938
+ const address = savedAddresses.find(a => a.id === addressId);
939
+ if (address) {
940
+ setFormData(prev => ({
941
+ ...prev,
942
+ firstName: address.firstName,
943
+ lastName: address.lastName,
944
+ address: address.address1,
945
+ city: address.city,
946
+ state: address.state || '',
947
+ country: address.country,
948
+ postalCode: address.zipCode,
949
+ phone: address.phone || prev.phone,
950
+ }));
951
+ setSelectedAddressId(addressId);
952
+ setSaveNewAddress(false);
953
+ setAddressLabel('');
954
+ }
955
+ };
956
+ const saveCheckoutAddressIfNeeded = async () => {
957
+ if (!isAuthenticated || !saveNewAddress || selectedAddressId) {
958
+ return true;
959
+ }
960
+ try {
961
+ const newAddress = await customerService.addAddress({
962
+ firstName: formData.firstName.trim(),
963
+ lastName: formData.lastName.trim(),
964
+ address1: formData.address.trim(),
965
+ address2: '',
966
+ city: formData.city.trim(),
967
+ state: formData.state?.trim() || undefined,
968
+ zipCode: formData.postalCode?.trim() || undefined,
969
+ country: formData.country.trim(),
970
+ phone: formData.phone?.trim() || undefined,
971
+ isDefault: savedAddresses.length === 0,
972
+ label: addressLabel.trim() || undefined,
973
+ }, { suppressToast: true });
974
+ const addresses = await customerService.getAddresses();
975
+ setSavedAddresses(addresses);
976
+ handleAddressSelect(newAddress.id);
977
+ addToast('Address saved successfully!', 'success');
978
+ return true;
979
+ }
980
+ catch (addressError) {
981
+ console.error('[Checkout] Failed to save address:', addressError);
982
+ addToast(addressError?.message || 'Unable to save address right now. You can save it later from your account.', 'error');
983
+ return false;
984
+ }
985
+ };
986
+ const validateCheckoutPreFlight = () => {
987
+ // Validate checkout items
988
+ if (checkoutItems.length === 0) {
989
+ return { isValid: false, error: 'No items to checkout' };
990
+ }
991
+ // Note: no local Payaza key check here — the backend resolves the key for
992
+ // the order currency from the database registry and returns it from
993
+ // /checkout/process. Missing keys are reported after order creation.
994
+ // Validate form data
995
+ if (!formData.email) {
996
+ return { isValid: false, error: 'Email is required' };
997
+ }
998
+ if (!/\S+@\S+\.\S+/.test(formData.email)) {
999
+ return { isValid: false, error: 'Invalid email address' };
1000
+ }
1001
+ if (!formData.firstName) {
1002
+ return { isValid: false, error: 'First name is required' };
1003
+ }
1004
+ if (!formData.lastName) {
1005
+ return { isValid: false, error: 'Last name is required' };
1006
+ }
1007
+ if (!formData.address) {
1008
+ return { isValid: false, error: 'Address is required' };
1009
+ }
1010
+ if (!formData.city) {
1011
+ return { isValid: false, error: 'City is required' };
1012
+ }
1013
+ if (!formData.phone) {
1014
+ return { isValid: false, error: 'Phone is required' };
1015
+ }
1016
+ if (!validatePhone(formData.phone)) {
1017
+ return { isValid: false, error: 'Please enter a valid phone number' };
1018
+ }
1019
+ if (isNigeria(formData.country) && !formData.state) {
1020
+ return { isValid: false, error: 'State is required for Nigeria' };
1021
+ }
1022
+ // Validate currency availability
1023
+ const hasCurrency = storeConfig.settings?.currency || checkoutItems.some(item => item.product.currency);
1024
+ if (!hasCurrency) {
1025
+ console.warn('[Checkout] No currency found, will use USD fallback');
1026
+ }
1027
+ for (const item of checkoutItems) {
1028
+ const stockError = formatCheckoutStockError(item.product, item.quantity);
1029
+ if (stockError) {
1030
+ return {
1031
+ isValid: false,
1032
+ error: stockError,
1033
+ };
1034
+ }
1035
+ }
1036
+ return { isValid: true };
1037
+ };
1038
+ const handlePayazaCheckout = async () => {
1039
+ if (checkoutDisabled) {
1040
+ addToast(CHECKOUT_UNAVAILABLE_MESSAGE, 'error');
1041
+ return;
1042
+ }
1043
+ // Pre-flight validation
1044
+ const validation = validateCheckoutPreFlight();
1045
+ if (!validation.isValid) {
1046
+ addToast(validation.error || 'Please complete all required fields', 'error');
1047
+ return;
1048
+ }
1049
+ if (hasCheckoutStockIssues) {
1050
+ addToast(checkoutStockIssues[0]?.message || 'One or more items are no longer available.', 'error');
1051
+ refreshCart?.();
1052
+ return;
1053
+ }
1054
+ setLoading(true);
1055
+ try {
1056
+ await refreshCart?.();
1057
+ }
1058
+ catch (refreshError) {
1059
+ console.warn('[Checkout] Cart refresh before payment failed:', refreshError);
1060
+ }
1061
+ trackStorefrontEvent('Payment_method_selected', {
1062
+ storeId: storeConfig.id,
1063
+ storeSlug: storeConfig.slug,
1064
+ paymentMethod: 'payaza',
1065
+ totalValue: checkoutTotal,
1066
+ itemCount: checkoutItems.length,
1067
+ });
1068
+ // DEMO MODE BYPASS
1069
+ if (storeConfig.slug.startsWith('demo/')) {
1070
+ setTimeout(() => {
1071
+ router.push(`/${storeConfig.slug}/payment/callback?status=success&reference=DEMO-${Date.now()}`);
1072
+ }, 1500);
1073
+ return;
1074
+ }
1075
+ await saveCheckoutAddressIfNeeded();
1076
+ let checkoutResponse;
1077
+ let checkoutConfig;
1078
+ try {
1079
+ // Step 1: Create order via API before payment
1080
+ console.log('[Checkout] Step 1: Creating order via API', {
1081
+ storeId: storeConfig.id,
1082
+ itemCount: checkoutItems.length,
1083
+ customerEmail: formData.email,
1084
+ });
1085
+ if (!isAuthenticated && formData.email && formData.firstName && formData.lastName && formData.phone) {
1086
+ saveGuestUserInfo({
1087
+ email: formData.email,
1088
+ firstName: formData.firstName,
1089
+ lastName: formData.lastName,
1090
+ phone: formData.phone,
1091
+ });
1092
+ }
1093
+ try {
1094
+ const normalizedItems = checkoutItems.map((item) => normalizeCheckoutPayloadItem(item));
1095
+ if (isMarketplaceCheckout) {
1096
+ const marketplaceItems = normalizedItems.filter((item) => item.storeId);
1097
+ if (marketplaceItems.length !== normalizedItems.length) {
1098
+ throw new Error('Some cart items are missing store information. Please refresh your cart and try again.');
1099
+ }
1100
+ // Belt-and-suspenders: the backend now hard-rejects mixed-currency marketplace
1101
+ // checkouts, and in the normal flow this branch is unreachable since the cart is
1102
+ // already pre-filtered to one currency before this page mounts. Guard here anyway for
1103
+ // any other consumer of this shared component that doesn't pre-filter, and to fail
1104
+ // fast client-side instead of round-tripping to the server first.
1105
+ const checkoutCurrencies = new Set(checkoutItems
1106
+ .map((item) => item.currency ?? item.product?.currency)
1107
+ .filter((value) => Boolean(value)));
1108
+ if (checkoutCurrencies.size > 1) {
1109
+ throw new Error(`Your cart has items in different currencies (${Array.from(checkoutCurrencies).join(', ')}). Please check out one currency group at a time.`);
1110
+ }
1111
+ checkoutResponse = await checkoutService.processMarketplaceCheckout({
1112
+ items: marketplaceItems,
1113
+ sessionId: typeof window !== 'undefined' ? sessionStorage.getItem('sessionId') || undefined : undefined,
1114
+ customerInfo: {
1115
+ email: formData.email,
1116
+ firstName: formData.firstName,
1117
+ lastName: formData.lastName,
1118
+ phone: formData.phone,
1119
+ },
1120
+ shippingAddress: {
1121
+ firstName: formData.firstName,
1122
+ lastName: formData.lastName,
1123
+ address1: formData.address,
1124
+ city: formData.city,
1125
+ state: formData.state || formData.city || formData.country,
1126
+ zipCode: formData.postalCode,
1127
+ country: formData.country,
1128
+ phone: formData.phone,
1129
+ },
1130
+ paymentMethod: 'payaza',
1131
+ customerId: isAuthenticated && user ? user.id : undefined,
1132
+ }, {
1133
+ idempotencyKey: getOrCreateIdempotencyKey(checkoutIdempotencyKeyRef),
1134
+ });
1135
+ }
1136
+ else {
1137
+ checkoutResponse = await checkoutService.processCheckout({
1138
+ storeId: storeConfig.id,
1139
+ sessionId: typeof window !== 'undefined' ? sessionStorage.getItem('sessionId') || undefined : undefined,
1140
+ items: checkoutItems.map((item) => normalizeCheckoutPayloadItem(item)),
1141
+ customerInfo: {
1142
+ email: formData.email,
1143
+ firstName: formData.firstName,
1144
+ lastName: formData.lastName,
1145
+ phone: formData.phone,
1146
+ },
1147
+ shippingAddress: {
1148
+ firstName: formData.firstName,
1149
+ lastName: formData.lastName,
1150
+ address1: formData.address,
1151
+ city: formData.city,
1152
+ state: formData.state || formData.city || formData.country,
1153
+ zipCode: formData.postalCode,
1154
+ country: formData.country,
1155
+ phone: formData.phone,
1156
+ },
1157
+ shippingMethod: deliveryEnabled ? selectedShippingMethod?.code : undefined,
1158
+ shippingCost: deliveryEnabled ? shipping : 0,
1159
+ paymentMethod: 'payaza',
1160
+ deliveryProviderKey: selectedShippingMethod?.providerKey,
1161
+ deliveryMethodId: selectedShippingMethod?.deliveryMethodId,
1162
+ deliveryQuoteId: selectedShippingMethod?.deliveryQuoteId,
1163
+ customerId: isAuthenticated && user ? user.id : undefined, // Pass customerId for authenticated users
1164
+ }, {
1165
+ idempotencyKey: getOrCreateIdempotencyKey(checkoutIdempotencyKeyRef),
1166
+ });
1167
+ }
1168
+ console.log('[Checkout] Step 1: Order created successfully', {
1169
+ orderId: checkoutResponse.orderId,
1170
+ orderNumber: checkoutResponse.orderNumber,
1171
+ currency: checkoutResponse.currency,
1172
+ transactionReference: checkoutResponse.transactionReference,
1173
+ });
1174
+ lastMerchantReferenceRef.current =
1175
+ checkoutResponse.merchantReference || checkoutResponse.orderNumber || null;
1176
+ lastTransactionReferenceRef.current = checkoutResponse.transactionReference || null;
1177
+ lastCheckoutOrderIdRef.current = checkoutResponse.orderId || null;
1178
+ if (checkoutResponse.inventoryHoldUntil) {
1179
+ setInventoryHoldUntil?.(checkoutResponse.inventoryHoldUntil);
1180
+ }
1181
+ }
1182
+ catch (apiError) {
1183
+ console.error('[Checkout] Step 1: API call failed', {
1184
+ error: apiError,
1185
+ message: apiError?.message,
1186
+ status: apiError?.status,
1187
+ data: apiError?.data,
1188
+ requestData: {
1189
+ storeId: storeConfig.id,
1190
+ itemCount: checkoutItems.length,
1191
+ },
1192
+ });
1193
+ const isNetworkError = !apiError?.status ||
1194
+ apiError?.status === 0 ||
1195
+ apiError?.code === 'ECONNABORTED' ||
1196
+ apiError?.message === 'Network Error' ||
1197
+ apiError?.message?.includes('timeout');
1198
+ if (isNetworkError) {
1199
+ addToast(getUserFriendlyErrorMessage(apiError, 'Unable to reach the server. Please check your connection and try again.'), 'error');
1200
+ }
1201
+ else if (apiError?.status === 500) {
1202
+ addToast(getUserFriendlyErrorMessage(apiError, 'A server error occurred. Please try again in a moment.'), 'error');
1203
+ }
1204
+ else if (apiError?.status === 400 || apiError?.status === 422) {
1205
+ addToast(getUserFriendlyErrorMessage(apiError, 'Invalid checkout data. Please review your shipping information.'), 'error');
1206
+ }
1207
+ else if (apiError?.status === 409) {
1208
+ addToast(getUserFriendlyErrorMessage(apiError, 'One or more items are no longer available in the requested quantity.'), 'error');
1209
+ refreshCart?.();
1210
+ }
1211
+ else {
1212
+ addToast(getUserFriendlyErrorMessage(apiError, 'Failed to create order. Please try again.'), 'error');
1213
+ }
1214
+ setLoading(false);
1215
+ return;
1216
+ }
1217
+ // Resolve the Payaza public key. Priority order:
1218
+ // 1. Key resolved by the backend for the order currency from the
1219
+ // database-managed registry (backoffice → Payment Control)
1220
+ // 2. storeConfig.payment.payazaPublicKey
1221
+ // 3. NEXT_PUBLIC_PAYAZA_PUBLIC_KEY build-time env var
1222
+ const effectivePayazaPublicKey = checkoutResponse.payazaPublicKey || payazaPublicKey;
1223
+ if (!effectivePayazaPublicKey) {
1224
+ console.error('[Checkout] No Payaza public key available', {
1225
+ fromBackend: !!checkoutResponse.payazaPublicKey,
1226
+ fromStoreConfig: !!storeConfig.payment?.payazaPublicKey,
1227
+ fromEnv: !!process.env.NEXT_PUBLIC_PAYAZA_PUBLIC_KEY,
1228
+ });
1229
+ addToast('Payment gateway not configured. Please contact support.', 'error');
1230
+ setLoading(false);
1231
+ return;
1232
+ }
1233
+ // Step 2: Convert checkout items to Payaza format
1234
+ console.log('[Checkout] Step 2: Converting checkout items to Payaza format');
1235
+ try {
1236
+ const payazaItems = checkoutItems.map(item => ({
1237
+ product: {
1238
+ name: item.product.name,
1239
+ price: item.price,
1240
+ currency: item.product.currency,
1241
+ },
1242
+ quantity: item.quantity,
1243
+ price: item.price,
1244
+ }));
1245
+ console.log('[Checkout] Step 2: Items converted', { itemCount: payazaItems.length });
1246
+ // Step 3: Generate Payaza checkout config with order details
1247
+ console.log('[Checkout] Step 3: Generating Payaza checkout config', {
1248
+ currency: checkoutResponse.currency || storeConfig.settings?.currency,
1249
+ orderId: checkoutResponse.orderId,
1250
+ orderNumber: checkoutResponse.orderNumber,
1251
+ });
1252
+ const orderMerchantRef = checkoutResponse.merchantReference || checkoutResponse.orderNumber || '';
1253
+ checkoutConfig = generateCheckoutConfig(payazaItems, formData.email, effectivePayazaPublicKey, {
1254
+ firstName: formData.firstName,
1255
+ lastName: formData.lastName,
1256
+ phone: normalizePhoneForPayaza(formData.phone),
1257
+ callbackUrl: `${typeof window !== 'undefined' ? window.location.origin : ''}/${storeConfig.slug}/payment/callback?storeId=${storeConfig.id}${orderMerchantRef ? `&merchantReference=${encodeURIComponent(orderMerchantRef)}&orderNumber=${encodeURIComponent(orderMerchantRef)}` : ''}`,
1258
+ currency: checkoutResponse.currency || storeConfig.settings?.currency,
1259
+ storeId: storeConfig.id,
1260
+ orderId: checkoutResponse.orderId,
1261
+ orderNumber: checkoutResponse.orderNumber,
1262
+ merchantReference: checkoutResponse.merchantReference || checkoutResponse.orderNumber,
1263
+ totalAmount: checkoutResponse.totalAmount ??
1264
+ checkoutResponse.feeBreakdown?.totalPayable ??
1265
+ checkoutResponse.feeBreakdown?.total ??
1266
+ total,
1267
+ connectionMode: checkoutResponse.payazaConnectionMode,
1268
+ shippingAddress: {
1269
+ firstName: formData.firstName,
1270
+ lastName: formData.lastName,
1271
+ address: formData.address,
1272
+ city: formData.city,
1273
+ state: formData.state || formData.city || formData.country,
1274
+ country: formData.country,
1275
+ zipCode: formData.postalCode,
1276
+ },
1277
+ });
1278
+ console.log('[Checkout] Step 3: Checkout config generated', {
1279
+ amount: checkoutConfig.amount,
1280
+ currency: checkoutConfig.currency,
1281
+ reference: checkoutConfig.reference,
1282
+ });
1283
+ }
1284
+ catch (configError) {
1285
+ console.error('[Checkout] Step 2-3: Config generation failed', {
1286
+ error: configError,
1287
+ message: configError?.message,
1288
+ stack: configError?.stack,
1289
+ });
1290
+ addToast(configError?.message || 'Invalid checkout configuration. Please contact support.', 'error');
1291
+ setLoading(false);
1292
+ return;
1293
+ }
1294
+ // Step 4: Use transaction reference from order
1295
+ checkoutConfig.reference = checkoutResponse.transactionReference;
1296
+ console.log('[Checkout] Step 4: Transaction reference set', {
1297
+ reference: checkoutConfig.reference,
1298
+ });
1299
+ // Step 5: Initiate Payaza checkout
1300
+ console.log('[Checkout] Step 6: Initiating Payaza checkout');
1301
+ try {
1302
+ await initiateCheckout(checkoutConfig);
1303
+ console.log('[Checkout] Step 6: Payaza checkout initiated successfully');
1304
+ // Order is created; release page-level loading — Payaza SDK overlay handles payment UI.
1305
+ setLoading(false);
1306
+ // Clear buyNowItem after successful checkout initiation
1307
+ // The item has been processed and order created
1308
+ if (effectiveBuyNowItem) {
1309
+ clearBuyNowItem();
1310
+ }
1311
+ }
1312
+ catch (sdkError) {
1313
+ console.error('[Checkout] Step 5: Payaza SDK initiation failed', {
1314
+ error: sdkError,
1315
+ message: sdkError?.message,
1316
+ config: {
1317
+ amount: checkoutConfig.amount,
1318
+ currency: checkoutConfig.currency,
1319
+ publicKey: checkoutConfig.publicKey?.substring(0, 20) + '...',
1320
+ },
1321
+ });
1322
+ if (sdkError?.message?.includes('SDK not loaded') || sdkError?.message?.includes('PayazaCheckout')) {
1323
+ addToast('Payment system is loading. Please wait a moment and try again.', 'error');
1324
+ }
1325
+ else if (sdkError?.message?.includes('Currency')) {
1326
+ addToast('Invalid currency code. Please contact support.', 'error');
1327
+ }
1328
+ else {
1329
+ addToast('Payment popup failed to open. Please try again.', 'error');
1330
+ }
1331
+ setLoading(false);
1332
+ return;
1333
+ }
1334
+ }
1335
+ catch (error) {
1336
+ console.error('[Checkout] Unexpected error in checkout flow', {
1337
+ error,
1338
+ message: error?.message,
1339
+ stack: error?.stack,
1340
+ name: error?.name,
1341
+ });
1342
+ const isCollectionsDisabled = (error instanceof ApiError && error.status === 403) ||
1343
+ error?.response?.status === 403 ||
1344
+ error?.code === 'COLLECTIONS_DISABLED' ||
1345
+ String(error?.message || '').toLowerCase().includes('not accepting payments');
1346
+ addToast(isCollectionsDisabled ? CHECKOUT_UNAVAILABLE_MESSAGE : 'Failed to initiate checkout. Please try again.', 'error');
1347
+ setLoading(false);
1348
+ }
1349
+ };
1350
+ const handleDetailsSubmit = (e) => {
1351
+ e.preventDefault();
1352
+ if (validateForm()) {
1353
+ setStep('payment');
1354
+ window.scrollTo({ top: 0, behavior: 'smooth' });
1355
+ }
1356
+ else {
1357
+ addToast('Please fix the errors in the form.', 'error');
1358
+ // Scroll to the first error or top of form
1359
+ const firstErrorField = document.querySelector('.border-red-500');
1360
+ if (firstErrorField) {
1361
+ firstErrorField.scrollIntoView({ behavior: 'smooth', block: 'center' });
1362
+ }
1363
+ else {
1364
+ window.scrollTo({ top: 0, behavior: 'smooth' });
1365
+ }
1366
+ }
1367
+ };
1368
+ // Show skeleton while cart hydrates (buy-now flow skips cart hydration)
1369
+ if (!isCartHydrated && !effectiveBuyNowItem) {
1370
+ return _jsx(CheckoutSkeleton, {});
1371
+ }
1372
+ if (isPostPaymentNavigationPending()) {
1373
+ return (_jsxs("div", { className: "min-h-screen bg-gray-50/50 flex flex-col items-center justify-center p-4 font-sans", children: [_jsx(Loader2, { className: "mb-4 h-10 w-10 animate-spin text-gray-400" }), _jsx("p", { className: "font-medium text-gray-600", children: "Completing your order..." })] }));
1374
+ }
1375
+ // Show empty cart message if checkout items are empty (redirect will happen after delay)
1376
+ if (!checkoutItems || checkoutItems.length === 0) {
1377
+ return (_jsx("div", { className: "min-h-screen bg-gray-50/50 py-12 px-4 sm:px-6 lg:px-8 font-sans", children: _jsx("div", { className: "container mx-auto max-w-6xl", children: _jsx("div", { className: "bg-white rounded-3xl shadow-sm border border-gray-100 p-12 text-center", children: _jsxs("div", { className: "max-w-md mx-auto space-y-6", children: [_jsx("div", { className: "w-20 h-20 mx-auto rounded-full bg-gray-100 flex items-center justify-center", children: _jsx("svg", { className: "w-10 h-10 text-gray-400", fill: "none", viewBox: "0 0 24 24", stroke: "currentColor", children: _jsx("path", { strokeLinecap: "round", strokeLinejoin: "round", strokeWidth: 2, d: "M16 11V7a4 4 0 00-8 0v4M5 9h14l1 12H4L5 9z" }) }) }), _jsx("h2", { className: "text-2xl font-bold text-gray-900", children: "Your cart is empty" }), _jsx("p", { className: "text-gray-600", children: "Add some items to your cart before proceeding to checkout." }), _jsx("div", { className: "pt-4", children: _jsx(Link, { href: `/${storeConfig.slug}`, children: _jsxs(Button, { size: "lg", className: "bg-black hover:bg-gray-800 text-white rounded-full px-8 py-6 h-auto font-semibold shadow-lg shadow-black/10 hover:shadow-xl transition-all hover:scale-105 flex items-center gap-2 mx-auto", children: [_jsx(ArrowLeft, { className: "w-5 h-5" }), "Continue Shopping"] }) }) })] }) }) }) }));
1378
+ }
1379
+ return (_jsx("div", { className: "min-h-screen bg-gray-50/50 py-12 px-4 sm:px-6 lg:px-8 font-sans", children: _jsxs("div", { className: "container mx-auto max-w-6xl", children: [_jsxs("div", { className: "mb-10 flex items-center justify-between", children: [_jsxs(Link, { href: `/${storeConfig.slug}/cart`, className: "group flex items-center gap-2 text-gray-500 hover:text-black transition-colors font-medium", children: [_jsx("div", { className: "p-2 rounded-full bg-white border border-gray-200 group-hover:border-black transition-colors", children: _jsx(ArrowLeft, { className: "w-4 h-4" }) }), "Back to Cart"] }), _jsx("div", { className: "flex items-center gap-2 text-sm font-bold", children: deliveryEnabled ? (_jsxs(_Fragment, { children: [_jsx("span", { className: cn("px-3 py-1.5 rounded-full transition-colors", step === 'details' ? "bg-black text-white" : "bg-green-100 text-green-700"), children: step === 'details' ? '1' : _jsx(CheckCircle, { className: "w-4 h-4" }) }), _jsx("span", { className: cn(step === 'details' ? "text-black" : "text-gray-500"), children: "Shipping" }), _jsx("div", { className: "w-8 h-0.5 bg-gray-200" }), _jsx("span", { className: cn("px-3 py-1.5 rounded-full transition-colors", step === 'payment' ? "bg-black text-white" : "bg-gray-200 text-gray-500"), children: "2" }), _jsx("span", { className: cn(step === 'payment' ? "text-black" : "text-gray-400"), children: "Payment" })] })) : (_jsxs(_Fragment, { children: [_jsx("span", { className: cn("px-3 py-1.5 rounded-full transition-colors", step === 'details' ? "bg-black text-white" : "bg-green-100 text-green-700"), children: step === 'details' ? '1' : _jsx(CheckCircle, { className: "w-4 h-4" }) }), _jsx("span", { className: cn(step === 'details' ? "text-black" : "text-gray-500"), children: "Details" }), _jsx("div", { className: "w-8 h-0.5 bg-gray-200" }), _jsx("span", { className: cn("px-3 py-1.5 rounded-full transition-colors", step === 'payment' ? "bg-black text-white" : "bg-gray-200 text-gray-500"), children: "2" }), _jsx("span", { className: cn(step === 'payment' ? "text-black" : "text-gray-400"), children: "Payment" })] })) })] }), _jsxs("div", { className: "flex flex-col lg:flex-row gap-10", children: [_jsx("div", { className: "flex-1", children: step === 'details' ? (_jsxs("form", { onSubmit: handleDetailsSubmit, className: "space-y-8 animate-fade-in", children: [_jsxs("section", { className: "bg-white p-8 rounded-3xl shadow-sm border border-gray-100", children: [_jsxs("div", { className: "flex items-center gap-3 mb-6", children: [_jsx("div", { className: "p-2 bg-blue-50 text-blue-600 rounded-xl", children: _jsx(ShieldCheck, { className: "w-5 h-5" }) }), _jsx("h2", { className: "text-xl font-bold text-gray-900", children: "Contact Information" })] }), _jsx("div", { className: "space-y-4", children: isAuthenticated && user ? (_jsxs("div", { className: "space-y-3", children: [_jsxs("div", { className: "p-4 bg-gray-50 rounded-xl border border-gray-200", children: [_jsx("p", { className: "text-xs font-bold text-gray-500 uppercase tracking-wider mb-2", children: "Logged in as" }), _jsxs("p", { className: "font-bold text-gray-900", children: [user.firstName, " ", user.lastName] }), _jsx("p", { className: "text-sm text-gray-600", children: user.email })] }), _jsxs("div", { className: "space-y-1.5", children: [_jsx(RequiredLabel, { children: "Email Address" }), _jsx("input", { type: "email", className: cn("w-full px-5 py-3.5 bg-white border-2 rounded-xl focus:outline-none focus:ring-0 transition-all font-medium", errors.email ? "border-red-500 focus:border-red-500" : "border-gray-100 focus:border-black"), placeholder: "john@example.com", value: formData.email, onChange: e => setFormData({ ...formData, email: e.target.value }) }), _jsx("p", { className: "text-xs text-gray-500 ml-1", children: "You can use a different email for this order" }), errors.email && _jsx("p", { className: "text-red-500 text-xs ml-1", children: errors.email })] })] })) : (_jsxs("div", { className: "space-y-1.5", children: [_jsx(RequiredLabel, { children: "Email Address" }), _jsx("input", { type: "email", className: cn("w-full px-5 py-3.5 bg-white border-2 rounded-xl focus:outline-none focus:ring-0 transition-all font-medium", errors.email ? "border-red-500 focus:border-red-500" : "border-gray-100 focus:border-black"), placeholder: "john@example.com", value: formData.email, onChange: e => setFormData({ ...formData, email: e.target.value }) }), errors.email && _jsx("p", { className: "text-red-500 text-xs ml-1", children: errors.email })] })) })] }), _jsxs("section", { className: "bg-white p-8 rounded-3xl shadow-sm border border-gray-100", children: [_jsxs("div", { className: "flex items-center gap-3 mb-6", children: [_jsx("div", { className: "p-2 bg-orange-50 text-orange-600 rounded-xl", children: _jsx(MapPin, { className: "w-5 h-5" }) }), _jsx("h2", { className: "text-xl font-bold text-gray-900", children: storeConfig.settings?.shippingEnabled === false ? 'Billing Address' : 'Shipping Address' })] }), isAuthenticated && (_jsx(AddressSelector, { addresses: savedAddresses, selectedAddressId: selectedAddressId, onSelect: handleAddressSelect, isLoading: loadingAddresses, isAuthenticated: isAuthenticated })), _jsxs("div", { className: "grid grid-cols-1 md:grid-cols-2 gap-5", children: [_jsxs("div", { className: "space-y-1.5", children: [_jsx(RequiredLabel, { children: "First Name" }), _jsx("input", { type: "text", className: cn("w-full px-4 py-3 rounded-lg border focus:ring-2 focus:ring-black focus:outline-none transition-all text-base", errors.firstName ? "border-red-300 focus:border-red-500 bg-red-50" : "border-gray-200 focus:border-black"), value: formData.firstName, onChange: e => setFormData({ ...formData, firstName: e.target.value }) }), errors.firstName && _jsx("p", { className: "text-red-500 text-xs ml-1", children: errors.firstName })] }), _jsxs("div", { className: "space-y-1.5", children: [_jsx(RequiredLabel, { children: "Last Name" }), _jsx("input", { type: "text", className: cn("w-full px-4 py-3 rounded-lg border focus:ring-2 focus:ring-black focus:outline-none transition-all text-base", errors.lastName ? "border-red-300 focus:border-red-500 bg-red-50" : "border-gray-200 focus:border-black"), value: formData.lastName, onChange: e => setFormData({ ...formData, lastName: e.target.value }) }), errors.lastName && _jsx("p", { className: "text-red-500 text-xs ml-1", children: errors.lastName })] }), _jsxs("div", { className: "space-y-1.5 md:col-span-2", children: [_jsx(RequiredLabel, { children: "Address" }), _jsx("input", { type: "text", className: cn("w-full px-4 py-3 rounded-lg border focus:ring-2 focus:ring-black focus:outline-none transition-all text-base", errors.address ? "border-red-300 focus:border-red-500 bg-red-50" : "border-gray-200 focus:border-black"), placeholder: "e.g. 12 Adeola Odeku Street, Victoria Island", value: formData.address, onChange: e => setFormData({ ...formData, address: e.target.value }) }), errors.address
1380
+ ? _jsx("p", { className: "text-red-500 text-xs ml-1", children: errors.address })
1381
+ : _jsx("p", { className: "text-[11px] text-gray-500 mt-1 ml-1", children: "Enter your house/flat number and street name for accurate delivery rates." })] }), _jsxs("div", { className: "space-y-1.5", children: [_jsx(RequiredLabel, { children: "Country" }), _jsxs("div", { className: "relative", children: [_jsxs("button", { type: "button", onClick: () => setIsCountryDropdownOpen(!isCountryDropdownOpen), className: cn("w-full px-4 py-3 rounded-lg border focus:ring-2 focus:ring-black focus:outline-none transition-all text-left flex items-center justify-between text-base", errors.country ? "border-red-300 focus:border-red-500 bg-red-50" : "border-gray-200 focus:border-black"), children: [_jsx("span", { className: "flex items-center gap-2", children: (() => {
1382
+ const selectedCountry = getCountryByName(formData.country);
1383
+ return selectedCountry ? (_jsxs(_Fragment, { children: [_jsx("span", { className: "text-lg", children: selectedCountry.flag }), _jsx("span", { children: selectedCountry.name })] })) : (_jsx("span", { className: "text-gray-400", children: "Select country" }));
1384
+ })() }), _jsx(ChevronDown, { className: cn("w-5 h-5 text-gray-400 transition-transform", isCountryDropdownOpen && "transform rotate-180") })] }), isCountryDropdownOpen && (_jsxs(_Fragment, { children: [_jsx("div", { className: "fixed inset-0 z-10", onClick: () => { setIsCountryDropdownOpen(false); setCountrySearch(''); } }), _jsxs("div", { className: "absolute z-30 w-full mt-1 bg-white border border-gray-200 rounded-lg shadow-xl overflow-hidden", children: [_jsx("div", { className: "p-2 border-b border-gray-100", children: _jsx("input", { autoFocus: true, type: "text", placeholder: "Search country...", value: countrySearch, onChange: (e) => setCountrySearch(e.target.value), className: "w-full px-3 py-2 text-sm border border-gray-200 rounded-lg focus:outline-none focus:border-black", onClick: (e) => e.stopPropagation() }) }), _jsxs("div", { className: "max-h-52 overflow-y-auto", children: [countries.filter(c => c.name.toLowerCase().includes(countrySearch.toLowerCase())).map((country) => (_jsxs("button", { type: "button", onClick: () => {
1385
+ setFormData(prev => ({
1386
+ ...prev,
1387
+ country: country.name,
1388
+ city: '',
1389
+ state: '',
1390
+ }));
1391
+ setIsCountryDropdownOpen(false);
1392
+ setCountrySearch('');
1393
+ setIsCityDropdownOpen(false);
1394
+ setIsStateDropdownOpen(false);
1395
+ }, className: cn("w-full px-5 py-3 text-left flex items-center gap-3 hover:bg-gray-50 transition-colors", formData.country === country.name && "bg-gray-50 font-medium"), children: [_jsx("span", { className: "text-lg", children: country.flag }), _jsx("span", { children: country.name })] }, country.code))), countries.filter(c => c.name.toLowerCase().includes(countrySearch.toLowerCase())).length === 0 && (_jsx("div", { className: "px-5 py-3 text-gray-400 text-sm", children: "No countries found" }))] })] })] }))] }), errors.country && _jsx("p", { className: "text-red-500 text-xs ml-1", children: errors.country })] }), isNigeria(formData.country) && (_jsxs("div", { className: "space-y-1.5", children: [_jsx(RequiredLabel, { children: "State" }), _jsxs("div", { className: "relative", children: [_jsxs("button", { type: "button", onClick: () => setIsStateDropdownOpen(!isStateDropdownOpen), className: cn("w-full px-4 py-3 rounded-lg border focus:ring-2 focus:ring-black focus:outline-none transition-all text-left flex items-center justify-between text-base", errors.state ? "border-red-300 focus:border-red-500 bg-red-50" : "border-gray-200 focus:border-black"), children: [_jsx("span", { className: formData.state ? "text-gray-900" : "text-gray-400", children: formData.state || 'Select state' }), _jsx(ChevronDown, { className: cn("w-5 h-5 text-gray-400 transition-transform", isStateDropdownOpen && "transform rotate-180") })] }), isStateDropdownOpen && (_jsxs(_Fragment, { children: [_jsx("div", { className: "fixed inset-0 z-10", onClick: () => setIsStateDropdownOpen(false) }), _jsx("div", { className: "absolute z-30 w-full mt-1 bg-white border border-gray-200 rounded-lg shadow-xl max-h-52 overflow-y-auto", children: NIGERIAN_STATES.map((state) => (_jsx("button", { type: "button", onClick: () => {
1396
+ // Clear city when state changes so stale city isn't submitted
1397
+ setFormData({ ...formData, state, city: '' });
1398
+ setIsStateDropdownOpen(false);
1399
+ }, className: cn("w-full px-5 py-3 text-left hover:bg-gray-50 transition-colors", formData.state === state && "bg-gray-50 font-medium"), children: state }, state))) })] }))] }), errors.state && _jsx("p", { className: "text-red-500 text-xs ml-1", children: errors.state })] })), _jsxs("div", { className: "space-y-1.5", children: [_jsx(RequiredLabel, { children: "City" }), _jsxs("div", { className: "relative", children: [_jsx("input", { type: "text", placeholder: isNigeria(formData.country) && !formData.state ? 'Select a state first' : 'e.g. Lagos, Lekki, Ikeja', disabled: isNigeria(formData.country) && !formData.state, value: formData.city, onChange: (e) => {
1400
+ setFormData({ ...formData, city: e.target.value });
1401
+ setCitySearch(e.target.value);
1402
+ setIsCityDropdownOpen(true);
1403
+ }, onFocus: () => {
1404
+ if (!formData.country) {
1405
+ addToast('Please select a country first', 'error');
1406
+ return;
1407
+ }
1408
+ setIsCityDropdownOpen(true);
1409
+ }, onBlur: () => setTimeout(() => setIsCityDropdownOpen(false), 150), className: cn("w-full px-4 py-3 rounded-lg border focus:ring-2 focus:ring-black focus:outline-none transition-all text-base", errors.city ? "border-red-300 focus:border-red-500 bg-red-50" : "border-gray-200 focus:border-black", isNigeria(formData.country) && !formData.state && "bg-gray-50 text-gray-400 cursor-not-allowed") }), isCityDropdownOpen && formData.country && (_jsxs(_Fragment, { children: [_jsx("div", { className: "fixed inset-0 z-10", onClick: () => setIsCityDropdownOpen(false) }), (() => {
1410
+ const nigeriaState = isNigeria(formData.country) ? formData.state : null;
1411
+ const suggestions = nigeriaState
1412
+ ? getNigerianCitiesByState(nigeriaState).filter(c => c.toLowerCase().includes((formData.city || '').toLowerCase()))
1413
+ : getCitiesByCountry(formData.country).filter(c => c.toLowerCase().includes((formData.city || '').toLowerCase()));
1414
+ if (suggestions.length === 0)
1415
+ return null;
1416
+ return (_jsx("div", { className: "absolute z-30 w-full mt-1 bg-white border border-gray-200 rounded-lg shadow-xl max-h-52 overflow-y-auto", children: suggestions.map((city) => (_jsx("button", { type: "button", onMouseDown: (e) => e.preventDefault(), onClick: () => {
1417
+ setFormData({ ...formData, city });
1418
+ setIsCityDropdownOpen(false);
1419
+ setCitySearch('');
1420
+ }, className: cn("w-full px-5 py-3 text-left hover:bg-gray-50 transition-colors text-base", formData.city === city && "bg-gray-50 font-medium"), children: city }, city))) }));
1421
+ })()] }))] }), errors.city
1422
+ ? _jsx("p", { className: "text-red-500 text-xs ml-1", children: errors.city })
1423
+ : _jsx("p", { className: "text-[11px] text-gray-500 mt-1 ml-1", children: "Type your city or town name \u2014 you can enter any location not shown in suggestions." })] }), _jsxs("div", { className: "space-y-1.5", children: [_jsx("label", { className: "text-sm font-bold text-gray-700 ml-1", children: "Postal/Zip Code" }), _jsx("input", { type: "text", className: cn("w-full px-4 py-3 rounded-lg border focus:ring-2 focus:ring-black focus:outline-none transition-all text-base", errors.postalCode ? "border-red-300 focus:border-red-500 bg-red-50" : "border-gray-200 focus:border-black"), placeholder: "Optional", value: formData.postalCode, onChange: e => setFormData({ ...formData, postalCode: e.target.value }) }), errors.postalCode && _jsx("p", { className: "text-red-500 text-xs ml-1", children: errors.postalCode })] }), _jsxs("div", { className: "space-y-1.5", children: [_jsx(RequiredLabel, { children: "Phone" }), _jsx("input", { type: "tel", className: cn("w-full px-4 py-3 rounded-lg border focus:ring-2 focus:ring-black focus:outline-none transition-all text-base", errors.phone ? "border-red-300 focus:border-red-500 bg-red-50" : "border-gray-200 focus:border-black"), placeholder: phonePlaceholder, value: formData.phone, onChange: e => handlePhoneChange(e.target.value) }), errors.phone && _jsx("p", { className: "text-red-500 text-xs ml-1", children: errors.phone })] })] }), isAuthenticated && !selectedAddressId && (_jsxs("div", { className: "mt-6 space-y-3", children: [_jsxs("label", { className: "flex items-center gap-3 cursor-pointer group", children: [_jsx("input", { type: "checkbox", checked: saveNewAddress, onChange: (e) => setSaveNewAddress(e.target.checked), className: "w-5 h-5 rounded border-2 border-gray-300 text-black focus:ring-2 focus:ring-black cursor-pointer" }), _jsx("span", { className: "text-sm font-medium text-gray-700 group-hover:text-black transition-colors", children: "Save this address for future use" })] }), saveNewAddress && (_jsxs("div", { className: "space-y-1.5", children: [_jsx("label", { className: "text-sm font-bold text-gray-700 ml-1", children: "Address Label (optional)" }), _jsx("input", { type: "text", value: addressLabel, onChange: (e) => setAddressLabel(e.target.value), placeholder: "e.g., Home, Work, Office", className: "w-full px-5 py-3.5 bg-white border-2 border-gray-100 rounded-xl focus:outline-none focus:ring-0 focus:border-black transition-all font-medium" })] }))] }))] }), deliveryEnabled && !automatedShippingEnabled && (_jsxs("section", { className: "bg-white p-8 rounded-3xl shadow-sm border border-gray-100", children: [_jsxs("div", { className: "flex items-center gap-3 mb-4", children: [_jsx("div", { className: "p-2 bg-amber-50 text-amber-700 rounded-xl", children: _jsx(Truck, { className: "w-5 h-5" }) }), _jsx("h2", { className: "text-xl font-bold text-gray-900", children: "Delivery" })] }), _jsx(MerchantHandledDeliveryNotice, { storeName: storeConfig.name })] })), deliveryEnabled && automatedShippingEnabled && canRequestShippingQuote(buildQuoteAddress()) && (_jsxs("section", { className: "bg-white p-8 rounded-3xl shadow-sm border border-gray-100", children: [_jsxs("div", { className: "flex items-center gap-3 mb-6", children: [_jsx("div", { className: "p-2 bg-purple-50 text-purple-600 rounded-xl", children: _jsx(Truck, { className: "w-5 h-5" }) }), _jsx("h2", { className: "text-xl font-bold text-gray-900", children: "Shipping Method" })] }), !isCourierMode && freeShippingThreshold !== undefined && !freeShippingEligible && (_jsxs("div", { className: "mb-4 p-3 bg-blue-50 border border-blue-200 rounded-lg", children: [_jsxs("p", { className: "text-xs font-medium text-blue-900 mb-1", children: ["Spend ", formatCurrency(freeShippingThreshold - subtotal, currency), " more for free shipping!"] }), _jsx("div", { className: "w-full bg-blue-200 rounded-full h-2", children: _jsx("div", { className: "bg-blue-600 h-2 rounded-full transition-all", style: {
1424
+ width: `${Math.min(100, (subtotal / freeShippingThreshold) * 100)}%`,
1425
+ } }) })] })), checkingDeliveryStatus || (!isCourierMode && isCalculatingShipping) ? (_jsx("div", { className: "flex items-center justify-center p-8", children: _jsxs("div", { className: "flex items-center gap-2 text-gray-600", children: [_jsx("div", { className: "animate-spin rounded-full h-5 w-5 border-b-2 border-gray-900" }), _jsx("span", { className: "text-sm font-medium", children: "Calculating shipping options..." })] }) })) : isCourierMode ? (_jsx(ShippingOptionsPanel, { storeId: storeConfig.id, address: buildQuoteAddress(), packages: checkoutItems.map((item) => ({
1426
+ weight: item.product?.weight || 0.5,
1427
+ value: item.price,
1428
+ name: item.product?.name,
1429
+ quantity: item.quantity,
1430
+ })), customerInfo: {
1431
+ firstName: formData.firstName,
1432
+ lastName: formData.lastName,
1433
+ phone: formData.phone,
1434
+ email: formData.email,
1435
+ }, onSelect: handleCourierSelect, selected: selectedCourier })) : shippingError ? (_jsx("div", { className: "p-4 bg-red-50 border border-red-200 rounded-lg", children: _jsx("p", { className: "text-sm text-red-600", children: shippingError }) })) : shippingMethods.length > 0 ? (_jsx("div", { className: "space-y-3", children: shippingMethods.map((method) => (_jsxs("label", { className: cn("flex items-center justify-between p-4 border-2 rounded-xl cursor-pointer transition-all", selectedShippingMethod?.code === method.code
1436
+ ? "border-black bg-gray-50"
1437
+ : "border-gray-200 hover:border-gray-300 bg-white"), children: [_jsxs("div", { className: "flex items-center gap-4 flex-1", children: [_jsx("input", { type: "radio", name: "shippingMethod", value: method.code, checked: selectedShippingMethod?.code === method.code, onChange: () => setSelectedShippingMethod(method), className: "w-5 h-5 text-black focus:ring-2 focus:ring-black cursor-pointer" }), _jsxs("div", { className: "flex-1", children: [_jsxs("div", { className: "flex items-center gap-2", children: [_jsx("p", { className: "font-bold text-gray-900", children: method.name }), freeShippingEligible && method.cost === 0 && (_jsx("span", { className: "text-xs font-normal text-green-700 bg-green-100 px-2 py-0.5 rounded-full", children: "FREE" }))] }), method.description && (_jsx("p", { className: "text-xs text-gray-500 mt-0.5", children: method.description })), method.estimatedDays && (_jsx("p", { className: "text-xs text-gray-500 mt-0.5", children: method.estimatedDaysMin && method.estimatedDaysMax
1438
+ ? `Estimated delivery: ${method.estimatedDaysMin}-${method.estimatedDaysMax} business days`
1439
+ : `Estimated delivery: ${method.estimatedDays} business days` }))] })] }), _jsx("div", { className: "text-right", children: _jsx("p", { className: "font-bold text-gray-900", children: freeShippingEligible && method.cost === 0
1440
+ ? 'FREE'
1441
+ : Number.isFinite(method.cost) && method.cost >= 0
1442
+ ? formatCurrency(method.cost, currency)
1443
+ : 'Not available' }) })] }, method.code))) })) : (_jsx("div", { className: "p-4 bg-gray-50 border border-gray-200 rounded-lg text-center", children: _jsx("p", { className: "text-sm text-gray-600", children: "No shipping methods available. Please check your address." }) }))] })), _jsxs(Button, { type: "submit", size: "lg", className: "w-full h-14 text-lg font-bold rounded-2xl shadow-xl hover:shadow-2xl hover:-translate-y-0.5 transition-all text-white [&_svg]:text-white", style: { backgroundColor: primaryColor, color: '#fff' }, children: ["Continue to Payment ", _jsx(ChevronRight, { className: "ml-2 w-5 h-5" })] })] })) : (_jsxs("div", { className: "space-y-8 animate-fade-in", children: [deliveryEnabled && (_jsxs("section", { className: "bg-white p-6 rounded-3xl shadow-sm border border-gray-100 flex justify-between items-center group hover:border-gray-300 transition-colors cursor-pointer", onClick: () => setStep('details'), children: [_jsxs("div", { className: "flex gap-4 items-center", children: [_jsx("div", { className: "w-10 h-10 bg-green-50 rounded-full flex items-center justify-center border border-green-100", children: _jsx(CheckCircle, { className: "w-5 h-5 text-green-600" }) }), _jsxs("div", { children: [_jsx("p", { className: "text-xs text-gray-500 font-bold uppercase tracking-wider mb-1", children: "Shipping To" }), _jsxs("p", { className: "font-bold text-gray-900", children: [formData.firstName, " ", formData.lastName] }), _jsxs("p", { className: "text-sm text-gray-500", children: [formData.address, ", ", formData.city] })] })] }), _jsx("span", { className: "text-sm font-bold text-blue-600 px-4 py-2 bg-blue-50 rounded-lg group-hover:bg-blue-100 transition-colors", children: "Edit" })] })), _jsxs("section", { className: "bg-white p-8 rounded-3xl shadow-sm border border-gray-100", children: [_jsxs("div", { className: "flex items-center gap-3 mb-6", children: [_jsx("div", { className: "p-2 bg-blue-50 text-blue-600 rounded-xl", children: _jsx(ShieldCheck, { className: "w-5 h-5" }) }), _jsx("h2", { className: "text-xl font-bold text-gray-900", children: "Payment Security" })] }), _jsx("div", { className: "bg-blue-50/50 p-6 rounded-2xl border border-blue-100 mb-6", children: _jsxs("div", { className: "flex items-start gap-4", children: [_jsx(Lock, { className: "w-5 h-5 text-blue-600 mt-1" }), _jsxs("div", { children: [_jsx("h4", { className: "font-bold text-blue-900 mb-1", children: "Encrypted Transaction" }), _jsx("p", { className: "text-sm text-blue-700/80 leading-relaxed", children: "Your payment is processed securely by Payaza. We do not store your card details." })] })] }) }), _jsxs("div", { className: "flex items-center justify-center gap-2 text-xs font-bold text-gray-400 uppercase tracking-widest", children: [_jsx(Lock, { className: "w-3 h-3" }), "256-bit SSL Secure Payment"] })] }), isHoldBlocking && (_jsxs("div", { className: "rounded-2xl border border-red-200 bg-red-50 p-4 flex gap-3", children: [_jsx(AlertCircle, { className: "w-5 h-5 text-red-700 flex-shrink-0 mt-0.5" }), _jsxs("div", { children: [_jsx("p", { className: "font-bold text-red-900 text-sm", children: "Checkout reservation expired" }), _jsx("p", { className: "mt-1 text-sm text-red-800", children: "Your stock hold has expired. Go back to cart and start checkout again to reserve items." })] })] })), hasCheckoutStockIssues && (_jsxs("div", { className: "rounded-2xl border border-amber-200 bg-amber-50 p-4 flex gap-3", children: [_jsx(AlertCircle, { className: "w-5 h-5 text-amber-700 flex-shrink-0 mt-0.5" }), _jsxs("div", { children: [_jsx("p", { className: "font-bold text-amber-900 text-sm", children: "Stock availability changed" }), _jsx("ul", { className: "mt-2 space-y-1 text-sm text-amber-800", children: checkoutStockIssues.map((issue) => (_jsx("li", { children: issue.message }, issue.id))) }), _jsx("p", { className: "mt-2 text-xs text-amber-700", children: "Update your cart before paying. Payment is only available when all items are in stock." })] })] })), _jsx(Button, { onClick: handlePayazaCheckout, size: "lg", className: "w-full h-16 text-lg font-bold rounded-2xl shadow-xl hover:shadow-2xl hover:-translate-y-0.5 transition-all text-white [&_svg]:text-white", style: { backgroundColor: primaryColor, color: '#fff' }, disabled: loading || isPayazaLoading || hasCheckoutStockIssues || isHoldBlocking || checkoutDisabled, children: loading || isPayazaLoading ? (_jsxs("div", { className: "flex items-center gap-2", children: [_jsx("div", { className: "w-5 h-5 border-2 border-white/30 border-t-white rounded-full animate-spin" }), _jsx("span", { children: "Processing Securely..." })] })) : checkoutDisabled ? (_jsx("span", { children: "Checkout unavailable" })) : (_jsxs("div", { className: "flex items-center gap-2", children: [_jsx(Lock, { className: "w-5 h-5" }), _jsx("span", { children: "Pay Now" })] })) }), checkoutDisabled && (_jsx("p", { className: "mt-3 text-sm text-center text-gray-500", children: CHECKOUT_UNAVAILABLE_MESSAGE }))] })) }), _jsxs("div", { className: "w-full lg:w-[400px] flex-shrink-0", children: [_jsxs("div", { className: "bg-white p-8 rounded-3xl shadow-lg border border-gray-100 sticky top-8", children: [_jsx("h2", { className: "text-xl font-black text-gray-900 mb-6", children: "Order Summary" }), _jsx("div", { className: "mb-6", children: _jsx(InventoryHoldCountdown, { holdUntil: inventoryHoldUntil, onExpired: () => {
1444
+ setIsHoldExpired(true);
1445
+ handleInventoryHoldExpired?.();
1446
+ } }) }), _jsx("div", { className: "space-y-6 mb-8 max-h-[400px] overflow-y-auto scrollbar-hide", children: checkoutItems.map((item) => {
1447
+ const stockInfo = getCartLineStockInfo(item.product, item.quantity);
1448
+ return (_jsxs("div", { className: "flex gap-4 group", children: [_jsxs("div", { className: "w-20 h-20 bg-gray-100 rounded-xl overflow-hidden flex-shrink-0 relative border border-gray-200", children: [_jsx(Image, { src: getCartLineImage(item) || item.product.images[0], alt: item.product.name, fill: true, className: "object-cover group-hover:scale-105 transition-transform duration-500", unoptimized: true }), _jsxs("span", { className: "absolute top-0 right-0 bg-black text-white text-[10px] font-bold px-2 py-1 rounded-bl-lg z-10", children: ["x", item.quantity] })] }), _jsxs("div", { className: "flex-1 py-1", children: [_jsx("p", { className: "font-bold text-gray-900 text-sm line-clamp-2 leading-relaxed", children: item.product.name }), item.variantName && _jsx("p", { className: "text-xs text-gray-500 mt-0.5", children: item.variantName }), stockInfo.displayLabel && (_jsx("p", { className: cn('text-xs font-semibold mt-1', stockInfo.stockError ? 'text-red-600' : 'text-amber-700'), children: stockInfo.displayLabel })), _jsx("p", { className: "text-gray-500 text-sm font-medium mt-1", children: formatCurrency(normalizePrice(item.price), item.product?.currency || currency) })] })] }, item.id));
1449
+ }) }), isMarketplaceCheckout && storeBreakdown.length > 1 && (_jsxs("div", { className: "mb-6 rounded-2xl bg-gray-50 border border-gray-100 p-4", children: [_jsxs("p", { className: "text-xs font-bold text-gray-700 mb-3", children: ["Your order will be split into ", storeBreakdown.length, " separate orders \u2014 one per store"] }), _jsx("div", { className: "space-y-2", children: storeBreakdown.map((store) => (_jsxs("div", { className: "flex justify-between text-xs text-gray-600", children: [_jsxs("span", { className: "font-medium truncate pr-2", children: [store.storeName, " (", store.itemCount, " item", store.itemCount === 1 ? '' : 's', ")"] }), _jsx("span", { className: "font-bold text-gray-900 flex-shrink-0", children: formatCurrency(store.subtotal, currency) })] }, store.storeId))) })] })), _jsxs("div", { className: "space-y-4 pt-6 border-t-2 border-gray-50", children: [_jsxs("div", { className: "flex justify-between text-gray-500 font-medium text-sm", children: [_jsx("span", { children: "Subtotal" }), _jsx("span", { className: "text-gray-900 font-bold", children: formatCurrency(subtotal, currency) })] }), deliveryEnabled && (_jsxs("div", { className: "flex justify-between text-gray-500 font-medium text-sm", children: [_jsxs("span", { children: ["Shipping", selectedShippingMethod ? ` (${selectedShippingMethod.name})` : ''] }), _jsx("span", { className: "text-gray-900 font-bold", children: !automatedShippingEnabled ? (_jsx("span", { className: "text-amber-700", children: "Handled by merchant" })) : isCalculatingShipping ? (_jsx("span", { className: "text-gray-400", children: "Calculating..." })) : !selectedShippingMethod ? (_jsx("span", { className: "text-gray-400", children: "Not available" })) : shipping === 0 && freeShippingEligible ? (_jsx("span", { className: "text-green-600", children: "Free" })) : shipping === 0 ? ('Free') : Number.isFinite(shipping) && shipping > 0 ? (formatCurrency(shipping, currency)) : (_jsx("span", { className: "text-gray-400", children: "Not available" })) })] })), feesLoading && (_jsxs("div", { className: "flex justify-between text-gray-500 font-medium text-sm", children: [_jsx("span", { children: "Fees" }), _jsx("span", { className: "text-gray-900 font-bold", children: "Calculating..." })] })), !feesLoading && (_jsx(CheckoutFeeLines, { lines: displayLines, currency: currency, excludeKeys: ['shipping'], className: "flex justify-between text-gray-500 font-medium text-sm", labelClassName: "", amountClassName: "text-gray-900 font-bold" })), _jsxs("div", { className: "flex justify-between items-end pt-4 mt-2 border-t border-gray-100", children: [_jsx("span", { className: "text-base font-bold text-gray-900", children: "Total to pay" }), _jsx("span", { className: "text-3xl font-black text-gray-900 tracking-tight", children: formatCurrency(total, currency) })] })] }), _jsxs("div", { className: "mt-8 pt-6 border-t border-gray-100 grid grid-cols-3 gap-2 opacity-50 grayscale", children: [_jsx("div", { className: "h-8 bg-gray-100 rounded border border-gray-200" }), _jsx("div", { className: "h-8 bg-gray-100 rounded border border-gray-200" }), _jsx("div", { className: "h-8 bg-gray-100 rounded border border-gray-200" })] })] }), PROMO_CODE_ENABLED && (_jsxs("div", { className: "bg-white p-6 rounded-3xl shadow-lg border border-gray-100 mt-6 sticky top-[500px]", children: [_jsxs("h3", { className: "font-bold text-gray-900 mb-4 flex items-center gap-2", children: [_jsx(Tag, { className: "w-4 h-4" }), " Have a promo code?"] }), _jsxs("div", { className: "flex gap-2", children: [_jsx("input", { type: "text", value: promoCode, onChange: (e) => setPromoCode(e.target.value), placeholder: "Enter code", className: "flex-1 px-4 py-2 bg-gray-50 border border-gray-200 rounded-xl focus:outline-none focus:border-black transition-all uppercase placeholder:normal-case font-medium" }), _jsx(Button, { onClick: handleApplyPromo, disabled: !promoCode || isPromoApplied, className: "bg-black text-white rounded-xl", style: isPromoApplied ? { backgroundColor: '#22c55e' } : {}, children: isPromoApplied ? 'Applied' : 'Apply' })] }), isPromoApplied && (_jsxs("p", { className: "text-green-600 text-xs font-bold mt-2 flex items-center gap-1", children: [_jsx(CheckCircle, { className: "w-3 h-3" }), " Discount applied to total"] }))] }))] })] })] }) }));
1450
+ }