@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.
- package/bin/create-storefront.js +239 -0
- package/lib/kit-next-config.js +84 -0
- package/package.json +32 -0
- package/templates/storefront/.eslintrc.json +3 -0
- package/templates/storefront/README.md +35 -0
- package/templates/storefront/check-env-variables.js +51 -0
- package/templates/storefront/kit-next-config.js +71 -0
- package/templates/storefront/next-env.d.ts +5 -0
- package/templates/storefront/next.config.js +25 -0
- package/templates/storefront/package.json +56 -0
- package/templates/storefront/postcss.config.js +6 -0
- package/templates/storefront/public/favicon.png +0 -0
- package/templates/storefront/src/app/[countryCode]/(checkout)/checkout/page.tsx +23 -0
- package/templates/storefront/src/app/[countryCode]/(checkout)/checkout/payment/page.tsx +47 -0
- package/templates/storefront/src/app/[countryCode]/(checkout)/layout.tsx +31 -0
- package/templates/storefront/src/app/[countryCode]/(checkout)/not-found.tsx +19 -0
- package/templates/storefront/src/app/[countryCode]/(main)/account/@dashboard/addresses/page.tsx +31 -0
- package/templates/storefront/src/app/[countryCode]/(main)/account/@dashboard/loading.tsx +9 -0
- package/templates/storefront/src/app/[countryCode]/(main)/account/@dashboard/orders/details/[id]/page.tsx +35 -0
- package/templates/storefront/src/app/[countryCode]/(main)/account/@dashboard/orders/exchange/[id]/page.tsx +47 -0
- package/templates/storefront/src/app/[countryCode]/(main)/account/@dashboard/orders/page.tsx +28 -0
- package/templates/storefront/src/app/[countryCode]/(main)/account/@dashboard/orders/return/[id]/page.tsx +66 -0
- package/templates/storefront/src/app/[countryCode]/(main)/account/@dashboard/page.tsx +22 -0
- package/templates/storefront/src/app/[countryCode]/(main)/account/@dashboard/payment-methods/page.tsx +23 -0
- package/templates/storefront/src/app/[countryCode]/(main)/account/@dashboard/profile/page.tsx +43 -0
- package/templates/storefront/src/app/[countryCode]/(main)/account/@login/default.tsx +11 -0
- package/templates/storefront/src/app/[countryCode]/(main)/account/@login/page.tsx +18 -0
- package/templates/storefront/src/app/[countryCode]/(main)/account/guest-orders/page.tsx +13 -0
- package/templates/storefront/src/app/[countryCode]/(main)/account/layout.tsx +22 -0
- package/templates/storefront/src/app/[countryCode]/(main)/account/loading.tsx +9 -0
- package/templates/storefront/src/app/[countryCode]/(main)/cart/loading.tsx +5 -0
- package/templates/storefront/src/app/[countryCode]/(main)/cart/not-found.tsx +21 -0
- package/templates/storefront/src/app/[countryCode]/(main)/cart/page.tsx +23 -0
- package/templates/storefront/src/app/[countryCode]/(main)/categories/[...category]/page.tsx +11 -0
- package/templates/storefront/src/app/[countryCode]/(main)/collections/[handle]/page.tsx +11 -0
- package/templates/storefront/src/app/[countryCode]/(main)/contact/page.tsx +21 -0
- package/templates/storefront/src/app/[countryCode]/(main)/guest-orders/page.tsx +12 -0
- package/templates/storefront/src/app/[countryCode]/(main)/help/page.tsx +28 -0
- package/templates/storefront/src/app/[countryCode]/(main)/layout.tsx +21 -0
- package/templates/storefront/src/app/[countryCode]/(main)/not-found.tsx +20 -0
- package/templates/storefront/src/app/[countryCode]/(main)/order/[id]/confirmed/loading.tsx +5 -0
- package/templates/storefront/src/app/[countryCode]/(main)/order/[id]/confirmed/page.tsx +23 -0
- package/templates/storefront/src/app/[countryCode]/(main)/order/[id]/transfer/[token]/accept/page.tsx +41 -0
- package/templates/storefront/src/app/[countryCode]/(main)/order/[id]/transfer/[token]/decline/page.tsx +41 -0
- package/templates/storefront/src/app/[countryCode]/(main)/order/[id]/transfer/[token]/page.tsx +38 -0
- package/templates/storefront/src/app/[countryCode]/(main)/order/exchange/[id]/page.tsx +47 -0
- package/templates/storefront/src/app/[countryCode]/(main)/order/return/[id]/page.tsx +61 -0
- package/templates/storefront/src/app/[countryCode]/(main)/orders/[id]/page.tsx +33 -0
- package/templates/storefront/src/app/[countryCode]/(main)/page.tsx +24 -0
- package/templates/storefront/src/app/[countryCode]/(main)/privacy-policy/page.tsx +173 -0
- package/templates/storefront/src/app/[countryCode]/(main)/products/[handle]/page.tsx +193 -0
- package/templates/storefront/src/app/[countryCode]/(main)/reset-password/page.tsx +192 -0
- package/templates/storefront/src/app/[countryCode]/(main)/store/page.tsx +72 -0
- package/templates/storefront/src/app/[countryCode]/(main)/terms-of-use/page.tsx +179 -0
- package/templates/storefront/src/app/[countryCode]/(main)/wishlist/page.tsx +19 -0
- package/templates/storefront/src/app/api/meta/event/route.ts +63 -0
- package/templates/storefront/src/app/auth/customer/google/callback/page.tsx +126 -0
- package/templates/storefront/src/app/layout.tsx +104 -0
- package/templates/storefront/src/app/not-found.tsx +30 -0
- package/templates/storefront/src/app/opengraph-image.jpg +0 -0
- package/templates/storefront/src/app/robots.ts +15 -0
- package/templates/storefront/src/app/sitemap.ts +65 -0
- package/templates/storefront/src/app/twitter-image.jpg +0 -0
- package/templates/storefront/src/modules/account/components/account-deletion/index.tsx +160 -0
- package/templates/storefront/src/modules/account/components/account-info/index.tsx +145 -0
- package/templates/storefront/src/modules/account/components/account-nav/icons.tsx +43 -0
- package/templates/storefront/src/modules/account/components/account-nav/index.tsx +318 -0
- package/templates/storefront/src/modules/account/components/account-nav/logout-modal.tsx +92 -0
- package/templates/storefront/src/modules/account/components/account-nav/payment-methods-icon.tsx +9 -0
- package/templates/storefront/src/modules/account/components/address-book/index.tsx +47 -0
- package/templates/storefront/src/modules/account/components/address-card/add-address.tsx +377 -0
- package/templates/storefront/src/modules/account/components/address-card/edit-address-modal.tsx +468 -0
- package/templates/storefront/src/modules/account/components/deletion-pending-modal/index.tsx +213 -0
- package/templates/storefront/src/modules/account/components/forgot-password/index.tsx +1 -0
- package/templates/storefront/src/modules/account/components/login/index.tsx +1 -0
- package/templates/storefront/src/modules/account/components/order-card/index.tsx +221 -0
- package/templates/storefront/src/modules/account/components/order-overview/index.tsx +159 -0
- package/templates/storefront/src/modules/account/components/overview/index.tsx +189 -0
- package/templates/storefront/src/modules/account/components/profile-billing-address/index.tsx +447 -0
- package/templates/storefront/src/modules/account/components/profile-email/index.tsx +75 -0
- package/templates/storefront/src/modules/account/components/profile-form/index.tsx +416 -0
- package/templates/storefront/src/modules/account/components/profile-name/index.tsx +76 -0
- package/templates/storefront/src/modules/account/components/profile-password/index.tsx +70 -0
- package/templates/storefront/src/modules/account/components/profile-phone/index.tsx +185 -0
- package/templates/storefront/src/modules/account/components/register/index.tsx +1 -0
- package/templates/storefront/src/modules/account/components/return-item-selector/index.tsx +187 -0
- package/templates/storefront/src/modules/account/components/return-shipping-selector/index.tsx +118 -0
- package/templates/storefront/src/modules/account/components/transfer-request-form/index.tsx +81 -0
- package/templates/storefront/src/modules/account/templates/account-layout.tsx +38 -0
- package/templates/storefront/src/modules/account/templates/exchange-request-template.tsx +389 -0
- package/templates/storefront/src/modules/account/templates/guest-orders-template.tsx +123 -0
- package/templates/storefront/src/modules/account/templates/login-template.tsx +44 -0
- package/templates/storefront/src/modules/account/templates/payment-methods-template.tsx +478 -0
- package/templates/storefront/src/modules/account/templates/return-request-template.tsx +300 -0
- package/templates/storefront/src/modules/cart/components/abandoned-carts/ScrollToPendingOrdersButton.tsx +21 -0
- package/templates/storefront/src/modules/cart/components/abandoned-carts/index.tsx +335 -0
- package/templates/storefront/src/modules/cart/components/applied-promotions/index.tsx +121 -0
- package/templates/storefront/src/modules/cart/components/cart-delivery-selection/index.tsx +203 -0
- package/templates/storefront/src/modules/cart/components/cart-item-card/index.tsx +476 -0
- package/templates/storefront/src/modules/cart/components/cart-item-select/index.tsx +73 -0
- package/templates/storefront/src/modules/cart/components/cart-view-tracker/index.tsx +44 -0
- package/templates/storefront/src/modules/cart/components/delivery-information/index.tsx +89 -0
- package/templates/storefront/src/modules/cart/components/empty-cart-message/index.tsx +38 -0
- package/templates/storefront/src/modules/cart/components/item/index.tsx +150 -0
- package/templates/storefront/src/modules/cart/components/pincode-checker/index.tsx +174 -0
- package/templates/storefront/src/modules/cart/components/sign-in-prompt/index.tsx +26 -0
- package/templates/storefront/src/modules/cart/components/you-may-also-like/index.tsx +137 -0
- package/templates/storefront/src/modules/cart/templates/index.tsx +88 -0
- package/templates/storefront/src/modules/cart/templates/items.tsx +49 -0
- package/templates/storefront/src/modules/cart/templates/preview.tsx +51 -0
- package/templates/storefront/src/modules/cart/templates/summary.tsx +29 -0
- package/templates/storefront/src/modules/checkout/components/add-address-modal/index.tsx +390 -0
- package/templates/storefront/src/modules/checkout/components/address-card/index.tsx +135 -0
- package/templates/storefront/src/modules/checkout/components/address-select/index.tsx +116 -0
- package/templates/storefront/src/modules/checkout/components/addresses/index.tsx +605 -0
- package/templates/storefront/src/modules/checkout/components/back-link/index.tsx +32 -0
- package/templates/storefront/src/modules/checkout/components/billing_address/index.tsx +301 -0
- package/templates/storefront/src/modules/checkout/components/checkout-begin-tracker/index.tsx +45 -0
- package/templates/storefront/src/modules/checkout/components/checkout-leave-guard/index.tsx +109 -0
- package/templates/storefront/src/modules/checkout/components/checkout-shipping-tracker/index.tsx +45 -0
- package/templates/storefront/src/modules/checkout/components/country-select/index.tsx +50 -0
- package/templates/storefront/src/modules/checkout/components/discount-code/index.tsx +220 -0
- package/templates/storefront/src/modules/checkout/components/error-message/index.tsx +13 -0
- package/templates/storefront/src/modules/checkout/components/payment/index.tsx +572 -0
- package/templates/storefront/src/modules/checkout/components/payment-button/index.tsx +257 -0
- package/templates/storefront/src/modules/checkout/components/payment-button/razorpay-payment-button.tsx +136 -0
- package/templates/storefront/src/modules/checkout/components/payment-container/index.tsx +129 -0
- package/templates/storefront/src/modules/checkout/components/payment-test/index.tsx +12 -0
- package/templates/storefront/src/modules/checkout/components/payment-wrapper/index.tsx +50 -0
- package/templates/storefront/src/modules/checkout/components/payment-wrapper/stripe-wrapper.tsx +54 -0
- package/templates/storefront/src/modules/checkout/components/processing-overlay/index.tsx +83 -0
- package/templates/storefront/src/modules/checkout/components/review/index.tsx +60 -0
- package/templates/storefront/src/modules/checkout/components/select-address-modal/index.tsx +103 -0
- package/templates/storefront/src/modules/checkout/components/shipping/index.tsx +533 -0
- package/templates/storefront/src/modules/checkout/components/shipping-address/index.tsx +521 -0
- package/templates/storefront/src/modules/checkout/components/submit-button/index.tsx +32 -0
- package/templates/storefront/src/modules/checkout/templates/checkout-form/index.tsx +38 -0
- package/templates/storefront/src/modules/checkout/templates/checkout-summary/index.tsx +274 -0
- package/templates/storefront/src/modules/common/components/breadcrumb/index.tsx +43 -0
- package/templates/storefront/src/modules/common/components/cart-totals/index.tsx +473 -0
- package/templates/storefront/src/modules/common/components/checkbox/index.tsx +98 -0
- package/templates/storefront/src/modules/common/components/delete-button/index.tsx +156 -0
- package/templates/storefront/src/modules/common/components/divider/index.tsx +9 -0
- package/templates/storefront/src/modules/common/components/filter-checkbox-group/index.tsx +134 -0
- package/templates/storefront/src/modules/common/components/filter-radio-group/index.tsx +62 -0
- package/templates/storefront/src/modules/common/components/input/index.tsx +79 -0
- package/templates/storefront/src/modules/common/components/interactive-link/index.tsx +33 -0
- package/templates/storefront/src/modules/common/components/line-item-options/index.tsx +26 -0
- package/templates/storefront/src/modules/common/components/line-item-price/index.tsx +64 -0
- package/templates/storefront/src/modules/common/components/line-item-unit-price/index.tsx +61 -0
- package/templates/storefront/src/modules/common/components/localized-client-link/index.tsx +32 -0
- package/templates/storefront/src/modules/common/components/login-popup/index.tsx +78 -0
- package/templates/storefront/src/modules/common/components/modal/index.tsx +123 -0
- package/templates/storefront/src/modules/common/components/native-select/index.tsx +75 -0
- package/templates/storefront/src/modules/common/components/obfuscated-email/index.tsx +30 -0
- package/templates/storefront/src/modules/common/components/product/product-rating/index.tsx +172 -0
- package/templates/storefront/src/modules/common/components/product/review-modal/index.tsx +333 -0
- package/templates/storefront/src/modules/common/components/product/share-button/index.tsx +227 -0
- package/templates/storefront/src/modules/common/components/product/wishlist-icon/index.tsx +46 -0
- package/templates/storefront/src/modules/common/components/radio/index.tsx +27 -0
- package/templates/storefront/src/modules/common/components/select/index.tsx +164 -0
- package/templates/storefront/src/modules/common/components/side-panel/index.tsx +65 -0
- package/templates/storefront/src/modules/common/icons/arrow-left.tsx +36 -0
- package/templates/storefront/src/modules/common/icons/back.tsx +37 -0
- package/templates/storefront/src/modules/common/icons/bancontact.tsx +26 -0
- package/templates/storefront/src/modules/common/icons/chevron-down.tsx +30 -0
- package/templates/storefront/src/modules/common/icons/delivered.tsx +29 -0
- package/templates/storefront/src/modules/common/icons/envelope.tsx +27 -0
- package/templates/storefront/src/modules/common/icons/eye-off.tsx +37 -0
- package/templates/storefront/src/modules/common/icons/eye.tsx +37 -0
- package/templates/storefront/src/modules/common/icons/fast-delivery.tsx +65 -0
- package/templates/storefront/src/modules/common/icons/ideal.tsx +26 -0
- package/templates/storefront/src/modules/common/icons/lock.tsx +31 -0
- package/templates/storefront/src/modules/common/icons/map-pin.tsx +37 -0
- package/templates/storefront/src/modules/common/icons/medusa.tsx +27 -0
- package/templates/storefront/src/modules/common/icons/menu.tsx +45 -0
- package/templates/storefront/src/modules/common/icons/nextjs.tsx +27 -0
- package/templates/storefront/src/modules/common/icons/package.tsx +44 -0
- package/templates/storefront/src/modules/common/icons/paypal.tsx +30 -0
- package/templates/storefront/src/modules/common/icons/phone.tsx +30 -0
- package/templates/storefront/src/modules/common/icons/placeholder-image.tsx +44 -0
- package/templates/storefront/src/modules/common/icons/refresh.tsx +51 -0
- package/templates/storefront/src/modules/common/icons/spinner.tsx +37 -0
- package/templates/storefront/src/modules/common/icons/trash.tsx +51 -0
- package/templates/storefront/src/modules/common/icons/user.tsx +37 -0
- package/templates/storefront/src/modules/common/icons/x.tsx +37 -0
- package/templates/storefront/src/modules/contact/templates/index.tsx +272 -0
- package/templates/storefront/src/modules/help/templates/index.tsx +629 -0
- package/templates/storefront/src/modules/home/components/dynamic-banner/index.tsx +190 -0
- package/templates/storefront/src/modules/home/components/featured-products/index.tsx +16 -0
- package/templates/storefront/src/modules/home/components/featured-products/product-rail/index.tsx +51 -0
- package/templates/storefront/src/modules/home/components/features/index.tsx +1 -0
- package/templates/storefront/src/modules/home/components/hero/index.tsx +1 -0
- package/templates/storefront/src/modules/home/components/loved-by-moms/index.tsx +1 -0
- package/templates/storefront/src/modules/home/components/new-arrivals/index.tsx +1 -0
- package/templates/storefront/src/modules/home/components/shop-by-age/index.tsx +1 -0
- package/templates/storefront/src/modules/home/components/shop-by-category/index.tsx +1 -0
- package/templates/storefront/src/modules/home/components/testimonials/index.tsx +1 -0
- package/templates/storefront/src/modules/home/components/why-choose-us/dynamic-features.tsx +93 -0
- package/templates/storefront/src/modules/home/components/why-choose-us/index.tsx +1 -0
- package/templates/storefront/src/modules/layout/components/account-dropdown/index.tsx +56 -0
- package/templates/storefront/src/modules/layout/components/cart-button/index.tsx +8 -0
- package/templates/storefront/src/modules/layout/components/cart-dropdown/index.tsx +424 -0
- package/templates/storefront/src/modules/layout/components/cart-mismatch-banner/index.tsx +57 -0
- package/templates/storefront/src/modules/layout/components/cookie-consent/index.tsx +116 -0
- package/templates/storefront/src/modules/layout/components/country-select/index.tsx +135 -0
- package/templates/storefront/src/modules/layout/components/desktop-search/index.tsx +148 -0
- package/templates/storefront/src/modules/layout/components/dynamic-logo/index.tsx +27 -0
- package/templates/storefront/src/modules/layout/components/footer-categories/index.tsx +34 -0
- package/templates/storefront/src/modules/layout/components/footer-contact/index.tsx +87 -0
- package/templates/storefront/src/modules/layout/components/footer-description/index.tsx +12 -0
- package/templates/storefront/src/modules/layout/components/footer-logo/index.tsx +22 -0
- package/templates/storefront/src/modules/layout/components/footer-newsletter/index.tsx +100 -0
- package/templates/storefront/src/modules/layout/components/language-select/index.tsx +192 -0
- package/templates/storefront/src/modules/layout/components/medusa-cta/index.tsx +21 -0
- package/templates/storefront/src/modules/layout/components/mobile-menu/index.tsx +296 -0
- package/templates/storefront/src/modules/layout/components/nav-links/index.tsx +66 -0
- package/templates/storefront/src/modules/layout/components/nav-wrapper/index.tsx +14 -0
- package/templates/storefront/src/modules/layout/components/promo-bar/index.tsx +7 -0
- package/templates/storefront/src/modules/layout/components/promo-bar/promo-bar-content.tsx +174 -0
- package/templates/storefront/src/modules/layout/components/push-notification-manager/index.tsx +191 -0
- package/templates/storefront/src/modules/layout/components/search-panel/index.tsx +136 -0
- package/templates/storefront/src/modules/layout/components/side-menu/index.tsx +144 -0
- package/templates/storefront/src/modules/layout/components/verification-banner/index.tsx +217 -0
- package/templates/storefront/src/modules/layout/components/wishlist-counter/index.tsx +17 -0
- package/templates/storefront/src/modules/layout/templates/footer/index.tsx +7 -0
- package/templates/storefront/src/modules/layout/templates/nav/index.tsx +14 -0
- package/templates/storefront/src/modules/order/components/cancel-order-modal/index.tsx +168 -0
- package/templates/storefront/src/modules/order/components/help/index.tsx +25 -0
- package/templates/storefront/src/modules/order/components/item/index.tsx +62 -0
- package/templates/storefront/src/modules/order/components/items/index.tsx +44 -0
- package/templates/storefront/src/modules/order/components/onboarding-cta/index.tsx +28 -0
- package/templates/storefront/src/modules/order/components/order-confirmation-back-handler/index.tsx +28 -0
- package/templates/storefront/src/modules/order/components/order-details/index.tsx +63 -0
- package/templates/storefront/src/modules/order/components/order-purchase-tracker/index.tsx +48 -0
- package/templates/storefront/src/modules/order/components/order-redesign/index.tsx +887 -0
- package/templates/storefront/src/modules/order/components/order-summary/index.tsx +60 -0
- package/templates/storefront/src/modules/order/components/payment-details/index.tsx +63 -0
- package/templates/storefront/src/modules/order/components/shipping-details/index.tsx +73 -0
- package/templates/storefront/src/modules/order/components/transfer-actions/index.tsx +81 -0
- package/templates/storefront/src/modules/order/components/transfer-image/index.tsx +275 -0
- package/templates/storefront/src/modules/order/templates/order-completed-template.tsx +233 -0
- package/templates/storefront/src/modules/order/templates/order-details-template.tsx +128 -0
- package/templates/storefront/src/modules/products/components/image-gallery/index.tsx +297 -0
- package/templates/storefront/src/modules/products/components/product-actions/index.tsx +1400 -0
- package/templates/storefront/src/modules/products/components/product-actions/mobile-actions.tsx +217 -0
- package/templates/storefront/src/modules/products/components/product-actions/option-select.tsx +62 -0
- package/templates/storefront/src/modules/products/components/product-onboarding-cta/index.tsx +30 -0
- package/templates/storefront/src/modules/products/components/product-preview/index.tsx +5 -0
- package/templates/storefront/src/modules/products/components/product-preview/price.tsx +29 -0
- package/templates/storefront/src/modules/products/components/product-price/index.tsx +58 -0
- package/templates/storefront/src/modules/products/components/product-rating/index.tsx +1 -0
- package/templates/storefront/src/modules/products/components/product-tabs/accordion.tsx +100 -0
- package/templates/storefront/src/modules/products/components/product-tabs/index.tsx +127 -0
- package/templates/storefront/src/modules/products/components/product-tabs/ratings-tab.tsx +598 -0
- package/templates/storefront/src/modules/products/components/product-view-tracker/index.tsx +53 -0
- package/templates/storefront/src/modules/products/components/related-products/index.tsx +152 -0
- package/templates/storefront/src/modules/products/components/review-modal/index.tsx +1 -0
- package/templates/storefront/src/modules/products/components/share-button/index.tsx +1 -0
- package/templates/storefront/src/modules/products/components/thumbnail/index.tsx +91 -0
- package/templates/storefront/src/modules/products/components/wishlist-icon/index.tsx +1 -0
- package/templates/storefront/src/modules/products/context/product-context.tsx +52 -0
- package/templates/storefront/src/modules/products/templates/index.tsx +26 -0
- package/templates/storefront/src/modules/products/templates/product-actions-wrapper/index.tsx +1 -0
- package/templates/storefront/src/modules/products/templates/product-info/index.tsx +2 -0
- package/templates/storefront/src/modules/shipping/components/free-shipping-price-nudge/index.tsx +283 -0
- package/templates/storefront/src/modules/skeletons/components/skeleton-button/index.tsx +5 -0
- package/templates/storefront/src/modules/skeletons/components/skeleton-card-details/index.tsx +10 -0
- package/templates/storefront/src/modules/skeletons/components/skeleton-cart-item/index.tsx +35 -0
- package/templates/storefront/src/modules/skeletons/components/skeleton-cart-totals/index.tsx +30 -0
- package/templates/storefront/src/modules/skeletons/components/skeleton-code-form/index.tsx +13 -0
- package/templates/storefront/src/modules/skeletons/components/skeleton-line-item/index.tsx +35 -0
- package/templates/storefront/src/modules/skeletons/components/skeleton-order-confirmed-header/index.tsx +14 -0
- package/templates/storefront/src/modules/skeletons/components/skeleton-order-information/index.tsx +36 -0
- package/templates/storefront/src/modules/skeletons/components/skeleton-order-items/index.tsx +43 -0
- package/templates/storefront/src/modules/skeletons/components/skeleton-order-summary/index.tsx +15 -0
- package/templates/storefront/src/modules/skeletons/components/skeleton-product-preview/index.tsx +15 -0
- package/templates/storefront/src/modules/skeletons/templates/skeleton-cart-page/index.tsx +65 -0
- package/templates/storefront/src/modules/skeletons/templates/skeleton-order-confirmed/index.tsx +21 -0
- package/templates/storefront/src/modules/skeletons/templates/skeleton-product-grid/index.tsx +23 -0
- package/templates/storefront/src/modules/skeletons/templates/skeleton-related-products/index.tsx +25 -0
- package/templates/storefront/src/modules/store/components/client-paginated-products.tsx +108 -0
- package/templates/storefront/src/modules/store/components/mobile-filters/index.tsx +135 -0
- package/templates/storefront/src/modules/store/components/pagination/index.tsx +118 -0
- package/templates/storefront/src/modules/store/components/product-list-view-tracker/index.tsx +43 -0
- package/templates/storefront/src/modules/store/components/refinement-list/index.tsx +299 -0
- package/templates/storefront/src/modules/store/components/refinement-list/sort-products/index.tsx +120 -0
- package/templates/storefront/src/modules/store/components/store-header/index.tsx +67 -0
- package/templates/storefront/src/modules/store/templates/index.tsx +1 -0
- package/templates/storefront/src/modules/store/templates/paginated-products.tsx +175 -0
- package/templates/storefront/src/modules/wishlist/components/wishlist-item/index.tsx +797 -0
- package/templates/storefront/src/modules/wishlist/templates/index.tsx +176 -0
- package/templates/storefront/src/storefront.config.ts +12 -0
- package/templates/storefront/src/styles/globals.css +326 -0
- package/templates/storefront/src/theme/valero/blocks/home/Features/index.tsx +61 -0
- package/templates/storefront/src/theme/valero/blocks/home/Hero/index.tsx +102 -0
- package/templates/storefront/src/theme/valero/blocks/home/LovedByMoms/index.tsx +407 -0
- package/templates/storefront/src/theme/valero/blocks/home/NewArrivals/index.tsx +48 -0
- package/templates/storefront/src/theme/valero/blocks/home/ShopByAge/index.tsx +128 -0
- package/templates/storefront/src/theme/valero/blocks/home/ShopByCategory/index.tsx +409 -0
- package/templates/storefront/src/theme/valero/blocks/home/Testimonials/index.tsx +697 -0
- package/templates/storefront/src/theme/valero/blocks/home/WhyChooseUs/index.tsx +62 -0
- package/templates/storefront/src/theme/valero/layouts/MainLayoutShell.tsx +14 -0
- package/templates/storefront/src/theme/valero/primitives/Button.tsx +28 -0
- package/templates/storefront/src/theme/valero/primitives/Card.tsx +32 -0
- package/templates/storefront/src/theme/valero/primitives/index.ts +2 -0
- package/templates/storefront/src/theme/valero/slots/account/ForgotPassword/index.tsx +1 -0
- package/templates/storefront/src/theme/valero/slots/account/Login/index.tsx +1 -0
- package/templates/storefront/src/theme/valero/slots/account/LoginTemplate/index.tsx +44 -0
- package/templates/storefront/src/theme/valero/slots/account/Register/index.tsx +1 -0
- package/templates/storefront/src/theme/valero/slots/cart/CartItem/index.tsx +11 -0
- package/templates/storefront/src/theme/valero/slots/cart/CartSummary/index.tsx +13 -0
- package/templates/storefront/src/theme/valero/slots/checkout/CheckoutForm/index.tsx +1 -0
- package/templates/storefront/src/theme/valero/slots/checkout/CheckoutSummary/index.tsx +1 -0
- package/templates/storefront/src/theme/valero/slots/layout/Footer/index.tsx +104 -0
- package/templates/storefront/src/theme/valero/slots/layout/Nav/index.tsx +97 -0
- package/templates/storefront/src/theme/valero/slots/layout/PromoBar/index.tsx +19 -0
- package/templates/storefront/src/theme/valero/slots/layout/PromoBar/promo-bar-content.tsx +174 -0
- package/templates/storefront/src/theme/valero/slots/order/OrderDetails/index.tsx +12 -0
- package/templates/storefront/src/theme/valero/slots/product/ProductActions/ProductCTASection.tsx +191 -0
- package/templates/storefront/src/theme/valero/slots/product/ProductActions/ProductDetailsSection.tsx +137 -0
- package/templates/storefront/src/theme/valero/slots/product/ProductActions/ProductFeaturePanel.tsx +245 -0
- package/templates/storefront/src/theme/valero/slots/product/ProductActions/ProductHighlightsSection.tsx +98 -0
- package/templates/storefront/src/theme/valero/slots/product/ProductActions/ProductOptionsSection.tsx +233 -0
- package/templates/storefront/src/theme/valero/slots/product/ProductActions/ProductPriceSection.tsx +53 -0
- package/templates/storefront/src/theme/valero/slots/product/ProductActions/ProductTrustSection.tsx +84 -0
- package/templates/storefront/src/theme/valero/slots/product/ProductActions/index.tsx +161 -0
- package/templates/storefront/src/theme/valero/slots/product/ProductCard/index.tsx +132 -0
- package/templates/storefront/src/theme/valero/slots/product/ProductInfo/index.tsx +40 -0
- package/templates/storefront/src/theme/valero/templates/StorePage/index.tsx +154 -0
- package/templates/storefront/src/theme/valero/tokens/colors.js +16 -0
- package/templates/storefront/src/theme/valero/tokens/colors.ts +21 -0
- package/templates/storefront/src/theme/valero/tokens/fonts.ts +13 -0
- package/templates/storefront/src/theme/valero/tokens/index.ts +3 -0
- package/templates/storefront/src/theme/valero/tokens/spacing.ts +9 -0
- package/templates/storefront/src/theme/valero/tokens/theme.css +91 -0
- package/templates/storefront/tailwind.config.js +221 -0
- package/templates/storefront/tsconfig.json +30 -0
|
@@ -0,0 +1,193 @@
|
|
|
1
|
+
import { Metadata } from "next"
|
|
2
|
+
import { notFound } from "next/navigation"
|
|
3
|
+
import { listProducts } from "@core/data/products"
|
|
4
|
+
import { getRegion, listRegions } from "@core/data/regions"
|
|
5
|
+
import { ProductPage as ProductPageView } from "@controllers/product/product-page"
|
|
6
|
+
import { HttpTypes } from "@medusajs/types"
|
|
7
|
+
import { getImagesForVariant } from "@core/util/product"
|
|
8
|
+
|
|
9
|
+
type Props = {
|
|
10
|
+
params: Promise<{ countryCode: string; handle: string }>
|
|
11
|
+
searchParams: Promise<{ v_id?: string }>
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
// During CI builds, skip static generation to avoid backend dependency
|
|
15
|
+
export const dynamic = 'force-dynamic'
|
|
16
|
+
export const dynamicParams = true
|
|
17
|
+
export const revalidate = 0
|
|
18
|
+
|
|
19
|
+
export async function generateStaticParams() {
|
|
20
|
+
try {
|
|
21
|
+
const countryCodes = await listRegions().then((regions) =>
|
|
22
|
+
regions?.map((r) => r.countries?.map((c) => c.iso_2)).flat()
|
|
23
|
+
)
|
|
24
|
+
|
|
25
|
+
if (!countryCodes) {
|
|
26
|
+
return []
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
const promises = countryCodes.map(async (country) => {
|
|
30
|
+
const { response } = await listProducts({
|
|
31
|
+
countryCode: country,
|
|
32
|
+
queryParams: { limit: 100, fields: "handle" },
|
|
33
|
+
})
|
|
34
|
+
|
|
35
|
+
return {
|
|
36
|
+
country,
|
|
37
|
+
products: response.products,
|
|
38
|
+
}
|
|
39
|
+
})
|
|
40
|
+
|
|
41
|
+
const countryProducts = await Promise.all(promises)
|
|
42
|
+
|
|
43
|
+
return countryProducts
|
|
44
|
+
.flatMap((countryData) =>
|
|
45
|
+
countryData.products.map((product) => ({
|
|
46
|
+
countryCode: countryData.country,
|
|
47
|
+
handle: product.handle,
|
|
48
|
+
}))
|
|
49
|
+
)
|
|
50
|
+
.filter((param) => param.handle)
|
|
51
|
+
} catch (error) {
|
|
52
|
+
return []
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
export async function generateMetadata(props: Props): Promise<Metadata> {
|
|
57
|
+
try {
|
|
58
|
+
const params = await props.params
|
|
59
|
+
const { handle } = params
|
|
60
|
+
const region = await getRegion(params.countryCode)
|
|
61
|
+
|
|
62
|
+
if (!region) {
|
|
63
|
+
// During build, if backend is unavailable, return default metadata
|
|
64
|
+
if (process.env.NODE_ENV === 'production' || process.env.CI) {
|
|
65
|
+
return {
|
|
66
|
+
title: 'Product | Chocomelon',
|
|
67
|
+
description: 'Product',
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
notFound()
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
const product = await listProducts({
|
|
74
|
+
countryCode: params.countryCode,
|
|
75
|
+
queryParams: { handle },
|
|
76
|
+
}).then(({ response }) => response.products[0])
|
|
77
|
+
|
|
78
|
+
if (!product) {
|
|
79
|
+
// During build, if backend is unavailable, return default metadata
|
|
80
|
+
if (process.env.NODE_ENV === 'production' || process.env.CI) {
|
|
81
|
+
return {
|
|
82
|
+
title: 'Product | Chocomelon',
|
|
83
|
+
description: 'Product',
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
notFound()
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
return {
|
|
90
|
+
title: `${product.title} | Chocomelon`,
|
|
91
|
+
description: `${product.title}`,
|
|
92
|
+
openGraph: {
|
|
93
|
+
title: `${product.title} | Chocomelon`,
|
|
94
|
+
description: `${product.title}`,
|
|
95
|
+
images: product.thumbnail ? [product.thumbnail] : [],
|
|
96
|
+
},
|
|
97
|
+
}
|
|
98
|
+
} catch (error: any) {
|
|
99
|
+
// During build, if backend is unavailable, return default metadata
|
|
100
|
+
if (process.env.NODE_ENV === 'production' || process.env.CI) {
|
|
101
|
+
return {
|
|
102
|
+
title: 'Product | Chocomelon',
|
|
103
|
+
description: 'Product',
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
notFound()
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
export default async function ProductPage(props: Props) {
|
|
111
|
+
const params = await props.params
|
|
112
|
+
const searchParams = await props.searchParams
|
|
113
|
+
|
|
114
|
+
|
|
115
|
+
|
|
116
|
+
const region = await getRegion(params.countryCode)
|
|
117
|
+
|
|
118
|
+
if (!region) {
|
|
119
|
+
notFound()
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
const selectedVariantId = searchParams.v_id
|
|
123
|
+
|
|
124
|
+
|
|
125
|
+
|
|
126
|
+
const pricedProduct = await listProducts({
|
|
127
|
+
countryCode: params.countryCode,
|
|
128
|
+
queryParams: { handle: params.handle },
|
|
129
|
+
}).then(({ response }) => {
|
|
130
|
+
const product = response.products[0]
|
|
131
|
+
return product
|
|
132
|
+
})
|
|
133
|
+
|
|
134
|
+
const images = getImagesForVariant(pricedProduct, selectedVariantId)
|
|
135
|
+
|
|
136
|
+
if (!pricedProduct) {
|
|
137
|
+
notFound()
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
// Detailed product information for single product page
|
|
141
|
+
const productDetails = {
|
|
142
|
+
id: pricedProduct.id,
|
|
143
|
+
title: pricedProduct.title,
|
|
144
|
+
handle: pricedProduct.handle,
|
|
145
|
+
description: pricedProduct.description,
|
|
146
|
+
status: pricedProduct.status,
|
|
147
|
+
thumbnail: pricedProduct.thumbnail,
|
|
148
|
+
images: pricedProduct.images?.map((img: any) => ({
|
|
149
|
+
id: img.id,
|
|
150
|
+
url: img.url,
|
|
151
|
+
})) || [],
|
|
152
|
+
imagesCount: images?.length || 0,
|
|
153
|
+
selectedVariantId: selectedVariantId,
|
|
154
|
+
variants: pricedProduct.variants?.map((v: any) => ({
|
|
155
|
+
id: v.id,
|
|
156
|
+
sku: v.sku,
|
|
157
|
+
title: v.title,
|
|
158
|
+
inventory_quantity: v.inventory_quantity,
|
|
159
|
+
calculated_price: v.calculated_price?.calculated_amount
|
|
160
|
+
? `${(v.calculated_price.calculated_amount / 100).toFixed(2)} ${v.calculated_price.currency_code || ''}`
|
|
161
|
+
: 'N/A',
|
|
162
|
+
imagesCount: v.images?.length || 0,
|
|
163
|
+
options: v.options?.map((o: any) => ({
|
|
164
|
+
option_id: o.option_id,
|
|
165
|
+
value: o.value,
|
|
166
|
+
})) || [],
|
|
167
|
+
})) || [],
|
|
168
|
+
variantsCount: pricedProduct.variants?.length || 0,
|
|
169
|
+
tags: pricedProduct.tags?.map((t: any) => t.value) || [],
|
|
170
|
+
metadata: pricedProduct.metadata || {},
|
|
171
|
+
average_rating: (pricedProduct as any).average_rating,
|
|
172
|
+
total_rating_count: (pricedProduct as any).total_rating_count,
|
|
173
|
+
total_rating_sum: (pricedProduct as any).total_rating_sum,
|
|
174
|
+
created_at: pricedProduct.created_at,
|
|
175
|
+
updated_at: pricedProduct.updated_at,
|
|
176
|
+
region: {
|
|
177
|
+
id: region.id,
|
|
178
|
+
name: region.name,
|
|
179
|
+
currency_code: region.currency_code,
|
|
180
|
+
},
|
|
181
|
+
}
|
|
182
|
+
|
|
183
|
+
|
|
184
|
+
|
|
185
|
+
return (
|
|
186
|
+
<ProductPageView
|
|
187
|
+
product={pricedProduct}
|
|
188
|
+
region={region}
|
|
189
|
+
countryCode={params.countryCode}
|
|
190
|
+
images={images || []}
|
|
191
|
+
/>
|
|
192
|
+
)
|
|
193
|
+
}
|
|
@@ -0,0 +1,192 @@
|
|
|
1
|
+
"use client"
|
|
2
|
+
|
|
3
|
+
import { useState, useEffect, Suspense } from "react"
|
|
4
|
+
import { useRouter, useSearchParams } from "next/navigation"
|
|
5
|
+
import { completePasswordReset } from "@core/data/customer-registration"
|
|
6
|
+
import ErrorMessage from "@modules/checkout/components/error-message"
|
|
7
|
+
import Lock from "@modules/common/icons/lock"
|
|
8
|
+
import Eye from "@modules/common/icons/eye"
|
|
9
|
+
import EyeOff from "@modules/common/icons/eye-off"
|
|
10
|
+
import Envelope from "@modules/common/icons/envelope"
|
|
11
|
+
|
|
12
|
+
function ResetPasswordForm() {
|
|
13
|
+
const router = useRouter()
|
|
14
|
+
const searchParams = useSearchParams()
|
|
15
|
+
|
|
16
|
+
const [token, setToken] = useState<string | null>(null)
|
|
17
|
+
const [email, setEmail] = useState("")
|
|
18
|
+
const [password, setPassword] = useState("")
|
|
19
|
+
const [confirmPassword, setConfirmPassword] = useState("")
|
|
20
|
+
const [showPassword, setShowPassword] = useState(false)
|
|
21
|
+
const [isSubmitting, setIsSubmitting] = useState(false)
|
|
22
|
+
const [error, setError] = useState<string | null>(null)
|
|
23
|
+
const [success, setSuccess] = useState(false)
|
|
24
|
+
|
|
25
|
+
useEffect(() => {
|
|
26
|
+
const t = searchParams.get("token")
|
|
27
|
+
const e = searchParams.get("email")
|
|
28
|
+
if (t) setToken(t)
|
|
29
|
+
if (e) setEmail(e)
|
|
30
|
+
}, [searchParams])
|
|
31
|
+
|
|
32
|
+
const handleSubmit = async (e: React.FormEvent) => {
|
|
33
|
+
e.preventDefault()
|
|
34
|
+
|
|
35
|
+
if (!token) {
|
|
36
|
+
setError("Invalid or missing reset token.")
|
|
37
|
+
return
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
if (password !== confirmPassword) {
|
|
41
|
+
setError("Passwords do not match.")
|
|
42
|
+
return
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
setIsSubmitting(true)
|
|
46
|
+
setError(null)
|
|
47
|
+
|
|
48
|
+
try {
|
|
49
|
+
const result = await completePasswordReset({
|
|
50
|
+
email,
|
|
51
|
+
password,
|
|
52
|
+
token
|
|
53
|
+
})
|
|
54
|
+
|
|
55
|
+
if (result.success) {
|
|
56
|
+
setSuccess(true)
|
|
57
|
+
setTimeout(() => {
|
|
58
|
+
router.push("/account")
|
|
59
|
+
}, 3000)
|
|
60
|
+
} else {
|
|
61
|
+
setError(result.error || "Failed to reset password")
|
|
62
|
+
}
|
|
63
|
+
} catch (err: any) {
|
|
64
|
+
setError(err.message || "An error occurred")
|
|
65
|
+
} finally {
|
|
66
|
+
setIsSubmitting(false)
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
if (success) {
|
|
71
|
+
return (
|
|
72
|
+
<div className="w-full max-w-md bg-surface rounded-2xl shadow-lg p-8 text-center">
|
|
73
|
+
<div className="w-16 h-16 bg-green-100 rounded-full flex items-center justify-center mx-auto mb-4">
|
|
74
|
+
<svg className="w-8 h-8 text-green-500" fill="none" stroke="currentColor" viewBox="0 0 24 24">
|
|
75
|
+
<path strokeLinecap="round" strokeLinejoin="round" strokeWidth={2} d="M5 13l4 4L19 7" />
|
|
76
|
+
</svg>
|
|
77
|
+
</div>
|
|
78
|
+
<h1 className="text-2xl font-bold text-heading mb-2">Password Reset Successful</h1>
|
|
79
|
+
<p className="text-muted mb-6">Your password has been reset successfully. Redirecting you to login...</p>
|
|
80
|
+
<button
|
|
81
|
+
onClick={() => router.push("/account")}
|
|
82
|
+
className="w-full py-3 account-btn-primary font-bold rounded-full"
|
|
83
|
+
>
|
|
84
|
+
Go to Login
|
|
85
|
+
</button>
|
|
86
|
+
</div>
|
|
87
|
+
)
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
if (!token) {
|
|
91
|
+
return (
|
|
92
|
+
<div className="w-full max-w-md bg-surface rounded-2xl shadow-lg p-8 text-center">
|
|
93
|
+
<h1 className="text-2xl font-bold text-heading mb-2">Invalid Link</h1>
|
|
94
|
+
<p className="text-muted mb-6">This password reset link is invalid or has expired.</p>
|
|
95
|
+
<button
|
|
96
|
+
onClick={() => router.push("/account")}
|
|
97
|
+
className="w-full py-3 account-btn-primary font-bold rounded-full"
|
|
98
|
+
>
|
|
99
|
+
Return to Login
|
|
100
|
+
</button>
|
|
101
|
+
</div>
|
|
102
|
+
)
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
return (
|
|
106
|
+
<div className="w-full max-w-md bg-surface rounded-2xl shadow-lg p-8">
|
|
107
|
+
<h1 className="text-2xl font-bold text-heading mb-2 text-center">Reset Password</h1>
|
|
108
|
+
<p className="text-muted mb-8 text-center">Enter your email and a new password for your account.</p>
|
|
109
|
+
|
|
110
|
+
<form onSubmit={handleSubmit} className="space-y-4">
|
|
111
|
+
<div>
|
|
112
|
+
<div className="relative">
|
|
113
|
+
<div className="absolute inset-y-0 left-0 pl-4 flex items-center pointer-events-none">
|
|
114
|
+
<Envelope size="20" color="#9CA3AF" />
|
|
115
|
+
</div>
|
|
116
|
+
<input
|
|
117
|
+
type="email"
|
|
118
|
+
placeholder="Email"
|
|
119
|
+
required
|
|
120
|
+
value={email}
|
|
121
|
+
onChange={(e) => setEmail(e.target.value)}
|
|
122
|
+
className="w-full pl-12 pr-4 py-3 text-sm account-input rounded-full"
|
|
123
|
+
/>
|
|
124
|
+
</div>
|
|
125
|
+
</div>
|
|
126
|
+
|
|
127
|
+
<div>
|
|
128
|
+
<div className="relative">
|
|
129
|
+
<div className="absolute inset-y-0 left-0 pl-4 flex items-center pointer-events-none">
|
|
130
|
+
<Lock size="20" color="#9CA3AF" />
|
|
131
|
+
</div>
|
|
132
|
+
<input
|
|
133
|
+
type={showPassword ? "text" : "password"}
|
|
134
|
+
placeholder="New Password"
|
|
135
|
+
required
|
|
136
|
+
value={password}
|
|
137
|
+
onChange={(e) => setPassword(e.target.value)}
|
|
138
|
+
className="w-full pl-12 pr-12 py-3 text-sm account-input rounded-full"
|
|
139
|
+
/>
|
|
140
|
+
<button
|
|
141
|
+
type="button"
|
|
142
|
+
onClick={() => setShowPassword(!showPassword)}
|
|
143
|
+
className="absolute inset-y-0 right-0 pr-4 flex items-center text-muted hover:text-heading"
|
|
144
|
+
>
|
|
145
|
+
{showPassword ? <EyeOff size="20" /> : <Eye size="20" />}
|
|
146
|
+
</button>
|
|
147
|
+
</div>
|
|
148
|
+
</div>
|
|
149
|
+
|
|
150
|
+
<div>
|
|
151
|
+
<div className="relative">
|
|
152
|
+
<div className="absolute inset-y-0 left-0 pl-4 flex items-center pointer-events-none">
|
|
153
|
+
<Lock size="20" color="#9CA3AF" />
|
|
154
|
+
</div>
|
|
155
|
+
<input
|
|
156
|
+
type={showPassword ? "text" : "password"}
|
|
157
|
+
placeholder="Confirm New Password"
|
|
158
|
+
required
|
|
159
|
+
value={confirmPassword}
|
|
160
|
+
onChange={(e) => setConfirmPassword(e.target.value)}
|
|
161
|
+
className="w-full pl-12 pr-12 py-3 text-sm account-input rounded-full"
|
|
162
|
+
/>
|
|
163
|
+
</div>
|
|
164
|
+
</div>
|
|
165
|
+
|
|
166
|
+
<ErrorMessage error={error} />
|
|
167
|
+
|
|
168
|
+
<button
|
|
169
|
+
type="submit"
|
|
170
|
+
disabled={isSubmitting}
|
|
171
|
+
className="w-full py-3 account-btn-primary font-bold rounded-full"
|
|
172
|
+
>
|
|
173
|
+
{isSubmitting ? "Resetting..." : "Reset Password"}
|
|
174
|
+
</button>
|
|
175
|
+
</form>
|
|
176
|
+
</div>
|
|
177
|
+
)
|
|
178
|
+
}
|
|
179
|
+
|
|
180
|
+
export default function ResetPasswordPage() {
|
|
181
|
+
return (
|
|
182
|
+
<div className="min-h-screen flex items-center justify-center bg-page-bg px-4">
|
|
183
|
+
<Suspense fallback={
|
|
184
|
+
<div className="w-full max-w-md bg-surface rounded-2xl shadow-lg p-8 text-center">
|
|
185
|
+
<p>Loading...</p>
|
|
186
|
+
</div>
|
|
187
|
+
}>
|
|
188
|
+
<ResetPasswordForm />
|
|
189
|
+
</Suspense>
|
|
190
|
+
</div>
|
|
191
|
+
)
|
|
192
|
+
}
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
import { Metadata } from "next"
|
|
2
|
+
|
|
3
|
+
import { listCollections } from "@core/data/collections"
|
|
4
|
+
import { getDynamicFilters } from "@core/data/products"
|
|
5
|
+
import { listCategories } from "@core/data/categories"
|
|
6
|
+
import { SortOptions } from "@modules/store/components/refinement-list/sort-products"
|
|
7
|
+
import StoreTemplate from "@modules/store/templates"
|
|
8
|
+
|
|
9
|
+
export const metadata: Metadata = {
|
|
10
|
+
title: "Shop All Products",
|
|
11
|
+
description: "Browse Chocomelon's complete collection of premium kids' fashion. Perfect styles for all ages, from age-specific groups to category favorites.",
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
type Params = {
|
|
15
|
+
searchParams: Promise<{
|
|
16
|
+
sortBy?: SortOptions
|
|
17
|
+
page?: string
|
|
18
|
+
collection?: string | string[]
|
|
19
|
+
category?: string | string[]
|
|
20
|
+
gender?: string | string[]
|
|
21
|
+
type?: string | string[]
|
|
22
|
+
material?: string | string[]
|
|
23
|
+
color?: string | string[]
|
|
24
|
+
min_price?: string
|
|
25
|
+
max_price?: string
|
|
26
|
+
q?: string
|
|
27
|
+
}>
|
|
28
|
+
params: Promise<{
|
|
29
|
+
countryCode: string
|
|
30
|
+
}>
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
export default async function StorePage(props: Params) {
|
|
34
|
+
const params = await props.params;
|
|
35
|
+
const searchParams = await props.searchParams;
|
|
36
|
+
const { sortBy, page, collection, category, gender, type, material, color, min_price, max_price, q } = searchParams
|
|
37
|
+
|
|
38
|
+
const [{ collections }, categories, dynamicFilters] = await Promise.all([
|
|
39
|
+
listCollections(),
|
|
40
|
+
listCategories(),
|
|
41
|
+
getDynamicFilters(params.countryCode)
|
|
42
|
+
])
|
|
43
|
+
|
|
44
|
+
// Filter for top-level categories or all for now
|
|
45
|
+
const categoryOptions = categories.map(c => ({
|
|
46
|
+
value: c.id,
|
|
47
|
+
label: c.name || ""
|
|
48
|
+
}))
|
|
49
|
+
|
|
50
|
+
return (
|
|
51
|
+
<StoreTemplate
|
|
52
|
+
sortBy={sortBy}
|
|
53
|
+
page={page}
|
|
54
|
+
countryCode={params.countryCode}
|
|
55
|
+
collections={collections}
|
|
56
|
+
collection={collection}
|
|
57
|
+
category={category}
|
|
58
|
+
categoryOptions={categoryOptions}
|
|
59
|
+
gender={gender}
|
|
60
|
+
type={type}
|
|
61
|
+
material={material}
|
|
62
|
+
color={color}
|
|
63
|
+
minPrice={min_price}
|
|
64
|
+
maxPrice={max_price}
|
|
65
|
+
genderOptions={dynamicFilters.genders}
|
|
66
|
+
typeOptions={dynamicFilters.productTypes}
|
|
67
|
+
materialOptions={dynamicFilters.materials}
|
|
68
|
+
colorOptions={dynamicFilters.colors}
|
|
69
|
+
q={q}
|
|
70
|
+
/>
|
|
71
|
+
)
|
|
72
|
+
}
|
|
@@ -0,0 +1,179 @@
|
|
|
1
|
+
import { Metadata } from "next"
|
|
2
|
+
import { Heading, Text } from "@medusajs/ui"
|
|
3
|
+
|
|
4
|
+
export const metadata: Metadata = {
|
|
5
|
+
title: "Terms of Use | Chocomelon",
|
|
6
|
+
description: "Read our terms and conditions for using the Chocomelon store.",
|
|
7
|
+
}
|
|
8
|
+
|
|
9
|
+
export default function TermsOfUsePage() {
|
|
10
|
+
return (
|
|
11
|
+
<div className="min-h-screen bg-[#FFFAFE] pb-16 sm:pb-24">
|
|
12
|
+
{/* Header Section */}
|
|
13
|
+
<div className="bg-[#04122C] text-white py-16 sm:py-24 mb-12 relative overflow-hidden">
|
|
14
|
+
{/* Decorative elements */}
|
|
15
|
+
<div className="absolute top-0 left-0 w-96 h-96 bg-[#8B5AB1] opacity-10 rounded-full -ml-48 -mt-48 blur-3xl"></div>
|
|
16
|
+
<div className="absolute bottom-0 right-0 w-64 h-64 bg-blue-500 opacity-10 rounded-full -mr-32 -mb-32 blur-3xl"></div>
|
|
17
|
+
|
|
18
|
+
<div className="max-w-4xl mx-auto px-4 sm:px-6 lg:px-8 relative z-10 text-center">
|
|
19
|
+
<Heading level="h1" className="text-3xl sm:text-5xl font-extrabold mb-4 tracking-tight">
|
|
20
|
+
Terms of Use
|
|
21
|
+
</Heading>
|
|
22
|
+
<Text className="text-gray-300 text-base sm:text-xl max-w-2xl mx-auto leading-relaxed font-light">
|
|
23
|
+
Clear and simple terms for your peace of mind while shopping with Chocomelon.
|
|
24
|
+
</Text>
|
|
25
|
+
</div>
|
|
26
|
+
</div>
|
|
27
|
+
|
|
28
|
+
{/* Content Section */}
|
|
29
|
+
<div className="max-w-4xl mx-auto px-3 sm:px-6 lg:px-8">
|
|
30
|
+
<div className="bg-[#FFFAFE] rounded-3xl shadow-xl shadow-gray-200/50 border border-gray-100 overflow-hidden">
|
|
31
|
+
<div className="p-5 sm:p-10 md:p-16 space-y-12 sm:space-y-16">
|
|
32
|
+
|
|
33
|
+
<section className="relative">
|
|
34
|
+
<div className="flex flex-col md:flex-row gap-8 items-start">
|
|
35
|
+
<div className="flex-shrink-0 w-10 h-10 sm:w-14 sm:h-14 bg-blue-50 text-[#04122C] rounded-2xl flex items-center justify-center font-bold text-xl sm:text-2xl shadow-sm">
|
|
36
|
+
01
|
|
37
|
+
</div>
|
|
38
|
+
<div>
|
|
39
|
+
<Heading level="h2" className="text-2xl font-bold mb-4 text-[#04122C]">
|
|
40
|
+
Agreement to Terms
|
|
41
|
+
</Heading>
|
|
42
|
+
<Text className="leading-relaxed text-gray-600 text-lg">
|
|
43
|
+
By accessing or using the Chocomelon website, you agree to be bound by these Terms of Use and our Privacy Policy. If you do not agree with any part of these terms, you must not use our services.
|
|
44
|
+
</Text>
|
|
45
|
+
</div>
|
|
46
|
+
</div>
|
|
47
|
+
</section>
|
|
48
|
+
|
|
49
|
+
<section className="relative">
|
|
50
|
+
<div className="flex flex-col md:flex-row gap-8 items-start">
|
|
51
|
+
<div className="flex-shrink-0 w-10 h-10 sm:w-14 sm:h-14 bg-purple-50 text-[#8B5AB1] rounded-2xl flex items-center justify-center font-bold text-xl sm:text-2xl shadow-sm">
|
|
52
|
+
02
|
|
53
|
+
</div>
|
|
54
|
+
<div>
|
|
55
|
+
<Heading level="h2" className="text-2xl font-bold mb-4 text-[#04122C]">
|
|
56
|
+
Products and Pricing
|
|
57
|
+
</Heading>
|
|
58
|
+
<Text className="leading-relaxed text-gray-600 text-lg">
|
|
59
|
+
We strive to provide accurate descriptions and pricing for all products. However, we do not warrant that product descriptions or other content are error-free. We reserve the right to correct any errors and to change or update information at any time without prior notice.
|
|
60
|
+
</Text>
|
|
61
|
+
</div>
|
|
62
|
+
</div>
|
|
63
|
+
</section>
|
|
64
|
+
|
|
65
|
+
<section className="relative">
|
|
66
|
+
<div className="flex flex-col md:flex-row gap-8 items-start">
|
|
67
|
+
<div className="flex-shrink-0 w-10 h-10 sm:w-14 sm:h-14 bg-pink-50 text-pink-500 rounded-2xl flex items-center justify-center font-bold text-xl sm:text-2xl shadow-sm">
|
|
68
|
+
03
|
|
69
|
+
</div>
|
|
70
|
+
<div>
|
|
71
|
+
<Heading level="h2" className="text-2xl font-bold mb-4 text-[#04122C]">
|
|
72
|
+
Orders and Payment
|
|
73
|
+
</Heading>
|
|
74
|
+
<Text className="leading-relaxed text-gray-600 text-lg mb-6">
|
|
75
|
+
All orders placed through the website are subject to acceptance. We reserve the right to refuse or cancel any order for any reason.
|
|
76
|
+
</Text>
|
|
77
|
+
<div className="bg-gray-50 rounded-2xl p-6 border border-gray-100">
|
|
78
|
+
<Text className="text-sm font-semibold text-[#04122C] uppercase tracking-wider mb-2">Secure Payments</Text>
|
|
79
|
+
<Text className="text-gray-500">Payments must be made through our approved payment gateways at the time of purchase. We use industry-standard encryption to keep your data safe.</Text>
|
|
80
|
+
</div>
|
|
81
|
+
</div>
|
|
82
|
+
</div>
|
|
83
|
+
</section>
|
|
84
|
+
|
|
85
|
+
<section className="relative">
|
|
86
|
+
<div className="flex flex-col md:flex-row gap-8 items-start">
|
|
87
|
+
<div className="flex-shrink-0 w-10 h-10 sm:w-14 sm:h-14 bg-blue-50 text-[#04122C] rounded-2xl flex items-center justify-center font-bold text-xl sm:text-2xl shadow-sm">
|
|
88
|
+
04
|
|
89
|
+
</div>
|
|
90
|
+
<div>
|
|
91
|
+
<Heading level="h2" className="text-2xl font-bold mb-4 text-[#04122C]">
|
|
92
|
+
Shipping and Delivery
|
|
93
|
+
</Heading>
|
|
94
|
+
<Text className="leading-relaxed text-gray-600 text-lg">
|
|
95
|
+
Delivery times are estimates and not guaranteed. Chocomelon is not responsible for delays caused by shipping carriers or customs. Risk of loss and title for items purchased pass to you upon delivery to the carrier.
|
|
96
|
+
</Text>
|
|
97
|
+
</div>
|
|
98
|
+
</div>
|
|
99
|
+
</section>
|
|
100
|
+
|
|
101
|
+
<section className="relative">
|
|
102
|
+
<div className="flex flex-col md:flex-row gap-8 items-start">
|
|
103
|
+
<div className="flex-shrink-0 w-10 h-10 sm:w-14 sm:h-14 bg-purple-50 text-[#8B5AB1] rounded-2xl flex items-center justify-center font-bold text-xl sm:text-2xl shadow-sm">
|
|
104
|
+
05
|
|
105
|
+
</div>
|
|
106
|
+
<div>
|
|
107
|
+
<Heading level="h2" className="text-2xl font-bold mb-4 text-[#04122C]">
|
|
108
|
+
Returns and Refunds
|
|
109
|
+
</Heading>
|
|
110
|
+
<Text className="leading-relaxed text-gray-600 text-lg">
|
|
111
|
+
Our return and refund policy is governed by specific rules visible on our returns page. Generally, items must be in original condition with tags attached to be eligible for return.
|
|
112
|
+
</Text>
|
|
113
|
+
</div>
|
|
114
|
+
</div>
|
|
115
|
+
</section>
|
|
116
|
+
|
|
117
|
+
<section className="relative">
|
|
118
|
+
<div className="flex flex-col md:flex-row gap-8 items-start">
|
|
119
|
+
<div className="flex-shrink-0 w-10 h-10 sm:w-14 sm:h-14 bg-yellow-50 text-yellow-600 rounded-2xl flex items-center justify-center font-bold text-xl sm:text-2xl shadow-sm">
|
|
120
|
+
06
|
|
121
|
+
</div>
|
|
122
|
+
<div>
|
|
123
|
+
<Heading level="h2" className="text-2xl font-bold mb-4 text-[#04122C]">
|
|
124
|
+
Intellectual Property
|
|
125
|
+
</Heading>
|
|
126
|
+
<Text className="leading-relaxed text-gray-600 text-lg">
|
|
127
|
+
All content on this website, including text, graphics, logos, and images, is the property of Chocomelon and is protected by intellectual property laws. You may not use our content without explicit written permission.
|
|
128
|
+
</Text>
|
|
129
|
+
</div>
|
|
130
|
+
</div>
|
|
131
|
+
</section>
|
|
132
|
+
|
|
133
|
+
<div className="pt-12 border-t border-gray-100">
|
|
134
|
+
<div className="bg-[#04122C] rounded-3xl p-6 sm:p-10 text-white relative overflow-hidden">
|
|
135
|
+
<div className="absolute top-0 right-0 w-32 h-32 bg-white/10 rounded-full -mr-16 -mt-16 blur-2xl"></div>
|
|
136
|
+
<Heading level="h3" className="text-xl font-bold mb-4 relative z-10">
|
|
137
|
+
Limitation of Liability
|
|
138
|
+
</Heading>
|
|
139
|
+
<Text className="text-gray-300 relative z-10 leading-relaxed">
|
|
140
|
+
Chocomelon shall not be liable for any indirect, incidental, special, or consequential damages resulting from the use or inability to use our services or products. These terms shall be governed by and construed in accordance with the laws of India.
|
|
141
|
+
</Text>
|
|
142
|
+
</div>
|
|
143
|
+
</div>
|
|
144
|
+
|
|
145
|
+
<section className="bg-purple-50/30 p-6 sm:p-8 rounded-3xl border border-purple-100/50">
|
|
146
|
+
<Heading level="h2" className="text-xl font-bold mb-3 text-[#04122C]">
|
|
147
|
+
Questions about our Terms?
|
|
148
|
+
</Heading>
|
|
149
|
+
<Text className="text-gray-600 mb-4">
|
|
150
|
+
If you have any questions or need clarification on our Terms of Use, please reach out to our legal team.
|
|
151
|
+
</Text>
|
|
152
|
+
<div className="flex flex-col sm:flex-row sm:items-center gap-1 sm:gap-2 text-[#8B5AB1] font-semibold">
|
|
153
|
+
<span className="text-gray-400 font-normal">Email:</span>
|
|
154
|
+
<a href="mailto:chocomelonllp@gmail.com" className="hover:underline break-all sm:break-normal">chocomelonllp@gmail.com</a>
|
|
155
|
+
</div>
|
|
156
|
+
</section>
|
|
157
|
+
|
|
158
|
+
<section className="pt-8 flex flex-col sm:flex-row justify-between items-center gap-4">
|
|
159
|
+
<p className="text-sm text-gray-400 font-medium">
|
|
160
|
+
Last Updated: March 19, 2026
|
|
161
|
+
</p>
|
|
162
|
+
<div className="flex gap-3">
|
|
163
|
+
<div className="px-5 py-2 rounded-full bg-gradient-to-r from-[#04122C] to-blue-900 text-white text-[10px] font-bold shadow-lg shadow-blue-900/20 uppercase tracking-widest flex items-center gap-1.5 transition-transform hover:scale-105">
|
|
164
|
+
<div className="w-1.5 h-1.5 rounded-full bg-blue-400"></div>
|
|
165
|
+
OFFICIAL
|
|
166
|
+
</div>
|
|
167
|
+
<div className="px-5 py-2 rounded-full bg-gradient-to-r from-green-600 to-emerald-400 text-white text-[10px] font-bold shadow-lg shadow-green-900/20 uppercase tracking-widest flex items-center gap-1.5 transition-transform hover:scale-105">
|
|
168
|
+
<div className="w-1.5 h-1.5 rounded-full bg-green-300"></div>
|
|
169
|
+
VERIFIED
|
|
170
|
+
</div>
|
|
171
|
+
</div>
|
|
172
|
+
</section>
|
|
173
|
+
</div>
|
|
174
|
+
</div>
|
|
175
|
+
</div>
|
|
176
|
+
</div>
|
|
177
|
+
)
|
|
178
|
+
}
|
|
179
|
+
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { Metadata } from "next"
|
|
2
|
+
import WishlistTemplate from "@modules/wishlist/templates"
|
|
3
|
+
|
|
4
|
+
type Props = {
|
|
5
|
+
params: Promise<{ countryCode: string }>
|
|
6
|
+
}
|
|
7
|
+
|
|
8
|
+
export const metadata: Metadata = {
|
|
9
|
+
title: "My Wishlist",
|
|
10
|
+
description: "View your wishlist items",
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
export default async function WishlistPage(props: Props) {
|
|
14
|
+
const params = await props.params
|
|
15
|
+
const countryCode = params.countryCode
|
|
16
|
+
|
|
17
|
+
return <WishlistTemplate countryCode={countryCode} />
|
|
18
|
+
}
|
|
19
|
+
|