diff --git a/index.html b/index.html
index 438c9fe03..64f194132 100644
--- a/index.html
+++ b/index.html
@@ -4,7 +4,7 @@
-
Lama Dev Portfolio
+ Yuva Portfolio
diff --git a/package-lock.json b/package-lock.json
index 09f389b3c..7f9c9da4b 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -8,18 +8,22 @@
"name": "starter",
"version": "0.0.0",
"dependencies": {
- "react": "^18.2.0",
- "react-dom": "^18.2.0"
+ "@emailjs/browser": "^4.1.0",
+ "framer-motion": "^10.16.4",
+ "react": "18.2.0",
+ "react-dom": "18.2.0",
+ "react-intersection-observer": "^9.8.0",
+ "sass": "^1.68.0"
},
"devDependencies": {
- "@types/react": "^18.2.15",
- "@types/react-dom": "^18.2.7",
- "@vitejs/plugin-react": "^4.0.3",
- "eslint": "^8.45.0",
- "eslint-plugin-react": "^7.32.2",
- "eslint-plugin-react-hooks": "^4.6.0",
- "eslint-plugin-react-refresh": "^0.4.3",
- "vite": "^4.4.5"
+ "@types/react": "18.2.15",
+ "@types/react-dom": "18.2.7",
+ "@vitejs/plugin-react": "4.0.3",
+ "eslint": "8.45.0",
+ "eslint-plugin-react": "7.32.2",
+ "eslint-plugin-react-hooks": "4.6.0",
+ "eslint-plugin-react-refresh": "0.4.3",
+ "vite": "4.4.5"
}
},
"node_modules/@aashutoshrathi/word-wrap": {
@@ -371,6 +375,29 @@
"node": ">=6.9.0"
}
},
+ "node_modules/@emailjs/browser": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/@emailjs/browser/-/browser-4.1.0.tgz",
+ "integrity": "sha512-AWLTmFli2NIKjBXs4Fql1B5z8i3W2r+CKCaxp0DdcFzcIQxrCS2TzmqJtIiPZKh9FpZgqueQTivBx6QOxaz89Q==",
+ "engines": {
+ "node": ">=14.0.0"
+ }
+ },
+ "node_modules/@emotion/is-prop-valid": {
+ "version": "0.8.8",
+ "resolved": "https://registry.npmjs.org/@emotion/is-prop-valid/-/is-prop-valid-0.8.8.tgz",
+ "integrity": "sha512-u5WtneEAr5IDG2Wv65yhunPSMLIpuKsbuOktRojfrEiEvRyC85LgPMZI63cr7NUqT8ZIGdSVg8ZKGxIug4lXcA==",
+ "optional": true,
+ "dependencies": {
+ "@emotion/memoize": "0.7.4"
+ }
+ },
+ "node_modules/@emotion/memoize": {
+ "version": "0.7.4",
+ "resolved": "https://registry.npmjs.org/@emotion/memoize/-/memoize-0.7.4.tgz",
+ "integrity": "sha512-Ja/Vfqe3HpuzRsG1oBtWTHk2PGZ7GR+2Vz5iYGelAw8dx32K0y7PjVuxK6z1nMpZOqAFsRUPCkK1YjJ56qJlgw==",
+ "optional": true
+ },
"node_modules/@esbuild/android-arm": {
"version": "0.18.20",
"resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.18.20.tgz",
@@ -786,9 +813,9 @@
}
},
"node_modules/@eslint/js": {
- "version": "8.51.0",
- "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.51.0.tgz",
- "integrity": "sha512-HxjQ8Qn+4SI3/AFv6sOrDB+g6PpUTDwSJiQqOrnneEk8L71161srI9gjzzZvYVbzHiVg/BvcH95+cK/zfIt4pg==",
+ "version": "8.44.0",
+ "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.44.0.tgz",
+ "integrity": "sha512-Ag+9YM4ocKQx9AarydN0KY2j0ErMHNIocPDrVo8zAE44xLTjEtz81OdR68/cydGtk6m6jDb5Za3r2useMzYmSw==",
"dev": true,
"engines": {
"node": "^12.22.0 || ^14.17.0 || >=16.0.0"
@@ -910,47 +937,6 @@
"node": ">= 8"
}
},
- "node_modules/@types/babel__core": {
- "version": "7.20.2",
- "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.2.tgz",
- "integrity": "sha512-pNpr1T1xLUc2l3xJKuPtsEky3ybxN3m4fJkknfIpTCTfIZCDW57oAg+EfCgIIp2rvCe0Wn++/FfodDS4YXxBwA==",
- "dev": true,
- "dependencies": {
- "@babel/parser": "^7.20.7",
- "@babel/types": "^7.20.7",
- "@types/babel__generator": "*",
- "@types/babel__template": "*",
- "@types/babel__traverse": "*"
- }
- },
- "node_modules/@types/babel__generator": {
- "version": "7.6.5",
- "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.5.tgz",
- "integrity": "sha512-h9yIuWbJKdOPLJTbmSpPzkF67e659PbQDba7ifWm5BJ8xTv+sDmS7rFmywkWOvXedGTivCdeGSIIX8WLcRTz8w==",
- "dev": true,
- "dependencies": {
- "@babel/types": "^7.0.0"
- }
- },
- "node_modules/@types/babel__template": {
- "version": "7.4.2",
- "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.2.tgz",
- "integrity": "sha512-/AVzPICMhMOMYoSx9MoKpGDKdBRsIXMNByh1PXSZoa+v6ZoLa8xxtsT/uLQ/NJm0XVAWl/BvId4MlDeXJaeIZQ==",
- "dev": true,
- "dependencies": {
- "@babel/parser": "^7.1.0",
- "@babel/types": "^7.0.0"
- }
- },
- "node_modules/@types/babel__traverse": {
- "version": "7.20.2",
- "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.20.2.tgz",
- "integrity": "sha512-ojlGK1Hsfce93J0+kn3H5R73elidKUaZonirN33GSmgTUMpzI/MIFfSpF3haANe3G1bEBS9/9/QEqwTzwqFsKw==",
- "dev": true,
- "dependencies": {
- "@babel/types": "^7.20.7"
- }
- },
"node_modules/@types/prop-types": {
"version": "15.7.8",
"resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.8.tgz",
@@ -958,9 +944,9 @@
"dev": true
},
"node_modules/@types/react": {
- "version": "18.2.25",
- "resolved": "https://registry.npmjs.org/@types/react/-/react-18.2.25.tgz",
- "integrity": "sha512-24xqse6+VByVLIr+xWaQ9muX1B4bXJKXBbjszbld/UEDslGLY53+ZucF44HCmLbMPejTzGG9XgR+3m2/Wqu1kw==",
+ "version": "18.2.15",
+ "resolved": "https://registry.npmjs.org/@types/react/-/react-18.2.15.tgz",
+ "integrity": "sha512-oEjE7TQt1fFTFSbf8kkNuc798ahTUzn3Le67/PWjE8MAfYAD/qB7O8hSTcromLFqHCt9bcdOg5GXMokzTjJ5SA==",
"dev": true,
"dependencies": {
"@types/prop-types": "*",
@@ -969,9 +955,9 @@
}
},
"node_modules/@types/react-dom": {
- "version": "18.2.11",
- "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.2.11.tgz",
- "integrity": "sha512-zq6Dy0EiCuF9pWFW6I6k6W2LdpUixLE4P6XjXU1QHLfak3GPACQfLwEuHzY5pOYa4hzj1d0GxX/P141aFjZsyg==",
+ "version": "18.2.7",
+ "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.2.7.tgz",
+ "integrity": "sha512-GRaAEriuT4zp9N4p1i8BDBYmEyfo+xQ3yHjJU4eiK5NDa1RmUZG+unZABUTK4/Ox/M+GaHwb6Ow8rUITrtjszA==",
"dev": true,
"dependencies": {
"@types/react": "*"
@@ -984,15 +970,14 @@
"dev": true
},
"node_modules/@vitejs/plugin-react": {
- "version": "4.1.0",
- "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-4.1.0.tgz",
- "integrity": "sha512-rM0SqazU9iqPUraQ2JlIvReeaxOoRj6n+PzB1C0cBzIbd8qP336nC39/R9yPi3wVcah7E7j/kdU1uCUqMEU4OQ==",
+ "version": "4.0.3",
+ "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-4.0.3.tgz",
+ "integrity": "sha512-pwXDog5nwwvSIzwrvYYmA2Ljcd/ZNlcsSG2Q9CNDBwnsd55UGAyr2doXtB5j+2uymRCnCfExlznzzSFbBRcoCg==",
"dev": true,
"dependencies": {
- "@babel/core": "^7.22.20",
+ "@babel/core": "^7.22.5",
"@babel/plugin-transform-react-jsx-self": "^7.22.5",
"@babel/plugin-transform-react-jsx-source": "^7.22.5",
- "@types/babel__core": "^7.20.2",
"react-refresh": "^0.14.0"
},
"engines": {
@@ -1060,6 +1045,18 @@
"node": ">=4"
}
},
+ "node_modules/anymatch": {
+ "version": "3.1.3",
+ "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz",
+ "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==",
+ "dependencies": {
+ "normalize-path": "^3.0.0",
+ "picomatch": "^2.0.4"
+ },
+ "engines": {
+ "node": ">= 8"
+ }
+ },
"node_modules/argparse": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz",
@@ -1168,15 +1165,6 @@
"url": "https://github.com/sponsors/ljharb"
}
},
- "node_modules/asynciterator.prototype": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/asynciterator.prototype/-/asynciterator.prototype-1.0.0.tgz",
- "integrity": "sha512-wwHYEIS0Q80f5mosx3L/dfG5t5rjEa9Ft51GTaNt862EnpyGHpgz2RkZvLPp1oF5TnAiTohkEKVEu8pQPJI7Vg==",
- "dev": true,
- "dependencies": {
- "has-symbols": "^1.0.3"
- }
- },
"node_modules/available-typed-arrays": {
"version": "1.0.5",
"resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz",
@@ -1195,6 +1183,14 @@
"integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==",
"dev": true
},
+ "node_modules/binary-extensions": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz",
+ "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==",
+ "engines": {
+ "node": ">=8"
+ }
+ },
"node_modules/brace-expansion": {
"version": "1.1.11",
"resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
@@ -1205,6 +1201,17 @@
"concat-map": "0.0.1"
}
},
+ "node_modules/braces": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz",
+ "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==",
+ "dependencies": {
+ "fill-range": "^7.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
"node_modules/browserslist": {
"version": "4.22.1",
"resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.22.1.tgz",
@@ -1293,6 +1300,40 @@
"node": ">=4"
}
},
+ "node_modules/chokidar": {
+ "version": "3.6.0",
+ "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz",
+ "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==",
+ "dependencies": {
+ "anymatch": "~3.1.2",
+ "braces": "~3.0.2",
+ "glob-parent": "~5.1.2",
+ "is-binary-path": "~2.1.0",
+ "is-glob": "~4.0.1",
+ "normalize-path": "~3.0.0",
+ "readdirp": "~3.6.0"
+ },
+ "engines": {
+ "node": ">= 8.10.0"
+ },
+ "funding": {
+ "url": "https://paulmillr.com/funding/"
+ },
+ "optionalDependencies": {
+ "fsevents": "~2.3.2"
+ }
+ },
+ "node_modules/chokidar/node_modules/glob-parent": {
+ "version": "5.1.2",
+ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
+ "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
+ "dependencies": {
+ "is-glob": "^4.0.1"
+ },
+ "engines": {
+ "node": ">= 6"
+ }
+ },
"node_modules/color-convert": {
"version": "1.9.3",
"resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz",
@@ -1465,28 +1506,6 @@
"url": "https://github.com/sponsors/ljharb"
}
},
- "node_modules/es-iterator-helpers": {
- "version": "1.0.15",
- "resolved": "https://registry.npmjs.org/es-iterator-helpers/-/es-iterator-helpers-1.0.15.tgz",
- "integrity": "sha512-GhoY8uYqd6iwUl2kgjTm4CZAf6oo5mHK7BPqx3rKgx893YSsy0LGHV6gfqqQvZt/8xM8xeOnfXBCfqclMKkJ5g==",
- "dev": true,
- "dependencies": {
- "asynciterator.prototype": "^1.0.0",
- "call-bind": "^1.0.2",
- "define-properties": "^1.2.1",
- "es-abstract": "^1.22.1",
- "es-set-tostringtag": "^2.0.1",
- "function-bind": "^1.1.1",
- "get-intrinsic": "^1.2.1",
- "globalthis": "^1.0.3",
- "has-property-descriptors": "^1.0.0",
- "has-proto": "^1.0.1",
- "has-symbols": "^1.0.3",
- "internal-slot": "^1.0.5",
- "iterator.prototype": "^1.1.2",
- "safe-array-concat": "^1.0.1"
- }
- },
"node_modules/es-set-tostringtag": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.1.tgz",
@@ -1583,27 +1602,27 @@
}
},
"node_modules/eslint": {
- "version": "8.51.0",
- "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.51.0.tgz",
- "integrity": "sha512-2WuxRZBrlwnXi+/vFSJyjMqrNjtJqiasMzehF0shoLaW7DzS3/9Yvrmq5JiT66+pNjiX4UBnLDiKHcWAr/OInA==",
+ "version": "8.45.0",
+ "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.45.0.tgz",
+ "integrity": "sha512-pd8KSxiQpdYRfYa9Wufvdoct3ZPQQuVuU5O6scNgMuOMYuxvH0IGaYK0wUFjo4UYYQQCUndlXiMbnxopwvvTiw==",
"dev": true,
"dependencies": {
"@eslint-community/eslint-utils": "^4.2.0",
- "@eslint-community/regexpp": "^4.6.1",
- "@eslint/eslintrc": "^2.1.2",
- "@eslint/js": "8.51.0",
- "@humanwhocodes/config-array": "^0.11.11",
+ "@eslint-community/regexpp": "^4.4.0",
+ "@eslint/eslintrc": "^2.1.0",
+ "@eslint/js": "8.44.0",
+ "@humanwhocodes/config-array": "^0.11.10",
"@humanwhocodes/module-importer": "^1.0.1",
"@nodelib/fs.walk": "^1.2.8",
- "ajv": "^6.12.4",
+ "ajv": "^6.10.0",
"chalk": "^4.0.0",
"cross-spawn": "^7.0.2",
"debug": "^4.3.2",
"doctrine": "^3.0.0",
"escape-string-regexp": "^4.0.0",
- "eslint-scope": "^7.2.2",
- "eslint-visitor-keys": "^3.4.3",
- "espree": "^9.6.1",
+ "eslint-scope": "^7.2.0",
+ "eslint-visitor-keys": "^3.4.1",
+ "espree": "^9.6.0",
"esquery": "^1.4.2",
"esutils": "^2.0.2",
"fast-deep-equal": "^3.1.3",
@@ -1637,16 +1656,15 @@
}
},
"node_modules/eslint-plugin-react": {
- "version": "7.33.2",
- "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.33.2.tgz",
- "integrity": "sha512-73QQMKALArI8/7xGLNI/3LylrEYrlKZSb5C9+q3OtOewTnMQi5cT+aE9E41sLCmli3I9PGGmD1yiZydyo4FEPw==",
+ "version": "7.32.2",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.32.2.tgz",
+ "integrity": "sha512-t2fBMa+XzonrrNkyVirzKlvn5RXzzPwRHtMvLAtVZrt8oxgnTQaYbU6SXTOO1mwQgp1y5+toMSKInnzGr0Knqg==",
"dev": true,
"dependencies": {
"array-includes": "^3.1.6",
"array.prototype.flatmap": "^1.3.1",
"array.prototype.tosorted": "^1.1.1",
"doctrine": "^2.1.0",
- "es-iterator-helpers": "^1.0.12",
"estraverse": "^5.3.0",
"jsx-ast-utils": "^2.4.1 || ^3.0.0",
"minimatch": "^3.1.2",
@@ -1656,7 +1674,7 @@
"object.values": "^1.1.6",
"prop-types": "^15.8.1",
"resolve": "^2.0.0-next.4",
- "semver": "^6.3.1",
+ "semver": "^6.3.0",
"string.prototype.matchall": "^4.0.8"
},
"engines": {
@@ -1922,6 +1940,17 @@
"node": "^10.12.0 || >=12.0.0"
}
},
+ "node_modules/fill-range": {
+ "version": "7.0.1",
+ "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz",
+ "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==",
+ "dependencies": {
+ "to-regex-range": "^5.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
"node_modules/find-up": {
"version": "5.0.0",
"resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz",
@@ -1967,6 +1996,29 @@
"is-callable": "^1.1.3"
}
},
+ "node_modules/framer-motion": {
+ "version": "10.16.4",
+ "resolved": "https://registry.npmjs.org/framer-motion/-/framer-motion-10.16.4.tgz",
+ "integrity": "sha512-p9V9nGomS3m6/CALXqv6nFGMuFOxbWsmaOrdmhyQimMIlLl3LC7h7l86wge/Js/8cRu5ktutS/zlzgR7eBOtFA==",
+ "dependencies": {
+ "tslib": "^2.4.0"
+ },
+ "optionalDependencies": {
+ "@emotion/is-prop-valid": "^0.8.2"
+ },
+ "peerDependencies": {
+ "react": "^18.0.0",
+ "react-dom": "^18.0.0"
+ },
+ "peerDependenciesMeta": {
+ "react": {
+ "optional": true
+ },
+ "react-dom": {
+ "optional": true
+ }
+ }
+ },
"node_modules/fs.realpath": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
@@ -1977,7 +2029,6 @@
"version": "2.3.3",
"resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz",
"integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==",
- "dev": true,
"hasInstallScript": true,
"optional": true,
"os": [
@@ -2221,6 +2272,11 @@
"node": ">= 4"
}
},
+ "node_modules/immutable": {
+ "version": "4.3.5",
+ "resolved": "https://registry.npmjs.org/immutable/-/immutable-4.3.5.tgz",
+ "integrity": "sha512-8eabxkth9gZatlwl5TBuJnCsoTADlL6ftEr7A4qgdaTsPyreilDSnUk57SO+jfKcNtxPa22U5KK6DSeAYhpBJw=="
+ },
"node_modules/import-fresh": {
"version": "3.3.0",
"resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz",
@@ -2290,21 +2346,6 @@
"url": "https://github.com/sponsors/ljharb"
}
},
- "node_modules/is-async-function": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/is-async-function/-/is-async-function-2.0.0.tgz",
- "integrity": "sha512-Y1JXKrfykRJGdlDwdKlLpLyMIiWqWvuSd17TvZk68PLAOGOoF4Xyav1z0Xhoi+gCYjZVeC5SI+hYFOfvXmGRCA==",
- "dev": true,
- "dependencies": {
- "has-tostringtag": "^1.0.0"
- },
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
"node_modules/is-bigint": {
"version": "1.0.4",
"resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz",
@@ -2317,6 +2358,17 @@
"url": "https://github.com/sponsors/ljharb"
}
},
+ "node_modules/is-binary-path": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz",
+ "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==",
+ "dependencies": {
+ "binary-extensions": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
"node_modules/is-boolean-object": {
"version": "1.1.2",
"resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz",
@@ -2376,43 +2428,14 @@
"version": "2.1.1",
"resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
"integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==",
- "dev": true,
"engines": {
"node": ">=0.10.0"
}
},
- "node_modules/is-finalizationregistry": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/is-finalizationregistry/-/is-finalizationregistry-1.0.2.tgz",
- "integrity": "sha512-0by5vtUJs8iFQb5TYUHHPudOR+qXYIMKtiUzvLIZITZUjknFmziyBJuLhVRc+Ds0dREFlskDNJKYIdIzu/9pfw==",
- "dev": true,
- "dependencies": {
- "call-bind": "^1.0.2"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/is-generator-function": {
- "version": "1.0.10",
- "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.0.10.tgz",
- "integrity": "sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==",
- "dev": true,
- "dependencies": {
- "has-tostringtag": "^1.0.0"
- },
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
"node_modules/is-glob": {
"version": "4.0.3",
"resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz",
"integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==",
- "dev": true,
"dependencies": {
"is-extglob": "^2.1.1"
},
@@ -2420,15 +2443,6 @@
"node": ">=0.10.0"
}
},
- "node_modules/is-map": {
- "version": "2.0.2",
- "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.2.tgz",
- "integrity": "sha512-cOZFQQozTha1f4MxLFzlgKYPTyj26picdZTx82hbc/Xf4K/tZOOXSCkMvU4pKioRXGDLJRn0GM7Upe7kR721yg==",
- "dev": true,
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
"node_modules/is-negative-zero": {
"version": "2.0.2",
"resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.2.tgz",
@@ -2441,6 +2455,14 @@
"url": "https://github.com/sponsors/ljharb"
}
},
+ "node_modules/is-number": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz",
+ "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==",
+ "engines": {
+ "node": ">=0.12.0"
+ }
+ },
"node_modules/is-number-object": {
"version": "1.0.7",
"resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz",
@@ -2481,15 +2503,6 @@
"url": "https://github.com/sponsors/ljharb"
}
},
- "node_modules/is-set": {
- "version": "2.0.2",
- "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.2.tgz",
- "integrity": "sha512-+2cnTEZeY5z/iXGbLhPrOAaK/Mau5k5eXq9j14CpRTftq0pAJu2MwVRSZhyZWBzx3o6X795Lz6Bpb6R0GKf37g==",
- "dev": true,
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
"node_modules/is-shared-array-buffer": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz",
@@ -2547,15 +2560,6 @@
"url": "https://github.com/sponsors/ljharb"
}
},
- "node_modules/is-weakmap": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.1.tgz",
- "integrity": "sha512-NSBR4kH5oVj1Uwvv970ruUkCV7O1mzgVFO4/rev2cLRda9Tm9HrL70ZPut4rOHgY0FNrUu9BCbXA2sdQ+x0chA==",
- "dev": true,
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
"node_modules/is-weakref": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz",
@@ -2568,19 +2572,6 @@
"url": "https://github.com/sponsors/ljharb"
}
},
- "node_modules/is-weakset": {
- "version": "2.0.2",
- "resolved": "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.2.tgz",
- "integrity": "sha512-t2yVvttHkQktwnNNmBQ98AhENLdPUTDTE21uPqAQ0ARwQfGeQKRVS0NNurH7bTf7RrvcVn1OOge45CnBeHCSmg==",
- "dev": true,
- "dependencies": {
- "call-bind": "^1.0.2",
- "get-intrinsic": "^1.1.1"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
"node_modules/isarray": {
"version": "2.0.5",
"resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz",
@@ -2593,19 +2584,6 @@
"integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==",
"dev": true
},
- "node_modules/iterator.prototype": {
- "version": "1.1.2",
- "resolved": "https://registry.npmjs.org/iterator.prototype/-/iterator.prototype-1.1.2.tgz",
- "integrity": "sha512-DR33HMMr8EzwuRL8Y9D3u2BMj8+RqSE850jfGu59kS7tbmPLzGkZmVSfyCFSDxuZiEY6Rzt3T2NA/qU+NwVj1w==",
- "dev": true,
- "dependencies": {
- "define-properties": "^1.2.1",
- "get-intrinsic": "^1.2.1",
- "has-symbols": "^1.0.3",
- "reflect.getprototypeof": "^1.0.4",
- "set-function-name": "^2.0.1"
- }
- },
"node_modules/js-tokens": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz",
@@ -2791,6 +2769,14 @@
"integrity": "sha512-uYr7J37ae/ORWdZeQ1xxMJe3NtdmqMC/JZK+geofDrkLUApKRHPd18/TxtBOJ4A0/+uUIliorNrfYV6s1b02eQ==",
"dev": true
},
+ "node_modules/normalize-path": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz",
+ "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
"node_modules/object-assign": {
"version": "4.1.1",
"resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
@@ -3004,6 +2990,17 @@
"integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==",
"dev": true
},
+ "node_modules/picomatch": {
+ "version": "2.3.1",
+ "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz",
+ "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==",
+ "engines": {
+ "node": ">=8.6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/jonschlinkert"
+ }
+ },
"node_modules/postcss": {
"version": "8.4.31",
"resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.31.tgz",
@@ -3104,6 +3101,20 @@
"react": "^18.2.0"
}
},
+ "node_modules/react-intersection-observer": {
+ "version": "9.8.0",
+ "resolved": "https://registry.npmjs.org/react-intersection-observer/-/react-intersection-observer-9.8.0.tgz",
+ "integrity": "sha512-wXHvMQUsTagh3X0Z6jDtGkIXc3VVCd2tjDRYR9kII3GKrZr0XF0xtpfdamo2n8BSF+zzfeeBVOTjxZWpBp9X0g==",
+ "peerDependencies": {
+ "react": "^15.0.0 || ^16.0.0 || ^17.0.0 || ^18.0.0",
+ "react-dom": "^15.0.0 || ^16.0.0 || ^17.0.0 || ^18.0.0"
+ },
+ "peerDependenciesMeta": {
+ "react-dom": {
+ "optional": true
+ }
+ }
+ },
"node_modules/react-is": {
"version": "16.13.1",
"resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz",
@@ -3119,24 +3130,15 @@
"node": ">=0.10.0"
}
},
- "node_modules/reflect.getprototypeof": {
- "version": "1.0.4",
- "resolved": "https://registry.npmjs.org/reflect.getprototypeof/-/reflect.getprototypeof-1.0.4.tgz",
- "integrity": "sha512-ECkTw8TmJwW60lOTR+ZkODISW6RQ8+2CL3COqtiJKLd6MmB45hN51HprHFziKLGkAuTGQhBb91V8cy+KHlaCjw==",
- "dev": true,
+ "node_modules/readdirp": {
+ "version": "3.6.0",
+ "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz",
+ "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==",
"dependencies": {
- "call-bind": "^1.0.2",
- "define-properties": "^1.2.0",
- "es-abstract": "^1.22.1",
- "get-intrinsic": "^1.2.1",
- "globalthis": "^1.0.3",
- "which-builtin-type": "^1.1.3"
+ "picomatch": "^2.2.1"
},
"engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
+ "node": ">=8.10.0"
}
},
"node_modules/regexp.prototype.flags": {
@@ -3278,6 +3280,22 @@
"url": "https://github.com/sponsors/ljharb"
}
},
+ "node_modules/sass": {
+ "version": "1.68.0",
+ "resolved": "https://registry.npmjs.org/sass/-/sass-1.68.0.tgz",
+ "integrity": "sha512-Lmj9lM/fef0nQswm1J2HJcEsBUba4wgNx2fea6yJHODREoMFnwRpZydBnX/RjyXw2REIwdkbqE4hrTo4qfDBUA==",
+ "dependencies": {
+ "chokidar": ">=3.0.0 <4.0.0",
+ "immutable": "^4.0.0",
+ "source-map-js": ">=0.6.2 <2.0.0"
+ },
+ "bin": {
+ "sass": "sass.js"
+ },
+ "engines": {
+ "node": ">=14.0.0"
+ }
+ },
"node_modules/scheduler": {
"version": "0.23.0",
"resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.0.tgz",
@@ -3348,7 +3366,6 @@
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz",
"integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==",
- "dev": true,
"engines": {
"node": ">=0.10.0"
}
@@ -3481,6 +3498,22 @@
"node": ">=4"
}
},
+ "node_modules/to-regex-range": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz",
+ "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==",
+ "dependencies": {
+ "is-number": "^7.0.0"
+ },
+ "engines": {
+ "node": ">=8.0"
+ }
+ },
+ "node_modules/tslib": {
+ "version": "2.6.2",
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz",
+ "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q=="
+ },
"node_modules/type-check": {
"version": "0.4.0",
"resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz",
@@ -3625,14 +3658,14 @@
}
},
"node_modules/vite": {
- "version": "4.4.11",
- "resolved": "https://registry.npmjs.org/vite/-/vite-4.4.11.tgz",
- "integrity": "sha512-ksNZJlkcU9b0lBwAGZGGaZHCMqHsc8OpgtoYhsQ4/I2v5cnpmmmqe5pM4nv/4Hn6G/2GhTdj0DhZh2e+Er1q5A==",
+ "version": "4.4.5",
+ "resolved": "https://registry.npmjs.org/vite/-/vite-4.4.5.tgz",
+ "integrity": "sha512-4m5kEtAWHYr0O1Fu7rZp64CfO1PsRGZlD3TAB32UmQlpd7qg15VF7ROqGN5CyqN7HFuwr7ICNM2+fDWRqFEKaA==",
"dev": true,
"dependencies": {
"esbuild": "^0.18.10",
- "postcss": "^8.4.27",
- "rollup": "^3.27.1"
+ "postcss": "^8.4.26",
+ "rollup": "^3.25.2"
},
"bin": {
"vite": "bin/vite.js"
@@ -3710,47 +3743,6 @@
"url": "https://github.com/sponsors/ljharb"
}
},
- "node_modules/which-builtin-type": {
- "version": "1.1.3",
- "resolved": "https://registry.npmjs.org/which-builtin-type/-/which-builtin-type-1.1.3.tgz",
- "integrity": "sha512-YmjsSMDBYsM1CaFiayOVT06+KJeXf0o5M/CAd4o1lTadFAtacTUM49zoYxr/oroopFDfhvN6iEcBxUyc3gvKmw==",
- "dev": true,
- "dependencies": {
- "function.prototype.name": "^1.1.5",
- "has-tostringtag": "^1.0.0",
- "is-async-function": "^2.0.0",
- "is-date-object": "^1.0.5",
- "is-finalizationregistry": "^1.0.2",
- "is-generator-function": "^1.0.10",
- "is-regex": "^1.1.4",
- "is-weakref": "^1.0.2",
- "isarray": "^2.0.5",
- "which-boxed-primitive": "^1.0.2",
- "which-collection": "^1.0.1",
- "which-typed-array": "^1.1.9"
- },
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/which-collection": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/which-collection/-/which-collection-1.0.1.tgz",
- "integrity": "sha512-W8xeTUwaln8i3K/cY1nGXzdnVZlidBcagyNFtBdD5kxnb4TvGKR7FfSIS3mYpwWS1QUCutfKz8IY8RjftB0+1A==",
- "dev": true,
- "dependencies": {
- "is-map": "^2.0.1",
- "is-set": "^2.0.1",
- "is-weakmap": "^2.0.1",
- "is-weakset": "^2.0.1"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
"node_modules/which-typed-array": {
"version": "1.1.11",
"resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.11.tgz",
diff --git a/package.json b/package.json
index 2e6793c46..711380ff0 100644
--- a/package.json
+++ b/package.json
@@ -10,8 +10,12 @@
"preview": "vite preview"
},
"dependencies": {
+ "@emailjs/browser": "^4.1.0",
+ "framer-motion": "^10.16.4",
"react": "18.2.0",
- "react-dom": "18.2.0"
+ "react-dom": "18.2.0",
+ "react-intersection-observer": "^9.8.0",
+ "sass": "^1.68.0"
},
"devDependencies": {
"@types/react": "18.2.15",
diff --git a/public/about/ai.png b/public/about/ai.png
new file mode 100644
index 000000000..022ce7b63
Binary files /dev/null and b/public/about/ai.png differ
diff --git a/public/about/badminton.png b/public/about/badminton.png
new file mode 100644
index 000000000..56de6fad1
Binary files /dev/null and b/public/about/badminton.png differ
diff --git a/public/about/cloud.png b/public/about/cloud.png
new file mode 100644
index 000000000..b636c728c
Binary files /dev/null and b/public/about/cloud.png differ
diff --git a/public/about/code.png b/public/about/code.png
new file mode 100644
index 000000000..b835977a8
Binary files /dev/null and b/public/about/code.png differ
diff --git a/public/about/crafts.png b/public/about/crafts.png
new file mode 100644
index 000000000..31ef2a217
Binary files /dev/null and b/public/about/crafts.png differ
diff --git a/public/about/paw.png b/public/about/paw.png
new file mode 100644
index 000000000..acfda570b
Binary files /dev/null and b/public/about/paw.png differ
diff --git a/public/about/ui.png b/public/about/ui.png
new file mode 100644
index 000000000..c5b6fd4e7
Binary files /dev/null and b/public/about/ui.png differ
diff --git a/public/dribbble.png b/public/dribbble.png
deleted file mode 100644
index 67be92f93..000000000
Binary files a/public/dribbble.png and /dev/null differ
diff --git a/public/email.png b/public/email.png
new file mode 100644
index 000000000..00fb0e773
Binary files /dev/null and b/public/email.png differ
diff --git a/public/facebook.png b/public/facebook.png
deleted file mode 100644
index c1b511572..000000000
Binary files a/public/facebook.png and /dev/null differ
diff --git a/public/git.png b/public/git.png
new file mode 100644
index 000000000..b7cc5f8e8
Binary files /dev/null and b/public/git.png differ
diff --git a/public/hero.png b/public/hero.png
deleted file mode 100644
index e806437f3..000000000
Binary files a/public/hero.png and /dev/null differ
diff --git a/public/history/bme.png b/public/history/bme.png
new file mode 100644
index 000000000..16ff524e7
Binary files /dev/null and b/public/history/bme.png differ
diff --git a/public/history/sparks.png b/public/history/sparks.png
new file mode 100644
index 000000000..e118fa304
Binary files /dev/null and b/public/history/sparks.png differ
diff --git a/public/history/tcs.png b/public/history/tcs.png
new file mode 100644
index 000000000..5e8e658fb
Binary files /dev/null and b/public/history/tcs.png differ
diff --git a/public/history/vt.png b/public/history/vt.png
new file mode 100644
index 000000000..d8994d17b
Binary files /dev/null and b/public/history/vt.png differ
diff --git a/public/instagram.png b/public/instagram.png
deleted file mode 100644
index 21733aba7..000000000
Binary files a/public/instagram.png and /dev/null differ
diff --git a/public/linkedin.png b/public/linkedin.png
new file mode 100644
index 000000000..a36c1c26e
Binary files /dev/null and b/public/linkedin.png differ
diff --git a/public/people.webp b/public/people.webp
deleted file mode 100644
index 76c7eb563..000000000
Binary files a/public/people.webp and /dev/null differ
diff --git a/public/projects/bookjam.png b/public/projects/bookjam.png
new file mode 100644
index 000000000..e98e92abe
Binary files /dev/null and b/public/projects/bookjam.png differ
diff --git a/public/projects/dengue.png b/public/projects/dengue.png
new file mode 100644
index 000000000..ecf5e6c77
Binary files /dev/null and b/public/projects/dengue.png differ
diff --git a/public/projects/diagnosym.png b/public/projects/diagnosym.png
new file mode 100644
index 000000000..9d2f65e4a
Binary files /dev/null and b/public/projects/diagnosym.png differ
diff --git a/public/projects/doucecravings.png b/public/projects/doucecravings.png
new file mode 100644
index 000000000..cc677c7ed
Binary files /dev/null and b/public/projects/doucecravings.png differ
diff --git a/public/projects/ducky.png b/public/projects/ducky.png
new file mode 100644
index 000000000..1dc61941d
Binary files /dev/null and b/public/projects/ducky.png differ
diff --git a/public/projects/tracking.png b/public/projects/tracking.png
new file mode 100644
index 000000000..23acfa897
Binary files /dev/null and b/public/projects/tracking.png differ
diff --git a/public/resume.png b/public/resume.png
new file mode 100644
index 000000000..fd737a0b2
Binary files /dev/null and b/public/resume.png differ
diff --git a/public/skills/I94.pdf b/public/skills/I94.pdf
new file mode 100644
index 000000000..2341de8c6
Binary files /dev/null and b/public/skills/I94.pdf differ
diff --git a/public/skills/OPT Certificate.pdf b/public/skills/OPT Certificate.pdf
new file mode 100644
index 000000000..8bb57f604
Binary files /dev/null and b/public/skills/OPT Certificate.pdf differ
diff --git a/public/skills/aws.png b/public/skills/aws.png
new file mode 100644
index 000000000..ef6f81759
Binary files /dev/null and b/public/skills/aws.png differ
diff --git a/public/skills/azure.png b/public/skills/azure.png
new file mode 100644
index 000000000..831747c62
Binary files /dev/null and b/public/skills/azure.png differ
diff --git a/public/skills/azuread.png b/public/skills/azuread.png
new file mode 100644
index 000000000..55836c0b8
Binary files /dev/null and b/public/skills/azuread.png differ
diff --git a/public/skills/css.png b/public/skills/css.png
new file mode 100644
index 000000000..3b6731746
Binary files /dev/null and b/public/skills/css.png differ
diff --git a/public/skills/django.png b/public/skills/django.png
new file mode 100644
index 000000000..81e4948f4
Binary files /dev/null and b/public/skills/django.png differ
diff --git a/public/skills/figma.png b/public/skills/figma.png
new file mode 100644
index 000000000..88a9452d6
Binary files /dev/null and b/public/skills/figma.png differ
diff --git a/public/skills/graphql.png b/public/skills/graphql.png
new file mode 100644
index 000000000..968a575eb
Binary files /dev/null and b/public/skills/graphql.png differ
diff --git a/public/skills/health-logo.png b/public/skills/health-logo.png
new file mode 100644
index 000000000..e96575f47
Binary files /dev/null and b/public/skills/health-logo.png differ
diff --git a/public/skills/html.png b/public/skills/html.png
new file mode 100644
index 000000000..31bc5bd15
Binary files /dev/null and b/public/skills/html.png differ
diff --git a/public/skills/js.png b/public/skills/js.png
new file mode 100644
index 000000000..60397f838
Binary files /dev/null and b/public/skills/js.png differ
diff --git a/public/skills/mongodb.png b/public/skills/mongodb.png
new file mode 100644
index 000000000..b76e1650f
Binary files /dev/null and b/public/skills/mongodb.png differ
diff --git a/public/skills/node.png b/public/skills/node.png
new file mode 100644
index 000000000..bde0b54cb
Binary files /dev/null and b/public/skills/node.png differ
diff --git a/public/skills/postgresql.png b/public/skills/postgresql.png
new file mode 100644
index 000000000..01095636e
Binary files /dev/null and b/public/skills/postgresql.png differ
diff --git a/public/skills/python.png b/public/skills/python.png
new file mode 100644
index 000000000..e787314ba
Binary files /dev/null and b/public/skills/python.png differ
diff --git a/public/skills/react.png b/public/skills/react.png
new file mode 100644
index 000000000..55240c625
Binary files /dev/null and b/public/skills/react.png differ
diff --git a/public/skills/sass.png b/public/skills/sass.png
new file mode 100644
index 000000000..ca63ca2fc
Binary files /dev/null and b/public/skills/sass.png differ
diff --git a/public/skills/terraform.png b/public/skills/terraform.png
new file mode 100644
index 000000000..ad83445a6
Binary files /dev/null and b/public/skills/terraform.png differ
diff --git a/public/youtube.png b/public/youtube.png
deleted file mode 100644
index e149b8c4f..000000000
Binary files a/public/youtube.png and /dev/null differ
diff --git a/public/yuva.png b/public/yuva.png
new file mode 100644
index 000000000..bb1827db3
Binary files /dev/null and b/public/yuva.png differ
diff --git a/src/App.jsx b/src/App.jsx
index cb7b6da73..0cf4b9d7b 100644
--- a/src/App.jsx
+++ b/src/App.jsx
@@ -1,5 +1,21 @@
+import "./app.scss";
+import Hero from "./components/hero/Hero";
+import Navbar from "./components/navbar/Navbar";
+import Parallax from "./components/parallax/Parallax";
+import Portfolio from "./components/portfolio/Portfolio";
+import Contact from "./components/contact/Contact";
+import Experience from "./components/experience/Experience";
const App = () => {
- return Hello World
;
+ return ;
};
export default App;
diff --git a/src/app.scss b/src/app.scss
new file mode 100644
index 000000000..7b91a6d74
--- /dev/null
+++ b/src/app.scss
@@ -0,0 +1,37 @@
+*{
+ margin:0;
+ padding:0;
+ box-sizing: border-box;
+ font-family: "DM Sans", sans-serif;
+}
+body{
+ background-color: #0c0c1d;
+ color: lightgray;
+}
+html{
+ scroll-snap-type: y mandatory;
+ scroll-behavior: smooth;
+}
+section{
+ height: 100vh;
+ scroll-snap-align: center;
+}
+a{
+ text-decoration: none;
+ color: inherit;
+}
+@mixin mobile{
+ @media (max-width: 738px){
+ @content;
+ }
+}
+@mixin tablet{
+ @media (max-width: 1024px){
+ @content;
+ }
+}
+@mixin desktop{
+ @media (max-width: 1366px){
+ @content;
+ }
+}
\ No newline at end of file
diff --git a/src/components/contact/Contact.jsx b/src/components/contact/Contact.jsx
new file mode 100644
index 000000000..ef0af3bcd
--- /dev/null
+++ b/src/components/contact/Contact.jsx
@@ -0,0 +1,104 @@
+import "./contact.scss"
+import { motion, useInView } from "framer-motion"
+import { useRef, useState } from 'react'
+import emailjs from '@emailjs/browser';
+
+const variants = {
+ initial: {
+ y: 500,
+ opacity: 0
+ },
+ animate: {
+ y: 0,
+ opacity: 1,
+ transition: {
+ duration: 0.2,
+ staggerChildren: 0.1,
+ },
+ },
+};
+
+
+const Contact = () => {
+ const ref = useRef()
+ const formRef = useRef(null);
+ const [error, setError] = useState(false)
+ const [success, setSuccess] = useState(false)
+ const isInView = useInView(ref, { margin: "-100px" });
+
+ const sendEmail = (e) => {
+ e.preventDefault();
+ setError(false);
+ setSuccess(false);
+
+ emailjs
+ .sendForm('service_otgddgp', 'template_2i6umiq', formRef.current, {
+ publicKey: 'yuS2ByID6qRvAXlcK',
+ })
+ .then(
+ (result) => {
+ setSuccess(true);
+ formRef.current.reset();
+ },
+ (error) => {
+ setError(true);
+ },
+ );
+ };
+ return (
+
+
+ Contact Me
+
+ Mail
+ vemulapalliyuvasri@gmail.com
+
+
+ Address
+ 1215 Progress ST NW Apt B Blacksburg VA US
+
+
+ Phone
+ +1(301)-550-1020
+
+
+
+
+ );
+};
+
+export default Contact
diff --git a/src/components/contact/contact.scss b/src/components/contact/contact.scss
new file mode 100644
index 000000000..213bf3d3d
--- /dev/null
+++ b/src/components/contact/contact.scss
@@ -0,0 +1,104 @@
+@import "../../app.scss";
+
+.contact {
+ height: 100%;
+ min-width: 1366;
+ margin-left: 30px;
+ margin-right: 30px;
+ display: flex;
+ align-items: center;
+ gap: 30px;
+
+ @include mobile {
+ width: 100%;
+ padding: 10px;
+ flex-direction: column;
+
+ }
+
+ .textContainer {
+ flex: 1;
+ display: flex;
+ flex-direction: column;
+ gap: 40px;
+
+ @include mobile {
+ gap: 20px;
+ text-align: center;
+ align-items: center;
+ margin-top: 70px;
+
+ }
+
+ h1 {
+ font-size: 80px;
+ line-height: 88px;
+
+ @include mobile {
+ font-size: 36px;
+ }
+ }
+
+ span {
+ font-weight: 300;
+ }
+ }
+
+ .formContainer {
+ flex: 1;
+ position: relative;
+
+ @include mobile {
+ padding: 50px;
+ width: 100%;
+ }
+
+ .phoneSvg {
+ stroke: orange;
+ position: absolute;
+ margin: auto;
+ z-index: -1;
+
+ @include mobile {
+ max-width: 80vw;
+ top: 20%;
+ left:30%;
+ bottom:10%;
+ transform: translate(-50%, -50%);
+ }
+ }
+
+ form {
+ display: flex;
+ flex-direction: column;
+ gap: 20px;
+ }
+
+
+ input,
+ textarea {
+ padding: 15px;
+ background-color: transparent;
+ border: 1px solid white;
+ color: white;
+ border-radius: 5px;
+
+ @include mobile {
+ padding: 10px;
+ }
+
+ }
+
+ button {
+ padding: 18px;
+ border: none;
+ background-color: orange;
+ cursor: pointer;
+ font-weight: 500;
+
+ @include mobile {
+ padding: 10px;
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/src/components/experience/Experience.jsx b/src/components/experience/Experience.jsx
new file mode 100644
index 000000000..3e51abe94
--- /dev/null
+++ b/src/components/experience/Experience.jsx
@@ -0,0 +1,56 @@
+import "./experience.scss"
+import skills from "../../data/skills.json"
+import history from "../../data/history.json"
+import { getImageUrl } from "../../utils";
+import { motion } from 'framer-motion';
+
+const Experience = () => {
+ return (
+
+
+
Experience and Skills
+
+
+
+ {skills.map((skill, id) => (
+
+
+
+
+
{skill.title}
+
+ ))}
+
+
+ {history.map((item, index) => (
+
+
+
+
+
+
{item.organisation}
+
+
+
+
+
{item.role}, {item.startDate} - {item.endDate}
+
+ {item.experiences.map((experience, expIndex) => (
+ - {experience}
+ ))}
+
+
+
+
+
+ ))}
+
+
+
+ );
+};
+
+export default Experience;
diff --git a/src/components/experience/experience.scss b/src/components/experience/experience.scss
new file mode 100644
index 000000000..23289b163
--- /dev/null
+++ b/src/components/experience/experience.scss
@@ -0,0 +1,206 @@
+@import "../../app.scss";
+
+.experience {
+ width: 100%;
+ height: 100%;
+ position: relative;
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+ gap: 20px;
+
+ .experience-title {
+ padding-top: 50px;
+ text-align: center;
+ font-size: 36px;
+
+ @include mobile {
+ font-size: 16px;
+ }
+ }
+
+ .content {
+ display: flex;
+ flex-direction: row;
+ justify-content: space-evenly;
+ gap: 20px;
+
+ @include mobile {
+ flex-direction: column;
+ align-items: center;
+ }
+
+ @include tablet {
+ margin-top: 10%;
+ flex-direction: column;
+ align-items: center;
+ }
+
+ .skills {
+ width: 40%;
+ display: flex;
+ flex-wrap: wrap;
+ gap: 11px;
+
+ @include mobile {
+ width: 80%;
+ }
+
+ @include tablet {
+ width: 80%;
+ margin-bottom: 10%;
+ }
+
+ .skill {
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+ gap: 11px;
+
+ p {
+ font-size: 25px;
+ font-weight: 500;
+
+ @include mobile {
+ font-size: 12px;
+ }
+ }
+
+ .skillImageContainer {
+ background-color: #19376d;
+ border-radius: 100%;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ width: 90px;
+ height: 90px;
+
+ img {
+ width: 50px;
+ height: 50px;
+
+ @include mobile {
+ width: 30px;
+ height: 30px;
+ }
+ }
+
+ @include mobile {
+ width: 60px;
+ height: 60px;
+ }
+ }
+ }
+ }
+
+ .history {
+ width: 50%;
+
+ @include mobile {
+ width: 80%;
+ }
+
+ .company {
+ display: flex;
+ align-items: center;
+ gap: 10px;
+ margin-bottom: 20px;
+
+ @include mobile {
+ justify-content: center;
+ }
+
+ .company-logo-container {
+ background-color: #fff;
+ border-radius: 100%;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ width: 60px;
+ height: 60px;
+
+ @include mobile {
+ width: 50px;
+ height: 50px;
+ }
+
+ img {
+ width: 50px;
+ height: 50px;
+
+ @include mobile {
+ width: 40px;
+ height: 40px;
+ }
+ }
+ }
+
+ .company-name {
+ font-size: 24px;
+ font-weight: bold;
+
+ @include mobile {
+ font-size: 16px;
+ }
+ }
+ }
+
+ .timeline {
+ position: relative;
+ margin-left: 20px;
+ padding-left: 50px;
+
+ &:before {
+ content: '';
+ position: absolute;
+ left: 20px;
+ top: 0;
+ bottom: 0;
+ width: 2px;
+ background-color: #19376d;
+ }
+
+ .timelineItem {
+ position: relative;
+ margin-bottom: 40px;
+
+ @include mobile {
+ margin-bottom: 25px;
+ }
+
+ .timelineContent {
+ h3 {
+ margin: 0;
+ font-size: 20px;
+ font-weight: bold;
+
+ @include mobile {
+ font-size: 14px;
+ }
+
+ .timePeriod {
+ font-size: small;
+ background: #fff;
+ color: rebeccapurple;
+ padding: 5px 10px;
+ border-radius: 10px;
+ box-shadow: 0 2px 5px rgba(0, 0, 0, 0.2);
+ margin-left: 10px;
+
+ @include mobile {
+ display: none;
+ }
+ }
+ }
+
+ ul {
+ list-style: disc;
+ margin: 0;
+ padding-left: 20px;
+ }
+ }
+ }
+ }
+ }
+ }
+}
diff --git a/src/components/hero/Hero.jsx b/src/components/hero/Hero.jsx
new file mode 100644
index 000000000..dbb717db2
--- /dev/null
+++ b/src/components/hero/Hero.jsx
@@ -0,0 +1,63 @@
+import "./hero.scss"
+import {motion} from "framer-motion"
+const textVariants={
+ initial:{
+ x:-500,
+ opacity:0,
+ },
+ animate:{
+ x:0,
+ opacity:1,
+ transition:{
+ duration:1,
+ staggerChildren:0.1,
+ },
+ },
+ scrollButton:{
+ opacity:0,
+ y:10,
+ transition:{
+ duration:2,
+ repeat: Infinity,
+ }
+
+ },
+};
+
+const sliderVariants={
+ initial:{
+ x:0,
+ },
+ animate:{
+ x:"-220%",
+ transition:{
+ repeat: Infinity,
+ repeatType:"mirror",
+ duration:20,
+ },
+ },
+};
+
+const Hero = () => {
+ return (
+
+
+
+ YUVA SRI VEMULAPALLI
+ A Developer with Visual Eye
+
+
+
+
+
+
+ Creative Unique Determined Energetic
+
+
+
+
+
+ )
+}
+
+export default Hero
diff --git a/src/components/hero/hero.scss b/src/components/hero/hero.scss
new file mode 100644
index 000000000..4864a6491
--- /dev/null
+++ b/src/components/hero/hero.scss
@@ -0,0 +1,119 @@
+@import "../../app.scss";
+.hero {
+ height: calc(100vh - 100px);
+ background: linear-gradient(100deg, #0c0c1d, #111132);
+ overflow: hidden;
+ position: relative;
+
+ .wrapper {
+ max-width: 1366px;
+ height: 100%;
+ margin: auto;
+
+
+ .textContainer {
+ height: 100%;
+ display: flex;
+ flex-direction: column;
+ justify-content: center;
+ gap: 40px;
+ width: 50%;
+
+ @include mobile{
+ height: 50%;
+ width: 100%;
+ gap: 20px;
+ align-items: center;
+ text-align: center;
+ }
+ @include tablet{
+ height: 70%;
+ width: 100%;
+ gap: 20px;
+ align-items: center;
+ text-align: center;
+ }
+
+ h2 {
+ font-size: 30px;
+ color: rebeccapurple;
+ letter-spacing: 10px;
+
+ }
+
+ h1 {
+ font-size: 88px;
+
+ @include mobile{
+ font-size: 20px;
+ }
+ @include tablet{
+ font-size: 66px;
+ }
+ }
+
+ .buttons {
+ button {
+ padding: 20px;
+ border: 1px solid white;
+ border-radius: 10px;
+ background-color: transparent;
+ color: white;
+ margin-right: 20px;
+ cursor: pointer;
+ font-weight: 300;
+ }
+ button:hover{
+ background-color: white;
+ color:rebeccapurple;
+ }
+ }
+
+ img {
+ width: 50px;
+ }
+ }
+ }
+
+ .imageContainer {
+ height: 100%;
+ position: absolute;
+ top: 0;
+ right: 0;
+
+ @include mobile{
+ height: 50%;
+ width: 100%;
+ bottom:0;
+ top:unset;
+ }
+ @include tablet{
+ height: 50%;
+ width: 100%;
+ bottom:0;
+ top:unset;
+ }
+ img{
+ width: 100%;
+ height:100%;
+ object-fit: cover;
+ @include tablet{
+ object-fit: contain;
+ }
+
+
+
+ }
+
+ }
+
+ .slidingTextContainer{
+ position: absolute;
+ font-size: 50vh;
+ bottom: -120px;
+ white-space: nowrap;
+ color: #ffffff09;
+ width: 50%;
+ font-weight: bold;
+ }
+}
\ No newline at end of file
diff --git a/src/components/navbar/Navbar.jsx b/src/components/navbar/Navbar.jsx
new file mode 100644
index 000000000..b8078d9c1
--- /dev/null
+++ b/src/components/navbar/Navbar.jsx
@@ -0,0 +1,23 @@
+import "./navbar.scss"
+import { motion } from "framer-motion"
+import Sidebar from "../sidebar/Sidebar"
+
+const Navbar = () => {
+ return (
+
+ )
+}
+
+export default Navbar
diff --git a/src/components/navbar/navbar.scss b/src/components/navbar/navbar.scss
new file mode 100644
index 000000000..6d0d07e06
--- /dev/null
+++ b/src/components/navbar/navbar.scss
@@ -0,0 +1,52 @@
+@import "../../app.scss";
+
+.navbar {
+ height: 120px; /* Increased height */
+
+ .wrapper {
+ max-width: 1366px;
+ margin: auto;
+ display: flex;
+ align-items: center;
+ justify-content: space-between;
+ height: 100%;
+
+ @include mobile {
+ justify-content: flex-end;
+ padding: 20px;
+ }
+ @include tablet {
+ justify-content: flex-end;
+ padding: 30px;
+ }
+
+ span {
+ font-weight: bold;
+ padding-left: 50px;
+ font-size: 24px; /* Increased font size */
+
+ @include mobile {
+ display: none;
+ }
+ @include tablet {
+ display: none;
+ }
+ }
+
+ .social {
+ display: flex;
+ gap: 20px;
+
+ a {
+ display: flex;
+ align-items: center;
+ justify-content: center;
+
+ img {
+ width: 40px;
+ height: 40px;
+ }
+ }
+ }
+ }
+}
diff --git a/src/components/parallax/Parallax.jsx b/src/components/parallax/Parallax.jsx
new file mode 100644
index 000000000..1b7cc4965
--- /dev/null
+++ b/src/components/parallax/Parallax.jsx
@@ -0,0 +1,75 @@
+import { useRef } from "react";
+import "./parallax.scss";
+import { motion, useScroll, useTransform } from "framer-motion";
+import ai from '../../../public/about/ai.png';
+import code from '../../../public/about/code.png';
+import ui from '../../../public/about/ui.png';
+import paw from '../../../public/about/paw.png';
+import cloud from '../../../public/about/cloud.png';
+import crafts from '../../../public/about/crafts.png';
+import badminton from '../../../public/about/badminton.png';
+
+const Parallax = () => {
+ const ref = useRef();
+ const { scrollYProgress } = useScroll({
+ target: ref,
+ offset: ["start start", "end start"],
+ });
+
+ const yBg = useTransform(scrollYProgress, [0, 1], ["0%", "10%"]);
+ const yText = useTransform(scrollYProgress, [0, 1], ["0%", "100%"]);
+
+ return (
+
+
+ About Me
+
+
+ What Excites Me in Tech
+
+
+
+
Artificial Intelligence and its potential to revolutionize industries.
+
+
+
+
Cloud Computing and building scalable solutions.
+
+
+
+
UI/UX Design and creating intuitive user interfaces.
+
+
+
+
Software Engineering and developing efficient algorithms.
+
+
+
+
+
+ Personal Interests
+
+
+
+
Spending time with puppies and babies.
+
+
+
+
Playing badminton.
+
+
+
+
Crafting
+
+
+
+
+
+
+
+
+
+ );
+};
+
+export default Parallax;
diff --git a/src/components/parallax/parallax.scss b/src/components/parallax/parallax.scss
new file mode 100644
index 000000000..d56536b96
--- /dev/null
+++ b/src/components/parallax/parallax.scss
@@ -0,0 +1,163 @@
+@import "../../app.scss";
+
+.parallax {
+ width: 100%;
+ height: 100%;
+ position: relative;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ overflow: hidden;
+
+ .about-me {
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+ width: 80%;
+ position: absolute;
+ z-index: 4;
+ top: 50%;
+ transform: translateY(-50%);
+
+ @include tablet {
+ top: 50px;
+ }
+
+ @include mobile {
+ top: 10%;
+ transform: translateY(0);
+ width: 100%;
+ padding: 20px;
+ }
+
+ .title {
+ font-size: 48px;
+ color: white;
+ margin-bottom: 40px;
+
+ @include mobile {
+ font-size: 36px;
+ text-align: center;
+ }
+ }
+
+ .sections {
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ width: 100%;
+
+ @include mobile {
+ flex-direction: column;
+ align-items: center;
+ }
+
+ .section {
+ flex: 1;
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+ margin: 0 20px;
+
+ @include mobile {
+ margin: 20px 0;
+ }
+
+ h2 {
+ font-size: 32px;
+ margin-bottom: 20px;
+ color: white;
+
+ @include mobile {
+ font-size: 28px;
+ text-align: center;
+ }
+ }
+
+ .content {
+ display: flex;
+ flex-direction: column;
+ gap: 30px;
+
+ .item {
+ display: flex;
+ align-items: center;
+ gap: 20px;
+
+ img {
+ width: 80px;
+ height: 80px;
+
+ @include mobile {
+ width: 40px;
+ height: 40px;
+ }
+ }
+
+ p {
+ font-size: 20px;
+ color: white;
+
+ @include mobile {
+ font-size: 16px;
+ text-align: center;
+ }
+ }
+ }
+ }
+ }
+
+ .timeline {
+ width: 2px;
+ background-color: white;
+ height: 80%;
+ z-index: 3;
+
+ @include mobile {
+ height: auto;
+ width: 2px;
+ margin: 20px 0;
+ background-color: white;
+ }
+ }
+ }
+ }
+
+ .mountains {
+ background-image: url("/images/mountains.png");
+ background-size: cover;
+ background-position: bottom;
+ width: 100%;
+ height: 100%;
+ position: absolute;
+ z-index: 3;
+
+ @include mobile {
+ background-size: contain;
+ background-repeat: no-repeat;
+ }
+ }
+
+ .planets {
+ background-size: cover;
+ background-position: bottom;
+ width: 100%;
+ height: 100%;
+ position: absolute;
+ z-index: 2;
+
+ @include tablet {
+ top: 20px;
+ }
+ }
+
+ .stars {
+ background-image: url("/images/stars.png");
+ background-size: cover;
+ background-position: bottom;
+ width: 100%;
+ height: 100%;
+ position: absolute;
+ z-index: 1;
+ }
+}
diff --git a/src/components/portfolio/Portfolio.jsx b/src/components/portfolio/Portfolio.jsx
new file mode 100644
index 000000000..40bf0666e
--- /dev/null
+++ b/src/components/portfolio/Portfolio.jsx
@@ -0,0 +1,92 @@
+import "./portfolio.scss";
+import { motion, useScroll, useSpring, useTransform } from "framer-motion";
+import { useRef } from "react";
+
+const items = [
+ {
+ id: 1,
+ title: "Ducky - AI Coding Assistant",
+ img: "/projects/ducky.png",
+ desc: "An AI powered coding assistant, Ducky by prompt engineering for 3 unique features like Generate code, Learning topics, Review/debug code in a web application developed using streamlit. Also 4 API endpoints like generate image, by GUID etc. Which also does Conversation Programming and by Integrating Blueprints using AutoGen.",
+ git_link: "https://github.com/yuvavt/",
+ },
+ {
+ id: 2,
+ title: "DiagnoSym",
+ img: "/projects/diagnosym.png",
+ desc: "A pioneering medical health assistant website empowers users to self-diagnose by using a comprehensive questionnaire addressing their symptoms. Delivering personalized diagnosis results, recommended specialized doctors, and preventive measures, the platform prioritizes user well-being. With a commitment to continuous improvement, DiagnoSym values user feedback to enhance accuracy, accessibility, and overall healthcare experience.",
+ git_link: "https://github.com/yuvavt/DiagnoSym",
+ },
+ {
+ id: 3,
+ title: "Douce Cravings",
+ img: "/projects/doucecravings.png",
+ desc: "An innovative dessert-focused website streamlining the dessert ordering experience for users, offering a diverse range of treats. Implemented user-friendly features, including real-time tracking of recent activity and popular items, enhancing customer engagement. Designed a multi-tiered user system with distinct roles (admin, user, unregistered user) and corresponding permissions for efficient management.",
+ git_link: "https://github.com/yuvavt/douce-cravings",
+ },
+ {
+ id: 4,
+ title: "Book Jam",
+ img: "/projects/bookjam.png",
+ desc: "‘Book Jam’ enables users to browse, search and access a variety of books. It was created to function as both a digital library and a bookstore. The program intends to provide book lovers with an enjoyable and convenient experience that will make it easy for them to find and buy books.",
+ git_link: "https://github.com/yuvavt/douce-cravings",
+ },
+ {
+ id: 5,
+ title: "Tracking Of Human Activities",
+ img: "/projects/tracking.png",
+ desc: "Developed a system capturing live video for guardians to stay connected with their loved ones in real time. Implemented an emergency alert feature for immediate assistance during unexpected situations, emphasizing user safety. Enhanced family well-being through user-friendly design and innovative communication solutions.",
+ git_link: "https://github.com/yuvavt/Tracking-of-Human-Activities",
+ },
+ {
+ id: 6,
+ title: "Dengue Alert System - A Life Savior",
+ img: "/projects/dengue.png",
+ desc: "A comprehensive mobile application catering to three distinct user needs: individuals seeking self-diagnosis, those seeking valuable information on dengue precautions and measures, and those interested in regional statistics on dengue cases. This user-centric application provides a one-stop solution for health awareness, real-time diagnostics, and localized statistical insights, enhancing community well-being and knowledge dissemination.",
+ git_link: "https://github.com/yuvavt/Dengue-Alert-System-A-Life-Saviour",
+ },
+];
+
+const Single = ({ item }) => {
+ const ref = useRef();
+ const { scrollYProgress } = useScroll({ target: ref, });
+ const y = useTransform(scrollYProgress, [0, 1], [-300, 300]);
+ return (
+
+ );
+}
+
+const Portfolio = () => {
+ const ref = useRef();
+ const { scrollYProgress } = useScroll({ target: ref, offset: ["end end", "start start"], });
+ const scaleX = useSpring(scrollYProgress, {
+ stiffness: 100,
+ damping: 30,
+ });
+ return (
+
+
+
My Works
+
+
+ {items.map(item => (
))}
+
+ );
+};
+
+export default Portfolio
diff --git a/src/components/portfolio/portfolio.scss b/src/components/portfolio/portfolio.scss
new file mode 100644
index 000000000..b8749170d
--- /dev/null
+++ b/src/components/portfolio/portfolio.scss
@@ -0,0 +1,112 @@
+@import "../../app.scss";
+.portfolio {
+ position: relative;
+
+ .progress {
+ position: sticky;
+ top: 0;
+ left: 0;
+ padding-top: 50px;
+ text-align: center;
+ color: orange;
+ font-size: 36px;
+
+ @include mobile{
+ padding-top: calc(100vh - 100px);
+ font-size: 24px;
+ }
+
+ .progressBar {
+ height: 10px;
+ background-color: white;
+
+ }
+ }
+
+ .container {
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ width: 100%;
+ height: 100%;
+ overflow: hidden;
+
+ .wrapper {
+ max-width:1366px;
+ height: 100%;
+ margin: auto;
+ display:flex;
+ gap: 50px;
+ align-items: center;
+ justify-content: center;
+
+ @include mobile{
+ flex-direction: column;
+ }
+
+ .imageContainer{
+ flex: 1;
+ height: 50%;
+
+ @include mobile{
+ width: 100%;
+ max-height: 300px;
+ }
+
+ img {
+ width: 100%;
+ height: 100%;
+ object-fit: cover;
+
+ @include mobile{
+ object-fit: contain;
+ }
+ }
+ }
+
+
+ .textContainer {
+ flex: 1;
+ display: flex;
+ flex-direction: column;
+ gap: 30px;
+
+ @include mobile{
+ transform: none !important;
+ padding: 10px;
+ align-items: center;
+ text-align: center;
+ }
+
+ h2{
+ font-size: 60px;
+
+ @include mobile{
+ font-size: 36px;
+ }
+ }
+ p{
+ color: gray;
+ font-size: 15px;
+
+ @include mobile{
+ font-size: 16px;
+ }
+ }
+ .button{
+ background-color: orange;
+ text-decoration: none;
+ color: white;
+ text-align: center;
+ border: none;
+ border-radius: 10px;
+ padding: 10px;
+ width: 200px;
+ cursor: pointer;
+ }
+ }
+
+ }
+
+ }
+}
\ No newline at end of file
diff --git a/src/components/sidebar/Sidebar.jsx b/src/components/sidebar/Sidebar.jsx
new file mode 100644
index 000000000..59786cabf
--- /dev/null
+++ b/src/components/sidebar/Sidebar.jsx
@@ -0,0 +1,39 @@
+import "./sidebar.scss";
+import Links from "./links/Links";
+import ToggleButton from "./toggleButton/ToggleButton";
+import { motion } from "framer-motion";
+import { useState } from "react";
+
+const variants = {
+ open: {
+ clipPath: "circle(1200px at 50px 50px)",
+ transition: {
+ type: "spring",
+ stiffness: 20,
+ },
+ },
+ closed: {
+ clipPath: "circle(30px at 50px 50px)",
+ transition: {
+ delay: 0.5,
+ type: "spring",
+ stiffness: 400,
+ damping: 40,
+ },
+ },
+};
+const Sidebar = () => {
+ const [open, setOpen] = useState(false)
+
+ return (
+
+
+
+
+
+
+
+ )
+}
+
+export default Sidebar
diff --git a/src/components/sidebar/links/Links.jsx b/src/components/sidebar/links/Links.jsx
new file mode 100644
index 000000000..f7fc50232
--- /dev/null
+++ b/src/components/sidebar/links/Links.jsx
@@ -0,0 +1,40 @@
+import React from 'react'
+import {motion} from "framer-motion"
+const variants = {
+ open:{
+ transition:{
+ staggerChildren: 0.1,
+ },
+ },
+ closed:{
+ transition:{
+ staggerChildren: 0.05,
+ staggerDirection: -1,
+ },
+ },
+
+};
+const itemVariants = {
+ open:{
+ y:0,
+ opacity:1,
+ },
+ closed:{
+ y:50,
+ opacity:0,
+ },
+
+};
+const Links = () => {
+ const items = ["Home", "About Me", "Experience & Skills", "Contact"];
+
+ return (
+ {items.map((item)=>(
+ {item}
+
+ ))}
+
+ )
+}
+
+export default Links
diff --git a/src/components/sidebar/sidebar.scss b/src/components/sidebar/sidebar.scss
new file mode 100644
index 000000000..831693a00
--- /dev/null
+++ b/src/components/sidebar/sidebar.scss
@@ -0,0 +1,58 @@
+@import "../../app.scss";
+.sidebar{
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+ justify-content: center;
+ background-color: white;
+ color: black;
+ .bg{
+ position: fixed;
+ top:0;
+ left: 0;
+ width: 400px;
+ background: white;
+ bottom:0;
+ z-index: 999;
+
+ @include mobile{
+ width:200px;
+ }
+
+ .links{
+ position: absolute;
+ width: 100%;
+ height: 100%;
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+ justify-content: center;
+ gap: 20px;
+
+
+ a{
+ font-size: 40px;
+
+ @include mobile{
+ font-size:20px;
+ }
+ }
+
+ }
+
+ }
+ button{
+ width: 50px;
+ height: 50px;
+ border-radius: 50%;
+ position: fixed;
+ top: 25px;
+ left: 25px;
+ background-color: transparent;
+ border: none;
+ cursor: pointer;
+ z-index: 999;
+
+ }
+
+}
\ No newline at end of file
diff --git a/src/components/sidebar/toggleButton/ToggleButton.jsx b/src/components/sidebar/toggleButton/ToggleButton.jsx
new file mode 100644
index 000000000..6a8117b61
--- /dev/null
+++ b/src/components/sidebar/toggleButton/ToggleButton.jsx
@@ -0,0 +1,13 @@
+import {motion} from "framer-motion"
+const ToggleButton = ({setOpen}) => {
+ return (
+ );
+};
+
+export default ToggleButton;
diff --git a/src/data/history.json b/src/data/history.json
new file mode 100644
index 000000000..e3ed532e9
--- /dev/null
+++ b/src/data/history.json
@@ -0,0 +1,38 @@
+[
+ {
+ "role": "Full Stack Developer",
+ "organisation": "Virginia Tech",
+ "startDate": "May 2024",
+ "endDate": "Present",
+ "experiences": [
+ "Containerized the AutoGPT application with Docker. Developed a Python plugin for the Materials Database API, increasing response accuracy by 85% and reducing query time."
+ ],
+ "imageSrc": "history/vt.png"
+ },
+ {
+ "role": "Software Developer",
+ "organisation": "Bright Mind Enrichment (NGO)",
+ "startDate": "May 2024",
+ "endDate": "Present",
+ "experiences": ["Created a User Badges Earned, Visit Log screens in the Street Care App using Kotlin and Firebase, boosting user engagement. Identified and fixed critical bugs, reducing app and managed code versions using Git and Trello."],
+ "imageSrc": "history/bme.png"
+ },
+ {
+ "role": "Software Developer",
+ "organisation": "Tata Consultancy Services",
+ "startDate": "Jan 2021",
+ "endDate": "Dec 2022",
+ "experiences": ["Integrated REST APIs with Python backend, boosting application performance. Redesigned e-commerce platform using React. Automated AWS infrastructure deployment, streamlining development."],
+ "imageSrc": "history/tcs.png"
+ },
+ {
+ "role": "Software Developer Intern",
+ "organisation": "Sparks Foundation",
+ "startDate": "Aug 2020",
+ "endDate": "Jan 2021",
+ "experiences": ["Enhanced the responsiveness of internal website. Effectively managed Agile software workflow"],
+ "imageSrc": "history/sparks.png"
+ }
+
+
+ ]
\ No newline at end of file
diff --git a/src/data/skills.json b/src/data/skills.json
new file mode 100644
index 000000000..43459880d
--- /dev/null
+++ b/src/data/skills.json
@@ -0,0 +1,62 @@
+[
+ {
+ "title": "HTML",
+ "imageSrc": "skills/html.png"
+ },
+ {
+ "title": "CSS",
+ "imageSrc": "skills/css.png"
+ },
+ {
+ "title": "SASS",
+ "imageSrc": "skills/sass.png"
+ },
+ {
+ "title": "Java Script",
+ "imageSrc": "skills/js.png"
+ },
+ {
+ "title": "React",
+ "imageSrc": "skills/react.png"
+ },
+ {
+ "title": "Python",
+ "imageSrc": "skills/python.png"
+ },
+ {
+ "title": "Django",
+ "imageSrc": "skills/django.png"
+ },
+ {
+ "title": "Node",
+ "imageSrc": "skills/node.png"
+ },
+ {
+ "title": "GraphQL",
+ "imageSrc": "skills/graphql.png"
+ },
+ {
+ "title": "PostgreSQL",
+ "imageSrc": "skills/postgresql.png"
+ },
+ {
+ "title": "Figma",
+ "imageSrc": "skills/figma.png"
+ },
+ {
+ "title": "Azure",
+ "imageSrc": "skills/azure.png"
+ },
+ {
+ "title": "Azure AD",
+ "imageSrc": "skills/azuread.png"
+ },
+ {
+ "title": "Terraform",
+ "imageSrc": "skills/terraform.png"
+ },
+ {
+ "title": "AWS",
+ "imageSrc": "skills/aws.png"
+ }
+ ]
\ No newline at end of file
diff --git a/src/utils.js b/src/utils.js
new file mode 100644
index 000000000..197a1da80
--- /dev/null
+++ b/src/utils.js
@@ -0,0 +1,3 @@
+export const getImageUrl = (path) => {
+ return new URL(`/public/${path}`, import.meta.url).href;
+};