├── .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 |
54 |
55 |
56 |
60 |
68 |
79 |
80 |
81 |
82 | About Me
83 |
84 |
88 |
89 |
90 |
91 |
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 |
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 |
12 |
13 | Live
14 |
15 |
16 |
17 |
18 |
{props.title}
19 |
{props.desc}
20 | {props.tech}
21 |
22 |
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 |
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 |
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 |
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 |
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 |
125 |
126 |
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 |

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 |
44 |
76 |
77 | }
78 | >
79 |
88 |
115 |
147 |
148 | }
149 | >
150 |
159 |
186 |
231 |
256 |
257 | }
258 | >
259 |
267 |
294 |
326 |
347 |
348 | }
349 | >
350 |
359 |
386 |
418 |
422 |
423 | }
424 | >
425 |
434 |
461 |
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 |
52 |
HTML
53 |
54 |
55 |
79 |
CSS
80 |
81 |
82 |
105 |
Javascript
106 |
107 |
108 |
136 |
React Js
137 |
138 |
139 |
159 |
Redux
160 |
161 |
162 |
187 |
188 |
Tailwind
189 |
190 |
191 |
234 |
Material Ui
235 |
236 |
237 |
252 |
Bootstrap
253 |
254 |
255 |
278 |
Firebase
279 |
280 |
281 |
292 |
Git
293 |
294 |
295 |
296 | Coming soon
297 |
298 |
299 |
300 |
324 |
MongoDB
325 |
326 |
327 |
334 |
Express JS
335 |
336 |
337 |
352 |
Node JS
353 |
354 |
355 |
375 |
React Native
376 |
377 |
378 |
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 |
--------------------------------------------------------------------------------