├── .gitattributes
├── .gitignore
├── README.md
├── fetch.js
├── package-lock.json
├── package.json
├── public
├── browserconfig.xml
├── favicon-16x16.png
├── favicon-32x32.png
├── favicon.ico
├── index.html
├── logo192.png
├── logo512.png
├── manifest.json
├── mstile-150x150.png
├── robots.txt
└── safari-pinned-tab.svg
├── screen1.png
├── screen2.png
├── screen3.png
└── src
├── App.css
├── App.js
├── App.scss
├── App.test.js
├── _globalColor.scss
├── assets
├── fonts
│ ├── Agustina.woff
│ └── Montserrat-Regular.ttf
├── images
│ ├── airbnbLogo.png
│ ├── codeInLogo.webp
│ ├── contactMail.webp
│ ├── contactMailDark.svg
│ ├── developerActivity.svg
│ ├── developing.jpg
│ ├── developing1.jpg
│ ├── facebookLogo.png
│ ├── googleAssistant.svg
│ ├── googleAssistantLogo.webp
│ ├── jsFramework.svg
│ ├── manOnTable.svg
│ ├── nextuLogo.webp
│ ├── programmer.svg
│ ├── quoraLogo.png
│ ├── skill.svg
│ ├── talksCardBack.svg
│ ├── tiger.jpg
│ ├── tiger1.jpg
│ └── tiger2.jpg
└── lottie
│ ├── build.json
│ ├── codingPerson.json
│ ├── email.json
│ ├── landingPerson.json
│ └── splashAnimation.json
├── components
├── ToggleSwitch
│ ├── ToggleSwitch.js
│ └── ToggleSwitch.scss
├── button
│ ├── Button.js
│ └── Button.scss
├── displayLottie
│ └── DisplayLottie.js
├── footer
│ ├── Footer.js
│ └── Footer.scss
├── githubProfileCard
│ ├── GithubProfileCard.js
│ └── GithubProfileCard.scss
├── githubRepoCard
│ ├── GithubRepoCard.js
│ └── GithubRepoCard.scss
├── header
│ ├── Header.js
│ └── Header.scss
├── socialMedia
│ ├── SocialMedia.js
│ └── SocialMedia.scss
└── softwareSkills
│ ├── SoftwareSkill.js
│ └── SoftwareSkill.scss
├── containers
├── Main.js
├── Main.scss
├── contact
│ ├── Contact.js
│ └── Contact.scss
├── greeting
│ ├── Greeting.js
│ └── Greeting.scss
├── loading
│ ├── Loading.js
│ └── loading.scss
├── profile
│ └── Profile.js
├── skillProgress
│ ├── Progress.scss
│ └── skillProgress.js
├── skills
│ ├── Skills.js
│ └── Skills.scss
├── splashScreen
│ ├── SplashScreen.css
│ └── SplashScreen.js
└── topbutton
│ ├── Top.js
│ └── Top.scss
├── contexts
└── StyleContext.js
├── hooks
└── useLocalStorage.js
├── index.css
├── index.js
├── logo.svg
├── portfolio.js
├── reportWebVitals.js
├── serviceWorker.js
├── setupTests.js
└── utils.js
/.gitattributes:
--------------------------------------------------------------------------------
1 | * text eol=lf
2 |
3 | # Denote all files that are truly binary and should not be modified
4 | *.ttf binary
5 | *.png binary
6 | *.webp binary
7 | *.woff binary
8 |
9 |
--------------------------------------------------------------------------------
/.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 | # Getting Started with Create React App
2 |
3 | This project was bootstrapped with [Create React App](https://github.com/facebook/create-react-app).
4 |
5 | ## Available Scripts
6 |
7 | In the project directory, you can run:
8 |
9 | ### `npm start`
10 |
11 | Runs the app in the development mode.\
12 | Open [http://localhost:3000](http://localhost:3000) to view it in your browser.
13 |
14 | The page will reload when you make changes.\
15 | You may also see any lint errors in the console.
16 |
17 | ### `npm test`
18 |
19 | Launches the test runner in the interactive watch mode.\
20 | See the section about [running tests](https://facebook.github.io/create-react-app/docs/running-tests) for more information.
21 |
22 | ### `npm run build`
23 |
24 | Builds the app for production to the `build` folder.\
25 | It correctly bundles React in production mode and optimizes the build for the best performance.
26 |
27 | The build is minified and the filenames include the hashes.\
28 | Your app is ready to be deployed!
29 |
30 | See the section about [deployment](https://facebook.github.io/create-react-app/docs/deployment) for more information.
31 |
32 | ### `npm run eject`
33 |
34 | **Note: this is a one-way operation. Once you `eject`, you can't go back!**
35 |
36 | If you aren't satisfied with the build tool and configuration choices, you can `eject` at any time. This command will remove the single build dependency from your project.
37 |
38 | Instead, it will copy all the configuration files and the transitive dependencies (webpack, Babel, ESLint, etc) right into your project so you have full control over them. All of the commands except `eject` will still work, but they will point to the copied scripts so you can tweak them. At this point you're on your own.
39 |
40 | You don't have to ever use `eject`. The curated feature set is suitable for small and middle deployments, and you shouldn't feel obligated to use this feature. However we understand that this tool wouldn't be useful if you couldn't customize it when you are ready for it.
41 |
42 | ## Learn More
43 |
44 | You can learn more in the [Create React App documentation](https://facebook.github.io/create-react-app/docs/getting-started).
45 |
46 | To learn React, check out the [React documentation](https://reactjs.org/).
47 |
48 | ### Code Splitting
49 |
50 | This section has moved here: [https://facebook.github.io/create-react-app/docs/code-splitting](https://facebook.github.io/create-react-app/docs/code-splitting)
51 |
52 | ### Analyzing the Bundle Size
53 |
54 | This section has moved here: [https://facebook.github.io/create-react-app/docs/analyzing-the-bundle-size](https://facebook.github.io/create-react-app/docs/analyzing-the-bundle-size)
55 |
56 | ### Making a Progressive Web App
57 |
58 | This section has moved here: [https://facebook.github.io/create-react-app/docs/making-a-progressive-web-app](https://facebook.github.io/create-react-app/docs/making-a-progressive-web-app)
59 |
60 | ### Advanced Configuration
61 |
62 | This section has moved here: [https://facebook.github.io/create-react-app/docs/advanced-configuration](https://facebook.github.io/create-react-app/docs/advanced-configuration)
63 |
64 | ### Deployment
65 |
66 | This section has moved here: [https://facebook.github.io/create-react-app/docs/deployment](https://facebook.github.io/create-react-app/docs/deployment)
67 |
68 | ### `npm run build` fails to minify
69 |
70 | This section has moved here: [https://facebook.github.io/create-react-app/docs/troubleshooting#npm-run-build-fails-to-minify](https://facebook.github.io/create-react-app/docs/troubleshooting#npm-run-build-fails-to-minify)
71 |
--------------------------------------------------------------------------------
/fetch.js:
--------------------------------------------------------------------------------
1 | fs = require("fs");
2 | const https = require("https");
3 | process = require("process");
4 | require("dotenv").config();
5 |
6 | const GITHUB_TOKEN = process.env.REACT_APP_GITHUB_TOKEN;
7 | const GITHUB_USERNAME = process.env.GITHUB_USERNAME;
8 | const USE_GITHUB_DATA = process.env.USE_GITHUB_DATA;
9 | const MEDIUM_USERNAME = process.env.MEDIUM_USERNAME;
10 |
11 | const ERR = {
12 | noUserName:
13 | "Github Username was found to be undefined. Please set all relevant environment variables.",
14 | requestFailed:
15 | "The request to GitHub didn't succeed. Check if GitHub token in your .env file is correct.",
16 | requestFailedMedium:
17 | "The request to Medium didn't succeed. Check if Medium username in your .env file is correct."
18 | };
19 | if (USE_GITHUB_DATA === "true") {
20 | if (GITHUB_USERNAME === undefined) {
21 | throw new Error(ERR.noUserName);
22 | }
23 |
24 | console.log(`Fetching profile data for ${GITHUB_USERNAME}`);
25 | var data = JSON.stringify({
26 | query: `
27 | {
28 | user(login:"${GITHUB_USERNAME}") {
29 | name
30 | bio
31 | avatarUrl
32 | location
33 | pinnedItems(first: 6, types: [REPOSITORY]) {
34 | totalCount
35 | edges {
36 | node {
37 | ... on Repository {
38 | name
39 | description
40 | forkCount
41 | stargazers {
42 | totalCount
43 | }
44 | url
45 | id
46 | diskUsage
47 | primaryLanguage {
48 | name
49 | color
50 | }
51 | }
52 | }
53 | }
54 | }
55 | }
56 | }
57 | `
58 | });
59 | const default_options = {
60 | hostname: "api.github.com",
61 | path: "/graphql",
62 | port: 443,
63 | method: "POST",
64 | headers: {
65 | Authorization: `Bearer ${GITHUB_TOKEN}`,
66 | "User-Agent": "Node"
67 | }
68 | };
69 |
70 | const req = https.request(default_options, res => {
71 | let data = "";
72 |
73 | console.log(`statusCode: ${res.statusCode}`);
74 | if (res.statusCode !== 200) {
75 | throw new Error(ERR.requestFailed);
76 | }
77 |
78 | res.on("data", d => {
79 | data += d;
80 | });
81 | res.on("end", () => {
82 | fs.writeFile("./public/profile.json", data, function (err) {
83 | if (err) return console.log(err);
84 | console.log("saved file to public/profile.json");
85 | });
86 | });
87 | });
88 |
89 | req.on("error", error => {
90 | throw error;
91 | });
92 |
93 | req.write(data);
94 | req.end();
95 | }
96 |
97 | if (MEDIUM_USERNAME !== undefined) {
98 | console.log(`Fetching Medium blogs data for ${MEDIUM_USERNAME}`);
99 | const options = {
100 | hostname: "api.rss2json.com",
101 | path: `/v1/api.json?rss_url=https://medium.com/feed/@${MEDIUM_USERNAME}`,
102 | port: 443,
103 | method: "GET"
104 | };
105 |
106 | const req = https.request(options, res => {
107 | let mediumData = "";
108 |
109 | console.log(`statusCode: ${res.statusCode}`);
110 | if (res.statusCode !== 200) {
111 | throw new Error(ERR.requestMediumFailed);
112 | }
113 |
114 | res.on("data", d => {
115 | mediumData += d;
116 | });
117 | res.on("end", () => {
118 | fs.writeFile("./public/blogs.json", mediumData, function (err) {
119 | if (err) return console.log(err);
120 | console.log("saved file to public/blogs.json");
121 | });
122 | });
123 | });
124 |
125 | req.on("error", error => {
126 | throw error;
127 | });
128 |
129 | req.end();
130 | }
131 |
--------------------------------------------------------------------------------
/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "homepage": "https://smartluck.js.org/",
3 | "name": "SmartLuck1125",
4 | "version": "0.1.0",
5 | "private": true,
6 | "dependencies": {
7 | "colorthief": "^2.3.0",
8 | "enzyme": "^3.11.0",
9 | "enzyme-adapter-react-16": "^1.15.6",
10 | "gh-pages": "^2.1.1",
11 | "jest-canvas-mock": "^2.3.1",
12 | "lottie-react": "^2.4.0",
13 | "react": "^16.10.2",
14 | "react-dom": "^16.14.0",
15 | "react-easy-emoji": "^1.8.1",
16 | "react-headroom": "^3.0.0",
17 | "react-reveal": "^1.2.2",
18 | "react-scripts": "^5.0.1",
19 | "react-test-renderer": "^16.10.2",
20 | "react-twitter-embed": "3.0.3",
21 | "sass": "^1.32.8",
22 | "web-vitals": "^3.5.2"
23 | },
24 | "scripts": {
25 | "predeploy": "npm run build",
26 | "start": "node fetch.js && react-scripts start",
27 | "build": "node fetch.js && react-scripts build",
28 | "deploy": "gh-pages -b master -d build",
29 | "test": "react-scripts test",
30 | "eject": "react-scripts eject",
31 | "format": "prettier --write \"./**/*.{js,css,json,scss}\"",
32 | "check-format": "prettier -c \"./**/*.{js,css,json,scss}\""
33 | },
34 | "eslintConfig": {
35 | "extends": "react-app"
36 | },
37 | "browserslist": {
38 | "production": [
39 | ">0.3%",
40 | "not ie 11",
41 | "not dead",
42 | "not op_mini all"
43 | ],
44 | "development": [
45 | ">0.3%",
46 | "not ie 11",
47 | "not dead",
48 | "not op_mini all",
49 | "last 1 chrome version",
50 | "last 1 firefox version",
51 | "last 1 safari version"
52 | ]
53 | },
54 | "devDependencies": {
55 | "@babel/plugin-proposal-private-property-in-object": "^7.21.11",
56 | "dotenv": "^8.2.0",
57 | "prettier": "^2.3.1"
58 | }
59 | }
60 |
--------------------------------------------------------------------------------
/public/browserconfig.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 | #603cba
7 |
8 |
9 |
10 |
--------------------------------------------------------------------------------
/public/favicon-16x16.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/smartluck1125/myportfolio/a2bff3db049903e3dfd42dff15b2235990a1d9c2/public/favicon-16x16.png
--------------------------------------------------------------------------------
/public/favicon-32x32.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/smartluck1125/myportfolio/a2bff3db049903e3dfd42dff15b2235990a1d9c2/public/favicon-32x32.png
--------------------------------------------------------------------------------
/public/favicon.ico:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/smartluck1125/myportfolio/a2bff3db049903e3dfd42dff15b2235990a1d9c2/public/favicon.ico
--------------------------------------------------------------------------------
/public/index.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
12 |
13 |
14 |
15 |
16 |
17 |
26 |
27 |
28 |
29 |
30 | My profile
31 |
32 |
33 |
34 |
35 |
45 |
46 |
47 |
--------------------------------------------------------------------------------
/public/logo192.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/smartluck1125/myportfolio/a2bff3db049903e3dfd42dff15b2235990a1d9c2/public/logo192.png
--------------------------------------------------------------------------------
/public/logo512.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/smartluck1125/myportfolio/a2bff3db049903e3dfd42dff15b2235990a1d9c2/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/mstile-150x150.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/smartluck1125/myportfolio/a2bff3db049903e3dfd42dff15b2235990a1d9c2/public/mstile-150x150.png
--------------------------------------------------------------------------------
/public/robots.txt:
--------------------------------------------------------------------------------
1 | # https://www.robotstxt.org/robotstxt.html
2 | User-agent: *
3 | Disallow:
4 |
--------------------------------------------------------------------------------
/public/safari-pinned-tab.svg:
--------------------------------------------------------------------------------
1 |
2 |
4 |
79 |
--------------------------------------------------------------------------------
/screen1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/smartluck1125/myportfolio/a2bff3db049903e3dfd42dff15b2235990a1d9c2/screen1.png
--------------------------------------------------------------------------------
/screen2.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/smartluck1125/myportfolio/a2bff3db049903e3dfd42dff15b2235990a1d9c2/screen2.png
--------------------------------------------------------------------------------
/screen3.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/smartluck1125/myportfolio/a2bff3db049903e3dfd42dff15b2235990a1d9c2/screen3.png
--------------------------------------------------------------------------------
/src/App.css:
--------------------------------------------------------------------------------
1 | .App {
2 | text-align: center;
3 | }
4 |
5 | .App-logo {
6 | height: 40vmin;
7 | pointer-events: none;
8 | }
9 |
10 | @media (prefers-reduced-motion: no-preference) {
11 | .App-logo {
12 | animation: App-logo-spin infinite 20s linear;
13 | }
14 | }
15 |
16 | .App-header {
17 | background-color: #282c34;
18 | min-height: 100vh;
19 | display: flex;
20 | flex-direction: column;
21 | align-items: center;
22 | justify-content: center;
23 | font-size: calc(10px + 2vmin);
24 | color: white;
25 | }
26 |
27 | .App-link {
28 | color: #61dafb;
29 | }
30 |
31 | @keyframes App-logo-spin {
32 | from {
33 | transform: rotate(0deg);
34 | }
35 | to {
36 | transform: rotate(360deg);
37 | }
38 | }
39 |
--------------------------------------------------------------------------------
/src/App.js:
--------------------------------------------------------------------------------
1 | import './App.css';
2 | import React from "react";
3 | import Main from "./containers/Main"
4 |
5 | function App() {
6 | return (
7 |
8 |
9 |
10 | );
11 | }
12 |
13 | export default App;
14 |
--------------------------------------------------------------------------------
/src/App.scss:
--------------------------------------------------------------------------------
1 | @import "./globalColor";
2 |
3 | .App {
4 | text-align: center;
5 | width: 100%;
6 | overflow-x: hidden;
7 | }
8 |
9 | .App-logo {
10 | height: 40vmin;
11 | }
12 |
13 | .App-header {
14 | background-color: $appHeaderBG;
15 | min-height: 100vh;
16 | display: flex;
17 | flex-direction: column;
18 | align-items: center;
19 | justify-content: center;
20 | font-size: calc(0.625rem + 2vmin);
21 | color: $textColorDark;
22 | }
23 |
24 | .App-link {
25 | color: $appLink;
26 | }
27 |
28 | .subTitle {
29 | color: $subTitle;
30 | }
31 |
--------------------------------------------------------------------------------
/src/App.test.js:
--------------------------------------------------------------------------------
1 | import { render, screen } from '@testing-library/react';
2 | import App from './App';
3 |
4 | test('renders learn react link', () => {
5 | render();
6 | const linkElement = screen.getByText(/learn react/i);
7 | expect(linkElement).toBeInTheDocument();
8 | });
9 |
--------------------------------------------------------------------------------
/src/_globalColor.scss:
--------------------------------------------------------------------------------
1 | /* Change colors in this file to style to your needs on a global level.
2 | Certain colors are used for different and multiply types of elements.
3 | For greater control over colors visit each components .scss file. */
4 |
5 | // button colors
6 | $buttonColor: #55198b;
7 | $buttonHover: #8c43ce;
8 | $topButtonHover: #000;
9 |
10 | // text colors light theme
11 | $titleColor: #000000;
12 | $textColor: #000000;
13 | $subTitle: #868e96;
14 | $cardSubtitle: #666666;
15 | $talkCardSubTitle: #7f8287;
16 | $blogCardTitleColor: #262626;
17 |
18 | // text color dark theme
19 | $textColorDark: #ffffff;
20 |
21 | // toggle switch colors
22 | $toggleCheck: #2196f3;
23 | $toggleSwitchSliderBG: #ccc;
24 |
25 | // githubRepo specific colors
26 | $githubRepoCardLanguageColorBG: #0000ff;
27 | $githubRepoCardColor: rgb(88, 96, 105);
28 | $githubRepoCardRepoCardStatsColor: rgb(106, 115, 125);
29 | $githubRepoCardRepoNameColor: rgb(36, 41, 46);
30 | $githubProfileCardLocationTS: #ffebcd;
31 | $githubProfileCardBorder: #6c63ff;
32 |
33 | // light background colors
34 | $lightBackground1: #fff;
35 | $lightBackground2: rgb(255, 255, 255);
36 | $lightBackground3: #f5f2f4;
37 | $blogCardContainerColor: #586069;
38 | // dark background colors
39 | $darkBackground: #171c28;
40 |
41 | // light theme box shadows
42 | $lightBoxShadowDark: rgba(0, 0, 0, 0.2);
43 | $lightBoxShadow: rgba(0, 0, 0, 0.1);
44 | $lightBoxShadowDarker: rgba(0, 0, 0, 0.3);
45 |
46 | // dark theme box shadows
47 | $darkBoxShadow: #d9dbdf;
48 | $darkBoxShadow2: #ffffff;
49 |
50 | // linear gradients
51 | $experienceCardBlurredDivLG: linear-gradient(
52 | rgba(0, 0, 0, 0.4),
53 | rgba(0, 0, 0, 0.2)
54 | );
55 | $experienceCardBannerLG: linear-gradient(
56 | rgba(0, 0, 0, 0.7),
57 | rgba(0, 0, 0, 0.5)
58 | );
59 |
60 | // borders
61 | $progressBarBackground: rgb(243, 239, 239);
62 | $lightBorder1: rgba(211, 211, 211, 0.397);
63 | $educationCardBorder: #a9a7f9;
64 |
65 | // hovers
66 | $achievementCertificateCardHoverDark: rgba(255, 255, 255, 0.2);
67 | $blogCardHoverSmallColor: rgba(255, 255, 255, 0.8);
68 | $headerHoverBG: #f4f4f4;
69 | $contactDetailHoverTS: #b5b5b5;
70 |
71 | // misc backgrounds
72 | $progressBarSpanBG: #aaa5ff;
73 | $iconBackground: #333;
74 | $appHeaderBG: #282c34;
75 |
76 | // misc colors
77 | $skillsColor: #645beb;
78 | $appLink: #09d3ac;
79 |
80 | // social media icons
81 | $faceBook: #3b5998;
82 | $linkedin: #0e76a8;
83 | $github: #333;
84 | $gitlab: #fca326;
85 | $google: #ea4335;
86 | $twitter: #1da1f2;
87 | $medium: #000;
88 | $stackoverflow: #f48024;
89 | $instagram: #c13584;
90 | $kaggle: #20beff;
91 |
--------------------------------------------------------------------------------
/src/assets/fonts/Agustina.woff:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/smartluck1125/myportfolio/a2bff3db049903e3dfd42dff15b2235990a1d9c2/src/assets/fonts/Agustina.woff
--------------------------------------------------------------------------------
/src/assets/fonts/Montserrat-Regular.ttf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/smartluck1125/myportfolio/a2bff3db049903e3dfd42dff15b2235990a1d9c2/src/assets/fonts/Montserrat-Regular.ttf
--------------------------------------------------------------------------------
/src/assets/images/airbnbLogo.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/smartluck1125/myportfolio/a2bff3db049903e3dfd42dff15b2235990a1d9c2/src/assets/images/airbnbLogo.png
--------------------------------------------------------------------------------
/src/assets/images/codeInLogo.webp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/smartluck1125/myportfolio/a2bff3db049903e3dfd42dff15b2235990a1d9c2/src/assets/images/codeInLogo.webp
--------------------------------------------------------------------------------
/src/assets/images/contactMail.webp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/smartluck1125/myportfolio/a2bff3db049903e3dfd42dff15b2235990a1d9c2/src/assets/images/contactMail.webp
--------------------------------------------------------------------------------
/src/assets/images/contactMailDark.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/src/assets/images/developerActivity.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/src/assets/images/developing.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/smartluck1125/myportfolio/a2bff3db049903e3dfd42dff15b2235990a1d9c2/src/assets/images/developing.jpg
--------------------------------------------------------------------------------
/src/assets/images/developing1.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/smartluck1125/myportfolio/a2bff3db049903e3dfd42dff15b2235990a1d9c2/src/assets/images/developing1.jpg
--------------------------------------------------------------------------------
/src/assets/images/facebookLogo.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/smartluck1125/myportfolio/a2bff3db049903e3dfd42dff15b2235990a1d9c2/src/assets/images/facebookLogo.png
--------------------------------------------------------------------------------
/src/assets/images/googleAssistant.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/src/assets/images/googleAssistantLogo.webp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/smartluck1125/myportfolio/a2bff3db049903e3dfd42dff15b2235990a1d9c2/src/assets/images/googleAssistantLogo.webp
--------------------------------------------------------------------------------
/src/assets/images/jsFramework.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/src/assets/images/nextuLogo.webp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/smartluck1125/myportfolio/a2bff3db049903e3dfd42dff15b2235990a1d9c2/src/assets/images/nextuLogo.webp
--------------------------------------------------------------------------------
/src/assets/images/programmer.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/src/assets/images/quoraLogo.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/smartluck1125/myportfolio/a2bff3db049903e3dfd42dff15b2235990a1d9c2/src/assets/images/quoraLogo.png
--------------------------------------------------------------------------------
/src/assets/images/skill.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/src/assets/images/talksCardBack.svg:
--------------------------------------------------------------------------------
1 |
2 |
3 |
--------------------------------------------------------------------------------
/src/assets/images/tiger.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/smartluck1125/myportfolio/a2bff3db049903e3dfd42dff15b2235990a1d9c2/src/assets/images/tiger.jpg
--------------------------------------------------------------------------------
/src/assets/images/tiger1.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/smartluck1125/myportfolio/a2bff3db049903e3dfd42dff15b2235990a1d9c2/src/assets/images/tiger1.jpg
--------------------------------------------------------------------------------
/src/assets/images/tiger2.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/smartluck1125/myportfolio/a2bff3db049903e3dfd42dff15b2235990a1d9c2/src/assets/images/tiger2.jpg
--------------------------------------------------------------------------------
/src/assets/lottie/email.json:
--------------------------------------------------------------------------------
1 | {"v":"5.7.1","fr":30,"ip":0,"op":30,"w":1920,"h":1080,"nm":"Lottie Tutorial New","ddd":0,"assets":[],"layers":[{"ddd":0,"ind":1,"ty":4,"nm":"evelope","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":0,"s":[959.906,561.464,0],"to":[0,-7.333,0],"ti":[0,0,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.167,"y":0},"t":14,"s":[959.906,517.464,0],"to":[0,0,0],"ti":[0,-7.333,0]},{"t":28.0000011404634,"s":[959.906,561.464,0]}],"ix":2},"a":{"a":0,"k":[210.768,158.138,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[7.26,0],[0,0],[0,7.261],[0,0],[0,0],[-3.071,0],[-2.48,2.146],[0,0],[0,0]],"o":[[0,0],[-7.26,0],[0,0],[0,0],[2.48,2.145],[3.071,0],[0,0],[0,0],[-0.001,7.26]],"v":[[171.045,131.573],[-171.044,131.573],[-184.202,118.415],[-184.202,-102.753],[-8.622,49.417],[0,52.629],[8.622,49.417],[184.203,-102.753],[184.203,118.416]],"c":true},"ix":2},"nm":"Tracé 1","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[0,0],[-1.555,-0.647],[0,0],[0,0],[-1.788,0]],"o":[[1.788,0],[0,0],[0,0],[1.554,-0.646],[0,0]],"v":[[171.045,-131.573],[176.088,-130.555],[0,22.061],[-176.088,-130.555],[-171.045,-131.573]],"c":true},"ix":2},"nm":"Tracé 2","mn":"ADBE Vector Shape - Group","hd":false},{"ind":2,"ty":"sh","ix":3,"ks":{"a":0,"k":{"i":[[21.767,0],[0,0],[0,-21.766],[0,0],[-21.767,0],[0,0],[0,21.766],[0,0]],"o":[[0,0],[-21.767,0],[0,0],[0,21.766],[0,0],[21.767,0],[0,0],[0,-21.766]],"v":[[171.045,-157.888],[-171.044,-157.888],[-210.517,-118.416],[-210.517,118.416],[-171.044,157.888],[171.045,157.888],[210.517,118.416],[210.517,-118.416]],"c":true},"ix":2},"nm":"Tracé 3","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"mm","mm":1,"nm":"Fusionner les tracés 1","mn":"ADBE Vector Filter - Merge","hd":false},{"ty":"fl","c":{"a":0,"k":[0.4,0,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fond 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[210.767,158.138],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transformer "}],"nm":"Groupe 1","np":5,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":30.0000012219251,"st":0,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":"evelope-shadow","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":0,"s":[1043.578,612.154,0],"to":[0,-7.333,0],"ti":[0,0,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.167,"y":0},"t":14,"s":[1043.578,568.154,0],"to":[0,0,0],"ti":[0,-7.333,0]},{"t":28.0000011404634,"s":[1043.578,612.154,0]}],"ix":2},"a":{"a":0,"k":[115.3,100.942,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-6.181,185.983],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[115.05,-100.692],[115.05,77.015],[91.371,100.692],[-115.05,100.692]],"c":true},"ix":2},"nm":"Tracé 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.8862745098039215,0.8235294117647058,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fond 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[115.3,100.942],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transformer "}],"nm":"Groupe 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":30.0000012219251,"st":0,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":"wave","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":0,"s":[775.703,248.429,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":14,"s":[775.703,254.42900000000003,0],"to":[0,0,0],"ti":[0,0,0]},{"t":28.0000011404634,"s":[775.703,248.429,0]}],"ix":2},"a":{"a":0,"k":[76.35,61.296,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[-18.541,-18.541],[0,0]],"o":[[0,0],[18.541,18.541],[0,0]],"v":[[-33.595,0],[1.267,0],[33.595,0]],"c":false},"ix":2},"nm":"Tracé 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.8862745098039215,0.8235294117647058,1,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":17.102,"ix":5},"lc":1,"lj":1,"ml":10,"bm":0,"nm":"Contour 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[76.35,61.296],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transformer "}],"nm":"Groupe 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":30.0000012219251,"st":0,"bm":0},{"ddd":0,"ind":4,"ty":4,"nm":"circle1","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":0,"s":[666.721,728.644,0],"to":[0,2.167,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":14,"s":[666.721,741.644,0],"to":[0,0,0],"ti":[0,2.167,0]},{"t":28.0000011404634,"s":[666.721,728.644,0]}],"ix":2},"a":{"a":0,"k":[57.806,57.806,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,-8.313],[8.313,0],[0,8.313],[-8.312,0]],"o":[[0,8.313],[-8.312,0],[0,-8.313],[8.313,0]],"v":[[15.051,0],[0,15.051],[-15.051,0],[0,-15.051]],"c":true},"ix":2},"nm":"Tracé 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.8862745098039215,0.8235294117647058,1,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":17.102,"ix":5},"lc":1,"lj":1,"ml":10,"bm":0,"nm":"Contour 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[57.806,57.806],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transformer "}],"nm":"Groupe 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":30.0000012219251,"st":0,"bm":0},{"ddd":0,"ind":5,"ty":4,"nm":"plus","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":0,"s":[1257.728,623.464,0],"to":[0,1.589,0],"ti":[0,-0.535,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":14,"s":[1257.728,633,0],"to":[0,0.535,0],"ti":[0,1.054,0]},{"t":28.0000011404634,"s":[1257.728,626.677,0]}],"ix":2},"a":{"a":0,"k":[33.16,8.725,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[32.91,8.475],[-32.91,8.475],[-32.91,-8.475],[32.91,-8.475]],"c":true},"ix":2},"nm":"Tracé 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.8862745098039215,0.8235294117647058,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fond 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[33.16,8.725],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transformer "}],"nm":"Groupe 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":30.0000012219251,"st":0,"bm":0},{"ddd":0,"ind":6,"ty":4,"nm":"plus2","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":0,"s":[1257.728,623.264,0],"to":[0,1.623,0],"ti":[0,-0.569,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":14,"s":[1257.728,633,0],"to":[0,0.569,0],"ti":[0,1.054,0]},{"t":28.0000011404634,"s":[1257.728,626.677,0]}],"ix":2},"a":{"a":0,"k":[8.724,33.16,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-8.474,-32.91],[8.474,-32.91],[8.474,32.91],[-8.474,32.91]],"c":true},"ix":2},"nm":"Tracé 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.8862745098039215,0.8235294117647058,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fond 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[8.724,33.16],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transformer "}],"nm":"Groupe 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":30.0000012219251,"st":0,"bm":0},{"ddd":0,"ind":7,"ty":4,"nm":"circle2","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":0,"s":[1249.252,355.177,0],"to":[0,-1,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":14,"s":[1249.252,349.177,0],"to":[0,0,0],"ti":[0,-1,0]},{"t":28.0000011404634,"s":[1249.252,355.177,0]}],"ix":2},"a":{"a":0,"k":[67.097,67.097,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,-13.444],[13.444,0],[0,13.444],[-13.444,0]],"o":[[0,13.444],[-13.444,0],[0,-13.444],[13.444,0]],"v":[[24.343,0],[0,24.342],[-24.343,0],[0,-24.342]],"c":true},"ix":2},"nm":"Tracé 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.8862745098039215,0.8235294117647058,1,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":17.102,"ix":5},"lc":1,"lj":1,"ml":10,"bm":0,"nm":"Contour 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[67.097,67.097],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transformer "}],"nm":"Groupe 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":30.0000012219251,"st":0,"bm":0},{"ddd":0,"ind":8,"ty":4,"nm":"shadow","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[959.905,865.667,0],"ix":2},"a":{"a":0,"k":[153.686,22.08,0],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":0,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":14,"s":[81,81,100]},{"t":28.0000011404634,"s":[100,100,100]}],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,-12.057],[84.742,0],[0,12.057],[-84.74,0]],"o":[[0,12.057],[-84.74,0],[0,-12.057],[84.742,0]],"v":[[153.436,-0.001],[-0.001,21.831],[-153.436,-0.001],[-0.001,-21.831]],"c":true},"ix":2},"nm":"Tracé 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.8862745098039215,0.8235294117647058,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fond 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[153.686,22.081],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transformer "}],"nm":"Groupe 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":30.0000012219251,"st":0,"bm":0}],"markers":[{"tm":0,"cm":"1","dr":0},{"tm":395.00001608868,"cm":"2","dr":0}]}
--------------------------------------------------------------------------------
/src/components/ToggleSwitch/ToggleSwitch.js:
--------------------------------------------------------------------------------
1 | import React, {useState, useContext} from "react";
2 | import emoji from "react-easy-emoji";
3 | import StyleContext from "../../contexts/StyleContext";
4 | import "./ToggleSwitch.scss";
5 |
6 | const ToggleSwitch = () => {
7 | const {isDark} = useContext(StyleContext);
8 | const [isChecked, setChecked] = useState(isDark);
9 | const styleContext = useContext(StyleContext);
10 |
11 | return (
12 |
25 | );
26 | };
27 | export default ToggleSwitch;
28 |
--------------------------------------------------------------------------------
/src/components/ToggleSwitch/ToggleSwitch.scss:
--------------------------------------------------------------------------------
1 | @import "../../_globalColor";
2 |
3 | .switch {
4 | position: relative;
5 | display: inline-block;
6 | width: 50px;
7 | height: 26px;
8 | }
9 |
10 | /* Fix visible slider checkbox */
11 | input {
12 | transform: scale(0.5);
13 | }
14 |
15 | .slider {
16 | position: absolute;
17 | cursor: pointer;
18 | top: 0;
19 | left: 0;
20 | right: 0;
21 | bottom: 0;
22 | background-color: $toggleSwitchSliderBG;
23 | -webkit-transition: 0.4s;
24 | transition: 0.4s;
25 | }
26 |
27 | .slider::before {
28 | position: absolute;
29 | content: "";
30 | height: 26px;
31 | width: 28px;
32 | left: 0;
33 | bottom: 0;
34 | background-color: $textColorDark;
35 | -webkit-transition: 0.4s;
36 | transition: 0.4s;
37 | }
38 |
39 | input:checked + .slider {
40 | background-color: $toggleCheck;
41 | }
42 |
43 | input:focus + .slider {
44 | box-shadow: $toggleCheck;
45 | }
46 |
47 | input:checked + .slider::before,
48 | input:checked + .slider > .emoji {
49 | -webkit-transform: translateX(26px);
50 | -ms-transform: translateX(26px);
51 | transform: translateX(26px);
52 | }
53 |
54 | /* Rounded sliders */
55 | .slider.round {
56 | border-radius: 34px;
57 | display: flex;
58 | align-items: center;
59 | }
60 |
61 | .slider.round::before {
62 | border-radius: 50%;
63 | display: grid;
64 | place-items: center;
65 | }
66 |
67 | .slider::after {
68 | display: inline;
69 | position: absolute;
70 | right: 9.3%;
71 | bottom: 17.5%;
72 | }
73 |
74 | input:checked + .slider::after {
75 | display: inline;
76 | position: absolute;
77 | right: 56.3%;
78 | bottom: 14.5%;
79 | }
80 |
81 | .emoji {
82 | z-index: 10;
83 | display: flex;
84 | align-items: center;
85 | margin-left: 2px;
86 | }
87 |
88 | @media all and (max-width: 786px) and (min-width: 425px) {
89 | input:checked + .slider::after {
90 | right: 60.3%;
91 | bottom: 20.5%;
92 | }
93 | .slider::after {
94 | right: 15.3%;
95 | bottom: 22.5%;
96 | }
97 | }
98 |
99 | @media all and (max-width: 2560px) and (min-width: 1552px) {
100 | .slider::after {
101 | bottom: 12.5% !important;
102 | }
103 | }
104 |
105 | @media all and (max-width: 1552px) and (min-width: 1440px) {
106 | .slider::after {
107 | bottom: 7.5% !important;
108 | }
109 | }
110 |
--------------------------------------------------------------------------------
/src/components/button/Button.js:
--------------------------------------------------------------------------------
1 | import React from "react";
2 | import "./Button.scss";
3 |
4 | export default function Button({text, className, href, newTab}) {
5 | return (
6 |
11 | );
12 | }
13 |
--------------------------------------------------------------------------------
/src/components/button/Button.scss:
--------------------------------------------------------------------------------
1 | @import "../../_globalColor";
2 |
3 | .main-button {
4 | background-color: $buttonColor;
5 | border: solid 1px $buttonColor;
6 | color: $textColorDark;
7 | font-weight: 700;
8 | width: max-content;
9 | padding: 13px 22px;
10 | margin-right: 50px;
11 | text-transform: uppercase;
12 | border-radius: 6px;
13 | text-align: center;
14 | text-decoration: none;
15 | display: block;
16 | margin-top: 20px;
17 | font-size: 1rem;
18 | cursor: pointer;
19 | transition: all 0.3s ease-in-out 0s;
20 | }
21 | .main-button:hover {
22 | background-color: $darkBoxShadow2;
23 | color: $buttonColor;
24 | transition: all 0.3s ease 0s;
25 | transform: translateY(-3px);
26 | }
27 | .project-button {
28 | display: flex;
29 | justify-content: center;
30 | margin-top: 20px;
31 | }
32 | .project-button > .main-button {
33 | margin-right: 0 !important;
34 | }
35 | /* Media Query */
36 | @media (max-width: 768px) {
37 | .main-button {
38 | font-size: 0.938rem;
39 | padding: 12px 18px;
40 | margin-right: 0px;
41 | }
42 | }
43 | @media (max-width: 320px) {
44 | .main-button {
45 | font-size: 0.75rem;
46 | }
47 | }
48 |
--------------------------------------------------------------------------------
/src/components/displayLottie/DisplayLottie.js:
--------------------------------------------------------------------------------
1 | import React, {Component, Suspense} from "react";
2 | import Lottie from "lottie-react";
3 | import Loading from "../../containers/loading/Loading";
4 |
5 | export default class DisplayLottie extends Component {
6 | render() {
7 | const animationData = this.props.animationData;
8 | const defaultOptions = {
9 | loop: true,
10 | autoplay: true,
11 | animationData: animationData
12 | };
13 |
14 | return (
15 | }>
16 |
20 |
21 | );
22 | }
23 | }
24 |
--------------------------------------------------------------------------------
/src/components/footer/Footer.js:
--------------------------------------------------------------------------------
1 | import React, {useContext} from "react";
2 | import "./Footer.scss";
3 | import {Fade} from "react-reveal";
4 | import emoji from "react-easy-emoji";
5 | import StyleContext from "../../contexts/StyleContext";
6 |
7 | export default function Footer() {
8 | const {isDark} = useContext(StyleContext);
9 | return (
10 |
11 |
12 |
13 | {emoji("Made with ❤️ by SmartLuck Team")}
14 |
15 |
16 | Theme by{" "}
17 |
18 | smartluck1125
19 |
20 |
21 |
22 |
23 | );
24 | }
25 |
--------------------------------------------------------------------------------
/src/components/footer/Footer.scss:
--------------------------------------------------------------------------------
1 | @import "../../_globalColor";
2 |
3 | .footer-text {
4 | text-align: center;
5 | color: $subTitle !important;
6 | }
7 |
8 | .dark-mode {
9 | color: $textColorDark !important;
10 | }
11 |
12 | .footer-div {
13 | margin-top: 2rem;
14 | padding-bottom: 1rem;
15 | }
16 |
--------------------------------------------------------------------------------
/src/components/githubProfileCard/GithubProfileCard.js:
--------------------------------------------------------------------------------
1 | import React from "react";
2 | import "./GithubProfileCard.scss";
3 | import SocialMedia from "../../components/socialMedia/SocialMedia";
4 | import {contactInfo, isHireable} from "../../portfolio";
5 | import emoji from "react-easy-emoji";
6 | import {Fade} from "react-reveal";
7 |
8 | export default function GithubProfileCard({prof}) {
9 | if (isHireable) {
10 | prof.hireable = "Yes";
11 | } else {
12 | prof.hireable = "No";
13 | }
14 | return (
15 |
16 |
60 |
61 | );
62 | }
63 |
--------------------------------------------------------------------------------
/src/components/githubProfileCard/GithubProfileCard.scss:
--------------------------------------------------------------------------------
1 | @import "../../_globalColor";
2 |
3 | .profile-image {
4 | border-radius: 50%;
5 | border: 0.5rem solid $githubProfileCardBorder;
6 | margin-left: auto;
7 | width: 100%;
8 | max-width: 350px;
9 | height: auto;
10 | box-shadow: $lightBoxShadow 0 30px 30px -30px;
11 | transition: all 0.3s ease-out;
12 | }
13 |
14 | .profile-image:hover {
15 | box-shadow: none;
16 | }
17 |
18 | .prof-title {
19 | margin: 0;
20 | font-size: 40px;
21 | font-weight: 400;
22 | }
23 |
24 | .location-div {
25 | text-shadow: $githubProfileCardLocationTS;
26 | }
27 |
28 | .opp-div {
29 | padding-bottom: 1rem;
30 | }
31 |
32 | .row {
33 | display: flex;
34 | }
35 |
36 | .main-content-profile {
37 | flex: 80%;
38 | }
39 |
40 | .image-content-profile {
41 | text-align: right;
42 | flex: 20%;
43 | max-width: 100%;
44 | height: auto;
45 | }
46 |
47 | .bio-text {
48 | line-height: 30px;
49 | font-size: 22px;
50 | }
51 |
52 | .desc-prof {
53 | line-height: 45px;
54 | font-size: 19px;
55 | }
56 |
57 | .subTitle {
58 | color: $subTitle;
59 | }
60 |
61 | @media (max-width: 768px) {
62 | .row {
63 | display: flex;
64 | flex-direction: column;
65 | }
66 |
67 | .main-content-profile {
68 | text-align: center;
69 | order: 2;
70 | }
71 |
72 | .bio-text {
73 | font-size: 16px;
74 | }
75 |
76 | .image-content-profile {
77 | margin-left: auto;
78 | margin-right: auto;
79 | order: 1;
80 | }
81 |
82 | .desc-prof {
83 | line-height: 30px;
84 | font-size: 16px;
85 | }
86 |
87 | .profile-image {
88 | margin-left: auto;
89 | margin-right: auto;
90 | width: 100%;
91 | max-width: 250px;
92 | height: auto;
93 | }
94 |
95 | .profile-image:hover {
96 | box-shadow: $lightBoxShadow 0 50px 50px -50px;
97 | transition: 0.3s ease-out;
98 | }
99 |
100 | .prof-title {
101 | padding-bottom: 1rem;
102 | font-size: 32px;
103 | text-align: center;
104 | }
105 | }
106 |
--------------------------------------------------------------------------------
/src/components/githubRepoCard/GithubRepoCard.js:
--------------------------------------------------------------------------------
1 | import React from "react";
2 | import "./GithubRepoCard.scss";
3 | import {Fade} from "react-reveal";
4 | import {formatFileSizeDisplay} from "../../utils";
5 |
6 | export default function GithubRepoCard({repo, isDark}) {
7 | function openUrlInNewTab(url, name) {
8 | if (!url) {
9 | console.log(`URL in ${name} is undefined`);
10 | return;
11 | }
12 | var win = window.open(url, "_blank");
13 | win.focus();
14 | }
15 |
16 | return (
17 |
18 |
19 |
openUrlInNewTab(repo.node.url, repo.node.name)}
23 | >
24 |
25 |
38 |
{repo.node.name}
39 |
40 |
{repo.node.description}
41 |
42 |
43 | {repo.node.primaryLanguage !== null && (
44 |
45 |
49 | {repo.node.primaryLanguage.name}
50 |
51 | )}
52 |
53 |
67 | {repo.node.forkCount}
68 |
69 |
70 |
84 | {repo.node.stargazers.totalCount}
85 |
86 |
87 |
88 |
{formatFileSizeDisplay(repo.node.diskUsage)}
89 |
90 |
91 |
92 |
93 |
94 | );
95 | }
96 |
--------------------------------------------------------------------------------
/src/components/githubRepoCard/GithubRepoCard.scss:
--------------------------------------------------------------------------------
1 | @import "../../_globalColor";
2 |
3 | .repo-card-div {
4 | color: $githubRepoCardColor;
5 | background-color: $lightBackground2;
6 | box-shadow: $lightBoxShadowDark 0px 10px 30px -15px;
7 | padding: 2rem;
8 | cursor: pointer;
9 | -webkit-transition: all 0.3s ease;
10 | -o-transition: all 0.3s ease;
11 | transition: all 0.3s ease;
12 | }
13 | .repo-card-div:hover {
14 | box-shadow: $lightBoxShadowDark 0px 20px 30px -10px;
15 | }
16 |
17 | .repo-stats {
18 | display: flex;
19 | -webkit-box-pack: justify;
20 | justify-content: space-between;
21 | font-size: 13px;
22 | color: $githubRepoCardRepoCardStatsColor;
23 | }
24 |
25 | .repo-left-stat {
26 | -webkit-box-flex: 1;
27 | flex-grow: 1;
28 | display: flex;
29 | }
30 |
31 | .language-color {
32 | width: 10px;
33 | height: 10px;
34 | background-color: $githubRepoCardLanguageColorBG;
35 | margin-right: 0.25rem;
36 | border-radius: 100%;
37 | }
38 |
39 | .repo-left-stat span {
40 | display: flex;
41 | -webkit-box-align: center;
42 | align-items: center;
43 | margin-right: 0.75rem;
44 | }
45 |
46 | .repo-name-div {
47 | display: flex;
48 | align-items: center;
49 | }
50 |
51 | .repo-svg {
52 | margin-right: 0.5rem;
53 | min-width: 16px;
54 | }
55 |
56 | .repo-name {
57 | white-space: nowrap;
58 | text-overflow: ellipsis;
59 | color: $githubRepoCardRepoNameColor;
60 | margin-bottom: 0.75rem;
61 | font-size: 25px;
62 | font-weight: 700;
63 | letter-spacing: -0.5px;
64 | overflow: hidden;
65 | margin: 0px;
66 | height: 30px;
67 | }
68 |
69 | .repo-star-svg {
70 | margin-right: 0.3rem;
71 | }
72 |
73 | .repo-description {
74 | overflow: hidden;
75 | display: -webkit-box;
76 | -webkit-line-clamp: 2;
77 | -webkit-box-orient: vertical;
78 | }
79 |
80 | .dark-card-mode {
81 | background-color: $darkBackground;
82 | color: $textColorDark;
83 | }
84 | .dark-card-mode p {
85 | color: $textColorDark;
86 | }
87 |
88 | .dark-card-mode .repo-svg {
89 | fill: $textColorDark;
90 | }
91 |
92 | .dark-card-mode:hover {
93 | background-color: $buttonColor !important;
94 | box-shadow: 0px 0px 16px $darkBoxShadow;
95 | }
96 |
--------------------------------------------------------------------------------
/src/components/header/Header.js:
--------------------------------------------------------------------------------
1 | import React, {useContext} from "react";
2 | import Headroom from "react-headroom";
3 | import "./Header.scss";
4 | import ToggleSwitch from "../ToggleSwitch/ToggleSwitch";
5 | import StyleContext from "../../contexts/StyleContext";
6 | import {
7 | greeting,
8 | skillsSection,
9 | } from "../../portfolio";
10 |
11 | function Header() {
12 | const {isDark} = useContext(StyleContext);
13 | const viewSkills = skillsSection.display;
14 |
15 | return (
16 |
17 |
51 |
52 | );
53 | }
54 | export default Header;
55 |
--------------------------------------------------------------------------------
/src/components/header/Header.scss:
--------------------------------------------------------------------------------
1 | @import "../../_globalColor";
2 |
3 | /*React-headroom*/
4 | .headroom-wrapper {
5 | max-height: 100px;
6 | }
7 |
8 | /* header */
9 |
10 | .dark-menu {
11 | background-color: $darkBackground !important;
12 | color: $textColorDark;
13 | }
14 |
15 | .dark-menu li a {
16 | color: $textColorDark !important;
17 | }
18 |
19 | .dark-menu li a:hover {
20 | background-color: $buttonColor !important;
21 | }
22 |
23 | .header {
24 | background-color: $lightBackground1;
25 | max-width: 100%;
26 | padding: 15px 20px;
27 | margin: 0px auto;
28 | }
29 |
30 | .header ul {
31 | margin: 0;
32 | padding: 0;
33 | list-style: none;
34 | overflow: hidden;
35 | }
36 |
37 | .grey-color {
38 | color: $subTitle;
39 | }
40 |
41 | .header li a {
42 | display: block;
43 | padding: 15px 20px;
44 | color: $textColor;
45 | text-decoration: none;
46 | }
47 |
48 | .header li a:hover,
49 | .header .menu-btn:hover {
50 | background-color: $headerHoverBG;
51 | }
52 |
53 | .header .logo {
54 | display: block;
55 | flex: none;
56 | float: left;
57 | font-size: 1.5em;
58 | text-decoration: none;
59 | margin-top: 10px;
60 | line-height: normal;
61 | }
62 |
63 | .header .logo-name {
64 | font-family: "Agustina Regular";
65 | font-weight: bold;
66 | font-variant-ligatures: no-common-ligatures;
67 | -webkit-font-variant-ligatures: no-common-ligatures;
68 | padding: 0 10px;
69 | }
70 |
71 | /* menu */
72 |
73 | .header .menu {
74 | clear: both;
75 | max-height: 0;
76 | transition: max-height 0.2s ease-out;
77 | }
78 |
79 | /* menu icon */
80 |
81 | .header .menu-icon {
82 | cursor: pointer;
83 | display: inline-block;
84 | float: right;
85 | padding: 28px 20px;
86 | position: relative;
87 | user-select: none;
88 | }
89 |
90 | .header .menu-icon .navicon {
91 | background: $iconBackground;
92 | display: block;
93 | height: 2px;
94 | position: relative;
95 | transition: background 0.2s ease-out;
96 | width: 18px;
97 | }
98 |
99 | .header .menu-icon .navicon-dark {
100 | background: $textColorDark;
101 | }
102 |
103 | .header .menu-icon .navicon:before,
104 | .header .menu-icon .navicon:after {
105 | background: $iconBackground;
106 | content: "";
107 | display: block;
108 | height: 100%;
109 | position: absolute;
110 | transition: all 0.2s ease-out;
111 | width: 100%;
112 | }
113 |
114 | .header .menu-icon .navicon-dark:before,
115 | .header .menu-icon .navicon-dark:after {
116 | background: $textColorDark !important;
117 | content: "";
118 | display: block;
119 | height: 100%;
120 | position: absolute;
121 | transition: all 0.2s ease-out;
122 | width: 100%;
123 | }
124 |
125 | .header .menu-icon .navicon:before {
126 | top: 5px;
127 | }
128 |
129 | .header .menu-icon .navicon:after {
130 | top: -5px;
131 | }
132 |
133 | /* menu btn */
134 |
135 | .header .menu-btn {
136 | display: none;
137 | }
138 |
139 | .header .menu-btn:checked ~ .menu {
140 | max-height: 486px;
141 | }
142 |
143 | .header .menu-btn:checked ~ .menu-icon .navicon {
144 | background: transparent !important;
145 | }
146 |
147 | .header .menu-btn:checked ~ .menu-icon .navicon:before {
148 | transform: rotate(-45deg);
149 | }
150 |
151 | .header .menu-btn:checked ~ .menu-icon .navicon:after {
152 | transform: rotate(45deg);
153 | }
154 |
155 | .header .menu-btn:checked ~ .menu-icon:not(.steps) .navicon:before,
156 | .header .menu-btn:checked ~ .menu-icon:not(.steps) .navicon:after {
157 | top: 0;
158 | }
159 |
160 | /* 48em = 768px */
161 |
162 | @media (min-width: 48em) {
163 | .header li {
164 | float: left;
165 | }
166 | .header {
167 | display: flex;
168 | align-items: center;
169 | justify-content: space-between;
170 | }
171 | .header .menu {
172 | max-height: none;
173 | }
174 | .header .menu-icon {
175 | display: none;
176 | }
177 | }
178 | @media (max-width: 960px) and (min-width: 768px) {
179 | .header {
180 | font-size: 12px;
181 | }
182 | }
183 |
--------------------------------------------------------------------------------
/src/components/socialMedia/SocialMedia.js:
--------------------------------------------------------------------------------
1 | import React from "react";
2 | import "./SocialMedia.scss";
3 | import {socialMediaLinks} from "../../portfolio";
4 |
5 | export default function socialMedia() {
6 | if (!socialMediaLinks.display) {
7 | return null;
8 | }
9 | return (
10 |
11 | {socialMediaLinks.github ? (
12 |
18 |
19 |
20 |
21 | ) : null}
22 |
23 | {socialMediaLinks.linkedin ? (
24 |
30 |
31 |
32 |
33 | ) : null}
34 |
35 | {socialMediaLinks.gmail ? (
36 |
42 |
43 |
44 |
45 | ) : null}
46 |
47 | {socialMediaLinks.gitlab ? (
48 |
54 |
55 |
56 |
57 | ) : null}
58 |
59 | {socialMediaLinks.facebook ? (
60 |
66 |
67 |
68 |
69 | ) : null}
70 |
71 | {socialMediaLinks.instagram ? (
72 |
78 |
79 |
80 |
81 | ) : null}
82 |
83 | {socialMediaLinks.twitter ? (
84 |
90 |
91 |
92 |
93 | ) : null}
94 |
95 | {socialMediaLinks.medium ? (
96 |
102 |
103 |
104 |
105 | ) : null}
106 |
107 | {socialMediaLinks.stackoverflow ? (
108 |
114 |
115 |
116 |
117 | ) : null}
118 |
119 | {socialMediaLinks.kaggle ? (
120 |
126 |
127 |
128 |
129 | ) : null}
130 |
131 | );
132 | }
133 |
--------------------------------------------------------------------------------
/src/components/socialMedia/SocialMedia.scss:
--------------------------------------------------------------------------------
1 | @import "../../_globalColor";
2 |
3 | .social-media-div {
4 | font-size: 2em;
5 | }
6 |
7 | .icon-button {
8 | margin-bottom: 10px;
9 | }
10 |
11 | .icon-button i {
12 | color: $textColorDark;
13 | border-radius: 2.6rem;
14 | cursor: pointer;
15 | display: inline-block;
16 | font-size: 1.3rem;
17 | height: 2.6rem;
18 | line-height: 2.6rem;
19 | margin: 0 5px;
20 | position: relative;
21 | text-align: center;
22 | -webkit-user-select: none;
23 | -moz-user-select: none;
24 | -ms-user-select: none;
25 | user-select: none;
26 | width: 2.6rem;
27 | margin-bottom: 10px;
28 | transition: 0.2s ease-in;
29 | }
30 |
31 | .facebook i {
32 | background-color: $faceBook;
33 | }
34 |
35 | .linkedin i {
36 | background-color: $linkedin;
37 | }
38 |
39 | .github i {
40 | background-color: $github;
41 | }
42 |
43 | .gitlab i {
44 | background-color: $gitlab;
45 | }
46 |
47 | .google i {
48 | background-color: $google;
49 | }
50 |
51 | .twitter i {
52 | background-color: $twitter;
53 | }
54 |
55 | .medium i {
56 | background-color: $medium;
57 | }
58 |
59 | .stack-overflow i {
60 | background-color: $stackoverflow;
61 | }
62 |
63 | .kaggle i {
64 | background-color: $kaggle;
65 | }
66 |
67 | .instagram i {
68 | background-color: $instagram;
69 | }
70 |
71 | /* Hover Transition */
72 | .twitter i:hover,
73 | .google i:hover,
74 | .gitlab i:hover,
75 | .github i:hover,
76 | .linkedin i:hover,
77 | .facebook i:hover,
78 | .instagram i:hover,
79 | .stack-overflow i:hover,
80 | .kaggle i:hover,
81 | .medium i:hover {
82 | background-color: $textColor;
83 | }
84 |
85 | /* Media Query */
86 | @media (max-width: 768px) {
87 | .social-media-div {
88 | text-align: center;
89 | }
90 | }
91 |
--------------------------------------------------------------------------------
/src/components/softwareSkills/SoftwareSkill.js:
--------------------------------------------------------------------------------
1 | import React from "react";
2 | import "./SoftwareSkill.scss";
3 | import {skillsSection} from "../../portfolio";
4 |
5 | export default function SoftwareSkill() {
6 | return (
7 |
8 |
9 |
10 | {skillsSection.softwareSkills.map((skills, i) => {
11 | return (
12 | -
17 |
18 |
{skills.skillName}
19 |
20 | );
21 | })}
22 |
23 |
24 |
25 | );
26 | }
27 |
--------------------------------------------------------------------------------
/src/components/softwareSkills/SoftwareSkill.scss:
--------------------------------------------------------------------------------
1 | @import "../../_globalColor";
2 |
3 | .dev-icons {
4 | padding-left: 0;
5 | list-style: none;
6 | font-size: 3rem;
7 | margin-bottom: 0px;
8 | margin-top: 0px;
9 | text-align: center;
10 | }
11 |
12 | .software-skill-inline {
13 | display: inline-block;
14 | margin-right: 20px;
15 | margin-bottom: 20px;
16 | }
17 |
18 | .software-skill-inline > i {
19 | color: $subTitle;
20 | }
21 |
22 | .software-skill-inline > i:hover {
23 | color: $skillsColor;
24 | }
25 | .software-skill-inline > p {
26 | color: $subTitle;
27 | font-size: 10px;
28 | }
29 | .software-skill-inline > i:hover ~ p {
30 | color: $skillsColor;
31 | }
32 |
--------------------------------------------------------------------------------
/src/containers/Main.js:
--------------------------------------------------------------------------------
1 | import React, {useEffect, useState} from "react";
2 | import Header from "../components/header/Header";
3 | import Greeting from "./greeting/Greeting";
4 | import Skills from "./skills/Skills";
5 | import StackProgress from "./skillProgress/skillProgress";
6 | import Footer from "../components/footer/Footer";
7 | import ScrollToTopButton from "./topbutton/Top";
8 | import Profile from "./profile/Profile";
9 | import SplashScreen from "./splashScreen/SplashScreen";
10 | import {splashScreen} from "../portfolio";
11 | import {StyleProvider} from "../contexts/StyleContext";
12 | import {useLocalStorage} from "../hooks/useLocalStorage";
13 | import "./Main.scss";
14 |
15 | const Main = () => {
16 | const darkPref = window.matchMedia("(prefers-color-scheme: dark)");
17 | const [isDark, setIsDark] = useLocalStorage("isDark", darkPref.matches);
18 | const [isShowingSplashAnimation, setIsShowingSplashAnimation] =
19 | useState(false);
20 |
21 | useEffect(() => {
22 | if (splashScreen.enabled) {
23 | const splashTimer = setTimeout(
24 | () => setIsShowingSplashAnimation(false),
25 | splashScreen.duration
26 | );
27 | return () => {
28 | clearTimeout(splashTimer);
29 | };
30 | }
31 | }, []);
32 |
33 | const changeTheme = () => {
34 | setIsDark(!isDark);
35 | };
36 |
37 | return (
38 |
39 |
40 | {isShowingSplashAnimation && splashScreen.enabled ? (
41 |
42 | ) : (
43 | <>
44 |
45 |
46 |
47 |
48 |
49 |
50 |
51 | >
52 | )}
53 |
54 |
55 | );
56 | };
57 |
58 | export default Main;
59 |
--------------------------------------------------------------------------------
/src/containers/Main.scss:
--------------------------------------------------------------------------------
1 | @import "../_globalColor";
2 |
3 | .dark-mode {
4 | background-color: $darkBackground;
5 | color: white;
6 | transition: "0.1s";
7 | }
8 |
--------------------------------------------------------------------------------
/src/containers/contact/Contact.js:
--------------------------------------------------------------------------------
1 | import React, {useContext} from "react";
2 | import "./Contact.scss";
3 | import SocialMedia from "../../components/socialMedia/SocialMedia";
4 | import {illustration, contactInfo} from "../../portfolio";
5 | import {Fade} from "react-reveal";
6 | import email from "../../assets/lottie/email";
7 | import DisplayLottie from "../../components/displayLottie/DisplayLottie";
8 | import StyleContext from "../../contexts/StyleContext";
9 |
10 | export default function Contact() {
11 | const {isDark} = useContext(StyleContext);
12 | return (
13 |
14 |
67 |
68 | );
69 | }
70 |
--------------------------------------------------------------------------------
/src/containers/contact/Contact.scss:
--------------------------------------------------------------------------------
1 | @import "../../_globalColor";
2 |
3 | .contact-div-main {
4 | display: flex;
5 | }
6 |
7 | .dark-mode a {
8 | color: $textColorDark;
9 | }
10 |
11 | .contact-div-main > * {
12 | flex: 1;
13 | }
14 |
15 | .contact-title {
16 | font-size: 65px;
17 | font-weight: 400;
18 | }
19 |
20 | .contact-detail,
21 | .contact-detail-email {
22 | margin-top: 20px;
23 | font-size: 40px;
24 | font-weight: 400;
25 | color: $subTitle;
26 | text-decoration: none;
27 | }
28 |
29 | .contact-detail:hover,
30 | .contact-detail-email:hover {
31 | color: $textColor;
32 | text-shadow: 2px 1px 2px $contactDetailHoverTS;
33 | transition: all 0.3s;
34 | }
35 |
36 | .contact-subtitle {
37 | text-transform: uppercase;
38 | }
39 |
40 | .contact-text-div {
41 | margin-top: 1.5rem;
42 | }
43 |
44 | .contact-margin-top {
45 | margin-top: 4rem;
46 | }
47 |
48 | .contact-image-div > img {
49 | max-width: 100%;
50 | height: auto;
51 | margin-left: 1.5rem;
52 | margin-top: -4rem;
53 | }
54 |
55 | /* Media Query */
56 | @media (max-width: 1380px), (max-width: 768px) {
57 | .contact-title {
58 | font-size: 56px;
59 | font-weight: 400;
60 | text-align: center;
61 | }
62 |
63 | .contact-title {
64 | font-size: 40px;
65 | text-align: center;
66 | }
67 |
68 | .contact-subtitle {
69 | font-size: 16px;
70 | line-height: normal;
71 | text-align: center;
72 | }
73 |
74 | .contact-text-div {
75 | text-align: center;
76 | margin-top: 1.5rem;
77 | }
78 |
79 | .contact-detail,
80 | .contact-detail-email {
81 | font-size: 20px;
82 | }
83 |
84 | .contact-image-div {
85 | display: none;
86 | }
87 | }
88 |
--------------------------------------------------------------------------------
/src/containers/greeting/Greeting.js:
--------------------------------------------------------------------------------
1 | import React, {useContext} from "react";
2 | import {Fade} from "react-reveal";
3 | import emoji from "react-easy-emoji";
4 | import "./Greeting.scss";
5 | import landingPerson from "../../assets/lottie/landingPerson";
6 | import DisplayLottie from "../../components/displayLottie/DisplayLottie";
7 | import SocialMedia from "../../components/socialMedia/SocialMedia";
8 | import Button from "../../components/button/Button";
9 |
10 | import {illustration, greeting} from "../../portfolio";
11 | import StyleContext from "../../contexts/StyleContext";
12 |
13 | export default function Greeting() {
14 | const {isDark} = useContext(StyleContext);
15 | if (!greeting.displayGreeting) {
16 | return null;
17 | }
18 | return (
19 |
20 |
21 |
22 |
23 |
24 |
27 | {" "}
28 | {greeting.title}{" "}
29 | {emoji("👋")}
30 |
31 |
38 | {greeting.subTitle}
39 |
40 |
41 |
42 |
43 | {greeting.resumeLink && (
44 |
49 | )}
50 |
51 |
52 |
53 |
54 | {illustration.animated ? (
55 |
})
59 |
60 | ) : (
61 |
62 | )}
63 |
64 |
65 |
66 |
67 | );
68 | }
69 |
--------------------------------------------------------------------------------
/src/containers/greeting/Greeting.scss:
--------------------------------------------------------------------------------
1 | @import "../../_globalColor";
2 |
3 | .main {
4 | width: 90%;
5 | padding: 20px 10px;
6 | margin: 0px auto;
7 | margin-top: 4rem;
8 | }
9 | .greet-main {
10 | width: 90%;
11 | padding: 20px 10px;
12 | margin: 0px auto;
13 | margin-top: 2rem;
14 | }
15 |
16 | .greeting-main {
17 | display: flex;
18 | }
19 |
20 | .subTitle {
21 | color: $subTitle !important;
22 | }
23 |
24 | .greeting-main {
25 | display: flex;
26 | }
27 |
28 | .greeting-main > * {
29 | flex: 1;
30 | margin-bottom: 30px;
31 | }
32 | .button-greeting-div {
33 | display: flex;
34 | margin-top: 20px;
35 | }
36 |
37 | .greeting-text {
38 | font-size: 70px;
39 | line-height: 1.1;
40 | color: $textColor !important;
41 | }
42 |
43 | .greeting-text-p {
44 | font-size: 30px;
45 | line-height: 40px;
46 | }
47 |
48 | .greeting-image-div > img {
49 | max-width: 100%;
50 | height: auto;
51 | }
52 |
53 | .wave-emoji {
54 | animation-duration: 1.8s;
55 | animation-iteration-count: infinite;
56 | animation-name: wave;
57 | display: inline-block;
58 | transform-origin: 70% 70%;
59 | }
60 |
61 | @keyframes wave {
62 | 0% {
63 | transform: rotate(0deg);
64 | }
65 | 10% {
66 | transform: rotate(-10deg);
67 | }
68 | 20% {
69 | transform: rotate(12deg);
70 | }
71 | 30% {
72 | transform: rotate(-10deg);
73 | }
74 | 40% {
75 | transform: rotate(9deg);
76 | }
77 | 50% {
78 | transform: rotate(0deg);
79 | }
80 | 100% {
81 | transform: rotate(0deg);
82 | }
83 | }
84 |
85 | /* Media Query */
86 | @media (max-width: 1380px) {
87 | .greeting-text {
88 | font-size: 50px;
89 | }
90 | .greeting-text-p {
91 | font-size: 20px;
92 | }
93 | }
94 | @media (max-width: 768px) {
95 | .button-greeting-div {
96 | justify-content: space-around;
97 | }
98 | .greeting-text {
99 | font-size: 30px;
100 | text-align: center;
101 | }
102 | .greeting-text-p {
103 | font-size: 16px;
104 | line-height: normal;
105 | text-align: center;
106 | }
107 | .greeting-main {
108 | display: block;
109 | }
110 | .greeting-image-div {
111 | height: 256px;
112 | }
113 | }
114 |
115 | @media (max-width: 320px) {
116 | .main {
117 | width: auto;
118 | }
119 | }
120 |
--------------------------------------------------------------------------------
/src/containers/loading/Loading.js:
--------------------------------------------------------------------------------
1 | import React from "react";
2 | import "./loading.scss";
3 |
4 | export default function Loading() {
5 | return (
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 | );
23 | }
24 |
--------------------------------------------------------------------------------
/src/containers/loading/loading.scss:
--------------------------------------------------------------------------------
1 | @import "../../_globalColor";
2 |
3 | .sk-circle {
4 | margin: 100px auto;
5 | width: 40px;
6 | height: 40px;
7 | position: relative;
8 | }
9 | .sk-circle .sk-child {
10 | width: 100%;
11 | height: 100%;
12 | position: absolute;
13 | left: 0;
14 | top: 0;
15 | }
16 | .sk-circle .sk-child:before {
17 | content: "";
18 | display: block;
19 | margin: 0 auto;
20 | width: 15%;
21 | height: 15%;
22 | background-color: $iconBackground;
23 | border-radius: 100%;
24 | -webkit-animation: sk-circleBounceDelay 1.2s infinite ease-in-out both;
25 | animation: sk-circleBounceDelay 1.2s infinite ease-in-out both;
26 | }
27 | .sk-circle .sk-circle2 {
28 | -webkit-transform: rotate(30deg);
29 | -ms-transform: rotate(30deg);
30 | transform: rotate(30deg);
31 | }
32 | .sk-circle .sk-circle3 {
33 | -webkit-transform: rotate(60deg);
34 | -ms-transform: rotate(60deg);
35 | transform: rotate(60deg);
36 | }
37 | .sk-circle .sk-circle4 {
38 | -webkit-transform: rotate(90deg);
39 | -ms-transform: rotate(90deg);
40 | transform: rotate(90deg);
41 | }
42 | .sk-circle .sk-circle5 {
43 | -webkit-transform: rotate(120deg);
44 | -ms-transform: rotate(120deg);
45 | transform: rotate(120deg);
46 | }
47 | .sk-circle .sk-circle6 {
48 | -webkit-transform: rotate(150deg);
49 | -ms-transform: rotate(150deg);
50 | transform: rotate(150deg);
51 | }
52 | .sk-circle .sk-circle7 {
53 | -webkit-transform: rotate(180deg);
54 | -ms-transform: rotate(180deg);
55 | transform: rotate(180deg);
56 | }
57 | .sk-circle .sk-circle8 {
58 | -webkit-transform: rotate(210deg);
59 | -ms-transform: rotate(210deg);
60 | transform: rotate(210deg);
61 | }
62 | .sk-circle .sk-circle9 {
63 | -webkit-transform: rotate(240deg);
64 | -ms-transform: rotate(240deg);
65 | transform: rotate(240deg);
66 | }
67 | .sk-circle .sk-circle10 {
68 | -webkit-transform: rotate(270deg);
69 | -ms-transform: rotate(270deg);
70 | transform: rotate(270deg);
71 | }
72 | .sk-circle .sk-circle11 {
73 | -webkit-transform: rotate(300deg);
74 | -ms-transform: rotate(300deg);
75 | transform: rotate(300deg);
76 | }
77 | .sk-circle .sk-circle12 {
78 | -webkit-transform: rotate(330deg);
79 | -ms-transform: rotate(330deg);
80 | transform: rotate(330deg);
81 | }
82 | .sk-circle .sk-circle2:before {
83 | -webkit-animation-delay: -1.1s;
84 | animation-delay: -1.1s;
85 | }
86 | .sk-circle .sk-circle3:before {
87 | -webkit-animation-delay: -1s;
88 | animation-delay: -1s;
89 | }
90 | .sk-circle .sk-circle4:before {
91 | -webkit-animation-delay: -0.9s;
92 | animation-delay: -0.9s;
93 | }
94 | .sk-circle .sk-circle5:before {
95 | -webkit-animation-delay: -0.8s;
96 | animation-delay: -0.8s;
97 | }
98 | .sk-circle .sk-circle6:before {
99 | -webkit-animation-delay: -0.7s;
100 | animation-delay: -0.7s;
101 | }
102 | .sk-circle .sk-circle7:before {
103 | -webkit-animation-delay: -0.6s;
104 | animation-delay: -0.6s;
105 | }
106 | .sk-circle .sk-circle8:before {
107 | -webkit-animation-delay: -0.5s;
108 | animation-delay: -0.5s;
109 | }
110 | .sk-circle .sk-circle9:before {
111 | -webkit-animation-delay: -0.4s;
112 | animation-delay: -0.4s;
113 | }
114 | .sk-circle .sk-circle10:before {
115 | -webkit-animation-delay: -0.3s;
116 | animation-delay: -0.3s;
117 | }
118 | .sk-circle .sk-circle11:before {
119 | -webkit-animation-delay: -0.2s;
120 | animation-delay: -0.2s;
121 | }
122 | .sk-circle .sk-circle12:before {
123 | -webkit-animation-delay: -0.1s;
124 | animation-delay: -0.1s;
125 | }
126 |
127 | @-webkit-keyframes sk-circleBounceDelay {
128 | 0%,
129 | 80%,
130 | 100% {
131 | -webkit-transform: scale(0);
132 | transform: scale(0);
133 | }
134 | 40% {
135 | -webkit-transform: scale(1);
136 | transform: scale(1);
137 | }
138 | }
139 |
140 | @keyframes sk-circleBounceDelay {
141 | 0%,
142 | 80%,
143 | 100% {
144 | -webkit-transform: scale(0);
145 | transform: scale(0);
146 | }
147 | 40% {
148 | -webkit-transform: scale(1);
149 | transform: scale(1);
150 | }
151 | }
152 |
--------------------------------------------------------------------------------
/src/containers/profile/Profile.js:
--------------------------------------------------------------------------------
1 | import React, {useState, useEffect, lazy, Suspense} from "react";
2 | import {openSource} from "../../portfolio";
3 | import Contact from "../contact/Contact";
4 | import Loading from "../loading/Loading";
5 |
6 | const renderLoader = () => ;
7 | const GithubProfileCard = lazy(() =>
8 | import("../../components/githubProfileCard/GithubProfileCard")
9 | );
10 | export default function Profile() {
11 | const [prof, setrepo] = useState([]);
12 | function setProfileFunction(array) {
13 | setrepo(array);
14 | }
15 |
16 | useEffect(() => {
17 | if (openSource.showGithubProfile === "true") {
18 | const getProfileData = () => {
19 | fetch("/profile.json")
20 | .then(result => {
21 | if (result.ok) {
22 | return result.json();
23 | }
24 | })
25 | .then(response => {
26 | setProfileFunction(response.data.user);
27 | })
28 | .catch(function (error) {
29 | console.error(
30 | `${error} (because of this error GitHub contact section could not be displayed. Contact section has reverted to default)`
31 | );
32 | setProfileFunction("Error");
33 | openSource.showGithubProfile = "false";
34 | });
35 | };
36 | getProfileData();
37 | }
38 | }, []);
39 | if (
40 | openSource.display &&
41 | openSource.showGithubProfile === "true" &&
42 | !(typeof prof === "string" || prof instanceof String)
43 | ) {
44 | return (
45 |
46 |
47 |
48 | );
49 | } else {
50 | return ;
51 | }
52 | }
53 |
--------------------------------------------------------------------------------
/src/containers/skillProgress/Progress.scss:
--------------------------------------------------------------------------------
1 | @import "../../_globalColor";
2 |
3 | .meter {
4 | height: 20px;
5 | position: relative;
6 | background: $progressBarBackground;
7 | -moz-border-radius: 25px;
8 | -webkit-border-radius: 25px;
9 | border-radius: 25px;
10 | }
11 | .meter > span {
12 | display: block;
13 | height: 100%;
14 | border-top-right-radius: 6px;
15 | border-bottom-right-radius: 6px;
16 | border-top-left-radius: 20px;
17 | border-bottom-left-radius: 20px;
18 | background-color: $progressBarSpanBG;
19 | position: relative;
20 | overflow: hidden;
21 | }
22 | .skill {
23 | line-height: 3.5vw;
24 | }
25 | .skill-bars {
26 | font-size: 28px;
27 | width: 40%;
28 | }
29 | .skills-container {
30 | display: flex;
31 | width: 90%;
32 | padding: 20px 10px;
33 | margin: 0px auto;
34 | margin-top: 2rem;
35 | }
36 | .skills-container > * {
37 | flex: 1;
38 | margin-bottom: 30px;
39 | }
40 | .skills-image > img {
41 | margin-left: 80px;
42 | max-width: 90%;
43 | height: auto;
44 | }
45 |
46 | /* Media Query */
47 |
48 | @media (max-width: 1456px) {
49 | .skills-bar {
50 | line-height: 4rem;
51 | }
52 | .skills-image {
53 | display: none;
54 | order: 2;
55 | }
56 | }
57 |
58 | @media (max-width: 768px) {
59 | .skills-container {
60 | flex-direction: column;
61 | }
62 | .skills-bar {
63 | line-height: 3rem;
64 | margin: 20px;
65 | }
66 | .skills-image {
67 | display: none;
68 | order: 2;
69 | }
70 | }
71 |
--------------------------------------------------------------------------------
/src/containers/skillProgress/skillProgress.js:
--------------------------------------------------------------------------------
1 | import React from "react";
2 | import "./Progress.scss";
3 | import {illustration, techStack} from "../../portfolio";
4 | import {Fade} from "react-reveal";
5 | import Build from "../../assets/lottie/build";
6 | import DisplayLottie from "../../components/displayLottie/DisplayLottie";
7 |
8 | export default function StackProgress() {
9 | if (techStack.viewSkillBars) {
10 | return (
11 |
12 |
13 |
14 |
Proficiency
15 | {techStack.experience.map((exp, i) => {
16 | const progressStyle = {
17 | width: exp.progressPercentage
18 | };
19 | return (
20 |
21 |
{exp.Stack}
22 |
23 |
24 |
25 |
26 | );
27 | })}
28 |
29 |
30 |
31 | {illustration.animated ? (
32 |
33 | ) : (
34 |
})
38 | )}
39 |
40 |
41 |
42 | );
43 | }
44 | return null;
45 | }
46 |
--------------------------------------------------------------------------------
/src/containers/skills/Skills.js:
--------------------------------------------------------------------------------
1 | import React, {useContext} from "react";
2 | import "./Skills.scss";
3 | import SoftwareSkill from "../../components/softwareSkills/SoftwareSkill";
4 | import {illustration, skillsSection} from "../../portfolio";
5 | import {Fade} from "react-reveal";
6 | import codingPerson from "../../assets/lottie/codingPerson";
7 | import DisplayLottie from "../../components/displayLottie/DisplayLottie";
8 | import StyleContext from "../../contexts/StyleContext";
9 |
10 | export default function Skills() {
11 | const {isDark} = useContext(StyleContext);
12 | if (!skillsSection.display) {
13 | return null;
14 | }
15 | return (
16 |
17 |
18 |
19 |
20 | {illustration.animated ? (
21 |
})
26 | ) : (
27 |
28 | )}
29 |
30 |
31 |
32 |
33 |
36 | {skillsSection.title}{" "}
37 |
38 |
45 | {skillsSection.subTitle}
46 |
47 |
48 |
49 | {skillsSection.skills.map((skills, i) => {
50 | return (
51 |
59 | {skills}
60 |
61 | );
62 | })}
63 |
64 |
65 |
66 |
67 |
68 | );
69 | }
70 |
--------------------------------------------------------------------------------
/src/containers/skills/Skills.scss:
--------------------------------------------------------------------------------
1 | @import "../../_globalColor";
2 |
3 | .skills-main-div {
4 | display: flex;
5 | width: 100%;
6 | overflow: hidden;
7 | }
8 |
9 | .skills-text-div {
10 | margin-left: 50px;
11 | }
12 |
13 | .skills-main-div > * {
14 | flex: 1;
15 | margin-bottom: 30px;
16 | }
17 |
18 | .skills-image-div > img {
19 | max-width: 100%;
20 | height: auto;
21 | }
22 |
23 | .skills-heading {
24 | font-size: 56px;
25 | font-weight: 400;
26 | }
27 | .subTitle {
28 | color: $subTitle;
29 | }
30 |
31 | /* Media Query */
32 | @media (max-width: 1380px) {
33 | .skills-heading {
34 | font-size: 40px;
35 | }
36 | }
37 | @media (max-width: 768px) {
38 | .skills-heading {
39 | font-size: 30px;
40 | text-align: center;
41 | }
42 | .greeting-text-p {
43 | font-size: 16px;
44 | line-height: normal;
45 | }
46 | .skills-main-div {
47 | flex-direction: column;
48 | }
49 | .skills-text-div {
50 | margin-left: 0px;
51 | margin: 20px;
52 | }
53 | .skills-text {
54 | font-size: 16px;
55 | }
56 | .skills-text-subtitle {
57 | font-size: 16px;
58 | text-align: center;
59 | }
60 | .skills-image-div {
61 | /* display: none; */
62 | order: 2;
63 | }
64 | }
65 |
--------------------------------------------------------------------------------
/src/containers/splashScreen/SplashScreen.css:
--------------------------------------------------------------------------------
1 | .splash-container {
2 | display: flex;
3 | flex-direction: column;
4 | justify-content: center;
5 | align-items: center;
6 | min-height: 100vh;
7 | }
8 |
9 | .splash-animation-container {
10 | height: 50vh;
11 | }
12 |
13 | .splash-title-container {
14 | font-size: 2.5rem;
15 | text-decoration: none;
16 | }
17 | .splash-title {
18 | font-family: "Agustina Regular", cursive;
19 | font-weight: bold;
20 | font-variant-ligatures: no-common-ligatures;
21 | -webkit-font-variant-ligatures: no-common-ligatures;
22 | padding: 0 20px;
23 | }
24 |
--------------------------------------------------------------------------------
/src/containers/splashScreen/SplashScreen.js:
--------------------------------------------------------------------------------
1 | import React, {useContext} from "react";
2 | import "./SplashScreen.css";
3 | import DisplayLottie from "../../components/displayLottie/DisplayLottie";
4 | import {greeting, splashScreen} from "../../portfolio";
5 | import StyleContext from "../../contexts/StyleContext";
6 |
7 | export default function SplashScreen() {
8 | const {isDark} = useContext(StyleContext);
9 | return (
10 |
11 |
12 |
13 |
14 |
15 | <
16 | {greeting.username}
17 | />
18 |
19 |
20 | );
21 | }
22 |
--------------------------------------------------------------------------------
/src/containers/topbutton/Top.js:
--------------------------------------------------------------------------------
1 | import React from "react";
2 | import "./Top.scss";
3 |
4 | export default function Top() {
5 | function TopEvent() {
6 | document.body.scrollTop = 0; // For Safari
7 | document.documentElement.scrollTop = 0; // For Chrome, Firefox, IE and Opera
8 | }
9 | // When the user scrolls down 20px from the top of the document, show the button
10 | function scrollFunction() {
11 | if (
12 | document.body.scrollTop > 20 ||
13 | document.documentElement.scrollTop > 20
14 | ) {
15 | document.getElementById("topButton").style.visibility = "visible";
16 | } else {
17 | document.getElementById("topButton").style.visibility = "hidden";
18 | }
19 | }
20 | window.onscroll = function () {
21 | scrollFunction();
22 | };
23 | window.onload = function () {
24 | scrollFunction();
25 | }; //To make sure that this button is not visible at starting.
26 | // When the user clicks on the button, scroll to the top of the document
27 | return (
28 |
31 | );
32 | }
33 |
--------------------------------------------------------------------------------
/src/containers/topbutton/Top.scss:
--------------------------------------------------------------------------------
1 | @import "../../_globalColor";
2 |
3 | #topButton {
4 | visibility: hidden;
5 | position: fixed;
6 | bottom: 20px;
7 | right: 30px;
8 | z-index: 99;
9 | border: none;
10 | outline: none;
11 | background-color: $buttonColor;
12 | color: white;
13 | cursor: pointer;
14 | padding: 15px;
15 | border-radius: 15px;
16 | font-size: 25px;
17 | }
18 |
19 | #topButton:hover {
20 | background-color: $topButtonHover;
21 | transition: all ease-in-out 0.2s;
22 | }
23 |
--------------------------------------------------------------------------------
/src/contexts/StyleContext.js:
--------------------------------------------------------------------------------
1 | import React from "react";
2 |
3 | const StyleContext = React.createContext();
4 |
5 | export const StyleProvider = StyleContext.Provider;
6 | export const StyleConsumer = StyleContext.Consumer;
7 |
8 | export default StyleContext;
9 |
--------------------------------------------------------------------------------
/src/hooks/useLocalStorage.js:
--------------------------------------------------------------------------------
1 | import {useState} from "react";
2 |
3 |
4 | export const useLocalStorage = (key, initialValue) => {
5 | // State to store our value
6 | // Pass initial state function to useState so logic is only executed once
7 | const [storedValue, setStoredValue] = useState(() => {
8 | try {
9 | // Get from local storage by key
10 | const item = window.localStorage.getItem(key);
11 | // Parse stored json or if none return initialValue
12 | return item ? JSON.parse(item) : initialValue;
13 | } catch (error) {
14 | // If error also return initialValue
15 | console.log(error);
16 | return initialValue;
17 | }
18 | });
19 |
20 | // Return a wrapped version of useState's setter function that ...
21 | // ... persists the new value to localStorage.
22 | const setValue = value => {
23 | try {
24 | // Allow value to be a function so we have same API as useState
25 | const valueToStore =
26 | value instanceof Function ? value(storedValue) : value;
27 | // Save state
28 | setStoredValue(valueToStore);
29 | // Save to local storage
30 | window.localStorage.setItem(key, JSON.stringify(valueToStore));
31 | } catch (error) {
32 | // A more advanced implementation would handle the error case
33 | console.log(error);
34 | }
35 | };
36 |
37 | return [storedValue, setValue];
38 | };
39 |
--------------------------------------------------------------------------------
/src/index.css:
--------------------------------------------------------------------------------
1 | @font-face {
2 | font-family: "Agustina Regular";
3 | font-style: normal;
4 | font-weight: normal;
5 | src: local("Agustina Regular"),
6 | url("./assets/fonts/Agustina.woff") format("woff");
7 | font-display: swap;
8 | }
9 |
10 | @font-face {
11 | font-family: "Montserrat";
12 | src: local("Montserrat"),
13 | url("./assets/fonts/Montserrat-Regular.ttf") format("woff");
14 | font-display: swap;
15 | }
16 |
17 | code {
18 | font-family: source-code-pro, Menlo, Monaco, Consolas, "Courier New",
19 | monospace;
20 | }
21 | html,
22 | body {
23 | scroll-behavior: smooth;
24 | }
25 | body {
26 | margin: 0;
27 | font: 19px / 23px Montserrat, "Montserrat", sans-serif;
28 | -webkit-font-smoothing: antialiased;
29 | -moz-osx-font-smoothing: grayscale;
30 | }
31 | /* Media Query */
32 | @media (max-width: 1380px) {
33 | html,
34 | body {
35 | font-size: rem;
36 | line-height: normal;
37 | }
38 | }
39 |
--------------------------------------------------------------------------------
/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 * as serviceWorker from "./serviceWorker";
6 |
7 |
8 | ReactDOM.render(, document.getElementById("root"));
9 |
10 | // If you want your app to work offline and load faster, you can change
11 | // unregister() to register() below. Note this comes with some pitfalls.
12 | // Learn more about service workers: https://bit.ly/CRA-PWA
13 | serviceWorker.unregister();
14 |
--------------------------------------------------------------------------------
/src/logo.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/src/portfolio.js:
--------------------------------------------------------------------------------
1 | /* Change this file to get your personal Portfolio */
2 |
3 | // To change portfolio colors globally go to the _globalColor.scss file
4 |
5 | import emoji from "react-easy-emoji";
6 | import splashAnimation from "./assets/lottie/splashAnimation";
7 |
8 |
9 | const splashScreen = {
10 | enabled: true,
11 | animation: splashAnimation,
12 | duration: 2000
13 | };
14 |
15 |
16 |
17 | const illustration = {
18 | animated: true
19 | };
20 |
21 | const greeting = {
22 | username: "Smart Luck",
23 | title: "Hi all, I'm Sm@rtLuck1125",
24 | subTitle: emoji(
25 | "A passionate Full Stack Software Developer 🚀 having an experience of building Web with JavaScript / Reactjs / Nodejs and some other cool libraries and frameworks."
26 | ),
27 | resumeLink:
28 | "https://drive.google.com/file/d/1X1Q5S-x78Dfn1n-eRiFcjT6TWvsxpuhW/view?usp=sharing",
29 | displayGreeting: true
30 | };
31 |
32 | // Social Media Links
33 |
34 | const socialMediaLinks = {
35 | github: "https://github.com/smartluck1125",
36 | linkedin: "https://www.linkedin.com/in/",
37 | gmail: "akiktajohnson@gmail.com",
38 | gitlab: "https://gitlab.com/smartluck1125",
39 | display: false
40 | };
41 |
42 | // Skills Section
43 |
44 | const skillsSection = {
45 | title: "What I do",
46 | subTitle: "CRAZY FULL STACK DEVELOPER WHO WANTS TO EXPLORE EVERY TECH STACK",
47 | skills: [
48 | emoji(
49 | "⚡ Develop highly interactive Front end / User Interfaces for your web and mobile applications"
50 | ),
51 | emoji("⚡ Progressive Web Applications ( PWA ) in normal and SPA Stacks"),
52 | emoji(
53 | "⚡ Integration of third party services such as Firebase/ AWS / Digital Ocean"
54 | )
55 | ],
56 |
57 | softwareSkills: [
58 | {
59 | skillName: "JavaScript",
60 | fontAwesomeClassname: "fab fa-js"
61 | },
62 | {
63 | skillName: "React.js/Next.js",
64 | fontAwesomeClassname: "fab fa-react"
65 | },
66 | {
67 | skillName: "Nodejs",
68 | fontAwesomeClassname: "fab fa-node"
69 | },
70 | {
71 | skillName: "Django",
72 | fontAwesomeClassname: "fas fa-django"
73 | },
74 | {
75 | skillName: "Sass",
76 | fontAwesomeClassname: "fab fa-sass"
77 | },
78 | {
79 | skillName: "MySQL/PostgreSQL/MongoDB/Prisma",
80 | fontAwesomeClassname: "fas fa-database"
81 | },
82 | {
83 | skillName: "Python",
84 | fontAwesomeClassname: "fab fa-python"
85 | },
86 | {
87 | skillName: "Docker",
88 | fontAwesomeClassname: "fab fa-docker"
89 | }
90 | ],
91 | display: true
92 | };
93 |
94 |
95 |
96 |
97 | const techStack = {
98 | viewSkillBars: true,
99 | experience: [
100 | {
101 | Stack: "Frontend/Design",
102 | progressPercentage: "80%"
103 | },
104 | {
105 | Stack: "Backend",
106 | progressPercentage: "90%"
107 | },
108 | {
109 | Stack: "Programming",
110 | progressPercentage: "60%"
111 | }
112 | ],
113 | displayCodersrank: false
114 | };
115 |
116 |
117 |
118 | const openSource = {
119 | showGithubProfile: "true",
120 | display: true
121 | };
122 |
123 |
124 | const contactInfo = {
125 | title: emoji("Contact Me ☎️"),
126 | subtitle:
127 | "Discuss a project or just want to say hi? My Inbox is open for all.",
128 | number: "+1 (619) 483-0971",
129 | email_address: "onemoretimeforu@outlook.com"
130 | };
131 |
132 | const isHireable = false;
133 |
134 | export {
135 | illustration,
136 | greeting,
137 | socialMediaLinks,
138 | splashScreen,
139 | skillsSection,
140 | techStack,
141 | openSource,
142 | contactInfo,
143 | isHireable
144 | };
145 |
--------------------------------------------------------------------------------
/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 |
--------------------------------------------------------------------------------
/src/serviceWorker.js:
--------------------------------------------------------------------------------
1 | // This optional code is used to register a service worker.
2 | // register() is not called by default.
3 |
4 | // This lets the app load faster on subsequent visits in production, and gives
5 | // it offline capabilities. However, it also means that developers (and users)
6 | // will only see deployed updates on subsequent visits to a page, after all the
7 | // existing tabs open on the page have been closed, since previously cached
8 | // resources are updated in the background.
9 |
10 | // To learn more about the benefits of this model and instructions on how to
11 | // opt-in, read https://bit.ly/CRA-PWA
12 |
13 | const isLocalhost = Boolean(
14 | window.location.hostname === 'localhost' ||
15 | // [::1] is the IPv6 localhost address.
16 | window.location.hostname === '[::1]' ||
17 | // 127.0.0.1/8 is considered localhost for IPv4.
18 | window.location.hostname.match(
19 | /^127(?:\.(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)){3}$/
20 | )
21 | );
22 |
23 | export function register(config) {
24 | if (process.env.NODE_ENV === 'production' && 'serviceWorker' in navigator) {
25 | // The URL constructor is available in all browsers that support SW.
26 | const publicUrl = new URL(process.env.PUBLIC_URL, window.location.href);
27 | if (publicUrl.origin !== window.location.origin) {
28 | // Our service worker won't work if PUBLIC_URL is on a different origin
29 | // from what our page is served on. This might happen if a CDN is used to
30 | // serve assets; see https://github.com/facebook/create-react-app/issues/2374
31 | return;
32 | }
33 |
34 | window.addEventListener('load', () => {
35 | const swUrl = `${process.env.PUBLIC_URL}/service-worker.js`;
36 |
37 | if (isLocalhost) {
38 | // This is running on localhost. Let's check if a service worker still exists or not.
39 | checkValidServiceWorker(swUrl, config);
40 |
41 | // Add some additional logging to localhost, pointing developers to the
42 | // service worker/PWA documentation.
43 | navigator.serviceWorker.ready.then(() => {
44 | console.log(
45 | 'This web app is being served cache-first by a service ' +
46 | 'worker. To learn more, visit https://bit.ly/CRA-PWA'
47 | );
48 | });
49 | } else {
50 | // Is not localhost. Just register service worker
51 | registerValidSW(swUrl, config);
52 | }
53 | });
54 | }
55 | }
56 |
57 | function registerValidSW(swUrl, config) {
58 | navigator.serviceWorker
59 | .register(swUrl)
60 | .then(registration => {
61 | registration.onupdatefound = () => {
62 | const installingWorker = registration.installing;
63 | if (installingWorker == null) {
64 | return;
65 | }
66 | installingWorker.onstatechange = () => {
67 | if (installingWorker.state === 'installed') {
68 | if (navigator.serviceWorker.controller) {
69 | // At this point, the updated precached content has been fetched,
70 | // but the previous service worker will still serve the older
71 | // content until all client tabs are closed.
72 | console.log(
73 | 'New content is available and will be used when all ' +
74 | 'tabs for this page are closed. See https://bit.ly/CRA-PWA.'
75 | );
76 |
77 | // Execute callback
78 | if (config && config.onUpdate) {
79 | config.onUpdate(registration);
80 | }
81 | } else {
82 | // At this point, everything has been precached.
83 | // It's the perfect time to display a
84 | // "Content is cached for offline use." message.
85 | console.log('Content is cached for offline use.');
86 |
87 | // Execute callback
88 | if (config && config.onSuccess) {
89 | config.onSuccess(registration);
90 | }
91 | }
92 | }
93 | };
94 | };
95 | })
96 | .catch(error => {
97 | console.error('Error during service worker registration:', error);
98 | });
99 | }
100 |
101 | function checkValidServiceWorker(swUrl, config) {
102 | // Check if the service worker can be found. If it can't reload the page.
103 | fetch(swUrl)
104 | .then(response => {
105 | // Ensure service worker exists, and that we really are getting a JS file.
106 | const contentType = response.headers.get('content-type');
107 | if (
108 | response.status === 404 ||
109 | (contentType != null && contentType.indexOf('javascript') === -1)
110 | ) {
111 | // No service worker found. Probably a different app. Reload the page.
112 | navigator.serviceWorker.ready.then(registration => {
113 | registration.unregister().then(() => {
114 | window.location.reload();
115 | });
116 | });
117 | } else {
118 | // Service worker found. Proceed as normal.
119 | registerValidSW(swUrl, config);
120 | }
121 | })
122 | .catch(() => {
123 | console.log(
124 | 'No internet connection found. App is running in offline mode.'
125 | );
126 | });
127 | }
128 |
129 | export function unregister() {
130 | if ('serviceWorker' in navigator) {
131 | navigator.serviceWorker.ready.then(registration => {
132 | registration.unregister();
133 | });
134 | }
135 | }
136 |
--------------------------------------------------------------------------------
/src/setupTests.js:
--------------------------------------------------------------------------------
1 | import "jest-canvas-mock";
2 | import {configure} from "enzyme";
3 | import Adapter from "enzyme-adapter-react-16";
4 |
5 | configure({adapter: new Adapter()});
6 |
--------------------------------------------------------------------------------
/src/utils.js:
--------------------------------------------------------------------------------
1 | export const formatFileSizeDisplay = value => {
2 | if (value < 1024) {
3 | return `${value} KB`;
4 | }
5 | return `${parseFloat((value / 1024).toFixed(1))} MB`;
6 | };
7 |
--------------------------------------------------------------------------------