├── .env.local.template ├── .gitignore ├── DOCUMENTATION.md ├── README.md ├── next-env.d.ts ├── next-i18next.config.js ├── next.config.js ├── package-lock.json ├── package.json ├── postcss.config.js ├── public ├── api │ ├── attribute.json │ ├── attributes.json │ ├── brands.json │ ├── categories.json │ ├── featured_categories.json │ ├── featured_products.json │ ├── login.json │ ├── order.json │ ├── password_change_response.json │ ├── product.json │ ├── products.json │ ├── products_best_seller.json │ ├── products_flash_sale.json │ ├── products_new_arrival.json │ ├── products_on_selling.json │ ├── products_top_seller.json │ ├── register.json │ ├── related_products.json │ └── search.json ├── assets │ ├── images │ │ ├── 404.svg │ │ ├── app-store.svg │ │ ├── app.png │ │ ├── banner │ │ │ ├── banner-1.jpg │ │ │ ├── banner-2.jpg │ │ │ ├── banner-3.jpg │ │ │ ├── banner-4.jpg │ │ │ ├── banner-5.jpg │ │ │ ├── banner-6.jpg │ │ │ ├── banner-mobile-1.jpg │ │ │ ├── banner-mobile-2.jpg │ │ │ ├── banner-mobile-3.jpg │ │ │ ├── banner-mobile-4.jpg │ │ │ ├── banner-mobile-5.png │ │ │ ├── banner-mobile-6.png │ │ │ ├── banner-sale-offer-reverse.jpg │ │ │ ├── banner-sale-offer.jpg │ │ │ ├── grid │ │ │ │ ├── banner-1.jpg │ │ │ │ ├── banner-2.jpg │ │ │ │ ├── banner-3.jpg │ │ │ │ ├── banner-mobile-1.jpg │ │ │ │ ├── banner-mobile-2.jpg │ │ │ │ ├── banner-mobile-3.jpg │ │ │ │ └── small │ │ │ │ │ ├── banner-1.jpg │ │ │ │ │ ├── banner-2.jpg │ │ │ │ │ ├── banner-3.jpg │ │ │ │ │ ├── banner-mobile-1.jpg │ │ │ │ │ ├── banner-mobile-2.jpg │ │ │ │ │ └── banner-mobile-3.jpg │ │ │ ├── masonry │ │ │ │ ├── banner-1.jpg │ │ │ │ ├── banner-2.jpg │ │ │ │ ├── banner-3.jpg │ │ │ │ ├── banner-4.jpg │ │ │ │ ├── banner-5.jpg │ │ │ │ ├── banner-6.jpg │ │ │ │ ├── banner-mobile-1.jpg │ │ │ │ ├── banner-mobile-2.jpg │ │ │ │ ├── banner-mobile-3.jpg │ │ │ │ ├── banner-mobile-4.jpg │ │ │ │ ├── banner-mobile-5.jpg │ │ │ │ └── banner-mobile-6.jpg │ │ │ ├── slider │ │ │ │ ├── banner-1.jpg │ │ │ │ ├── banner-2.jpg │ │ │ │ ├── banner-3.jpg │ │ │ │ └── mobile │ │ │ │ │ ├── banner-1.jpg │ │ │ │ │ ├── banner-2.jpg │ │ │ │ │ └── banner-3.jpg │ │ │ └── small │ │ │ │ ├── banner-1.jpg │ │ │ │ ├── banner-2.jpg │ │ │ │ ├── banner-3.jpg │ │ │ │ ├── banner-mobile-1.jpg │ │ │ │ ├── banner-mobile-2.jpg │ │ │ │ └── banner-mobile-3.jpg │ │ ├── brands │ │ │ ├── blaze-fashion.png │ │ │ ├── club-shoes.png │ │ │ ├── elegance.png │ │ │ ├── fashadil.png │ │ │ ├── fusion.png │ │ │ ├── grid │ │ │ │ ├── blaze-fashion-bg.jpg │ │ │ │ ├── blaze-fashion.png │ │ │ │ ├── clothingegy-bg.jpg │ │ │ │ ├── clothingegy.png │ │ │ │ ├── clothingtastic-bg.jpg │ │ │ │ ├── clothingtastic.png │ │ │ │ ├── club-shoes-bg.jpg │ │ │ │ ├── club-shoes.png │ │ │ │ ├── elegance-bg.jpg │ │ │ │ ├── elegance.png │ │ │ │ ├── fashadil-bg.jpg │ │ │ │ ├── fashadil.png │ │ │ │ ├── fashnetic-bg.jpg │ │ │ │ ├── fashnetic.png │ │ │ │ ├── fusion-bg.jpg │ │ │ │ ├── fusion.png │ │ │ │ ├── hoppister-bg.jpg │ │ │ │ ├── hoppister.png │ │ │ │ ├── hunter-shoes-bg.jpg │ │ │ │ ├── hunter-shoes.png │ │ │ │ ├── pop-clothing-bg.jpg │ │ │ │ ├── pop-clothing.png │ │ │ │ ├── sholy-bg.jpg │ │ │ │ ├── sholy.png │ │ │ │ ├── shoozly-bg.jpg │ │ │ │ ├── shoozly.png │ │ │ │ ├── shosio-bg.jpg │ │ │ │ ├── shosio.png │ │ │ │ ├── shovia-bg.jpg │ │ │ │ ├── shovia.png │ │ │ │ ├── tyrant-bg.jpg │ │ │ │ └── tyrant.png │ │ │ ├── hoppister.png │ │ │ ├── hunter-shoes.png │ │ │ └── shovia.png │ │ ├── category │ │ │ ├── bags.jpg │ │ │ ├── kid.jpg │ │ │ ├── man.jpg │ │ │ ├── sneakers.jpg │ │ │ ├── sports.jpg │ │ │ ├── sunglass.jpg │ │ │ ├── two │ │ │ │ ├── bags │ │ │ │ │ ├── 1.png │ │ │ │ │ ├── 2.png │ │ │ │ │ └── 3.png │ │ │ │ ├── jewellers │ │ │ │ │ ├── 1.png │ │ │ │ │ ├── 2.png │ │ │ │ │ └── 3.png │ │ │ │ ├── shoes │ │ │ │ │ ├── 1.png │ │ │ │ │ ├── 2.png │ │ │ │ │ └── 3.png │ │ │ │ ├── sun-glasses │ │ │ │ │ ├── 1.png │ │ │ │ │ ├── 2.png │ │ │ │ │ └── 3.png │ │ │ │ ├── wallets │ │ │ │ │ ├── 1.png │ │ │ │ │ ├── 2.png │ │ │ │ │ └── 3.png │ │ │ │ └── watches │ │ │ │ │ ├── 1.png │ │ │ │ │ ├── 2.png │ │ │ │ │ └── 3.png │ │ │ ├── watch.jpg │ │ │ └── woman.jpg │ │ ├── checkout │ │ │ ├── 01.png │ │ │ ├── 02.png │ │ │ └── 03.png │ │ ├── collection │ │ │ ├── 1.jpg │ │ │ ├── 2.jpg │ │ │ └── 3.jpg │ │ ├── exclusive │ │ │ ├── men.png │ │ │ └── women.png │ │ ├── feature │ │ │ ├── delivery.svg │ │ │ ├── product.svg │ │ │ ├── risk-free.svg │ │ │ └── saving.svg │ │ ├── hero │ │ │ ├── banner-1.jpg │ │ │ ├── banner-2.jpg │ │ │ ├── banner-3.jpg │ │ │ ├── banner-mobile-1.jpg │ │ │ ├── banner-mobile-2.jpg │ │ │ ├── banner-mobile-3.jpg │ │ │ └── two │ │ │ │ ├── banner-1.jpg │ │ │ │ ├── banner-2.jpg │ │ │ │ ├── banner-3.jpg │ │ │ │ ├── banner-mobile-1.jpg │ │ │ │ ├── banner-mobile-2.jpg │ │ │ │ └── banner-mobile-3.jpg │ │ ├── instagram │ │ │ ├── 1.jpg │ │ │ ├── 2.jpg │ │ │ ├── 3.jpg │ │ │ ├── 4.jpg │ │ │ ├── 5.jpg │ │ │ └── 6.jpg │ │ ├── logo.svg │ │ ├── map-image.jpg │ │ ├── newsletter.jpg │ │ ├── not-found-alt.svg │ │ ├── og-image-01.png │ │ ├── og-image-02.png │ │ ├── page-header.jpg │ │ ├── payment │ │ │ ├── jcb.svg │ │ │ ├── mastercard.svg │ │ │ ├── paypal.svg │ │ │ ├── skrill.svg │ │ │ └── visa.svg │ │ ├── play-store.svg │ │ ├── products │ │ │ ├── featured │ │ │ │ ├── 1.png │ │ │ │ ├── 2.png │ │ │ │ ├── 3.png │ │ │ │ ├── 4.png │ │ │ │ └── 5.png │ │ │ ├── p-1-m.png │ │ │ ├── p-1.png │ │ │ ├── p-10-m.png │ │ │ ├── p-10.png │ │ │ ├── p-11-m.png │ │ │ ├── p-11-xs.png │ │ │ ├── p-11.png │ │ │ ├── p-12-m.png │ │ │ ├── p-12-md.png │ │ │ ├── p-13-m.png │ │ │ ├── p-13.png │ │ │ ├── p-14-m.png │ │ │ ├── p-14-md.png │ │ │ ├── p-14-xs.png │ │ │ ├── p-14.png │ │ │ ├── p-15-lg.png │ │ │ ├── p-15-m.png │ │ │ ├── p-15-xs.png │ │ │ ├── p-15.png │ │ │ ├── p-16-lg.png │ │ │ ├── p-16-m.png │ │ │ ├── p-16-md.png │ │ │ ├── p-16-xs.png │ │ │ ├── p-16.png │ │ │ ├── p-17-m.png │ │ │ ├── p-17.png │ │ │ ├── p-18-m.png │ │ │ ├── p-18.png │ │ │ ├── p-19-m.png │ │ │ ├── p-19.png │ │ │ ├── p-2-m.png │ │ │ ├── p-2.png │ │ │ ├── p-20-1.png │ │ │ ├── p-20-2.png │ │ │ ├── p-20-3.png │ │ │ ├── p-20-4.png │ │ │ ├── p-20-m.png │ │ │ ├── p-20-s.png │ │ │ ├── p-20.png │ │ │ ├── p-21-m.png │ │ │ ├── p-21.png │ │ │ ├── p-22-m.png │ │ │ ├── p-22-s.png │ │ │ ├── p-22.png │ │ │ ├── p-23-m.png │ │ │ ├── p-23.png │ │ │ ├── p-24-m.png │ │ │ ├── p-24-md.png │ │ │ ├── p-24-s.png │ │ │ ├── p-24-sm.png │ │ │ ├── p-25-m.png │ │ │ ├── p-25-md.png │ │ │ ├── p-25-s.png │ │ │ ├── p-26-m.png │ │ │ ├── p-26-md.png │ │ │ ├── p-26-xs.png │ │ │ ├── p-27-m.png │ │ │ ├── p-27-md.png │ │ │ ├── p-27-sm.png │ │ │ ├── p-27-xs.png │ │ │ ├── p-28-m.png │ │ │ ├── p-28-xs.png │ │ │ ├── p-29-m.png │ │ │ ├── p-29-sm.png │ │ │ ├── p-3-m.png │ │ │ ├── p-3.png │ │ │ ├── p-30-m.png │ │ │ ├── p-30-md.png │ │ │ ├── p-4-m.png │ │ │ ├── p-4.png │ │ │ ├── p-5-m.png │ │ │ ├── p-5.png │ │ │ ├── p-6-m.png │ │ │ ├── p-6-xs.png │ │ │ ├── p-6.png │ │ │ ├── p-7-m.png │ │ │ ├── p-7-xs.png │ │ │ ├── p-7.png │ │ │ ├── p-8-m.png │ │ │ ├── p-8-md.png │ │ │ ├── p-8-xs.png │ │ │ ├── p-8.png │ │ │ ├── p-9-m.png │ │ │ └── p-9.png │ │ ├── search │ │ │ ├── 1.png │ │ │ ├── 2.png │ │ │ └── 3.png │ │ └── support.png │ └── placeholder │ │ ├── brand-bg.svg │ │ ├── card-medium.svg │ │ ├── card-small.svg │ │ ├── cart-item.svg │ │ ├── category-small.svg │ │ ├── collection.svg │ │ ├── instagram.svg │ │ ├── order-product.svg │ │ ├── products │ │ ├── product-cat.svg │ │ ├── product-gallery.svg │ │ ├── product-grid.svg │ │ ├── product-gridSlim.svg │ │ ├── product-list.svg │ │ ├── product-listSmall.svg │ │ └── product-thumbnail.svg │ │ └── search-product.svg ├── favicon.ico ├── locales │ ├── ar │ │ ├── common.json │ │ ├── faq.json │ │ ├── footer.json │ │ ├── forms.json │ │ ├── menu.json │ │ ├── privacy.json │ │ └── terms.json │ ├── de │ │ ├── common.json │ │ ├── faq.json │ │ ├── footer.json │ │ ├── forms.json │ │ ├── menu.json │ │ ├── privacy.json │ │ └── terms.json │ ├── en │ │ ├── common.json │ │ ├── faq.json │ │ ├── footer.json │ │ ├── forms.json │ │ ├── menu.json │ │ ├── privacy.json │ │ └── terms.json │ ├── es │ │ ├── common.json │ │ ├── faq.json │ │ ├── footer.json │ │ ├── forms.json │ │ ├── menu.json │ │ ├── privacy.json │ │ └── terms.json │ ├── he │ │ ├── common.json │ │ ├── faq.json │ │ ├── footer.json │ │ ├── forms.json │ │ ├── menu.json │ │ ├── privacy.json │ │ └── terms.json │ └── zh │ │ ├── common.json │ │ ├── faq.json │ │ ├── footer.json │ │ ├── forms.json │ │ ├── menu.json │ │ ├── privacy.json │ │ └── terms.json ├── sw.js ├── vercel.svg └── workbox-ea903bce.js ├── src ├── components │ ├── 404 │ │ └── error-information.tsx │ ├── auth │ │ ├── forget-password-form.tsx │ │ ├── login-form.tsx │ │ └── sign-up-form.tsx │ ├── cart │ │ ├── cart-button.tsx │ │ ├── cart-item.tsx │ │ ├── cart.tsx │ │ └── empty-cart.tsx │ ├── checkout │ │ ├── checkout-card-footer-item.tsx │ │ ├── checkout-card-item.tsx │ │ ├── checkout-card.tsx │ │ └── checkout-form.tsx │ ├── common │ │ ├── accordion.tsx │ │ ├── banner-card.tsx │ │ ├── brand-card.tsx │ │ ├── breadcrumb.tsx │ │ ├── card.tsx │ │ ├── category-card.tsx │ │ ├── category-list-card.tsx │ │ ├── collection-card.tsx │ │ ├── counter.tsx │ │ ├── default-seo.tsx │ │ ├── download-apps.tsx │ │ ├── drawer │ │ │ ├── drawer.tsx │ │ │ └── managed-drawer.tsx │ │ ├── form │ │ │ ├── contact-form.tsx │ │ │ └── review-form.tsx │ │ ├── instagram.tsx │ │ ├── modal │ │ │ ├── managed-modal.tsx │ │ │ └── modal.tsx │ │ ├── newsletter.tsx │ │ ├── progress-card.tsx │ │ ├── sale-with-progress.tsx │ │ ├── scrollbar.tsx │ │ ├── search-box.tsx │ │ ├── search-product.tsx │ │ ├── search.tsx │ │ ├── section-header.tsx │ │ ├── subscription.tsx │ │ ├── support.tsx │ │ └── text-information.tsx │ ├── icons │ │ ├── CNFlag.tsx │ │ ├── DEFlag.tsx │ │ ├── ESFlag.tsx │ │ ├── ILFlag.tsx │ │ ├── SAFlag.tsx │ │ ├── USFlag.tsx │ │ ├── cart-icon.tsx │ │ ├── eye-icon.tsx │ │ ├── eye-off-icon.tsx │ │ ├── filter-icon.tsx │ │ ├── home-icon.tsx │ │ ├── menu-icon.tsx │ │ ├── minus-icon.tsx │ │ ├── plus-icon.tsx │ │ ├── search-icon.tsx │ │ ├── trash-icon.tsx │ │ └── user-icon.tsx │ ├── layout │ │ ├── footer │ │ │ ├── copyright.tsx │ │ │ ├── data.tsx │ │ │ ├── footer.tsx │ │ │ └── widgets.tsx │ │ ├── header │ │ │ ├── auth-menu.tsx │ │ │ ├── header-menu.tsx │ │ │ ├── header.tsx │ │ │ └── mobile-menu.tsx │ │ ├── layout.tsx │ │ └── mobile-navigation │ │ │ └── mobile-navigation.tsx │ ├── my-account │ │ ├── account-details.tsx │ │ ├── account-layout.tsx │ │ ├── account-nav.tsx │ │ ├── change-password.tsx │ │ └── orders-table.tsx │ ├── order │ │ ├── order-details.tsx │ │ └── order-information.tsx │ ├── product │ │ ├── feeds │ │ │ ├── best-seller-product-feed.tsx │ │ │ ├── flash-sale-product-feed.tsx │ │ │ └── new-arrivals-product-feed.tsx │ │ ├── product-attributes.tsx │ │ ├── product-card.tsx │ │ ├── product-meta-review.tsx │ │ ├── product-overlay-card.tsx │ │ ├── product-popup.tsx │ │ └── product-single-details.tsx │ ├── shop │ │ ├── brand-filter.tsx │ │ ├── category-filter.tsx │ │ ├── color-filter.tsx │ │ ├── discount.tsx │ │ ├── filter-sidebar.tsx │ │ ├── filtered-item.tsx │ │ ├── filters.tsx │ │ ├── price-filter.tsx │ │ ├── product-grid.tsx │ │ └── top-bar.tsx │ ├── ui │ │ ├── active-link.tsx │ │ ├── alert.tsx │ │ ├── button.tsx │ │ ├── carousel │ │ │ └── carousel.tsx │ │ ├── checkbox.tsx │ │ ├── container.tsx │ │ ├── divider.tsx │ │ ├── input.tsx │ │ ├── language-switcher.tsx │ │ ├── link.tsx │ │ ├── list-box.tsx │ │ ├── list-menu.tsx │ │ ├── loaders │ │ │ ├── brand-card-loader.tsx │ │ │ ├── card-loader.tsx │ │ │ ├── card-rounded-loader.tsx │ │ │ ├── category-card-loader.tsx │ │ │ ├── category-list-card-loader.tsx │ │ │ ├── category-list-feed-loader.tsx │ │ │ ├── content-feed-loader.tsx │ │ │ ├── product-card-grid-loader.tsx │ │ │ ├── product-card-loader.tsx │ │ │ ├── product-card-small-list-loader.tsx │ │ │ ├── product-feed-loader.tsx │ │ │ ├── product-flash-sale-grid-feed-loader.tsx │ │ │ ├── product-flash-sale-grid-loader.tsx │ │ │ ├── product-flash-sale-loader.tsx │ │ │ ├── product-list-card-loader.tsx │ │ │ ├── product-list-feed-loader.tsx │ │ │ └── search-result-loader.tsx │ │ ├── logo.tsx │ │ ├── mega-menu.tsx │ │ ├── page-header.tsx │ │ ├── password-input.tsx │ │ ├── radiobox.tsx │ │ ├── tabs.tsx │ │ ├── text-area.tsx │ │ └── text.tsx │ └── widgets │ │ └── widget-link.tsx ├── containers │ ├── banner-block.tsx │ ├── banner-carousel-block.tsx │ ├── banner-grid-block.tsx │ ├── banner-slider-block.tsx │ ├── banner-with-products.tsx │ ├── brand-block.tsx │ ├── brand-grid-block.tsx │ ├── category-block.tsx │ ├── category-grid-block.tsx │ ├── collection-block.tsx │ ├── contact-info.tsx │ ├── exclusive-block.tsx │ ├── feature-block.tsx │ ├── hero-block.tsx │ ├── hero-with-category-flash.tsx │ ├── hero-with-category.tsx │ ├── product-flash-sale-block.tsx │ ├── products-block.tsx │ ├── products-featured.tsx │ ├── products-with-flash-sale.tsx │ └── related-products.tsx ├── contexts │ ├── cart │ │ ├── cart.context.tsx │ │ ├── cart.reducer.tsx │ │ └── cart.utils.ts │ └── ui.context.tsx ├── framework │ └── basic-rest │ │ ├── auth │ │ ├── use-forget-password.tsx │ │ ├── use-login.tsx │ │ ├── use-logout.tsx │ │ └── use-signup.tsx │ │ ├── brand │ │ └── get-all-brands.tsx │ │ ├── category │ │ ├── get-all-categories.tsx │ │ ├── get-all-featured-categories.tsx │ │ └── get-category.tsx │ │ ├── checkout │ │ └── use-checkout.tsx │ │ ├── customer │ │ ├── use-change-email.tsx │ │ ├── use-change-password.tsx │ │ └── use-update-customer.tsx │ │ ├── order │ │ ├── get-all-orders.ts │ │ └── get-order.ts │ │ ├── product │ │ ├── get-all-best-seller-products.tsx │ │ ├── get-all-featured-products.tsx │ │ ├── get-all-flash-sale-products.tsx │ │ ├── get-all-new-arrival-products.tsx │ │ ├── get-all-on-selling-products.tsx │ │ ├── get-all-products.tsx │ │ ├── get-all-top-seller-products.tsx │ │ ├── get-product.tsx │ │ ├── get-related-product.tsx │ │ ├── use-price.tsx │ │ └── use-search.tsx │ │ ├── static │ │ └── banner.ts │ │ ├── types.ts │ │ └── utils │ │ ├── api-endpoints.ts │ │ ├── get-token.ts │ │ ├── get-variations.ts │ │ └── http.ts ├── pages │ ├── 404.tsx │ ├── _app.tsx │ ├── _document.tsx │ ├── checkout.tsx │ ├── classic.tsx │ ├── contact-us.tsx │ ├── faq.tsx │ ├── forget-password.tsx │ ├── index.tsx │ ├── minimal.tsx │ ├── my-account │ │ ├── account-details.tsx │ │ ├── change-password.tsx │ │ ├── index.tsx │ │ └── orders │ │ │ ├── [id].tsx │ │ │ └── index.tsx │ ├── order.tsx │ ├── privacy.tsx │ ├── products │ │ ├── [slug].tsx │ │ └── index.tsx │ ├── search.tsx │ ├── signin.tsx │ ├── signup.tsx │ ├── standard.tsx │ ├── terms.tsx │ └── vintage.tsx ├── settings │ ├── faq.settings.ts │ ├── privacy-settings.ts │ ├── site-settings.tsx │ └── terms-settings.ts ├── styles │ ├── custom-plugins.css │ ├── scrollbar.css │ ├── swiper-carousel.css │ └── tailwind.css └── utils │ ├── add-active-scroll.ts │ ├── constants.ts │ ├── generate-cart-item-name.ts │ ├── generate-cart-item.ts │ ├── get-direction.ts │ ├── motion │ ├── fade-in-left.ts │ ├── fade-in-out.ts │ ├── fade-in-right.ts │ ├── fade-in-top.ts │ ├── height-collapse.ts │ └── zoom-out-in.ts │ ├── routes.ts │ ├── use-breadcrumb.ts │ ├── use-click-outside.ts │ ├── use-local-storage.ts │ └── use-window-size.ts ├── tailwind.config.js ├── tsconfig.json ├── vercel.json └── yarn.lock /.env.local.template: -------------------------------------------------------------------------------- 1 | NEXT_PUBLIC_REST_API_ENDPOINT=http://localhost:3000/api -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # See https://help.github.com/articles/ignoring-files/ for more about ignoring files. 2 | 3 | # dependencies 4 | /node_modules 5 | /.pnp 6 | .pnp.js 7 | 8 | # testing 9 | /coverage 10 | 11 | # next.js 12 | /.next/ 13 | /out/ 14 | 15 | # production 16 | /build 17 | 18 | # misc 19 | .DS_Store 20 | *.pem 21 | 22 | # debug 23 | npm-debug.log* 24 | yarn-debug.log* 25 | yarn-error.log* 26 | 27 | # local env files 28 | .env.local 29 | .env.development.local 30 | .env.test.local 31 | .env.production.local 32 | 33 | # vercel 34 | .vercel 35 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # react-nextjs-ecommerce 2 | ECommerce website built in reactjs/nextjs 3 | -------------------------------------------------------------------------------- /next-env.d.ts: -------------------------------------------------------------------------------- 1 | /// 2 | /// 3 | declare module "react-rating-stars-component"; 4 | -------------------------------------------------------------------------------- /next-i18next.config.js: -------------------------------------------------------------------------------- 1 | const path = require("path"); 2 | module.exports = { 3 | i18n: { 4 | locales: ["en", "de", "es", "ar", "he", "zh"], 5 | defaultLocale: "en", 6 | }, 7 | localePath: path.resolve("./public/locales"), 8 | }; 9 | -------------------------------------------------------------------------------- /next.config.js: -------------------------------------------------------------------------------- 1 | const { i18n } = require("./next-i18next.config"); 2 | const withPWA = require("next-pwa"); 3 | const runtimeCaching = require("next-pwa/cache"); 4 | module.exports = withPWA({ 5 | pwa: { 6 | disable: process.env.NODE_ENV === "development", 7 | dest: "public", 8 | runtimeCaching, 9 | }, 10 | i18n, 11 | }); 12 | -------------------------------------------------------------------------------- /postcss.config.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | plugins: { 3 | tailwindcss: {}, 4 | autoprefixer: {}, 5 | }, 6 | }; 7 | -------------------------------------------------------------------------------- /public/api/attribute.json: -------------------------------------------------------------------------------- 1 | { 2 | "id": 2, 3 | "name": "Color", 4 | "slug": "color", 5 | "values": [ 6 | { 7 | "id": 5, 8 | "value": "#e86c25" 9 | }, 10 | { 11 | "id": 6, 12 | "value": "#ffa5b4" 13 | }, 14 | { 15 | "id": 7, 16 | "value": "#8224e3" 17 | }, 18 | { 19 | "id": 8, 20 | "value": "#dd3333" 21 | }, 22 | { 23 | "id": 8, 24 | "value": "#ff3333" 25 | }, 26 | { 27 | "id": 8, 28 | "value": "#ee3333" 29 | }, 30 | { 31 | "id": 8, 32 | "value": "#fe3333" 33 | }, 34 | { 35 | "id": 8, 36 | "value": "#ef3333" 37 | } 38 | ] 39 | } 40 | -------------------------------------------------------------------------------- /public/api/attributes.json: -------------------------------------------------------------------------------- 1 | [ 2 | { 3 | "id": 1, 4 | "name": "Size", 5 | "slug": "size", 6 | "values": [ 7 | { 8 | "id": 1, 9 | "value": "S" 10 | }, 11 | { 12 | "id": 2, 13 | "value": "M" 14 | }, 15 | { 16 | "id": 3, 17 | "value": "L" 18 | }, 19 | { 20 | "id": 4, 21 | "value": "XL" 22 | } 23 | ] 24 | }, 25 | { 26 | "id": 2, 27 | "name": "Color", 28 | "slug": "color", 29 | "values": [ 30 | { 31 | "id": 5, 32 | "value": "#e86c25" 33 | }, 34 | { 35 | "id": 6, 36 | "value": "#ffa5b4" 37 | }, 38 | { 39 | "id": 7, 40 | "value": "#8224e3" 41 | }, 42 | { 43 | "id": 8, 44 | "value": "#dd3333" 45 | }, 46 | { 47 | "id": 8, 48 | "value": "#ff3333" 49 | }, 50 | { 51 | "id": 8, 52 | "value": "#ee3333" 53 | }, 54 | { 55 | "id": 8, 56 | "value": "#fe3333" 57 | }, 58 | { 59 | "id": 8, 60 | "value": "#ef3333" 61 | } 62 | ] 63 | } 64 | ] 65 | -------------------------------------------------------------------------------- /public/api/login.json: -------------------------------------------------------------------------------- 1 | { 2 | "token": "ienjnd883ndn283njd", 3 | "permissions": ["customer"] 4 | } 5 | -------------------------------------------------------------------------------- /public/api/order.json: -------------------------------------------------------------------------------- 1 | { 2 | "id": 1, 3 | "tracking_number": "XRQ4567", 4 | "customer": { 5 | "id": 1, 6 | "email": "customer@demo.com" 7 | }, 8 | "total": 132, 9 | "shipping_fee": 17, 10 | "payment_gateway": "cash on delivery", 11 | "products": [ 12 | { 13 | "id": 1, 14 | "name": "Nike Black - Black, S", 15 | "quantity": 10, 16 | "price": 5 17 | }, 18 | { 19 | "id": 1, 20 | "name": "Hermes Carlton London - Red, XL", 21 | "quantity": 10, 22 | "price": 15 23 | }, 24 | { 25 | "id": 1, 26 | "name": "Gucci Carlton UK, Green, M", 27 | "quantity": 5, 28 | "price": 25 29 | }, 30 | { 31 | "id": 1, 32 | "name": "Regular Fit Flannel Shirt, Blue, X", 33 | "quantity": 10, 34 | "price": 35 35 | } 36 | ], 37 | "note": "new order" 38 | } 39 | -------------------------------------------------------------------------------- /public/api/password_change_response.json: -------------------------------------------------------------------------------- 1 | { 2 | "data": { 3 | "success": true, 4 | "message": "Success" 5 | } 6 | } 7 | -------------------------------------------------------------------------------- /public/api/register.json: -------------------------------------------------------------------------------- 1 | { 2 | "data": { 3 | "token": "ienjnd883ndn283njd", 4 | "permissions": ["customer"] 5 | } 6 | } 7 | -------------------------------------------------------------------------------- /public/assets/images/app.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/harrypotter518/react-nextjs-ecommerce/26ab234413ee0d554bebd5d50893c722b8e73b66/public/assets/images/app.png -------------------------------------------------------------------------------- /public/assets/images/banner/banner-1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/harrypotter518/react-nextjs-ecommerce/26ab234413ee0d554bebd5d50893c722b8e73b66/public/assets/images/banner/banner-1.jpg -------------------------------------------------------------------------------- /public/assets/images/banner/banner-2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/harrypotter518/react-nextjs-ecommerce/26ab234413ee0d554bebd5d50893c722b8e73b66/public/assets/images/banner/banner-2.jpg -------------------------------------------------------------------------------- /public/assets/images/banner/banner-3.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/harrypotter518/react-nextjs-ecommerce/26ab234413ee0d554bebd5d50893c722b8e73b66/public/assets/images/banner/banner-3.jpg -------------------------------------------------------------------------------- /public/assets/images/banner/banner-4.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/harrypotter518/react-nextjs-ecommerce/26ab234413ee0d554bebd5d50893c722b8e73b66/public/assets/images/banner/banner-4.jpg -------------------------------------------------------------------------------- /public/assets/images/banner/banner-5.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/harrypotter518/react-nextjs-ecommerce/26ab234413ee0d554bebd5d50893c722b8e73b66/public/assets/images/banner/banner-5.jpg -------------------------------------------------------------------------------- /public/assets/images/banner/banner-6.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/harrypotter518/react-nextjs-ecommerce/26ab234413ee0d554bebd5d50893c722b8e73b66/public/assets/images/banner/banner-6.jpg -------------------------------------------------------------------------------- /public/assets/images/banner/banner-mobile-1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/harrypotter518/react-nextjs-ecommerce/26ab234413ee0d554bebd5d50893c722b8e73b66/public/assets/images/banner/banner-mobile-1.jpg -------------------------------------------------------------------------------- /public/assets/images/banner/banner-mobile-2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/harrypotter518/react-nextjs-ecommerce/26ab234413ee0d554bebd5d50893c722b8e73b66/public/assets/images/banner/banner-mobile-2.jpg -------------------------------------------------------------------------------- /public/assets/images/banner/banner-mobile-3.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/harrypotter518/react-nextjs-ecommerce/26ab234413ee0d554bebd5d50893c722b8e73b66/public/assets/images/banner/banner-mobile-3.jpg -------------------------------------------------------------------------------- /public/assets/images/banner/banner-mobile-4.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/harrypotter518/react-nextjs-ecommerce/26ab234413ee0d554bebd5d50893c722b8e73b66/public/assets/images/banner/banner-mobile-4.jpg -------------------------------------------------------------------------------- /public/assets/images/banner/banner-mobile-5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/harrypotter518/react-nextjs-ecommerce/26ab234413ee0d554bebd5d50893c722b8e73b66/public/assets/images/banner/banner-mobile-5.png -------------------------------------------------------------------------------- /public/assets/images/banner/banner-mobile-6.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/harrypotter518/react-nextjs-ecommerce/26ab234413ee0d554bebd5d50893c722b8e73b66/public/assets/images/banner/banner-mobile-6.png -------------------------------------------------------------------------------- /public/assets/images/banner/banner-sale-offer-reverse.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/harrypotter518/react-nextjs-ecommerce/26ab234413ee0d554bebd5d50893c722b8e73b66/public/assets/images/banner/banner-sale-offer-reverse.jpg -------------------------------------------------------------------------------- /public/assets/images/banner/banner-sale-offer.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/harrypotter518/react-nextjs-ecommerce/26ab234413ee0d554bebd5d50893c722b8e73b66/public/assets/images/banner/banner-sale-offer.jpg -------------------------------------------------------------------------------- /public/assets/images/banner/grid/banner-1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/harrypotter518/react-nextjs-ecommerce/26ab234413ee0d554bebd5d50893c722b8e73b66/public/assets/images/banner/grid/banner-1.jpg -------------------------------------------------------------------------------- /public/assets/images/banner/grid/banner-2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/harrypotter518/react-nextjs-ecommerce/26ab234413ee0d554bebd5d50893c722b8e73b66/public/assets/images/banner/grid/banner-2.jpg -------------------------------------------------------------------------------- /public/assets/images/banner/grid/banner-3.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/harrypotter518/react-nextjs-ecommerce/26ab234413ee0d554bebd5d50893c722b8e73b66/public/assets/images/banner/grid/banner-3.jpg -------------------------------------------------------------------------------- /public/assets/images/banner/grid/banner-mobile-1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/harrypotter518/react-nextjs-ecommerce/26ab234413ee0d554bebd5d50893c722b8e73b66/public/assets/images/banner/grid/banner-mobile-1.jpg -------------------------------------------------------------------------------- /public/assets/images/banner/grid/banner-mobile-2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/harrypotter518/react-nextjs-ecommerce/26ab234413ee0d554bebd5d50893c722b8e73b66/public/assets/images/banner/grid/banner-mobile-2.jpg -------------------------------------------------------------------------------- /public/assets/images/banner/grid/banner-mobile-3.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/harrypotter518/react-nextjs-ecommerce/26ab234413ee0d554bebd5d50893c722b8e73b66/public/assets/images/banner/grid/banner-mobile-3.jpg -------------------------------------------------------------------------------- /public/assets/images/banner/grid/small/banner-1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/harrypotter518/react-nextjs-ecommerce/26ab234413ee0d554bebd5d50893c722b8e73b66/public/assets/images/banner/grid/small/banner-1.jpg -------------------------------------------------------------------------------- /public/assets/images/banner/grid/small/banner-2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/harrypotter518/react-nextjs-ecommerce/26ab234413ee0d554bebd5d50893c722b8e73b66/public/assets/images/banner/grid/small/banner-2.jpg -------------------------------------------------------------------------------- /public/assets/images/banner/grid/small/banner-3.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/harrypotter518/react-nextjs-ecommerce/26ab234413ee0d554bebd5d50893c722b8e73b66/public/assets/images/banner/grid/small/banner-3.jpg -------------------------------------------------------------------------------- /public/assets/images/banner/grid/small/banner-mobile-1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/harrypotter518/react-nextjs-ecommerce/26ab234413ee0d554bebd5d50893c722b8e73b66/public/assets/images/banner/grid/small/banner-mobile-1.jpg -------------------------------------------------------------------------------- /public/assets/images/banner/grid/small/banner-mobile-2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/harrypotter518/react-nextjs-ecommerce/26ab234413ee0d554bebd5d50893c722b8e73b66/public/assets/images/banner/grid/small/banner-mobile-2.jpg -------------------------------------------------------------------------------- /public/assets/images/banner/grid/small/banner-mobile-3.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/harrypotter518/react-nextjs-ecommerce/26ab234413ee0d554bebd5d50893c722b8e73b66/public/assets/images/banner/grid/small/banner-mobile-3.jpg -------------------------------------------------------------------------------- /public/assets/images/banner/masonry/banner-1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/harrypotter518/react-nextjs-ecommerce/26ab234413ee0d554bebd5d50893c722b8e73b66/public/assets/images/banner/masonry/banner-1.jpg -------------------------------------------------------------------------------- /public/assets/images/banner/masonry/banner-2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/harrypotter518/react-nextjs-ecommerce/26ab234413ee0d554bebd5d50893c722b8e73b66/public/assets/images/banner/masonry/banner-2.jpg -------------------------------------------------------------------------------- /public/assets/images/banner/masonry/banner-3.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/harrypotter518/react-nextjs-ecommerce/26ab234413ee0d554bebd5d50893c722b8e73b66/public/assets/images/banner/masonry/banner-3.jpg -------------------------------------------------------------------------------- /public/assets/images/banner/masonry/banner-4.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/harrypotter518/react-nextjs-ecommerce/26ab234413ee0d554bebd5d50893c722b8e73b66/public/assets/images/banner/masonry/banner-4.jpg -------------------------------------------------------------------------------- /public/assets/images/banner/masonry/banner-5.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/harrypotter518/react-nextjs-ecommerce/26ab234413ee0d554bebd5d50893c722b8e73b66/public/assets/images/banner/masonry/banner-5.jpg -------------------------------------------------------------------------------- /public/assets/images/banner/masonry/banner-6.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/harrypotter518/react-nextjs-ecommerce/26ab234413ee0d554bebd5d50893c722b8e73b66/public/assets/images/banner/masonry/banner-6.jpg -------------------------------------------------------------------------------- /public/assets/images/banner/masonry/banner-mobile-1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/harrypotter518/react-nextjs-ecommerce/26ab234413ee0d554bebd5d50893c722b8e73b66/public/assets/images/banner/masonry/banner-mobile-1.jpg -------------------------------------------------------------------------------- /public/assets/images/banner/masonry/banner-mobile-2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/harrypotter518/react-nextjs-ecommerce/26ab234413ee0d554bebd5d50893c722b8e73b66/public/assets/images/banner/masonry/banner-mobile-2.jpg -------------------------------------------------------------------------------- /public/assets/images/banner/masonry/banner-mobile-3.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/harrypotter518/react-nextjs-ecommerce/26ab234413ee0d554bebd5d50893c722b8e73b66/public/assets/images/banner/masonry/banner-mobile-3.jpg -------------------------------------------------------------------------------- /public/assets/images/banner/masonry/banner-mobile-4.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/harrypotter518/react-nextjs-ecommerce/26ab234413ee0d554bebd5d50893c722b8e73b66/public/assets/images/banner/masonry/banner-mobile-4.jpg -------------------------------------------------------------------------------- /public/assets/images/banner/masonry/banner-mobile-5.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/harrypotter518/react-nextjs-ecommerce/26ab234413ee0d554bebd5d50893c722b8e73b66/public/assets/images/banner/masonry/banner-mobile-5.jpg -------------------------------------------------------------------------------- /public/assets/images/banner/masonry/banner-mobile-6.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/harrypotter518/react-nextjs-ecommerce/26ab234413ee0d554bebd5d50893c722b8e73b66/public/assets/images/banner/masonry/banner-mobile-6.jpg -------------------------------------------------------------------------------- /public/assets/images/banner/slider/banner-1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/harrypotter518/react-nextjs-ecommerce/26ab234413ee0d554bebd5d50893c722b8e73b66/public/assets/images/banner/slider/banner-1.jpg -------------------------------------------------------------------------------- /public/assets/images/banner/slider/banner-2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/harrypotter518/react-nextjs-ecommerce/26ab234413ee0d554bebd5d50893c722b8e73b66/public/assets/images/banner/slider/banner-2.jpg -------------------------------------------------------------------------------- /public/assets/images/banner/slider/banner-3.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/harrypotter518/react-nextjs-ecommerce/26ab234413ee0d554bebd5d50893c722b8e73b66/public/assets/images/banner/slider/banner-3.jpg -------------------------------------------------------------------------------- /public/assets/images/banner/slider/mobile/banner-1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/harrypotter518/react-nextjs-ecommerce/26ab234413ee0d554bebd5d50893c722b8e73b66/public/assets/images/banner/slider/mobile/banner-1.jpg -------------------------------------------------------------------------------- /public/assets/images/banner/slider/mobile/banner-2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/harrypotter518/react-nextjs-ecommerce/26ab234413ee0d554bebd5d50893c722b8e73b66/public/assets/images/banner/slider/mobile/banner-2.jpg -------------------------------------------------------------------------------- /public/assets/images/banner/slider/mobile/banner-3.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/harrypotter518/react-nextjs-ecommerce/26ab234413ee0d554bebd5d50893c722b8e73b66/public/assets/images/banner/slider/mobile/banner-3.jpg -------------------------------------------------------------------------------- /public/assets/images/banner/small/banner-1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/harrypotter518/react-nextjs-ecommerce/26ab234413ee0d554bebd5d50893c722b8e73b66/public/assets/images/banner/small/banner-1.jpg -------------------------------------------------------------------------------- /public/assets/images/banner/small/banner-2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/harrypotter518/react-nextjs-ecommerce/26ab234413ee0d554bebd5d50893c722b8e73b66/public/assets/images/banner/small/banner-2.jpg -------------------------------------------------------------------------------- /public/assets/images/banner/small/banner-3.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/harrypotter518/react-nextjs-ecommerce/26ab234413ee0d554bebd5d50893c722b8e73b66/public/assets/images/banner/small/banner-3.jpg -------------------------------------------------------------------------------- /public/assets/images/banner/small/banner-mobile-1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/harrypotter518/react-nextjs-ecommerce/26ab234413ee0d554bebd5d50893c722b8e73b66/public/assets/images/banner/small/banner-mobile-1.jpg -------------------------------------------------------------------------------- /public/assets/images/banner/small/banner-mobile-2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/harrypotter518/react-nextjs-ecommerce/26ab234413ee0d554bebd5d50893c722b8e73b66/public/assets/images/banner/small/banner-mobile-2.jpg -------------------------------------------------------------------------------- /public/assets/images/banner/small/banner-mobile-3.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/harrypotter518/react-nextjs-ecommerce/26ab234413ee0d554bebd5d50893c722b8e73b66/public/assets/images/banner/small/banner-mobile-3.jpg -------------------------------------------------------------------------------- /public/assets/images/brands/blaze-fashion.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/harrypotter518/react-nextjs-ecommerce/26ab234413ee0d554bebd5d50893c722b8e73b66/public/assets/images/brands/blaze-fashion.png -------------------------------------------------------------------------------- /public/assets/images/brands/club-shoes.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/harrypotter518/react-nextjs-ecommerce/26ab234413ee0d554bebd5d50893c722b8e73b66/public/assets/images/brands/club-shoes.png -------------------------------------------------------------------------------- /public/assets/images/brands/elegance.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/harrypotter518/react-nextjs-ecommerce/26ab234413ee0d554bebd5d50893c722b8e73b66/public/assets/images/brands/elegance.png -------------------------------------------------------------------------------- /public/assets/images/brands/fashadil.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/harrypotter518/react-nextjs-ecommerce/26ab234413ee0d554bebd5d50893c722b8e73b66/public/assets/images/brands/fashadil.png -------------------------------------------------------------------------------- /public/assets/images/brands/fusion.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/harrypotter518/react-nextjs-ecommerce/26ab234413ee0d554bebd5d50893c722b8e73b66/public/assets/images/brands/fusion.png -------------------------------------------------------------------------------- /public/assets/images/brands/grid/blaze-fashion-bg.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/harrypotter518/react-nextjs-ecommerce/26ab234413ee0d554bebd5d50893c722b8e73b66/public/assets/images/brands/grid/blaze-fashion-bg.jpg -------------------------------------------------------------------------------- /public/assets/images/brands/grid/blaze-fashion.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/harrypotter518/react-nextjs-ecommerce/26ab234413ee0d554bebd5d50893c722b8e73b66/public/assets/images/brands/grid/blaze-fashion.png -------------------------------------------------------------------------------- /public/assets/images/brands/grid/clothingegy-bg.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/harrypotter518/react-nextjs-ecommerce/26ab234413ee0d554bebd5d50893c722b8e73b66/public/assets/images/brands/grid/clothingegy-bg.jpg -------------------------------------------------------------------------------- /public/assets/images/brands/grid/clothingegy.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/harrypotter518/react-nextjs-ecommerce/26ab234413ee0d554bebd5d50893c722b8e73b66/public/assets/images/brands/grid/clothingegy.png -------------------------------------------------------------------------------- /public/assets/images/brands/grid/clothingtastic-bg.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/harrypotter518/react-nextjs-ecommerce/26ab234413ee0d554bebd5d50893c722b8e73b66/public/assets/images/brands/grid/clothingtastic-bg.jpg -------------------------------------------------------------------------------- /public/assets/images/brands/grid/clothingtastic.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/harrypotter518/react-nextjs-ecommerce/26ab234413ee0d554bebd5d50893c722b8e73b66/public/assets/images/brands/grid/clothingtastic.png -------------------------------------------------------------------------------- /public/assets/images/brands/grid/club-shoes-bg.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/harrypotter518/react-nextjs-ecommerce/26ab234413ee0d554bebd5d50893c722b8e73b66/public/assets/images/brands/grid/club-shoes-bg.jpg -------------------------------------------------------------------------------- /public/assets/images/brands/grid/club-shoes.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/harrypotter518/react-nextjs-ecommerce/26ab234413ee0d554bebd5d50893c722b8e73b66/public/assets/images/brands/grid/club-shoes.png -------------------------------------------------------------------------------- /public/assets/images/brands/grid/elegance-bg.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/harrypotter518/react-nextjs-ecommerce/26ab234413ee0d554bebd5d50893c722b8e73b66/public/assets/images/brands/grid/elegance-bg.jpg -------------------------------------------------------------------------------- /public/assets/images/brands/grid/elegance.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/harrypotter518/react-nextjs-ecommerce/26ab234413ee0d554bebd5d50893c722b8e73b66/public/assets/images/brands/grid/elegance.png -------------------------------------------------------------------------------- /public/assets/images/brands/grid/fashadil-bg.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/harrypotter518/react-nextjs-ecommerce/26ab234413ee0d554bebd5d50893c722b8e73b66/public/assets/images/brands/grid/fashadil-bg.jpg -------------------------------------------------------------------------------- /public/assets/images/brands/grid/fashadil.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/harrypotter518/react-nextjs-ecommerce/26ab234413ee0d554bebd5d50893c722b8e73b66/public/assets/images/brands/grid/fashadil.png -------------------------------------------------------------------------------- /public/assets/images/brands/grid/fashnetic-bg.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/harrypotter518/react-nextjs-ecommerce/26ab234413ee0d554bebd5d50893c722b8e73b66/public/assets/images/brands/grid/fashnetic-bg.jpg -------------------------------------------------------------------------------- /public/assets/images/brands/grid/fashnetic.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/harrypotter518/react-nextjs-ecommerce/26ab234413ee0d554bebd5d50893c722b8e73b66/public/assets/images/brands/grid/fashnetic.png -------------------------------------------------------------------------------- /public/assets/images/brands/grid/fusion-bg.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/harrypotter518/react-nextjs-ecommerce/26ab234413ee0d554bebd5d50893c722b8e73b66/public/assets/images/brands/grid/fusion-bg.jpg -------------------------------------------------------------------------------- /public/assets/images/brands/grid/fusion.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/harrypotter518/react-nextjs-ecommerce/26ab234413ee0d554bebd5d50893c722b8e73b66/public/assets/images/brands/grid/fusion.png -------------------------------------------------------------------------------- /public/assets/images/brands/grid/hoppister-bg.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/harrypotter518/react-nextjs-ecommerce/26ab234413ee0d554bebd5d50893c722b8e73b66/public/assets/images/brands/grid/hoppister-bg.jpg -------------------------------------------------------------------------------- /public/assets/images/brands/grid/hoppister.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/harrypotter518/react-nextjs-ecommerce/26ab234413ee0d554bebd5d50893c722b8e73b66/public/assets/images/brands/grid/hoppister.png -------------------------------------------------------------------------------- /public/assets/images/brands/grid/hunter-shoes-bg.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/harrypotter518/react-nextjs-ecommerce/26ab234413ee0d554bebd5d50893c722b8e73b66/public/assets/images/brands/grid/hunter-shoes-bg.jpg -------------------------------------------------------------------------------- /public/assets/images/brands/grid/hunter-shoes.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/harrypotter518/react-nextjs-ecommerce/26ab234413ee0d554bebd5d50893c722b8e73b66/public/assets/images/brands/grid/hunter-shoes.png -------------------------------------------------------------------------------- /public/assets/images/brands/grid/pop-clothing-bg.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/harrypotter518/react-nextjs-ecommerce/26ab234413ee0d554bebd5d50893c722b8e73b66/public/assets/images/brands/grid/pop-clothing-bg.jpg -------------------------------------------------------------------------------- /public/assets/images/brands/grid/pop-clothing.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/harrypotter518/react-nextjs-ecommerce/26ab234413ee0d554bebd5d50893c722b8e73b66/public/assets/images/brands/grid/pop-clothing.png -------------------------------------------------------------------------------- /public/assets/images/brands/grid/sholy-bg.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/harrypotter518/react-nextjs-ecommerce/26ab234413ee0d554bebd5d50893c722b8e73b66/public/assets/images/brands/grid/sholy-bg.jpg -------------------------------------------------------------------------------- /public/assets/images/brands/grid/sholy.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/harrypotter518/react-nextjs-ecommerce/26ab234413ee0d554bebd5d50893c722b8e73b66/public/assets/images/brands/grid/sholy.png -------------------------------------------------------------------------------- /public/assets/images/brands/grid/shoozly-bg.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/harrypotter518/react-nextjs-ecommerce/26ab234413ee0d554bebd5d50893c722b8e73b66/public/assets/images/brands/grid/shoozly-bg.jpg -------------------------------------------------------------------------------- /public/assets/images/brands/grid/shoozly.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/harrypotter518/react-nextjs-ecommerce/26ab234413ee0d554bebd5d50893c722b8e73b66/public/assets/images/brands/grid/shoozly.png -------------------------------------------------------------------------------- /public/assets/images/brands/grid/shosio-bg.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/harrypotter518/react-nextjs-ecommerce/26ab234413ee0d554bebd5d50893c722b8e73b66/public/assets/images/brands/grid/shosio-bg.jpg -------------------------------------------------------------------------------- /public/assets/images/brands/grid/shosio.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/harrypotter518/react-nextjs-ecommerce/26ab234413ee0d554bebd5d50893c722b8e73b66/public/assets/images/brands/grid/shosio.png -------------------------------------------------------------------------------- /public/assets/images/brands/grid/shovia-bg.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/harrypotter518/react-nextjs-ecommerce/26ab234413ee0d554bebd5d50893c722b8e73b66/public/assets/images/brands/grid/shovia-bg.jpg -------------------------------------------------------------------------------- /public/assets/images/brands/grid/shovia.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/harrypotter518/react-nextjs-ecommerce/26ab234413ee0d554bebd5d50893c722b8e73b66/public/assets/images/brands/grid/shovia.png -------------------------------------------------------------------------------- /public/assets/images/brands/grid/tyrant-bg.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/harrypotter518/react-nextjs-ecommerce/26ab234413ee0d554bebd5d50893c722b8e73b66/public/assets/images/brands/grid/tyrant-bg.jpg -------------------------------------------------------------------------------- /public/assets/images/brands/grid/tyrant.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/harrypotter518/react-nextjs-ecommerce/26ab234413ee0d554bebd5d50893c722b8e73b66/public/assets/images/brands/grid/tyrant.png -------------------------------------------------------------------------------- /public/assets/images/brands/hoppister.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/harrypotter518/react-nextjs-ecommerce/26ab234413ee0d554bebd5d50893c722b8e73b66/public/assets/images/brands/hoppister.png -------------------------------------------------------------------------------- /public/assets/images/brands/hunter-shoes.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/harrypotter518/react-nextjs-ecommerce/26ab234413ee0d554bebd5d50893c722b8e73b66/public/assets/images/brands/hunter-shoes.png -------------------------------------------------------------------------------- /public/assets/images/brands/shovia.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/harrypotter518/react-nextjs-ecommerce/26ab234413ee0d554bebd5d50893c722b8e73b66/public/assets/images/brands/shovia.png -------------------------------------------------------------------------------- /public/assets/images/category/bags.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/harrypotter518/react-nextjs-ecommerce/26ab234413ee0d554bebd5d50893c722b8e73b66/public/assets/images/category/bags.jpg -------------------------------------------------------------------------------- /public/assets/images/category/kid.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/harrypotter518/react-nextjs-ecommerce/26ab234413ee0d554bebd5d50893c722b8e73b66/public/assets/images/category/kid.jpg -------------------------------------------------------------------------------- /public/assets/images/category/man.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/harrypotter518/react-nextjs-ecommerce/26ab234413ee0d554bebd5d50893c722b8e73b66/public/assets/images/category/man.jpg -------------------------------------------------------------------------------- /public/assets/images/category/sneakers.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/harrypotter518/react-nextjs-ecommerce/26ab234413ee0d554bebd5d50893c722b8e73b66/public/assets/images/category/sneakers.jpg -------------------------------------------------------------------------------- /public/assets/images/category/sports.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/harrypotter518/react-nextjs-ecommerce/26ab234413ee0d554bebd5d50893c722b8e73b66/public/assets/images/category/sports.jpg -------------------------------------------------------------------------------- /public/assets/images/category/sunglass.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/harrypotter518/react-nextjs-ecommerce/26ab234413ee0d554bebd5d50893c722b8e73b66/public/assets/images/category/sunglass.jpg -------------------------------------------------------------------------------- /public/assets/images/category/two/bags/1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/harrypotter518/react-nextjs-ecommerce/26ab234413ee0d554bebd5d50893c722b8e73b66/public/assets/images/category/two/bags/1.png -------------------------------------------------------------------------------- /public/assets/images/category/two/bags/2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/harrypotter518/react-nextjs-ecommerce/26ab234413ee0d554bebd5d50893c722b8e73b66/public/assets/images/category/two/bags/2.png -------------------------------------------------------------------------------- /public/assets/images/category/two/bags/3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/harrypotter518/react-nextjs-ecommerce/26ab234413ee0d554bebd5d50893c722b8e73b66/public/assets/images/category/two/bags/3.png -------------------------------------------------------------------------------- /public/assets/images/category/two/jewellers/1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/harrypotter518/react-nextjs-ecommerce/26ab234413ee0d554bebd5d50893c722b8e73b66/public/assets/images/category/two/jewellers/1.png -------------------------------------------------------------------------------- /public/assets/images/category/two/jewellers/2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/harrypotter518/react-nextjs-ecommerce/26ab234413ee0d554bebd5d50893c722b8e73b66/public/assets/images/category/two/jewellers/2.png -------------------------------------------------------------------------------- /public/assets/images/category/two/jewellers/3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/harrypotter518/react-nextjs-ecommerce/26ab234413ee0d554bebd5d50893c722b8e73b66/public/assets/images/category/two/jewellers/3.png -------------------------------------------------------------------------------- /public/assets/images/category/two/shoes/1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/harrypotter518/react-nextjs-ecommerce/26ab234413ee0d554bebd5d50893c722b8e73b66/public/assets/images/category/two/shoes/1.png -------------------------------------------------------------------------------- /public/assets/images/category/two/shoes/2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/harrypotter518/react-nextjs-ecommerce/26ab234413ee0d554bebd5d50893c722b8e73b66/public/assets/images/category/two/shoes/2.png -------------------------------------------------------------------------------- /public/assets/images/category/two/shoes/3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/harrypotter518/react-nextjs-ecommerce/26ab234413ee0d554bebd5d50893c722b8e73b66/public/assets/images/category/two/shoes/3.png -------------------------------------------------------------------------------- /public/assets/images/category/two/sun-glasses/1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/harrypotter518/react-nextjs-ecommerce/26ab234413ee0d554bebd5d50893c722b8e73b66/public/assets/images/category/two/sun-glasses/1.png -------------------------------------------------------------------------------- /public/assets/images/category/two/sun-glasses/2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/harrypotter518/react-nextjs-ecommerce/26ab234413ee0d554bebd5d50893c722b8e73b66/public/assets/images/category/two/sun-glasses/2.png -------------------------------------------------------------------------------- /public/assets/images/category/two/sun-glasses/3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/harrypotter518/react-nextjs-ecommerce/26ab234413ee0d554bebd5d50893c722b8e73b66/public/assets/images/category/two/sun-glasses/3.png -------------------------------------------------------------------------------- /public/assets/images/category/two/wallets/1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/harrypotter518/react-nextjs-ecommerce/26ab234413ee0d554bebd5d50893c722b8e73b66/public/assets/images/category/two/wallets/1.png -------------------------------------------------------------------------------- /public/assets/images/category/two/wallets/2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/harrypotter518/react-nextjs-ecommerce/26ab234413ee0d554bebd5d50893c722b8e73b66/public/assets/images/category/two/wallets/2.png -------------------------------------------------------------------------------- /public/assets/images/category/two/wallets/3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/harrypotter518/react-nextjs-ecommerce/26ab234413ee0d554bebd5d50893c722b8e73b66/public/assets/images/category/two/wallets/3.png -------------------------------------------------------------------------------- /public/assets/images/category/two/watches/1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/harrypotter518/react-nextjs-ecommerce/26ab234413ee0d554bebd5d50893c722b8e73b66/public/assets/images/category/two/watches/1.png -------------------------------------------------------------------------------- /public/assets/images/category/two/watches/2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/harrypotter518/react-nextjs-ecommerce/26ab234413ee0d554bebd5d50893c722b8e73b66/public/assets/images/category/two/watches/2.png -------------------------------------------------------------------------------- /public/assets/images/category/two/watches/3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/harrypotter518/react-nextjs-ecommerce/26ab234413ee0d554bebd5d50893c722b8e73b66/public/assets/images/category/two/watches/3.png -------------------------------------------------------------------------------- /public/assets/images/category/watch.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/harrypotter518/react-nextjs-ecommerce/26ab234413ee0d554bebd5d50893c722b8e73b66/public/assets/images/category/watch.jpg -------------------------------------------------------------------------------- /public/assets/images/category/woman.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/harrypotter518/react-nextjs-ecommerce/26ab234413ee0d554bebd5d50893c722b8e73b66/public/assets/images/category/woman.jpg -------------------------------------------------------------------------------- /public/assets/images/checkout/01.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/harrypotter518/react-nextjs-ecommerce/26ab234413ee0d554bebd5d50893c722b8e73b66/public/assets/images/checkout/01.png -------------------------------------------------------------------------------- /public/assets/images/checkout/02.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/harrypotter518/react-nextjs-ecommerce/26ab234413ee0d554bebd5d50893c722b8e73b66/public/assets/images/checkout/02.png -------------------------------------------------------------------------------- /public/assets/images/checkout/03.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/harrypotter518/react-nextjs-ecommerce/26ab234413ee0d554bebd5d50893c722b8e73b66/public/assets/images/checkout/03.png -------------------------------------------------------------------------------- /public/assets/images/collection/1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/harrypotter518/react-nextjs-ecommerce/26ab234413ee0d554bebd5d50893c722b8e73b66/public/assets/images/collection/1.jpg -------------------------------------------------------------------------------- /public/assets/images/collection/2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/harrypotter518/react-nextjs-ecommerce/26ab234413ee0d554bebd5d50893c722b8e73b66/public/assets/images/collection/2.jpg -------------------------------------------------------------------------------- /public/assets/images/collection/3.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/harrypotter518/react-nextjs-ecommerce/26ab234413ee0d554bebd5d50893c722b8e73b66/public/assets/images/collection/3.jpg -------------------------------------------------------------------------------- /public/assets/images/exclusive/men.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/harrypotter518/react-nextjs-ecommerce/26ab234413ee0d554bebd5d50893c722b8e73b66/public/assets/images/exclusive/men.png -------------------------------------------------------------------------------- /public/assets/images/exclusive/women.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/harrypotter518/react-nextjs-ecommerce/26ab234413ee0d554bebd5d50893c722b8e73b66/public/assets/images/exclusive/women.png -------------------------------------------------------------------------------- /public/assets/images/hero/banner-1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/harrypotter518/react-nextjs-ecommerce/26ab234413ee0d554bebd5d50893c722b8e73b66/public/assets/images/hero/banner-1.jpg -------------------------------------------------------------------------------- /public/assets/images/hero/banner-2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/harrypotter518/react-nextjs-ecommerce/26ab234413ee0d554bebd5d50893c722b8e73b66/public/assets/images/hero/banner-2.jpg -------------------------------------------------------------------------------- /public/assets/images/hero/banner-3.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/harrypotter518/react-nextjs-ecommerce/26ab234413ee0d554bebd5d50893c722b8e73b66/public/assets/images/hero/banner-3.jpg -------------------------------------------------------------------------------- /public/assets/images/hero/banner-mobile-1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/harrypotter518/react-nextjs-ecommerce/26ab234413ee0d554bebd5d50893c722b8e73b66/public/assets/images/hero/banner-mobile-1.jpg -------------------------------------------------------------------------------- /public/assets/images/hero/banner-mobile-2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/harrypotter518/react-nextjs-ecommerce/26ab234413ee0d554bebd5d50893c722b8e73b66/public/assets/images/hero/banner-mobile-2.jpg -------------------------------------------------------------------------------- /public/assets/images/hero/banner-mobile-3.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/harrypotter518/react-nextjs-ecommerce/26ab234413ee0d554bebd5d50893c722b8e73b66/public/assets/images/hero/banner-mobile-3.jpg -------------------------------------------------------------------------------- /public/assets/images/hero/two/banner-1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/harrypotter518/react-nextjs-ecommerce/26ab234413ee0d554bebd5d50893c722b8e73b66/public/assets/images/hero/two/banner-1.jpg -------------------------------------------------------------------------------- /public/assets/images/hero/two/banner-2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/harrypotter518/react-nextjs-ecommerce/26ab234413ee0d554bebd5d50893c722b8e73b66/public/assets/images/hero/two/banner-2.jpg -------------------------------------------------------------------------------- /public/assets/images/hero/two/banner-3.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/harrypotter518/react-nextjs-ecommerce/26ab234413ee0d554bebd5d50893c722b8e73b66/public/assets/images/hero/two/banner-3.jpg -------------------------------------------------------------------------------- /public/assets/images/hero/two/banner-mobile-1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/harrypotter518/react-nextjs-ecommerce/26ab234413ee0d554bebd5d50893c722b8e73b66/public/assets/images/hero/two/banner-mobile-1.jpg -------------------------------------------------------------------------------- /public/assets/images/hero/two/banner-mobile-2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/harrypotter518/react-nextjs-ecommerce/26ab234413ee0d554bebd5d50893c722b8e73b66/public/assets/images/hero/two/banner-mobile-2.jpg -------------------------------------------------------------------------------- /public/assets/images/hero/two/banner-mobile-3.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/harrypotter518/react-nextjs-ecommerce/26ab234413ee0d554bebd5d50893c722b8e73b66/public/assets/images/hero/two/banner-mobile-3.jpg -------------------------------------------------------------------------------- /public/assets/images/instagram/1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/harrypotter518/react-nextjs-ecommerce/26ab234413ee0d554bebd5d50893c722b8e73b66/public/assets/images/instagram/1.jpg -------------------------------------------------------------------------------- /public/assets/images/instagram/2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/harrypotter518/react-nextjs-ecommerce/26ab234413ee0d554bebd5d50893c722b8e73b66/public/assets/images/instagram/2.jpg -------------------------------------------------------------------------------- /public/assets/images/instagram/3.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/harrypotter518/react-nextjs-ecommerce/26ab234413ee0d554bebd5d50893c722b8e73b66/public/assets/images/instagram/3.jpg -------------------------------------------------------------------------------- /public/assets/images/instagram/4.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/harrypotter518/react-nextjs-ecommerce/26ab234413ee0d554bebd5d50893c722b8e73b66/public/assets/images/instagram/4.jpg -------------------------------------------------------------------------------- /public/assets/images/instagram/5.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/harrypotter518/react-nextjs-ecommerce/26ab234413ee0d554bebd5d50893c722b8e73b66/public/assets/images/instagram/5.jpg -------------------------------------------------------------------------------- /public/assets/images/instagram/6.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/harrypotter518/react-nextjs-ecommerce/26ab234413ee0d554bebd5d50893c722b8e73b66/public/assets/images/instagram/6.jpg -------------------------------------------------------------------------------- /public/assets/images/map-image.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/harrypotter518/react-nextjs-ecommerce/26ab234413ee0d554bebd5d50893c722b8e73b66/public/assets/images/map-image.jpg -------------------------------------------------------------------------------- /public/assets/images/newsletter.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/harrypotter518/react-nextjs-ecommerce/26ab234413ee0d554bebd5d50893c722b8e73b66/public/assets/images/newsletter.jpg -------------------------------------------------------------------------------- /public/assets/images/og-image-01.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/harrypotter518/react-nextjs-ecommerce/26ab234413ee0d554bebd5d50893c722b8e73b66/public/assets/images/og-image-01.png -------------------------------------------------------------------------------- /public/assets/images/og-image-02.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/harrypotter518/react-nextjs-ecommerce/26ab234413ee0d554bebd5d50893c722b8e73b66/public/assets/images/og-image-02.png -------------------------------------------------------------------------------- /public/assets/images/page-header.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/harrypotter518/react-nextjs-ecommerce/26ab234413ee0d554bebd5d50893c722b8e73b66/public/assets/images/page-header.jpg -------------------------------------------------------------------------------- /public/assets/images/products/featured/1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/harrypotter518/react-nextjs-ecommerce/26ab234413ee0d554bebd5d50893c722b8e73b66/public/assets/images/products/featured/1.png -------------------------------------------------------------------------------- /public/assets/images/products/featured/2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/harrypotter518/react-nextjs-ecommerce/26ab234413ee0d554bebd5d50893c722b8e73b66/public/assets/images/products/featured/2.png -------------------------------------------------------------------------------- /public/assets/images/products/featured/3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/harrypotter518/react-nextjs-ecommerce/26ab234413ee0d554bebd5d50893c722b8e73b66/public/assets/images/products/featured/3.png -------------------------------------------------------------------------------- /public/assets/images/products/featured/4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/harrypotter518/react-nextjs-ecommerce/26ab234413ee0d554bebd5d50893c722b8e73b66/public/assets/images/products/featured/4.png -------------------------------------------------------------------------------- /public/assets/images/products/featured/5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/harrypotter518/react-nextjs-ecommerce/26ab234413ee0d554bebd5d50893c722b8e73b66/public/assets/images/products/featured/5.png -------------------------------------------------------------------------------- /public/assets/images/products/p-1-m.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/harrypotter518/react-nextjs-ecommerce/26ab234413ee0d554bebd5d50893c722b8e73b66/public/assets/images/products/p-1-m.png -------------------------------------------------------------------------------- /public/assets/images/products/p-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/harrypotter518/react-nextjs-ecommerce/26ab234413ee0d554bebd5d50893c722b8e73b66/public/assets/images/products/p-1.png -------------------------------------------------------------------------------- /public/assets/images/products/p-10-m.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/harrypotter518/react-nextjs-ecommerce/26ab234413ee0d554bebd5d50893c722b8e73b66/public/assets/images/products/p-10-m.png -------------------------------------------------------------------------------- /public/assets/images/products/p-10.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/harrypotter518/react-nextjs-ecommerce/26ab234413ee0d554bebd5d50893c722b8e73b66/public/assets/images/products/p-10.png -------------------------------------------------------------------------------- /public/assets/images/products/p-11-m.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/harrypotter518/react-nextjs-ecommerce/26ab234413ee0d554bebd5d50893c722b8e73b66/public/assets/images/products/p-11-m.png -------------------------------------------------------------------------------- /public/assets/images/products/p-11-xs.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/harrypotter518/react-nextjs-ecommerce/26ab234413ee0d554bebd5d50893c722b8e73b66/public/assets/images/products/p-11-xs.png -------------------------------------------------------------------------------- /public/assets/images/products/p-11.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/harrypotter518/react-nextjs-ecommerce/26ab234413ee0d554bebd5d50893c722b8e73b66/public/assets/images/products/p-11.png -------------------------------------------------------------------------------- /public/assets/images/products/p-12-m.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/harrypotter518/react-nextjs-ecommerce/26ab234413ee0d554bebd5d50893c722b8e73b66/public/assets/images/products/p-12-m.png -------------------------------------------------------------------------------- /public/assets/images/products/p-12-md.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/harrypotter518/react-nextjs-ecommerce/26ab234413ee0d554bebd5d50893c722b8e73b66/public/assets/images/products/p-12-md.png -------------------------------------------------------------------------------- /public/assets/images/products/p-13-m.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/harrypotter518/react-nextjs-ecommerce/26ab234413ee0d554bebd5d50893c722b8e73b66/public/assets/images/products/p-13-m.png -------------------------------------------------------------------------------- /public/assets/images/products/p-13.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/harrypotter518/react-nextjs-ecommerce/26ab234413ee0d554bebd5d50893c722b8e73b66/public/assets/images/products/p-13.png -------------------------------------------------------------------------------- /public/assets/images/products/p-14-m.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/harrypotter518/react-nextjs-ecommerce/26ab234413ee0d554bebd5d50893c722b8e73b66/public/assets/images/products/p-14-m.png -------------------------------------------------------------------------------- /public/assets/images/products/p-14-md.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/harrypotter518/react-nextjs-ecommerce/26ab234413ee0d554bebd5d50893c722b8e73b66/public/assets/images/products/p-14-md.png -------------------------------------------------------------------------------- /public/assets/images/products/p-14-xs.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/harrypotter518/react-nextjs-ecommerce/26ab234413ee0d554bebd5d50893c722b8e73b66/public/assets/images/products/p-14-xs.png -------------------------------------------------------------------------------- /public/assets/images/products/p-14.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/harrypotter518/react-nextjs-ecommerce/26ab234413ee0d554bebd5d50893c722b8e73b66/public/assets/images/products/p-14.png -------------------------------------------------------------------------------- /public/assets/images/products/p-15-lg.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/harrypotter518/react-nextjs-ecommerce/26ab234413ee0d554bebd5d50893c722b8e73b66/public/assets/images/products/p-15-lg.png -------------------------------------------------------------------------------- /public/assets/images/products/p-15-m.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/harrypotter518/react-nextjs-ecommerce/26ab234413ee0d554bebd5d50893c722b8e73b66/public/assets/images/products/p-15-m.png -------------------------------------------------------------------------------- /public/assets/images/products/p-15-xs.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/harrypotter518/react-nextjs-ecommerce/26ab234413ee0d554bebd5d50893c722b8e73b66/public/assets/images/products/p-15-xs.png -------------------------------------------------------------------------------- /public/assets/images/products/p-15.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/harrypotter518/react-nextjs-ecommerce/26ab234413ee0d554bebd5d50893c722b8e73b66/public/assets/images/products/p-15.png -------------------------------------------------------------------------------- /public/assets/images/products/p-16-lg.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/harrypotter518/react-nextjs-ecommerce/26ab234413ee0d554bebd5d50893c722b8e73b66/public/assets/images/products/p-16-lg.png -------------------------------------------------------------------------------- /public/assets/images/products/p-16-m.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/harrypotter518/react-nextjs-ecommerce/26ab234413ee0d554bebd5d50893c722b8e73b66/public/assets/images/products/p-16-m.png -------------------------------------------------------------------------------- /public/assets/images/products/p-16-md.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/harrypotter518/react-nextjs-ecommerce/26ab234413ee0d554bebd5d50893c722b8e73b66/public/assets/images/products/p-16-md.png -------------------------------------------------------------------------------- /public/assets/images/products/p-16-xs.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/harrypotter518/react-nextjs-ecommerce/26ab234413ee0d554bebd5d50893c722b8e73b66/public/assets/images/products/p-16-xs.png -------------------------------------------------------------------------------- /public/assets/images/products/p-16.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/harrypotter518/react-nextjs-ecommerce/26ab234413ee0d554bebd5d50893c722b8e73b66/public/assets/images/products/p-16.png -------------------------------------------------------------------------------- /public/assets/images/products/p-17-m.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/harrypotter518/react-nextjs-ecommerce/26ab234413ee0d554bebd5d50893c722b8e73b66/public/assets/images/products/p-17-m.png -------------------------------------------------------------------------------- /public/assets/images/products/p-17.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/harrypotter518/react-nextjs-ecommerce/26ab234413ee0d554bebd5d50893c722b8e73b66/public/assets/images/products/p-17.png -------------------------------------------------------------------------------- /public/assets/images/products/p-18-m.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/harrypotter518/react-nextjs-ecommerce/26ab234413ee0d554bebd5d50893c722b8e73b66/public/assets/images/products/p-18-m.png -------------------------------------------------------------------------------- /public/assets/images/products/p-18.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/harrypotter518/react-nextjs-ecommerce/26ab234413ee0d554bebd5d50893c722b8e73b66/public/assets/images/products/p-18.png -------------------------------------------------------------------------------- /public/assets/images/products/p-19-m.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/harrypotter518/react-nextjs-ecommerce/26ab234413ee0d554bebd5d50893c722b8e73b66/public/assets/images/products/p-19-m.png -------------------------------------------------------------------------------- /public/assets/images/products/p-19.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/harrypotter518/react-nextjs-ecommerce/26ab234413ee0d554bebd5d50893c722b8e73b66/public/assets/images/products/p-19.png -------------------------------------------------------------------------------- /public/assets/images/products/p-2-m.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/harrypotter518/react-nextjs-ecommerce/26ab234413ee0d554bebd5d50893c722b8e73b66/public/assets/images/products/p-2-m.png -------------------------------------------------------------------------------- /public/assets/images/products/p-2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/harrypotter518/react-nextjs-ecommerce/26ab234413ee0d554bebd5d50893c722b8e73b66/public/assets/images/products/p-2.png -------------------------------------------------------------------------------- /public/assets/images/products/p-20-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/harrypotter518/react-nextjs-ecommerce/26ab234413ee0d554bebd5d50893c722b8e73b66/public/assets/images/products/p-20-1.png -------------------------------------------------------------------------------- /public/assets/images/products/p-20-2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/harrypotter518/react-nextjs-ecommerce/26ab234413ee0d554bebd5d50893c722b8e73b66/public/assets/images/products/p-20-2.png -------------------------------------------------------------------------------- /public/assets/images/products/p-20-3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/harrypotter518/react-nextjs-ecommerce/26ab234413ee0d554bebd5d50893c722b8e73b66/public/assets/images/products/p-20-3.png -------------------------------------------------------------------------------- /public/assets/images/products/p-20-4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/harrypotter518/react-nextjs-ecommerce/26ab234413ee0d554bebd5d50893c722b8e73b66/public/assets/images/products/p-20-4.png -------------------------------------------------------------------------------- /public/assets/images/products/p-20-m.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/harrypotter518/react-nextjs-ecommerce/26ab234413ee0d554bebd5d50893c722b8e73b66/public/assets/images/products/p-20-m.png -------------------------------------------------------------------------------- /public/assets/images/products/p-20-s.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/harrypotter518/react-nextjs-ecommerce/26ab234413ee0d554bebd5d50893c722b8e73b66/public/assets/images/products/p-20-s.png -------------------------------------------------------------------------------- /public/assets/images/products/p-20.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/harrypotter518/react-nextjs-ecommerce/26ab234413ee0d554bebd5d50893c722b8e73b66/public/assets/images/products/p-20.png -------------------------------------------------------------------------------- /public/assets/images/products/p-21-m.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/harrypotter518/react-nextjs-ecommerce/26ab234413ee0d554bebd5d50893c722b8e73b66/public/assets/images/products/p-21-m.png -------------------------------------------------------------------------------- /public/assets/images/products/p-21.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/harrypotter518/react-nextjs-ecommerce/26ab234413ee0d554bebd5d50893c722b8e73b66/public/assets/images/products/p-21.png -------------------------------------------------------------------------------- /public/assets/images/products/p-22-m.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/harrypotter518/react-nextjs-ecommerce/26ab234413ee0d554bebd5d50893c722b8e73b66/public/assets/images/products/p-22-m.png -------------------------------------------------------------------------------- /public/assets/images/products/p-22-s.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/harrypotter518/react-nextjs-ecommerce/26ab234413ee0d554bebd5d50893c722b8e73b66/public/assets/images/products/p-22-s.png -------------------------------------------------------------------------------- /public/assets/images/products/p-22.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/harrypotter518/react-nextjs-ecommerce/26ab234413ee0d554bebd5d50893c722b8e73b66/public/assets/images/products/p-22.png -------------------------------------------------------------------------------- /public/assets/images/products/p-23-m.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/harrypotter518/react-nextjs-ecommerce/26ab234413ee0d554bebd5d50893c722b8e73b66/public/assets/images/products/p-23-m.png -------------------------------------------------------------------------------- /public/assets/images/products/p-23.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/harrypotter518/react-nextjs-ecommerce/26ab234413ee0d554bebd5d50893c722b8e73b66/public/assets/images/products/p-23.png -------------------------------------------------------------------------------- /public/assets/images/products/p-24-m.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/harrypotter518/react-nextjs-ecommerce/26ab234413ee0d554bebd5d50893c722b8e73b66/public/assets/images/products/p-24-m.png -------------------------------------------------------------------------------- /public/assets/images/products/p-24-md.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/harrypotter518/react-nextjs-ecommerce/26ab234413ee0d554bebd5d50893c722b8e73b66/public/assets/images/products/p-24-md.png -------------------------------------------------------------------------------- /public/assets/images/products/p-24-s.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/harrypotter518/react-nextjs-ecommerce/26ab234413ee0d554bebd5d50893c722b8e73b66/public/assets/images/products/p-24-s.png -------------------------------------------------------------------------------- /public/assets/images/products/p-24-sm.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/harrypotter518/react-nextjs-ecommerce/26ab234413ee0d554bebd5d50893c722b8e73b66/public/assets/images/products/p-24-sm.png -------------------------------------------------------------------------------- /public/assets/images/products/p-25-m.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/harrypotter518/react-nextjs-ecommerce/26ab234413ee0d554bebd5d50893c722b8e73b66/public/assets/images/products/p-25-m.png -------------------------------------------------------------------------------- /public/assets/images/products/p-25-md.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/harrypotter518/react-nextjs-ecommerce/26ab234413ee0d554bebd5d50893c722b8e73b66/public/assets/images/products/p-25-md.png -------------------------------------------------------------------------------- /public/assets/images/products/p-25-s.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/harrypotter518/react-nextjs-ecommerce/26ab234413ee0d554bebd5d50893c722b8e73b66/public/assets/images/products/p-25-s.png -------------------------------------------------------------------------------- /public/assets/images/products/p-26-m.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/harrypotter518/react-nextjs-ecommerce/26ab234413ee0d554bebd5d50893c722b8e73b66/public/assets/images/products/p-26-m.png -------------------------------------------------------------------------------- /public/assets/images/products/p-26-md.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/harrypotter518/react-nextjs-ecommerce/26ab234413ee0d554bebd5d50893c722b8e73b66/public/assets/images/products/p-26-md.png -------------------------------------------------------------------------------- /public/assets/images/products/p-26-xs.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/harrypotter518/react-nextjs-ecommerce/26ab234413ee0d554bebd5d50893c722b8e73b66/public/assets/images/products/p-26-xs.png -------------------------------------------------------------------------------- /public/assets/images/products/p-27-m.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/harrypotter518/react-nextjs-ecommerce/26ab234413ee0d554bebd5d50893c722b8e73b66/public/assets/images/products/p-27-m.png -------------------------------------------------------------------------------- /public/assets/images/products/p-27-md.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/harrypotter518/react-nextjs-ecommerce/26ab234413ee0d554bebd5d50893c722b8e73b66/public/assets/images/products/p-27-md.png -------------------------------------------------------------------------------- /public/assets/images/products/p-27-sm.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/harrypotter518/react-nextjs-ecommerce/26ab234413ee0d554bebd5d50893c722b8e73b66/public/assets/images/products/p-27-sm.png -------------------------------------------------------------------------------- /public/assets/images/products/p-27-xs.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/harrypotter518/react-nextjs-ecommerce/26ab234413ee0d554bebd5d50893c722b8e73b66/public/assets/images/products/p-27-xs.png -------------------------------------------------------------------------------- /public/assets/images/products/p-28-m.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/harrypotter518/react-nextjs-ecommerce/26ab234413ee0d554bebd5d50893c722b8e73b66/public/assets/images/products/p-28-m.png -------------------------------------------------------------------------------- /public/assets/images/products/p-28-xs.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/harrypotter518/react-nextjs-ecommerce/26ab234413ee0d554bebd5d50893c722b8e73b66/public/assets/images/products/p-28-xs.png -------------------------------------------------------------------------------- /public/assets/images/products/p-29-m.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/harrypotter518/react-nextjs-ecommerce/26ab234413ee0d554bebd5d50893c722b8e73b66/public/assets/images/products/p-29-m.png -------------------------------------------------------------------------------- /public/assets/images/products/p-29-sm.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/harrypotter518/react-nextjs-ecommerce/26ab234413ee0d554bebd5d50893c722b8e73b66/public/assets/images/products/p-29-sm.png -------------------------------------------------------------------------------- /public/assets/images/products/p-3-m.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/harrypotter518/react-nextjs-ecommerce/26ab234413ee0d554bebd5d50893c722b8e73b66/public/assets/images/products/p-3-m.png -------------------------------------------------------------------------------- /public/assets/images/products/p-3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/harrypotter518/react-nextjs-ecommerce/26ab234413ee0d554bebd5d50893c722b8e73b66/public/assets/images/products/p-3.png -------------------------------------------------------------------------------- /public/assets/images/products/p-30-m.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/harrypotter518/react-nextjs-ecommerce/26ab234413ee0d554bebd5d50893c722b8e73b66/public/assets/images/products/p-30-m.png -------------------------------------------------------------------------------- /public/assets/images/products/p-30-md.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/harrypotter518/react-nextjs-ecommerce/26ab234413ee0d554bebd5d50893c722b8e73b66/public/assets/images/products/p-30-md.png -------------------------------------------------------------------------------- /public/assets/images/products/p-4-m.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/harrypotter518/react-nextjs-ecommerce/26ab234413ee0d554bebd5d50893c722b8e73b66/public/assets/images/products/p-4-m.png -------------------------------------------------------------------------------- /public/assets/images/products/p-4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/harrypotter518/react-nextjs-ecommerce/26ab234413ee0d554bebd5d50893c722b8e73b66/public/assets/images/products/p-4.png -------------------------------------------------------------------------------- /public/assets/images/products/p-5-m.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/harrypotter518/react-nextjs-ecommerce/26ab234413ee0d554bebd5d50893c722b8e73b66/public/assets/images/products/p-5-m.png -------------------------------------------------------------------------------- /public/assets/images/products/p-5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/harrypotter518/react-nextjs-ecommerce/26ab234413ee0d554bebd5d50893c722b8e73b66/public/assets/images/products/p-5.png -------------------------------------------------------------------------------- /public/assets/images/products/p-6-m.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/harrypotter518/react-nextjs-ecommerce/26ab234413ee0d554bebd5d50893c722b8e73b66/public/assets/images/products/p-6-m.png -------------------------------------------------------------------------------- /public/assets/images/products/p-6-xs.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/harrypotter518/react-nextjs-ecommerce/26ab234413ee0d554bebd5d50893c722b8e73b66/public/assets/images/products/p-6-xs.png -------------------------------------------------------------------------------- /public/assets/images/products/p-6.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/harrypotter518/react-nextjs-ecommerce/26ab234413ee0d554bebd5d50893c722b8e73b66/public/assets/images/products/p-6.png -------------------------------------------------------------------------------- /public/assets/images/products/p-7-m.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/harrypotter518/react-nextjs-ecommerce/26ab234413ee0d554bebd5d50893c722b8e73b66/public/assets/images/products/p-7-m.png -------------------------------------------------------------------------------- /public/assets/images/products/p-7-xs.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/harrypotter518/react-nextjs-ecommerce/26ab234413ee0d554bebd5d50893c722b8e73b66/public/assets/images/products/p-7-xs.png -------------------------------------------------------------------------------- /public/assets/images/products/p-7.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/harrypotter518/react-nextjs-ecommerce/26ab234413ee0d554bebd5d50893c722b8e73b66/public/assets/images/products/p-7.png -------------------------------------------------------------------------------- /public/assets/images/products/p-8-m.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/harrypotter518/react-nextjs-ecommerce/26ab234413ee0d554bebd5d50893c722b8e73b66/public/assets/images/products/p-8-m.png -------------------------------------------------------------------------------- /public/assets/images/products/p-8-md.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/harrypotter518/react-nextjs-ecommerce/26ab234413ee0d554bebd5d50893c722b8e73b66/public/assets/images/products/p-8-md.png -------------------------------------------------------------------------------- /public/assets/images/products/p-8-xs.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/harrypotter518/react-nextjs-ecommerce/26ab234413ee0d554bebd5d50893c722b8e73b66/public/assets/images/products/p-8-xs.png -------------------------------------------------------------------------------- /public/assets/images/products/p-8.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/harrypotter518/react-nextjs-ecommerce/26ab234413ee0d554bebd5d50893c722b8e73b66/public/assets/images/products/p-8.png -------------------------------------------------------------------------------- /public/assets/images/products/p-9-m.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/harrypotter518/react-nextjs-ecommerce/26ab234413ee0d554bebd5d50893c722b8e73b66/public/assets/images/products/p-9-m.png -------------------------------------------------------------------------------- /public/assets/images/products/p-9.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/harrypotter518/react-nextjs-ecommerce/26ab234413ee0d554bebd5d50893c722b8e73b66/public/assets/images/products/p-9.png -------------------------------------------------------------------------------- /public/assets/images/search/1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/harrypotter518/react-nextjs-ecommerce/26ab234413ee0d554bebd5d50893c722b8e73b66/public/assets/images/search/1.png -------------------------------------------------------------------------------- /public/assets/images/search/2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/harrypotter518/react-nextjs-ecommerce/26ab234413ee0d554bebd5d50893c722b8e73b66/public/assets/images/search/2.png -------------------------------------------------------------------------------- /public/assets/images/search/3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/harrypotter518/react-nextjs-ecommerce/26ab234413ee0d554bebd5d50893c722b8e73b66/public/assets/images/search/3.png -------------------------------------------------------------------------------- /public/assets/images/support.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/harrypotter518/react-nextjs-ecommerce/26ab234413ee0d554bebd5d50893c722b8e73b66/public/assets/images/support.png -------------------------------------------------------------------------------- /public/assets/placeholder/brand-bg.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /public/assets/placeholder/card-medium.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /public/assets/placeholder/card-small.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /public/assets/placeholder/cart-item.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /public/assets/placeholder/category-small.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /public/assets/placeholder/collection.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /public/assets/placeholder/instagram.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /public/assets/placeholder/order-product.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /public/assets/placeholder/products/product-cat.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /public/assets/placeholder/products/product-gallery.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /public/assets/placeholder/products/product-grid.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /public/assets/placeholder/products/product-gridSlim.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /public/assets/placeholder/products/product-list.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /public/assets/placeholder/products/product-listSmall.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /public/assets/placeholder/products/product-thumbnail.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /public/assets/placeholder/search-product.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /public/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/harrypotter518/react-nextjs-ecommerce/26ab234413ee0d554bebd5d50893c722b8e73b66/public/favicon.ico -------------------------------------------------------------------------------- /public/locales/ar/faq.json: -------------------------------------------------------------------------------- 1 | { 2 | "faq-one-title": "كيف تتصل بخدمة العملاء؟", 3 | "faq-one-content": "يتوفر فريق تجربة العملاء لدينا 7 أيام في الأسبوع ونقدم طريقتين للاتصال. البريد الإلكتروني والدردشة. نحاول الرد بسرعة ، لذلك لا داعي للانتظار طويلاً للرد !.", 4 | "faq-two-title": "فشل تثبيت التطبيق ، كيف يتم تحديث معلومات النظام؟", 5 | "faq-two-content": "الرجاء قراءة الوثائق بعناية. لدينا أيضًا بعض مقاطع الفيديو التعليمية عبر الإنترنت بخصوص هذه المشكلة. إذا استمرت المشكلة ، يرجى فتح تذكرة في منتدى الدعم", 6 | "faq-three-title": "تستغرق استجابة الموقع وقتًا ، كيف تتحسن؟", 7 | "faq-three-content": "في البداية ، يرجى التحقق من اتصالك بالإنترنت. لدينا أيضًا بعض مقاطع الفيديو التعليمية عبر الإنترنت بخصوص هذه المشكلة. إذا استمرت المشكلة ، يرجى فتح تذكرة في منتدى الدعم.", 8 | "faq-four-title": "كيف أقوم بإنشاء حساب؟", 9 | "faq-four-content": "إذا كنت تريد فتح حساب للاستخدام الشخصي ، فيمكنك القيام بذلك عبر الهاتف أو عبر الإنترنت. يجب أن يستغرق فتح حساب عبر الإنترنت بضع دقائق فقط." 10 | } -------------------------------------------------------------------------------- /public/locales/de/faq.json: -------------------------------------------------------------------------------- 1 | { 2 | "faq-one-title": "Wie kann ich mit dem Kundendienst Kontakt aufnehmen?", 3 | "faq-one-content": "Unser Customer Experience Team ist 7 Tage die Woche für Sie da und wir bieten zwei Möglichkeiten, um Kontakt aufzunehmen. E-Mail und Chat. Wir versuchen schnell zu antworten, damit Sie nicht zu lange auf eine Antwort warten müssen!.", 4 | "faq-two-title": "App-Installation fehlgeschlagen, wie aktualisiere ich Systeminformationen?", 5 | "faq-two-content": "Bitte lesen Sie die Dokumentation sorgfältig durch. Wir haben auch einige Online-Video-Tutorials zu diesem Thema. Wenn das Problem weiterhin besteht, öffnen Sie bitte ein Ticket im Support-Forum", 6 | "faq-three-title": "Website-Antwort braucht Zeit, wie kann man sich verbessern?", 7 | "faq-three-content": "Bitte überprüfen Sie zunächst Ihre Internetverbindung. Wir haben auch einige Online-Video-Tutorials zu diesem Thema. Wenn das Problem weiterhin besteht, öffnen Sie bitte ein Ticket im Support-Forum.", 8 | "faq-four-title": "Wie erstelle ich ein Konto?", 9 | "faq-four-content": "Wenn Sie ein Konto für den persönlichen Gebrauch eröffnen möchten, können Sie dies telefonisch oder online tun. Die Online-Kontoeröffnung sollte nur wenige Minuten dauern." 10 | } -------------------------------------------------------------------------------- /public/locales/en/faq.json: -------------------------------------------------------------------------------- 1 | { 2 | "faq-one-title": "How to contact with Customer Service?", 3 | "faq-one-content": "Our Customer Experience Team is available 7 days a week and we offer 2 ways to get in contact.Email and Chat . We try to reply quickly, so you need not to wait too long for a response!.", 4 | "faq-two-title": "App installation failed, how to update system information?", 5 | "faq-two-content": "Please read the documentation carefully . We also have some online video tutorials regarding this issue . If the problem remains, Please Open a ticket in the support forum", 6 | "faq-three-title": "Website response taking time, how to improve?", 7 | "faq-three-content": "At first, Please check your internet connection . We also have some online video tutorials regarding this issue . If the problem remains, Please Open a ticket in the support forum.", 8 | "faq-four-title": "How do I create an account?", 9 | "faq-four-content": "If you want to open an account for personal use you can do it over the phone or online. Opening an account online should only take a few minutes." 10 | } -------------------------------------------------------------------------------- /public/locales/es/faq.json: -------------------------------------------------------------------------------- 1 | { 2 | "faq-one-title": "¿Cómo ponerse en contacto con el servicio de atención al cliente?", 3 | "faq-one-content": "Nuestro equipo de experiencia del cliente está disponible los 7 días de la semana y ofrecemos 2 formas de ponerse en contacto: correo electrónico y chat. Intentamos responder rápidamente, por lo que no necesita esperar demasiado para recibir una respuesta.", 4 | "faq-two-title": "Falló la instalación de la aplicación, ¿cómo actualizar la información del sistema?", 5 | "faq-two-content": "Lea la documentación detenidamente. También tenemos algunos videos tutoriales en línea sobre este tema. Si el problema persiste, abra un ticket en el foro de soporte", 6 | "faq-three-title": "La respuesta del sitio web tarda, ¿cómo mejorar?", 7 | "faq-three-content": "Al principio, compruebe su conexión a Internet. También tenemos algunos videos tutoriales en línea sobre este tema. Si el problema persiste, abra un ticket en el foro de soporte.", 8 | "faq-four-title": "¿Cómo creo una cuenta?", 9 | "faq-four-content": "Si desea abrir una cuenta para uso personal, puede hacerlo por teléfono o en línea. Abrir una cuenta en línea solo debería tomar unos minutos." 10 | } -------------------------------------------------------------------------------- /public/locales/he/faq.json: -------------------------------------------------------------------------------- 1 | { 2 | "faq-one-title": "כיצד ליצור קשר עם שירות הלקוחות?", 3 | "faq-one-content": "צוות חווית הלקוח שלנו זמין 7 ימים בשבוע ואנחנו מציעים שתי דרכים ליצור קשר. דואר אלקטרוני וצ'אט. אנו מנסים להשיב במהירות, כך שאינך צריך לחכות זמן רב מדי לתגובה !.", 4 | "faq-two-title": "התקנת האפליקציה נכשלה, כיצד לעדכן את פרטי המערכת?", 5 | "faq-two-content": "אנא קרא את התיעוד בעיון. יש לנו גם כמה מדריכי וידאו מקוונים בנושא זה. אם הבעיה נותרה, אנא פתח כרטיס בפורום התמיכה", 6 | "faq-three-title": "תגובת האתר לוקח זמן, כיצד ניתן לשפר?", 7 | "faq-three-content": "בהתחלה, אנא בדוק את חיבור האינטרנט שלך. יש לנו גם כמה מדריכי וידאו מקוונים בנושא זה. אם הבעיה נותרה, אנא פתח כרטיס בפורום התמיכה.", 8 | "faq-four-title": "כיצד אוכל ליצור חשבון?", 9 | "faq-four-content": "אם ברצונך לפתוח חשבון לשימוש אישי תוכל לעשות זאת בטלפון או באופן מקוון. פתיחת חשבון באופן מקוון אמורה לארוך מספר דקות בלבד." 10 | } -------------------------------------------------------------------------------- /public/locales/zh/faq.json: -------------------------------------------------------------------------------- 1 | { 2 | "faq-one-title": "如何与客户服务联系?", 3 | "faq-one-content": "我们的客户体验团队每周工作7天,我们提供两种联系方式。电子邮件和聊天。 我们会尽快回复您,因此您无需等待太久就可以回复!", 4 | "faq-two-title": "应用安装失败,如何更新系统信息?", 5 | "faq-two-content": "请仔细阅读文档。 我们也有一些有关此问题的在线视频教程。 如果问题仍然存在,请在支持论坛中打开故障单", 6 | "faq-three-title": "网站响应耗时,如何改进?", 7 | "faq-three-content": "首先,请检查您的互联网连接。 我们也有一些有关此问题的在线视频教程。 如果问题仍然存在,请在支持论坛中打开故障单。", 8 | "faq-four-title": "我如何创建一个帐户?", 9 | "faq-four-content": "如果您想开设一个个人帐户,可以通过电话或在线进行。 在线开户仅需几分钟。" 10 | } -------------------------------------------------------------------------------- /public/locales/zh/footer.json: -------------------------------------------------------------------------------- 1 | { 2 | "text-copyright": "版权", 3 | "text-all-rights-reserved": "保留所有权利", 4 | "widget-title-social": "社交", 5 | "widget-title-contact": "联系方式", 6 | "widget-title-about": "关于", 7 | "widget-title-customer-care": "客户服务", 8 | "widget-title-our-information": "我们的信息", 9 | "widget-title-top-categories": "热门类别", 10 | "link-instagram": "Instagram", 11 | "link-twitter": "Twitter", 12 | "link-facebook": "Facebook", 13 | "link-youtube": "Youtube", 14 | "link-contact-us": "联系我们", 15 | "link-email": "yourexample@email.com", 16 | "link-email-two": "example@email.com", 17 | "link-phone": "给我们打电话:+1 254 568-5479", 18 | "link-support-center": "支持中心", 19 | "link-customer-support": "客户支持", 20 | "link-about-us": "关于我们", 21 | "link-copyright": "版权", 22 | "link-faq": "常见问题和帮助", 23 | "link-shipping": "送货方式", 24 | "link-exchanges": "退货和换货", 25 | "link-privacy": "隐私政策更新", 26 | "link-terms": "条款和条件", 27 | "link-return-policy": "退货政策", 28 | "link-site-map": "网站地图", 29 | "link-men-wear": "男装", 30 | "link-women-wear": "女装", 31 | "link-kids-wear": "童装", 32 | "link-sports-wear": "体育服", 33 | "payment-master-card": "主卡", 34 | "payment-visa": "Visa", 35 | "payment-paypal": "Paypal", 36 | "payment-jcb": "JCB", 37 | "payment-skrill": "Skrill" 38 | } -------------------------------------------------------------------------------- /public/locales/zh/privacy.json: -------------------------------------------------------------------------------- 1 | { 2 | "privacy-one-title": "目的", 3 | "privacy-one-content": "

小& 大的致力于保护您的隐私,因为我们致力于珍视人。 以下我们的隐私政策阐明了如何收集,使用和保护您的个人信息。 Demo国家隐私权原则 也适用于我们。

本隐私权政策描述了我们关于收集,持有, 使用和披露您的个人信息,应与我们的条款和条件一起阅读。 提供您的个人信息即表示您同意我们根据本隐私政策收集,使用和披露该信息

", 4 | "privacy-two-title": "什么是个人数据?", 5 | "privacy-two-content": "

在本政策中使用时,“个人信息”具有《隐私法》中给出的含义。 通常,它表示可以用来识别您的任何信息或意见。

", 6 | "privacy-three-title": "收集个人资料", 7 | "privacy-three-content": "

为以下目的并使用以下服务而收集的个人数据:

  1. 谷歌分析(分析):Cookie; 使用数据
  2. 联系表: 电子邮件地址; 名; 电话号码
  3. 邮件列表或新闻通讯: 电子邮件地址; 名
", 8 | "privacy-four-title": "访问您的个人数据", 9 | "privacy-four-content": "

您可以要求访问我们收集的您的个人信息,并要求我们更正该个人信息。 您可以通过与我们联系来要求访问或更正,我们通常会在30天内回复。 如果我们拒绝让您访问或纠正您的个人信息,我们将书面通知您并说明原因。

", 10 | "privacy-five-title": "投诉投诉", 11 | "privacy-five-content": "

I如果您认为您的隐私受到侵犯或对我们如何处理您的个人信息有投诉,请以书面形式与我们联系。 我们会在合理的期限内(通常在30天内)做出回应。

", 12 | "privacy-six-title": "所有者和数据控制者", 13 | "privacy-six-content": "

公地
20-40 demo St,
Jon doe NSW 2008
国家

电子邮件: demo@demo.com

" 14 | } -------------------------------------------------------------------------------- /public/locales/zh/terms.json: -------------------------------------------------------------------------------- 1 | { 2 | "terms-one-title": "目的", 3 | "terms-one-content": "

小& 大的致力于保护您的隐私,因为我们致力于珍视人。 以下我们的隐私政策阐明了如何收集,使用和保护您的个人信息。 Demo国家隐私权原则 也适用于我们。

本隐私权政策描述了我们关于收集,持有, 使用和披露您的个人信息,应与我们的条款和条件一起阅读。 提供您的个人信息即表示您同意我们根据本隐私政策收集,使用和披露该信息

", 4 | "terms-two-title": "什么是个人数据?", 5 | "terms-two-content": "

在本政策中使用时,“个人信息”具有《隐私法》中给出的含义。 通常,它表示可以用来识别您的任何信息或意见。

", 6 | "terms-three-title": "收集个人资料", 7 | "terms-three-content": "

为以下目的并使用以下服务而收集的个人数据:

  1. 谷歌分析(分析):Cookie; 使用数据
  2. 联系表: 电子邮件地址; 名; 电话号码
  3. 邮件列表或新闻通讯: 电子邮件地址; 名
", 8 | "terms-four-title": "访问您的个人数据", 9 | "terms-four-content": "

您可以要求访问我们收集的您的个人信息,并要求我们更正该个人信息。 您可以通过与我们联系来要求访问或更正,我们通常会在30天内回复。 如果我们拒绝让您访问或纠正您的个人信息,我们将书面通知您并说明原因。

", 10 | "terms-five-title": "投诉投诉", 11 | "terms-five-content": "

I如果您认为您的隐私受到侵犯或对我们如何处理您的个人信息有投诉,请以书面形式与我们联系。 我们会在合理的期限内(通常在30天内)做出回应。

", 12 | "terms-six-title": "所有者和数据控制者", 13 | "terms-six-content": "

公地
20-40 demo St,
Jon doe NSW 2008
国家

电子邮件: demo@demo.com

" 14 | } -------------------------------------------------------------------------------- /public/vercel.svg: -------------------------------------------------------------------------------- 1 | 3 | 4 | -------------------------------------------------------------------------------- /src/components/404/error-information.tsx: -------------------------------------------------------------------------------- 1 | import Image from "next/image"; 2 | import { IoHomeSharp } from "react-icons/io5"; 3 | import Text from "@components/ui/text"; 4 | import Link from "@components/ui/link"; 5 | import { useTranslation } from "next-i18next"; 6 | 7 | const ErrorInformation: React.FC = () => { 8 | const { t } = useTranslation("common"); 9 | return ( 10 |
11 |
12 | {t("error-heading")} 18 | 19 | {t("error-heading")} 20 |

21 | {t("error-sub-heading")} 22 |

23 | 27 | 28 | {t("button-go-home")} 29 | 30 |
31 |
32 | ); 33 | }; 34 | 35 | export default ErrorInformation; 36 | -------------------------------------------------------------------------------- /src/components/cart/cart-button.tsx: -------------------------------------------------------------------------------- 1 | import CartIcon from "@components/icons/cart-icon"; 2 | import { useCart } from "@contexts/cart/cart.context"; 3 | import { useUI } from "@contexts/ui.context"; 4 | 5 | const CartButton = () => { 6 | const { openCart } = useUI(); 7 | const { totalItems } = useCart(); 8 | function handleCartOpen() { 9 | return openCart(); 10 | } 11 | 12 | return ( 13 | 23 | ); 24 | }; 25 | 26 | export default CartButton; 27 | -------------------------------------------------------------------------------- /src/components/checkout/checkout-card-footer-item.tsx: -------------------------------------------------------------------------------- 1 | type FooterItemProps = { 2 | id: string; 3 | name: string; 4 | price: string; 5 | }; 6 | export const CheckoutCardFooterItem: React.FC<{ item: FooterItemProps }> = ({ 7 | item, 8 | }) => { 9 | return ( 10 |
11 | {item.name} 12 | {item.price} 13 |
14 | ); 15 | }; 16 | -------------------------------------------------------------------------------- /src/components/checkout/checkout-card-item.tsx: -------------------------------------------------------------------------------- 1 | import { Item } from "@contexts/cart/cart.utils"; 2 | import { generateCartItemName } from "@utils/generate-cart-item-name"; 3 | import usePrice from "@framework/product/use-price"; 4 | 5 | export const CheckoutItem: React.FC<{ item: Item }> = ({ item }) => { 6 | const { price } = usePrice({ 7 | amount: item.itemTotal, 8 | currencyCode: "USD", 9 | }); 10 | return ( 11 |
12 |
13 | 19 |
20 |
21 | {generateCartItemName(item.name, item.attributes)} 22 |
23 |
24 | {price} 25 |
26 |
27 | ); 28 | }; 29 | -------------------------------------------------------------------------------- /src/components/common/default-seo.tsx: -------------------------------------------------------------------------------- 1 | import { DefaultSeo as NextDefaultSeo } from "next-seo"; 2 | import { siteSettings } from "@settings/site-settings"; 3 | 4 | export const DefaultSeo = () => { 5 | return ( 6 | 27 | ); 28 | }; 29 | -------------------------------------------------------------------------------- /src/components/common/drawer/drawer.tsx: -------------------------------------------------------------------------------- 1 | import "rc-drawer/assets/index.css"; 2 | export { default as Drawer } from "rc-drawer"; 3 | -------------------------------------------------------------------------------- /src/components/common/drawer/managed-drawer.tsx: -------------------------------------------------------------------------------- 1 | import Cart from "@components/cart/cart"; 2 | import { useUI } from "@contexts/ui.context"; 3 | import { Drawer } from "@components/common/drawer/drawer"; 4 | import { useRouter } from "next/router"; 5 | import { getDirection } from "@utils/get-direction"; 6 | 7 | const ManagedDrawer = () => { 8 | const { displayCart, closeCart } = useUI(); 9 | const { locale } = useRouter(); 10 | const dir = getDirection(locale); 11 | const contentWrapperCSS = dir === "ltr" ? { right: 0 } : { left: 0 }; 12 | return ( 13 | 22 | 23 | 24 | ); 25 | }; 26 | 27 | export default ManagedDrawer; 28 | -------------------------------------------------------------------------------- /src/components/common/modal/managed-modal.tsx: -------------------------------------------------------------------------------- 1 | import { useUI } from "@contexts/ui.context"; 2 | import Modal from "./modal"; 3 | import dynamic from "next/dynamic"; 4 | const LoginForm = dynamic(() => import("@components/auth/login-form")); 5 | const SignUpForm = dynamic(() => import("@components/auth/sign-up-form")); 6 | const ForgetPasswordForm = dynamic(() => 7 | import("@components/auth/forget-password-form") 8 | ); 9 | const ProductPopup = dynamic(() => import("@components/product/product-popup")); 10 | const ManagedModal: React.FC = () => { 11 | const { displayModal, closeModal, modalView } = useUI(); 12 | return ( 13 | 14 | {modalView === "LOGIN_VIEW" && } 15 | {modalView === "SIGN_UP_VIEW" && } 16 | {modalView === "FORGET_PASSWORD" && } 17 | {modalView === "PRODUCT_VIEW" && } 18 | 19 | ); 20 | }; 21 | 22 | export default ManagedModal; 23 | -------------------------------------------------------------------------------- /src/components/common/progress-card.tsx: -------------------------------------------------------------------------------- 1 | import { useTranslation } from "next-i18next"; 2 | 3 | interface Props { 4 | soldProduct?: number; 5 | totalProduct?: number; 6 | } 7 | 8 | const ProgressCard: React.FC = ({ 9 | soldProduct = 0, 10 | totalProduct = 0, 11 | }) => { 12 | const progressBar = (100 / totalProduct) * soldProduct; 13 | const { t } = useTranslation("common"); 14 | return ( 15 |
16 |
17 |
18 | {t("text-sold")} :  19 | {soldProduct} 20 |
21 |
22 | {t("text-available")} :  23 | {totalProduct - soldProduct} 24 |
25 |
26 |
27 |
31 |
32 |
33 | ); 34 | }; 35 | 36 | export default ProgressCard; 37 | -------------------------------------------------------------------------------- /src/components/common/scrollbar.tsx: -------------------------------------------------------------------------------- 1 | import cn from "classnames"; 2 | import { OverlayScrollbarsComponent } from "overlayscrollbars-react"; 3 | import "overlayscrollbars/css/OverlayScrollbars.css"; 4 | 5 | type ScrollbarProps = { 6 | options?: any; 7 | children: React.ReactNode; 8 | style?: React.CSSProperties; 9 | className?: string; 10 | }; 11 | 12 | const Scrollbar: React.FC = ({ 13 | options, 14 | children, 15 | style, 16 | className, 17 | ...props 18 | }) => { 19 | return ( 20 | 31 | {children} 32 | 33 | ); 34 | }; 35 | 36 | export default Scrollbar; 37 | -------------------------------------------------------------------------------- /src/components/common/section-header.tsx: -------------------------------------------------------------------------------- 1 | import Text from "@components/ui/text"; 2 | import Link from "@components/ui/link"; 3 | import { useTranslation } from "next-i18next"; 4 | 5 | interface Props { 6 | sectionHeading: string; 7 | categorySlug?: string; 8 | className?: string; 9 | } 10 | 11 | const SectionHeader: React.FC = ({ 12 | sectionHeading = "text-section-title", 13 | categorySlug, 14 | className = "pb-0.5 mb-4 md:mb-5 lg:mb-6 2xl:mb-7 3xl:mb-8", 15 | }) => { 16 | const { t } = useTranslation("common"); 17 | return ( 18 |
21 | {t(`${sectionHeading}`)} 22 | {categorySlug && ( 23 | 27 | {t("text-see-all-product")} 28 | 29 | )} 30 |
31 | ); 32 | }; 33 | 34 | export default SectionHeader; 35 | -------------------------------------------------------------------------------- /src/components/common/text-information.tsx: -------------------------------------------------------------------------------- 1 | import classNames from "classnames"; 2 | import Image from "next/image"; 3 | import { useTranslation } from "next-i18next"; 4 | 5 | interface ItemProps { 6 | icon: string; 7 | title: string; 8 | description: string; 9 | } 10 | 11 | interface Props { 12 | className?: string; 13 | item: ItemProps; 14 | } 15 | 16 | const TextInformation: React.FC = ({ item, className }) => { 17 | const { t } = useTranslation("common"); 18 | return ( 19 |
25 |
26 | {t(`${item.title}`)} 32 |
33 |
34 |

35 | {t(`${item.title}`)} 36 |

37 |

38 | {t(`${item.description}`)} 39 |

40 |
41 |
42 | ); 43 | }; 44 | 45 | export default TextInformation; 46 | -------------------------------------------------------------------------------- /src/components/icons/CNFlag.tsx: -------------------------------------------------------------------------------- 1 | export const CNFlag = ({ width = "640px", height = "480px" }) => { 2 | return ( 3 | 9 | 10 | 11 | 12 | 13 | 19 | 25 | 31 | 37 | 43 | 44 | ); 45 | }; 46 | -------------------------------------------------------------------------------- /src/components/icons/DEFlag.tsx: -------------------------------------------------------------------------------- 1 | export const DEFlag = ({ width = "640px", height = "480px" }) => { 2 | return ( 3 | 9 | 10 | 11 | 12 | 13 | ); 14 | }; 15 | -------------------------------------------------------------------------------- /src/components/icons/ILFlag.tsx: -------------------------------------------------------------------------------- 1 | export const ILFlag = ({ width = "640px", height = "480px" }) => { 2 | return ( 3 | 9 | 10 | 11 | 12 | 13 | 14 | 19 | 20 | 24 | 25 | 26 | 30 | 31 | 32 | ); 33 | }; 34 | -------------------------------------------------------------------------------- /src/components/icons/cart-icon.tsx: -------------------------------------------------------------------------------- 1 | const CartIcon = ({ 2 | color = "currentColor", 3 | width = "18px", 4 | height = "18px", 5 | className = "md:w-4 xl:w-5 md:h-4 xl:h-5", 6 | }) => { 7 | return ( 8 | 15 | 21 | 22 | ); 23 | }; 24 | 25 | export default CartIcon; 26 | -------------------------------------------------------------------------------- /src/components/icons/eye-icon.tsx: -------------------------------------------------------------------------------- 1 | export const Eye: React.FC> = (props) => ( 2 | 9 | 15 | 21 | 22 | ); 23 | -------------------------------------------------------------------------------- /src/components/icons/eye-off-icon.tsx: -------------------------------------------------------------------------------- 1 | export const EyeOff: React.FC> = (props) => ( 2 | 9 | 15 | 16 | ); 17 | -------------------------------------------------------------------------------- /src/components/icons/home-icon.tsx: -------------------------------------------------------------------------------- 1 | const HomeIcon = ({ 2 | color = "currentColor", 3 | width = "18px", 4 | height = "20px", 5 | }) => { 6 | return ( 7 | 13 | 20 | 21 | ); 22 | }; 23 | 24 | export default HomeIcon; 25 | -------------------------------------------------------------------------------- /src/components/icons/menu-icon.tsx: -------------------------------------------------------------------------------- 1 | const MenuIcon: React.FC> = (props) => { 2 | return ( 3 | 10 | 11 | 20 | 29 | 38 | 39 | 40 | ); 41 | }; 42 | 43 | export default MenuIcon; 44 | -------------------------------------------------------------------------------- /src/components/icons/minus-icon.tsx: -------------------------------------------------------------------------------- 1 | const MinusIcon = ({ 2 | color = "currentColor", 3 | width = "10px", 4 | height = "2px", 5 | }) => { 6 | return ( 7 | 13 | 19 | 20 | ); 21 | }; 22 | 23 | export default MinusIcon; 24 | -------------------------------------------------------------------------------- /src/components/icons/plus-icon.tsx: -------------------------------------------------------------------------------- 1 | const PlusIcon = ({ 2 | color = "currentColor", 3 | width = "10px", 4 | height = "10px", 5 | }) => { 6 | return ( 7 | 14 | 15 | 20 | 21 | 22 | ); 23 | }; 24 | 25 | export default PlusIcon; 26 | -------------------------------------------------------------------------------- /src/components/icons/search-icon.tsx: -------------------------------------------------------------------------------- 1 | const SearchIcon = ({ 2 | color = "currentColor", 3 | width = "17px", 4 | height = "18px", 5 | className = "md:w-4 xl:w-5 md:h-4 xl:h-5", 6 | }) => { 7 | return ( 8 | 15 | 21 | 22 | ); 23 | }; 24 | 25 | export default SearchIcon; 26 | -------------------------------------------------------------------------------- /src/components/icons/user-icon.tsx: -------------------------------------------------------------------------------- 1 | const UserIcon = ({ 2 | color = "currentColor", 3 | width = "18px", 4 | height = "20px", 5 | }) => { 6 | return ( 7 | 13 | 20 | 21 | ); 22 | }; 23 | 24 | export default UserIcon; 25 | -------------------------------------------------------------------------------- /src/components/layout/footer/footer.tsx: -------------------------------------------------------------------------------- 1 | import Widgets from "./widgets"; 2 | import Copyright from "./copyright"; 3 | import { footer } from "./data"; 4 | const { widgets, payment } = footer; 5 | 6 | const Footer: React.FC = () => ( 7 |
8 | 9 | 10 |
11 | ); 12 | 13 | export default Footer; 14 | -------------------------------------------------------------------------------- /src/components/layout/footer/widgets.tsx: -------------------------------------------------------------------------------- 1 | import Container from "@components/ui/container"; 2 | import WidgetLink from "@components/widgets/widget-link"; 3 | 4 | interface WidgetsProps { 5 | widgets: { 6 | id: number; 7 | widgetTitle: string; 8 | lists: any; 9 | }[]; 10 | } 11 | 12 | const Widgets: React.FC = ({ widgets }) => { 13 | return ( 14 | 15 |
16 | {widgets?.map((widget) => ( 17 | 22 | ))} 23 |
24 |
25 | ); 26 | }; 27 | 28 | export default Widgets; 29 | -------------------------------------------------------------------------------- /src/components/layout/header/auth-menu.tsx: -------------------------------------------------------------------------------- 1 | import Link from "@components/ui/link"; 2 | import React from "react"; 3 | 4 | interface Props { 5 | href: string; 6 | className?: string; 7 | btnProps: React.ButtonHTMLAttributes; 8 | isAuthorized: boolean; 9 | } 10 | 11 | const AuthMenu: React.FC = ({ 12 | isAuthorized, 13 | href, 14 | className, 15 | btnProps, 16 | children, 17 | }) => { 18 | return isAuthorized ? ( 19 | 20 | {children} 21 | 22 | ) : ( 23 | 31 |
32 | 33 | 34 | ); 35 | }; 36 | 37 | export default ShopDiscount; 38 | -------------------------------------------------------------------------------- /src/components/shop/filtered-item.tsx: -------------------------------------------------------------------------------- 1 | import { useRouter } from "next/router"; 2 | import { IoClose } from "react-icons/io5"; 3 | import isEmpty from "lodash/isEmpty"; 4 | 5 | interface Props { 6 | itemKey: string; 7 | itemValue: string; 8 | } 9 | 10 | export const FilteredItem = ({ itemKey, itemValue }: Props) => { 11 | const router = useRouter(); 12 | const { pathname, query } = router; 13 | 14 | function handleClose() { 15 | const currentItem = (query[itemKey]! as string) 16 | .split(",") 17 | .filter((i) => i !== itemValue); 18 | delete query[itemKey]; 19 | router.push({ 20 | pathname, 21 | query: { 22 | ...query, 23 | ...(!isEmpty(currentItem) ? { [itemKey]: currentItem.join(",") } : {}), 24 | }, 25 | }); 26 | } 27 | return ( 28 |
32 | {itemValue} 33 | 34 |
35 | ); 36 | }; 37 | -------------------------------------------------------------------------------- /src/components/ui/active-link.tsx: -------------------------------------------------------------------------------- 1 | import { useRouter } from "next/router"; 2 | import Link from "next/link"; 3 | import React, { Children } from "react"; 4 | 5 | const ActiveLink = ({ children, activeClassName, href, ...props }: any) => { 6 | const { pathname } = useRouter(); 7 | const child = Children.only(children); 8 | const childClassName = child.props.className || ""; 9 | 10 | const className = 11 | pathname === href 12 | ? `${childClassName} ${activeClassName}`.trim() 13 | : childClassName; 14 | 15 | return ( 16 | 17 | {React.cloneElement(child, { 18 | className: className || null, 19 | })} 20 | 21 | ); 22 | }; 23 | 24 | export default ActiveLink; 25 | -------------------------------------------------------------------------------- /src/components/ui/alert.tsx: -------------------------------------------------------------------------------- 1 | interface AlertProps { 2 | message?: string; 3 | } 4 | 5 | const Alert: React.FC = ({ message }) => { 6 | return ( 7 |
8 | {message} 9 |
10 | ); 11 | }; 12 | 13 | export default Alert; 14 | -------------------------------------------------------------------------------- /src/components/ui/checkbox.tsx: -------------------------------------------------------------------------------- 1 | import React from "react"; 2 | import { useTranslation } from "next-i18next"; 3 | interface CheckBoxProps extends React.InputHTMLAttributes { 4 | labelKey?: string; 5 | label?: string | any; 6 | } 7 | export const CheckBox = React.forwardRef( 8 | ({ labelKey, label, ...rest }, ref) => { 9 | const { t } = useTranslation(); 10 | return ( 11 | 20 | ); 21 | } 22 | ); 23 | -------------------------------------------------------------------------------- /src/components/ui/container.tsx: -------------------------------------------------------------------------------- 1 | import cn from "classnames"; 2 | interface Props { 3 | className?: string; 4 | children?: any; 5 | el?: HTMLElement; 6 | clean?: boolean; 7 | } 8 | 9 | const Container: React.FC = ({ 10 | children, 11 | className, 12 | el = "div", 13 | clean, 14 | }) => { 15 | const rootClassName = cn(className, { 16 | "mx-auto max-w-[1920px] px-4 md:px-8 2xl:px-16": !clean, 17 | }); 18 | 19 | let Component: React.ComponentType< 20 | React.HTMLAttributes 21 | > = el as any; 22 | 23 | return {children}; 24 | }; 25 | 26 | export default Container; 27 | -------------------------------------------------------------------------------- /src/components/ui/divider.tsx: -------------------------------------------------------------------------------- 1 | interface DividerProps { 2 | className?: string; 3 | } 4 | 5 | const Divider: React.FC = ({ 6 | className = "mb-12 lg:mb-14 xl:mb-16 pb-0.5 lg:pb-1 xl:pb-0", 7 | }) => { 8 | return
; 9 | }; 10 | 11 | export default Divider; 12 | -------------------------------------------------------------------------------- /src/components/ui/link.tsx: -------------------------------------------------------------------------------- 1 | import NextLink, { LinkProps as NextLinkProps } from "next/link"; 2 | 3 | const Link: React.FC = ({ 4 | href, 5 | children, 6 | ...props 7 | }) => { 8 | return ( 9 | 10 | {children} 11 | 12 | ); 13 | }; 14 | 15 | export default Link; 16 | -------------------------------------------------------------------------------- /src/components/ui/loaders/brand-card-loader.tsx: -------------------------------------------------------------------------------- 1 | import ContentLoader from "react-content-loader"; 2 | 3 | const BrandCardLoader = (props: any) => ( 4 | 14 | 15 | 16 | ); 17 | 18 | export default BrandCardLoader; 19 | -------------------------------------------------------------------------------- /src/components/ui/loaders/card-loader.tsx: -------------------------------------------------------------------------------- 1 | import ContentLoader from "react-content-loader"; 2 | 3 | const CardLoader = (props: any) => ( 4 | 14 | 15 | 16 | 17 | ); 18 | 19 | export default CardLoader; 20 | -------------------------------------------------------------------------------- /src/components/ui/loaders/card-rounded-loader.tsx: -------------------------------------------------------------------------------- 1 | import ContentLoader from "react-content-loader"; 2 | 3 | const CardRoundedLoader = (props: any) => ( 4 | 14 | 15 | 16 | 17 | ); 18 | 19 | export default CardRoundedLoader; 20 | -------------------------------------------------------------------------------- /src/components/ui/loaders/category-card-loader.tsx: -------------------------------------------------------------------------------- 1 | import ContentLoader from "react-content-loader"; 2 | 3 | const CategoryCardLoader = (props: any) => ( 4 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | ); 24 | 25 | export default CategoryCardLoader; 26 | -------------------------------------------------------------------------------- /src/components/ui/loaders/category-list-card-loader.tsx: -------------------------------------------------------------------------------- 1 | import ContentLoader from "react-content-loader"; 2 | 3 | const CategoryListCardLoader = (props: any) => ( 4 | 14 | 15 | 16 | 17 | 18 | ); 19 | 20 | export default CategoryListCardLoader; 21 | -------------------------------------------------------------------------------- /src/components/ui/loaders/category-list-feed-loader.tsx: -------------------------------------------------------------------------------- 1 | import CategoryListCardLoader from "./category-list-card-loader"; 2 | 3 | interface Props { 4 | limit?: number; 5 | } 6 | 7 | const CategoryListFeedLoader = ({ limit = 7 }: Props) => { 8 | return ( 9 | <> 10 | {Array.from({ length: limit }).map((_, idx) => ( 11 | 12 | ))} 13 | 14 | ); 15 | }; 16 | 17 | export default CategoryListFeedLoader; 18 | -------------------------------------------------------------------------------- /src/components/ui/loaders/content-feed-loader.tsx: -------------------------------------------------------------------------------- 1 | import React from "react"; 2 | interface Props { 3 | limit?: number; 4 | contentLoader?: any; 5 | } 6 | 7 | const ContentFeedLoader = ({ limit = 3, contentLoader }: Props) => { 8 | return ( 9 | <> 10 | {Array.from({ length: limit }).map((_, idx) => ( 11 | {contentLoader} 12 | ))} 13 | 14 | ); 15 | }; 16 | export default ContentFeedLoader; 17 | -------------------------------------------------------------------------------- /src/components/ui/loaders/product-card-grid-loader.tsx: -------------------------------------------------------------------------------- 1 | import ContentLoader from "react-content-loader"; 2 | 3 | const ProductCardGridLoader = (props: any) => ( 4 | 14 | 15 | 16 | 17 | 18 | 19 | ); 20 | 21 | export default ProductCardGridLoader; 22 | -------------------------------------------------------------------------------- /src/components/ui/loaders/product-card-loader.tsx: -------------------------------------------------------------------------------- 1 | import ContentLoader from "react-content-loader"; 2 | 3 | const ProductCardLoader = (props: any) => ( 4 | 14 | 15 | 16 | 17 | 18 | 19 | ); 20 | 21 | export default ProductCardLoader; 22 | -------------------------------------------------------------------------------- /src/components/ui/loaders/product-card-small-list-loader.tsx: -------------------------------------------------------------------------------- 1 | import ContentLoader from "react-content-loader"; 2 | 3 | const ProductCardListSmallLoader = (props: any) => ( 4 | 14 | 15 | 16 | 17 | 18 | 19 | ); 20 | 21 | export default ProductCardListSmallLoader; 22 | -------------------------------------------------------------------------------- /src/components/ui/loaders/product-feed-loader.tsx: -------------------------------------------------------------------------------- 1 | import ProductCardLoader from "@components/ui/loaders/product-card-loader"; 2 | 3 | interface Props { 4 | limit?: number; 5 | uniqueKey?: string; 6 | } 7 | 8 | const ProductFeedLoader = ({ limit = 5, uniqueKey = "product" }: Props) => { 9 | return ( 10 | <> 11 | {Array.from({ length: limit }).map((_, idx) => ( 12 | 13 | ))} 14 | 15 | ); 16 | }; 17 | 18 | export default ProductFeedLoader; 19 | -------------------------------------------------------------------------------- /src/components/ui/loaders/product-flash-sale-grid-feed-loader.tsx: -------------------------------------------------------------------------------- 1 | import ProductFlashSaleGridLoader from "./product-flash-sale-grid-loader"; 2 | 3 | interface Props { 4 | limit?: number; 5 | } 6 | 7 | const ProductFlashSaleGridFeedLoader = ({ limit = 3 }: Props) => { 8 | return ( 9 | <> 10 | {Array.from({ length: limit }).map((_, idx) => ( 11 | 12 | ))} 13 | 14 | ); 15 | }; 16 | 17 | export default ProductFlashSaleGridFeedLoader; 18 | -------------------------------------------------------------------------------- /src/components/ui/loaders/product-flash-sale-grid-loader.tsx: -------------------------------------------------------------------------------- 1 | import ContentLoader from "react-content-loader"; 2 | 3 | const ProductFlashSaleGridLoader = (props: any) => ( 4 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | ); 25 | 26 | export default ProductFlashSaleGridLoader; 27 | -------------------------------------------------------------------------------- /src/components/ui/loaders/product-flash-sale-loader.tsx: -------------------------------------------------------------------------------- 1 | import ContentLoader from "react-content-loader"; 2 | 3 | const ProductFlashSaleLoader = (props: any) => ( 4 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | ); 25 | 26 | export default ProductFlashSaleLoader; 27 | -------------------------------------------------------------------------------- /src/components/ui/loaders/product-list-card-loader.tsx: -------------------------------------------------------------------------------- 1 | import ContentLoader from "react-content-loader"; 2 | 3 | const ProductListCardLoader = (props: any) => ( 4 | 14 | 15 | 16 | 17 | 18 | 19 | ); 20 | 21 | export default ProductListCardLoader; 22 | -------------------------------------------------------------------------------- /src/components/ui/loaders/product-list-feed-loader.tsx: -------------------------------------------------------------------------------- 1 | import ProductListCardLoader from "./product-list-card-loader"; 2 | 3 | interface Props { 4 | limit?: number; 5 | } 6 | 7 | const ProductListFeedLoader = ({ limit = 4 }: Props) => { 8 | return ( 9 | <> 10 | {Array.from({ length: limit }).map((_, idx) => ( 11 | 12 | ))} 13 | 14 | ); 15 | }; 16 | 17 | export default ProductListFeedLoader; 18 | -------------------------------------------------------------------------------- /src/components/ui/loaders/search-result-loader.tsx: -------------------------------------------------------------------------------- 1 | import ContentLoader from "react-content-loader"; 2 | 3 | const SearchResultLoader = (props: any) => ( 4 | 14 | 15 | 16 | 17 | 18 | ); 19 | 20 | export default SearchResultLoader; 21 | -------------------------------------------------------------------------------- /src/components/ui/logo.tsx: -------------------------------------------------------------------------------- 1 | import Image from "next/image"; 2 | import Link from "@components/ui/link"; 3 | import cn from "classnames"; 4 | import { siteSettings } from "@settings/site-settings"; 5 | 6 | const Logo: React.FC> = ({ 7 | className, 8 | ...props 9 | }) => { 10 | return ( 11 | 16 | {siteSettings.logo.alt} 24 | 25 | ); 26 | }; 27 | 28 | export default Logo; 29 | -------------------------------------------------------------------------------- /src/components/ui/page-header.tsx: -------------------------------------------------------------------------------- 1 | import { useTranslation } from "next-i18next"; 2 | 3 | interface HeaderProps { 4 | pageSubHeader?: string; 5 | pageHeader: string; 6 | } 7 | 8 | const PageHeader: React.FC = ({ 9 | pageSubHeader = "text-page-explore", 10 | pageHeader = "text-page-header", 11 | }) => { 12 | const { t } = useTranslation("common"); 13 | return ( 14 |
20 |
21 |
22 |

23 | 24 | {t(`${pageSubHeader}`)} 25 | 26 | {t(`${pageHeader}`)} 27 |

28 |
29 |
30 | ); 31 | }; 32 | 33 | export default PageHeader; 34 | -------------------------------------------------------------------------------- /src/components/ui/radiobox.tsx: -------------------------------------------------------------------------------- 1 | import React from "react"; 2 | import { useTranslation } from "next-i18next"; 3 | interface RadioBoxProps extends React.InputHTMLAttributes { 4 | labelKey: string | React.ReactElement; 5 | } 6 | export const RadioBox = React.forwardRef( 7 | ({ labelKey, ...rest }, ref) => { 8 | const { t } = useTranslation("forms"); 9 | return ( 10 | 21 | ); 22 | } 23 | ); 24 | -------------------------------------------------------------------------------- /src/components/ui/tabs.tsx: -------------------------------------------------------------------------------- 1 | import "react-tabs/style/react-tabs.css"; 2 | export { Tab, Tabs, TabList, TabPanel } from "react-tabs"; 3 | -------------------------------------------------------------------------------- /src/containers/banner-block.tsx: -------------------------------------------------------------------------------- 1 | import BannerCard from "@components/common/banner-card"; 2 | 3 | interface BannerProps { 4 | data: any; 5 | className?: string; 6 | } 7 | 8 | const BannerBlock: React.FC = ({ 9 | data, 10 | className = "mb-12 md:mb-14 xl:mb-16", 11 | }) => { 12 | return ( 13 |
16 | {data.map((banner: any) => ( 17 | 28 | ))} 29 |
30 | ); 31 | }; 32 | 33 | export default BannerBlock; 34 | -------------------------------------------------------------------------------- /src/containers/banner-carousel-block.tsx: -------------------------------------------------------------------------------- 1 | import BannerCard from "@components/common/banner-card"; 2 | import Carousel from "@components/ui/carousel/carousel"; 3 | import { SwiperSlide } from "swiper/react"; 4 | import { promotionBannerTwo as banners } from "@framework/static/banner"; 5 | 6 | const breakpoints = { 7 | "1025": { 8 | slidesPerView: 3, 9 | spaceBetween: 28, 10 | }, 11 | "480": { 12 | slidesPerView: 2, 13 | spaceBetween: 20, 14 | }, 15 | "0": { 16 | slidesPerView: 1, 17 | spaceBetween: 12, 18 | }, 19 | }; 20 | 21 | interface BannerProps { 22 | className?: string; 23 | } 24 | 25 | const BannerCarouselBlock: React.FC = ({ 26 | className = "mb-12 md:mb-12 lg:mb-14 pb-0.5 xl:pb-1.5", 27 | }) => { 28 | return ( 29 |
30 | 31 | {banners?.map((banner: any) => ( 32 | 33 | 34 | 35 | ))} 36 | 37 |
38 | ); 39 | }; 40 | 41 | export default BannerCarouselBlock; 42 | -------------------------------------------------------------------------------- /src/containers/banner-slider-block.tsx: -------------------------------------------------------------------------------- 1 | import BannerCard from "@components/common/banner-card"; 2 | import Carousel from "@components/ui/carousel/carousel"; 3 | import { SwiperSlide } from "swiper/react"; 4 | import { promotionBanner } from "@framework/static/banner"; 5 | 6 | interface BannerProps { 7 | className?: string; 8 | } 9 | 10 | const breakpoints = { 11 | "0": { 12 | slidesPerView: 2, 13 | }, 14 | }; 15 | 16 | const BannerSliderBlock: React.FC = ({ 17 | className = "mb-12 md:mb-14 xl:mb-16", 18 | }) => { 19 | return ( 20 |
21 |
22 | 31 | {promotionBanner.map((banner: any) => ( 32 | 36 | 37 | 38 | ))} 39 | 40 |
41 |
42 | ); 43 | }; 44 | 45 | export default BannerSliderBlock; 46 | -------------------------------------------------------------------------------- /src/framework/basic-rest/auth/use-forget-password.tsx: -------------------------------------------------------------------------------- 1 | // import { API_ENDPOINTS } from "@framework/utils/api-endpoints"; 2 | // import http from "@framework/utils/http"; 3 | import Cookies from "js-cookie"; 4 | import { useMutation } from "react-query"; 5 | 6 | export interface ForgetPasswordType { 7 | email: string; 8 | } 9 | async function forgetPassword() { 10 | // return http.post(API_ENDPOINTS.LOGIN, input); 11 | return { 12 | ok: true, 13 | message: "Forget password Successful!", 14 | }; 15 | } 16 | export const useForgetPasswordMutation = () => { 17 | return useMutation(() => forgetPassword(), { 18 | onSuccess: (_data) => { 19 | Cookies.remove("auth_token"); 20 | }, 21 | onError: (data) => { 22 | console.log(data, "forget password error response"); 23 | }, 24 | }); 25 | }; 26 | -------------------------------------------------------------------------------- /src/framework/basic-rest/auth/use-login.tsx: -------------------------------------------------------------------------------- 1 | import { useUI } from "@contexts/ui.context"; 2 | // import { API_ENDPOINTS } from "@framework/utils/api-endpoints"; 3 | // import http from "@framework/utils/http"; 4 | import Cookies from "js-cookie"; 5 | import { useMutation } from "react-query"; 6 | 7 | export interface LoginInputType { 8 | email: string; 9 | password: string; 10 | remember_me: boolean; 11 | } 12 | async function login(input: LoginInputType) { 13 | // return http.post(API_ENDPOINTS.LOGIN, input); 14 | return { 15 | token: `${input.email}.${input.remember_me}`.split("").reverse().join(""), 16 | }; 17 | } 18 | export const useLoginMutation = () => { 19 | const { authorize, closeModal } = useUI(); 20 | return useMutation((input: LoginInputType) => login(input), { 21 | onSuccess: (data) => { 22 | Cookies.set("auth_token", data.token); 23 | authorize(); 24 | closeModal(); 25 | }, 26 | onError: (data) => { 27 | console.log(data, "login error response"); 28 | }, 29 | }); 30 | }; 31 | -------------------------------------------------------------------------------- /src/framework/basic-rest/auth/use-logout.tsx: -------------------------------------------------------------------------------- 1 | import { useUI } from "@contexts/ui.context"; 2 | // import { API_ENDPOINTS } from "@framework/utils/api-endpoints"; 3 | // import http from "@framework/utils/http"; 4 | import Cookies from "js-cookie"; 5 | import Router from "next/router"; 6 | import { useMutation } from "react-query"; 7 | 8 | export interface LoginInputType { 9 | email: string; 10 | password: string; 11 | remember_me: boolean; 12 | } 13 | async function logout() { 14 | // return http.post(API_ENDPOINTS.LOGIN, input); 15 | return { 16 | ok: true, 17 | message: "Logout Successful!", 18 | }; 19 | } 20 | export const useLogoutMutation = () => { 21 | const { unauthorize } = useUI(); 22 | return useMutation(() => logout(), { 23 | onSuccess: (_data) => { 24 | Cookies.remove("auth_token"); 25 | unauthorize(); 26 | Router.push("/"); 27 | }, 28 | onError: (data) => { 29 | console.log(data, "logout error response"); 30 | }, 31 | }); 32 | }; 33 | -------------------------------------------------------------------------------- /src/framework/basic-rest/auth/use-signup.tsx: -------------------------------------------------------------------------------- 1 | import { useUI } from "@contexts/ui.context"; 2 | // import { API_ENDPOINTS } from "@framework/utils/api-endpoints"; 3 | // import http from "@framework/utils/http"; 4 | import Cookies from "js-cookie"; 5 | import { useMutation } from "react-query"; 6 | 7 | export interface SignUpInputType { 8 | email: string; 9 | password: string; 10 | name: string; 11 | } 12 | async function signUp(input: SignUpInputType) { 13 | // return http.post(API_ENDPOINTS.LOGIN, input); 14 | return { 15 | token: `${input.email}.${input.name}`.split("").reverse().join(""), 16 | }; 17 | } 18 | export const useSignUpMutation = () => { 19 | const { authorize, closeModal } = useUI(); 20 | return useMutation((input: SignUpInputType) => signUp(input), { 21 | onSuccess: (data) => { 22 | Cookies.set("auth_token", data.token); 23 | authorize(); 24 | closeModal(); 25 | }, 26 | onError: (data) => { 27 | console.log(data, "login error response"); 28 | }, 29 | }); 30 | }; 31 | -------------------------------------------------------------------------------- /src/framework/basic-rest/brand/get-all-brands.tsx: -------------------------------------------------------------------------------- 1 | import { QueryOptionsType, Brand } from "@framework/types"; 2 | import http from "@framework/utils/http"; 3 | import { API_ENDPOINTS } from "@framework/utils/api-endpoints"; 4 | import { useQuery } from "react-query"; 5 | 6 | export const fetchBrands = async ({ queryKey }: any) => { 7 | const [_key, _params] = queryKey; 8 | const { data } = await http.get(API_ENDPOINTS.BRANDS); 9 | return data; 10 | }; 11 | export const useBrandsQuery = (options: QueryOptionsType) => { 12 | return useQuery<{ brands: Brand[]; brandsGrid: Brand[] }, Error>( 13 | [API_ENDPOINTS.BRANDS, options], 14 | fetchBrands 15 | ); 16 | }; 17 | -------------------------------------------------------------------------------- /src/framework/basic-rest/category/get-all-categories.tsx: -------------------------------------------------------------------------------- 1 | import { CategoriesQueryOptionsType, Category } from "@framework/types"; 2 | import http from "@framework/utils/http"; 3 | import { API_ENDPOINTS } from "@framework/utils/api-endpoints"; 4 | import { useQuery } from "react-query"; 5 | 6 | export const fetchCategories = async ({ queryKey }: any) => { 7 | const [_key, _params] = queryKey; 8 | const { 9 | data: { data }, 10 | } = await http.get(API_ENDPOINTS.CATEGORIES); 11 | return { categories: { data: data as Category[] } }; 12 | }; 13 | export const useCategoriesQuery = (options: CategoriesQueryOptionsType) => { 14 | return useQuery<{ categories: { data: Category[] } }, Error>( 15 | [API_ENDPOINTS.CATEGORIES, options], 16 | fetchCategories 17 | ); 18 | }; 19 | -------------------------------------------------------------------------------- /src/framework/basic-rest/category/get-all-featured-categories.tsx: -------------------------------------------------------------------------------- 1 | import { QueryOptionsType, Category } from "@framework/types"; 2 | import http from "@framework/utils/http"; 3 | import { API_ENDPOINTS } from "@framework/utils/api-endpoints"; 4 | import { useQuery } from "react-query"; 5 | 6 | export const fetchFeaturedCategories = async ({ queryKey }: any) => { 7 | const [_key, _params] = queryKey; 8 | const { data } = await http.get(API_ENDPOINTS.FEATURED_CATEGORIES); 9 | return data; 10 | }; 11 | export const useFeaturedCategoriesQuery = (options: QueryOptionsType) => { 12 | return useQuery( 13 | [API_ENDPOINTS.FEATURED_CATEGORIES, options], 14 | fetchFeaturedCategories 15 | ); 16 | }; 17 | -------------------------------------------------------------------------------- /src/framework/basic-rest/category/get-category.tsx: -------------------------------------------------------------------------------- 1 | import { QueryOptionsType, Category } from "@framework/types"; 2 | import http from "@framework/utils/http"; 3 | import { API_ENDPOINTS } from "@framework/utils/api-endpoints"; 4 | import { useQuery } from "react-query"; 5 | 6 | export const fetchCategory = async ({ queryKey }: any) => { 7 | const [_key, _params] = queryKey; 8 | const { 9 | data: { data }, 10 | } = await http.get(API_ENDPOINTS.CATEGORIES); 11 | return { category: { data } }; 12 | }; 13 | export const useCategoriesQuery = (options: QueryOptionsType) => { 14 | return useQuery<{ category: { data: Category[] } }, Error>( 15 | [API_ENDPOINTS.CATEGORIES, options], 16 | fetchCategory 17 | ); 18 | }; 19 | -------------------------------------------------------------------------------- /src/framework/basic-rest/checkout/use-checkout.tsx: -------------------------------------------------------------------------------- 1 | // import { API_ENDPOINTS } from "@framework/utils/api-endpoints"; 2 | // import http from "@framework/utils/http"; 3 | import { useMutation } from "react-query"; 4 | 5 | export interface CheckoutInputType { 6 | firstName: string; 7 | lastName: string; 8 | phone: string; 9 | email: string; 10 | address: string; 11 | city: string; 12 | zipCode: string; 13 | save: boolean; 14 | note: string; 15 | } 16 | async function checkout(input: CheckoutInputType) { 17 | // return http.post(API_ENDPOINTS.ChangeEmail, input); 18 | return input; 19 | } 20 | export const useCheckoutMutation = () => { 21 | return useMutation((input: CheckoutInputType) => checkout(input), { 22 | onSuccess: (data) => { 23 | console.log(data, "Checkout success response"); 24 | }, 25 | onError: (data) => { 26 | console.log(data, "Checkout error response"); 27 | }, 28 | }); 29 | }; 30 | -------------------------------------------------------------------------------- /src/framework/basic-rest/customer/use-change-email.tsx: -------------------------------------------------------------------------------- 1 | // import { API_ENDPOINTS } from "@framework/utils/api-endpoints"; 2 | // import http from "@framework/utils/http"; 3 | import { useMutation } from "react-query"; 4 | 5 | export interface ChangeEmailInputType { 6 | newEmail: string; 7 | oldEmail: string; 8 | } 9 | async function changeEmail(input: ChangeEmailInputType) { 10 | // return http.post(API_ENDPOINTS.ChangeEmail, input); 11 | return input; 12 | } 13 | export const useChangeEmailMutation = () => { 14 | return useMutation((input: ChangeEmailInputType) => changeEmail(input), { 15 | onSuccess: (data) => { 16 | console.log(data, "ChangeEmail success response"); 17 | }, 18 | onError: (data) => { 19 | console.log(data, "ChangeEmail error response"); 20 | }, 21 | }); 22 | }; 23 | -------------------------------------------------------------------------------- /src/framework/basic-rest/customer/use-change-password.tsx: -------------------------------------------------------------------------------- 1 | // import { API_ENDPOINTS } from "@framework/utils/api-endpoints"; 2 | // import http from "@framework/utils/http"; 3 | import { useMutation } from "react-query"; 4 | 5 | export interface ChangePasswordInputType { 6 | newPassword: string; 7 | oldPassword: string; 8 | } 9 | async function changePassword(input: ChangePasswordInputType) { 10 | // return http.post(API_ENDPOINTS.ChangePassword, input); 11 | return input; 12 | } 13 | export const useChangePasswordMutation = () => { 14 | return useMutation( 15 | (input: ChangePasswordInputType) => changePassword(input), 16 | { 17 | onSuccess: (data) => { 18 | console.log(data, "ChangePassword success response"); 19 | }, 20 | onError: (data) => { 21 | console.log(data, "ChangePassword error response"); 22 | }, 23 | } 24 | ); 25 | }; 26 | -------------------------------------------------------------------------------- /src/framework/basic-rest/customer/use-update-customer.tsx: -------------------------------------------------------------------------------- 1 | // import { API_ENDPOINTS } from "@framework/utils/api-endpoints"; 2 | // import http from "@framework/utils/http"; 3 | import { useMutation } from "react-query"; 4 | 5 | export interface UpdateUserType { 6 | firstName: string; 7 | lastName: string; 8 | displayName: string; 9 | phoneNumber: string; 10 | email: string; 11 | password: string; 12 | confirmPassword: string; 13 | gender: string; 14 | } 15 | async function updateUser(input: UpdateUserType) { 16 | // return http.post(API_ENDPOINTS.ChangeEmail, input); 17 | return input; 18 | } 19 | export const useUpdateUserMutation = () => { 20 | return useMutation((input: UpdateUserType) => updateUser(input), { 21 | onSuccess: (data) => { 22 | console.log(data, "UpdateUser success response"); 23 | }, 24 | onError: (data) => { 25 | console.log(data, "UpdateUser error response"); 26 | }, 27 | }); 28 | }; 29 | -------------------------------------------------------------------------------- /src/framework/basic-rest/order/get-all-orders.ts: -------------------------------------------------------------------------------- 1 | import { QueryOptionsType, Order } from "@framework/types"; 2 | import http from "@framework/utils/http"; 3 | import { API_ENDPOINTS } from "@framework/utils/api-endpoints"; 4 | import { useQuery } from "react-query"; 5 | 6 | export const fetchOrders = async ({ queryKey }: any) => { 7 | const [_key, _params] = queryKey; 8 | const { 9 | data: { data }, 10 | } = await http.get(API_ENDPOINTS.ORDERS); 11 | return { orders: { data: data as Order[] } }; 12 | }; 13 | export const useOrdersQuery = (options: QueryOptionsType) => { 14 | return useQuery<{ orders: { data: Order[] } }, Error>( 15 | [API_ENDPOINTS.ORDERS, options], 16 | fetchOrders 17 | ); 18 | }; 19 | -------------------------------------------------------------------------------- /src/framework/basic-rest/order/get-order.ts: -------------------------------------------------------------------------------- 1 | import { Order } from "@framework/types"; 2 | import http from "@framework/utils/http"; 3 | import { API_ENDPOINTS } from "@framework/utils/api-endpoints"; 4 | import { useQuery } from "react-query"; 5 | 6 | export const fetchOrder = async (_id: string) => { 7 | const { data } = await http.get(`${API_ENDPOINTS.ORDER}`); 8 | return data; 9 | }; 10 | export const useOrderQuery = (id: string) => { 11 | return useQuery([API_ENDPOINTS.ORDER, id], () => 12 | fetchOrder(id) 13 | ); 14 | }; 15 | -------------------------------------------------------------------------------- /src/framework/basic-rest/product/get-all-best-seller-products.tsx: -------------------------------------------------------------------------------- 1 | import { QueryOptionsType, Product } from "@framework/types"; 2 | import http from "@framework/utils/http"; 3 | import { API_ENDPOINTS } from "@framework/utils/api-endpoints"; 4 | import { useQuery } from "react-query"; 5 | 6 | export const fetchBestSellerProducts = async ({ queryKey }: any) => { 7 | const [_key, _params] = queryKey; 8 | const { data } = await http.get(API_ENDPOINTS.BEST_SELLER_PRODUCTS); 9 | return data as Product[]; 10 | }; 11 | export const useBestSellerProductsQuery = (options: QueryOptionsType) => { 12 | return useQuery( 13 | [API_ENDPOINTS.BEST_SELLER_PRODUCTS, options], 14 | fetchBestSellerProducts 15 | ); 16 | }; 17 | -------------------------------------------------------------------------------- /src/framework/basic-rest/product/get-all-featured-products.tsx: -------------------------------------------------------------------------------- 1 | import { QueryOptionsType, Product } from "@framework/types"; 2 | import http from "@framework/utils/http"; 3 | import { API_ENDPOINTS } from "@framework/utils/api-endpoints"; 4 | import { useQuery } from "react-query"; 5 | 6 | export const fetchFeaturedProducts = async ({ queryKey }: any) => { 7 | const [_key, _params] = queryKey; 8 | const { data } = await http.get(API_ENDPOINTS.FEATURED_PRODUCTS); 9 | return data; 10 | }; 11 | export const useFeaturedProductsQuery = (options: QueryOptionsType) => { 12 | return useQuery( 13 | [API_ENDPOINTS.FEATURED_PRODUCTS, options], 14 | fetchFeaturedProducts 15 | ); 16 | }; 17 | -------------------------------------------------------------------------------- /src/framework/basic-rest/product/get-all-flash-sale-products.tsx: -------------------------------------------------------------------------------- 1 | import { QueryOptionsType } from "@framework/types"; 2 | import http from "@framework/utils/http"; 3 | import { API_ENDPOINTS } from "@framework/utils/api-endpoints"; 4 | import { useQuery } from "react-query"; 5 | 6 | export const fetchFlashSaleProducts = async ({ queryKey }: any) => { 7 | const [_key, _params] = queryKey; 8 | const { data } = await http.get(API_ENDPOINTS.FLASH_SALE_PRODUCTS); 9 | return data; 10 | }; 11 | export const useFlashSaleProductsQuery = (options: QueryOptionsType) => { 12 | return useQuery( 13 | [API_ENDPOINTS.FLASH_SALE_PRODUCTS, options], 14 | fetchFlashSaleProducts 15 | ); 16 | }; 17 | -------------------------------------------------------------------------------- /src/framework/basic-rest/product/get-all-new-arrival-products.tsx: -------------------------------------------------------------------------------- 1 | import { QueryOptionsType, Product } from "@framework/types"; 2 | import http from "@framework/utils/http"; 3 | import { API_ENDPOINTS } from "@framework/utils/api-endpoints"; 4 | import { useQuery } from "react-query"; 5 | 6 | export const fetchNewArrivalProducts = async ({ queryKey }: any) => { 7 | const [_key, _params] = queryKey; 8 | const { data } = await http.get(API_ENDPOINTS.NEW_ARRIVAL_PRODUCTS); 9 | return data as Product[]; 10 | }; 11 | export const useNewArrivalProductsQuery = (options: QueryOptionsType) => { 12 | return useQuery( 13 | [API_ENDPOINTS.NEW_ARRIVAL_PRODUCTS, options], 14 | fetchNewArrivalProducts 15 | ); 16 | }; 17 | -------------------------------------------------------------------------------- /src/framework/basic-rest/product/get-all-on-selling-products.tsx: -------------------------------------------------------------------------------- 1 | import { QueryOptionsType, Product } from "@framework/types"; 2 | import http from "@framework/utils/http"; 3 | import { API_ENDPOINTS } from "@framework/utils/api-endpoints"; 4 | import { useQuery } from "react-query"; 5 | 6 | export const fetchOnSellingProducts = async ({ queryKey }: any) => { 7 | const [_key, _params] = queryKey; 8 | const { data } = await http.get(API_ENDPOINTS.ON_SELLING_PRODUCTS); 9 | return data; 10 | }; 11 | export const useOnSellingProductsQuery = (options: QueryOptionsType) => { 12 | return useQuery( 13 | [API_ENDPOINTS.ON_SELLING_PRODUCTS, options], 14 | fetchOnSellingProducts 15 | ); 16 | }; 17 | -------------------------------------------------------------------------------- /src/framework/basic-rest/product/get-all-products.tsx: -------------------------------------------------------------------------------- 1 | import { QueryOptionsType, Product } from "@framework/types"; 2 | import { API_ENDPOINTS } from "@framework/utils/api-endpoints"; 3 | import http from "@framework/utils/http"; 4 | import shuffle from "lodash/shuffle"; 5 | import { useInfiniteQuery } from "react-query"; 6 | type PaginatedProduct = { 7 | data: Product[]; 8 | paginatorInfo: any; 9 | }; 10 | const fetchProducts = async ({ queryKey }: any) => { 11 | const [_key, _params] = queryKey; 12 | const { data } = await http.get(API_ENDPOINTS.PRODUCTS); 13 | return { 14 | data: shuffle(data), 15 | paginatorInfo: { 16 | nextPageUrl: "", 17 | }, 18 | }; 19 | }; 20 | 21 | const useProductsQuery = (options: QueryOptionsType) => { 22 | return useInfiniteQuery( 23 | [API_ENDPOINTS.PRODUCTS, options], 24 | fetchProducts, 25 | { 26 | getNextPageParam: ({ paginatorInfo }) => paginatorInfo.nextPageUrl, 27 | } 28 | ); 29 | }; 30 | 31 | export { useProductsQuery, fetchProducts }; 32 | -------------------------------------------------------------------------------- /src/framework/basic-rest/product/get-all-top-seller-products.tsx: -------------------------------------------------------------------------------- 1 | import { QueryOptionsType, Product } from "@framework/types"; 2 | import http from "@framework/utils/http"; 3 | import { API_ENDPOINTS } from "@framework/utils/api-endpoints"; 4 | import { useQuery } from "react-query"; 5 | 6 | export const fetchTopSellerProducts = async ({ queryKey }: any) => { 7 | const [_key, _params] = queryKey; 8 | const { data } = await http.get(API_ENDPOINTS.TOP_SELLER_PRODUCTS); 9 | return data; 10 | }; 11 | export const useTopSellerProductsQuery = (options: QueryOptionsType) => { 12 | return useQuery( 13 | [API_ENDPOINTS.TOP_SELLER_PRODUCTS, options], 14 | fetchTopSellerProducts 15 | ); 16 | }; 17 | -------------------------------------------------------------------------------- /src/framework/basic-rest/product/get-product.tsx: -------------------------------------------------------------------------------- 1 | import { Product } from "@framework/types"; 2 | import http from "@framework/utils/http"; 3 | import { API_ENDPOINTS } from "@framework/utils/api-endpoints"; 4 | import { useQuery } from "react-query"; 5 | 6 | export const fetchProduct = async (_slug: string) => { 7 | const { data } = await http.get(`${API_ENDPOINTS.PRODUCT}`); 8 | return data; 9 | }; 10 | export const useProductQuery = (slug: string) => { 11 | return useQuery([API_ENDPOINTS.PRODUCT, slug], () => 12 | fetchProduct(slug) 13 | ); 14 | }; 15 | -------------------------------------------------------------------------------- /src/framework/basic-rest/product/get-related-product.tsx: -------------------------------------------------------------------------------- 1 | import { QueryOptionsType, Product } from "@framework/types"; 2 | import http from "@framework/utils/http"; 3 | import { API_ENDPOINTS } from "@framework/utils/api-endpoints"; 4 | import { useQuery } from "react-query"; 5 | 6 | export const fetchRelatedProducts = async ({ queryKey }: any) => { 7 | const [_key, _params] = queryKey; 8 | const { data } = await http.get(API_ENDPOINTS.RELATED_PRODUCTS); 9 | return data; 10 | }; 11 | export const useRelatedProductsQuery = (options: QueryOptionsType) => { 12 | return useQuery( 13 | [API_ENDPOINTS.RELATED_PRODUCTS, options], 14 | fetchRelatedProducts 15 | ); 16 | }; 17 | -------------------------------------------------------------------------------- /src/framework/basic-rest/product/use-search.tsx: -------------------------------------------------------------------------------- 1 | import { QueryOptionsType, Product } from "@framework/types"; 2 | import http from "@framework/utils/http"; 3 | import { API_ENDPOINTS } from "@framework/utils/api-endpoints"; 4 | import { useQuery } from "react-query"; 5 | 6 | export const fetchSearchedProducts = async ({ queryKey }: any) => { 7 | const [_key, _params] = queryKey; 8 | const { data } = await http.get(API_ENDPOINTS.SEARCH); 9 | return data; 10 | }; 11 | export const useSearchQuery = (options: QueryOptionsType) => { 12 | return useQuery( 13 | [API_ENDPOINTS.SEARCH, options], 14 | fetchSearchedProducts 15 | ); 16 | }; 17 | -------------------------------------------------------------------------------- /src/framework/basic-rest/utils/api-endpoints.ts: -------------------------------------------------------------------------------- 1 | export const API_ENDPOINTS = { 2 | LOGIN: "/login", 3 | REGISTER: "/register", 4 | LOGOUT: "/logout", 5 | FORGET_PASSWORD: "/forget-password", 6 | CATEGORIES: "/categories.json", 7 | FEATURED_CATEGORIES: "/featured_categories.json", 8 | BRANDS: "/brands.json", 9 | PRODUCTS: "/products.json", 10 | FEATURED_PRODUCTS: "/featured_products.json", 11 | TOP_SELLER_PRODUCTS: "/products_top_seller.json", 12 | ON_SELLING_PRODUCTS: "/products_on_selling.json", 13 | PRODUCT: "/product.json", 14 | RELATED_PRODUCTS: "/related_products.json", 15 | BEST_SELLER_PRODUCTS: "/products_best_seller.json", 16 | NEW_ARRIVAL_PRODUCTS: "/products_new_arrival.json", 17 | FLASH_SALE_PRODUCTS: "/products_flash_sale.json", 18 | SEARCH: "/search.json", 19 | ORDERS: "/orders.json", 20 | ORDER: "/order.json", 21 | }; 22 | -------------------------------------------------------------------------------- /src/framework/basic-rest/utils/get-token.ts: -------------------------------------------------------------------------------- 1 | import Cookies from "js-cookie"; 2 | 3 | export const getToken = () => { 4 | if (typeof window === undefined) { 5 | return null; 6 | } 7 | return Cookies.get("auth_token"); 8 | }; 9 | -------------------------------------------------------------------------------- /src/framework/basic-rest/utils/get-variations.ts: -------------------------------------------------------------------------------- 1 | import groupBy from "lodash/groupBy"; 2 | 3 | export function getVariations(variations: object | undefined) { 4 | if (!variations) return {}; 5 | return groupBy(variations, "attribute.slug"); 6 | } 7 | -------------------------------------------------------------------------------- /src/framework/basic-rest/utils/http.ts: -------------------------------------------------------------------------------- 1 | import axios from "axios"; 2 | import { getToken } from "./get-token"; 3 | 4 | const http = axios.create({ 5 | baseURL: process.env.NEXT_PUBLIC_REST_API_ENDPOINT, 6 | timeout: 30000, 7 | headers: { 8 | Accept: "application/json", 9 | "Content-Type": "application/json", 10 | }, 11 | }); 12 | 13 | // Change request data/error here 14 | http.interceptors.request.use( 15 | (config) => { 16 | const token = getToken(); 17 | config.headers = { 18 | ...config.headers, 19 | Authorization: `Bearer ${token ? token : ""}`, 20 | }; 21 | return config; 22 | }, 23 | (error) => { 24 | return Promise.reject(error); 25 | } 26 | ); 27 | 28 | export default http; 29 | -------------------------------------------------------------------------------- /src/pages/404.tsx: -------------------------------------------------------------------------------- 1 | import Layout from "@components/layout/layout"; 2 | import { serverSideTranslations } from "next-i18next/serverSideTranslations"; 3 | import ErrorInformation from "@components/404/error-information"; 4 | 5 | export default function ErrorPage() { 6 | return ; 7 | } 8 | 9 | ErrorPage.Layout = Layout; 10 | 11 | export const getStaticProps = async ({ locale }: any) => { 12 | return { 13 | props: { 14 | ...(await serverSideTranslations(locale, [ 15 | "common", 16 | "forms", 17 | "menu", 18 | "footer", 19 | ])), 20 | }, 21 | }; 22 | }; 23 | -------------------------------------------------------------------------------- /src/pages/_document.tsx: -------------------------------------------------------------------------------- 1 | import Document, { 2 | Html, 3 | Head, 4 | Main, 5 | NextScript, 6 | DocumentContext, 7 | } from "next/document"; 8 | import { i18n } from "next-i18next"; 9 | import { getDirection } from "@utils/get-direction"; 10 | 11 | export default class CustomDocument extends Document { 12 | static async getInitialProps(ctx: DocumentContext) { 13 | return await Document.getInitialProps(ctx); 14 | } 15 | render() { 16 | const { locale } = this.props.__NEXT_DATA__; 17 | if (process.env.NODE_ENV !== "production") { 18 | i18n!.reloadResources(locale); 19 | } 20 | return ( 21 | 22 | 23 | 24 |
25 | 26 | 27 | 28 | ); 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /src/pages/faq.tsx: -------------------------------------------------------------------------------- 1 | import Container from "@components/ui/container"; 2 | import Layout from "@components/layout/layout"; 3 | import Subscription from "@components/common/subscription"; 4 | import Accordion from "@components/common/accordion"; 5 | import PageHeader from "@components/ui/page-header"; 6 | import { faq } from "@settings/faq.settings"; 7 | import { serverSideTranslations } from "next-i18next/serverSideTranslations"; 8 | 9 | export default function FAQ() { 10 | return ( 11 | <> 12 | 13 | 14 |
15 | 16 |
17 | 18 |
19 | 20 | ); 21 | } 22 | 23 | FAQ.Layout = Layout; 24 | 25 | export const getStaticProps = async ({ locale }: any) => { 26 | return { 27 | props: { 28 | ...(await serverSideTranslations(locale, [ 29 | "common", 30 | "forms", 31 | "menu", 32 | "faq", 33 | "footer", 34 | ])), 35 | }, 36 | }; 37 | }; 38 | -------------------------------------------------------------------------------- /src/pages/forget-password.tsx: -------------------------------------------------------------------------------- 1 | import Container from "@components/ui/container"; 2 | import Layout from "@components/layout/layout"; 3 | import ForgetPasswordForm from "@components/auth/forget-password-form"; 4 | import PageHeader from "@components/ui/page-header"; 5 | import Subscription from "@components/common/subscription"; 6 | import { serverSideTranslations } from "next-i18next/serverSideTranslations"; 7 | 8 | export default function ForgetPasswordPage() { 9 | return ( 10 | <> 11 | 12 | 13 |
14 | 15 |
16 | 17 |
18 | 19 | ); 20 | } 21 | 22 | ForgetPasswordPage.Layout = Layout; 23 | 24 | export const getStaticProps = async ({ locale }: any) => { 25 | return { 26 | props: { 27 | ...(await serverSideTranslations(locale, [ 28 | "common", 29 | "forms", 30 | "menu", 31 | "footer", 32 | ])), 33 | }, 34 | }; 35 | }; 36 | -------------------------------------------------------------------------------- /src/pages/my-account/account-details.tsx: -------------------------------------------------------------------------------- 1 | import Layout from "@components/layout/layout"; 2 | import AccountLayout from "@components/my-account/account-layout"; 3 | import AccountDetails from "@components/my-account/account-details"; 4 | import { serverSideTranslations } from "next-i18next/serverSideTranslations"; 5 | 6 | export default function AccountDetailsPage() { 7 | return ( 8 | 9 | 10 | 11 | ); 12 | } 13 | 14 | AccountDetailsPage.Layout = Layout; 15 | 16 | export const getStaticProps = async ({ locale }: any) => { 17 | return { 18 | props: { 19 | ...(await serverSideTranslations(locale, [ 20 | "common", 21 | "forms", 22 | "menu", 23 | "footer", 24 | ])), 25 | }, 26 | }; 27 | }; 28 | -------------------------------------------------------------------------------- /src/pages/my-account/change-password.tsx: -------------------------------------------------------------------------------- 1 | import Layout from "@components/layout/layout"; 2 | import AccountLayout from "@components/my-account/account-layout"; 3 | import ChangePassword from "@components/my-account/change-password"; 4 | import { serverSideTranslations } from "next-i18next/serverSideTranslations"; 5 | 6 | export default function ChangePasswordPage() { 7 | return ( 8 | 9 | 10 | 11 | ); 12 | } 13 | 14 | ChangePasswordPage.Layout = Layout; 15 | 16 | export const getStaticProps = async ({ locale }: any) => { 17 | return { 18 | props: { 19 | ...(await serverSideTranslations(locale, [ 20 | "common", 21 | "forms", 22 | "menu", 23 | "footer", 24 | ])), 25 | }, 26 | }; 27 | }; 28 | -------------------------------------------------------------------------------- /src/pages/my-account/orders/[id].tsx: -------------------------------------------------------------------------------- 1 | import Layout from "@components/layout/layout"; 2 | import AccountLayout from "@components/my-account/account-layout"; 3 | import OrderDetails from "@components/order/order-details"; 4 | 5 | export default function OrderPage() { 6 | return ( 7 | 8 | 9 | 10 | ); 11 | } 12 | 13 | OrderPage.Layout = Layout; 14 | -------------------------------------------------------------------------------- /src/pages/my-account/orders/index.tsx: -------------------------------------------------------------------------------- 1 | import Layout from "@components/layout/layout"; 2 | import AccountLayout from "@components/my-account/account-layout"; 3 | import OrdersTable from "@components/my-account/orders-table"; 4 | import { serverSideTranslations } from "next-i18next/serverSideTranslations"; 5 | 6 | export default function OrdersTablePage() { 7 | return ( 8 | 9 | 10 | 11 | ); 12 | } 13 | 14 | OrdersTablePage.Layout = Layout; 15 | 16 | export const getStaticProps = async ({ locale }: any) => { 17 | return { 18 | props: { 19 | ...(await serverSideTranslations(locale, [ 20 | "common", 21 | "forms", 22 | "menu", 23 | "footer", 24 | ])), 25 | }, 26 | }; 27 | }; 28 | -------------------------------------------------------------------------------- /src/pages/order.tsx: -------------------------------------------------------------------------------- 1 | import Container from "@components/ui/container"; 2 | import Layout from "@components/layout/layout"; 3 | import Subscription from "@components/common/subscription"; 4 | import PageHeader from "@components/ui/page-header"; 5 | import OrderInformation from "@components/order/order-information"; 6 | import { serverSideTranslations } from "next-i18next/serverSideTranslations"; 7 | 8 | export default function Order() { 9 | return ( 10 | <> 11 | 12 | 13 | 14 | 15 | 16 | 17 | ); 18 | } 19 | 20 | Order.Layout = Layout; 21 | 22 | export const getStaticProps = async ({ locale }: any) => { 23 | return { 24 | props: { 25 | ...(await serverSideTranslations(locale, [ 26 | "common", 27 | "forms", 28 | "menu", 29 | "footer", 30 | ])), 31 | }, 32 | }; 33 | }; 34 | -------------------------------------------------------------------------------- /src/pages/products/[slug].tsx: -------------------------------------------------------------------------------- 1 | import Container from "@components/ui/container"; 2 | import Layout from "@components/layout/layout"; 3 | import Subscription from "@components/common/subscription"; 4 | import ProductSingleDetails from "@components/product/product-single-details"; 5 | import RelatedProducts from "@containers/related-products"; 6 | import Divider from "@components/ui/divider"; 7 | import Breadcrumb from "@components/common/breadcrumb"; 8 | import { serverSideTranslations } from "next-i18next/serverSideTranslations"; 9 | 10 | export default function ProductPage() { 11 | return ( 12 | <> 13 | 14 | 15 |
16 | 17 |
18 | 19 | 20 | 21 |
22 | 23 | ); 24 | } 25 | 26 | ProductPage.Layout = Layout; 27 | 28 | export const getServerSideProps = async ({ locale }: any) => { 29 | return { 30 | props: { 31 | ...(await serverSideTranslations(locale, [ 32 | "common", 33 | "forms", 34 | "menu", 35 | "footer", 36 | ])), 37 | }, 38 | }; 39 | }; 40 | -------------------------------------------------------------------------------- /src/pages/signin.tsx: -------------------------------------------------------------------------------- 1 | import Container from "@components/ui/container"; 2 | import Layout from "@components/layout/layout"; 3 | import Subscription from "@components/common/subscription"; 4 | import LoginForm from "@components/auth/login-form"; 5 | import PageHeader from "@components/ui/page-header"; 6 | import { serverSideTranslations } from "next-i18next/serverSideTranslations"; 7 | 8 | export default function SignInPage() { 9 | return ( 10 | <> 11 | 12 | 13 |
14 | 15 |
16 | 17 |
18 | 19 | ); 20 | } 21 | 22 | SignInPage.Layout = Layout; 23 | 24 | export const getStaticProps = async ({ locale }: any) => { 25 | return { 26 | props: { 27 | ...(await serverSideTranslations(locale, [ 28 | "common", 29 | "forms", 30 | "menu", 31 | "footer", 32 | ])), 33 | }, 34 | }; 35 | }; 36 | -------------------------------------------------------------------------------- /src/pages/signup.tsx: -------------------------------------------------------------------------------- 1 | import Container from "@components/ui/container"; 2 | import Layout from "@components/layout/layout"; 3 | import SignUpForm from "@components/auth/sign-up-form"; 4 | import PageHeader from "@components/ui/page-header"; 5 | import Subscription from "@components/common/subscription"; 6 | import { serverSideTranslations } from "next-i18next/serverSideTranslations"; 7 | 8 | export default function SignUpPage() { 9 | return ( 10 | <> 11 | 12 | 13 |
14 | 15 |
16 | 17 |
18 | 19 | ); 20 | } 21 | 22 | SignUpPage.Layout = Layout; 23 | 24 | export const getStaticProps = async ({ locale }: any) => { 25 | return { 26 | props: { 27 | ...(await serverSideTranslations(locale, [ 28 | "common", 29 | "forms", 30 | "menu", 31 | "footer", 32 | ])), 33 | }, 34 | }; 35 | }; 36 | -------------------------------------------------------------------------------- /src/settings/faq.settings.ts: -------------------------------------------------------------------------------- 1 | export const faq = [ 2 | { 3 | titleKey: "faq-one-title", 4 | contentKey: "faq-one-content", 5 | }, 6 | { 7 | titleKey: "faq-two-title", 8 | contentKey: "faq-two-content", 9 | }, 10 | { 11 | titleKey: "faq-three-title", 12 | contentKey: "faq-three-content", 13 | }, 14 | { 15 | titleKey: "faq-four-title", 16 | contentKey: "faq-four-content", 17 | }, 18 | ]; -------------------------------------------------------------------------------- /src/settings/privacy-settings.ts: -------------------------------------------------------------------------------- 1 | export const privacyPolicy = [ 2 | { 3 | id: "1", 4 | title: "privacy-one-title", 5 | description:"privacy-one-content", 6 | }, 7 | { 8 | id: "2", 9 | title: "privacy-two-title", 10 | description: "privacy-two-content", 11 | }, 12 | { 13 | id: "3", 14 | title: "privacy-three-title", 15 | description:"privacy-three-content", 16 | }, 17 | { 18 | id: "4", 19 | title: "privacy-four-title", 20 | description:"privacy-four-content", 21 | }, 22 | { 23 | id: "5", 24 | title: "privacy-five-title", 25 | description:"privacy-five-content", 26 | }, 27 | { 28 | id: "6", 29 | title: "privacy-six-title", 30 | description:"privacy-six-content", 31 | }, 32 | ]; 33 | -------------------------------------------------------------------------------- /src/settings/terms-settings.ts: -------------------------------------------------------------------------------- 1 | export const termsAndServices = [ 2 | { 3 | id: "1", 4 | title: "terms-one-title", 5 | description:"terms-one-content", 6 | }, 7 | { 8 | id: "2", 9 | title: "terms-two-title", 10 | description: "terms-two-content", 11 | }, 12 | { 13 | id: "3", 14 | title: "terms-three-title", 15 | description:"terms-three-content", 16 | }, 17 | { 18 | id: "4", 19 | title: "terms-four-title", 20 | description:"terms-four-content", 21 | }, 22 | { 23 | id: "5", 24 | title: "terms-five-title", 25 | description:"terms-five-content", 26 | }, 27 | { 28 | id: "6", 29 | title: "terms-six-title", 30 | description:"terms-six-content", 31 | }, 32 | ]; 33 | -------------------------------------------------------------------------------- /src/utils/add-active-scroll.ts: -------------------------------------------------------------------------------- 1 | import {useEffect, RefObject} from 'react' 2 | 3 | export function addActiveScroll(ref: RefObject, topOffset: number = 80) { 4 | useEffect(() => { 5 | const element = ref?.current; 6 | const listener = () => { 7 | if (window.scrollY > topOffset) { 8 | element?.classList.add('is-scrolling'); 9 | } else { 10 | element?.classList.remove('is-scrolling'); 11 | } 12 | }; 13 | document.addEventListener('scroll', listener); 14 | return () => { 15 | document.removeEventListener('scroll', listener); 16 | }; 17 | }, []); 18 | } -------------------------------------------------------------------------------- /src/utils/constants.ts: -------------------------------------------------------------------------------- 1 | export const CUSTOMER = "customer"; 2 | -------------------------------------------------------------------------------- /src/utils/generate-cart-item-name.ts: -------------------------------------------------------------------------------- 1 | import isEmpty from "lodash/isEmpty"; 2 | import orderBy from "lodash/orderBy"; 3 | 4 | export function generateCartItemName(name: string, attributes: object) { 5 | if (!isEmpty(attributes)) { 6 | const sortedAttributes = orderBy(attributes); 7 | return `${name} - ${sortedAttributes.join(", ")}`; 8 | } 9 | return name; 10 | } 11 | -------------------------------------------------------------------------------- /src/utils/generate-cart-item.ts: -------------------------------------------------------------------------------- 1 | import isEmpty from "lodash/isEmpty"; 2 | 3 | interface Item { 4 | id: string | number; 5 | name: string; 6 | slug: string; 7 | image: { 8 | thumbnail: string; 9 | [key: string]: unknown; 10 | }; 11 | price: number; 12 | sale_price?: number; 13 | [key: string]: unknown; 14 | } 15 | export function generateCartItem(item: Item, attributes: object) { 16 | const { id, name, slug, image, price, sale_price } = item; 17 | return { 18 | id: !isEmpty(attributes) 19 | ? `${id}.${Object.values(attributes).join(".")}` 20 | : id, 21 | name, 22 | slug, 23 | image: image.thumbnail, 24 | price: sale_price ? sale_price : price, 25 | attributes, 26 | }; 27 | } 28 | -------------------------------------------------------------------------------- /src/utils/get-direction.ts: -------------------------------------------------------------------------------- 1 | export function getDirection(locale: string | undefined) { 2 | if (!locale) return "ltr"; 3 | const rtlLanguages = ["ar", "he"]; 4 | return rtlLanguages.includes(locale) ? "rtl" : "ltr"; 5 | } 6 | -------------------------------------------------------------------------------- /src/utils/motion/fade-in-left.ts: -------------------------------------------------------------------------------- 1 | export function fadeInLeft (duration:number = 0.3) { 2 | return { 3 | from: { 4 | left: '-100%', 5 | transition: { 6 | type: 'easeInOut', 7 | duration: duration, 8 | } 9 | }, 10 | to: { 11 | left: 0, 12 | transition: { 13 | type: 'easeInOut', 14 | duration: duration, 15 | } 16 | }, 17 | } 18 | } -------------------------------------------------------------------------------- /src/utils/motion/fade-in-out.ts: -------------------------------------------------------------------------------- 1 | export function fadeInOut (duration:number = 0.2) { 2 | return { 3 | from: { 4 | opacity: 0, 5 | transition: { 6 | type: 'easeInOut', 7 | duration: duration, 8 | } 9 | }, 10 | to: { 11 | opacity: 1, 12 | transition: { 13 | type: 'easeInOut', 14 | duration: duration, 15 | } 16 | }, 17 | } 18 | } -------------------------------------------------------------------------------- /src/utils/motion/fade-in-right.ts: -------------------------------------------------------------------------------- 1 | export function fadeInRight (duration:number = 0.3) { 2 | return { 3 | from: { 4 | right: '-100%', 5 | transition: { 6 | type: 'easeInOut', 7 | duration: duration, 8 | } 9 | }, 10 | to: { 11 | right: 0, 12 | transition: { 13 | type: 'easeInOut', 14 | duration: duration, 15 | } 16 | }, 17 | } 18 | } -------------------------------------------------------------------------------- /src/utils/motion/fade-in-top.ts: -------------------------------------------------------------------------------- 1 | export function fadeInTop (duration:number = 0.5) { 2 | return { 3 | from: { 4 | position: 'relative', 5 | top: "50px", 6 | opacity: 0, 7 | transition: { 8 | type: 'easeInOut', 9 | duration: duration, 10 | } 11 | }, 12 | to: { 13 | position: 'relative', 14 | top: "0", 15 | opacity: 1, 16 | transition: { 17 | type: 'easeInOut', 18 | duration: duration, 19 | } 20 | }, 21 | } 22 | } -------------------------------------------------------------------------------- /src/utils/motion/height-collapse.ts: -------------------------------------------------------------------------------- 1 | export function heightCollapse() { 2 | return { 3 | from: { 4 | opacity: 0, 5 | height: 0, 6 | transition: { 7 | ease: [0.04, 0.62, 0.23, 0.98], 8 | }, 9 | }, 10 | to: { 11 | opacity: 1, 12 | height: "auto", 13 | transition: { 14 | ease: [0.04, 0.62, 0.23, 0.98], 15 | }, 16 | }, 17 | }; 18 | } 19 | -------------------------------------------------------------------------------- /src/utils/motion/zoom-out-in.ts: -------------------------------------------------------------------------------- 1 | export function zoomOutIn (duration:number = 0.2) { 2 | return { 3 | from: { 4 | scale: 1.1, 5 | transition: { 6 | type: 'easeOut', 7 | duration: duration, 8 | } 9 | }, 10 | to: { 11 | scale: 1, 12 | transition: { 13 | type: 'easeOut', 14 | duration: duration, 15 | } 16 | }, 17 | } 18 | } -------------------------------------------------------------------------------- /src/utils/routes.ts: -------------------------------------------------------------------------------- 1 | export const ROUTES = { 2 | HOME: "/", 3 | PRODUCT: `/products`, 4 | CHECKOUT: "/checkout", 5 | CONTACT: "/contact-us", 6 | TERMS: "/terms", 7 | POLICY: "/privacy", 8 | FAQ: "/faq", 9 | FORGET_PASSWORD: "/forget-password", 10 | ACCOUNT: "/my-account", 11 | ORDERS: "/my-account/orders", 12 | ACCOUNT_DETAILS: "/my-account/account-details", 13 | CHANGE_PASSWORD: "/my-account/change-password", 14 | SHOP: "/shop", 15 | LOGIN: "/signin", 16 | SIGN_UP: "/signup", 17 | SEARCH: "/search", 18 | ORDER: "/order", 19 | }; 20 | -------------------------------------------------------------------------------- /src/utils/use-breadcrumb.ts: -------------------------------------------------------------------------------- 1 | import { useState, useEffect } from "react"; 2 | import { useRouter } from "next/router"; 3 | 4 | export function convertBreadcrumbTitle(string: string) { 5 | return string 6 | .replace(/-/g, " ") 7 | .replace(/oe/g, "ö") 8 | .replace(/ae/g, "ä") 9 | .replace(/ue/g, "ü") 10 | .toLowerCase(); 11 | } 12 | 13 | export default function useBreadcrumb() { 14 | const router = useRouter(); 15 | const [breadcrumbs, setBreadcrumbs] = useState(null); 16 | 17 | useEffect(() => { 18 | if (router) { 19 | const linkPath = router.asPath.split("/"); 20 | linkPath.shift(); 21 | 22 | const pathArray = linkPath.map((path, i) => { 23 | return { 24 | breadcrumb: path, 25 | href: "/" + linkPath.slice(0, i + 1).join("/"), 26 | }; 27 | }); 28 | 29 | setBreadcrumbs(pathArray); 30 | } 31 | }, [router]); 32 | 33 | return breadcrumbs; 34 | } 35 | -------------------------------------------------------------------------------- /src/utils/use-click-outside.ts: -------------------------------------------------------------------------------- 1 | import { useEffect, RefObject } from 'react' 2 | 3 | type Event = MouseEvent | TouchEvent 4 | 5 | export default function useOnClickOutside( 6 | ref: RefObject, 7 | handler: (event: Event) => void, 8 | ) { 9 | useEffect( 10 | () => { 11 | const listener = (event: Event) => { 12 | const el = ref?.current 13 | if (!el || el.contains((event?.target as Node) || null)) { 14 | return 15 | } 16 | handler(event); 17 | }; 18 | document.addEventListener('mousedown', listener); 19 | document.addEventListener('touchstart', listener); 20 | return () => { 21 | document.removeEventListener('mousedown', listener); 22 | document.removeEventListener('touchstart', listener); 23 | }; 24 | }, 25 | [ref, handler] 26 | ); 27 | } -------------------------------------------------------------------------------- /src/utils/use-local-storage.ts: -------------------------------------------------------------------------------- 1 | export { default as useLocalStorage } from "react-use/lib/useLocalStorage"; 2 | -------------------------------------------------------------------------------- /src/utils/use-window-size.ts: -------------------------------------------------------------------------------- 1 | export { default as useWindowSize } from "react-use/lib/useWindowSize"; 2 | -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "baseUrl": ".", 4 | "target": "es5", 5 | "lib": ["dom", "dom.iterable", "esnext"], 6 | "allowJs": true, 7 | "skipLibCheck": true, 8 | "strict": true, 9 | "forceConsistentCasingInFileNames": true, 10 | "noEmit": true, 11 | "esModuleInterop": true, 12 | "alwaysStrict": true, 13 | "noFallthroughCasesInSwitch": true, 14 | "noUnusedLocals": true, 15 | "noUnusedParameters": true, 16 | "module": "esnext", 17 | "moduleResolution": "node", 18 | "resolveJsonModule": true, 19 | "isolatedModules": true, 20 | "jsx": "preserve", 21 | "paths": { 22 | "@components/*": ["src/components/*"], 23 | "@containers/*": ["src/containers/*"], 24 | "@contexts/*": ["src/contexts/*"], 25 | "@framework/*": ["src/framework/basic-rest/*"], 26 | "@settings/*": ["src/settings/*"], 27 | "@styles/*": ["src/styles/*"], 28 | "@utils/*": ["src/utils/*"] 29 | } 30 | }, 31 | "include": ["next-env.d.ts", "src/**/*.ts", "src/**/*.tsx"], 32 | "exclude": ["node_modules"] 33 | } 34 | -------------------------------------------------------------------------------- /vercel.json: -------------------------------------------------------------------------------- 1 | { 2 | "env": { 3 | "NEXT_PUBLIC_REST_API_ENDPOINT": "Put your api endpoint here" 4 | }, 5 | "build": { 6 | "env": { 7 | "NEXT_PUBLIC_REST_API_ENDPOINT": "Put your api endpoint here" 8 | } 9 | } 10 | } 11 | --------------------------------------------------------------------------------