@pradip1995/create-storefront 1.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (338) hide show
  1. package/bin/create-storefront.js +239 -0
  2. package/lib/kit-next-config.js +84 -0
  3. package/package.json +32 -0
  4. package/templates/storefront/.eslintrc.json +3 -0
  5. package/templates/storefront/README.md +35 -0
  6. package/templates/storefront/check-env-variables.js +51 -0
  7. package/templates/storefront/kit-next-config.js +71 -0
  8. package/templates/storefront/next-env.d.ts +5 -0
  9. package/templates/storefront/next.config.js +25 -0
  10. package/templates/storefront/package.json +56 -0
  11. package/templates/storefront/postcss.config.js +6 -0
  12. package/templates/storefront/public/favicon.png +0 -0
  13. package/templates/storefront/src/app/[countryCode]/(checkout)/checkout/page.tsx +23 -0
  14. package/templates/storefront/src/app/[countryCode]/(checkout)/checkout/payment/page.tsx +47 -0
  15. package/templates/storefront/src/app/[countryCode]/(checkout)/layout.tsx +31 -0
  16. package/templates/storefront/src/app/[countryCode]/(checkout)/not-found.tsx +19 -0
  17. package/templates/storefront/src/app/[countryCode]/(main)/account/@dashboard/addresses/page.tsx +31 -0
  18. package/templates/storefront/src/app/[countryCode]/(main)/account/@dashboard/loading.tsx +9 -0
  19. package/templates/storefront/src/app/[countryCode]/(main)/account/@dashboard/orders/details/[id]/page.tsx +35 -0
  20. package/templates/storefront/src/app/[countryCode]/(main)/account/@dashboard/orders/exchange/[id]/page.tsx +47 -0
  21. package/templates/storefront/src/app/[countryCode]/(main)/account/@dashboard/orders/page.tsx +28 -0
  22. package/templates/storefront/src/app/[countryCode]/(main)/account/@dashboard/orders/return/[id]/page.tsx +66 -0
  23. package/templates/storefront/src/app/[countryCode]/(main)/account/@dashboard/page.tsx +22 -0
  24. package/templates/storefront/src/app/[countryCode]/(main)/account/@dashboard/payment-methods/page.tsx +23 -0
  25. package/templates/storefront/src/app/[countryCode]/(main)/account/@dashboard/profile/page.tsx +43 -0
  26. package/templates/storefront/src/app/[countryCode]/(main)/account/@login/default.tsx +11 -0
  27. package/templates/storefront/src/app/[countryCode]/(main)/account/@login/page.tsx +18 -0
  28. package/templates/storefront/src/app/[countryCode]/(main)/account/guest-orders/page.tsx +13 -0
  29. package/templates/storefront/src/app/[countryCode]/(main)/account/layout.tsx +22 -0
  30. package/templates/storefront/src/app/[countryCode]/(main)/account/loading.tsx +9 -0
  31. package/templates/storefront/src/app/[countryCode]/(main)/cart/loading.tsx +5 -0
  32. package/templates/storefront/src/app/[countryCode]/(main)/cart/not-found.tsx +21 -0
  33. package/templates/storefront/src/app/[countryCode]/(main)/cart/page.tsx +23 -0
  34. package/templates/storefront/src/app/[countryCode]/(main)/categories/[...category]/page.tsx +11 -0
  35. package/templates/storefront/src/app/[countryCode]/(main)/collections/[handle]/page.tsx +11 -0
  36. package/templates/storefront/src/app/[countryCode]/(main)/contact/page.tsx +21 -0
  37. package/templates/storefront/src/app/[countryCode]/(main)/guest-orders/page.tsx +12 -0
  38. package/templates/storefront/src/app/[countryCode]/(main)/help/page.tsx +28 -0
  39. package/templates/storefront/src/app/[countryCode]/(main)/layout.tsx +21 -0
  40. package/templates/storefront/src/app/[countryCode]/(main)/not-found.tsx +20 -0
  41. package/templates/storefront/src/app/[countryCode]/(main)/order/[id]/confirmed/loading.tsx +5 -0
  42. package/templates/storefront/src/app/[countryCode]/(main)/order/[id]/confirmed/page.tsx +23 -0
  43. package/templates/storefront/src/app/[countryCode]/(main)/order/[id]/transfer/[token]/accept/page.tsx +41 -0
  44. package/templates/storefront/src/app/[countryCode]/(main)/order/[id]/transfer/[token]/decline/page.tsx +41 -0
  45. package/templates/storefront/src/app/[countryCode]/(main)/order/[id]/transfer/[token]/page.tsx +38 -0
  46. package/templates/storefront/src/app/[countryCode]/(main)/order/exchange/[id]/page.tsx +47 -0
  47. package/templates/storefront/src/app/[countryCode]/(main)/order/return/[id]/page.tsx +61 -0
  48. package/templates/storefront/src/app/[countryCode]/(main)/orders/[id]/page.tsx +33 -0
  49. package/templates/storefront/src/app/[countryCode]/(main)/page.tsx +24 -0
  50. package/templates/storefront/src/app/[countryCode]/(main)/privacy-policy/page.tsx +173 -0
  51. package/templates/storefront/src/app/[countryCode]/(main)/products/[handle]/page.tsx +193 -0
  52. package/templates/storefront/src/app/[countryCode]/(main)/reset-password/page.tsx +192 -0
  53. package/templates/storefront/src/app/[countryCode]/(main)/store/page.tsx +72 -0
  54. package/templates/storefront/src/app/[countryCode]/(main)/terms-of-use/page.tsx +179 -0
  55. package/templates/storefront/src/app/[countryCode]/(main)/wishlist/page.tsx +19 -0
  56. package/templates/storefront/src/app/api/meta/event/route.ts +63 -0
  57. package/templates/storefront/src/app/auth/customer/google/callback/page.tsx +126 -0
  58. package/templates/storefront/src/app/layout.tsx +104 -0
  59. package/templates/storefront/src/app/not-found.tsx +30 -0
  60. package/templates/storefront/src/app/opengraph-image.jpg +0 -0
  61. package/templates/storefront/src/app/robots.ts +15 -0
  62. package/templates/storefront/src/app/sitemap.ts +65 -0
  63. package/templates/storefront/src/app/twitter-image.jpg +0 -0
  64. package/templates/storefront/src/modules/account/components/account-deletion/index.tsx +160 -0
  65. package/templates/storefront/src/modules/account/components/account-info/index.tsx +145 -0
  66. package/templates/storefront/src/modules/account/components/account-nav/icons.tsx +43 -0
  67. package/templates/storefront/src/modules/account/components/account-nav/index.tsx +318 -0
  68. package/templates/storefront/src/modules/account/components/account-nav/logout-modal.tsx +92 -0
  69. package/templates/storefront/src/modules/account/components/account-nav/payment-methods-icon.tsx +9 -0
  70. package/templates/storefront/src/modules/account/components/address-book/index.tsx +47 -0
  71. package/templates/storefront/src/modules/account/components/address-card/add-address.tsx +377 -0
  72. package/templates/storefront/src/modules/account/components/address-card/edit-address-modal.tsx +468 -0
  73. package/templates/storefront/src/modules/account/components/deletion-pending-modal/index.tsx +213 -0
  74. package/templates/storefront/src/modules/account/components/forgot-password/index.tsx +1 -0
  75. package/templates/storefront/src/modules/account/components/login/index.tsx +1 -0
  76. package/templates/storefront/src/modules/account/components/order-card/index.tsx +221 -0
  77. package/templates/storefront/src/modules/account/components/order-overview/index.tsx +159 -0
  78. package/templates/storefront/src/modules/account/components/overview/index.tsx +189 -0
  79. package/templates/storefront/src/modules/account/components/profile-billing-address/index.tsx +447 -0
  80. package/templates/storefront/src/modules/account/components/profile-email/index.tsx +75 -0
  81. package/templates/storefront/src/modules/account/components/profile-form/index.tsx +416 -0
  82. package/templates/storefront/src/modules/account/components/profile-name/index.tsx +76 -0
  83. package/templates/storefront/src/modules/account/components/profile-password/index.tsx +70 -0
  84. package/templates/storefront/src/modules/account/components/profile-phone/index.tsx +185 -0
  85. package/templates/storefront/src/modules/account/components/register/index.tsx +1 -0
  86. package/templates/storefront/src/modules/account/components/return-item-selector/index.tsx +187 -0
  87. package/templates/storefront/src/modules/account/components/return-shipping-selector/index.tsx +118 -0
  88. package/templates/storefront/src/modules/account/components/transfer-request-form/index.tsx +81 -0
  89. package/templates/storefront/src/modules/account/templates/account-layout.tsx +38 -0
  90. package/templates/storefront/src/modules/account/templates/exchange-request-template.tsx +389 -0
  91. package/templates/storefront/src/modules/account/templates/guest-orders-template.tsx +123 -0
  92. package/templates/storefront/src/modules/account/templates/login-template.tsx +44 -0
  93. package/templates/storefront/src/modules/account/templates/payment-methods-template.tsx +478 -0
  94. package/templates/storefront/src/modules/account/templates/return-request-template.tsx +300 -0
  95. package/templates/storefront/src/modules/cart/components/abandoned-carts/ScrollToPendingOrdersButton.tsx +21 -0
  96. package/templates/storefront/src/modules/cart/components/abandoned-carts/index.tsx +335 -0
  97. package/templates/storefront/src/modules/cart/components/applied-promotions/index.tsx +121 -0
  98. package/templates/storefront/src/modules/cart/components/cart-delivery-selection/index.tsx +203 -0
  99. package/templates/storefront/src/modules/cart/components/cart-item-card/index.tsx +476 -0
  100. package/templates/storefront/src/modules/cart/components/cart-item-select/index.tsx +73 -0
  101. package/templates/storefront/src/modules/cart/components/cart-view-tracker/index.tsx +44 -0
  102. package/templates/storefront/src/modules/cart/components/delivery-information/index.tsx +89 -0
  103. package/templates/storefront/src/modules/cart/components/empty-cart-message/index.tsx +38 -0
  104. package/templates/storefront/src/modules/cart/components/item/index.tsx +150 -0
  105. package/templates/storefront/src/modules/cart/components/pincode-checker/index.tsx +174 -0
  106. package/templates/storefront/src/modules/cart/components/sign-in-prompt/index.tsx +26 -0
  107. package/templates/storefront/src/modules/cart/components/you-may-also-like/index.tsx +137 -0
  108. package/templates/storefront/src/modules/cart/templates/index.tsx +88 -0
  109. package/templates/storefront/src/modules/cart/templates/items.tsx +49 -0
  110. package/templates/storefront/src/modules/cart/templates/preview.tsx +51 -0
  111. package/templates/storefront/src/modules/cart/templates/summary.tsx +29 -0
  112. package/templates/storefront/src/modules/checkout/components/add-address-modal/index.tsx +390 -0
  113. package/templates/storefront/src/modules/checkout/components/address-card/index.tsx +135 -0
  114. package/templates/storefront/src/modules/checkout/components/address-select/index.tsx +116 -0
  115. package/templates/storefront/src/modules/checkout/components/addresses/index.tsx +605 -0
  116. package/templates/storefront/src/modules/checkout/components/back-link/index.tsx +32 -0
  117. package/templates/storefront/src/modules/checkout/components/billing_address/index.tsx +301 -0
  118. package/templates/storefront/src/modules/checkout/components/checkout-begin-tracker/index.tsx +45 -0
  119. package/templates/storefront/src/modules/checkout/components/checkout-leave-guard/index.tsx +109 -0
  120. package/templates/storefront/src/modules/checkout/components/checkout-shipping-tracker/index.tsx +45 -0
  121. package/templates/storefront/src/modules/checkout/components/country-select/index.tsx +50 -0
  122. package/templates/storefront/src/modules/checkout/components/discount-code/index.tsx +220 -0
  123. package/templates/storefront/src/modules/checkout/components/error-message/index.tsx +13 -0
  124. package/templates/storefront/src/modules/checkout/components/payment/index.tsx +572 -0
  125. package/templates/storefront/src/modules/checkout/components/payment-button/index.tsx +257 -0
  126. package/templates/storefront/src/modules/checkout/components/payment-button/razorpay-payment-button.tsx +136 -0
  127. package/templates/storefront/src/modules/checkout/components/payment-container/index.tsx +129 -0
  128. package/templates/storefront/src/modules/checkout/components/payment-test/index.tsx +12 -0
  129. package/templates/storefront/src/modules/checkout/components/payment-wrapper/index.tsx +50 -0
  130. package/templates/storefront/src/modules/checkout/components/payment-wrapper/stripe-wrapper.tsx +54 -0
  131. package/templates/storefront/src/modules/checkout/components/processing-overlay/index.tsx +83 -0
  132. package/templates/storefront/src/modules/checkout/components/review/index.tsx +60 -0
  133. package/templates/storefront/src/modules/checkout/components/select-address-modal/index.tsx +103 -0
  134. package/templates/storefront/src/modules/checkout/components/shipping/index.tsx +533 -0
  135. package/templates/storefront/src/modules/checkout/components/shipping-address/index.tsx +521 -0
  136. package/templates/storefront/src/modules/checkout/components/submit-button/index.tsx +32 -0
  137. package/templates/storefront/src/modules/checkout/templates/checkout-form/index.tsx +38 -0
  138. package/templates/storefront/src/modules/checkout/templates/checkout-summary/index.tsx +274 -0
  139. package/templates/storefront/src/modules/common/components/breadcrumb/index.tsx +43 -0
  140. package/templates/storefront/src/modules/common/components/cart-totals/index.tsx +473 -0
  141. package/templates/storefront/src/modules/common/components/checkbox/index.tsx +98 -0
  142. package/templates/storefront/src/modules/common/components/delete-button/index.tsx +156 -0
  143. package/templates/storefront/src/modules/common/components/divider/index.tsx +9 -0
  144. package/templates/storefront/src/modules/common/components/filter-checkbox-group/index.tsx +134 -0
  145. package/templates/storefront/src/modules/common/components/filter-radio-group/index.tsx +62 -0
  146. package/templates/storefront/src/modules/common/components/input/index.tsx +79 -0
  147. package/templates/storefront/src/modules/common/components/interactive-link/index.tsx +33 -0
  148. package/templates/storefront/src/modules/common/components/line-item-options/index.tsx +26 -0
  149. package/templates/storefront/src/modules/common/components/line-item-price/index.tsx +64 -0
  150. package/templates/storefront/src/modules/common/components/line-item-unit-price/index.tsx +61 -0
  151. package/templates/storefront/src/modules/common/components/localized-client-link/index.tsx +32 -0
  152. package/templates/storefront/src/modules/common/components/login-popup/index.tsx +78 -0
  153. package/templates/storefront/src/modules/common/components/modal/index.tsx +123 -0
  154. package/templates/storefront/src/modules/common/components/native-select/index.tsx +75 -0
  155. package/templates/storefront/src/modules/common/components/obfuscated-email/index.tsx +30 -0
  156. package/templates/storefront/src/modules/common/components/product/product-rating/index.tsx +172 -0
  157. package/templates/storefront/src/modules/common/components/product/review-modal/index.tsx +333 -0
  158. package/templates/storefront/src/modules/common/components/product/share-button/index.tsx +227 -0
  159. package/templates/storefront/src/modules/common/components/product/wishlist-icon/index.tsx +46 -0
  160. package/templates/storefront/src/modules/common/components/radio/index.tsx +27 -0
  161. package/templates/storefront/src/modules/common/components/select/index.tsx +164 -0
  162. package/templates/storefront/src/modules/common/components/side-panel/index.tsx +65 -0
  163. package/templates/storefront/src/modules/common/icons/arrow-left.tsx +36 -0
  164. package/templates/storefront/src/modules/common/icons/back.tsx +37 -0
  165. package/templates/storefront/src/modules/common/icons/bancontact.tsx +26 -0
  166. package/templates/storefront/src/modules/common/icons/chevron-down.tsx +30 -0
  167. package/templates/storefront/src/modules/common/icons/delivered.tsx +29 -0
  168. package/templates/storefront/src/modules/common/icons/envelope.tsx +27 -0
  169. package/templates/storefront/src/modules/common/icons/eye-off.tsx +37 -0
  170. package/templates/storefront/src/modules/common/icons/eye.tsx +37 -0
  171. package/templates/storefront/src/modules/common/icons/fast-delivery.tsx +65 -0
  172. package/templates/storefront/src/modules/common/icons/ideal.tsx +26 -0
  173. package/templates/storefront/src/modules/common/icons/lock.tsx +31 -0
  174. package/templates/storefront/src/modules/common/icons/map-pin.tsx +37 -0
  175. package/templates/storefront/src/modules/common/icons/medusa.tsx +27 -0
  176. package/templates/storefront/src/modules/common/icons/menu.tsx +45 -0
  177. package/templates/storefront/src/modules/common/icons/nextjs.tsx +27 -0
  178. package/templates/storefront/src/modules/common/icons/package.tsx +44 -0
  179. package/templates/storefront/src/modules/common/icons/paypal.tsx +30 -0
  180. package/templates/storefront/src/modules/common/icons/phone.tsx +30 -0
  181. package/templates/storefront/src/modules/common/icons/placeholder-image.tsx +44 -0
  182. package/templates/storefront/src/modules/common/icons/refresh.tsx +51 -0
  183. package/templates/storefront/src/modules/common/icons/spinner.tsx +37 -0
  184. package/templates/storefront/src/modules/common/icons/trash.tsx +51 -0
  185. package/templates/storefront/src/modules/common/icons/user.tsx +37 -0
  186. package/templates/storefront/src/modules/common/icons/x.tsx +37 -0
  187. package/templates/storefront/src/modules/contact/templates/index.tsx +272 -0
  188. package/templates/storefront/src/modules/help/templates/index.tsx +629 -0
  189. package/templates/storefront/src/modules/home/components/dynamic-banner/index.tsx +190 -0
  190. package/templates/storefront/src/modules/home/components/featured-products/index.tsx +16 -0
  191. package/templates/storefront/src/modules/home/components/featured-products/product-rail/index.tsx +51 -0
  192. package/templates/storefront/src/modules/home/components/features/index.tsx +1 -0
  193. package/templates/storefront/src/modules/home/components/hero/index.tsx +1 -0
  194. package/templates/storefront/src/modules/home/components/loved-by-moms/index.tsx +1 -0
  195. package/templates/storefront/src/modules/home/components/new-arrivals/index.tsx +1 -0
  196. package/templates/storefront/src/modules/home/components/shop-by-age/index.tsx +1 -0
  197. package/templates/storefront/src/modules/home/components/shop-by-category/index.tsx +1 -0
  198. package/templates/storefront/src/modules/home/components/testimonials/index.tsx +1 -0
  199. package/templates/storefront/src/modules/home/components/why-choose-us/dynamic-features.tsx +93 -0
  200. package/templates/storefront/src/modules/home/components/why-choose-us/index.tsx +1 -0
  201. package/templates/storefront/src/modules/layout/components/account-dropdown/index.tsx +56 -0
  202. package/templates/storefront/src/modules/layout/components/cart-button/index.tsx +8 -0
  203. package/templates/storefront/src/modules/layout/components/cart-dropdown/index.tsx +424 -0
  204. package/templates/storefront/src/modules/layout/components/cart-mismatch-banner/index.tsx +57 -0
  205. package/templates/storefront/src/modules/layout/components/cookie-consent/index.tsx +116 -0
  206. package/templates/storefront/src/modules/layout/components/country-select/index.tsx +135 -0
  207. package/templates/storefront/src/modules/layout/components/desktop-search/index.tsx +148 -0
  208. package/templates/storefront/src/modules/layout/components/dynamic-logo/index.tsx +27 -0
  209. package/templates/storefront/src/modules/layout/components/footer-categories/index.tsx +34 -0
  210. package/templates/storefront/src/modules/layout/components/footer-contact/index.tsx +87 -0
  211. package/templates/storefront/src/modules/layout/components/footer-description/index.tsx +12 -0
  212. package/templates/storefront/src/modules/layout/components/footer-logo/index.tsx +22 -0
  213. package/templates/storefront/src/modules/layout/components/footer-newsletter/index.tsx +100 -0
  214. package/templates/storefront/src/modules/layout/components/language-select/index.tsx +192 -0
  215. package/templates/storefront/src/modules/layout/components/medusa-cta/index.tsx +21 -0
  216. package/templates/storefront/src/modules/layout/components/mobile-menu/index.tsx +296 -0
  217. package/templates/storefront/src/modules/layout/components/nav-links/index.tsx +66 -0
  218. package/templates/storefront/src/modules/layout/components/nav-wrapper/index.tsx +14 -0
  219. package/templates/storefront/src/modules/layout/components/promo-bar/index.tsx +7 -0
  220. package/templates/storefront/src/modules/layout/components/promo-bar/promo-bar-content.tsx +174 -0
  221. package/templates/storefront/src/modules/layout/components/push-notification-manager/index.tsx +191 -0
  222. package/templates/storefront/src/modules/layout/components/search-panel/index.tsx +136 -0
  223. package/templates/storefront/src/modules/layout/components/side-menu/index.tsx +144 -0
  224. package/templates/storefront/src/modules/layout/components/verification-banner/index.tsx +217 -0
  225. package/templates/storefront/src/modules/layout/components/wishlist-counter/index.tsx +17 -0
  226. package/templates/storefront/src/modules/layout/templates/footer/index.tsx +7 -0
  227. package/templates/storefront/src/modules/layout/templates/nav/index.tsx +14 -0
  228. package/templates/storefront/src/modules/order/components/cancel-order-modal/index.tsx +168 -0
  229. package/templates/storefront/src/modules/order/components/help/index.tsx +25 -0
  230. package/templates/storefront/src/modules/order/components/item/index.tsx +62 -0
  231. package/templates/storefront/src/modules/order/components/items/index.tsx +44 -0
  232. package/templates/storefront/src/modules/order/components/onboarding-cta/index.tsx +28 -0
  233. package/templates/storefront/src/modules/order/components/order-confirmation-back-handler/index.tsx +28 -0
  234. package/templates/storefront/src/modules/order/components/order-details/index.tsx +63 -0
  235. package/templates/storefront/src/modules/order/components/order-purchase-tracker/index.tsx +48 -0
  236. package/templates/storefront/src/modules/order/components/order-redesign/index.tsx +887 -0
  237. package/templates/storefront/src/modules/order/components/order-summary/index.tsx +60 -0
  238. package/templates/storefront/src/modules/order/components/payment-details/index.tsx +63 -0
  239. package/templates/storefront/src/modules/order/components/shipping-details/index.tsx +73 -0
  240. package/templates/storefront/src/modules/order/components/transfer-actions/index.tsx +81 -0
  241. package/templates/storefront/src/modules/order/components/transfer-image/index.tsx +275 -0
  242. package/templates/storefront/src/modules/order/templates/order-completed-template.tsx +233 -0
  243. package/templates/storefront/src/modules/order/templates/order-details-template.tsx +128 -0
  244. package/templates/storefront/src/modules/products/components/image-gallery/index.tsx +297 -0
  245. package/templates/storefront/src/modules/products/components/product-actions/index.tsx +1400 -0
  246. package/templates/storefront/src/modules/products/components/product-actions/mobile-actions.tsx +217 -0
  247. package/templates/storefront/src/modules/products/components/product-actions/option-select.tsx +62 -0
  248. package/templates/storefront/src/modules/products/components/product-onboarding-cta/index.tsx +30 -0
  249. package/templates/storefront/src/modules/products/components/product-preview/index.tsx +5 -0
  250. package/templates/storefront/src/modules/products/components/product-preview/price.tsx +29 -0
  251. package/templates/storefront/src/modules/products/components/product-price/index.tsx +58 -0
  252. package/templates/storefront/src/modules/products/components/product-rating/index.tsx +1 -0
  253. package/templates/storefront/src/modules/products/components/product-tabs/accordion.tsx +100 -0
  254. package/templates/storefront/src/modules/products/components/product-tabs/index.tsx +127 -0
  255. package/templates/storefront/src/modules/products/components/product-tabs/ratings-tab.tsx +598 -0
  256. package/templates/storefront/src/modules/products/components/product-view-tracker/index.tsx +53 -0
  257. package/templates/storefront/src/modules/products/components/related-products/index.tsx +152 -0
  258. package/templates/storefront/src/modules/products/components/review-modal/index.tsx +1 -0
  259. package/templates/storefront/src/modules/products/components/share-button/index.tsx +1 -0
  260. package/templates/storefront/src/modules/products/components/thumbnail/index.tsx +91 -0
  261. package/templates/storefront/src/modules/products/components/wishlist-icon/index.tsx +1 -0
  262. package/templates/storefront/src/modules/products/context/product-context.tsx +52 -0
  263. package/templates/storefront/src/modules/products/templates/index.tsx +26 -0
  264. package/templates/storefront/src/modules/products/templates/product-actions-wrapper/index.tsx +1 -0
  265. package/templates/storefront/src/modules/products/templates/product-info/index.tsx +2 -0
  266. package/templates/storefront/src/modules/shipping/components/free-shipping-price-nudge/index.tsx +283 -0
  267. package/templates/storefront/src/modules/skeletons/components/skeleton-button/index.tsx +5 -0
  268. package/templates/storefront/src/modules/skeletons/components/skeleton-card-details/index.tsx +10 -0
  269. package/templates/storefront/src/modules/skeletons/components/skeleton-cart-item/index.tsx +35 -0
  270. package/templates/storefront/src/modules/skeletons/components/skeleton-cart-totals/index.tsx +30 -0
  271. package/templates/storefront/src/modules/skeletons/components/skeleton-code-form/index.tsx +13 -0
  272. package/templates/storefront/src/modules/skeletons/components/skeleton-line-item/index.tsx +35 -0
  273. package/templates/storefront/src/modules/skeletons/components/skeleton-order-confirmed-header/index.tsx +14 -0
  274. package/templates/storefront/src/modules/skeletons/components/skeleton-order-information/index.tsx +36 -0
  275. package/templates/storefront/src/modules/skeletons/components/skeleton-order-items/index.tsx +43 -0
  276. package/templates/storefront/src/modules/skeletons/components/skeleton-order-summary/index.tsx +15 -0
  277. package/templates/storefront/src/modules/skeletons/components/skeleton-product-preview/index.tsx +15 -0
  278. package/templates/storefront/src/modules/skeletons/templates/skeleton-cart-page/index.tsx +65 -0
  279. package/templates/storefront/src/modules/skeletons/templates/skeleton-order-confirmed/index.tsx +21 -0
  280. package/templates/storefront/src/modules/skeletons/templates/skeleton-product-grid/index.tsx +23 -0
  281. package/templates/storefront/src/modules/skeletons/templates/skeleton-related-products/index.tsx +25 -0
  282. package/templates/storefront/src/modules/store/components/client-paginated-products.tsx +108 -0
  283. package/templates/storefront/src/modules/store/components/mobile-filters/index.tsx +135 -0
  284. package/templates/storefront/src/modules/store/components/pagination/index.tsx +118 -0
  285. package/templates/storefront/src/modules/store/components/product-list-view-tracker/index.tsx +43 -0
  286. package/templates/storefront/src/modules/store/components/refinement-list/index.tsx +299 -0
  287. package/templates/storefront/src/modules/store/components/refinement-list/sort-products/index.tsx +120 -0
  288. package/templates/storefront/src/modules/store/components/store-header/index.tsx +67 -0
  289. package/templates/storefront/src/modules/store/templates/index.tsx +1 -0
  290. package/templates/storefront/src/modules/store/templates/paginated-products.tsx +175 -0
  291. package/templates/storefront/src/modules/wishlist/components/wishlist-item/index.tsx +797 -0
  292. package/templates/storefront/src/modules/wishlist/templates/index.tsx +176 -0
  293. package/templates/storefront/src/storefront.config.ts +12 -0
  294. package/templates/storefront/src/styles/globals.css +326 -0
  295. package/templates/storefront/src/theme/valero/blocks/home/Features/index.tsx +61 -0
  296. package/templates/storefront/src/theme/valero/blocks/home/Hero/index.tsx +102 -0
  297. package/templates/storefront/src/theme/valero/blocks/home/LovedByMoms/index.tsx +407 -0
  298. package/templates/storefront/src/theme/valero/blocks/home/NewArrivals/index.tsx +48 -0
  299. package/templates/storefront/src/theme/valero/blocks/home/ShopByAge/index.tsx +128 -0
  300. package/templates/storefront/src/theme/valero/blocks/home/ShopByCategory/index.tsx +409 -0
  301. package/templates/storefront/src/theme/valero/blocks/home/Testimonials/index.tsx +697 -0
  302. package/templates/storefront/src/theme/valero/blocks/home/WhyChooseUs/index.tsx +62 -0
  303. package/templates/storefront/src/theme/valero/layouts/MainLayoutShell.tsx +14 -0
  304. package/templates/storefront/src/theme/valero/primitives/Button.tsx +28 -0
  305. package/templates/storefront/src/theme/valero/primitives/Card.tsx +32 -0
  306. package/templates/storefront/src/theme/valero/primitives/index.ts +2 -0
  307. package/templates/storefront/src/theme/valero/slots/account/ForgotPassword/index.tsx +1 -0
  308. package/templates/storefront/src/theme/valero/slots/account/Login/index.tsx +1 -0
  309. package/templates/storefront/src/theme/valero/slots/account/LoginTemplate/index.tsx +44 -0
  310. package/templates/storefront/src/theme/valero/slots/account/Register/index.tsx +1 -0
  311. package/templates/storefront/src/theme/valero/slots/cart/CartItem/index.tsx +11 -0
  312. package/templates/storefront/src/theme/valero/slots/cart/CartSummary/index.tsx +13 -0
  313. package/templates/storefront/src/theme/valero/slots/checkout/CheckoutForm/index.tsx +1 -0
  314. package/templates/storefront/src/theme/valero/slots/checkout/CheckoutSummary/index.tsx +1 -0
  315. package/templates/storefront/src/theme/valero/slots/layout/Footer/index.tsx +104 -0
  316. package/templates/storefront/src/theme/valero/slots/layout/Nav/index.tsx +97 -0
  317. package/templates/storefront/src/theme/valero/slots/layout/PromoBar/index.tsx +19 -0
  318. package/templates/storefront/src/theme/valero/slots/layout/PromoBar/promo-bar-content.tsx +174 -0
  319. package/templates/storefront/src/theme/valero/slots/order/OrderDetails/index.tsx +12 -0
  320. package/templates/storefront/src/theme/valero/slots/product/ProductActions/ProductCTASection.tsx +191 -0
  321. package/templates/storefront/src/theme/valero/slots/product/ProductActions/ProductDetailsSection.tsx +137 -0
  322. package/templates/storefront/src/theme/valero/slots/product/ProductActions/ProductFeaturePanel.tsx +245 -0
  323. package/templates/storefront/src/theme/valero/slots/product/ProductActions/ProductHighlightsSection.tsx +98 -0
  324. package/templates/storefront/src/theme/valero/slots/product/ProductActions/ProductOptionsSection.tsx +233 -0
  325. package/templates/storefront/src/theme/valero/slots/product/ProductActions/ProductPriceSection.tsx +53 -0
  326. package/templates/storefront/src/theme/valero/slots/product/ProductActions/ProductTrustSection.tsx +84 -0
  327. package/templates/storefront/src/theme/valero/slots/product/ProductActions/index.tsx +161 -0
  328. package/templates/storefront/src/theme/valero/slots/product/ProductCard/index.tsx +132 -0
  329. package/templates/storefront/src/theme/valero/slots/product/ProductInfo/index.tsx +40 -0
  330. package/templates/storefront/src/theme/valero/templates/StorePage/index.tsx +154 -0
  331. package/templates/storefront/src/theme/valero/tokens/colors.js +16 -0
  332. package/templates/storefront/src/theme/valero/tokens/colors.ts +21 -0
  333. package/templates/storefront/src/theme/valero/tokens/fonts.ts +13 -0
  334. package/templates/storefront/src/theme/valero/tokens/index.ts +3 -0
  335. package/templates/storefront/src/theme/valero/tokens/spacing.ts +9 -0
  336. package/templates/storefront/src/theme/valero/tokens/theme.css +91 -0
  337. package/templates/storefront/tailwind.config.js +221 -0
  338. package/templates/storefront/tsconfig.json +30 -0
@@ -0,0 +1,63 @@
1
+ import { NextRequest, NextResponse } from "next/server"
2
+
3
+ export async function POST(req: NextRequest) {
4
+ try {
5
+ const body = await req.json()
6
+ const pixelId = process.env.META_PIXEL_ID || process.env.FB_PIXEL_ID
7
+ const accessToken = process.env.META_ACCESS_TOKEN || process.env.FB_ACCESS_TOKEN
8
+
9
+ if (!pixelId || !accessToken) {
10
+ return NextResponse.json({ success: false, error: "Configuration missing" }, { status: 500 })
11
+ }
12
+
13
+ const {
14
+ event_name = body.event || "Lead",
15
+ action_source = "website",
16
+ event_source_url,
17
+ event_id, // For Deduplication
18
+ custom_data = {},
19
+ user_data = {},
20
+ } = body
21
+
22
+ // Prepare payload for Meta CAPI
23
+ const payload = {
24
+ data: [
25
+ {
26
+ event_name,
27
+ event_time: Math.floor(Date.now() / 1000),
28
+ action_source,
29
+ event_id, // Included for Deduplication
30
+ event_source_url: event_source_url || req.headers.get("referer") || "",
31
+ user_data: {
32
+ // @ts-ignore
33
+ client_ip_address: req.ip || req.headers.get("x-forwarded-for")?.split(",")[0] || "",
34
+ client_user_agent: req.headers.get("user-agent") || "",
35
+ ...user_data,
36
+ },
37
+ custom_data,
38
+ },
39
+ ],
40
+ }
41
+
42
+ const response = await fetch(
43
+ `https://graph.facebook.com/v21.0/${pixelId}/events?access_token=${accessToken}`,
44
+ {
45
+ method: "POST",
46
+ headers: {
47
+ "Content-Type": "application/json",
48
+ },
49
+ body: JSON.stringify(payload),
50
+ }
51
+ )
52
+
53
+ const result = await response.json()
54
+
55
+ if (response.ok) {
56
+ return NextResponse.json({ success: true, data: result })
57
+ } else {
58
+ return NextResponse.json({ success: false, error: result }, { status: response.status })
59
+ }
60
+ } catch (error: any) {
61
+ return NextResponse.json({ success: false, error: error.message }, { status: 500 })
62
+ }
63
+ }
@@ -0,0 +1,126 @@
1
+ "use client"
2
+
3
+ import { useEffect, useRef, useState, Suspense } from "react"
4
+ import { useSearchParams, useRouter } from "next/navigation"
5
+ import { handleGoogleCallback, handleGoogleAuthCallback } from "@core/data/customer"
6
+
7
+ const decodeToken = (token: string) => {
8
+ try {
9
+ const payload = token.split('.')[1]
10
+ const decoded = atob(payload.replace(/-/g, '+').replace(/_/g, '/'))
11
+ return JSON.parse(decoded)
12
+ } catch {
13
+ return null
14
+ }
15
+ }
16
+
17
+ function GoogleCallbackContent() {
18
+ const searchParams = useSearchParams()
19
+ const router = useRouter()
20
+ const [loading, setLoading] = useState(true)
21
+ const [error, setError] = useState<string>()
22
+ const handledRef = useRef(false)
23
+
24
+ useEffect(() => {
25
+ if (handledRef.current) {
26
+ return
27
+ }
28
+ handledRef.current = true
29
+
30
+ const handleCallback = async () => {
31
+ try {
32
+ const params: Record<string, string> = {}
33
+ searchParams.forEach((value, key) => (params[key] = value))
34
+
35
+ if (!params.code || !params.state) {
36
+ throw new Error("Missing authentication parameters.")
37
+ }
38
+
39
+ // Use server-side action instead of direct backend call
40
+ const authResult = await handleGoogleAuthCallback(params)
41
+
42
+ if (authResult.error) {
43
+ throw new Error(authResult.error)
44
+ }
45
+
46
+ const token = authResult.token
47
+ if (!token || typeof token !== "string") throw new Error("No token received.")
48
+
49
+ const decoded = decodeToken(token)
50
+ const name = decoded?.user_metadata?.name as string | undefined
51
+ const nameParts = name?.split(" ") || []
52
+
53
+ // Check if actor_id exists in token
54
+ const hasActorId = decoded && decoded.actor_id
55
+
56
+ const callbackResult = await handleGoogleCallback(
57
+ token,
58
+ decoded?.user_metadata?.email || decoded?.email,
59
+ nameParts[0] || undefined,
60
+ nameParts.slice(1).join(" ") || undefined
61
+ )
62
+
63
+ if (callbackResult.error) throw new Error(callbackResult.error)
64
+
65
+ // Get saved country code from localStorage, fallback to pathname or 'us'
66
+ const savedCountryCode = localStorage.getItem("googleLoginCountryCode")
67
+ const countryCode = savedCountryCode || window.location.pathname.split('/')[1] || 'us'
68
+ if (savedCountryCode) {
69
+ localStorage.removeItem("googleLoginCountryCode")
70
+ }
71
+
72
+ // Check if it's a "keep-me-here" context (Wishlist or Review Popups)
73
+ const redirectUrl = localStorage.getItem("loginRedirectUrl")
74
+ const hasKeepContext = redirectUrl?.includes("login_context=keep")
75
+
76
+ if (redirectUrl && hasKeepContext) {
77
+ localStorage.removeItem("loginRedirectUrl")
78
+ window.location.href = redirectUrl
79
+ } else {
80
+ // DEFAULT: Always Home Page
81
+ window.location.href = `/${countryCode}`
82
+ if (redirectUrl) {
83
+ localStorage.removeItem("loginRedirectUrl")
84
+ }
85
+ }
86
+ } catch (err) {
87
+ setError(err instanceof Error ? err.message : "Authentication failed.")
88
+ setLoading(false)
89
+ }
90
+ }
91
+
92
+ handleCallback()
93
+ }, [searchParams, router])
94
+
95
+ if (error) {
96
+ return (
97
+ <div className="min-h-screen flex items-center justify-center">
98
+ <div className="text-center">
99
+ <p className="text-red-500 mb-4">{error}</p>
100
+ <button onClick={() => router.push("/account")} className="px-4 py-2 account-btn-primary rounded-lg">
101
+ Go to Login
102
+ </button>
103
+ </div>
104
+ </div>
105
+ )
106
+ }
107
+
108
+ return (
109
+ <div className="min-h-screen flex items-center justify-center">
110
+ <p>Processing Google authentication...</p>
111
+ </div>
112
+ )
113
+ }
114
+
115
+ export default function GoogleCallbackPage() {
116
+ return (
117
+ <Suspense fallback={
118
+ <div className="min-h-screen flex items-center justify-center">
119
+ <p>Loading...</p>
120
+ </div>
121
+ }>
122
+ <GoogleCallbackContent />
123
+ </Suspense>
124
+ )
125
+ }
126
+
@@ -0,0 +1,104 @@
1
+ import { getBaseURL } from "@core/util/env"
2
+ import { Metadata } from "next"
3
+ import Script from "next/script"
4
+ import "@theme/tokens/theme.css"
5
+ import "styles/globals.css"
6
+ import CookieConsent from "@modules/layout/components/cookie-consent"
7
+
8
+ export const metadata: Metadata = {
9
+ metadataBase: new URL(getBaseURL()),
10
+ title: {
11
+ template: "%s | Chocomelon",
12
+ default: "Chocomelon | Premium Kids Wear & Fashion Shop",
13
+ },
14
+ description: "Experience the magic of childhood with Chocomelon. Premium quality kids wear, playful styles for your little ones, and curated fashion for children of all ages/years. Shop the best kids' clothes today.",
15
+ openGraph: {
16
+ title: "Chocomelon | Premium Kids Wear Shop",
17
+ description: "Discover the best in kids wear. Quality materials, little styles, and playful designs for children of all years and ages.",
18
+ url: "https://chocomelon.in",
19
+ siteName: "Chocomelon",
20
+ images: [
21
+ {
22
+ url: "/appbanner.png",
23
+ width: 1200,
24
+ height: 630,
25
+ alt: "Chocomelon - Premium Kids Wear",
26
+ },
27
+ ],
28
+ locale: "en_US",
29
+ type: "website",
30
+ },
31
+ twitter: {
32
+ card: "summary_large_image",
33
+ title: "Chocomelon | Premium Kids Wear & Shop",
34
+ description: "Premium kids wear for all years and ages. Shop our curated collection for your little ones today.",
35
+ images: ["/appbanner.png"],
36
+ },
37
+ icons: {
38
+ icon: "/favicon.png",
39
+ apple: "/favicon.png",
40
+ },
41
+ alternates: {
42
+ canonical: "https://chocomelon.in",
43
+ },
44
+ }
45
+
46
+ export default function RootLayout(props: { children: React.ReactNode }) {
47
+ return (
48
+ <html lang="en" data-mode="light" suppressHydrationWarning>
49
+ <head>
50
+ <Script
51
+ id="gtm-consent-default"
52
+ strategy="beforeInteractive"
53
+ dangerouslySetInnerHTML={{
54
+ __html: `
55
+ window.dataLayer = window.dataLayer || [];
56
+ function gtag(){dataLayer.push(arguments);}
57
+ if(!localStorage.getItem('cookie_consent')){
58
+ gtag('consent', 'default', {
59
+ 'ad_storage': 'denied',
60
+ 'analytics_storage': 'denied',
61
+ 'ad_user_data': 'denied',
62
+ 'ad_personalization': 'denied'
63
+ });
64
+ } else {
65
+ const consent = localStorage.getItem('cookie_consent');
66
+ gtag('consent', 'default', {
67
+ 'ad_storage': consent === 'granted' ? 'granted' : 'denied',
68
+ 'analytics_storage': consent === 'granted' ? 'granted' : 'denied',
69
+ 'ad_user_data': consent === 'granted' ? 'granted' : 'denied',
70
+ 'ad_personalization': consent === 'granted' ? 'granted' : 'denied'
71
+ });
72
+ }
73
+ `,
74
+ }}
75
+ />
76
+ <Script
77
+ id="gtm-script"
78
+ strategy="afterInteractive"
79
+ dangerouslySetInnerHTML={{
80
+ __html: `
81
+ (function(w,d,s,l,i){w[l]=w[l]||[];w[l].push({'gtm.start':
82
+ new Date().getTime(),event:'gtm.js'});var f=d.getElementsByTagName(s)[0],
83
+ j=d.createElement(s),dl=l!='dataLayer'?'&l='+l:'';j.async=true;j.src=
84
+ 'https://www.googletagmanager.com/gtm.js?id='+i+dl;f.parentNode.insertBefore(j,f);
85
+ })(window,document,'script','dataLayer','GTM-MDPRFG8W');
86
+ `,
87
+ }}
88
+ />
89
+ </head>
90
+ <body className="bg-page-bg font-sans antialiased">
91
+ <noscript>
92
+ <iframe
93
+ src="https://www.googletagmanager.com/ns.html?id=GTM-MDPRFG8W"
94
+ height="0"
95
+ width="0"
96
+ style={{ display: "none", visibility: "hidden" }}
97
+ ></iframe>
98
+ </noscript>
99
+ <main className="relative">{props.children}</main>
100
+ <CookieConsent />
101
+ </body>
102
+ </html>
103
+ )
104
+ }
@@ -0,0 +1,30 @@
1
+ import { ArrowUpRightMini } from "@medusajs/icons"
2
+ import { Text } from "@medusajs/ui"
3
+ import { Metadata } from "next"
4
+ import Link from "next/link"
5
+
6
+ export const metadata: Metadata = {
7
+ title: "404",
8
+ description: "Something went wrong",
9
+ }
10
+
11
+ export default function NotFound() {
12
+ return (
13
+ <div className="flex flex-col gap-4 items-center justify-center min-h-[calc(100vh-64px)]">
14
+ <h1 className="text-2xl-semi text-ui-fg-base">Page not found</h1>
15
+ <p className="text-small-regular text-ui-fg-base">
16
+ The page you tried to access does not exist.
17
+ </p>
18
+ <Link
19
+ className="flex gap-x-1 items-center group"
20
+ href="/"
21
+ >
22
+ <Text className="text-ui-fg-interactive">Go to frontpage</Text>
23
+ <ArrowUpRightMini
24
+ className="group-hover:rotate-45 ease-in-out duration-150"
25
+ color="var(--fg-interactive)"
26
+ />
27
+ </Link>
28
+ </div>
29
+ )
30
+ }
@@ -0,0 +1,15 @@
1
+ import { MetadataRoute } from 'next'
2
+ import { getBaseURL } from '@core/util/env'
3
+
4
+ export default function robots(): MetadataRoute.Robots {
5
+ const baseUrl = getBaseURL()
6
+
7
+ return {
8
+ rules: {
9
+ userAgent: '*',
10
+ allow: '/',
11
+ disallow: ['/checkout', '/account'],
12
+ },
13
+ sitemap: `${baseUrl}/sitemap.xml`,
14
+ }
15
+ }
@@ -0,0 +1,65 @@
1
+ import { MetadataRoute } from 'next'
2
+ import { listProducts } from '@core/data/products'
3
+ import { listCategories } from '@core/data/categories'
4
+ import { listCollections } from '@core/data/collections'
5
+ import { getBaseURL } from '@core/util/env'
6
+
7
+ export default async function sitemap(): Promise<MetadataRoute.Sitemap> {
8
+ const baseUrl = getBaseURL()
9
+
10
+ // Static routes
11
+ const routes = [
12
+ '',
13
+ '/store',
14
+ '/cart',
15
+ '/account',
16
+ '/help',
17
+ '/contact',
18
+ '/privacy-policy',
19
+ '/terms-of-use',
20
+ ].map((route) => ({
21
+ url: `${baseUrl}${route}`,
22
+ lastModified: new Date(),
23
+ changeFrequency: 'daily' as const,
24
+ priority: route === '' ? 1 : 0.8,
25
+ }))
26
+
27
+ try {
28
+ // Dynamic routes - Categories
29
+ const categories = await listCategories()
30
+ const categoryRoutes = categories.map((c) => ({
31
+ url: `${baseUrl}/categories/${c.handle}`,
32
+ lastModified: new Date(c.updated_at || new Date()),
33
+ changeFrequency: 'weekly' as const,
34
+ priority: 0.7,
35
+ }))
36
+
37
+ // Dynamic routes - Collections
38
+ const { collections } = await listCollections()
39
+ const collectionRoutes = collections.map((c) => ({
40
+ url: `${baseUrl}/collections/${c.handle}`,
41
+ lastModified: new Date(c.updated_at || new Date()),
42
+ changeFrequency: 'weekly' as const,
43
+ priority: 0.7,
44
+ }))
45
+
46
+ // Dynamic routes - Products
47
+ // Fetching up to 100 products for sitemap
48
+ const { response: { products } } = await listProducts({
49
+ countryCode: 'in', // Default country code
50
+ queryParams: { limit: 100 }
51
+ })
52
+
53
+ const productRoutes = products.map((p) => ({
54
+ url: `${baseUrl}/products/${p.handle}`,
55
+ lastModified: new Date(p.updated_at || new Date()),
56
+ changeFrequency: 'daily' as const,
57
+ priority: 0.9,
58
+ }))
59
+
60
+ return [...routes, ...categoryRoutes, ...collectionRoutes, ...productRoutes]
61
+ } catch (error) {
62
+ console.error('Error generating sitemap:', error)
63
+ return routes
64
+ }
65
+ }
@@ -0,0 +1,160 @@
1
+ "use client"
2
+
3
+ import React, { useState } from "react"
4
+ import { Button, Heading, Text, Input } from "@medusajs/ui"
5
+ import Modal from "@modules/common/components/modal"
6
+ import Spinner from "@modules/common/icons/spinner"
7
+ import {
8
+ requestAccountDeletion,
9
+ confirmAccountDeletion,
10
+ } from "@core/data/customer-registration"
11
+ import { signout } from "@core/data/customer"
12
+ import { useParams } from "next/navigation"
13
+
14
+ const AccountDeletion = ({ customerEmail, hideHeader = false }: { customerEmail: string, hideHeader?: boolean }) => {
15
+ const [isModalOpen, setIsModalOpen] = useState(false)
16
+ const [step, setStep] = useState<"initial" | "otp" | "success">("initial")
17
+ const [otp, setOtp] = useState("")
18
+ const [token, setToken] = useState("")
19
+ const [isLoading, setIsLoading] = useState(false)
20
+ const [error, setError] = useState<string | null>(null)
21
+ const params = useParams()
22
+
23
+ const handleOpenModal = () => {
24
+ setStep("initial")
25
+ setError(null)
26
+ setOtp("")
27
+ setIsModalOpen(true)
28
+ }
29
+
30
+ const handleRequestDeletion = async () => {
31
+ setIsLoading(true)
32
+ setError(null)
33
+ const result = await requestAccountDeletion(customerEmail)
34
+ if (result.success && result.token) {
35
+ setToken(result.token)
36
+ setStep("otp")
37
+ } else {
38
+ setError(result.error || "Failed to initiate deletion request")
39
+ }
40
+ setIsLoading(false)
41
+ }
42
+
43
+ const handleConfirmDeletion = async () => {
44
+ setIsLoading(true)
45
+ setError(null)
46
+ const result = await confirmAccountDeletion(token, otp)
47
+ if (result.success) {
48
+ setStep("success")
49
+ // Log out user after successful confirmation
50
+ setTimeout(async () => {
51
+ setIsModalOpen(false)
52
+ const countryCode = (params.countryCode as string) || "in"
53
+ await signout(countryCode)
54
+ }, 3000)
55
+ } else {
56
+ setError(result.error || "Invalid OTP")
57
+ }
58
+ setIsLoading(false)
59
+ }
60
+
61
+ return (
62
+ <div className={hideHeader ? "" : "mt-8 border-t border-gray-100 pt-8"}>
63
+ {!hideHeader && (
64
+ <div className="flex flex-col gap-y-2 mb-4">
65
+ <Heading level="h2" className="text-lg font-bold text-heading">Delete account</Heading>
66
+ <Text className="text-gray-500">Once you delete your account, you will lose all your data. This action is not immediate and can be cancelled within a grace period.</Text>
67
+ </div>
68
+ )}
69
+
70
+ {hideHeader ? (
71
+ <button
72
+ type="button"
73
+ onClick={handleOpenModal}
74
+ className="w-full h-11 bg-red-600 text-inverse rounded-[30px] font-bold text-sm shadow-lg shadow-red-200 hover:bg-red-700 transition-all"
75
+ >
76
+ Delete Account
77
+ </button>
78
+ ) : (
79
+ <Button
80
+ variant="danger"
81
+ onClick={handleOpenModal}
82
+ className="w-fit"
83
+ >
84
+ Delete Account
85
+ </Button>
86
+ )}
87
+
88
+ <Modal isOpen={isModalOpen} close={() => setIsModalOpen(false)} size="small">
89
+ <Modal.Body>
90
+ <div className="flex flex-col gap-y-6 py-4 text-center">
91
+ {step === "initial" ? (
92
+ <>
93
+ <Heading level="h2" className="text-xl font-bold">Delete Account?</Heading>
94
+ <Text className="text-gray-500">Are you sure you want to delete your account? A verification code will be sent to your email.</Text>
95
+ {error && <Text className="text-red-500 text-sm">{error}</Text>}
96
+ <div className="flex justify-center gap-x-4 mt-4">
97
+ <Button variant="secondary" onClick={() => setIsModalOpen(false)}>Cancel</Button>
98
+ <Button variant="danger" onClick={handleRequestDeletion} disabled={isLoading}>
99
+ {isLoading ? <Spinner /> : "Yes, Send Code"}
100
+ </Button>
101
+ </div>
102
+ </>
103
+ ) : step === "otp" ? (
104
+ <>
105
+ <Heading level="h2" className="text-xl font-bold">Verify Deletion</Heading>
106
+ <Text className="text-gray-500">Enter the 6-digit code sent to {customerEmail}</Text>
107
+ <div className="relative flex justify-center gap-x-2 mt-6">
108
+ {[0, 1, 2, 3, 4, 5].map((index) => (
109
+ <div
110
+ key={index}
111
+ className={`w-10 h-12 flex items-center justify-center border-2 rounded-lg text-xl font-bold transition-all duration-200 ${otp.length === index
112
+ ? "border-brand-accent ring-2 ring-brand-accent/10 bg-white"
113
+ : otp.length > index
114
+ ? "border-gray-400 bg-white"
115
+ : "border-gray-200 bg-gray-50/50"
116
+ }`}
117
+ >
118
+ {otp[index] || ""}
119
+ </div>
120
+ ))}
121
+ <input
122
+ type="text"
123
+ maxLength={6}
124
+ className="absolute inset-0 opacity-0 cursor-pointer"
125
+ value={otp}
126
+ onChange={(e) => setOtp(e.target.value.replace(/\D/g, "").slice(0, 6))}
127
+ autoFocus
128
+ />
129
+ </div>
130
+ {error && <Text className="text-red-500 text-sm mt-2">{error}</Text>}
131
+ <Button
132
+ variant="danger"
133
+ className="mt-6 w-full"
134
+ onClick={handleConfirmDeletion}
135
+ disabled={isLoading || otp.length !== 6}
136
+ >
137
+ {isLoading ? <Spinner /> : "Confirm Deletion"}
138
+ </Button>
139
+ </>
140
+ ) : (
141
+ <div className="flex flex-col items-center text-center py-8">
142
+ <div className="w-20 h-20 bg-green-50 rounded-full flex items-center justify-center mb-6 shadow-sm border border-green-100 animate-in zoom-in duration-300">
143
+ <svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" fill="none" stroke="#10b981" strokeWidth="3" strokeLinecap="round" strokeLinejoin="round">
144
+ <polyline points="20 6 9 17 4 12"></polyline>
145
+ </svg>
146
+ </div>
147
+ <Heading level="h2" className="text-2xl font-bold text-heading mb-2">Deletion Scheduled</Heading>
148
+ <Text className="text-gray-600 max-w-[280px] mx-auto">
149
+ Your account is scheduled for deletion. You will be logged out shortly.
150
+ </Text>
151
+ </div>
152
+ )}
153
+ </div>
154
+ </Modal.Body>
155
+ </Modal>
156
+ </div>
157
+ )
158
+ }
159
+
160
+ export default AccountDeletion