├── src
├── avatar.png
├── index.css
├── index.js
├── App.js
└── components
│ ├── Projects.js
│ ├── Footer.js
│ ├── Contact.js
│ ├── Skills.js
│ ├── About.js
│ └── Hero.js
├── public
├── favicon.ico
├── logo192.png
├── logo512.png
├── robots.txt
├── manifest.json
└── index.html
├── .gitignore
├── tailwind.config.js
├── LICENSE
├── README.md
└── package.json
/src/avatar.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/soxamz/react-portfolio/HEAD/src/avatar.png
--------------------------------------------------------------------------------
/public/favicon.ico:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/soxamz/react-portfolio/HEAD/public/favicon.ico
--------------------------------------------------------------------------------
/public/logo192.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/soxamz/react-portfolio/HEAD/public/logo192.png
--------------------------------------------------------------------------------
/public/logo512.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/soxamz/react-portfolio/HEAD/public/logo512.png
--------------------------------------------------------------------------------
/public/robots.txt:
--------------------------------------------------------------------------------
1 | # https://www.robotstxt.org/robotstxt.html
2 | User-agent: *
3 | Disallow:
4 |
--------------------------------------------------------------------------------
/src/index.css:
--------------------------------------------------------------------------------
1 | * {
2 | margin: 0;
3 | padding: 0;
4 | box-sizing: border-box;
5 | }
6 |
7 | @tailwind base;
8 | @tailwind components;
9 | @tailwind utilities;
10 |
--------------------------------------------------------------------------------
/src/index.js:
--------------------------------------------------------------------------------
1 | import React from "react";
2 | import ReactDOM from "react-dom/client";
3 | import "./index.css";
4 | import App from "./App";
5 |
6 | const root = ReactDOM.createRoot(document.getElementById("root"));
7 | root.render(
8 |
9 |
10 |
11 | );
12 |
--------------------------------------------------------------------------------
/.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 | # production
12 | /build
13 |
14 | # misc
15 | .DS_Store
16 | .env.local
17 | .env.development.local
18 | .env.test.local
19 | .env.production.local
20 |
21 | npm-debug.log*
22 | yarn-debug.log*
23 | yarn-error.log*
24 |
--------------------------------------------------------------------------------
/tailwind.config.js:
--------------------------------------------------------------------------------
1 | /** @type {import('tailwindcss').Config} */
2 | module.exports = {
3 | content: ["./src/**/*.{js,jsx,ts,tsx}"],
4 | theme: {
5 | extend: {
6 | gridTemplateRows: {
7 | "[auto,auto,1fr]": "auto auto 1fr",
8 | },
9 | },
10 | },
11 | daisyui: {
12 | themes: ["light", "dark"],
13 | },
14 | plugins: [
15 | require("@tailwindcss/aspect-ratio"),
16 | require("@tailwindcss/forms"),
17 | require("daisyui"),
18 | ],
19 | };
20 |
--------------------------------------------------------------------------------
/src/App.js:
--------------------------------------------------------------------------------
1 | import Hero from "./components/Hero";
2 | import About from "./components/About";
3 | import Skills from "./components/Skills";
4 | import Projects from "./components/Projects";
5 | import Contact from "./components/Contact";
6 | import Footer from "./components/Footer";
7 | export default function App() {
8 | return (
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 | );
18 | }
19 |
--------------------------------------------------------------------------------
/public/manifest.json:
--------------------------------------------------------------------------------
1 | {
2 | "short_name": "Portfolio",
3 | "name": "React Portfolio",
4 | "icons": [
5 | {
6 | "src": "favicon.ico",
7 | "sizes": "64x64 32x32 24x24 16x16",
8 | "type": "image/x-icon"
9 | },
10 | {
11 | "src": "logo192.png",
12 | "type": "image/png",
13 | "sizes": "192x192"
14 | },
15 | {
16 | "src": "logo512.png",
17 | "type": "image/png",
18 | "sizes": "512x512"
19 | }
20 | ],
21 | "start_url": ".",
22 | "display": "standalone",
23 | "theme_color": "#000000",
24 | "background_color": "#ffffff"
25 | }
26 |
--------------------------------------------------------------------------------
/LICENSE:
--------------------------------------------------------------------------------
1 | MIT License
2 |
3 | Copyright (c) 2023 react-portfolio
4 |
5 | Permission is hereby granted, free of charge, to any person obtaining a copy
6 | of this software and associated documentation files (the "Software"), to deal
7 | in the Software without restriction, including without limitation the rights
8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9 | copies of the Software, and to permit persons to whom the Software is
10 | furnished to do so, subject to the following conditions:
11 |
12 | The above copyright notice and this permission notice shall be included in all
13 | copies or substantial portions of the Software.
14 |
15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21 | SOFTWARE.
22 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | React Portfolio
2 |
3 | This repository is home to a simple, fully functional React portfolio website designed specifically for aspiring frontend developers. It's an ideal starting point for anyone who wants to:
4 |
5 | - Learn React by building a practical project.
6 | - Gain inspiration for their own portfolio design.
7 | - Understand basic React components and state management.
8 |
9 |
10 | 
11 | ## Features
12 |
13 | - Light/dark mode toggle
14 | - Smooth Scrolling
15 | - Scroll Animations
16 | - Responsiveness
17 |
18 |
19 |
20 | ## Run Locally
21 |
22 | Clone the project
23 |
24 | ```bash
25 | git clone https://github.com/sohomofficial/react-portfolio.git
26 | ```
27 |
28 | Go to the project directory
29 |
30 | ```bash
31 | cd react-portfolio
32 | ```
33 |
34 | Install dependencies
35 |
36 | ```bash
37 | npm i
38 | ```
39 |
40 | Start the server
41 |
42 | ```bash
43 | npm start
44 | ```
45 |
46 |
47 | ## FAQ
48 |
49 | ### Can I use this project as a template to create my own portfolio?
50 |
51 | Yes! But don't forget to add your own magic to it ✨.
52 |
53 |
54 |
--------------------------------------------------------------------------------
/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "my-portfolio",
3 | "version": "0.1.0",
4 | "private": true,
5 | "dependencies": {
6 | "@headlessui/react": "^1.7.18",
7 | "@heroicons/react": "^2.1.3",
8 | "@tailwindcss/aspect-ratio": "^0.4.2",
9 | "@tailwindcss/forms": "^0.5.7",
10 | "@testing-library/jest-dom": "^6.4.2",
11 | "@testing-library/react": "^14.2.2",
12 | "@testing-library/user-event": "^14.5.2",
13 | "aos": "^2.3.4",
14 | "react": "^18.2.0",
15 | "react-dom": "^18.2.0",
16 | "react-scripts": "5.0.1",
17 | "react-scroll": "^1.9.0",
18 | "react-type-animation": "^3.2.0",
19 | "web-vitals": "^3.5.2"
20 | },
21 | "scripts": {
22 | "start": "react-scripts start",
23 | "build": "react-scripts build",
24 | "test": "react-scripts test",
25 | "eject": "react-scripts eject"
26 | },
27 | "eslintConfig": {
28 | "extends": [
29 | "react-app",
30 | "react-app/jest"
31 | ]
32 | },
33 | "browserslist": {
34 | "production": [
35 | ">0.2%",
36 | "not dead",
37 | "not op_mini all"
38 | ],
39 | "development": [
40 | "last 1 chrome version",
41 | "last 1 firefox version",
42 | "last 1 safari version"
43 | ]
44 | },
45 | "devDependencies": {
46 | "daisyui": "^4.9.0",
47 | "tailwindcss": "^3.4.1"
48 | }
49 | }
50 |
--------------------------------------------------------------------------------
/public/index.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 | React Portfolio
9 |
10 |
14 |
15 |
16 |
17 |
21 |
25 |
26 |
27 |
28 |
29 |
33 |
37 |
38 |
39 |
40 |
41 | You need to enable JavaScript to run this app.
42 |
43 |
44 |
45 |
--------------------------------------------------------------------------------
/src/components/Projects.js:
--------------------------------------------------------------------------------
1 | import { useEffect } from "react";
2 | import AOS from "aos";
3 | import "aos/dist/aos.css";
4 |
5 | const projects = [
6 | {
7 | id: 1,
8 | name: "Sprinkles",
9 | href: "#",
10 | imageSrc:
11 | "https://fastly.picsum.photos/id/23/3887/4899.jpg?hmac=2fo1Y0AgEkeL2juaEBqKPbnEKm_5Mp0M2nuaVERE6eE",
12 | used: "ReactJS, TailwindCSS",
13 | description: "A restaurant website.",
14 | },
15 | {
16 | id: 2,
17 | name: "Paper Bag",
18 | href: "#",
19 | imageSrc:
20 | "https://fastly.picsum.photos/id/3/5000/3333.jpg?hmac=GDjZ2uNWE3V59PkdDaOzTOuV3tPWWxJSf4fNcxu4S2g",
21 | used: "ReactJS, TailwindCSS",
22 | description: "An online shopping website.",
23 | },
24 | {
25 | id: 3,
26 | name: "My Blogs",
27 | href: "#",
28 | imageSrc:
29 | "https://fastly.picsum.photos/id/447/1280/853.jpg?hmac=4DUUCOsHRIoYbNrPRYEUHOW7wCjM7TROrTrYFivtdPw",
30 |
31 | used: "ReactJS, TailwindCSS",
32 | description: "A personal blogging website.",
33 | },
34 | {
35 | id: 4,
36 | name: "Canopy",
37 | href: "#",
38 | imageSrc:
39 | "https://fastly.picsum.photos/id/366/4000/3000.jpg?hmac=zphhHOH9ofToN2jNHd8z-nc98NrBd8y2okWXEXetLDg",
40 | used: "ReactJS, TailwindCSS",
41 | description: "An online educational website.",
42 | },
43 | ];
44 |
45 | export default function Projects() {
46 | useEffect(() => {
47 | AOS.init({ duration: 2000 });
48 | }, []);
49 | return (
50 |
51 |
52 |
Browse my recent
53 |
54 | Projects
55 |
56 |
57 | {projects.map((project) => (
58 |
63 |
64 |
69 |
70 |
71 |
72 |
78 |
{project.description}
79 |
{project.used}
80 |
81 |
82 |
83 | ))}
84 |
85 |
86 | View More
87 |
88 |
89 |
90 | );
91 | }
92 |
--------------------------------------------------------------------------------
/src/components/Footer.js:
--------------------------------------------------------------------------------
1 | export default function Footer() {
2 | return (
3 |
4 |
5 |
6 |
12 |
13 |
14 |
15 |
16 |
22 |
23 |
24 |
25 |
26 |
32 |
33 |
34 |
35 |
36 |
37 |
38 | Created with ❤️ by Sohom Mondal
39 |
40 |
Copyright © 2023 React Portfolio. All Rights Reserved
41 |
42 | );
43 | }
44 |
--------------------------------------------------------------------------------
/src/components/Contact.js:
--------------------------------------------------------------------------------
1 | import { useEffect } from "react";
2 | import AOS from "aos";
3 | import "aos/dist/aos.css";
4 |
5 | export default function Contact() {
6 | useEffect(() => {
7 | AOS.init({ duration: 1000 });
8 | }, []);
9 | return (
10 |
106 | );
107 | }
108 |
--------------------------------------------------------------------------------
/src/components/Skills.js:
--------------------------------------------------------------------------------
1 | import { useEffect } from "react";
2 | import { CheckCircleIcon } from "@heroicons/react/24/solid";
3 | import AOS from "aos";
4 | import "aos/dist/aos.css";
5 |
6 | const frontend = [
7 | {
8 | name: "HTML/CSS",
9 | value: 80,
10 | icon: CheckCircleIcon,
11 | },
12 | {
13 | name: "JavaScript",
14 | value: 70,
15 | icon: CheckCircleIcon,
16 | },
17 | {
18 | name: "React",
19 | value: 80,
20 | icon: CheckCircleIcon,
21 | },
22 | {
23 | name: "Next.js",
24 | value: 60,
25 | icon: CheckCircleIcon,
26 | },
27 | {
28 | name: "TailwindCSS",
29 | value: 80,
30 | icon: CheckCircleIcon,
31 | },
32 | ];
33 | const backend = [
34 | {
35 | name: "NodeJS",
36 | value: 30,
37 | icon: CheckCircleIcon,
38 | },
39 | {
40 | name: "Python",
41 | value: 75,
42 | icon: CheckCircleIcon,
43 | },
44 | {
45 | name: "MySQL",
46 | value: 50,
47 | icon: CheckCircleIcon,
48 | },
49 | {
50 | name: "APIs",
51 | value: 20,
52 | icon: CheckCircleIcon,
53 | },
54 | {
55 | name: "MongoDB",
56 | value: 40,
57 | icon: CheckCircleIcon,
58 | },
59 | {
60 | name: "GraphQL",
61 | value: 30,
62 | icon: CheckCircleIcon,
63 | },
64 | ];
65 |
66 | export default function Skills() {
67 | useEffect(() => {
68 | AOS.init({ duration: 2000 });
69 | }, []);
70 | return (
71 |
72 |
73 |
74 |
Explore my
75 |
76 | Skills
77 |
78 |
79 |
80 |
84 |
85 | Frontend Development
86 |
87 |
88 | {frontend.map((frontend) => (
89 |
90 |
91 |
92 |
93 |
94 | {frontend.name}
95 |
96 |
97 |
102 |
103 |
104 | ))}
105 |
106 |
107 |
111 |
112 | Backend Development
113 |
114 |
115 | {backend.map((backend) => (
116 |
117 |
118 |
119 |
120 |
121 | {backend.name}
122 |
123 |
124 |
129 |
130 |
131 | ))}
132 |
133 |
134 |
135 |
136 |
137 | );
138 | }
139 |
--------------------------------------------------------------------------------
/src/components/About.js:
--------------------------------------------------------------------------------
1 | import { useEffect } from "react";
2 | import {
3 | MapPinIcon,
4 | AtSymbolIcon,
5 | CalendarIcon,
6 | AcademicCapIcon,
7 | BriefcaseIcon,
8 | } from "@heroicons/react/20/solid";
9 | import AOS from "aos";
10 | import "aos/dist/aos.css";
11 | const features = [
12 | {
13 | name: "Age:",
14 | description: "18 years old",
15 | icon: CalendarIcon,
16 | },
17 | {
18 | name: "Email:",
19 | description: "name@example.com",
20 | icon: AtSymbolIcon,
21 | },
22 | {
23 | name: "Location:",
24 | description: "India, Earth",
25 | icon: MapPinIcon,
26 | },
27 | ];
28 |
29 | export default function About() {
30 | useEffect(() => {
31 | AOS.init({ duration: 2000 });
32 | }, []);
33 | return (
34 |
38 |
39 |
40 |
41 |
42 |
Get to know more
43 |
44 | About Me
45 |
46 |
47 | Lorem ipsum dolor sit amet, consectetur adipiscing elit. Cras
48 | suscipit lobortis nisi, consequat semper lacus tempor sit amet.
49 | Sed elit orci, pretium sed velit sit amet, venenatis pretium
50 | magna. Nam pharetra dictum urna, non vestibulum mauris vulputate
51 | ut. Sed eros nisi, dapibus vitae consequat non, mollis et
52 | tortor. Maecenas bibendum nunc eu cursus maximus. Fusce
53 | ultricies ornare neque, vel varius libero euismod eget. Nulla
54 | sodales blandit lacus, id maximus quam interdum in. Morbi eu
55 | velit ut mi semper sollicitudin finibus aliquam nisi.
56 | Pellentesque habitant morbi tristique senectus et netus et
57 | malesuada fames ac turpis egestas. Ut accumsan faucibus urna vel
58 | placerat. Donec euismod dui enim, tincidunt suscipit mauris
59 | lacinia vel. Fusce eget risus eget leo euismod porta. Aliquam
60 | dapibus sapien vitae eros pulvinar, in auctor ligula porta. Nam
61 | ac porttitor risus, nec blandit nulla. Nam erat erat, venenatis
62 | quis scelerisque nec, rhoncus id mi. Suspendisse molestie nibh
63 | purus, quis semper tellus pulvinar eget.
64 |
65 |
66 |
67 |
68 |
72 |
77 |
78 |
79 |
80 |
81 |
82 |
83 |
87 |
88 |
89 | Experience
90 |
91 |
92 | Lorem ipsum dolor sit amet, consectetur adipiscing elit.
93 |
94 |
95 | Vestibulum vitae augue sit amet ex laoreet euismod sed eu dui.
96 |
97 |
98 | Fusce et leo nec elit mollis sollicitudin.
99 |
100 |
101 |
105 |
109 |
110 | Education
111 |
112 |
113 | Lorem ipsum dolor sit amet, consectetur adipiscing elit.
114 |
115 |
116 | Vestibulum vitae augue sit amet ex laoreet euismod sed eu dui.
117 |
118 |
119 | Fusce et leo nec elit mollis sollicitudin.
120 |
121 |
122 |
123 |
127 | {features.map((feature) => (
128 |
129 |
130 |
134 | {feature.name}
135 | {" "}
136 | {feature.description}
137 |
138 | ))}
139 |
140 |
141 |
142 |
143 |
144 | );
145 | }
146 |
--------------------------------------------------------------------------------
/src/components/Hero.js:
--------------------------------------------------------------------------------
1 | import { useState, useEffect } from "react";
2 | import { Dialog } from "@headlessui/react";
3 | import pfp from "../avatar.png";
4 | import {
5 | Bars3Icon,
6 | XMarkIcon,
7 | SunIcon,
8 | MoonIcon,
9 | } from "@heroicons/react/24/outline";
10 | import { Link } from "react-scroll";
11 | import { TypeAnimation } from "react-type-animation";
12 | import AOS from "aos";
13 | import "aos/dist/aos.css";
14 |
15 | const navigation = [
16 | { name: "About Me", id: "about" },
17 | { name: "Skills", id: "skills" },
18 | { name: "Projects", id: "projects" },
19 | { name: "Contact Me", id: "contact" },
20 | ];
21 |
22 | export default function Hero() {
23 | const [theme, setTheme] = useState(
24 | localStorage.getItem("theme") ? localStorage.getItem("theme") : "light"
25 | );
26 | useEffect(() => {
27 | localStorage.setItem("theme", theme);
28 | const localTheme = localStorage.getItem("theme");
29 | document.querySelector("html").setAttribute("data-theme", localTheme);
30 | }, [theme]);
31 | const [mobileMenuOpen, setMobileMenuOpen] = useState(false);
32 | useEffect(() => {
33 | AOS.init({ duration: 2000 });
34 | }, []);
35 | const handleToggle = (e) => {
36 | e.target.checked ? setTheme("dark") : setTheme("light");
37 | };
38 | return (
39 |
40 |
137 |
138 |
139 |
143 |
144 |
149 |
150 |
151 |
152 |
153 | Hello, I'm
154 |
155 |
156 |
157 |
158 | Sohom Mondal
159 |
160 |
161 |
173 |
174 |
175 |
176 | Lorem ipsum dolor sit amet, consectetur adipiscing elit.
177 | Nulla venenatis quis nibh ut laoreet. Sed imperdiet leo nec
178 | ex dapibus mollis.
179 |
180 |
181 |
182 |
183 |
189 |
190 |
191 |
192 |
193 |
199 |
200 |
201 |
202 |
203 |
204 |
205 |
206 |
207 |
208 |
209 | );
210 | }
211 |
--------------------------------------------------------------------------------