├── .gitignore ├── README.md ├── package-lock.json ├── package.json ├── postcss.config.js ├── public ├── favicon.ico ├── index.html ├── logo192.png ├── logo512.png ├── manifest.json └── robots.txt ├── src ├── App.css ├── App.js ├── asset │ ├── certificate │ │ ├── freecodecamp frontend libraries.png │ │ ├── freecodecamp responsive.png │ │ └── sertifikat dicoding.png │ ├── logo.png │ ├── profile.png │ ├── projects │ │ ├── Anime Finder.png │ │ ├── Mealdb app.png │ │ ├── Quran Web App Next js.png │ │ ├── Quran Web App.png │ │ ├── To Do List.png │ │ └── movie finder.png │ └── theme │ │ ├── dark.png │ │ └── light.jpg ├── components │ ├── about.js │ ├── border.js │ ├── card.js │ ├── certificate.js │ ├── contact.js │ ├── footer.js │ ├── hero.js │ ├── intro.js │ ├── mobile │ │ └── mobilenav.js │ ├── navbar.js │ ├── projects.js │ └── skill.js ├── index.css ├── index.js └── reportWebVitals.js └── tailwind.config.js /.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 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Its just personal web portofolio 2 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "personal-portfolio", 3 | "version": "0.1.0", 4 | "private": true, 5 | "dependencies": { 6 | "@testing-library/jest-dom": "^5.16.2", 7 | "@testing-library/react": "^12.1.3", 8 | "@testing-library/user-event": "^13.5.0", 9 | "gsap": "^3.9.1", 10 | "react": "^17.0.2", 11 | "react-dom": "^17.0.2", 12 | "react-scripts": "5.0.0", 13 | "web-vitals": "^2.1.4" 14 | }, 15 | "scripts": { 16 | "start": "react-scripts start", 17 | "build": "react-scripts build", 18 | "test": "react-scripts test", 19 | "eject": "react-scripts eject" 20 | }, 21 | "eslintConfig": { 22 | "extends": [ 23 | "react-app", 24 | "react-app/jest" 25 | ] 26 | }, 27 | "browserslist": { 28 | "production": [ 29 | ">0.2%", 30 | "not dead", 31 | "not op_mini all" 32 | ], 33 | "development": [ 34 | "last 1 chrome version", 35 | "last 1 firefox version", 36 | "last 1 safari version" 37 | ] 38 | }, 39 | "devDependencies": { 40 | "autoprefixer": "^10.4.2", 41 | "postcss": "^8.4.8", 42 | "tailwindcss": "^3.0.23" 43 | } 44 | } 45 | -------------------------------------------------------------------------------- /postcss.config.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | plugins: { 3 | tailwindcss: {}, 4 | autoprefixer: {}, 5 | }, 6 | } 7 | -------------------------------------------------------------------------------- /public/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MFaqihRidho/personal-portfolio/56a0899442b1d6afa93f7dfb4ed67aaf83e749c7/public/favicon.ico -------------------------------------------------------------------------------- /public/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 12 | 13 | 17 | 18 | 27 | M.Faqih Ridho 28 | 29 | 30 | 31 |
32 | 42 | 43 | 44 | -------------------------------------------------------------------------------- /public/logo192.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MFaqihRidho/personal-portfolio/56a0899442b1d6afa93f7dfb4ed67aaf83e749c7/public/logo192.png -------------------------------------------------------------------------------- /public/logo512.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MFaqihRidho/personal-portfolio/56a0899442b1d6afa93f7dfb4ed67aaf83e749c7/public/logo512.png -------------------------------------------------------------------------------- /public/manifest.json: -------------------------------------------------------------------------------- 1 | { 2 | "short_name": "React App", 3 | "name": "Create React App Sample", 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 | -------------------------------------------------------------------------------- /public/robots.txt: -------------------------------------------------------------------------------- 1 | # https://www.robotstxt.org/robotstxt.html 2 | User-agent: * 3 | Disallow: 4 | -------------------------------------------------------------------------------- /src/App.css: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MFaqihRidho/personal-portfolio/56a0899442b1d6afa93f7dfb4ed67aaf83e749c7/src/App.css -------------------------------------------------------------------------------- /src/App.js: -------------------------------------------------------------------------------- 1 | import "./App.css"; 2 | import Navbar from "./components/navbar"; 3 | import Hero from "./components/hero"; 4 | import About from "./components/about"; 5 | import Skill from "./components/skill"; 6 | import Certificate from "./components/certificate"; 7 | import Projects from "./components/projects"; 8 | import Footer from "./components/footer"; 9 | import Contact from "./components/contact"; 10 | import Intro from "./components/intro"; 11 | 12 | function App() { 13 | return ( 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 |
25 | ); 26 | } 27 | export default App; 28 | -------------------------------------------------------------------------------- /src/asset/certificate/freecodecamp frontend libraries.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MFaqihRidho/personal-portfolio/56a0899442b1d6afa93f7dfb4ed67aaf83e749c7/src/asset/certificate/freecodecamp frontend libraries.png -------------------------------------------------------------------------------- /src/asset/certificate/freecodecamp responsive.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MFaqihRidho/personal-portfolio/56a0899442b1d6afa93f7dfb4ed67aaf83e749c7/src/asset/certificate/freecodecamp responsive.png -------------------------------------------------------------------------------- /src/asset/certificate/sertifikat dicoding.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MFaqihRidho/personal-portfolio/56a0899442b1d6afa93f7dfb4ed67aaf83e749c7/src/asset/certificate/sertifikat dicoding.png -------------------------------------------------------------------------------- /src/asset/logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MFaqihRidho/personal-portfolio/56a0899442b1d6afa93f7dfb4ed67aaf83e749c7/src/asset/logo.png -------------------------------------------------------------------------------- /src/asset/profile.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MFaqihRidho/personal-portfolio/56a0899442b1d6afa93f7dfb4ed67aaf83e749c7/src/asset/profile.png -------------------------------------------------------------------------------- /src/asset/projects/Anime Finder.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MFaqihRidho/personal-portfolio/56a0899442b1d6afa93f7dfb4ed67aaf83e749c7/src/asset/projects/Anime Finder.png -------------------------------------------------------------------------------- /src/asset/projects/Mealdb app.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MFaqihRidho/personal-portfolio/56a0899442b1d6afa93f7dfb4ed67aaf83e749c7/src/asset/projects/Mealdb app.png -------------------------------------------------------------------------------- /src/asset/projects/Quran Web App Next js.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MFaqihRidho/personal-portfolio/56a0899442b1d6afa93f7dfb4ed67aaf83e749c7/src/asset/projects/Quran Web App Next js.png -------------------------------------------------------------------------------- /src/asset/projects/Quran Web App.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MFaqihRidho/personal-portfolio/56a0899442b1d6afa93f7dfb4ed67aaf83e749c7/src/asset/projects/Quran Web App.png -------------------------------------------------------------------------------- /src/asset/projects/To Do List.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MFaqihRidho/personal-portfolio/56a0899442b1d6afa93f7dfb4ed67aaf83e749c7/src/asset/projects/To Do List.png -------------------------------------------------------------------------------- /src/asset/projects/movie finder.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MFaqihRidho/personal-portfolio/56a0899442b1d6afa93f7dfb4ed67aaf83e749c7/src/asset/projects/movie finder.png -------------------------------------------------------------------------------- /src/asset/theme/dark.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MFaqihRidho/personal-portfolio/56a0899442b1d6afa93f7dfb4ed67aaf83e749c7/src/asset/theme/dark.png -------------------------------------------------------------------------------- /src/asset/theme/light.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MFaqihRidho/personal-portfolio/56a0899442b1d6afa93f7dfb4ed67aaf83e749c7/src/asset/theme/light.jpg -------------------------------------------------------------------------------- /src/components/about.js: -------------------------------------------------------------------------------- 1 | import React, { useEffect } from "react"; 2 | import { gsap } from "gsap"; 3 | import { TextPlugin } from "gsap/TextPlugin"; 4 | import { ScrollTrigger } from "gsap/ScrollTrigger"; 5 | 6 | function About() { 7 | gsap.registerPlugin(TextPlugin, ScrollTrigger); 8 | 9 | useEffect(() => { 10 | const write = gsap.to("#about_desc", { 11 | duration: 5, 12 | text: { 13 | value: `Hai selamat datang di profil sederhana saya, kenalkan 14 | saya Faqih, saya seorang Front-End Developer yang terbiasa membuat 15 | project menggunakan React Js dan Tailwind CSS, saya 16 | menggunakan Git sebagai version control dan Github untuk 17 | menyimpan semua code project saya. Saya sedang mencari 18 | kesempatan untuk bisa bekerja sebagai Front-End Developer di perusahaan yang kolaboratif`, 19 | newClass: "class2", 20 | oldClass: "class1", 21 | }, 22 | ease: "slow", 23 | }); 24 | 25 | const fadeBorder = gsap.fromTo( 26 | "#border", 27 | { opacity: 0, x: -300 }, 28 | { opacity: 1, duration: 3, x: 0 } 29 | ); 30 | 31 | ScrollTrigger.create({ 32 | trigger: "#about_desc", 33 | animation: write, 34 | }); 35 | ScrollTrigger.create({ 36 | trigger: "#border", 37 | animation: fadeBorder, 38 | }); 39 | }, []); 40 | 41 | return ( 42 |
43 | 48 | 53 | 54 |
55 |
56 |
60 |
61 |
62 |
63 |
64 |
65 |
66 |
67 |
68 | 76 | {" "} 77 | 78 | 79 |
80 |
81 |

82 | About Me 83 |

84 |

88 |
89 |
90 |
91 | 96 | 101 | 102 |
103 | ); 104 | } 105 | 106 | export default About; 107 | -------------------------------------------------------------------------------- /src/components/border.js: -------------------------------------------------------------------------------- 1 | import React from "react"; 2 | 3 | function Border(props) { 4 | return ( 5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 | {props.children} 15 |
16 | ); 17 | } 18 | 19 | export default Border; 20 | -------------------------------------------------------------------------------- /src/components/card.js: -------------------------------------------------------------------------------- 1 | import React from "react"; 2 | 3 | function Card(props) { 4 | return ( 5 |
6 | 7 |
8 |
9 |
10 |
11 |
12 |

13 | Live 14 |

15 |
16 |
17 |
18 |
{props.title}
19 |

{props.desc}

20 | {props.tech} 21 |
22 |
23 | 29 | 32 | 33 | 39 | 42 | 43 |
44 |
45 |
46 | ); 47 | } 48 | 49 | export default Card; 50 | -------------------------------------------------------------------------------- /src/components/certificate.js: -------------------------------------------------------------------------------- 1 | import React from "react"; 2 | import Border from "./border"; 3 | import dicodingCertificate from "../asset/certificate/sertifikat dicoding.png"; 4 | import freecodecampResponsiveCertificate from "../asset/certificate/freecodecamp responsive.png"; 5 | import freecodecampLibrariesCertificate from "../asset/certificate/freecodecamp frontend libraries.png"; 6 | 7 | function Certificate() { 8 | return ( 9 |
10 | 15 | 20 | 21 |
22 |
23 |

24 | My Certificate 25 |

26 |
27 |
28 | 35 | 40 | 41 | } 42 | > 43 |
44 |
45 | 52 | 59 | 60 | } 61 | > 62 |
63 |
64 | 71 | 78 | 79 | } 80 | > 81 |
82 |
83 | 90 | 95 | 96 | } 97 | > 98 |
99 |
100 | 107 | 112 | 113 | } 114 | > 115 |
116 |
117 | 124 | 129 | 130 | } 131 | > 132 |
133 |
134 | 141 | 146 | 147 | } 148 | > 149 |
150 |
151 | 158 | 163 | 164 | } 165 | > 166 |
167 |
168 |
169 |
170 | 175 | 180 | 181 |
182 | ); 183 | } 184 | 185 | export default Certificate; 186 | -------------------------------------------------------------------------------- /src/components/contact.js: -------------------------------------------------------------------------------- 1 | import React, { useEffect } from "react"; 2 | import { gsap } from "gsap"; 3 | import { ScrollTrigger } from "gsap/ScrollTrigger"; 4 | 5 | function Contact() { 6 | gsap.registerPlugin(ScrollTrigger); 7 | 8 | useEffect(() => { 9 | const fadeRight = gsap.fromTo( 10 | ".contact_form", 11 | { x: -200 }, 12 | { duration: 3, x: 0, ease: "expo" } 13 | ); 14 | const fadeleft = gsap.fromTo( 15 | ".contact_info", 16 | { x: 200 }, 17 | { duration: 3, x: 0, ease: "expo" } 18 | ); 19 | 20 | ScrollTrigger.create({ 21 | trigger: ".contact_form", 22 | animation: fadeRight, 23 | }); 24 | ScrollTrigger.create({ 25 | trigger: ".contact_form", 26 | animation: fadeleft, 27 | }); 28 | }, []); 29 | 30 | return ( 31 |
35 |

36 | Contact Me 37 |

38 |
39 |
40 |
45 |
46 | 63 |
64 |
65 | 83 |
84 | 85 |
86 | 105 |
106 |
107 | 121 |
122 |
123 |
124 |
125 |

126 | {" "} 127 | Contact Information 128 |

129 |

130 | Saya terbuka untuk saran apapun atau hanya untuk 131 | mengobrol 132 |

133 |
134 |
135 | 141 | 142 | 143 |

144 | WhatsApp :{" "} 145 | 146 | +62 851 5622 4620 147 | 148 |

149 |
150 |
151 | 159 | 164 | 165 |

166 | Email :{" "} 167 | 168 | mfaqihridhoo@gmail.com 169 | 170 |

171 |
172 |
173 | 178 | {" "} 179 | 180 | 181 |

182 | Instagram :{" "} 183 | 184 | @mfaqihridho 185 | 186 |

187 |
188 |
189 | 194 | {" "} 195 | 196 | 197 |

198 | Discord :{" "} 199 | 200 | mfaqihridho#3421 201 | 202 |

203 |
204 |
205 |
206 |
207 |
208 | ); 209 | } 210 | 211 | export default Contact; 212 | -------------------------------------------------------------------------------- /src/components/footer.js: -------------------------------------------------------------------------------- 1 | import React from "react"; 2 | import { gsap } from "gsap"; 3 | import { ScrollToPlugin } from "gsap/ScrollToPlugin"; 4 | 5 | function Footer() { 6 | gsap.registerPlugin(ScrollToPlugin); 7 | const handleClickToTop = () => { 8 | gsap.to(window, { duration: 2, scrollTo: 0 }); 9 | }; 10 | 11 | return ( 12 |
13 | 32 | 37 | 42 | 43 | 129 |
130 | ); 131 | } 132 | 133 | export default Footer; 134 | -------------------------------------------------------------------------------- /src/components/hero.js: -------------------------------------------------------------------------------- 1 | import { gsap } from "gsap"; 2 | import { ScrollToPlugin } from "gsap/ScrollToPlugin"; 3 | import { TextPlugin } from "gsap/TextPlugin"; 4 | import React, { useEffect } from "react"; 5 | import profile from "../asset/profile.png"; 6 | 7 | function Hero() { 8 | gsap.registerPlugin(TextPlugin, ScrollToPlugin); 9 | useEffect(() => { 10 | gsap.to("#stack", { 11 | duration: 2, 12 | text: { 13 | value: "Front-End Developer", 14 | newClass: "class2", 15 | oldClass: "class1", 16 | }, 17 | ease: "power-2", 18 | delay: 7, 19 | }); 20 | }, []); 21 | 22 | const handleClickTo = (id, wave) => { 23 | if (wave === true) { 24 | gsap.to(window, { 25 | duration: 1, 26 | scrollTo: { y: `#${id}`, offsetY: -150 }, 27 | }); 28 | } else { 29 | gsap.to(window, { 30 | duration: 1, 31 | scrollTo: `#${id}`, 32 | }); 33 | } 34 | }; 35 | 36 | return ( 37 |
41 |
42 |

Hai, Saya

43 |

44 | M.Faqih Ridho 45 |

46 |

50 | Handsome Programmer 51 |

52 |
53 | 59 | 65 | {" "} 66 | Download CV 67 | 68 |
69 |
70 | 75 | 84 | {" "} 85 | 86 | 87 | 88 | 93 | 102 | {" "} 103 | 104 | 105 | 106 | 111 | 120 | {" "} 121 | 122 | 123 | 124 |
125 |
126 | profile 131 |
132 | ); 133 | } 134 | 135 | export default Hero; 136 | -------------------------------------------------------------------------------- /src/components/intro.js: -------------------------------------------------------------------------------- 1 | import React, { useEffect, useState } from "react"; 2 | import gsap from "gsap"; 3 | import logo from "../asset/logo.png"; 4 | 5 | function Intro() { 6 | const [candaan, setCandaan] = useState([]); 7 | const [loading, setLoading] = useState(true); 8 | 9 | useEffect(() => { 10 | setLoading(true); 11 | let height = -window.innerHeight; 12 | console.log(height); 13 | gsap.fromTo( 14 | ".logo", 15 | { scale: 0, rotate: 0 }, 16 | { duration: 1, scale: 1, ease: "elastic", rotate: 360 } 17 | ); 18 | const getCandaan = async () => 19 | await fetch("https://candaan-api.vercel.app/api/text/random") 20 | .then((res) => res.json()) 21 | .then((result) => { 22 | setCandaan(result); 23 | setLoading(false); 24 | gsap.fromTo( 25 | ".bg-intro", 26 | { top: 0 }, 27 | { 28 | duration: 3, 29 | top: height - 100, 30 | ease: "expo", 31 | delay: 4, 32 | } 33 | ); 34 | gsap.fromTo( 35 | ".candaan", 36 | { scale: 0 }, 37 | { duration: 1, scale: 1, ease: "elastic" } 38 | ); 39 | }); 40 | getCandaan(); 41 | }, []); 42 | 43 | return ( 44 |
45 | logo 50 |
51 |

52 | {candaan.status === 200 && 53 | loading === false && 54 | candaan.data} 55 |

56 |
57 |
58 | ); 59 | } 60 | 61 | export default Intro; 62 | -------------------------------------------------------------------------------- /src/components/mobile/mobilenav.js: -------------------------------------------------------------------------------- 1 | import React from "react"; 2 | import { gsap } from "gsap"; 3 | import { ScrollToPlugin } from "gsap/ScrollToPlugin"; 4 | 5 | function MobileNav(props) { 6 | gsap.registerPlugin(ScrollToPlugin); 7 | 8 | const handleClickTo = (id, wave) => { 9 | if (wave === true) { 10 | gsap.to(window, { 11 | duration: 1, 12 | scrollTo: { y: `#${id}`, offsetY: -150 }, 13 | }); 14 | } else { 15 | gsap.to(window, { 16 | duration: 1, 17 | scrollTo: `#${id}`, 18 | }); 19 | } 20 | }; 21 | 22 | return ( 23 |
28 | 34 | 40 | 46 | 52 |
53 | ); 54 | } 55 | 56 | export default MobileNav; 57 | -------------------------------------------------------------------------------- /src/components/navbar.js: -------------------------------------------------------------------------------- 1 | import React, { useEffect, useState, useRef } from "react"; 2 | import MobileNav from "./mobile/mobilenav"; 3 | import { gsap } from "gsap"; 4 | import { ScrollToPlugin } from "gsap/ScrollToPlugin"; 5 | import logo from "../asset/logo.png"; 6 | 7 | function Navbar() { 8 | const menuRef = useRef(null); 9 | const [dark, setDark] = useState(true); 10 | const [open, setOpen] = useState(false); 11 | const [isVisible, setIsVisible] = useState(false); 12 | const [listening, setListening] = useState(false); 13 | gsap.registerPlugin(ScrollToPlugin); 14 | 15 | const handleClickTo = (id, wave) => { 16 | if (wave === true) { 17 | gsap.to(window, { 18 | duration: 1, 19 | scrollTo: { y: `#${id}`, offsetY: -150 }, 20 | }); 21 | } else { 22 | gsap.to(window, { 23 | duration: 1, 24 | scrollTo: `#${id}`, 25 | }); 26 | } 27 | }; 28 | 29 | const handleDarkMode = () => { 30 | setDark(!dark); 31 | if (dark) { 32 | localStorage.setItem("dark", false); 33 | } else { 34 | localStorage.setItem("dark", true); 35 | } 36 | }; 37 | 38 | const handleOpen = () => { 39 | setOpen(!open); 40 | console.log(!open); 41 | }; 42 | 43 | const scrollTop = () => { 44 | gsap.to(window, { 45 | duration: 1, 46 | scrollTo: { y: 0 }, 47 | }); 48 | }; 49 | 50 | useEffect(() => { 51 | const listenToScroll = () => { 52 | let heightToShowFrom = 50; 53 | const winScroll = 54 | document.body.scrollTop || document.documentElement.scrollTop; 55 | if (winScroll > heightToShowFrom) { 56 | // to limit setting state only the first time 57 | setIsVisible(true); 58 | } else { 59 | setIsVisible(false); 60 | } 61 | }; 62 | setIsVisible(false); 63 | window.addEventListener("scroll", listenToScroll); 64 | return () => window.removeEventListener("scroll", listenToScroll); 65 | }, []); 66 | 67 | useEffect(() => { 68 | if (dark) { 69 | document.documentElement.classList.add("dark"); 70 | } else { 71 | document.documentElement.classList.remove("dark"); 72 | } 73 | }, [dark]); 74 | 75 | useEffect(() => { 76 | if (localStorage.getItem("dark") === "true") { 77 | document.documentElement.classList.add("dark"); 78 | setDark(true); 79 | } else { 80 | document.documentElement.classList.remove("dark"); 81 | setDark(false); 82 | } 83 | scrollTop(); 84 | }, []); 85 | 86 | useEffect(() => { 87 | if (listening) return; 88 | if (!menuRef.current) return; 89 | setListening(true); 90 | [`click`, `touchstart`].forEach((type) => { 91 | document.addEventListener(`click`, (evt) => { 92 | const cur = menuRef.current; 93 | const node = evt.target; 94 | if (cur.contains(node)) return; 95 | setOpen(false); 96 | }); 97 | }); 98 | }, [listening]); 99 | 100 | return ( 101 | 210 | ); 211 | } 212 | 213 | export default Navbar; 214 | -------------------------------------------------------------------------------- /src/components/projects.js: -------------------------------------------------------------------------------- 1 | import React from "react"; 2 | import Card from "./card"; 3 | import quranWebAppNext from "../asset/projects/Quran Web App Next js.png"; 4 | import quranWebApp from "../asset/projects/Quran Web App.png"; 5 | import ToDoList from "../asset/projects/To Do List.png"; 6 | import AnimeFinder from "../asset/projects/Anime Finder.png"; 7 | import MovieFinder from "../asset/projects/movie finder.png"; 8 | import MealFinder from "../asset/projects/Mealdb app.png"; 9 | 10 | function Projects() { 11 | return ( 12 |
16 |

17 | My Recent Projects 18 |

19 |
20 | 29 | 37 | 38 | 42 | 43 | 44 | 51 | 52 | 59 | 63 | 67 | 68 | 69 | 70 | 74 | 75 | 76 |
77 | } 78 | > 79 | 88 | 96 | 100 | 104 | 108 | 114 | 115 | 122 | 123 | 130 | 134 | 138 | 139 | 140 | 141 | 145 | 146 | 147 | 148 | } 149 | > 150 | 159 | 167 | 171 | 175 | 179 | 185 | 186 | 194 | 198 | 202 | 206 | 210 | 214 | 218 | 222 | 226 | 230 | 231 | 239 | 243 | 247 | 251 | 255 | 256 | 257 | } 258 | > 259 | 267 | 275 | 279 | 283 | 287 | 293 | 294 | 301 | 302 | 309 | 313 | 317 | 318 | 319 | 320 | 324 | 325 | 326 | 334 | 338 | 342 | 346 | 347 | 348 | } 349 | > 350 | 359 | 367 | 371 | 375 | 379 | 385 | 386 | 393 | 394 | 401 | 405 | 409 | 410 | 411 | 412 | 416 | 417 | 418 | tmdb 422 | 423 | } 424 | > 425 | 434 | 442 | 446 | 450 | 454 | 460 | 461 | 468 | 472 | 476 | 477 | 478 | } 479 | > 480 | 481 |
482 | ); 483 | } 484 | 485 | export default Projects; 486 | -------------------------------------------------------------------------------- /src/components/skill.js: -------------------------------------------------------------------------------- 1 | import React, { useEffect } from "react"; 2 | import { gsap } from "gsap"; 3 | import { ScrollTrigger } from "gsap/ScrollTrigger"; 4 | 5 | function Skill() { 6 | gsap.registerPlugin(ScrollTrigger); 7 | 8 | useEffect(() => { 9 | const scaleIn = gsap.fromTo( 10 | ".skill", 11 | { scale: 0 }, 12 | { duration: 1.5, scale: 1, ease: "elastic", delay: 0.5 } 13 | ); 14 | 15 | ScrollTrigger.create({ 16 | trigger: ".skill", 17 | animation: scaleIn, 18 | }); 19 | }, []); 20 | 21 | return ( 22 |
23 |

24 | My Skills 25 |

26 |
27 |
28 | 35 | 39 | 43 | 47 | 51 | 52 |

HTML

53 |
54 |
55 | 62 | 66 | 70 | 74 | 78 | 79 |

CSS

80 |
81 |
82 | 89 | 90 | 97 | 104 | 105 |

Javascript

106 |
107 |
108 | 115 | 119 | 123 | 127 | 131 | 135 | 136 |

React Js

137 |
138 |
139 | 146 | 150 | 154 | 158 | 159 |

Redux

160 |
161 |
162 | 168 | 169 | 176 | 177 | 178 | 179 | 180 | 181 | 185 | 186 | 187 | 188 |

Tailwind

189 |
190 |
191 | 197 | 201 | 205 | 209 | 213 | 217 | 221 | 225 | 229 | 233 | 234 |

Material Ui

235 |
236 |
237 | 243 | 247 | 251 | 252 |

Bootstrap

253 |
254 |
255 | 261 | 265 | 269 | 273 | 277 | 278 |

Firebase

279 |
280 |
281 | 287 | 291 | 292 |

Git

293 |
294 |
295 |

296 | Coming soon 297 |

298 |
299 |
300 | 306 | 310 | 314 | 315 | 319 | 323 | 324 |

MongoDB

325 |
326 |
327 | 332 | 333 | 334 |

Express JS

335 |
336 |
337 | 343 | 347 | 351 | 352 |

Node JS

353 |
354 |
355 | 361 | 365 | 369 | 373 | 374 | 375 |

React Native

376 |
377 |
378 | 384 | 391 | 395 | 399 | 400 |

Typescript

401 |
402 |
403 |
404 | ); 405 | } 406 | 407 | export default Skill; 408 | -------------------------------------------------------------------------------- /src/index.css: -------------------------------------------------------------------------------- 1 | @import url("https://fonts.googleapis.com/css2?family=Spartan:wght@100;200;300;400;500;600;700;800;900&display=swap"); 2 | 3 | @tailwind base; 4 | @tailwind components; 5 | @tailwind utilities; -------------------------------------------------------------------------------- /src/index.js: -------------------------------------------------------------------------------- 1 | import React from "react"; 2 | import ReactDOM from "react-dom"; 3 | import "./index.css"; 4 | import App from "./App"; 5 | import reportWebVitals from "./reportWebVitals"; 6 | 7 | ReactDOM.render( 8 | 9 | 10 | , 11 | document.getElementById("root") 12 | ); 13 | 14 | // If you want to start measuring performance in your app, pass a function 15 | // to log results (for example: reportWebVitals(console.log)) 16 | // or send to an analytics endpoint. Learn more: https://bit.ly/CRA-vitals 17 | reportWebVitals(); 18 | -------------------------------------------------------------------------------- /src/reportWebVitals.js: -------------------------------------------------------------------------------- 1 | const reportWebVitals = onPerfEntry => { 2 | if (onPerfEntry && onPerfEntry instanceof Function) { 3 | import('web-vitals').then(({ getCLS, getFID, getFCP, getLCP, getTTFB }) => { 4 | getCLS(onPerfEntry); 5 | getFID(onPerfEntry); 6 | getFCP(onPerfEntry); 7 | getLCP(onPerfEntry); 8 | getTTFB(onPerfEntry); 9 | }); 10 | } 11 | }; 12 | 13 | export default reportWebVitals; 14 | -------------------------------------------------------------------------------- /tailwind.config.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | content: ["./src/**/*.{js,jsx,ts,tsx}"], 3 | darkMode: "class", 4 | theme: { 5 | colors: { 6 | main: "#fca311", 7 | black: "#000000", 8 | white: "#FFFFFF", 9 | light: "#e5e5e5", 10 | dark: "#14213d", 11 | transparent: "transparent", 12 | }, 13 | fontFamily: { Spartan: ["Spartan"] }, 14 | }, 15 | plugins: [], 16 | }; 17 | --------------------------------------------------------------------------------