├── .gitignore
├── assets
├── icons
│ ├── Icon.png
│ ├── down-arrow.png
│ ├── close-mobile.png
│ ├── skills
│ │ ├── icon-01.png
│ │ ├── icon-02.png
│ │ └── icon-03.png
│ ├── hamburger-menu-24.png
│ ├── social-icons
│ │ ├── github.png
│ │ ├── medium.png
│ │ ├── twitter.png
│ │ ├── angellist.png
│ │ └── Linkedin-icon.png
│ └── modal-icons
│ │ └── desktop-icons
│ │ ├── gitHub-icon.png
│ │ └── view-source.png
├── placeholders
│ └── dummy.png
└── backgrounds
│ ├── footer-bg.png
│ ├── about-me-mobile.png
│ ├── header-mobile@2x.png
│ ├── desktop
│ ├── footer-img-1.png
│ ├── footer-img-2.png
│ ├── footer-img-3.png
│ ├── Header-desktop.png
│ ├── about-me-left-desktop.png
│ ├── about-me-right-desktop.png
│ ├── illustration-about-me-2-desktop.svg
│ ├── illustration-about me-1-desktop.svg
│ └── Header-llustration-desktop.svg
│ ├── about-me-mobile-header-bg.png
│ └── project-images
│ ├── project-img-mobile.png
│ └── snapshoot-portfolio.png
├── .hintrc
├── .eslintrc.json
├── .stylelintrc.json
├── package.json
├── js
├── storeData.js
├── script.js
└── projectObject.js
├── README.md
├── .github
└── workflows
│ └── linters.yml
├── css
└── style.css
└── index.html
/.gitignore:
--------------------------------------------------------------------------------
1 | node_modules
2 |
--------------------------------------------------------------------------------
/assets/icons/Icon.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/RitobrotoMukherjee/Work-Portfolio/HEAD/assets/icons/Icon.png
--------------------------------------------------------------------------------
/assets/icons/down-arrow.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/RitobrotoMukherjee/Work-Portfolio/HEAD/assets/icons/down-arrow.png
--------------------------------------------------------------------------------
/assets/icons/close-mobile.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/RitobrotoMukherjee/Work-Portfolio/HEAD/assets/icons/close-mobile.png
--------------------------------------------------------------------------------
/assets/placeholders/dummy.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/RitobrotoMukherjee/Work-Portfolio/HEAD/assets/placeholders/dummy.png
--------------------------------------------------------------------------------
/assets/backgrounds/footer-bg.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/RitobrotoMukherjee/Work-Portfolio/HEAD/assets/backgrounds/footer-bg.png
--------------------------------------------------------------------------------
/assets/icons/skills/icon-01.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/RitobrotoMukherjee/Work-Portfolio/HEAD/assets/icons/skills/icon-01.png
--------------------------------------------------------------------------------
/assets/icons/skills/icon-02.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/RitobrotoMukherjee/Work-Portfolio/HEAD/assets/icons/skills/icon-02.png
--------------------------------------------------------------------------------
/assets/icons/skills/icon-03.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/RitobrotoMukherjee/Work-Portfolio/HEAD/assets/icons/skills/icon-03.png
--------------------------------------------------------------------------------
/assets/icons/hamburger-menu-24.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/RitobrotoMukherjee/Work-Portfolio/HEAD/assets/icons/hamburger-menu-24.png
--------------------------------------------------------------------------------
/assets/icons/social-icons/github.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/RitobrotoMukherjee/Work-Portfolio/HEAD/assets/icons/social-icons/github.png
--------------------------------------------------------------------------------
/assets/icons/social-icons/medium.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/RitobrotoMukherjee/Work-Portfolio/HEAD/assets/icons/social-icons/medium.png
--------------------------------------------------------------------------------
/assets/icons/social-icons/twitter.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/RitobrotoMukherjee/Work-Portfolio/HEAD/assets/icons/social-icons/twitter.png
--------------------------------------------------------------------------------
/assets/backgrounds/about-me-mobile.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/RitobrotoMukherjee/Work-Portfolio/HEAD/assets/backgrounds/about-me-mobile.png
--------------------------------------------------------------------------------
/assets/backgrounds/header-mobile@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/RitobrotoMukherjee/Work-Portfolio/HEAD/assets/backgrounds/header-mobile@2x.png
--------------------------------------------------------------------------------
/assets/icons/social-icons/angellist.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/RitobrotoMukherjee/Work-Portfolio/HEAD/assets/icons/social-icons/angellist.png
--------------------------------------------------------------------------------
/assets/backgrounds/desktop/footer-img-1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/RitobrotoMukherjee/Work-Portfolio/HEAD/assets/backgrounds/desktop/footer-img-1.png
--------------------------------------------------------------------------------
/assets/backgrounds/desktop/footer-img-2.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/RitobrotoMukherjee/Work-Portfolio/HEAD/assets/backgrounds/desktop/footer-img-2.png
--------------------------------------------------------------------------------
/assets/backgrounds/desktop/footer-img-3.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/RitobrotoMukherjee/Work-Portfolio/HEAD/assets/backgrounds/desktop/footer-img-3.png
--------------------------------------------------------------------------------
/assets/icons/social-icons/Linkedin-icon.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/RitobrotoMukherjee/Work-Portfolio/HEAD/assets/icons/social-icons/Linkedin-icon.png
--------------------------------------------------------------------------------
/assets/backgrounds/desktop/Header-desktop.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/RitobrotoMukherjee/Work-Portfolio/HEAD/assets/backgrounds/desktop/Header-desktop.png
--------------------------------------------------------------------------------
/assets/backgrounds/about-me-mobile-header-bg.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/RitobrotoMukherjee/Work-Portfolio/HEAD/assets/backgrounds/about-me-mobile-header-bg.png
--------------------------------------------------------------------------------
/assets/backgrounds/desktop/about-me-left-desktop.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/RitobrotoMukherjee/Work-Portfolio/HEAD/assets/backgrounds/desktop/about-me-left-desktop.png
--------------------------------------------------------------------------------
/assets/backgrounds/desktop/about-me-right-desktop.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/RitobrotoMukherjee/Work-Portfolio/HEAD/assets/backgrounds/desktop/about-me-right-desktop.png
--------------------------------------------------------------------------------
/assets/icons/modal-icons/desktop-icons/gitHub-icon.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/RitobrotoMukherjee/Work-Portfolio/HEAD/assets/icons/modal-icons/desktop-icons/gitHub-icon.png
--------------------------------------------------------------------------------
/assets/icons/modal-icons/desktop-icons/view-source.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/RitobrotoMukherjee/Work-Portfolio/HEAD/assets/icons/modal-icons/desktop-icons/view-source.png
--------------------------------------------------------------------------------
/assets/backgrounds/project-images/project-img-mobile.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/RitobrotoMukherjee/Work-Portfolio/HEAD/assets/backgrounds/project-images/project-img-mobile.png
--------------------------------------------------------------------------------
/assets/backgrounds/project-images/snapshoot-portfolio.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/RitobrotoMukherjee/Work-Portfolio/HEAD/assets/backgrounds/project-images/snapshoot-portfolio.png
--------------------------------------------------------------------------------
/.hintrc:
--------------------------------------------------------------------------------
1 | {
2 | "connector": {
3 | "name": "local",
4 | "options": {
5 | "pattern": ["**", "!.git/**", "!node_modules/**"]
6 | }
7 | },
8 | "extends": ["development"],
9 | "formatters": ["stylish"],
10 | "hints": [
11 | "button-type",
12 | "disown-opener",
13 | "html-checker",
14 | "meta-charset-utf-8",
15 | "meta-viewport",
16 | "no-inline-styles:error"
17 | ]
18 | }
--------------------------------------------------------------------------------
/.eslintrc.json:
--------------------------------------------------------------------------------
1 | {
2 | "env": {
3 | "browser": true,
4 | "es6": true,
5 | "jest": true
6 | },
7 | "parser": "babel-eslint",
8 | "parserOptions": {
9 | "ecmaVersion": 2018,
10 | "sourceType": "module"
11 | },
12 | "extends": ["airbnb-base"],
13 | "rules": {
14 | "no-shadow": "off",
15 | "no-param-reassign": "off",
16 | "eol-last": "off",
17 | "import/extensions": [ 1, {
18 | "js": "always", "json": "always"
19 | }]
20 | },
21 | "ignorePatterns": [
22 | "dist/",
23 | "build/"
24 | ]
25 | }
26 |
--------------------------------------------------------------------------------
/.stylelintrc.json:
--------------------------------------------------------------------------------
1 | {
2 | "extends": ["stylelint-config-standard"],
3 | "plugins": ["stylelint-scss", "stylelint-csstree-validator"],
4 | "rules": {
5 | "at-rule-no-unknown": [
6 | true,
7 | {
8 | "ignoreAtRules": ["tailwind", "apply", "variants", "responsive", "screen"]
9 | }
10 | ],
11 | "scss/at-rule-no-unknown": [
12 | true,
13 | {
14 | "ignoreAtRules": ["tailwind", "apply", "variants", "responsive", "screen"]
15 | }
16 | ],
17 | "csstree/validator": true
18 | },
19 | "ignoreFiles": ["build/**", "dist/**", "**/reset*.css", "**/bootstrap*.css", "**/*.js", "**/*.jsx"]
20 | }
21 |
--------------------------------------------------------------------------------
/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "work-portfolio",
3 | "version": "1.0.0",
4 | "description": "It's a Full Stack Software Developer portfolio.",
5 | "main": "index.js",
6 | "dependencies": {
7 | "hint": "^6.1.11",
8 | "stylelint": "^13.13.1",
9 | "stylelint-config-standard": "^21.0.0",
10 | "stylelint-csstree-validator": "^1.9.0",
11 | "stylelint-scss": "^3.21.0"
12 | },
13 | "devDependencies": {
14 | "babel-eslint": "^10.1.0",
15 | "eslint": "^7.32.0",
16 | "eslint-config-airbnb-base": "^14.2.1",
17 | "eslint-plugin-import": "^2.26.0"
18 | },
19 | "scripts": {
20 | "test": "echo \"Error: no test specified\" && exit 1"
21 | },
22 | "repository": {
23 | "type": "git",
24 | "url": "git+https://github.com/RitobrotoMukherjee/Work-Portfolio.git"
25 | },
26 | "keywords": [],
27 | "author": "",
28 | "license": "ISC",
29 | "bugs": {
30 | "url": "https://github.com/RitobrotoMukherjee/Work-Portfolio/issues"
31 | },
32 | "homepage": "https://github.com/RitobrotoMukherjee/Work-Portfolio#readme"
33 | }
34 |
--------------------------------------------------------------------------------
/js/storeData.js:
--------------------------------------------------------------------------------
1 | const inputFields = document.querySelectorAll('.input-fields');
2 |
3 | const getLocalDataValue = () => {
4 | if (localStorage.getItem('form-data') !== null) {
5 | return JSON.parse(localStorage.getItem('form-data'));
6 | }
7 | return false;
8 | };
9 |
10 | const localData = getLocalDataValue();
11 |
12 | const formDataObj = {
13 | name: localData ? localData.name : '',
14 | email: localData ? localData.email : '',
15 | message: localData ? localData.message : '',
16 | };
17 |
18 | const dataStoreLocal = (ev) => {
19 | const { target } = ev;
20 | const value = target.value.trim();
21 | if (target.name === 'name') {
22 | formDataObj.name = value;
23 | }
24 | if (target.name === 'email') {
25 | formDataObj.email = value;
26 | }
27 | if (target.name === 'message') {
28 | formDataObj.message = value;
29 | }
30 | return localStorage.setItem('form-data', JSON.stringify(formDataObj));
31 | };
32 |
33 | inputFields.forEach((item) => item.addEventListener('input', dataStoreLocal));
34 |
35 | document.getElementById('input-name').value = formDataObj.name;
36 | document.getElementById('input-email').value = formDataObj.email;
37 | document.getElementById('input-message').value = formDataObj.message;
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # Portfolio
2 | It's a responsive Full Stack Software Developer portfolio.
3 |
4 | ## GitHub Pages Link
5 |
6 | - [@Ritobroto Portfolio](https://ritobrotomukherjee.github.io/Work-Portfolio/)
7 |
8 | ## Built With
9 |
10 | - HTML5
11 | - CSS3
12 | - Linter
13 |
14 | ## Getting Started
15 |
16 | - NodeJs, npm needs to be installed in system
17 |
18 | ## Install
19 |
20 | - Run ``` npm install ```
21 |
22 | ## Authors
23 |
24 | 👤 **Ritobroto Mukherjee**
25 |
26 | - Portfolio: [@Rito](https://ritobrotomukherjee.github.io/Work-Portfolio/)
27 | - GitHub: [@RitobrotoMukherjee](https://github.com/RitobrotoMukherjee)
28 | - Twitter: [@RitobrotoM3](https://twitter.com/RitobrotoM3)
29 | - LinkedIn: [Ritobroto Mukherjee](https://www.linkedin.com/in/ritobroto-mukherjee-519148ba/)
30 |
31 | 👤 **Mohamed Jadib**
32 |
33 | - Portfolio: [@MJ](https://jadibdev.github.io/)
34 | - GitHub: [@jadibdev](https://github.com/jadibdev)
35 | - Twitter: [@MohamedJadib](https://twitter.com/MohamedJadib)
36 | - LinkedIn: [LinkedIn](https://www.linkedin.com/in/mohamed-jadib-942a5041/)
37 |
38 | ## 🤝 Contributing
39 |
40 | Contributions, issues, and feature requests are welcome!
41 |
42 | ## Show your support
43 |
44 | Give a ⭐️ if you like this project!
45 |
46 | ## Acknowledgments
47 |
48 | - Microverse: [View Site](https://www.microverse.org/)
49 |
50 | ## Code Reviewer
51 |
52 | - Eze Promise: [codepantha](https://github.com/codepantha)
53 | - Zain Sadaqat: [zainsadaqat](https://github.com/zainsadaqat)
54 | - Oluwafemi Awoyemi: [phelian23](https://github.com/phelian23)
55 | - George Magdy: [@gemmen29](https://github.com/gemmen29)
--------------------------------------------------------------------------------
/js/script.js:
--------------------------------------------------------------------------------
1 | const toggleMenuButton = document.querySelectorAll('.toggle-mobile-menu');
2 | const seeCloseProjectButton = document.querySelectorAll('.see-close-project');
3 | const contactForm = document.getElementById('contact-form');
4 | const formErrorDiv = document.getElementById('error-div');
5 | const email = document.getElementById('input-email');
6 |
7 | const toggleDisplay = (section) => {
8 | section.classList.toggle('display-none');
9 | };
10 |
11 | function togglePopUp() {
12 | let div = document.querySelector('#mobile-popup');
13 | if (window.innerWidth >= 768) {
14 | div = document.querySelector('#desktop-pop-up');
15 | }
16 | toggleDisplay(div);
17 | }
18 |
19 | function toggleMobileMenuView() {
20 | const section = document.querySelector('#mobile-menu');
21 | toggleDisplay(section);
22 | }
23 |
24 | toggleMenuButton.forEach((item) => {
25 | item.addEventListener('click', toggleMobileMenuView);
26 | });
27 |
28 | seeCloseProjectButton.forEach((item) => {
29 | item.addEventListener('click', togglePopUp);
30 | });
31 |
32 | // Form validation
33 |
34 | const validationWithMessage = () => {
35 | const errorP = document.getElementById('error-message');
36 | if (email.value === email.value.toLowerCase()) {
37 | formErrorDiv.style.width = '0px';
38 | formErrorDiv.style.visibility = 'hidden';
39 | return false;
40 | }
41 | formErrorDiv.style.visibility = 'visible';
42 | formErrorDiv.style.width = '301.865px';
43 | errorP.textContent = `Email Has to be in lower case, You passed: ${email.value}`;
44 | return true;
45 | };
46 |
47 | contactForm.addEventListener('submit', (ev) => {
48 | ev.preventDefault();
49 | const error = validationWithMessage();
50 | if (!error) {
51 | formErrorDiv.style.visibility = 'hidden';
52 | contactForm.submit();
53 | }
54 | });
55 |
--------------------------------------------------------------------------------
/.github/workflows/linters.yml:
--------------------------------------------------------------------------------
1 | name: Linters
2 |
3 | on: pull_request
4 |
5 | env:
6 | FORCE_COLOR: 1
7 |
8 | jobs:
9 | lighthouse:
10 | name: Lighthouse
11 | runs-on: ubuntu-18.04
12 | steps:
13 | - uses: actions/checkout@v2
14 | - uses: actions/setup-node@v1
15 | with:
16 | node-version: "12.x"
17 | - name: Setup Lighthouse
18 | run: npm install -g @lhci/cli@0.7.x
19 | - name: Lighthouse Report
20 | run: lhci autorun --upload.target=temporary-public-storage --collect.staticDistDir=.
21 | webhint:
22 | name: Webhint
23 | runs-on: ubuntu-18.04
24 | steps:
25 | - uses: actions/checkout@v2
26 | - uses: actions/setup-node@v1
27 | with:
28 | node-version: "12.x"
29 | - name: Setup Webhint
30 | run: |
31 | npm install --save-dev hint@6.x
32 | [ -f .hintrc ] || wget https://raw.githubusercontent.com/microverseinc/linters-config/master/html-css-js/.hintrc
33 | - name: Webhint Report
34 | run: npx hint .
35 | stylelint:
36 | name: Stylelint
37 | runs-on: ubuntu-18.04
38 | steps:
39 | - uses: actions/checkout@v2
40 | - uses: actions/setup-node@v1
41 | with:
42 | node-version: "12.x"
43 | - name: Setup Stylelint
44 | run: |
45 | npm install --save-dev stylelint@13.x stylelint-scss@3.x stylelint-config-standard@21.x stylelint-csstree-validator@1.x
46 | [ -f .stylelintrc.json ] || wget https://raw.githubusercontent.com/microverseinc/linters-config/master/html-css-js/.stylelintrc.json
47 | - name: Stylelint Report
48 | run: npx stylelint "**/*.{css,scss}"
49 | eslint:
50 | name: ESLint
51 | runs-on: ubuntu-18.04
52 | steps:
53 | - uses: actions/checkout@v2
54 | - uses: actions/setup-node@v1
55 | with:
56 | node-version: "12.x"
57 | - name: Setup ESLint
58 | run: |
59 | npm install --save-dev eslint@7.x eslint-config-airbnb-base@14.x eslint-plugin-import@2.x babel-eslint@10.x
60 | [ -f .eslintrc.json ] || wget https://raw.githubusercontent.com/microverseinc/linters-config/master/html-css-js/.eslintrc.json
61 | - name: ESLint Report
62 | run: npx eslint .
63 |
--------------------------------------------------------------------------------
/js/projectObject.js:
--------------------------------------------------------------------------------
1 | const getProjectListParentDiv = document.getElementById('project-lists');
2 | const range = document.createRange();
3 | const projectList = [];
4 |
5 | for (let i = 1; i <= 6; i += 1) {
6 | const projectObj = {
7 | name: 'Multi-Post Stories Gain+Glory',
8 | description: "Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled it 1960s with the releaLorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled it 1960s with the release",
9 | featured_image: './assets/placeholders/dummy.png',
10 | technologies: ['Ruby On Rails', 'CSS', 'JavaScript', 'HTML'],
11 | live: '#',
12 | source: '#',
13 | };
14 | projectList.push(projectObj);
15 | }
16 |
17 | // Process 1. Time Space Complexity O(log n) - Best Performance
18 | // Can be achieved same with string concatenation if not familiar with template literals.
19 |
20 | const getListHtml = (skillsArr) => skillsArr.map((item) => `
${item} `).join(' ');
21 |
22 | for (let index = 0; index < projectList.length; index += 1) {
23 | const html = `
24 |
25 |
26 |
27 |
28 |
29 |
30 | ${getListHtml(projectList[index].technologies)}
31 |
32 |
33 | See Project
34 |
35 |
36 |
`;
37 | const fragment = range.createContextualFragment(html);
38 | getProjectListParentDiv.append(fragment);
39 | }
40 |
41 | // Process 2. Time Space Complexity O(n). - Ok performance
42 | // Even design pattern looks bad cause fucntion will be very big in size in case of huge div
43 |
44 | // const createMainElements = (elem, classes) => {
45 | // const mainElem = document.createElement(elem);
46 | // if (classes !== '') {
47 | // const classesList = classes.split(' ');
48 | // mainElem.classList.add(...classesList);
49 | // }
50 | // return mainElem;
51 | // };
52 |
53 | // for (let index = 0; index < projectList.length; index += 1) {
54 | // const mainDiv = createMainElements('div', 'portfolio-grid-items card');
55 |
56 | // const imageContainer = createMainElements('div', 'image-container');
57 |
58 | // const image = createMainElements('img', '');
59 | // image.src = projectList[index].featured_image;
60 | // image.alt = `Project ${index + 1} image`;
61 | // imageContainer.appendChild(image);
62 |
63 | // const projectDesc = createMainElements('div', 'project-description text-center');
64 |
65 | // const title = createMainElements('h3', 'title-header');
66 | // title.textContent = projectList[index].name;
67 |
68 | // const technologies = createMainElements('ul', 'category-list');
69 | // for (let i = 0; i < projectList[index].technologies.length; i += 1) {
70 | // const li = createMainElements('li', 'category-items');
71 | // li.textContent = projectList[index].technologies[i];
72 | // technologies.appendChild(li);
73 | // }
74 |
75 | // const button = createMainElements('button', 'button text-center see-close-project');
76 | // button.type = 'button';
77 | // button.id = `project-${index + 1}`;
78 | // button.dataProjectIndex = index;
79 | // button.textContent = 'See Project';
80 |
81 | // projectDesc.appendChild(title);
82 | // projectDesc.appendChild(technologies);
83 | // projectDesc.appendChild(button);
84 |
85 | // mainDiv.appendChild(imageContainer);
86 | // mainDiv.appendChild(projectDesc);
87 |
88 | // getProjectListParentDiv.append(mainDiv);
89 | // }
--------------------------------------------------------------------------------
/assets/backgrounds/desktop/illustration-about-me-2-desktop.svg:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
26 |
27 |
28 |
29 |
30 |
31 |
32 |
33 |
--------------------------------------------------------------------------------
/assets/backgrounds/desktop/illustration-about me-1-desktop.svg:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
26 |
27 |
28 |
29 |
30 |
31 |
32 |
33 |
34 |
--------------------------------------------------------------------------------
/css/style.css:
--------------------------------------------------------------------------------
1 | @import url('https://fonts.googleapis.com/css2?family=Inter&display=swap');
2 |
3 | * {
4 | margin: 0;
5 | padding: 0;
6 | font-family: 'Inter', sans-serif;
7 | }
8 |
9 | .display-none {
10 | display: none;
11 | }
12 |
13 | ul {
14 | list-style: none;
15 | }
16 |
17 | a {
18 | text-decoration: none;
19 | color: #42526e;
20 | }
21 |
22 | a:hover {
23 | color: #36b37f;
24 | }
25 |
26 | .button {
27 | height: 45px;
28 | width: 120px;
29 | border-radius: 4px;
30 | border-color: #36b37f;
31 | padding: 10px;
32 | color: #fff;
33 | background-color: #008552;
34 | }
35 |
36 | .button-enabled {
37 | background-color: #36b37f;
38 | }
39 |
40 | .button:hover {
41 | background-color: #36b37f;
42 | }
43 |
44 | .button:active {
45 | background-color: #008552;
46 | }
47 |
48 | .long-btn {
49 | width: 150px;
50 | }
51 |
52 | .card:hover {
53 | box-shadow: 1px 5px 10px 5px rgb(225, 220, 220);
54 | }
55 |
56 | #mobile-navbar {
57 | display: flex;
58 | justify-content: space-between;
59 | align-items: center;
60 | flex-wrap: wrap;
61 | padding: 15px 20px;
62 | }
63 |
64 | .mobile-menu-background {
65 | background: #e5e5e5;
66 | height: 100vh;
67 | z-index: 1;
68 | position: fixed;
69 | top: 0;
70 | left: 0;
71 | width: 100%;
72 | }
73 |
74 | .menu-mobile-div {
75 | position: relative;
76 | background: #fff;
77 | height: 100vh;
78 | border-bottom-left-radius: 95px;
79 | border-bottom-right-radius: 95px;
80 | }
81 |
82 | .close-menu {
83 | position: absolute;
84 | right: 29px;
85 | top: 32px;
86 | color: #67798e;
87 | cursor: pointer;
88 | font-size: 14px;
89 | }
90 |
91 | .mobile-menu {
92 | display: flex;
93 | flex-direction: column;
94 | text-align: justify;
95 | padding: 76px 28px;
96 | }
97 |
98 | .mobile-menu-items {
99 | font-weight: 600;
100 | font-size: 32px;
101 | line-height: 44px;
102 | color: #3a4a42;
103 | margin-top: 30px;
104 | }
105 |
106 | .mobile-menu-items:first-child {
107 | margin-top: 10px;
108 | }
109 |
110 | .welcome-logo {
111 | font-style: normal;
112 | font-weight: 600;
113 | font-size: 20px;
114 | line-height: 28px;
115 | color: #28352f;
116 | text-decoration: none;
117 | }
118 |
119 | .menu-link {
120 | color: #505f79;
121 | height: 26px;
122 | display: flex;
123 | justify-content: center;
124 | align-items: center;
125 | list-style-type: none;
126 | }
127 |
128 | .dektop-menu-items {
129 | margin: 0 15px;
130 | transition: margin 0.75s, transform 1s;
131 | }
132 |
133 | .form-errors {
134 | color: rgb(197, 6, 6);
135 | border: 1px solid rgb(201, 35, 35);
136 | padding: 10px;
137 | border-radius: 4px;
138 | overflow: hidden;
139 | font-weight: bold;
140 | margin: 5px 0;
141 | visibility: hidden;
142 | width: 0%;
143 | transition: visibility 1s, width 2s;
144 | }
145 |
146 | .error-paragraph {
147 | font-size: 10px;
148 | line-height: 14px;
149 | padding: 10px 10px;
150 | }
151 |
152 | .main-section {
153 | background-image: url("../assets/backgrounds/header-mobile@2x.png");
154 | background-repeat: no-repeat;
155 | background-position: center center;
156 | background-size: cover;
157 | display: flex;
158 | justify-content: center;
159 | align-items: center;
160 | flex-direction: column;
161 | min-height: 100px;
162 | top: 92px;
163 | }
164 |
165 | .section-basic {
166 | display: flex;
167 | flex-direction: column;
168 | justify-content: center;
169 | align-items: center;
170 | min-height: 100px;
171 | min-width: auto;
172 | padding: 10px;
173 | }
174 |
175 | .main-content-margin-div {
176 | margin: 40px auto;
177 | }
178 |
179 | .about-me-section-bg {
180 | background-image: url("../assets/backgrounds/about-me-mobile.png"), url("../assets/backgrounds/about-me-mobile-header-bg.png");
181 | background-repeat: no-repeat no-repeat;
182 | background-position: bottom left, top right;
183 | }
184 |
185 | .text-center {
186 | text-align: center;
187 | }
188 |
189 | .color-deep-blue {
190 | color: #172b4d;
191 | }
192 |
193 | .color-theme-green {
194 | color: #36b37f;
195 | }
196 |
197 | #header-first {
198 | animation: slideInRight 2s;
199 | }
200 |
201 | #header-second {
202 | animation: slideInRight 6s;
203 | }
204 |
205 | @keyframes slideInRight {
206 | 0% {
207 | margin-left: 100%;
208 | width: 200%;
209 | }
210 |
211 | 100% {
212 | margin-left: 0%;
213 | width: 100%;
214 | }
215 | }
216 |
217 | .portfolio-heading::after {
218 | width: 48px;
219 | height: 4px;
220 | margin: 25px auto;
221 | top: 100%;
222 | background-color: #36b37e;
223 | border: 1px solid #36b37f;
224 | border-radius: 24px;
225 | display: block;
226 | content: '';
227 | }
228 |
229 | .primary-header-text {
230 | font-weight: 700;
231 | font-size: 40px;
232 | line-height: 52px;
233 | margin: 0 25px;
234 | }
235 |
236 | .section-main-content-margin {
237 | margin: 25px 0;
238 | width: 100%;
239 | }
240 |
241 | .heading-supporting-text {
242 | font-weight: 400;
243 | font-size: 20px;
244 | line-height: 28px;
245 | padding: 0 20px;
246 | }
247 |
248 | .social-media {
249 | color: #505f79;
250 | height: 20px;
251 | display: flex;
252 | justify-content: center;
253 | align-items: center;
254 | list-style-type: none;
255 | }
256 |
257 | .social-media-flex-item {
258 | margin: 0 12px;
259 | }
260 |
261 | .social-media-flex-item:hover {
262 | background-color: #46e8aa;
263 | }
264 |
265 | .scroll-btn {
266 | background: #fff;
267 | border: 1px solid #dfe1e6;
268 | border-radius: 32px;
269 | width: 40px;
270 | height: 40px;
271 | padding: 8px;
272 | }
273 |
274 | .scroll-btn > img {
275 | height: 24px;
276 | width: 22px;
277 | }
278 |
279 | .scroll-btn:hover {
280 | color: #36b37f;
281 | }
282 |
283 | .scroll-btn:active {
284 | color: #008552;
285 | }
286 |
287 | .color-success {
288 | color: #36b37e;
289 | }
290 |
291 | .css-grid {
292 | min-height: 100px;
293 | min-width: 75%;
294 | display: grid;
295 | gap: 10px;
296 | grid-template-columns: repeat(auto-fit, 310px);
297 | justify-content: center;
298 | padding: 4px 15px;
299 | }
300 |
301 | .portfolio-grid-items {
302 | display: flex;
303 | flex-direction: column;
304 | align-content: center;
305 | justify-content: center;
306 | align-items: center;
307 | border: 1px solid #d0d9d4;
308 | border-radius: 8px;
309 | background: #ebf0ee;
310 | min-height: 450px;
311 | }
312 |
313 | .skills-grid-items {
314 | display: flex;
315 | flex-direction: column;
316 | align-content: center;
317 | justify-content: center;
318 | align-items: center;
319 | border: 1px solid #d0d9d4;
320 | border-radius: 8px;
321 | background: #ebf0ee;
322 | min-height: 350px;
323 | }
324 |
325 | .image-container {
326 | height: 55%;
327 | width: auto;
328 | }
329 |
330 | .image-container > img {
331 | width: 100%;
332 | border-radius: 7px;
333 | object-fit: cover;
334 | }
335 |
336 | .mobile-popup-close {
337 | position: absolute;
338 | top: 24px;
339 | right: 24px;
340 | cursor: pointer;
341 | }
342 |
343 | .project-description {
344 | background-color: #ffff;
345 | border-top: 1px solid #ffff;
346 | border-radius: 8px;
347 | height: 45%;
348 | width: 100%;
349 | text-align: center;
350 | display: flex;
351 | flex-direction: column;
352 | align-items: center;
353 | justify-content: space-around;
354 | padding: 12px 0;
355 | }
356 |
357 | .category-list {
358 | color: #ebf0ee;
359 | display: flex;
360 | justify-content: space-between;
361 | align-items: center;
362 | flex-wrap: wrap;
363 | list-style-type: none;
364 | }
365 |
366 | .title-header {
367 | font-weight: 600;
368 | font-size: 24px;
369 | line-height: 32px;
370 | color: #3a4a42;
371 | }
372 |
373 | .category-items {
374 | background: #ebf0ee;
375 | border-radius: 4px;
376 | padding: 8px 12px;
377 | font-weight: 600;
378 | font-size: 10px;
379 | letter-spacing: 0.01em;
380 | color: #3a4a42;
381 | margin: 3px;
382 | }
383 |
384 | .image-container-skills {
385 | height: auto;
386 | width: auto;
387 | padding: 20px;
388 | margin-bottom: 30px;
389 | }
390 |
391 | .skill-icons {
392 | height: 62px;
393 | width: 62px;
394 | background: #fff;
395 | box-shadow: 0 16px 24px rgba(37, 47, 137, 0.08);
396 | display: flex;
397 | justify-content: center;
398 | align-items: center;
399 | border: 1px solid #dfe1e6;
400 | border-radius: 40px;
401 | }
402 |
403 | .skill-icons > img {
404 | width: 60%;
405 | }
406 |
407 | .skill-desc {
408 | display: flex;
409 | flex-direction: column;
410 | justify-content: space-around;
411 | align-items: center;
412 | height: 45%;
413 | width: 100%;
414 | text-align: center;
415 | padding: 10px 0;
416 | }
417 |
418 | .skill-list {
419 | color: #36b37e;
420 | display: flex;
421 | justify-content: space-evenly;
422 | align-items: center;
423 | align-content: center;
424 | flex-wrap: wrap;
425 | list-style-type: none;
426 | padding: 1px;
427 | }
428 |
429 | .skill-items {
430 | background: #fff;
431 | border-radius: 4px;
432 | padding: 8px 12px;
433 | font-weight: 600;
434 | font-size: 10px;
435 | letter-spacing: 0.01em;
436 | color: #36b37e;
437 | margin: 3px;
438 | }
439 |
440 | footer {
441 | display: flex;
442 | align-items: center;
443 | justify-content: center;
444 | flex-direction: column;
445 | min-height: 100px;
446 | }
447 |
448 | .footer-main-div {
449 | display: flex;
450 | align-items: center;
451 | justify-content: center;
452 | flex-wrap: wrap;
453 | min-height: 100px;
454 | width: 100%;
455 | background-image: url("../assets/backgrounds/footer-bg.png");
456 | background-repeat: no-repeat;
457 | background-position: bottom right;
458 | }
459 |
460 | .contact-form-margin {
461 | margin: 10px 0;
462 | width: 100%;
463 | }
464 |
465 | .contact-form {
466 | display: flex;
467 | justify-content: center;
468 | align-items: center;
469 | flex-direction: column;
470 | padding: 30px;
471 | }
472 |
473 | .form-controls {
474 | width: 100%;
475 | margin: 10px auto;
476 | padding: 5px;
477 | }
478 |
479 | input[type=text],
480 | input[type=email] {
481 | background: #fff;
482 | border: 1px solid #d0d9d4;
483 | box-sizing: border-box;
484 | border-radius: 4px;
485 | height: 35px;
486 | }
487 |
488 | textarea {
489 | background: #fff;
490 | border: 1px solid #60c095;
491 | box-sizing: border-box;
492 | border-radius: 4px;
493 | height: 80px;
494 | }
495 |
496 | .social-media-contact {
497 | display: flex;
498 | justify-content: space-between;
499 | align-items: center;
500 | color: #505f79;
501 | width: 80%;
502 | margin: 1px auto;
503 | height: 20px;
504 | list-style-type: none;
505 | }
506 |
507 | .social-media-contact > li {
508 | flex: 1 1 20%;
509 | }
510 |
511 | .footer-email {
512 | font-weight: 400;
513 | font-size: 20px;
514 | line-height: 32px;
515 | width: 75%;
516 | }
517 |
518 | .footer-email:hover {
519 | background-color: #36b37f;
520 | color: #fff;
521 | }
522 |
523 | #dektop-navbar {
524 | display: none;
525 | }
526 |
527 | .dektop-menu-items:hover {
528 | text-decoration-color: #36b37f;
529 | margin: 0 20px;
530 | transform: scale(2);
531 | }
532 |
533 | #desktop-footer-social-links {
534 | display: none;
535 | }
536 |
537 | .footer-image-holder {
538 | display: none;
539 | }
540 |
541 | /* mobile popup css */
542 | .mobile-popup {
543 | background: #c1c7d0;
544 | position: fixed;
545 | padding: 10px;
546 | top: 0;
547 | left: 0;
548 | right: 0;
549 | bottom: 0;
550 | overflow-y: auto;
551 | }
552 |
553 | .mobile-popup-body {
554 | background: white;
555 | padding: 10px;
556 | border-radius: 8px;
557 | text-align: justify;
558 | position: relative;
559 | }
560 |
561 | .mobile-popup-title {
562 | width: 70%;
563 | }
564 |
565 | .category-list-modal {
566 | display: flex;
567 | flex-direction: row;
568 | }
569 |
570 | .mobile-popup-butttons {
571 | display: flex;
572 | gap: 5%;
573 | width: 100%;
574 | }
575 |
576 | .modal-project-button {
577 | display: flex;
578 | align-items: center;
579 | justify-content: space-around;
580 | width: 160px;
581 | }
582 |
583 | .modal-body-items {
584 | margin: 10px 0;
585 | }
586 |
587 | .image-container-mobile {
588 | height: 55%;
589 | width: auto;
590 | position: relative;
591 | }
592 |
593 | .image-container-mobile .mobile-popup-img {
594 | width: 100%;
595 | border-radius: 7px;
596 | object-fit: cover;
597 | }
598 |
599 | @media screen and (min-width: 768px) {
600 | body {
601 | background-image: url("../assets/backgrounds/desktop/Header-desktop.png");
602 | background-size: 100%;
603 | background-repeat: no-repeat;
604 | }
605 |
606 | #mobile-menu {
607 | display: none;
608 | }
609 |
610 | .footer-main-div {
611 | flex-wrap: nowrap;
612 | justify-content: center;
613 | background-image: none;
614 | width: 85%;
615 | }
616 |
617 | .footer-image-holder {
618 | position: relative;
619 | display: inline-block;
620 | min-height: 200px;
621 | width: 100%;
622 | }
623 |
624 | .contact-image-one {
625 | position: absolute;
626 | right: 0;
627 | bottom: 0;
628 | }
629 |
630 | .contact-image-two {
631 | position: absolute;
632 | left: 25%;
633 | bottom: 45%;
634 | }
635 |
636 | .contact-image-three {
637 | position: absolute;
638 | left: 0;
639 | bottom: 2%;
640 | }
641 |
642 | .about-me-section-bg {
643 | background-image: url("../assets/backgrounds/desktop/about-me-left-desktop.png"), url("../assets/backgrounds/desktop/about-me-right-desktop.png");
644 | background-position: bottom left, top right;
645 | }
646 |
647 | .main-section {
648 | background-image: none;
649 | background-size: 99vw;
650 | min-height: 800px;
651 | }
652 |
653 | #mobile-navbar {
654 | display: none;
655 | }
656 |
657 | #mobile-footer-email,
658 | .social-media-contact {
659 | display: none;
660 | }
661 |
662 | #dektop-navbar {
663 | display: flex;
664 | position: absolute;
665 | left: 50%;
666 | padding: 35px 12px;
667 | margin-left: -140px;
668 | font-weight: 600;
669 | font-size: 15px;
670 | animation-name: slideInLeft;
671 | animation-duration: 3s;
672 | }
673 |
674 | @keyframes slideInLeft {
675 | 0% {
676 | left: 0%;
677 | }
678 |
679 | 50% {
680 | font-size: 20px;
681 | }
682 |
683 | 100% {
684 | left: 50%;
685 | font-size: 15px;
686 | }
687 | }
688 |
689 | .main-content-margin-div {
690 | width: 75%;
691 | }
692 |
693 | .heading-supporting-text {
694 | max-width: 90%;
695 | }
696 |
697 | #footer-heading {
698 | flex-grow: 1;
699 | }
700 |
701 | #footer-form {
702 | flex-grow: 2;
703 | }
704 |
705 | #footer-heading > h2 {
706 | font-size: 30px;
707 | text-align: justify;
708 | }
709 |
710 | #footer-heading > h2::after {
711 | display: none;
712 | }
713 |
714 | .contact-form {
715 | align-items: flex-start;
716 | }
717 |
718 | #desktop-footer-social-links {
719 | display: block;
720 | width: 100%;
721 | padding: 25px 0;
722 | border-top: 1px solid #dfe1e6;
723 | }
724 |
725 | .contact-images-desktop {
726 | display: inline-block;
727 | }
728 |
729 | .desktop-pop-up {
730 | position: fixed;
731 | background: #c1c7d0;
732 | z-index: 1;
733 | top: 0;
734 | left: 0;
735 | bottom: 0;
736 | width: 100%;
737 | padding: 30px 0;
738 | overflow-y: auto;
739 | }
740 |
741 | .desktop-modal-body {
742 | position: relative;
743 | background: #fff;
744 | border: 1px solid #ebecf0;
745 | box-shadow: 0 48px 48px rgba(37, 47, 137, 0.08);
746 | border-radius: 8px;
747 | width: 920px;
748 | margin: auto auto;
749 | padding: 40px 20px;
750 | display: flex;
751 | flex-direction: column;
752 | }
753 |
754 | .close-desktop-modal {
755 | position: absolute;
756 | top: 16px;
757 | right: 28px;
758 | cursor: pointer;
759 | }
760 |
761 | .desktop-project-image-holder > img {
762 | width: 100%;
763 | }
764 |
765 | .desktop-project-title {
766 | display: flex;
767 | justify-content: space-between;
768 | }
769 |
770 | .project-description-text {
771 | font-weight: 400;
772 | font-size: 20px;
773 | line-height: 28px;
774 | }
775 |
776 | .desktop-butttons-span {
777 | display: inline-block;
778 | font-weight: 600;
779 | }
780 |
781 | .desktop-title-buttons {
782 | display: flex;
783 | align-items: center;
784 | gap: 5%;
785 | }
786 | }
787 |
--------------------------------------------------------------------------------
/index.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 | Portfolio: Software Developer
9 |
10 |
11 |
12 |
13 |
14 |
15 |
18 |
21 |
22 |
23 |
34 |
35 |
36 |
54 |
55 |
56 |
57 |
58 |
59 |
60 |
61 |
62 |
63 |
64 | I can help you build a product , feature or website Look through some of my work and experience! If you
65 | like what you see and have a project you need coded,
66 | don’t hestiate to contact me.
67 |
68 |
69 |
98 |
99 |
100 |
101 |
102 |
103 |
104 |
105 |
106 |
107 |
108 |
109 |
110 |
111 |
112 |
113 |
114 |
115 |
116 |
117 |
118 |
119 |
120 |
121 | I can help you build a product , feature or website Look through some of my work and experience!
122 | If you like what you see and have a project you need coded, don’t hestiate to contact me.
123 |
124 |
125 |
126 | Get My Resume
127 |
128 |
129 |
130 |
131 |
132 |
133 |
134 |
135 |
136 |
137 |
138 |
139 |
140 |
141 |
142 | JavaScript
143 | Ruby
144 | HTML
145 | CSS
146 |
147 |
148 |
149 |
150 |
151 |
152 |
153 |
154 |
155 |
156 |
157 |
158 | Bootstrap
159 | Ruby on rails
160 | RSpec
161 | Capybara
162 | Selenium
163 |
164 |
165 |
166 |
167 |
168 |
169 |
170 |
171 |
172 |
173 |
174 |
175 |
176 | Codekit
177 | GitHub
178 | Codepen
179 | Gitlab
180 | Terminal
181 |
182 |
183 |
184 |
185 |
186 |
187 |
188 |
189 |
190 |
191 |
192 |
198 |
241 |
245 |
246 |
251 |
280 |
281 |
282 |
283 |
284 |
285 |
286 |
287 |
288 |
289 |
290 |
291 |
304 |
305 |
306 | CodeKit
307 | GitHub
308 | JavaScript
309 | Bootstrap
310 | Terminal
311 | Codepen
312 |
313 |
314 |
315 |
316 | Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled it 1960s with the releaLorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled it 1960s with the release
317 |
318 |
319 |
320 |
321 |
322 |
323 |
356 |
357 |
358 |
359 |
360 |
361 |
--------------------------------------------------------------------------------
/assets/backgrounds/desktop/Header-llustration-desktop.svg:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
26 |
27 |
28 |
29 |
30 |
31 |
32 |
33 |
34 |
35 |
36 |
37 |
38 |
39 |
40 |
41 |
42 |
43 |
44 |
45 |
46 |
47 |
48 |
49 |
50 |
51 |
52 |
53 |
54 |
55 |
56 |
57 |
58 |
59 |
60 |
61 |
62 |
63 |
64 |
65 |
66 |
67 |
68 |
69 |
70 |
71 |
72 |
73 |
74 |
75 |
76 |
77 |
78 |
79 |
80 |
81 |
82 |
83 |
84 |
85 |
86 |
87 |
88 |
89 |
90 |
91 |
92 |
93 |
94 |
95 |
96 |
97 |
98 |
99 |
100 |
101 |
102 |
103 |
104 |
105 |
106 |
107 |
108 |
109 |
110 |
111 |
112 |
113 |
114 |
115 |
116 |
117 |
118 |
119 |
120 |
121 |
122 |
123 |
124 |
125 |
126 |
127 |
128 |
129 |
130 |
131 |
132 |
133 |
134 |
135 |
136 |
137 |
138 |
139 |
140 |
141 |
142 |
143 |
144 |
145 |
146 |
147 |
148 |
149 |
150 |
151 |
152 |
153 |
154 |
155 |
156 |
157 |
158 |
159 |
160 |
161 |
162 |
163 |
164 |
165 |
166 |
167 |
168 |
169 |
170 |
--------------------------------------------------------------------------------