├── next.config.mjs ├── src ├── app │ ├── favicon.ico │ ├── providers.tsx │ ├── layout.tsx │ └── page.tsx ├── types │ ├── review.types.ts │ └── product.types.ts ├── styles │ ├── fonts │ │ ├── Satoshi-Bold.eot │ │ ├── Satoshi-Bold.ttf │ │ ├── Satoshi-Bold.woff │ │ ├── Satoshi-Bold.woff2 │ │ ├── Satoshi-Medium.eot │ │ ├── Satoshi-Medium.ttf │ │ ├── Satoshi-Medium.woff │ │ ├── Satoshi-Medium.woff2 │ │ ├── Satoshi-Regular.eot │ │ ├── Satoshi-Regular.ttf │ │ ├── Satoshi-Regular.woff │ │ ├── integralcf-bold.eot │ │ ├── integralcf-bold.ttf │ │ ├── integralcf-bold.woff │ │ ├── Satoshi-Regular.woff2 │ │ ├── integralcf-bold.woff2 │ │ └── index.ts │ └── globals.css ├── components │ ├── ui │ │ ├── SpinnerbLoader │ │ │ ├── SpinnerbLoader.module.css │ │ │ └── index.tsx │ │ ├── Rating.tsx │ │ ├── AnimatedCounter.tsx │ │ ├── separator.tsx │ │ ├── slider copy.tsx │ │ ├── input-group.tsx │ │ ├── button.tsx │ │ ├── CartCounter.tsx │ │ ├── accordion.tsx │ │ ├── slider.tsx │ │ ├── breadcrumb.tsx │ │ ├── pagination.tsx │ │ ├── drawer.tsx │ │ ├── sheet.tsx │ │ ├── navigation-menu.tsx │ │ ├── select.tsx │ │ └── carousel.tsx │ ├── layout │ │ ├── Footer │ │ │ ├── LayoutSpacing.tsx │ │ │ ├── footer.types.ts │ │ │ ├── NewsLetterSection.tsx │ │ │ ├── LinksSection.tsx │ │ │ └── index.tsx │ │ ├── Navbar │ │ │ ├── navbar.types.ts │ │ │ └── TopNavbar │ │ │ │ ├── MenuItem.tsx │ │ │ │ ├── CartBtn.tsx │ │ │ │ ├── MenuList.tsx │ │ │ │ ├── ResTopNavbar.tsx │ │ │ │ └── index.tsx │ │ └── Banner │ │ │ └── TopBanner.tsx │ ├── storage │ │ └── index.tsx │ ├── shop-page │ │ ├── filters │ │ │ ├── PriceSection.tsx │ │ │ ├── index.tsx │ │ │ ├── CategoriesSection.tsx │ │ │ ├── MobileFilters.tsx │ │ │ ├── DressStyleSection.tsx │ │ │ ├── SizeSection.tsx │ │ │ └── ColorsSection.tsx │ │ └── BreadcrumbShop.tsx │ ├── homepage │ │ ├── DressStyle │ │ │ ├── DressStyleCard.tsx │ │ │ └── index.tsx │ │ ├── Brands │ │ │ └── index.tsx │ │ ├── Reviews │ │ │ └── index.tsx │ │ └── Header │ │ │ └── index.tsx │ ├── product-page │ │ ├── Header │ │ │ ├── AddToCardSection.tsx │ │ │ ├── AddToCartBtn.tsx │ │ │ ├── SizeSelection.tsx │ │ │ ├── ColorSelection.tsx │ │ │ ├── PhotoSection.tsx │ │ │ └── index.tsx │ │ └── BreadcrumbProduct.tsx │ └── common │ │ ├── ReviewCard.tsx │ │ ├── ProductListSec.tsx │ │ └── ProductCard.tsx └── lib │ ├── utils.ts │ ├── hooks │ └── redux.tsx │ ├── features │ ├── products │ │ └── productsSlice.ts │ └── carts │ │ └── cartsSlice.ts │ └── store.ts ├── public ├── images │ ├── pic1.png │ ├── pic2.png │ ├── pic3.png │ ├── pic4.png │ ├── pic5.png │ ├── pic6.png │ ├── pic7.png │ ├── pic8.png │ ├── pic9.png │ ├── pic10.png │ ├── pic11.png │ ├── pic12.png │ ├── pic13.png │ ├── pic14.png │ ├── pic15.png │ ├── dress-style-1.png │ ├── dress-style-2.png │ ├── dress-style-3.png │ ├── dress-style-4.png │ ├── header-homepage.png │ └── header-res-homepage.png └── icons │ ├── big-star.svg │ ├── small-star.svg │ ├── facebook.svg │ ├── minus.svg │ ├── keyboardArrowDown.svg │ ├── envelope.svg │ ├── keyboardArrowRight.svg │ ├── plus.svg │ ├── check.svg │ ├── arrowRight.svg │ ├── arrowLeft.svg │ ├── times.svg │ ├── xTwitter.svg │ ├── menu.svg │ ├── Visa.svg │ ├── outlineOffer.svg │ ├── github.svg │ ├── search-black.svg │ ├── circleCheck.svg │ ├── search.svg │ ├── dotsHorizontal.svg │ ├── trash.svg │ ├── mastercard.svg │ ├── cart.svg │ ├── zara-logo.svg │ ├── user.svg │ ├── applePay.svg │ ├── prada-logo.svg │ ├── calvin-klein-logo.svg │ ├── googlePay.svg │ ├── verticalSlider.svg │ ├── versace-logo.svg │ ├── instagram.svg │ └── paypal.svg ├── postcss.config.mjs ├── next-env.d.ts ├── components.json ├── tsconfig.json ├── package.json └── tailwind.config.ts /next.config.mjs: -------------------------------------------------------------------------------- 1 | /** @type {import('next').NextConfig} */ 2 | const nextConfig = {}; 3 | 4 | export default nextConfig; 5 | -------------------------------------------------------------------------------- /src/app/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mshsheikh/Pixel-Perfect-Mobile-Responsive-Page-Using-Next.js-TailwindCSS-Figma/HEAD/src/app/favicon.ico -------------------------------------------------------------------------------- /public/images/pic1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mshsheikh/Pixel-Perfect-Mobile-Responsive-Page-Using-Next.js-TailwindCSS-Figma/HEAD/public/images/pic1.png -------------------------------------------------------------------------------- /public/images/pic2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mshsheikh/Pixel-Perfect-Mobile-Responsive-Page-Using-Next.js-TailwindCSS-Figma/HEAD/public/images/pic2.png -------------------------------------------------------------------------------- /public/images/pic3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mshsheikh/Pixel-Perfect-Mobile-Responsive-Page-Using-Next.js-TailwindCSS-Figma/HEAD/public/images/pic3.png -------------------------------------------------------------------------------- /public/images/pic4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mshsheikh/Pixel-Perfect-Mobile-Responsive-Page-Using-Next.js-TailwindCSS-Figma/HEAD/public/images/pic4.png -------------------------------------------------------------------------------- /public/images/pic5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mshsheikh/Pixel-Perfect-Mobile-Responsive-Page-Using-Next.js-TailwindCSS-Figma/HEAD/public/images/pic5.png -------------------------------------------------------------------------------- /public/images/pic6.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mshsheikh/Pixel-Perfect-Mobile-Responsive-Page-Using-Next.js-TailwindCSS-Figma/HEAD/public/images/pic6.png -------------------------------------------------------------------------------- /public/images/pic7.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mshsheikh/Pixel-Perfect-Mobile-Responsive-Page-Using-Next.js-TailwindCSS-Figma/HEAD/public/images/pic7.png -------------------------------------------------------------------------------- /public/images/pic8.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mshsheikh/Pixel-Perfect-Mobile-Responsive-Page-Using-Next.js-TailwindCSS-Figma/HEAD/public/images/pic8.png -------------------------------------------------------------------------------- /public/images/pic9.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mshsheikh/Pixel-Perfect-Mobile-Responsive-Page-Using-Next.js-TailwindCSS-Figma/HEAD/public/images/pic9.png -------------------------------------------------------------------------------- /public/images/pic10.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mshsheikh/Pixel-Perfect-Mobile-Responsive-Page-Using-Next.js-TailwindCSS-Figma/HEAD/public/images/pic10.png -------------------------------------------------------------------------------- /public/images/pic11.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mshsheikh/Pixel-Perfect-Mobile-Responsive-Page-Using-Next.js-TailwindCSS-Figma/HEAD/public/images/pic11.png -------------------------------------------------------------------------------- /public/images/pic12.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mshsheikh/Pixel-Perfect-Mobile-Responsive-Page-Using-Next.js-TailwindCSS-Figma/HEAD/public/images/pic12.png -------------------------------------------------------------------------------- /public/images/pic13.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mshsheikh/Pixel-Perfect-Mobile-Responsive-Page-Using-Next.js-TailwindCSS-Figma/HEAD/public/images/pic13.png -------------------------------------------------------------------------------- /public/images/pic14.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mshsheikh/Pixel-Perfect-Mobile-Responsive-Page-Using-Next.js-TailwindCSS-Figma/HEAD/public/images/pic14.png -------------------------------------------------------------------------------- /public/images/pic15.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mshsheikh/Pixel-Perfect-Mobile-Responsive-Page-Using-Next.js-TailwindCSS-Figma/HEAD/public/images/pic15.png -------------------------------------------------------------------------------- /src/types/review.types.ts: -------------------------------------------------------------------------------- 1 | export type Review = { 2 | id: number; 3 | user: string; 4 | content: string; 5 | rating: number; 6 | date: string; 7 | }; 8 | -------------------------------------------------------------------------------- /public/images/dress-style-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mshsheikh/Pixel-Perfect-Mobile-Responsive-Page-Using-Next.js-TailwindCSS-Figma/HEAD/public/images/dress-style-1.png -------------------------------------------------------------------------------- /public/images/dress-style-2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mshsheikh/Pixel-Perfect-Mobile-Responsive-Page-Using-Next.js-TailwindCSS-Figma/HEAD/public/images/dress-style-2.png -------------------------------------------------------------------------------- /public/images/dress-style-3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mshsheikh/Pixel-Perfect-Mobile-Responsive-Page-Using-Next.js-TailwindCSS-Figma/HEAD/public/images/dress-style-3.png -------------------------------------------------------------------------------- /public/images/dress-style-4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mshsheikh/Pixel-Perfect-Mobile-Responsive-Page-Using-Next.js-TailwindCSS-Figma/HEAD/public/images/dress-style-4.png -------------------------------------------------------------------------------- /public/images/header-homepage.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mshsheikh/Pixel-Perfect-Mobile-Responsive-Page-Using-Next.js-TailwindCSS-Figma/HEAD/public/images/header-homepage.png -------------------------------------------------------------------------------- /src/styles/fonts/Satoshi-Bold.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mshsheikh/Pixel-Perfect-Mobile-Responsive-Page-Using-Next.js-TailwindCSS-Figma/HEAD/src/styles/fonts/Satoshi-Bold.eot -------------------------------------------------------------------------------- /src/styles/fonts/Satoshi-Bold.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mshsheikh/Pixel-Perfect-Mobile-Responsive-Page-Using-Next.js-TailwindCSS-Figma/HEAD/src/styles/fonts/Satoshi-Bold.ttf -------------------------------------------------------------------------------- /src/styles/fonts/Satoshi-Bold.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mshsheikh/Pixel-Perfect-Mobile-Responsive-Page-Using-Next.js-TailwindCSS-Figma/HEAD/src/styles/fonts/Satoshi-Bold.woff -------------------------------------------------------------------------------- /public/images/header-res-homepage.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mshsheikh/Pixel-Perfect-Mobile-Responsive-Page-Using-Next.js-TailwindCSS-Figma/HEAD/public/images/header-res-homepage.png -------------------------------------------------------------------------------- /src/styles/fonts/Satoshi-Bold.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mshsheikh/Pixel-Perfect-Mobile-Responsive-Page-Using-Next.js-TailwindCSS-Figma/HEAD/src/styles/fonts/Satoshi-Bold.woff2 -------------------------------------------------------------------------------- /src/styles/fonts/Satoshi-Medium.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mshsheikh/Pixel-Perfect-Mobile-Responsive-Page-Using-Next.js-TailwindCSS-Figma/HEAD/src/styles/fonts/Satoshi-Medium.eot -------------------------------------------------------------------------------- /src/styles/fonts/Satoshi-Medium.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mshsheikh/Pixel-Perfect-Mobile-Responsive-Page-Using-Next.js-TailwindCSS-Figma/HEAD/src/styles/fonts/Satoshi-Medium.ttf -------------------------------------------------------------------------------- /src/styles/fonts/Satoshi-Medium.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mshsheikh/Pixel-Perfect-Mobile-Responsive-Page-Using-Next.js-TailwindCSS-Figma/HEAD/src/styles/fonts/Satoshi-Medium.woff -------------------------------------------------------------------------------- /src/styles/fonts/Satoshi-Medium.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mshsheikh/Pixel-Perfect-Mobile-Responsive-Page-Using-Next.js-TailwindCSS-Figma/HEAD/src/styles/fonts/Satoshi-Medium.woff2 -------------------------------------------------------------------------------- /src/styles/fonts/Satoshi-Regular.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mshsheikh/Pixel-Perfect-Mobile-Responsive-Page-Using-Next.js-TailwindCSS-Figma/HEAD/src/styles/fonts/Satoshi-Regular.eot -------------------------------------------------------------------------------- /src/styles/fonts/Satoshi-Regular.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mshsheikh/Pixel-Perfect-Mobile-Responsive-Page-Using-Next.js-TailwindCSS-Figma/HEAD/src/styles/fonts/Satoshi-Regular.ttf -------------------------------------------------------------------------------- /src/styles/fonts/Satoshi-Regular.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mshsheikh/Pixel-Perfect-Mobile-Responsive-Page-Using-Next.js-TailwindCSS-Figma/HEAD/src/styles/fonts/Satoshi-Regular.woff -------------------------------------------------------------------------------- /src/styles/fonts/integralcf-bold.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mshsheikh/Pixel-Perfect-Mobile-Responsive-Page-Using-Next.js-TailwindCSS-Figma/HEAD/src/styles/fonts/integralcf-bold.eot -------------------------------------------------------------------------------- /src/styles/fonts/integralcf-bold.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mshsheikh/Pixel-Perfect-Mobile-Responsive-Page-Using-Next.js-TailwindCSS-Figma/HEAD/src/styles/fonts/integralcf-bold.ttf -------------------------------------------------------------------------------- /src/styles/fonts/integralcf-bold.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mshsheikh/Pixel-Perfect-Mobile-Responsive-Page-Using-Next.js-TailwindCSS-Figma/HEAD/src/styles/fonts/integralcf-bold.woff -------------------------------------------------------------------------------- /postcss.config.mjs: -------------------------------------------------------------------------------- 1 | /** @type {import('postcss-load-config').Config} */ 2 | const config = { 3 | plugins: { 4 | tailwindcss: {}, 5 | }, 6 | }; 7 | 8 | export default config; 9 | -------------------------------------------------------------------------------- /src/styles/fonts/Satoshi-Regular.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mshsheikh/Pixel-Perfect-Mobile-Responsive-Page-Using-Next.js-TailwindCSS-Figma/HEAD/src/styles/fonts/Satoshi-Regular.woff2 -------------------------------------------------------------------------------- /src/styles/fonts/integralcf-bold.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mshsheikh/Pixel-Perfect-Mobile-Responsive-Page-Using-Next.js-TailwindCSS-Figma/HEAD/src/styles/fonts/integralcf-bold.woff2 -------------------------------------------------------------------------------- /next-env.d.ts: -------------------------------------------------------------------------------- 1 | /// 2 | /// 3 | 4 | // NOTE: This file should not be edited 5 | // see https://nextjs.org/docs/basic-features/typescript for more information. 6 | -------------------------------------------------------------------------------- /src/components/ui/SpinnerbLoader/SpinnerbLoader.module.css: -------------------------------------------------------------------------------- 1 | /* .Loader { 2 | aspect-ratio: 1; 3 | border-radius: 50%; 4 | animation: l2 1s infinite linear; 5 | display: inline-block; 6 | } 7 | @keyframes l2 { 8 | to { 9 | transform: rotate(1turn); 10 | } 11 | } */ 12 | -------------------------------------------------------------------------------- /src/components/ui/Rating.tsx: -------------------------------------------------------------------------------- 1 | "use client"; 2 | 3 | import React from "react"; 4 | import { Rating as SimpleRating, RatingProps } from "react-simple-star-rating"; 5 | 6 | const Rating = (props: RatingProps) => { 7 | return ; 8 | }; 9 | 10 | export default Rating; 11 | -------------------------------------------------------------------------------- /public/icons/big-star.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /public/icons/small-star.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /src/types/product.types.ts: -------------------------------------------------------------------------------- 1 | export type Discount = { 2 | amount: number; 3 | percentage: number; 4 | }; 5 | 6 | export type Product = { 7 | id: number; 8 | title: string; 9 | srcUrl: string; 10 | gallery?: string[]; 11 | price: number; 12 | discount: Discount; 13 | rating: number; 14 | }; 15 | -------------------------------------------------------------------------------- /src/lib/utils.ts: -------------------------------------------------------------------------------- 1 | import { clsx, type ClassValue } from "clsx"; 2 | import { twMerge } from "tailwind-merge"; 3 | 4 | export function cn(...inputs: ClassValue[]) { 5 | return twMerge(clsx(inputs)); 6 | } 7 | 8 | export const compareArrays = (a: any[], b: any[]) => { 9 | return a.toString() === b.toString(); 10 | }; 11 | -------------------------------------------------------------------------------- /src/components/ui/SpinnerbLoader/index.tsx: -------------------------------------------------------------------------------- 1 | import React from "react"; 2 | import s from "./SpinnerbLoader.module.css"; 3 | import cn from "clsx"; 4 | 5 | const SpinnerbLoader = ({ className }: any) => { 6 | return ; 7 | }; 8 | 9 | export default SpinnerbLoader; 10 | -------------------------------------------------------------------------------- /src/components/layout/Footer/LayoutSpacing.tsx: -------------------------------------------------------------------------------- 1 | "use client"; 2 | 3 | import { usePathname } from "next/navigation"; 4 | import React from "react"; 5 | 6 | const LayoutSpacing = () => { 7 | const pathname = usePathname(); 8 | 9 | if (!pathname.includes("product")) return; 10 | 11 | return
; 12 | }; 13 | 14 | export default LayoutSpacing; 15 | -------------------------------------------------------------------------------- /public/icons/facebook.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /src/lib/hooks/redux.tsx: -------------------------------------------------------------------------------- 1 | import { useDispatch, useSelector, useStore } from "react-redux"; 2 | import type { RootState, AppDispatch, AppStore } from "../store"; 3 | 4 | // Use throughout your app instead of plain `useDispatch` and `useSelector` 5 | export const useAppDispatch = useDispatch.withTypes(); 6 | export const useAppSelector = useSelector.withTypes(); 7 | export const useAppStore = useStore.withTypes(); 8 | -------------------------------------------------------------------------------- /src/components/layout/Footer/footer.types.ts: -------------------------------------------------------------------------------- 1 | import React from "react"; 2 | 3 | export type SocialNetworks = { 4 | id: number; 5 | icon: React.ReactNode; 6 | url: string; 7 | }; 8 | 9 | export type FLink = { 10 | id: number; 11 | label: string; 12 | url: string; 13 | }; 14 | 15 | export type FooterLinks = { 16 | id: number; 17 | title: string; 18 | children: FLink[]; 19 | }; 20 | 21 | export type PaymentBadge = { 22 | id: number; 23 | srcUrl: string; 24 | }; 25 | -------------------------------------------------------------------------------- /public/icons/minus.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /components.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "https://ui.shadcn.com/schema.json", 3 | "style": "new-york", 4 | "rsc": true, 5 | "tsx": true, 6 | "tailwind": { 7 | "config": "tailwind.config.ts", 8 | "css": "src/styles/globals.css", 9 | "baseColor": "slate", 10 | "cssVariables": true, 11 | "prefix": "" 12 | }, 13 | "aliases": { 14 | "components": "@/components", 15 | "utils": "@/lib/utils", 16 | "ui": "@/components/ui", 17 | "lib": "@/lib", 18 | "hooks": "@/hooks" 19 | } 20 | } -------------------------------------------------------------------------------- /src/components/layout/Navbar/navbar.types.ts: -------------------------------------------------------------------------------- 1 | import React from "react"; 2 | 3 | export type MenuItem = { 4 | id: number; 5 | type: "MenuItem" | "MenuList"; 6 | label: string; 7 | url?: string; 8 | children: 9 | | (Omit & { 10 | description?: string | React.ReactNode; 11 | })[] 12 | | []; 13 | }; 14 | 15 | export type MenuListData = (Omit & { 16 | description?: string | React.ReactNode; 17 | })[]; 18 | 19 | export type NavMenu = MenuItem[]; 20 | -------------------------------------------------------------------------------- /src/components/storage/index.tsx: -------------------------------------------------------------------------------- 1 | import createWebStorage from "redux-persist/lib/storage/createWebStorage"; 2 | 3 | const createNoopStorage = () => { 4 | return { 5 | getItem(_key: any) { 6 | return Promise.resolve(null); 7 | }, 8 | setItem(_key: any, value: any) { 9 | return Promise.resolve(value); 10 | }, 11 | removeItem(_key: any) { 12 | return Promise.resolve(); 13 | }, 14 | }; 15 | }; 16 | 17 | const storage = 18 | typeof window !== "undefined" 19 | ? createWebStorage("local") 20 | : createNoopStorage(); 21 | 22 | export default storage; 23 | -------------------------------------------------------------------------------- /src/components/ui/AnimatedCounter.tsx: -------------------------------------------------------------------------------- 1 | "use client"; 2 | 3 | import { useRef, useEffect } from "react"; 4 | 5 | type AnimatedCounterProps = { 6 | from: number; 7 | to: number; 8 | }; 9 | 10 | const AnimatedCounter = ({ from, to }: AnimatedCounterProps) => { 11 | const ref = useRef(null); 12 | 13 | useEffect(() => { 14 | const element = ref.current; 15 | if (!element) return; 16 | 17 | // Set the final value immediately 18 | element.textContent = String(to); 19 | }, [to]); 20 | 21 | return {from}; 22 | }; 23 | 24 | export default AnimatedCounter; 25 | -------------------------------------------------------------------------------- /src/components/shop-page/filters/PriceSection.tsx: -------------------------------------------------------------------------------- 1 | import React from "react"; 2 | import { Slider } from "@/components/ui/slider"; 3 | 4 | const PriceSection = () => { 5 | return ( 6 |
7 |
8 | Price 9 |
10 |
11 | 18 |
19 |
20 |
21 | ); 22 | }; 23 | 24 | export default PriceSection; 25 | -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "lib": ["dom", "dom.iterable", "esnext"], 4 | "allowJs": true, 5 | "skipLibCheck": true, 6 | "strict": true, 7 | "noEmit": true, 8 | "esModuleInterop": true, 9 | "module": "esnext", 10 | "moduleResolution": "bundler", 11 | "resolveJsonModule": true, 12 | "isolatedModules": true, 13 | "jsx": "preserve", 14 | "incremental": true, 15 | "plugins": [ 16 | { 17 | "name": "next" 18 | } 19 | ], 20 | "paths": { 21 | "@/*": ["./src/*"] 22 | } 23 | }, 24 | "include": ["next-env.d.ts", "**/*.ts", "**/*.tsx", ".next/types/**/*.ts"], 25 | "exclude": ["node_modules"] 26 | } 27 | -------------------------------------------------------------------------------- /src/components/homepage/DressStyle/DressStyleCard.tsx: -------------------------------------------------------------------------------- 1 | import { cn } from "@/lib/utils"; 2 | import Link from "next/link"; 3 | import React from "react"; 4 | 5 | type DressStyleCardProps = { 6 | title: string; 7 | url: string; 8 | className?: string; 9 | }; 10 | 11 | const DressStyleCard = ({ title, url, className }: DressStyleCardProps) => { 12 | return ( 13 | 20 | {title} 21 | 22 | ); 23 | }; 24 | 25 | export default DressStyleCard; 26 | -------------------------------------------------------------------------------- /src/components/layout/Navbar/TopNavbar/MenuItem.tsx: -------------------------------------------------------------------------------- 1 | import * as React from "react"; 2 | import Link from "next/link"; 3 | import { 4 | NavigationMenuItem, 5 | NavigationMenuLink, 6 | navigationMenuTriggerStyle, 7 | } from "@/components/ui/navigation-menu"; 8 | import { cn } from "@/lib/utils"; 9 | 10 | type MenuItemProps = { 11 | label: string; 12 | url?: string; 13 | }; 14 | 15 | export function MenuItem({ label, url }: MenuItemProps) { 16 | return ( 17 | 18 | 19 | 22 | {label} 23 | 24 | 25 | 26 | ); 27 | } 28 | -------------------------------------------------------------------------------- /public/icons/keyboardArrowDown.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /src/components/product-page/Header/AddToCardSection.tsx: -------------------------------------------------------------------------------- 1 | "use client"; 2 | 3 | import CartCounter from "@/components/ui/CartCounter"; 4 | import React, { useState } from "react"; 5 | import AddToCartBtn from "./AddToCartBtn"; 6 | import { Product } from "@/types/product.types"; 7 | 8 | const AddToCardSection = ({ data }: { data: Product }) => { 9 | const [quantity, setQuantity] = useState(1); 10 | 11 | return ( 12 |
13 | 14 | 15 |
16 | ); 17 | }; 18 | 19 | export default AddToCardSection; 20 | -------------------------------------------------------------------------------- /public/icons/envelope.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /public/icons/keyboardArrowRight.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /src/components/shop-page/BreadcrumbShop.tsx: -------------------------------------------------------------------------------- 1 | import React from "react"; 2 | import { 3 | Breadcrumb, 4 | BreadcrumbItem, 5 | BreadcrumbLink, 6 | BreadcrumbList, 7 | BreadcrumbPage, 8 | BreadcrumbSeparator, 9 | } from "@/components/ui/breadcrumb"; 10 | import Link from "next/link"; 11 | 12 | const BreadcrumbShop = () => { 13 | return ( 14 | 15 | 16 | 17 | 18 | Home 19 | 20 | 21 | 22 | 23 | Shop 24 | 25 | 26 | 27 | ); 28 | }; 29 | 30 | export default BreadcrumbShop; 31 | -------------------------------------------------------------------------------- /src/styles/fonts/index.ts: -------------------------------------------------------------------------------- 1 | import localFont from "next/font/local"; 2 | 3 | const integralCF = localFont({ 4 | src: [ 5 | { 6 | path: "./integralcf-bold.woff", 7 | weight: "700", 8 | style: "normal", 9 | }, 10 | ], 11 | fallback: ["sans-serif"], 12 | variable: "--font-integralCF", 13 | }); 14 | 15 | const satoshi = localFont({ 16 | src: [ 17 | { 18 | path: "./Satoshi-Regular.woff", 19 | weight: "400", 20 | style: "normal", 21 | }, 22 | { 23 | path: "./Satoshi-Medium.woff", 24 | weight: "500", 25 | style: "normal", 26 | }, 27 | { 28 | path: "./Satoshi-Bold.woff", 29 | weight: "700", 30 | style: "normal", 31 | }, 32 | ], 33 | fallback: ["sans-serif"], 34 | variable: "--font-satoshi", 35 | }); 36 | 37 | export { integralCF, satoshi }; 38 | -------------------------------------------------------------------------------- /public/icons/plus.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /src/components/ui/separator.tsx: -------------------------------------------------------------------------------- 1 | "use client" 2 | 3 | import * as React from "react" 4 | import * as SeparatorPrimitive from "@radix-ui/react-separator" 5 | 6 | import { cn } from "@/lib/utils" 7 | 8 | const Separator = React.forwardRef< 9 | React.ElementRef, 10 | React.ComponentPropsWithoutRef 11 | >( 12 | ( 13 | { className, orientation = "horizontal", decorative = true, ...props }, 14 | ref 15 | ) => ( 16 | 27 | ) 28 | ) 29 | Separator.displayName = SeparatorPrimitive.Root.displayName 30 | 31 | export { Separator } 32 | -------------------------------------------------------------------------------- /src/app/providers.tsx: -------------------------------------------------------------------------------- 1 | "use client"; 2 | 3 | import React from "react"; 4 | import { Provider } from "react-redux"; 5 | import { makeStore } from "../lib/store"; 6 | import { PersistGate } from "redux-persist/integration/react"; 7 | import SpinnerbLoader from "@/components/ui/SpinnerbLoader"; 8 | 9 | type Props = { 10 | children: React.ReactNode; 11 | }; 12 | 13 | const Providers = ({ children }: Props) => { 14 | const { store, persistor } = makeStore(); 15 | 16 | return ( 17 | 18 | 21 | 22 |
23 | } 24 | persistor={persistor} 25 | > 26 | {children} 27 | 28 | 29 | ); 30 | }; 31 | 32 | export default Providers; 33 | -------------------------------------------------------------------------------- /src/components/layout/Banner/TopBanner.tsx: -------------------------------------------------------------------------------- 1 | import { Button } from "@/components/ui/button"; 2 | import Image from "next/image"; 3 | import Link from "next/link"; 4 | import React from "react"; 5 | 6 | const TopBanner = () => { 7 | return ( 8 |
9 |
10 |

11 | Sign up and get 20% off to your first order.{" "} 12 | 13 | Sign Up Now 14 | 15 |

16 | 24 |
25 |
26 | ); 27 | }; 28 | 29 | export default TopBanner; 30 | -------------------------------------------------------------------------------- /public/icons/check.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /src/components/layout/Navbar/TopNavbar/CartBtn.tsx: -------------------------------------------------------------------------------- 1 | "use client"; 2 | 3 | import { useAppSelector } from "@/lib/hooks/redux"; 4 | import { RootState } from "@/lib/store"; 5 | import Image from "next/image"; 6 | import Link from "next/link"; 7 | import React from "react"; 8 | 9 | const CartBtn = () => { 10 | const { cart } = useAppSelector((state: RootState) => state.carts); 11 | 12 | return ( 13 | 14 | cart 22 | {cart && cart.totalQuantities > 0 && ( 23 | 24 | {cart.totalQuantities} 25 | 26 | )} 27 | 28 | ); 29 | }; 30 | 31 | export default CartBtn; 32 | -------------------------------------------------------------------------------- /public/icons/arrowRight.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /public/icons/arrowLeft.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /public/icons/times.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /public/icons/xTwitter.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /src/app/layout.tsx: -------------------------------------------------------------------------------- 1 | import type { Metadata, Viewport } from "next"; 2 | import "@/styles/globals.css"; 3 | import { satoshi } from "@/styles/fonts"; 4 | import TopBanner from "@/components/layout/Banner/TopBanner"; 5 | import TopNavbar from "@/components/layout/Navbar/TopNavbar"; 6 | import Footer from "@/components/layout/Footer"; 7 | import HolyLoader from "holy-loader"; 8 | import Providers from "./providers"; 9 | 10 | export const metadata: Metadata = { 11 | title: "Shop.co ❤️ by mshsheikh", 12 | description: "Project by: GIAIC (WED: 7-10 PM)", 13 | }; 14 | 15 | export const viewport: Viewport = { 16 | themeColor: "#000000", 17 | }; 18 | 19 | export default function RootLayout({ 20 | children, 21 | }: Readonly<{ 22 | children: React.ReactNode; 23 | }>) { 24 | return ( 25 | 26 | 27 | 28 | 29 | 30 | 31 | {children} 32 | 33 |