├── .gitignore
├── .vscode
└── settings.json
├── images
├── me.jpeg
├── Ellipse1.png
├── Ellipse2.png
├── Ellipse3.png
├── contactbg.png
├── desktop
│ ├── c.png
│ ├── herobg.png
│ ├── contactbg.png
│ └── todolists.jpg
├── icon_head.jpg
├── icons
│ ├── Icon.png
│ └── Vector.png
├── real_todo.png
├── header-shapes.png
├── Snapshoot-Portfolio.png
├── Snapshoot-Portfolio2.png
├── Snapshoot-Portfolio3.png
└── Snapshoot-Portfolio4.png
├── murple_logo.png
├── app_screenshot.png
├── .hintrc
├── .eslintrc.json
├── .stylelintrc.json
├── package.json
├── licence
├── MIT.md
├── .github
└── workflows
│ └── linters.yml
├── README.md
├── index.js
├── index.html
└── style.css
/.gitignore:
--------------------------------------------------------------------------------
1 | /node_modules
2 | node_modules
3 |
--------------------------------------------------------------------------------
/.vscode/settings.json:
--------------------------------------------------------------------------------
1 | {
2 | "liveServer.settings.port": 5501
3 | }
--------------------------------------------------------------------------------
/images/me.jpeg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/KUBAHO3/My-Portfolio/HEAD/images/me.jpeg
--------------------------------------------------------------------------------
/murple_logo.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/KUBAHO3/My-Portfolio/HEAD/murple_logo.png
--------------------------------------------------------------------------------
/app_screenshot.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/KUBAHO3/My-Portfolio/HEAD/app_screenshot.png
--------------------------------------------------------------------------------
/images/Ellipse1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/KUBAHO3/My-Portfolio/HEAD/images/Ellipse1.png
--------------------------------------------------------------------------------
/images/Ellipse2.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/KUBAHO3/My-Portfolio/HEAD/images/Ellipse2.png
--------------------------------------------------------------------------------
/images/Ellipse3.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/KUBAHO3/My-Portfolio/HEAD/images/Ellipse3.png
--------------------------------------------------------------------------------
/images/contactbg.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/KUBAHO3/My-Portfolio/HEAD/images/contactbg.png
--------------------------------------------------------------------------------
/images/desktop/c.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/KUBAHO3/My-Portfolio/HEAD/images/desktop/c.png
--------------------------------------------------------------------------------
/images/icon_head.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/KUBAHO3/My-Portfolio/HEAD/images/icon_head.jpg
--------------------------------------------------------------------------------
/images/icons/Icon.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/KUBAHO3/My-Portfolio/HEAD/images/icons/Icon.png
--------------------------------------------------------------------------------
/images/real_todo.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/KUBAHO3/My-Portfolio/HEAD/images/real_todo.png
--------------------------------------------------------------------------------
/images/icons/Vector.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/KUBAHO3/My-Portfolio/HEAD/images/icons/Vector.png
--------------------------------------------------------------------------------
/images/desktop/herobg.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/KUBAHO3/My-Portfolio/HEAD/images/desktop/herobg.png
--------------------------------------------------------------------------------
/images/header-shapes.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/KUBAHO3/My-Portfolio/HEAD/images/header-shapes.png
--------------------------------------------------------------------------------
/images/desktop/contactbg.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/KUBAHO3/My-Portfolio/HEAD/images/desktop/contactbg.png
--------------------------------------------------------------------------------
/images/desktop/todolists.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/KUBAHO3/My-Portfolio/HEAD/images/desktop/todolists.jpg
--------------------------------------------------------------------------------
/images/Snapshoot-Portfolio.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/KUBAHO3/My-Portfolio/HEAD/images/Snapshoot-Portfolio.png
--------------------------------------------------------------------------------
/images/Snapshoot-Portfolio2.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/KUBAHO3/My-Portfolio/HEAD/images/Snapshoot-Portfolio2.png
--------------------------------------------------------------------------------
/images/Snapshoot-Portfolio3.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/KUBAHO3/My-Portfolio/HEAD/images/Snapshoot-Portfolio3.png
--------------------------------------------------------------------------------
/images/Snapshoot-Portfolio4.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/KUBAHO3/My-Portfolio/HEAD/images/Snapshoot-Portfolio4.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 | }
--------------------------------------------------------------------------------
/.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 | }
--------------------------------------------------------------------------------
/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "my-portfolio",
3 | "version": "1.0.0",
4 | "description": " ",
5 | "main": "index.js",
6 | "scripts": {
7 | "test": "echo \"Error: no test specified\" && exit 1"
8 | },
9 | "repository": {
10 | "type": "git",
11 | "url": "git+https://github.com/KUBAHO3/My-Portfolio.git"
12 | },
13 | "keywords": [],
14 | "author": "",
15 | "license": "ISC",
16 | "bugs": {
17 | "url": "https://github.com/KUBAHO3/My-Portfolio/issues"
18 | },
19 | "homepage": "https://github.com/KUBAHO3/My-Portfolio#readme",
20 | "devDependencies": {
21 | "babel-eslint": "^10.1.0",
22 | "eslint": "^7.32.0",
23 | "eslint-config-airbnb-base": "^14.2.1",
24 | "eslint-plugin-import": "^2.27.5",
25 | "hint": "^7.1.3",
26 | "stylelint": "^13.13.1",
27 | "stylelint-config-standard": "^21.0.0",
28 | "stylelint-csstree-validator": "^1.9.0",
29 | "stylelint-scss": "^3.21.0"
30 | }
31 | }
32 |
--------------------------------------------------------------------------------
/licence:
--------------------------------------------------------------------------------
1 | MIT License
2 |
3 | Copyright (c) 2023 KUBAHO LINNE Heaven
4 |
5 | Permission is hereby granted, free of charge, to any person obtaining a copy
6 | of this software and associated documentation files (the "Software"), to deal
7 | in the Software without restriction, including without limitation the rights
8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9 | copies of the Software, and to permit persons to whom the Software is
10 | furnished to do so, subject to the following conditions:
11 |
12 | The above copyright notice and this permission notice shall be included in all
13 | copies or substantial portions of the Software.
14 |
15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21 | SOFTWARE.
22 |
--------------------------------------------------------------------------------
/MIT.md:
--------------------------------------------------------------------------------
1 | ## Copyright 2021, [YOUR NAME]
2 |
3 | ###### Please delete this line and the next one
4 | ###### APP TYPE can be a webpage/website, a web app, a software and so on
5 |
6 | Permission is hereby granted, free of charge, to any person obtaining a copy of this [APP TYPE] and associated documentation files, to deal in the [APP TYPE] without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the [APP TYPE], and to permit persons to whom the [APP TYPE] is furnished to do so, subject to the following conditions:
7 |
8 | The above copyright notice and this permission notice shall be included in all copies or substantial portions of the [APP TYPE].
9 |
10 | THE [APP TYPE] IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE [APP TYPE] OR THE USE OR OTHER DEALINGS IN THE [APP TYPE].
11 |
--------------------------------------------------------------------------------
/.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-22.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-22.04
24 | steps:
25 | - uses: actions/checkout@v2
26 | - uses: actions/setup-node@v1
27 | with:
28 | node-version: "18.x"
29 | - name: Setup Webhint
30 | run: |
31 | npm install --save-dev hint@7.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-22.04
38 | steps:
39 | - uses: actions/checkout@v2
40 | - uses: actions/setup-node@v1
41 | with:
42 | node-version: "18.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-22.04
52 | steps:
53 | - uses: actions/checkout@v2
54 | - uses: actions/setup-node@v1
55 | with:
56 | node-version: "18.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 | nodechecker:
64 | name: node_modules checker
65 | runs-on: ubuntu-22.04
66 | steps:
67 | - uses: actions/checkout@v2
68 | - name: Check node_modules existence
69 | run: |
70 | if [ -d "node_modules/" ]; then echo -e "\e[1;31mThe node_modules/ folder was pushed to the repo. Please remove it from the GitHub repository and try again."; echo -e "\e[1;32mYou can set up a .gitignore file with this folder included on it to prevent this from happening in the future." && exit 1; fi
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 |
2 |
3 |
27 |
28 |
29 |
30 |
31 |
32 |
33 |
My Portfolio
34 |
35 |
36 |
37 |
38 |
39 | # 📗 Table of Contents
40 |
41 | - [📖 About the Project](#about-project)
42 | - [🛠 Built With](#built-with)
43 | - [Tech Stack](#tech-stack)
44 | - [Key Features](#key-features)
45 | - [🚀 Live Demo](#live-demo)
46 | - [🦻 Walkthrough Video](#walkthrough-demo)
47 | - [💻 Getting Started](#getting-started)
48 | - [Setup](#setup)
49 | - [Prerequisites](#prerequisites)
50 | - [Install](#install)
51 | - [Usage](#usage)
52 | - [Run tests](#run-tests)
53 | - [Deployment](#triangular_flag_on_post-deployment)
54 | - [👥 Authors](#authors)
55 | - [🔭 Future Features](#future-features)
56 | - [🤝 Contributing](#contributing)
57 | - [⭐️ Show your support](#support)
58 | - [🙏 Acknowledgements](#acknowledgements)
59 | - [❓ FAQ (OPTIONAL)](#faq)
60 | - [📝 License](#license)
61 |
62 |
63 |
64 | # 📖 My Portfolio
65 |
66 | This project is about creating a personal portfolio to showcase my activities, background and experience.
67 |
68 | **My Portfolio** is a simple Html&CSS-based portfolio
69 |
70 | ## :hammer_and_wrench: Built With
71 | - HTML
72 | - CSS
73 | ### Tech Stack
74 |
75 | Version Control
76 |
79 |
80 |
81 | Visual Studio Code
82 |
85 |
86 |
87 | Client
88 |
92 |
93 |
94 |
95 |
96 | ### Key Features
97 |
98 | - **Linters SetUp**
99 | - **Follow HTML and CSS best practice**
100 | - **Display Text**
101 | - **Display Cards**
102 | - **Display Text**
103 | - **Hoover Buttons**
104 | - **Desktop Version**
105 | - **Include Animations**
106 | - **Deployed with GithubPages**
107 | - **Mobile Nav**
108 | - **Detail modal**
109 | - **Email validation**
110 | - **store form data in local storage**
111 |
112 | (back to top )
113 |
114 |
115 |
116 | ## 🚀 Live Demo
117 |
118 | - [Live Demo Link](https://kubaho3.github.io/My-Portfolio/)
119 |
120 | (back to top )
121 |
122 |
123 |
124 | ## 🦻 WalkThrough Video
125 |
126 | - [WalkThrough Video Link](https://www.loom.com/share/1f95cd1e242946fe80a7c0cb469aeb48)
127 |
128 | (back to top )
129 |
130 |
131 |
132 | ## 💻 Getting Started
133 |
134 | To get a local copy up and running, follow these steps.
135 |
136 | ### Prerequisites
137 |
138 | In order to run this project you need:
139 | - Visual Studio Code.
140 | - Node JS.
141 | - Git bash.
142 | - GitHub Account.
143 |
144 |
150 | ### Setup
151 |
152 | Clone this repository to your desired folder:
153 | Use git clone command or download ZIP folder
154 |
155 |
163 | ### Install
164 | Install this project with:
165 | npm
166 | Example command:
167 | ```sh
168 | cd my-project
169 | npm init -y
170 | ```
171 | ### Usage
172 | To run the project, execute the following command:
173 | npm start or live server
174 | Example command:
175 | ```sh
176 | GitHub Pages Server
177 | ```
178 | ### Run tests
179 | To run tests, run the following command:
180 | npm test
181 | Example command:
182 | ```sh
183 | npx stylelint "**/*.{css,scss}"
184 | ```
185 | ### Deployment
186 | You can deploy this project using:
187 | GitHub Pages
188 | Example:
189 | ```sh
190 | git@github.com:KUBAHO3/My-Portfolio.git
191 | ```
192 | (back to top )
193 |
194 | ## :busts_in_silhouette: Authors
195 | :bust_in_silhouette: **KUBAHO LINNE Heaven**
196 | - GitHub: [@KUBAHO3](https://github.com/KUBAHO3)
197 | - Twitter: [@KubahoH](https://twitter.com/KubahoH)
198 | - LinkedIn: [Kubaho Linne Heaven](https://www.linkedin.com/in/kubaho-linne-heaven-78ab37208/)
199 | (back to top )
200 |
201 |
202 | ## :telescope: Future Features
203 | - [ ] **Adding BackEnd**
204 | - [ ] **Making it stylish**
205 | (back to top )
206 |
207 |
208 | ## :handshake: Contributing
209 | Contributions, issues, and feature requests are welcome!
210 | Feel free to check the [git@github.com:KUBAHO3/My-Portfolio.git](../../issues/).
211 | (back to top )
212 |
213 |
214 | ## :star:️ Show your support
215 | If you like this project please follow me on github & twitter and also connect on Linkedin.
216 | (back to top )
217 |
218 |
219 | ## :pray: Acknowledgments
220 | I would like to thank Microverse for this exercise.
221 | (back to top )
222 |
223 |
224 | ## :question: FAQ (OPTIONAL)
225 | - **How long can it take to build that project**
226 |
227 | - 1-2hrs according to personal skills
228 |
229 | - **Where to find figma for that project!**
230 |
231 | - Figma for that project will be available soon!
232 | (back to top )
233 |
234 |
235 | ## 📝 License
236 |
237 | This project is [MIT](https://github.com/KUBAHO3/My-Portfolio/blob/add-license-1/licence) licensed.
238 |
239 |
240 | (back to top )
--------------------------------------------------------------------------------
/index.js:
--------------------------------------------------------------------------------
1 | function ReadElement(selector) {
2 | return document.querySelector(selector);
3 | }
4 |
5 | const menu = ReadElement('#menu-icon');
6 | const nav = ReadElement('.mobile-nav');
7 | const WorkModal = ReadElement('.modal-section');
8 | const closeNav = ReadElement('.close-button');
9 | const viewModal1 = ReadElement('.view-modal1');
10 | const viewModal2 = ReadElement('.view-modal2');
11 | const viewModal3 = ReadElement('.view-modal3');
12 | const viewModal4 = ReadElement('.view-modal4');
13 | const emailer = ReadElement('#useremail');
14 | const uname = ReadElement('#username');
15 | const message = ReadElement('#description');
16 | const validator = ReadElement('.validator');
17 | const submitbtn = ReadElement('#submit-form');
18 |
19 | let myMessage;
20 | let userName;
21 | let email;
22 |
23 | let userData = [];
24 |
25 | function UpdateInput(selected) {
26 | function myFunction() {
27 | email = emailer.value;
28 | userName = uname.value;
29 | myMessage = message.value;
30 | userData = [userName, email, myMessage];
31 | localStorage.setItem('userData', userData);
32 | }
33 | selected.addEventListener('change', myFunction);
34 | }
35 |
36 | myMessage = UpdateInput(message);
37 | userName = UpdateInput(uname);
38 | email = UpdateInput(emailer);
39 |
40 | if (localStorage.getItem('userData') !== null) {
41 | const myFormData = localStorage.getItem('userData');
42 | const myFormDataArray = myFormData.split(',');
43 |
44 | if (myFormDataArray.length > 0) {
45 | [uname.value, emailer.value, message.value] = myFormDataArray;
46 | }
47 | }
48 |
49 | function EmailValidation(e) {
50 | const email = emailer.value;
51 | let text;
52 | if (email === email.toLowerCase() && email !== '') {
53 | text = 'Email is inserted in lowercase as required';
54 | validator.innerHTML = text;
55 | validator.classList.add('validator-green');
56 | submitbtn.style.marginTop = '20px';
57 | } else {
58 | text = 'Email is required and has to be in lowercase';
59 | validator.innerHTML = text;
60 | validator.classList.remove('validator-green');
61 | validator.classList.add('validator-red');
62 | submitbtn.style.marginTop = '20px';
63 | e.preventDefault();
64 | }
65 | }
66 | submitbtn.addEventListener('submit', (e) => EmailValidation(e));
67 |
68 | function RemoveMenu(selected, modalPart, remover) {
69 | return selected.addEventListener('click', () => modalPart.classList.remove(remover));
70 | }
71 |
72 | const details = [
73 | {
74 | title: 'Todo Lists',
75 | name: 'Tasks Management system',
76 | technology: 'Front End Dev',
77 | year: '2023',
78 | imageUrl: 'images/real_todo.png',
79 | description: "The ToDo List for task management with CRUD operations developed in JavaScript plain with addition of Html&Css technologies",
80 | languages: ['html', 'css', 'javascript', 'github', 'Bootstraps'],
81 | liveLink: 'https://kubaho3.github.io/To-Do-List/dist/',
82 | sourceCode: 'https://github.com/KUBAHO3/To-Do-List/',
83 | }, {
84 | title: 'Multi-Post Stories',
85 | name: 'CANOPY',
86 | technology: 'Back End Dev',
87 | year: '2025',
88 | imageUrl: 'images/Snapshoot-Portfolio4.png',
89 | description: "A daily selection of privately personalized reads; no accounts or sign-ups required. ry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make a type specimen book. It has survived not only five centuries, but also the leap into electronic typesetting, remaining essent",
90 | languages: ['html', 'css', 'javascript', 'github', 'ruby', 'Bootstraps'],
91 | liveLink: 'https://www.linkedin.com/in/kubaho-linne-heaven-78ab37208/',
92 | sourceCode: 'https://github.com/KUBAHO3',
93 | }, {
94 | title: 'Tonic',
95 | name: 'CANOPY',
96 | technology: 'Back End Dev',
97 | year: '2025',
98 | imageUrl: 'images/Snapshoot-Portfolio2.png',
99 | 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 to make a type specimen book. It has survived not only five centuries, but also the leap into electronic typesetting, remaining essent",
100 | languages: ['html', 'css', 'javascript', 'github', 'ruby', 'Bootstraps'],
101 | liveLink: 'https://www.linkedin.com/in/kubaho-linne-heaven-78ab37208/',
102 | sourceCode: 'https://github.com/KUBAHO3',
103 | }, {
104 | title: 'Multi-Post Stories',
105 | name: 'CANOPY',
106 | technology: 'Back End Dev',
107 | year: '2025',
108 | imageUrl: 'images/Snapshoot-Portfolio3.png',
109 | 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 to make a type specimen book. It has survived not only five centuries, but also the leap into electronic typesetting, remaining essent",
110 | languages: ['html', 'css', 'javascript', 'github', 'ruby', 'Bootstraps'],
111 | liveLink: 'https://www.linkedin.com/in/kubaho-linne-heaven-78ab37208/',
112 | sourceCode: 'https://github.com/KUBAHO3',
113 | },
114 | ];
115 |
116 | function renderModal(number) {
117 | const work = details[number];
118 | const modalInstance = `
119 |
120 |
${work.title}
121 | x
122 |
123 |
124 |
${work.name}
125 | ● ${work.technology}
126 | ● ${work.year}
127 |
128 |
129 |
130 |
131 | ${work.description}
132 |
133 |
134 |
135 | ${work.languages.map((lang) => `
${lang}
`).join('')}
136 |
137 |
138 |
139 |
143 |
144 |
145 |
`;
146 |
147 | WorkModal.innerHTML = modalInstance;
148 | }
149 |
150 | function AddMenu(selected, modalPart, opener, number) {
151 | return selected.addEventListener('click', () => {
152 | modalPart.classList.add(opener);
153 | modalPart.style.top = '0px';
154 |
155 | if (number) {
156 | renderModal(number - 1);
157 | }
158 | });
159 | }
160 |
161 | AddMenu(menu, nav, 'nav-toggle');
162 | AddMenu(viewModal1, WorkModal, 'nav-toggle', 1);
163 | AddMenu(viewModal2, WorkModal, 'nav-toggle', 2);
164 | AddMenu(viewModal3, WorkModal, 'nav-toggle', 3);
165 | AddMenu(viewModal4, WorkModal, 'nav-toggle', 4);
166 | RemoveMenu(WorkModal, WorkModal, 'nav-toggle');
167 | RemoveMenu(closeNav, nav, 'nav-toggle');
168 | RemoveMenu(nav, nav, 'nav-toggle');
--------------------------------------------------------------------------------
/index.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 | Heaven's Portfolio
9 |
10 |
11 |
13 |
14 |
15 |
16 |
17 |
18 |
33 |
34 | x
35 |
40 |
41 |
42 |
43 |
44 |
45 |
46 | I’m Linne, Glad to see you!
47 |
48 |
49 | I’m a software developer! I can help you build a product , feature or website Look through some of my work and experience! If you like what you see and have a project you need coded, don’t hestiate to contact me.
50 |
51 |
54 |
55 |
56 |
57 |
58 |
59 |
60 |
61 |
62 |
63 |
64 |
65 |
66 |
67 |
68 |
69 |
70 |
71 |
Tonic
72 |
73 |
CANOPY
74 | ● Back End Dev
75 | ● 2015
76 |
77 |
78 | A daily selection of privately personalized reads; no accounts or sign-ups required.
79 |
80 |
81 |
Html
82 |
Css
83 |
JavaScript
84 |
85 |
See Project
86 |
87 |
88 |
89 |
90 |
91 |
Multi-Post Stories
92 |
93 |
CANOPY
94 | ● Back End Dev
95 | ● 2015
96 |
97 |
98 | A daily selection of privately personalized reads; no accounts or sign-ups required.
99 |
100 |
101 |
Html
102 |
Css
103 |
JavaScript
104 |
105 |
See Project
106 |
107 |
108 |
109 |
110 |
111 |
Tonic
112 |
113 |
CANOPY
114 | ● Back End Dev
115 | ● 2015
116 |
117 |
118 | A daily selection of privately personalized reads; no accounts or sign-ups required.
119 |
120 |
121 |
Html
122 |
Css
123 |
JavaScript
124 |
125 |
See Project
126 |
127 |
128 |
129 |
130 |
131 |
Multi-Post Stories
132 |
133 |
CANOPY
134 | ● Back End Dev
135 | ● 2015
136 |
137 |
138 | A daily selection of privately personalized reads; no accounts or sign-ups required.
139 |
140 |
141 |
Html
142 |
Css
143 |
JavaScript
144 |
145 |
See Project
146 |
147 |
148 |
149 |
150 |
151 |
152 |
153 |
154 |
155 |
156 |
157 | About Myself
158 |
159 |
160 | I’m a software developer! I can help you build a product , feature or website Look through some of my work and experience! If you like what you see and have a project you need coded, don’t hestiate to contact me.
161 |
162 |
165 |
166 |
167 |
168 |
169 |
170 |
171 |
172 |
Get my resume
173 |
174 |
175 |
176 |
177 |
178 |
Languages
179 |
180 |
181 |
182 |
183 |
184 |
185 |
JavaScript
186 |
187 |
188 |
189 |
HTML
190 |
191 |
192 |
193 |
CSS
194 |
195 |
196 |
197 |
Frameworks
198 |
199 |
200 |
201 |
202 |
Skills
203 |
204 |
205 |
206 |
207 |
208 |
209 |
241 |
242 |
243 |
244 |
245 |
246 |
--------------------------------------------------------------------------------
/style.css:
--------------------------------------------------------------------------------
1 | @import url("https://fonts.googleapis.com/css2?family=Poppins&family=Ubuntu:wght@300&display=swap");
2 |
3 | * {
4 | font-family: "Poppins", sans-serif;
5 | }
6 |
7 | body {
8 | margin: 0;
9 | overflow-x: hidden;
10 | }
11 |
12 | .container {
13 | padding-left: 5%;
14 | padding-right: 5%;
15 | }
16 |
17 | .fixed-top {
18 | position: fixed;
19 | top: 0;
20 | right: 0;
21 | left: 0;
22 | }
23 |
24 | .navbar {
25 | display: flex;
26 | flex-direction: row;
27 | align-items: center;
28 | justify-content: space-between;
29 | background-color: #fff;
30 | padding-top: 5px;
31 | padding-bottom: 5px;
32 | }
33 |
34 | #logo {
35 | color: #6070ff;
36 | text-decoration: none;
37 | font-size: 18px;
38 | font-weight: 700;
39 | }
40 |
41 | .menu {
42 | color: #6070ff;
43 | font-size: 1.3rem;
44 | }
45 |
46 | .menu-list {
47 | display: none;
48 | }
49 |
50 | .mobile-nav {
51 | position: fixed;
52 |
53 | /* top: 0; */
54 | width: 100%;
55 | height: 100vh;
56 | transition: 0.2s ease-in-out;
57 | background-color: rgba(41, 58, 208, 0.8);
58 | -webkit-backdrop-filter: blur(5px);
59 | backdrop-filter: blur(5px);
60 | display: none;
61 | }
62 |
63 | .close-button {
64 | color: #fff;
65 | font-size: 34px;
66 | padding: 0 7px;
67 | float: right;
68 | margin-left: 85%;
69 | }
70 |
71 | .menu-list-mobile > li {
72 | list-style-type: none;
73 | }
74 |
75 | .connect-me a {
76 | color: #7f8cff;
77 | text-decoration: none;
78 | font-weight: 500;
79 | font-size: 16px;
80 | line-height: 24px;
81 | }
82 |
83 | .menu-list-mobile > li > a {
84 | color: #fff;
85 | font-weight: 600;
86 | font-size: 32px;
87 | line-height: 44px;
88 | text-decoration: none;
89 | }
90 |
91 | .hero {
92 | display: flex;
93 | flex-direction: column;
94 | align-items: center;
95 | justify-content: center;
96 | height: 80vh;
97 | background-image: url("./images/header-shapes.png");
98 | background-color: #fff;
99 | background-repeat: no-repeat;
100 | background-size: 100%;
101 | }
102 |
103 | .greetings {
104 | color: #172b4d;
105 | font-size: 40px;
106 | font-weight: 700;
107 | }
108 |
109 | .about-me {
110 | font-weight: 400;
111 | font-size: 16px;
112 | color: #344563;
113 | text-decoration: none;
114 | }
115 |
116 | .icon-group {
117 | display: flex;
118 | flex-direction: row;
119 | list-style-type: none;
120 | padding: 0%;
121 | }
122 |
123 | .icon {
124 | padding: 5px;
125 | margin-left: 0;
126 | color: #505f79;
127 | width: 19.99px;
128 | }
129 |
130 | .fa-brands {
131 | font-size: large;
132 | }
133 |
134 | .works {
135 | background-color: #e5e5e5;
136 | padding-top: 40px;
137 | padding-bottom: 40px;
138 | }
139 |
140 | .cards {
141 | padding: 10px 10px 30px 10px;
142 | border-radius: 16px;
143 | background-color: #fff;
144 | margin-top: 40px;
145 | }
146 |
147 | .cards img {
148 | width: 100%;
149 | }
150 |
151 | h1.title {
152 | font-size: 32px;
153 | font-weight: 700;
154 | color: #172b4d;
155 | margin-top: 20px;
156 | }
157 |
158 | .position {
159 | display: flex;
160 | flex-direction: row;
161 | align-items: center;
162 | }
163 |
164 | .position .place {
165 | font-weight: 600;
166 | font-size: 13px;
167 | color: #344563;
168 | }
169 |
170 | .position .post-name {
171 | font-weight: 600;
172 | font-size: 13px;
173 | color: #7a869a;
174 | padding-left: 20px;
175 | }
176 |
177 | .position .post-year {
178 | font-weight: 600;
179 | font-size: 13px;
180 | color: #7a869a;
181 | padding-left: 20px;
182 | }
183 |
184 | p.description {
185 | font-weight: 400;
186 | font-size: 15px;
187 | color: #344563;
188 | }
189 |
190 | .techs {
191 | display: flex;
192 | flex-direction: row;
193 | margin-bottom: 20px;
194 | }
195 |
196 | .techs .single-tech {
197 | color: #6070ff;
198 | font-weight: 500;
199 | font-size: 12px;
200 | background-color: #ebebff;
201 | border-radius: 8px;
202 | padding: 8px 12px;
203 | margin-right: 10px;
204 | }
205 |
206 | .view-more {
207 | color: #396df2;
208 | font-weight: 600;
209 | font-size: 17px;
210 | background-color: #fff;
211 | border-radius: 8px;
212 | padding: 14px 10px;
213 | border: 2px solid #396df2;
214 | }
215 |
216 | form div .view-more {
217 | width: 142px;
218 | padding: 12px 12px;
219 | }
220 |
221 | .view-more:hover {
222 | background-color: #396df2;
223 | color: #fff;
224 | }
225 |
226 | .about-myself {
227 | background-color: #e5e5e5;
228 | }
229 |
230 | .about-myself-intro {
231 | padding-top: 60px;
232 | padding-bottom: 30px;
233 | background-color: #fff;
234 | border-radius: 0 50px 0 0;
235 | }
236 |
237 | .about-myself-skills {
238 | background-color: #fff;
239 | }
240 |
241 | .skill {
242 | display: flex;
243 | flex-direction: row;
244 | align-items: center;
245 | justify-content: space-between;
246 | padding: 10px 20px;
247 | }
248 |
249 | .skill-name {
250 | font-weight: 600;
251 | font-size: 20px;
252 | color: #000;
253 | }
254 |
255 | .skill-name.fas {
256 | font-weight: 600;
257 | font-size: 20px;
258 | color: #acb7c3;
259 | }
260 |
261 | .dots {
262 | font-size: 20px;
263 | }
264 |
265 | .sub-skills {
266 | display: flex;
267 | flex-direction: column;
268 | }
269 |
270 | .sub-skill {
271 | display: flex;
272 | flex-direction: row;
273 | background-color: #f7f7f9;
274 | border-radius: 8px;
275 | padding: 10px 20px;
276 | margin-bottom: 20px;
277 | margin-left: 30px;
278 | margin-right: 30px;
279 | }
280 |
281 | .sub-skill-img {
282 | width: 50px;
283 | height: 50px;
284 | border-radius: 50%;
285 | margin-right: 10px;
286 | }
287 |
288 | .sub-skill-name {
289 | font-weight: 600;
290 | font-size: 15px;
291 | color: #253858;
292 | }
293 |
294 | .modal-section {
295 | position: fixed;
296 | width: 100%;
297 | min-height: 100vh;
298 | transition: 0.2s ease-in-out;
299 | background-color: rgba(165, 185, 224, 0.5);
300 | -webkit-backdrop-filter: blur(5px);
301 | backdrop-filter: blur(5px);
302 | display: none;
303 | overflow: auto;
304 | }
305 |
306 | .nav-toggle {
307 | display: flex;
308 | flex-direction: column;
309 | }
310 |
311 | .work-modal {
312 | position: absolute;
313 | background-color: #fff;
314 | border-radius: 16px;
315 | margin: 4%;
316 | margin-top: 2.5%;
317 | padding: 20px;
318 | }
319 |
320 | .work-modal-head {
321 | display: flex;
322 | justify-content: space-between;
323 | }
324 |
325 | .work-modal-head > .title {
326 | margin-bottom: 0;
327 | margin-top: 0;
328 | font-size: 40px;
329 | font-weight: 700;
330 | line-height: 52px;
331 | }
332 |
333 | .close-modal {
334 | font-size: 35px;
335 | color: #67798e;
336 | margin-top: -10px;
337 | cursor: pointer;
338 | }
339 |
340 | .work-modal-head-body {
341 | font-size: 15px;
342 | font-weight: 500;
343 | line-height: 20px;
344 | }
345 |
346 | .work-modal-hr {
347 | color: #ebecf0;
348 | }
349 |
350 | .work-modal-img {
351 | width: 100%;
352 | height: auto;
353 | }
354 |
355 | .work-modal-middle > .description {
356 | font-size: 16px;
357 | font-weight: 400;
358 | line-height: 30px;
359 | }
360 |
361 | #techs {
362 | display: grid;
363 | grid-template-columns: auto auto auto;
364 | justify-content: center;
365 | }
366 |
367 | #techs-item {
368 | margin-top: 10px;
369 | }
370 |
371 | #btn-link {
372 | text-decoration: none;
373 | }
374 |
375 | .btn-icon {
376 | margin-left: 7px;
377 | margin-bottom: -8px;
378 | }
379 |
380 | .work-modal-btn {
381 | margin-top: 10px;
382 | margin-left: 2%;
383 | margin-bottom: 20px;
384 | display: inline-flex;
385 | width: 40%;
386 | justify-content: center;
387 | }
388 |
389 | .my-form {
390 | padding-top: 10vh;
391 | padding-bottom: 1px;
392 | background-image: url("./images/contactbg.png");
393 | background-color: #6070ff;
394 | background-repeat: no-repeat;
395 | background-size: 55%;
396 | background-position: right 21px;
397 | border-radius: 50px 0 0 0;
398 | }
399 |
400 | .contact-title {
401 | font-weight: 700;
402 | font-size: 40px;
403 | line-height: 52px;
404 | text-align: center;
405 | color: #fff;
406 | }
407 |
408 | .contact-explanation {
409 | font-weight: 400;
410 | font-size: 20px;
411 | line-height: 28px;
412 | text-align: center;
413 | color: #fff;
414 | }
415 |
416 | form {
417 | display: flex;
418 | flex-direction: column;
419 | }
420 |
421 | form input {
422 | width: 90%;
423 |
424 | /* margin-bottom: 20px; */
425 | border: 1px solid #cfd8dc;
426 | border-radius: 8px;
427 | padding: 15px;
428 | }
429 |
430 | form > div {
431 | margin-bottom: 20px;
432 | }
433 |
434 | #useremail {
435 | margin-bottom: 0;
436 | }
437 |
438 | .email-div {
439 | display: flex;
440 | flex-direction: column;
441 | }
442 |
443 | .validator-red {
444 | width: 95%;
445 | background-color: #fff;
446 | color: red;
447 | padding: 2px;
448 | border: 1px solid red;
449 | text-align: center;
450 | border-radius: 5px;
451 | }
452 |
453 | .validator-green {
454 | width: 95%;
455 | background-color: #fff;
456 | color: green;
457 | padding: 2px;
458 | border: 1px solid green;
459 | border-radius: 5px;
460 | text-align: center;
461 | }
462 |
463 | form textarea {
464 | width: 90%;
465 | border-radius: 8px;
466 | border: 1px solid #cfd8dc;
467 | padding: 15px;
468 | margin-bottom: 10px;
469 | }
470 |
471 | .go-home-bar {
472 | border: 5px solid black;
473 | border-radius: 5px;
474 | width: 30%;
475 | align-items: center;
476 | margin-top: 30px;
477 | margin-bottom: 5px;
478 | }
479 |
480 | /* Medium devices (landscape tablets, 768px and up) */
481 | @media only screen and (min-width: 768px) {
482 | #menu-icon {
483 | display: none;
484 | }
485 |
486 | a {
487 | text-decoration-line: none;
488 | color: #344563;
489 | }
490 |
491 | .container {
492 | padding-right: 10%;
493 | padding-left: 10%;
494 | }
495 |
496 | .navbar {
497 | padding-top: 0;
498 | padding-bottom: 0;
499 | }
500 |
501 | .menu-list {
502 | display: flex;
503 | flex-direction: row;
504 | justify-content: space-between;
505 | }
506 |
507 | .menu-list > li {
508 | margin-left: 30px;
509 | list-style-type: none;
510 | font-weight: 600;
511 | font-size: 15px;
512 | line-height: 20px;
513 | color: #344563;
514 | }
515 |
516 | .menu-list > li > a:hover {
517 | color: #6070ff;
518 | }
519 |
520 | .hero-holder {
521 | background-color: #e5e5e5;
522 | }
523 |
524 | .hero {
525 | display: flex;
526 | flex-direction: column;
527 | align-items: center;
528 | justify-content: center;
529 | height: 100vh;
530 | background-image: url("./images/desktop/herobg.png");
531 | background-color: #fff;
532 | background-repeat: no-repeat;
533 | background-size: 95%;
534 | border-radius: 0 0 0 50px;
535 | }
536 |
537 | .greetings {
538 | color: #091e42;
539 | font-size: 48px;
540 | font-weight: 700;
541 | animation-duration: 3s;
542 | animation-name: slidein;
543 | }
544 |
545 | @keyframes slidein {
546 | from {
547 | margin-left: 100%;
548 | width: 300%;
549 | }
550 |
551 | to {
552 | margin-left: 0%;
553 | width: 100%;
554 | }
555 | }
556 |
557 | .about-me {
558 | font-weight: 400;
559 | font-size: 20px;
560 | color: #344563;
561 | text-decoration: none;
562 | line-height: 28px;
563 | }
564 |
565 | .hero > .container {
566 | padding-left: 15%;
567 | padding-right: 15%;
568 | }
569 |
570 | .icon-group li a i:hover {
571 | color: #6070ff;
572 | transform: scale(2);
573 | transition: ease 0.6s;
574 | }
575 |
576 | .cards {
577 | display: flex;
578 | flex-direction: row;
579 | padding: 10px;
580 | cursor: pointer;
581 | }
582 |
583 | .cards img {
584 | width: 50%;
585 | transition: width 2s, height 2s;
586 | }
587 |
588 | .cards img:hover {
589 | width: 55%;
590 | height: auto;
591 | }
592 |
593 | .cards img.swap {
594 | order: 1;
595 | }
596 |
597 | .card-data {
598 | padding-left: 20px;
599 | }
600 |
601 | h1.title {
602 | font-size: 40px;
603 | font-weight: 700;
604 | color: #172b4d;
605 | margin-top: 30px;
606 | margin-bottom: 10px;
607 | line-height: 52px;
608 | }
609 |
610 | .position {
611 | display: flex;
612 | flex-direction: row;
613 | align-items: center;
614 | }
615 |
616 | .position .place {
617 | font-weight: 600;
618 | font-size: 13px;
619 | color: #344563;
620 | }
621 |
622 | .position .post-name {
623 | font-weight: 600;
624 | font-size: 13px;
625 | color: #7a869a;
626 | padding-left: 20px;
627 | }
628 |
629 | .position .post-year {
630 | font-weight: 600;
631 | font-size: 13px;
632 | color: #7a869a;
633 | padding-left: 20px;
634 | }
635 |
636 | p.description {
637 | font-weight: 400;
638 | font-size: 16px;
639 | color: #344563;
640 | }
641 |
642 | .about-myself {
643 | display: flex;
644 | }
645 |
646 | .about-myself-intro {
647 | width: 50%;
648 | border-radius: 0 0 0 0;
649 | padding-bottom: 10vh;
650 | padding-left: 5%;
651 | }
652 |
653 | .about-myself-skills {
654 | padding-top: 10vh;
655 | width: 50%;
656 | border-radius: 0 50px 0 0;
657 | padding-bottom: 10vh;
658 | padding-right: 5%;
659 | }
660 |
661 | .sub-skills {
662 | display: flex;
663 | flex-direction: row;
664 | }
665 |
666 | .sub-skill {
667 | display: flex;
668 | flex-direction: column;
669 | margin-bottom: 10px;
670 | margin-left: 0;
671 | margin-right: 10px;
672 | }
673 |
674 | .sub-skill-img {
675 | width: 50px;
676 | height: 50px;
677 | border-radius: 50%;
678 | margin-right: 10px;
679 | }
680 |
681 | .work-modal-middle {
682 | display: flex;
683 | flex-direction: row;
684 | }
685 |
686 | .work-modal-middle > .description {
687 | width: 60%;
688 | }
689 |
690 | .work-modal-middle > .work-modal-middle-group {
691 | width: 40%;
692 | }
693 |
694 | .work-modal-hr {
695 | color: #ebecf0;
696 | }
697 |
698 | .work-modal-img {
699 | width: 100%;
700 | height: 586px;
701 | }
702 |
703 | .sub-skill-name {
704 | font-weight: 600;
705 | font-size: 15px;
706 | color: #253858;
707 | padding-top: 0;
708 | }
709 |
710 | .my-form {
711 | background-image: url("./images/desktop/contactbg.png");
712 | background-color: #6070ff;
713 | background-repeat: no-repeat;
714 | background-size: 90% 95%;
715 | padding-right: 30%;
716 | padding-left: 30%;
717 | padding-bottom: 10vh;
718 | }
719 |
720 | .contact-title {
721 | animation-duration: 3s;
722 | animation-name: slidein;
723 | }
724 |
725 | #center {
726 | display: flex;
727 | flex-direction: column;
728 | justify-content: center;
729 | align-items: center;
730 | }
731 |
732 | .go-home-bar {
733 | display: none;
734 | }
735 | }
736 |
--------------------------------------------------------------------------------