├── .eslintrc.json
├── .gitignore
├── README.md
├── components
├── Background
│ ├── Edu_Card.jsx
│ └── Exp_Card.jsx
├── Common
│ ├── Badge.jsx
│ ├── BannerLayout.jsx
│ ├── CardLayout.jsx
│ ├── DrawerLayout.jsx
│ ├── ImageAndParagraphSkeleton.jsx
│ ├── Intro
│ │ ├── Contact.jsx
│ │ ├── Download.jsx
│ │ ├── Languages.jsx
│ │ ├── LinearBar.jsx
│ │ ├── Location.jsx
│ │ ├── ProgressBar.jsx
│ │ ├── Skills.jsx
│ │ ├── Tools.jsx
│ │ └── index.jsx
│ ├── Nav
│ │ ├── DrawerIntro.jsx
│ │ ├── Nav.jsx
│ │ └── NavItem.jsx
│ └── ParagraphSkeleton.jsx
├── Fiverr_Icon.jsx
├── Footer.jsx
├── HomeComponents
│ ├── Banner.jsx
│ ├── ClientReviews
│ │ ├── ClientReviews.jsx
│ │ └── ReviewCard.jsx
│ ├── Expertise
│ │ ├── ExpertiseCard.jsx
│ │ └── MyExpertise.jsx
│ └── Recommendations
│ │ ├── RecommendationCard.jsx
│ │ └── Recommendations.jsx
└── Portfolio
│ └── PortfolioCard.jsx
├── constants
└── constants.js
├── next.config.js
├── package-lock.json
├── package.json
├── pages
├── _app.js
├── _document.js
├── api
│ ├── background.js
│ ├── expertise.js
│ ├── portfolio.js
│ ├── recommendations.js
│ └── review.js
├── background.jsx
├── contact.jsx
├── index.jsx
├── layout.js
└── portfolio.jsx
├── postcss.config.js
├── public
├── favicon.ico
├── fonts
│ ├── Cascadia.ttf
│ ├── Circular-Bold.otf
│ ├── Circular-Book.otf
│ ├── Circular-Light.otf
│ ├── Circular-Medium.otf
│ └── CircularStd-Black.otf
├── images
│ ├── adam.png
│ ├── background.png
│ ├── card-bg.jpg
│ ├── emoji.png
│ ├── muhammad.jpeg
│ ├── nasir.jpg
│ ├── osama.jpg
│ ├── shahmir.jfif
│ ├── sikandar.jpeg
│ └── svgs
│ │ └── fiverr.svg
├── osamajavaid-resume.pdf
├── projects
│ ├── absco.png
│ ├── alsn.png
│ ├── culyte.png
│ ├── erp.png
│ ├── fateh.png
│ ├── firmsanad.png
│ ├── jmm.png
│ ├── otawix.png
│ ├── spatay.png
│ └── tojjar.png
└── readme-images
│ ├── moj.png
│ └── portfolio.png
├── styles
├── Home.module.css
└── globals.css
├── tailwind.config.js
└── utils
└── utils.js
/.eslintrc.json:
--------------------------------------------------------------------------------
1 | {
2 | "extends": "next/core-web-vitals"
3 | }
4 |
--------------------------------------------------------------------------------
/.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 | .pnpm-debug.log*
27 |
28 | # local env files
29 | .env*.local
30 |
31 | # vercel
32 | .vercel
33 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 |
2 |
3 | 
4 | 
5 | 
6 | [](https://twitter.com/intent/follow?screen_name=iosamajavaid)
7 |
8 |
9 |
10 |
11 |
12 |
13 |
Muhammad Osama Javaid - Personal portfolio
14 |
15 | This website is fully responsive personal portfolio,
Responsive for all devices, built using Nextjs, TailwindCSS only.
16 |
17 |
➥ Live Demo
18 |
19 |
20 |
21 |
22 |
23 | ### Demo Screeshots
24 |
25 | 
26 |
27 | ### Prerequisites
28 |
29 | Before you begin, ensure you have met the following requirements:
30 |
31 | - [Git](https://git-scm.com/downloads "Download Git") must be installed on your operating system.
32 |
33 | ### Run Locally
34 |
35 | To run **portfolio** locally, run this command on your git bash:
36 |
37 | Linux and macOS:
38 |
39 | ```bash
40 | sudo git clone https://github.com/osamajavaid/portfolio.git
41 | ```
42 |
43 | Windows:
44 |
45 | ```bash
46 | git clone https://github.com/osamajavaid/portfolio.git
47 | ```
48 |
49 | ### Contact
50 |
51 | If you want to contact with me you can reach me at [X](https://www.x.com/iosamajavaid).
52 |
53 | ### License
54 |
55 | This project is **free to use** and does not contains any license.
56 |
--------------------------------------------------------------------------------
/components/Background/Edu_Card.jsx:
--------------------------------------------------------------------------------
1 | import React from 'react'
2 | import CardLayout from '../Common/CardLayout'
3 |
4 | const Edu_Card = ({ data }) => {
5 | return (
6 |
7 |
8 |
9 |
{data.title}
10 |
11 | {" "}
12 | {data.year}{" "}
13 |
14 |
15 |
16 | {data.degree}
17 |
18 |
19 | {data.detail}
20 |
21 |
22 |
23 | )
24 | }
25 |
26 | export default Edu_Card
--------------------------------------------------------------------------------
/components/Background/Exp_Card.jsx:
--------------------------------------------------------------------------------
1 | import React from 'react'
2 | import CardLayout from '../Common/CardLayout'
3 |
4 | const Exp_Card = ({ data }) => {
5 | return (
6 |
7 |
8 |
{data.title}
9 |
10 | {data.role}
11 |
12 |
17 |
18 | {data.desc}
19 |
20 |
21 |
{data.year}
{data.location}
22 |
23 |
24 |
25 | )
26 | }
27 |
28 | export default Exp_Card
--------------------------------------------------------------------------------
/components/Common/Badge.jsx:
--------------------------------------------------------------------------------
1 | import React from 'react'
2 |
3 | const Badge = ({ title }) => {
4 | return (
5 | {title}
6 | )
7 | }
8 |
9 | export default Badge
--------------------------------------------------------------------------------
/components/Common/BannerLayout.jsx:
--------------------------------------------------------------------------------
1 |
2 | const BannerLayout = ({ children }) => {
3 | return (
4 |
11 |
12 |
13 | {children}
14 |
15 |
16 |
17 | )
18 | }
19 |
20 | export default BannerLayout
--------------------------------------------------------------------------------
/components/Common/CardLayout.jsx:
--------------------------------------------------------------------------------
1 | import React from 'react'
2 |
3 | const CardLayout = ({ children, className = "h-full w-full" }) => {
4 | return (
5 |
14 | {children}
15 |
16 | )
17 | }
18 |
19 | export default CardLayout
--------------------------------------------------------------------------------
/components/Common/DrawerLayout.jsx:
--------------------------------------------------------------------------------
1 | import React from 'react'
2 |
3 | const DrawerLayout = ({ setIsOpen, isOpen, children }) => {
4 | return (
5 |
13 |
19 |
20 | {children}
21 |
22 |
23 | {
26 | setIsOpen(false);
27 | }}
28 | >
29 |
30 | )
31 | }
32 |
33 | export default DrawerLayout
--------------------------------------------------------------------------------
/components/Common/ImageAndParagraphSkeleton.jsx:
--------------------------------------------------------------------------------
1 | import React from 'react'
2 |
3 | const ImageAndParagraphSkeleton = ({ className }) => {
4 | return (
5 |
6 |
7 |
10 |
11 |
12 |
13 |
14 |
Loading...
15 |
16 |
17 | )
18 | }
19 |
20 | export default ImageAndParagraphSkeleton
--------------------------------------------------------------------------------
/components/Common/Intro/Contact.jsx:
--------------------------------------------------------------------------------
1 | import React from 'react';
2 | import { CONTACTS } from '../../../constants/constants';
3 | import Link from 'next/link';
4 |
5 | const Contact = () => {
6 | return (
7 |
8 |
9 | Email Address
10 |
11 |
12 | {CONTACTS.EMAIL}
13 |
14 |
15 |
16 | Phone
17 | {CONTACTS.PHONE}
18 |
19 |
20 | );
21 | };
22 |
23 | export default Contact;
24 |
--------------------------------------------------------------------------------
/components/Common/Intro/Download.jsx:
--------------------------------------------------------------------------------
1 | import Link from 'next/link';
2 | const Download = ({ icon }) => {
3 | return (
4 | <>
5 |
6 | Download Resume
7 | {icon}
8 |
9 | >
10 | );
11 | };
12 |
13 | export default Download;
14 |
--------------------------------------------------------------------------------
/components/Common/Intro/Languages.jsx:
--------------------------------------------------------------------------------
1 | import { Progress } from "antd"
2 | import { useEffect, useState } from "react"
3 |
4 | const Languages = () => {
5 | const [urdu, setUrdu] = useState(0)
6 | const [english, setEnglish] = useState(0)
7 |
8 | useEffect(() => {
9 | const timer = setInterval(() => {
10 | if (urdu < 98) {
11 | setUrdu(prevCount => prevCount + 1);
12 | }
13 | if (english < 88) {
14 | setEnglish(prevCount => prevCount + 1);
15 | }
16 | }, 30);
17 |
18 | return () => clearInterval(timer);
19 | }, [urdu, english])
20 | return (
21 |
37 | )
38 | }
39 |
40 | export default Languages
--------------------------------------------------------------------------------
/components/Common/Intro/LinearBar.jsx:
--------------------------------------------------------------------------------
1 | import React from 'react'
2 |
3 | const LinearBar = ({ title, percent, bgColor }) => {
4 | return (
5 |
6 |
7 | {title}
8 | {percent}
9 |
10 |
13 |
14 | )
15 | }
16 |
17 | export default LinearBar
--------------------------------------------------------------------------------
/components/Common/Intro/Location.jsx:
--------------------------------------------------------------------------------
1 | import { DETAILS } from '../../../constants/constants';
2 | import { getObjectKeys } from '../../../utils/utils';
3 |
4 | const Location = () => {
5 | const keys = getObjectKeys(DETAILS);
6 | return (
7 |
8 | {keys.map((key, index) => {
9 | return (
10 |
11 | {key}
12 | {DETAILS[key]}
13 |
14 | );
15 | })}
16 |
17 | );
18 | };
19 |
20 | export default Location;
21 |
--------------------------------------------------------------------------------
/components/Common/Intro/ProgressBar.jsx:
--------------------------------------------------------------------------------
1 | // import { useState } from "react";
2 | // import ApexCharts from 'apexcharts'
3 |
4 | // const ProgressBar = () => {
5 |
6 | // const [state, setState] = useState({
7 | // series: [76],
8 | // options: {
9 | // chart: {
10 | // type: 'radialBar',
11 | // offsetY: -20,
12 | // sparkline: {
13 | // enabled: true
14 | // }
15 | // },
16 | // plotOptions: {
17 | // radialBar: {
18 | // startAngle: -90,
19 | // endAngle: 90,
20 | // track: {
21 | // background: "#e7e7e7",
22 | // strokeWidth: '97%',
23 | // margin: 5, // margin is in pixels
24 | // dropShadow: {
25 | // enabled: true,
26 | // top: 2,
27 | // left: 0,
28 | // color: '#999',
29 | // opacity: 1,
30 | // blur: 2
31 | // }
32 | // },
33 | // dataLabels: {
34 | // name: {
35 | // show: false
36 | // },
37 | // value: {
38 | // offsetY: -2,
39 | // fontSize: '22px'
40 | // }
41 | // }
42 | // }
43 | // },
44 | // grid: {
45 | // padding: {
46 | // top: -10
47 | // }
48 | // },
49 | // fill: {
50 | // type: 'gradient',
51 | // gradient: {
52 | // shade: 'light',
53 | // shadeIntensity: 0.4,
54 | // inverseColors: false,
55 | // opacityFrom: 1,
56 | // opacityTo: 1,
57 | // stops: [0, 50, 53, 91]
58 | // },
59 | // },
60 | // labels: ['Average Results'],
61 | // },
62 |
63 | // })
64 |
65 | // return (
66 | //
69 |
70 | // );
71 | // }
72 |
73 | // export default ProgressBar
74 | // // const domContainer = document.querySelector('#app');
--------------------------------------------------------------------------------
/components/Common/Intro/Skills.jsx:
--------------------------------------------------------------------------------
1 | import LinearBar from './LinearBar';
2 | import { SKILLS } from '../../../constants/constants';
3 | const Skills = () => {
4 | return (
5 |
6 |
7 |
Experties and Competencies
8 |
9 | {SKILLS.map((skill, index) => {
10 | return ;
11 | })}
12 |
13 |
14 |
15 | );
16 | };
17 |
18 | export default Skills;
19 |
--------------------------------------------------------------------------------
/components/Common/Intro/Tools.jsx:
--------------------------------------------------------------------------------
1 | import Badge from '../Badge';
2 | import { TECH_STACK } from '../../../constants/constants';
3 | const Tools = () => {
4 | return (
5 |
6 |
7 |
Tools
8 |
9 | {TECH_STACK.map((item, index) => (
10 |
11 | ))}
12 |
13 |
14 |
15 | );
16 | };
17 |
18 | export default Tools;
19 |
--------------------------------------------------------------------------------
/components/Common/Intro/index.jsx:
--------------------------------------------------------------------------------
1 | import Link from 'next/link';
2 | import { FaDownload, FaFacebook, FaGithub, FaLinkedin, FaTwitter } from 'react-icons/fa';
3 | import Contact from './Contact';
4 | import Download from './Download';
5 | import Languages from './Languages';
6 | import Location from './Location';
7 | import Tools from './Tools';
8 | import Skills from './Skills';
9 | import Image from 'next/image';
10 | import { NAME, DESIGNATION, SOCIAL_LINKS } from '../../../constants/constants';
11 | import Osama from '../../../public/images/osama.jpg';
12 |
13 | const Intro = () => {
14 | return (
15 | <>
16 | {/* fixed at top */}
17 |
18 |
19 |
20 | {NAME}
21 | {DESIGNATION}
22 |
23 |
24 |
25 | {/* middle components */}
26 |
27 |
28 |
29 |
30 |
31 |
32 | } />
33 |
34 |
35 | {/* fixed at bottom */}
36 |
37 |
38 |
39 |
40 | {/*
41 |
42 | */}
43 | {/*
44 |
45 | */}
46 |
47 |
48 |
49 |
50 | >
51 | );
52 | };
53 |
54 | export default Intro;
55 |
--------------------------------------------------------------------------------
/components/Common/Nav/DrawerIntro.jsx:
--------------------------------------------------------------------------------
1 | import React from 'react'
2 | import DrawerLayout from '../DrawerLayout'
3 | import Intro from '../Intro'
4 |
5 | export const DrawerIntro = ({ setIsOpen, isOpen }) => {
6 | return (
7 |
8 |
9 |
10 | )
11 | }
12 |
--------------------------------------------------------------------------------
/components/Common/Nav/Nav.jsx:
--------------------------------------------------------------------------------
1 | import { ImCross } from 'react-icons/im'
2 | import { FiAward } from 'react-icons/fi'
3 | import { FaHandshake } from 'react-icons/fa'
4 | import { ImHome } from 'react-icons/im'
5 | import { HiIdentification } from 'react-icons/hi'
6 | import NavItem from './NavItem'
7 | import DrawerLayout from '../DrawerLayout'
8 |
9 |
10 | const Nav = ({ setIsOpen, isOpen }) => {
11 | return (
12 |
13 |
14 |
setIsOpen(false)} className="flex text-LightGray absolute top-0 w-full items-center justify-start pl-6 text-sm h-10 bg-EveningBlack">
15 |
16 |
17 |
18 | } NavText={'Home'} />
19 | } NavText={'Contact'} />
20 | } NavText={'Background'} />
21 | } NavText={'Portfolio'} />
22 |
23 |
24 |
25 |
26 | )
27 | }
28 |
29 | export default Nav
--------------------------------------------------------------------------------
/components/Common/Nav/NavItem.jsx:
--------------------------------------------------------------------------------
1 | import Link from 'next/link'
2 | import { useRouter } from 'next/router';
3 | import React from 'react'
4 |
5 |
6 | const NavItem = ({ NavIcon, NavText, NavRoute, setIsOpen }) => {
7 | const router = useRouter();
8 | const className = router.asPath === `${NavRoute}` ? "rounded-xl !text-DeepNightBlack bg-Green font-bold tracking-widest" : '';
9 |
10 | return (
11 | setIsOpen(false)}
13 | href={NavRoute}
14 | className={`${className} transition flex items-center px-2 hover:bg-EveningBlack text-SilverGray hover:text-SilverGray rounded-xl py-1.5 font-semibold space-x-4 text-base`}
15 | >
16 | {NavIcon}
17 | {NavText}
18 |
19 | )
20 | }
21 |
22 | export default NavItem
--------------------------------------------------------------------------------
/components/Common/ParagraphSkeleton.jsx:
--------------------------------------------------------------------------------
1 | import React from 'react'
2 | import CardLayout from './CardLayout'
3 |
4 | const ParagraphSkeleton = ({ className }) => {
5 | return (
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
Loading...
16 |
17 |
18 |
19 | )
20 | }
21 |
22 | export default ParagraphSkeleton
--------------------------------------------------------------------------------
/components/Fiverr_Icon.jsx:
--------------------------------------------------------------------------------
1 | import React from 'react'
2 |
3 | const Fiverr_Icon = () => {
4 | return (
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 | )
13 | }
14 |
15 | export default Fiverr_Icon
--------------------------------------------------------------------------------
/components/Footer.jsx:
--------------------------------------------------------------------------------
1 | import { AiFillCopyrightCircle } from 'react-icons/ai'
2 | import { MdMail } from 'react-icons/md'
3 | import { AiOutlineWhatsApp } from 'react-icons/ai'
4 |
5 | const Footer = () => {
6 | return (
7 |
8 |
9 |
10 |
13 |
2023 All Rights Reserved.
14 |
15 |
18 |
19 |
20 |
21 |
22 |
iosamajavaid@gmail.com
23 |
24 |
25 |
26 | )
27 | }
28 |
29 | export default Footer
--------------------------------------------------------------------------------
/components/HomeComponents/Banner.jsx:
--------------------------------------------------------------------------------
1 | import Typewriter from 'typewriter-effect';
2 | import BannerLayout from '../Common/BannerLayout';
3 | import { Link } from 'react-scroll';
4 |
5 | const Banner = () => {
6 | return (
7 |
8 |
9 |
10 |
11 |
12 |
13 |
Hello, Check This Out!
14 |
15 |
16 |
17 | {"<"}div
18 | {">"} I am a
19 |
28 |
29 | {""}div {">"}
30 |
31 |
32 |
Explore
33 |
34 |
35 |
36 |
37 |
38 |
39 |
40 | {/* details in row */}
41 |
42 |
43 |
44 | 10+
45 | Completed Projects
46 |
47 |
48 |
49 | 8+
50 | Freelance Clients
51 |
52 |
53 |
54 | 5+
55 | Honors & Awards
56 |
57 |
58 |
59 | 10+
60 | Opensource Projects
61 |
62 |
63 |
64 |
65 |
66 | )
67 | }
68 |
69 | export default Banner
--------------------------------------------------------------------------------
/components/HomeComponents/ClientReviews/ClientReviews.jsx:
--------------------------------------------------------------------------------
1 | import ReviewCard from "./ReviewCard"
2 | import axios from "axios";
3 | import { useQuery } from "react-query";
4 | import ParagraphSkeleton from "../../Common/ParagraphSkeleton";
5 |
6 |
7 |
8 | const ClientReviews = () => {
9 |
10 | const { isLoading, error, data } = useQuery('review', () =>
11 | axios.get('api/review')
12 | .then(({ data }) => data)
13 | .catch(error => console.error('Error fetching testimonials:', error)))
14 |
15 |
16 | return (
17 | <>
18 | Clients Reviews
19 |
20 |
21 | {
22 | isLoading ?
23 | [1, 2, 3, 4, 5].map(() => (
24 |
25 | ))
26 | :
27 | data?.map((data, key) => (
28 |
29 | ))
30 | }
31 |
32 |
33 |
34 | >
35 | )
36 | }
37 |
38 | export default ClientReviews
--------------------------------------------------------------------------------
/components/HomeComponents/ClientReviews/ReviewCard.jsx:
--------------------------------------------------------------------------------
1 | import { MdLocationOn } from 'react-icons/md'
2 | import { FaStar } from 'react-icons/fa'
3 | import CardLayout from '../../Common/CardLayout'
4 |
5 | const ReviewCard = ({ data }) => {
6 | return (
7 |
8 |
9 |
10 |
11 |
{data?.clientName}
12 |
13 |
14 | {data?.clientLocation}
15 |
16 |
17 |
{data?.clientSource}
18 |
19 |
20 | {data.clientReview}
21 |
22 |
23 |
24 |
25 |
26 |
27 |
28 |
29 |
30 |
31 | )
32 | }
33 |
34 | export default ReviewCard
--------------------------------------------------------------------------------
/components/HomeComponents/Expertise/ExpertiseCard.jsx:
--------------------------------------------------------------------------------
1 | import CardLayout from "../../Common/CardLayout"
2 |
3 | const ExpertiseCard = ({ data }) => {
4 | return (
5 |
6 |
7 |
{data.title}
8 |
9 | {data.desc}
10 |
11 |
12 |
13 | )
14 | }
15 |
16 | export default ExpertiseCard
--------------------------------------------------------------------------------
/components/HomeComponents/Expertise/MyExpertise.jsx:
--------------------------------------------------------------------------------
1 | import ExpertiseCard from "./ExpertiseCard"
2 | import { useQuery } from "react-query";
3 | import axios from "axios";
4 | import ParagraphSkeleton from "../../Common/ParagraphSkeleton";
5 |
6 | const MyExpertise = () => {
7 |
8 | const { isLoading, error, data } = useQuery('expertise', () =>
9 | axios.get('api/expertise')
10 | .then(({ data }) => data)
11 | .catch(error => console.error('Error fetching testimonials:', error)))
12 |
13 | return (
14 | <>
15 | My Expertise
16 |
17 |
18 | {
19 | isLoading ?
20 | [1, 2, 3, 4, 5, 6].map(() => (
21 |
22 | ))
23 | :
24 | data?.map((data, key) => (
25 |
26 | ))
27 | }
28 |
29 |
30 | >
31 | )
32 | }
33 |
34 | export default MyExpertise
--------------------------------------------------------------------------------
/components/HomeComponents/Recommendations/RecommendationCard.jsx:
--------------------------------------------------------------------------------
1 | import React from 'react'
2 | import CardLayout from '../../Common/CardLayout'
3 |
4 | const RecommendationCard = ({ data }) => {
5 | return (
6 |
7 |
8 |
9 |
12 |
{data?.designation}
13 |
{data?.view}
14 |
15 |
16 | )
17 | }
18 |
19 | export default RecommendationCard
--------------------------------------------------------------------------------
/components/HomeComponents/Recommendations/Recommendations.jsx:
--------------------------------------------------------------------------------
1 | import RecommendationCard from "./RecommendationCard"
2 | import axios from "axios";
3 | import { useQuery } from "react-query";
4 | import ParagraphSkeleton from "../../Common/ParagraphSkeleton";
5 |
6 |
7 | const Recommendations = () => {
8 | const { isLoading, error, data } = useQuery('recommendations', () =>
9 | axios.get('api/recommendations')
10 | .then(({ data }) => data)
11 | .catch(error => console.error('Error fetching testimonials:', error)))
12 |
13 |
14 | return (
15 | <>
16 | Recommendations
17 |
18 |
19 | {isLoading ?
20 | [1, 2, 3, 4].map(() => (
21 |
22 | ))
23 | :
24 | data?.map((data, key) => (
25 |
26 | ))
27 | }
28 |
29 |
30 | >
31 | )
32 | }
33 |
34 | export default Recommendations
--------------------------------------------------------------------------------
/components/Portfolio/PortfolioCard.jsx:
--------------------------------------------------------------------------------
1 | import Badge from "../Common/Badge"
2 |
3 | const PortfolioCard = ({ data }) => {
4 | return (
5 |
6 |
11 |
12 |
47 |
48 | {data?.projectDetail}
49 |
50 |
51 | {data.technologiesUsed.map((index, key) => )}
52 |
53 |
54 |
55 | )
56 | }
57 |
58 | export default PortfolioCard
--------------------------------------------------------------------------------
/constants/constants.js:
--------------------------------------------------------------------------------
1 | export const NAME = 'Muhammad Osama Javaid';
2 |
3 | export const DESIGNATION = `MERN Stack Developer | Open Source Contributor | Tech Blogger`;
4 |
5 | export const DETAILS = {
6 | Residence: 'Pakistan',
7 | City: 'Peshawar',
8 | Age: '23',
9 | };
10 |
11 | export const SKILLS = [
12 | {
13 | title: 'MERN Stack Developer',
14 | level: '75%',
15 | },
16 | {
17 | title: 'React Developer',
18 | level: '91%',
19 | },
20 | // {
21 | // title: 'Desktop Application Developer',
22 | // level: '75%',
23 | // },
24 | {
25 | title: 'Backend Developer',
26 | level: '54%',
27 | },
28 | {
29 | title: 'Technical Blogger',
30 | level: '83%',
31 | },
32 | ];
33 |
34 | export const TECH_STACK = [
35 | 'JavaScript',
36 | 'ReactJS',
37 | 'NextJS',
38 | 'TypeScript',
39 | 'NodeJS',
40 | 'Redux',
41 | 'Zustand',
42 | 'CSS',
43 | 'SCSS',
44 | 'TailwindCSS',
45 | 'Ant Design',
46 | 'Material UI',
47 | 'Next UI',
48 | 'REST API',
49 | 'MongoDB',
50 | 'MySQL',
51 | 'Git',
52 | 'GitHub',
53 | 'Jira',
54 | 'Figma',
55 | 'Adobe XD',
56 | ];
57 |
58 | export const CONTACTS = {
59 | EMAIL: 'iosamajavaid@gmail.com',
60 | PHONE: '+923159591822',
61 | };
62 | export const SOCIAL_LINKS = {
63 | GITHUB: 'https://github.com/osamajavaid',
64 | LINKEDIN: 'https://www.linkedin.com/in/iosamajavaid/',
65 | TWITTER: 'https://twitter.com/iosamajavaid',
66 | FACEBOOK: 'https://www.facebook.com/iosamajavaid',
67 | };
68 |
--------------------------------------------------------------------------------
/next.config.js:
--------------------------------------------------------------------------------
1 | module.exports = {
2 | eslint: {
3 | // Warning: This allows production builds to successfully complete even if
4 | // your project has ESLint errors.
5 | ignoreDuringBuilds: true,
6 | },
7 | }
--------------------------------------------------------------------------------
/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "portfolio",
3 | "version": "0.1.0",
4 | "private": true,
5 | "scripts": {
6 | "dev": "next dev",
7 | "build": "next build",
8 | "start": "next start",
9 | "lint": "next lint"
10 | },
11 | "dependencies": {
12 | "@next/font": "13.1.1",
13 | "antd": "^5.6.1",
14 | "axios": "^1.3.4",
15 | "eslint": "8.30.0",
16 | "eslint-config-next": "13.1.1",
17 | "next": "13.1.1",
18 | "react": "18.2.0",
19 | "react-dom": "18.2.0",
20 | "react-icons": "^4.7.1",
21 | "react-query": "^3.39.3",
22 | "react-scroll": "^1.8.9",
23 | "sass": "^1.64.2",
24 | "typewriter-effect": "^2.19.0"
25 | },
26 | "devDependencies": {
27 | "autoprefixer": "^10.4.13",
28 | "postcss": "^8.4.20",
29 | "tailwindcss": "^3.2.4"
30 | }
31 | }
32 |
--------------------------------------------------------------------------------
/pages/_app.js:
--------------------------------------------------------------------------------
1 | import '../styles/globals.css'
2 |
3 | import Layout from './layout'
4 | import { QueryClient, QueryClientProvider } from 'react-query'
5 |
6 | const queryClient = new QueryClient()
7 |
8 | export default function App({ Component, pageProps }) {
9 | return (
10 |
11 |
12 |
13 |
14 |
15 | )
16 | }
17 |
--------------------------------------------------------------------------------
/pages/_document.js:
--------------------------------------------------------------------------------
1 | import { Html, Head, Main, NextScript } from 'next/document'
2 |
3 | export default function Document() {
4 | return (
5 |
6 |
8 |
9 |
10 |
11 |
12 | )
13 | }
14 |
--------------------------------------------------------------------------------
/pages/api/background.js:
--------------------------------------------------------------------------------
1 | const background = [
2 | {
3 | eduCards: [
4 | {
5 | id: 0,
6 | title: 'UET Peshawar',
7 | degree: 'BS, Computer System Engineering',
8 | detail: "Bachelor's Degree in Computer System Engineering from UET Peshawar.",
9 | year: '2018-2022'
10 | },
11 | {
12 | id: 1,
13 | title: 'Peshawar Model Degree College',
14 | degree: 'HSSC, Pre Engineering',
15 | detail: "Completed FSC part 1 and part 2 in Pre-Engineering from Peshawar Model Degree College.",
16 | year: '2015-2017'
17 | },
18 | {
19 | id: 2,
20 | title: 'Falcon Academy',
21 | degree: 'SSC, Science Subjects',
22 | detail: "Completed SSC part 1 and part 2 in Science subjects from Falcon Academy Seni Gumbat Kohat",
23 | year: '2013-2015'
24 | },
25 | ]
26 | },
27 | {
28 | expCards: [
29 | {
30 | id: 1,
31 | title: 'JMM Technologies',
32 | role: 'Frontend Developer',
33 | url: 'https://jmm.ltd/',
34 | desc: 'As a frontend developer, I use React, Next & JavaScript to build user interfaces for web applications.',
35 | year: '02/2023 - Present',
36 | location: 'Peshawar, Pakistan'
37 | },
38 | {
39 | id: 2,
40 | title: 'HauzaTech',
41 | role: 'Internee',
42 | url: 'no website',
43 | desc: 'As an Internee, I learned how to use React & JavaScript to build interactive websites.',
44 | year: '02/2023 - Present',
45 | location: 'Peshawar, Pakistan'
46 | },
47 | {
48 | id: 3,
49 | title: 'Encoder Bytes',
50 | role: 'PHP Developer',
51 | url: 'https://www.encoderbytes.com/',
52 | desc: "I work there as a PHP developer, there I learned how to do CRUD'S operations in PHP, also I worked on Firebase",
53 | year: '09/2020 - 02/2021',
54 | location: 'Peshawar, Pakistan'
55 | },
56 |
57 | ]
58 | }
59 | ]
60 |
61 |
62 | export default function handler(req, res) {
63 | res.status(200).json(background)
64 | }
65 |
--------------------------------------------------------------------------------
/pages/api/expertise.js:
--------------------------------------------------------------------------------
1 | const expertise = [
2 | {
3 | id: 0,
4 | title: 'Full Stack Development',
5 | desc: 'I am a skilled MERN stack developer with extensive experience in building robust web applications using MongoDB, Express.js, React.js, and Node.js. I possess a strong understanding of server-side rendering, API integration, and database management. With my expertise, I can deliver dynamic and efficient web solutions tailored to meet the unique requirements of clients.',
6 | },
7 | {
8 | id: 1,
9 | title: 'Scrum and Jira',
10 | desc: "As a developer, I'm proficient in Jira and Scrum methodologies. I use Jira to simplify project management tasks like task assignment, prioritization, and progress tracking. Scrum has improved my teamwork, utilizing daily stand-ups, sprint planning, and retrospectives. My expertise ensures high-quality software products are delivered promptly.",
11 | },
12 | {
13 | id: 2,
14 | title: 'Designing (UI/UX)',
15 | desc: 'I am proficient in using design software such as Figma, Adobe XD, and Adobe Illustrator. Through participating in hackathons and freelance work, I have gained practical experience in UI/UX design and graphic design. Designing is my passion, and it has allowed me to continue to develop my creative skills and grow in the field.',
16 | },
17 | {
18 | id: 3,
19 | title: 'Github',
20 | desc: "GitHub is essential for version control and collaboration. Its intuitive interface and features like pull requests and issue tracking simplify the process. Continuous integration ensures up-to-date code. GitHub is vital to my success as a developer.",
21 | },
22 | {
23 | id: 4,
24 | title: 'Open Source Contributor',
25 | desc: "Open Source is the future. I usually take some time on weekend and contribute into opensource project. It gives me opportunity to learn from best developer's practices and also gives me a chance to help others and contribute into the community for the good.",
26 | },
27 | ]
28 |
29 | export default function handler(req, res) {
30 | res.status(200).json(expertise)
31 | }
32 |
--------------------------------------------------------------------------------
/pages/api/portfolio.js:
--------------------------------------------------------------------------------
1 | const portfolio = [
2 | {
3 | id: 0,
4 | projectName: "JMM ERP",
5 | url: "https://jmmerp.com/",
6 | image: "projects/erp.png",
7 | projectDetail: "Restructure your business with JMM ERP’s all-in-one cloud-based ERP. JMM ERP provides a robust, cost-effective online solution with state-of-the-art software to increase business value and enhance customer impact.",
8 | technologiesUsed: [
9 | {
10 | tech: "ReactJS"
11 | },
12 | {
13 | tech: ".net"
14 | },
15 | {
16 | tech: "GraphQL"
17 | },
18 | {
19 | tech: "Ant Design"
20 | },
21 | {
22 | tech: "TailwindCSS"
23 | },
24 | ]
25 | },
26 | {
27 | id: 0,
28 | projectName: "ABSCO",
29 | url: "https://absco.sa/",
30 | image: "projects/absco.png",
31 | projectDetail: "ABSCO offer unparalleled business consulting solutions to meet client’s unique needs.",
32 | technologiesUsed: [
33 | {
34 | tech: "ReactJS"
35 | },
36 | {
37 | tech: "Ant Design"
38 | },
39 | {
40 | tech: "TailwindCSS"
41 | },
42 | ]
43 | },
44 | {
45 | id: 0,
46 | projectName: "JMM Technologies",
47 | url: "https://jmm.ltd/",
48 | image: "projects/jmm.png",
49 | projectDetail: "JMM Technologies is a start-up turned technology company with extensive years of experience delivering digital solutions. As a fast-growing tech firm, we help diverse businesses and organizations. Our expertise in innovative, state-of-the-art digital services accelerates business growth and enhances customer impact.",
50 | technologiesUsed: [
51 | {
52 | tech: "ReactJS"
53 | },
54 | {
55 | tech: ".net"
56 | },
57 | {
58 | tech: "REST API's"
59 | },
60 | {
61 | tech: "Ant Design"
62 | },
63 | {
64 | tech: "TailwindCSS"
65 | },
66 | ]
67 | },
68 | {
69 | id: 0,
70 | projectName: "ALSN",
71 | url: "https://alsn.app/",
72 | image: "projects/alsn.png",
73 | projectDetail: "ASLN drives digital transformation with certified document translation services. In an interconnected world where seamless communication is imperative, they are strategically positioned to cater to the needs of businesses, individuals, and organizations.",
74 | technologiesUsed: [
75 | {
76 | tech: "ReactJS"
77 | },
78 | {
79 | tech: ".net"
80 | },
81 | {
82 | tech: "REST API's"
83 | },
84 | {
85 | tech: "Ant Design"
86 | },
87 | {
88 | tech: "TailwindCSS"
89 | },
90 | ]
91 | },
92 | {
93 | id: 0,
94 | projectName: "FirmSanad",
95 | url: "/domain-expired",
96 | image: "projects/firmsanad.png",
97 | projectDetail: "Invest in Saudi Arabia, Streamline Your Business Setup Process in Saudi Arabia with FirmSanad Simplify the process of obtaining licenses and starting a business in Saudi Arabia with our streamlined platform.",
98 | technologiesUsed: [
99 | {
100 | tech: "ReactJS"
101 | },
102 | {
103 | tech: ".net"
104 | },
105 | {
106 | tech: "REST API's"
107 | },
108 | {
109 | tech: "Ant Design"
110 | },
111 | {
112 | tech: "TailwindCSS"
113 | },
114 | ]
115 | },
116 | {
117 | id: 0,
118 | projectName: "Fateh Al Mustaqbil",
119 | url: "https://fatehtour.com/",
120 | image: "projects/fateh.png",
121 | projectDetail: "Fateh Al Mustaqbil is a one-of-a-kind travel agency designed to cater to the interests of travelers across the globe, founded in 2023 in Riyadh, Saudi Arabia. Their expertise lies in crafting exceptional journeys tailored to each client's unique requirements, whether it be ticketing, hotel bookings, or visa assistance.",
122 | technologiesUsed: [
123 | {
124 | tech: "ReactJS"
125 | },
126 | {
127 | tech: ".net"
128 | },
129 | {
130 | tech: "REST API's"
131 | },
132 | {
133 | tech: "Ant Design"
134 | },
135 | {
136 | tech: "TailwindCSS"
137 | },
138 | ]
139 | },
140 | {
141 | id: 0,
142 | projectName: "Tojjar",
143 | url: "/domain-expired",
144 | image: "projects/tojjar.png",
145 | projectDetail: "Tojjar is ecommerce website, where you can open your own store and sell products of different brands!",
146 | technologiesUsed: [
147 | {
148 | tech: "Nextjs with SSR"
149 | },
150 | {
151 | tech: "Laravel"
152 | },
153 | {
154 | tech: "REST API's"
155 | },
156 | {
157 | tech: "Ant Design"
158 | },
159 | {
160 | tech: "TailwindCSS"
161 | },
162 | ]
163 | },
164 | {
165 | id: 1,
166 | projectName: "Otawix",
167 | url: "https://b2c.otawix.com/",
168 | image: "projects/otawix.png",
169 | projectDetail: "Lorem ipsum dolor sit amet consectetur adipisicing elit. Quisquam corrupti aut veritatis, adipisci natus optio dolores cum rem? Aut perferendis fugit, eos rerum totam aspernatur iure alias temporibus ipsa perspiciatis!",
170 | technologiesUsed: [
171 | {
172 | tech: "NextJS"
173 | },
174 | {
175 | tech: "NodeJS"
176 | },
177 | {
178 | tech: "REST API's"
179 | },
180 | {
181 | tech: "MUI"
182 | },
183 | {
184 | tech: "TailwindCSS"
185 | },
186 | ]
187 | },
188 | {
189 | id: 2,
190 | projectName: "Spatay",
191 | url: "https://spatay.com/",
192 | image: "projects/spatay.png",
193 | projectDetail: "Lorem ipsum dolor sit amet consectetur adipisicing elit. Quisquam corrupti aut veritatis, adipisci natus optio dolores cum rem? Aut perferendis fugit, eos rerum totam aspernatur iure alias temporibus ipsa perspiciatis!",
194 | technologiesUsed: [
195 | {
196 | tech: "ReactJS"
197 | },
198 | {
199 | tech: "NodeJS"
200 | },
201 | {
202 | tech: "REST API's"
203 | },
204 | {
205 | tech: "Ant Design"
206 | },
207 | {
208 | tech: "TailwindCSS"
209 | },
210 | ]
211 | },
212 | // {
213 | // id: 2,
214 | // projectName: "Culyte",
215 | // url: "https://culyte.com",
216 | // image: "projects/culyte.png",
217 | // projectDetail: "Lorem ipsum dolor sit amet consectetur adipisicing elit. Quisquam corrupti aut veritatis, adipisci natus optio dolores cum rem? Aut perferendis fugit, eos rerum totam aspernatur iure alias temporibus ipsa perspiciatis!",
218 | // technologiesUsed: [
219 | // {
220 | // tech: "ReactJS"
221 | // },
222 | // {
223 | // tech: "NodeJS"
224 | // },
225 | // {
226 | // tech: "Ant Design"
227 | // },
228 | // {
229 | // tech: "TailwindCSS"
230 | // },
231 | // ]
232 | // },
233 | ]
234 | export default function handler(req, res) {
235 | res.status(200).json(portfolio)
236 | }
237 |
--------------------------------------------------------------------------------
/pages/api/recommendations.js:
--------------------------------------------------------------------------------
1 | // Next.js API route support: https://nextjs.org/docs/api-routes/introduction
2 | const recommendationCard = [
3 | {
4 | id: 0,
5 | name: 'Shahmir Minhas',
6 | image: "images/shahmir.jfif",
7 | designation: 'React JS | NEXT JS | Node | GraphQL',
8 | view: "Hey everyone! I wanted to take a moment to recommend Osama Javaid for any React.js opportunities. I had the pleasure of working with him on multiple projects where he showcased a strong understanding of React.js and Next.js concepts and delivered high-quality code. He consistently demonstrated a willingness to learn and grow, and his enthusiasm for tackling new challenges was contagious. Osama is a reliable and dedicated team member who would be a great asset to any React.js team. Highly recommended! 👍! 🌟",
9 | linkednURL: "https://www.linkedin.com/in/shahmir-minhas/"
10 | },
11 | {
12 | id: 1,
13 | name: 'Sikandar Hayat',
14 | image: "images/sikandar.jpeg",
15 | designation: 'Data Scientist | Machine Learning Engineer | Python Developer',
16 | view: "I had the privilege of working alongside Osama on multiple university projects, and I must say, his talent and work ethic truly stood out. Recently, we were both part of the dynamic team at JMM Technologies, where Osama's professionalism and attention to detail shone brightly. I wholeheartedly endorse Osama for any opportunity that calls for a highly skilled and dedicated individual.",
17 | linkednURL: "https://www.linkedin.com/in/sikandar-hayat-381407179/"
18 | },
19 | {
20 | id: 2,
21 | name: 'Nasir Khan',
22 | image: "images/nasir.jpg",
23 | designation: 'MERN | JavaScript | Tailwind | Sass | Bootstrap',
24 | view: "I wholeheartedly recommend Osama as a talented React frontend developer with an incredible flair for UI/UX design. His proficiency in Node.js further enhances his capabilities, allowing him to build robust and scalable applications. Osama's attention to detail, problem-solving skills, and dedication to delivering exceptional results make him a valuable addition to any development team.",
25 | linkednURL: "https://www.linkedin.com/in/nasirkhan22/"
26 | },
27 | {
28 | id: 3,
29 | name: 'Muhammad Ullah',
30 | image: "images/muhammad.jpeg",
31 | designation: 'MERN Stack Developer at Productbox',
32 | view: "I highly recommend Osama Javed for web frontend development positions. Their expertise in ReactJS and Next.js, combined with their professionalism and dedication, make them an invaluable asset to any team.",
33 | linkednURL: "https://www.linkedin.com/in/muhammadullahafridi/"
34 | },
35 | ]
36 | export default function handler(req, res) {
37 | res.status(200).json(recommendationCard)
38 | }
39 |
--------------------------------------------------------------------------------
/pages/api/review.js:
--------------------------------------------------------------------------------
1 | const review = [
2 | {
3 | id: 0,
4 | clientName: 'Mustafash',
5 | clientLocation: 'Egypt',
6 | clientSource: 'Fiverr',
7 | clientReview: 'It is always nice to work with him. The work is finished quickly and he does more than is asked of him. It is also clear that he has a lot of knowledge of the work he does. I look forward to our next collaboration.'
8 | },
9 | {
10 | id: 2,
11 | clientName: 'Melissabrown255',
12 | clientLocation: 'United States',
13 | clientSource: 'Fiverr',
14 | clientReview: 'He is very good with communication and experienced website developer, great experience to work with him. '
15 | },
16 | {
17 | id: 3,
18 | clientName: 'Jake Corry',
19 | clientLocation: 'Germany',
20 | clientSource: 'Fiverr',
21 | clientReview: "Osama is extremely knowledgeable and helpful. He knows in and out of web app development . His understanding of different technologies and frameworks in the space is also very impressive. I hope I get the chance to work with him again"
22 | },
23 | {
24 | id: 4,
25 | clientName: 'Blaise Labriola',
26 | clientLocation: 'France',
27 | clientSource: 'Fiverr',
28 | clientReview: 'I have worked with Osama and he is very professional and excellent software developer. I admire his speed of development and quality of work when given an assignment.'
29 | },
30 | ]
31 | export default function handler(req, res) {
32 | res.status(200).json(review)
33 | }
34 |
--------------------------------------------------------------------------------
/pages/background.jsx:
--------------------------------------------------------------------------------
1 | import { useState } from "react";
2 | import Edu_Card from "../components/Background/Edu_Card";
3 | import Exp_Card from "../components/Background/Exp_Card";
4 | import BannerLayout from "../components/Common/BannerLayout";
5 | import Footer from "../components/Footer";
6 | import { useQuery } from "react-query";
7 | import axios from "axios";
8 | import { Skeleton } from "antd";
9 | import ParagraphSkeleton from "../components/Common/ParagraphSkeleton";
10 |
11 | function Background() {
12 |
13 | const { isLoading, error, data } = useQuery('background', () =>
14 | axios.get('api/background')
15 | .then(({ data }) => data)
16 | .catch(error => console.error('Error fetching testimonials:', error)))
17 |
18 | return (
19 |
20 |
21 |
22 |
Education
23 | {isLoading ?
24 | [1, 2, 3].map(() => (
25 |
26 | ))
27 | :
28 | data && data[0]?.eduCards?.map((data, key) => (
29 |
30 | ))
31 | }
32 |
33 |
34 |
35 |
36 |
Experience
37 |
38 | {isLoading ?
39 | [1, 2, 3].map(() => (
40 |
41 | ))
42 | :
43 | data && data[1]?.expCards?.map((data, key) => (
44 |
45 | ))
46 | }
47 |
48 |
49 |
50 |
51 |
52 |
53 | );
54 | }
55 |
56 | export default Background;
57 |
--------------------------------------------------------------------------------
/pages/contact.jsx:
--------------------------------------------------------------------------------
1 | import { useState } from 'react';
2 | import BannerLayout from '../components/Common/BannerLayout';
3 | import { FaGithub, FaLinkedin, FaTwitter } from 'react-icons/fa'
4 | import { SiUpwork } from 'react-icons/si'
5 | import { HiMail, HiUser } from 'react-icons/hi'
6 | import { BsChatTextFill } from 'react-icons/bs'
7 | import Fiverr_Icon from '../components/Fiverr_Icon';
8 | import Footer from '../components/Footer';
9 | import { Modal } from 'antd';
10 |
11 | const Contact = () => {
12 | const [isOpen, setIsOpen] = useState(false)
13 |
14 | return (
15 |
16 |
17 |
18 |
Contact Information
19 |
20 |
21 |
22 | Country:
23 | Pakistan
24 |
25 |
26 | City:
27 | Peshawar
28 |
29 |
30 | Company:
31 | visualsX
32 |
33 |
34 |
35 |
36 | Email:
37 | iosamajavaid@gmail.com
38 |
39 |
40 | Linkedin:
41 | iosamajavaid
42 |
43 |
44 | Phone:
45 | +92 (315) 9591822
46 |
47 |
48 |
49 |
50 |
51 |
52 |
53 |
54 | {/*
*/}
55 |
56 |
57 |
58 |
59 |
60 |
61 |
Get In Touch
62 |
63 |
64 |
72 |
73 |
81 |
82 |
90 |
91 |
92 | setIsOpen(true)} className="button"> SEND MESSAGE
93 |
94 |
95 |
96 |
97 |
98 | {/* success modal */}
99 | setIsOpen(false)}
107 | onCancel={() => setIsOpen(false)}
108 | >
109 |
113 |
114 |
115 |
116 |
117 | )
118 | }
119 |
120 | export default Contact
--------------------------------------------------------------------------------
/pages/index.jsx:
--------------------------------------------------------------------------------
1 | import Footer from '../components/Footer';
2 | import Banner from '../components/HomeComponents/Banner';
3 | import MyExpertise from '../components/HomeComponents/Expertise/MyExpertise';
4 | import Recommendations from '../components/HomeComponents/Recommendations/Recommendations';
5 | import ClientReviews from '../components/HomeComponents/ClientReviews/ClientReviews';
6 | const home = () => {
7 | return (
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 | )
17 | }
18 |
19 | export default home
--------------------------------------------------------------------------------
/pages/layout.js:
--------------------------------------------------------------------------------
1 | import Intro from '../components/Common/Intro';
2 | import Nav from '../components/Common/Nav/Nav';
3 | import { FaBars, FaMousePointer } from 'react-icons/fa';
4 | import { SlOptionsVertical } from 'react-icons/sl';
5 | import { useState } from 'react';
6 |
7 | export default function Layout({ children }) {
8 | const [isOpen, setIsOpen] = useState(false);
9 | const [intro, setIntro] = useState(false);
10 |
11 | return (
12 |
13 |
14 |
15 |
setIntro(!intro)}>
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
setIsOpen(!isOpen)}>
24 |
25 | {' '}
26 |
27 |
28 |
29 |
30 |
31 |
32 | {/* left most side */}
33 |
37 |
38 |
39 | {/* overlay */}
40 | {intro &&
setIntro(false)} className='fixed top-0 left-0 w-full h-full bg-black/50 backdrop-blur-[2px] z-40'>
}
41 |
42 | {/* middle of screen */}
43 |
{children}
44 |
45 | {/* right side */}
46 | {/* right side */}
47 |
48 |
setIsOpen(!isOpen)} className='bg-MidNightBlack text-Green hidden lg:flex items-center h-16 justify-center text-2xl '>
49 |
50 | {' '}
51 |
52 |
53 |
54 |
55 | NavBar
56 |
57 |
58 | {
}
59 |
60 |
61 | );
62 | }
63 |
--------------------------------------------------------------------------------
/pages/portfolio.jsx:
--------------------------------------------------------------------------------
1 | import { useState } from "react";
2 | import { useQuery } from "react-query";
3 | import BannerLayout from "../components/Common/BannerLayout";
4 | import Footer from "../components/Footer";
5 | import PortfolioCard from "../components/Portfolio/PortfolioCard";
6 | import axios from "axios";
7 | import { Skeleton } from "antd";
8 | import ImageAndParagraphSkeleton from "../components/Common/ImageAndParagraphSkeleton";
9 |
10 | const Portfolio = () => {
11 |
12 | const { isLoading, error, data } = useQuery('portfolio', () =>
13 | axios.get('api/portfolio')
14 | .then(({ data }) => data)
15 | .catch(error => console.error('Error fetching testimonials:', error)))
16 | return (
17 |
18 |
19 |
20 | {
21 | isLoading ?
22 | [1, 2, 3, 4].map(() => (
23 |
24 | ))
25 | :
26 | data?.map((data, key) => (
27 |
28 | ))
29 |
30 | }
31 |
32 |
33 |
34 |
35 |
36 | );
37 | };
38 |
39 | export default Portfolio;
40 |
--------------------------------------------------------------------------------
/postcss.config.js:
--------------------------------------------------------------------------------
1 | module.exports = {
2 | plugins: {
3 | tailwindcss: {},
4 | autoprefixer: {},
5 | },
6 | }
7 |
--------------------------------------------------------------------------------
/public/favicon.ico:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/osamajavaid/portfolio/06e21ba9160f5dbb1b2ae616c4f628aa057a87fd/public/favicon.ico
--------------------------------------------------------------------------------
/public/fonts/Cascadia.ttf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/osamajavaid/portfolio/06e21ba9160f5dbb1b2ae616c4f628aa057a87fd/public/fonts/Cascadia.ttf
--------------------------------------------------------------------------------
/public/fonts/Circular-Bold.otf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/osamajavaid/portfolio/06e21ba9160f5dbb1b2ae616c4f628aa057a87fd/public/fonts/Circular-Bold.otf
--------------------------------------------------------------------------------
/public/fonts/Circular-Book.otf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/osamajavaid/portfolio/06e21ba9160f5dbb1b2ae616c4f628aa057a87fd/public/fonts/Circular-Book.otf
--------------------------------------------------------------------------------
/public/fonts/Circular-Light.otf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/osamajavaid/portfolio/06e21ba9160f5dbb1b2ae616c4f628aa057a87fd/public/fonts/Circular-Light.otf
--------------------------------------------------------------------------------
/public/fonts/Circular-Medium.otf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/osamajavaid/portfolio/06e21ba9160f5dbb1b2ae616c4f628aa057a87fd/public/fonts/Circular-Medium.otf
--------------------------------------------------------------------------------
/public/fonts/CircularStd-Black.otf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/osamajavaid/portfolio/06e21ba9160f5dbb1b2ae616c4f628aa057a87fd/public/fonts/CircularStd-Black.otf
--------------------------------------------------------------------------------
/public/images/adam.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/osamajavaid/portfolio/06e21ba9160f5dbb1b2ae616c4f628aa057a87fd/public/images/adam.png
--------------------------------------------------------------------------------
/public/images/background.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/osamajavaid/portfolio/06e21ba9160f5dbb1b2ae616c4f628aa057a87fd/public/images/background.png
--------------------------------------------------------------------------------
/public/images/card-bg.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/osamajavaid/portfolio/06e21ba9160f5dbb1b2ae616c4f628aa057a87fd/public/images/card-bg.jpg
--------------------------------------------------------------------------------
/public/images/emoji.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/osamajavaid/portfolio/06e21ba9160f5dbb1b2ae616c4f628aa057a87fd/public/images/emoji.png
--------------------------------------------------------------------------------
/public/images/muhammad.jpeg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/osamajavaid/portfolio/06e21ba9160f5dbb1b2ae616c4f628aa057a87fd/public/images/muhammad.jpeg
--------------------------------------------------------------------------------
/public/images/nasir.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/osamajavaid/portfolio/06e21ba9160f5dbb1b2ae616c4f628aa057a87fd/public/images/nasir.jpg
--------------------------------------------------------------------------------
/public/images/osama.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/osamajavaid/portfolio/06e21ba9160f5dbb1b2ae616c4f628aa057a87fd/public/images/osama.jpg
--------------------------------------------------------------------------------
/public/images/shahmir.jfif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/osamajavaid/portfolio/06e21ba9160f5dbb1b2ae616c4f628aa057a87fd/public/images/shahmir.jfif
--------------------------------------------------------------------------------
/public/images/sikandar.jpeg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/osamajavaid/portfolio/06e21ba9160f5dbb1b2ae616c4f628aa057a87fd/public/images/sikandar.jpeg
--------------------------------------------------------------------------------
/public/images/svgs/fiverr.svg:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
--------------------------------------------------------------------------------
/public/osamajavaid-resume.pdf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/osamajavaid/portfolio/06e21ba9160f5dbb1b2ae616c4f628aa057a87fd/public/osamajavaid-resume.pdf
--------------------------------------------------------------------------------
/public/projects/absco.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/osamajavaid/portfolio/06e21ba9160f5dbb1b2ae616c4f628aa057a87fd/public/projects/absco.png
--------------------------------------------------------------------------------
/public/projects/alsn.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/osamajavaid/portfolio/06e21ba9160f5dbb1b2ae616c4f628aa057a87fd/public/projects/alsn.png
--------------------------------------------------------------------------------
/public/projects/culyte.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/osamajavaid/portfolio/06e21ba9160f5dbb1b2ae616c4f628aa057a87fd/public/projects/culyte.png
--------------------------------------------------------------------------------
/public/projects/erp.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/osamajavaid/portfolio/06e21ba9160f5dbb1b2ae616c4f628aa057a87fd/public/projects/erp.png
--------------------------------------------------------------------------------
/public/projects/fateh.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/osamajavaid/portfolio/06e21ba9160f5dbb1b2ae616c4f628aa057a87fd/public/projects/fateh.png
--------------------------------------------------------------------------------
/public/projects/firmsanad.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/osamajavaid/portfolio/06e21ba9160f5dbb1b2ae616c4f628aa057a87fd/public/projects/firmsanad.png
--------------------------------------------------------------------------------
/public/projects/jmm.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/osamajavaid/portfolio/06e21ba9160f5dbb1b2ae616c4f628aa057a87fd/public/projects/jmm.png
--------------------------------------------------------------------------------
/public/projects/otawix.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/osamajavaid/portfolio/06e21ba9160f5dbb1b2ae616c4f628aa057a87fd/public/projects/otawix.png
--------------------------------------------------------------------------------
/public/projects/spatay.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/osamajavaid/portfolio/06e21ba9160f5dbb1b2ae616c4f628aa057a87fd/public/projects/spatay.png
--------------------------------------------------------------------------------
/public/projects/tojjar.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/osamajavaid/portfolio/06e21ba9160f5dbb1b2ae616c4f628aa057a87fd/public/projects/tojjar.png
--------------------------------------------------------------------------------
/public/readme-images/moj.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/osamajavaid/portfolio/06e21ba9160f5dbb1b2ae616c4f628aa057a87fd/public/readme-images/moj.png
--------------------------------------------------------------------------------
/public/readme-images/portfolio.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/osamajavaid/portfolio/06e21ba9160f5dbb1b2ae616c4f628aa057a87fd/public/readme-images/portfolio.png
--------------------------------------------------------------------------------
/styles/Home.module.css:
--------------------------------------------------------------------------------
1 | .main {
2 | display: flex;
3 | flex-direction: column;
4 | justify-content: space-between;
5 | align-items: center;
6 | padding: 6rem;
7 | min-height: 100vh;
8 | }
9 |
10 | .description {
11 | display: inherit;
12 | justify-content: inherit;
13 | align-items: inherit;
14 | font-size: 0.85rem;
15 | max-width: var(--max-width);
16 | width: 100%;
17 | z-index: 2;
18 | font-family: var(--font-mono);
19 | }
20 |
21 | .description a {
22 | display: flex;
23 | justify-content: center;
24 | align-items: center;
25 | gap: 0.5rem;
26 | }
27 |
28 | .description p {
29 | position: relative;
30 | margin: 0;
31 | padding: 1rem;
32 | background-color: rgba(var(--callout-rgb), 0.5);
33 | border: 1px solid rgba(var(--callout-border-rgb), 0.3);
34 | border-radius: var(--border-radius);
35 | }
36 |
37 | .code {
38 | font-weight: 700;
39 | font-family: var(--font-mono);
40 | }
41 |
42 | .grid {
43 | display: grid;
44 | grid-template-columns: repeat(4, minmax(25%, auto));
45 | width: var(--max-width);
46 | max-width: 100%;
47 | }
48 |
49 | .card {
50 | padding: 1rem 1.2rem;
51 | border-radius: var(--border-radius);
52 | background: rgba(var(--card-rgb), 0);
53 | border: 1px solid rgba(var(--card-border-rgb), 0);
54 | transition: background 200ms, border 200ms;
55 | }
56 |
57 | .card span {
58 | display: inline-block;
59 | transition: transform 200ms;
60 | }
61 |
62 | .card h2 {
63 | font-weight: 600;
64 | margin-bottom: 0.7rem;
65 | }
66 |
67 | .card p {
68 | margin: 0;
69 | opacity: 0.6;
70 | font-size: 0.9rem;
71 | line-height: 1.5;
72 | max-width: 30ch;
73 | }
74 |
75 | .center {
76 | display: flex;
77 | justify-content: center;
78 | align-items: center;
79 | position: relative;
80 | padding: 4rem 0;
81 | }
82 |
83 | .center::before {
84 | background: var(--secondary-glow);
85 | border-radius: 50%;
86 | width: 480px;
87 | height: 360px;
88 | margin-left: -400px;
89 | }
90 |
91 | .center::after {
92 | background: var(--primary-glow);
93 | width: 240px;
94 | height: 180px;
95 | z-index: -1;
96 | }
97 |
98 | .center::before,
99 | .center::after {
100 | content: '';
101 | left: 50%;
102 | position: absolute;
103 | filter: blur(45px);
104 | transform: translateZ(0);
105 | }
106 |
107 | .logo,
108 | .thirteen {
109 | position: relative;
110 | }
111 |
112 | .thirteen {
113 | display: flex;
114 | justify-content: center;
115 | align-items: center;
116 | width: 75px;
117 | height: 75px;
118 | padding: 25px 10px;
119 | margin-left: 16px;
120 | transform: translateZ(0);
121 | border-radius: var(--border-radius);
122 | overflow: hidden;
123 | box-shadow: 0px 2px 8px -1px #0000001a;
124 | }
125 |
126 | .thirteen::before,
127 | .thirteen::after {
128 | content: '';
129 | position: absolute;
130 | z-index: -1;
131 | }
132 |
133 | /* Conic Gradient Animation */
134 | .thirteen::before {
135 | animation: 6s rotate linear infinite;
136 | width: 200%;
137 | height: 200%;
138 | background: var(--tile-border);
139 | }
140 |
141 | /* Inner Square */
142 | .thirteen::after {
143 | inset: 0;
144 | padding: 1px;
145 | border-radius: var(--border-radius);
146 | background: linear-gradient(
147 | to bottom right,
148 | rgba(var(--tile-start-rgb), 1),
149 | rgba(var(--tile-end-rgb), 1)
150 | );
151 | background-clip: content-box;
152 | }
153 |
154 | /* Enable hover only on non-touch devices */
155 | @media (hover: hover) and (pointer: fine) {
156 | .card:hover {
157 | background: rgba(var(--card-rgb), 0.1);
158 | border: 1px solid rgba(var(--card-border-rgb), 0.15);
159 | }
160 |
161 | .card:hover span {
162 | transform: translateX(4px);
163 | }
164 | }
165 |
166 | @media (prefers-reduced-motion) {
167 | .thirteen::before {
168 | animation: none;
169 | }
170 |
171 | .card:hover span {
172 | transform: none;
173 | }
174 | }
175 |
176 | /* Mobile */
177 | @media (max-width: 700px) {
178 | .content {
179 | padding: 4rem;
180 | }
181 |
182 | .grid {
183 | grid-template-columns: 1fr;
184 | margin-bottom: 120px;
185 | max-width: 320px;
186 | text-align: center;
187 | }
188 |
189 | .card {
190 | padding: 1rem 2.5rem;
191 | }
192 |
193 | .card h2 {
194 | margin-bottom: 0.5rem;
195 | }
196 |
197 | .center {
198 | padding: 8rem 0 6rem;
199 | }
200 |
201 | .center::before {
202 | transform: none;
203 | height: 300px;
204 | }
205 |
206 | .description {
207 | font-size: 0.8rem;
208 | }
209 |
210 | .description a {
211 | padding: 1rem;
212 | }
213 |
214 | .description p,
215 | .description div {
216 | display: flex;
217 | justify-content: center;
218 | position: fixed;
219 | width: 100%;
220 | }
221 |
222 | .description p {
223 | align-items: center;
224 | inset: 0 0 auto;
225 | padding: 2rem 1rem 1.4rem;
226 | border-radius: 0;
227 | border: none;
228 | border-bottom: 1px solid rgba(var(--callout-border-rgb), 0.25);
229 | background: linear-gradient(
230 | to bottom,
231 | rgba(var(--background-start-rgb), 1),
232 | rgba(var(--callout-rgb), 0.5)
233 | );
234 | background-clip: padding-box;
235 | backdrop-filter: blur(24px);
236 | }
237 |
238 | .description div {
239 | align-items: flex-end;
240 | pointer-events: none;
241 | inset: auto 0 0;
242 | padding: 2rem;
243 | height: 200px;
244 | background: linear-gradient(
245 | to bottom,
246 | transparent 0%,
247 | rgb(var(--background-end-rgb)) 40%
248 | );
249 | z-index: 1;
250 | }
251 | }
252 |
253 | /* Tablet and Smaller Desktop */
254 | @media (min-width: 701px) and (max-width: 1120px) {
255 | .grid {
256 | grid-template-columns: repeat(2, 50%);
257 | }
258 | }
259 |
260 | @media (prefers-color-scheme: dark) {
261 | .vercelLogo {
262 | filter: invert(1);
263 | }
264 |
265 | .logo,
266 | .thirteen img {
267 | filter: invert(1) drop-shadow(0 0 0.3rem #ffffff70);
268 | }
269 | }
270 |
271 | @keyframes rotate {
272 | from {
273 | transform: rotate(360deg);
274 | }
275 | to {
276 | transform: rotate(0deg);
277 | }
278 | }
279 |
--------------------------------------------------------------------------------
/styles/globals.css:
--------------------------------------------------------------------------------
1 | @tailwind base;
2 | @tailwind components;
3 | @tailwind utilities;
4 |
5 | body {
6 | /* transition: all; */
7 | background-color: #000 !important;
8 | /* padding: 0.8rem; */
9 | /* transition: width 5s ease-in .2s; */
10 | overflow: hidden;
11 | height: 100vh;
12 | }
13 |
14 | @layer utilities {
15 | @layer components {
16 | .transition {
17 | @apply transition-all delay-200 !duration-1000;
18 | }
19 | .card_stylings {
20 | @apply bg-EveningBlack/95 rounded-xl hover:bg-gradient-to-br hover:from-Green/10 hover:to-indigo-600/5;
21 | }
22 | .button {
23 | @apply bg-Green hover:bg-Green/60 transition rounded-xl text-MidNightBlack text-base font-medium px-8 py-2;
24 | }
25 | .input_stylings {
26 | @apply bg-DeepNightBlack text-SilverGray text-sm rounded-lg outline-none focus:ring-1 focus:ring-Green block w-full pl-10 p-2.5;
27 | }
28 |
29 | @font-face {
30 | font-family: 'cascadia-normal';
31 | src: url(/public/fonts/Cascadia.ttf);
32 | }
33 | @font-face {
34 | font-family: 'circular-light';
35 | src: url(/public/fonts/Circular-Light.otf);
36 | }
37 | @font-face {
38 | font-family: 'circular-normal';
39 | src: url(/public/fonts/Circular-Book.otf);
40 | }
41 | @font-face {
42 | font-family: 'circular-medium';
43 | src: url(/public/fonts/Circular-Medium.otf);
44 | }
45 | @font-face {
46 | font-family: 'circular-bold';
47 | src: url(/public/fonts/Circular-Bold.otf);
48 | }
49 | }
50 | @variants responsive {
51 | /* Hide scrollbar for Chrome, Safari and Opera */
52 | .no-scrollbar::-webkit-scrollbar {
53 | display: none;
54 | }
55 |
56 | /* Hide scrollbar for IE, Edge and Firefox */
57 | .no-scrollbar {
58 | -ms-overflow-style: none; /* IE and Edge */
59 | scrollbar-width: none; /* Firefox */
60 | }
61 |
62 | /* width */
63 | ::-webkit-scrollbar {
64 | width: 5px;
65 | height: 4px;
66 | }
67 |
68 | /* Track */
69 | ::-webkit-scrollbar-track {
70 | box-shadow: inset 0 0 5px grey;
71 | border-radius: 10px;
72 | }
73 |
74 | /* Handle */
75 | ::-webkit-scrollbar-thumb {
76 | background: #1fdf64;
77 | border-radius: 8px;
78 | }
79 |
80 | /* Handle on hover */
81 | ::-webkit-scrollbar-thumb:hover {
82 | background: #1fdf64;
83 | }
84 | }
85 |
86 | .icon {
87 | animation-name: scale-icon;
88 | animation-duration: 1s;
89 | animation-iteration-count: infinite;
90 | animation-timing-function: ease-in-out;
91 | }
92 |
93 | @keyframes scale-icon {
94 | 0% {
95 | transform: scale(1);
96 | }
97 | 50% {
98 | transform: scale(1.06);
99 | }
100 | 100% {
101 | transform: scale(1);
102 | }
103 | }
104 | }
105 | /* antd css */
106 | .ant-progress-text{
107 | color:white !important
108 | }
109 | .ant-modal .ant-modal-content{
110 | display: flex;
111 | flex-direction: column;
112 | align-items: center;
113 | justify-content: center;
114 | background-color: transparent !important;
115 | height: 200px;
116 | }
117 | .boxShodow:hover{
118 | box-shadow: rgba(31,223,100,1) 0px 2px 5px -1px, rgba(31,223,100,1) 0px 1px 3px -1px;
119 | /* -webkit-box-shadow: 0px 0px 11px -3px rgba(31,223,100,1);
120 | -moz-box-shadow: 0px 0px 11px -3px rgba(31,223,100,1);
121 | box-shadow: 0px 0px 11px -3px rgba(31,223,100,1); */
122 |
123 | }
124 |
125 |
126 | .userIcon:focus-within #icon {
127 | color: #1fdf64; /* Change the icon color when the input is focused */
128 | }
129 | .mailIcon:focus-within #icon {
130 | color: #1fdf64; /* Change the icon color when the input is focused */
131 | }
132 | .textIcon:focus-within #icon {
133 | color: #1fdf64; /* Change the icon color when the input is focused */
134 | }
135 |
--------------------------------------------------------------------------------
/tailwind.config.js:
--------------------------------------------------------------------------------
1 | /** @type {import('tailwindcss').Config} */
2 | module.exports = {
3 | content: [
4 | "./pages/**/*.{js,ts,jsx,tsx}",
5 | "./components/**/*.{js,ts,jsx,tsx}",
6 | ],
7 | theme: {
8 | extend: {
9 | colors: {
10 | Green: "#1fdf64",
11 | Black: "#000",
12 | DeepNightBlack: "#121212",
13 | MidNightBlack: "#181818",
14 | EveningBlack: "#1a1a1a",
15 | DarkGray: "#282828",
16 | SlateGray: "#404040",
17 | LightGray: "#959595",
18 | SilverGray: "#B3B3B3",
19 | Snow: "#ffffff",
20 | },
21 | fontFamily: {
22 | 'cascadia-normal': ['cascadia-normal'],
23 | 'circular': ['circular-normal', 'sans-serif'],
24 | 'circular-light': ['circular-light', 'sans-serif'],
25 | 'circular-normal': ['circular-normal', 'sans-serif'],
26 | 'circular-medium': ['circular-medium', 'sans-serif'],
27 | 'circular-bold': ['circular-bold', 'sans-serif'],
28 |
29 | }
30 | },
31 | },
32 | }
--------------------------------------------------------------------------------
/utils/utils.js:
--------------------------------------------------------------------------------
1 | export const getObjectKeys = (obj) => {
2 | const keys = Object.keys(obj);
3 | return keys;
4 | };
5 |
--------------------------------------------------------------------------------