├── .github
└── workflows
│ └── static.yml
├── .vscode
└── settings.json
├── README.md
├── assets
├── css
│ ├── style.css
│ └── terminal.css
├── font
│ └── Cracked Code.ttf
├── images
│ ├── BH.PNG
│ ├── Binary-hub-logo.png
│ ├── ULK_Logo.png
│ ├── UR-AMS.png
│ ├── University_of_Rwanda_-_LOGO.png
│ ├── assee.png
│ ├── avatar-1.png
│ ├── avatar-2.png
│ ├── avatar-3.png
│ ├── avatar-4.png
│ ├── bakame-coders-logo.png
│ ├── bakame-web.png
│ ├── bhb.PNG
│ ├── binaryhub-website.png
│ ├── icon-app.svg
│ ├── icon-design.svg
│ ├── icon-dev.svg
│ ├── icon-photo-.svg
│ ├── icon-photo.svg
│ ├── icon-quote.svg
│ ├── logo.ico
│ ├── logo.svg
│ ├── meuh.png
│ ├── my-avatar.png
│ ├── pizza.png
│ ├── portifolio.png
│ ├── real estate.png
│ ├── ui-cv.PNG
│ ├── ulk.png
│ ├── wikilix-logo.png
│ └── wikilix.png
└── js
│ ├── script.js
│ └── terminal.js
├── index.html
└── l Resume.pdf
/.github/workflows/static.yml:
--------------------------------------------------------------------------------
1 | # Simple workflow for deploying static content to GitHub Pages
2 | name: Deploy static content to Pages
3 |
4 | on:
5 | # Runs on pushes targeting the default branch
6 | push:
7 | branches: ["main"]
8 |
9 | # Allows you to run this workflow manually from the Actions tab
10 | workflow_dispatch:
11 |
12 | # Sets permissions of the GITHUB_TOKEN to allow deployment to GitHub Pages
13 | permissions:
14 | contents: read
15 | pages: write
16 | id-token: write
17 |
18 | # Allow only one concurrent deployment, skipping runs queued between the run in-progress and latest queued.
19 | # However, do NOT cancel in-progress runs as we want to allow these production deployments to complete.
20 | concurrency:
21 | group: "pages"
22 | cancel-in-progress: false
23 |
24 | jobs:
25 | # Single deploy job since we're just deploying
26 | deploy:
27 | environment:
28 | name: github-pages
29 | url: ${{ steps.deployment.outputs.page_url }}
30 | runs-on: ubuntu-latest
31 | steps:
32 | - name: Checkout
33 | uses: actions/checkout@v4
34 | - name: Setup Pages
35 | uses: actions/configure-pages@v4
36 | - name: Upload artifact
37 | uses: actions/upload-pages-artifact@v3
38 | with:
39 | # Upload entire repository
40 | path: '.'
41 | - name: Deploy to GitHub Pages
42 | id: deployment
43 | uses: actions/deploy-pages@v4
44 |
--------------------------------------------------------------------------------
/.vscode/settings.json:
--------------------------------------------------------------------------------
1 | {
2 | "liveServer.settings.port": 5503
3 | }
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # My Portfolio
2 |
3 | Welcome to my portfolio! This repository showcases my work, skills, and projects in the world of web development and design.
4 |
5 | ## Table of Contents
6 |
7 | - [About Me](#about-me)
8 | - [Projects](#projects)
9 | - [Skills](#skills)
10 | - [Contact](#contact)
11 |
12 | ## About Me
13 |
14 | I am a passionate web developer with a keen interest in creating user-friendly and visually appealing web UI Design. My journey in the world of web development has been exciting and filled with continuous learning.
15 |
16 | ## Projects
17 |
18 | ### Project 1: WIKILIX ONLINE SERVICE PLATFORM
19 |
20 | - Description: |E-commerce platform where any one can add , sell or buy product.
21 | - Technologies Used: react js, css, node js and mysql.
22 | - Link: https://github.com/bakamecoders/Wikilix_Project
23 |
24 | ### Project 2: BINARY HUB PLATFORM
25 |
26 | - Description: platform for innovator in University of Rwanda corraborate to turn their idea into productivity.
27 | - Technologies Used: html, boastrap, php , mysql.
28 | - Link:https://github.com/Binary-Hub-University-of-Rwanda-CST/binaryhub-website.
29 |
30 | ### Project 2: BAKAME CODERS WEBSITE
31 |
32 | - Description: website to show all information about team bakame coder paasionate team in word of technology.
33 | - Technologies Used: html, boastrap, php , mysql.
34 | - Link:https://bakamecoders.000webhostapp.com/contact.html
35 |
36 |
37 | ## Skills
38 |
39 | - **Front-End Development:** HTML, CSS, JavaScript, React.js
40 | - **Back-End Development:** Node.js, Express.js, MongoDB
41 | - **UI/UX Design:** Figma, Adobe XD
42 | - **Version Control:** Git, GitHub
43 | - **Responsive Design:** Bootstrap
44 |
45 | ## Contact
46 |
47 | - **Email:** edsnkvn@gmail.com
48 | - **GitHub:** https://github.com/codeWithEdison
49 | - **Portfolio:** https://codewithedison.github.io/code-with-edison
50 |
51 | Feel free to reach out to me for collaborations, questions, or just to connect. Let's create something amazing together!
52 |
--------------------------------------------------------------------------------
/assets/css/style.css:
--------------------------------------------------------------------------------
1 | /*-----------------------------------*\
2 | #style.css
3 | \*-----------------------------------*/
4 |
5 |
6 | /**
7 | * copyright 2022 @codewithEdison
8 | */
9 |
10 |
11 |
12 |
13 |
14 | /*-----------------------------------*\
15 | #CUSTOM PROPERTY
16 | \*-----------------------------------*/
17 |
18 | :root {
19 |
20 | /**
21 | * colors
22 | */
23 |
24 | /* gradient */
25 |
26 | --bg-gradient-onyx: linear-gradient(
27 | to bottom right,
28 | hsl(240, 1%, 25%) 3%,
29 | hsl(0, 0%, 19%) 97%
30 | );
31 | --bg-gradient-jet: linear-gradient(
32 | to bottom right,
33 | hsla(240, 1%, 18%, 0.251) 0%,
34 | hsla(240, 2%, 11%, 0) 100%
35 | ), hsl(240, 2%, 13%);
36 | --bg-gradient-yellow-1: linear-gradient(
37 | to bottom right,
38 | hsl(45, 100%, 71%) 0%,
39 | hsla(36, 100%, 69%, 0) 50%
40 | );
41 | --bg-gradient-yellow-2: linear-gradient(
42 | 135deg,
43 | hsla(45, 100%, 71%, 0.251) 0%,
44 | hsla(35, 100%, 68%, 0) 59.86%
45 | ), hsl(240, 2%, 13%);
46 | --border-gradient-onyx: linear-gradient(
47 | to bottom right,
48 | hsl(0, 0%, 25%) 0%,
49 | hsla(0, 0%, 25%, 0) 50%
50 | );
51 | --text-gradient-yellow: linear-gradient(
52 | to right,
53 | hsl(45, 100%, 72%),
54 | hsl(35, 100%, 68%)
55 | );
56 |
57 | /* solid */
58 |
59 | --jet: hsl(0, 0%, 22%);
60 | --onyx: hsl(240, 1%, 17%);
61 | --eerie-black-1: hsl(240, 2%, 13%);
62 | --eerie-black-2: hsl(240, 2%, 12%);
63 | --smoky-black: hsl(0, 0%, 7%);
64 | --white-1: hsl(0, 0%, 100%);
65 | --white-2: hsl(0, 0%, 98%);
66 | --orange-yellow-crayola: hsl(45, 100%, 72%);
67 | --vegas-gold: hsl(45, 54%, 58%);
68 | --light-gray: hsl(0, 0%, 84%);
69 | --light-gray-70: hsla(0, 0%, 84%, 0.7);
70 | --bittersweet-shimmer: hsl(0, 43%, 51%);
71 |
72 | /**
73 | * typography
74 | */
75 |
76 | /* font-family */
77 | --ff-poppins: 'Poppins', sans-serif;
78 |
79 | /* font-size */
80 | --fs-1: 24px;
81 | --fs-2: 18px;
82 | --fs-3: 17px;
83 | --fs-4: 16px;
84 | --fs-5: 15px;
85 | --fs-6: 14px;
86 | --fs-7: 13px;
87 | --fs-8: 11px;
88 |
89 | /* font-weight */
90 | --fw-300: 300;
91 | --fw-400: 400;
92 | --fw-500: 500;
93 | --fw-600: 600;
94 |
95 | /**
96 | * shadow
97 | */
98 |
99 | --shadow-1: -4px 8px 24px hsla(0, 0%, 0%, 0.25);
100 | --shadow-2: 0 16px 30px hsla(0, 0%, 0%, 0.25);
101 | --shadow-3: 0 16px 40px hsla(0, 0%, 0%, 0.25);
102 | --shadow-4: 0 25px 50px hsla(0, 0%, 0%, 0.15);
103 | --shadow-5: 0 24px 80px hsla(0, 0%, 0%, 0.25);
104 |
105 | /**
106 | * transition
107 | */
108 |
109 | --transition-1: 0.25s ease;
110 | --transition-2: 0.5s ease-in-out;
111 |
112 | }
113 |
114 |
115 |
116 |
117 |
118 | /*-----------------------------------*\
119 | #RESET
120 | \*-----------------------------------*/
121 |
122 | *, *::before, *::after {
123 | margin: 0;
124 | padding: 0;
125 | box-sizing: border-box;
126 | }
127 |
128 | a { text-decoration: none; }
129 |
130 | li { list-style: none; }
131 |
132 | img, ion-icon, a, button, time, span { display: block; }
133 |
134 | button {
135 | font: inherit;
136 | background: none;
137 | border: none;
138 | text-align: left;
139 | cursor: pointer;
140 | }
141 |
142 | input, textarea {
143 | display: block;
144 | width: 100%;
145 | background: none;
146 | font: inherit;
147 | }
148 |
149 | ::selection {
150 | background: var(--orange-yellow-crayola);
151 | color: var(--smoky-black);
152 | }
153 |
154 | :focus { outline-color: var(--orange-yellow-crayola); }
155 |
156 | html { font-family: var(--ff-poppins); }
157 |
158 | body { background: var(--smoky-black); }
159 |
160 |
161 |
162 |
163 |
164 | /*-----------------------------------*\
165 | #REUSED STYLE
166 | \*-----------------------------------*/
167 |
168 | .sidebar,
169 | article {
170 | background: var(--eerie-black-2);
171 | border: 1px solid var(--jet);
172 | border-radius: 20px;
173 | padding: 15px;
174 | box-shadow: var(--shadow-1);
175 | z-index: 1;
176 | }
177 |
178 | .separator {
179 | width: 100%;
180 | height: 1px;
181 | background: var(--jet);
182 | margin: 16px 0;
183 | }
184 |
185 | .icon-box {
186 | position: relative;
187 | background: var(--border-gradient-onyx);
188 | width: 30px;
189 | height: 30px;
190 | border-radius: 8px;
191 | display: flex;
192 | justify-content: center;
193 | align-items: center;
194 | font-size: 16px;
195 | color: var(--orange-yellow-crayola);
196 | box-shadow: var(--shadow-1);
197 | z-index: 1;
198 | }
199 | /* social-media icons */
200 | .socials-icons{
201 | color: var(--orange-yellow-crayola);
202 |
203 | }
204 |
205 | .icon-box::before {
206 | content: "";
207 | position: absolute;
208 | inset: 1px;
209 | background: var(--eerie-black-1);
210 | border-radius: inherit;
211 | z-index: -1;
212 | }
213 |
214 | .icon-box ion-icon { --ionicon-stroke-width: 35px; }
215 |
216 | article { display: none; }
217 |
218 | article.active {
219 | display: block;
220 | animation: fade 0.5s ease backwards;
221 | }
222 |
223 | @keyframes fade {
224 | 0% { opacity: 0; }
225 | 100% { opacity: 1; }
226 | }
227 |
228 | .h2,
229 | .h3,
230 | .h4,
231 | .h5 {
232 | color: var(--white-2);
233 | text-transform: capitalize;
234 | }
235 |
236 | .h2 { font-size: var(--fs-1); }
237 |
238 | .h3 { font-size: var(--fs-2); }
239 |
240 | .h4 { font-size: var(--fs-4); }
241 |
242 | .h5 {
243 | font-size: var(--fs-7);
244 | font-weight: var(--fw-500);
245 | }
246 |
247 | .article-title {
248 | position: relative;
249 | padding-bottom: 7px;
250 | }
251 |
252 | .article-title::after {
253 | content: "";
254 | position: absolute;
255 | bottom: 0;
256 | left: 0;
257 | width: 30px;
258 | height: 3px;
259 | background: var(--text-gradient-yellow);
260 | border-radius: 3px;
261 | }
262 |
263 | .has-scrollbar::-webkit-scrollbar {
264 | width: 5px; /* for vertical scrollbar */
265 | height: 5px; /* for horizontal scrollbar */
266 | }
267 |
268 | .has-scrollbar::-webkit-scrollbar-track {
269 | background: var(--onyx);
270 | border-radius: 5px;
271 | }
272 |
273 | .has-scrollbar::-webkit-scrollbar-thumb {
274 | background: var(--orange-yellow-crayola);
275 | border-radius: 5px;
276 | }
277 |
278 | .has-scrollbar::-webkit-scrollbar-button { width: 20px; }
279 |
280 | .content-card {
281 | position: relative;
282 | background: var(--border-gradient-onyx);
283 | padding: 15px;
284 | padding-top: 45px;
285 | border-radius: 14px;
286 | box-shadow: var(--shadow-2);
287 | cursor: pointer;
288 | z-index: 1;
289 | }
290 |
291 | .content-card::before {
292 | content: "";
293 | position: absolute;
294 | inset: 1px;
295 | background: var(--bg-gradient-jet);
296 | border-radius: inherit;
297 | z-index: -1;
298 | }
299 |
300 |
301 |
302 |
303 |
304 | /*-----------------------------------*\
305 | #MAIN
306 | \*-----------------------------------*/
307 |
308 | main {
309 | margin: 15px 12px;
310 | margin-bottom: 75px;
311 | min-width: 259px;
312 | }
313 |
314 |
315 |
316 |
317 |
318 | /*-----------------------------------*\
319 | #SIDEBAR
320 | \*-----------------------------------*/
321 |
322 | .sidebar {
323 | margin-bottom: 15px;
324 | max-height: 112px;
325 | overflow: hidden;
326 | transition: var(--transition-2);
327 | }
328 |
329 | .sidebar.active { max-height: 405px; }
330 |
331 | .sidebar-info {
332 | position: relative;
333 | display: flex;
334 | justify-content: flex-start;
335 | align-items: center;
336 | gap: 15px;
337 | }
338 |
339 | .avatar-box {
340 | background: var(--bg-gradient-onyx);
341 | border-radius: 20px;
342 | }
343 |
344 | .info-content .name {
345 | color: var(--white-2);
346 | font-size: var(--fs-3);
347 | font-weight: var(--fw-500);
348 | letter-spacing: -0.25px;
349 | margin-bottom: 10px;
350 | }
351 |
352 | .info-content .title {
353 | color: var(--white-1);
354 | background: var(--onyx);
355 | font-size: var(--fs-8);
356 | font-weight: var(--fw-300);
357 | width: max-content;
358 | padding: 3px 12px;
359 | border-radius: 8px;
360 | }
361 | .info_more-btn {
362 | position: absolute;
363 | top: -15px;
364 | right: -15px;
365 | border-radius: 0 15px;
366 | font-size: 13px;
367 | color: var(--orange-yellow-crayola);
368 | background: var(--border-gradient-onyx);
369 | padding: 10px;
370 | box-shadow: var(--shadow-2);
371 | transition: var(--transition-1);
372 | z-index: 1;
373 | }
374 | .last-name{
375 | color: var(--white-2);
376 | font-size: medium;
377 | }
378 | .nick-name{
379 | color: var(--orange-yellow-crayola);
380 | font-size: medium;
381 | font-weight: bold;
382 | margin: 2px;
383 | }
384 |
385 | .info_more-btn::before {
386 | content: "";
387 | position: absolute;
388 | inset: 1px;
389 | border-radius: inherit;
390 | background: var(--bg-gradient-jet);
391 | transition: var(--transition-1);
392 | z-index: -1;
393 | }
394 |
395 | .info_more-btn:hover,
396 | .info_more-btn:focus { background: var(--bg-gradient-yellow-1); }
397 |
398 | .info_more-btn:hover::before,
399 | .info_more-btn:focus::before { background: var(--bg-gradient-yellow-2); }
400 |
401 | .info_more-btn span { display: none; }
402 |
403 | .sidebar-info_more {
404 | opacity: 0;
405 | visibility: hidden;
406 | transition: var(--transition-2);
407 | }
408 |
409 | .sidebar.active .sidebar-info_more {
410 | opacity: 1;
411 | visibility: visible;
412 | }
413 |
414 | .contacts-list {
415 | display: grid;
416 | grid-template-columns: 1fr;
417 | gap: 16px;
418 | }
419 |
420 | .contact-item {
421 | min-width: 100%;
422 | display: flex;
423 | align-items: center;
424 | gap: 16px;
425 | }
426 |
427 | .contact-info {
428 | max-width: calc(100% - 46px);
429 | width: calc(100% - 46px);
430 | }
431 |
432 | .contact-title {
433 | color: var(--light-gray-70);
434 | font-size: var(--fs-8);
435 | text-transform: uppercase;
436 | margin-bottom: 2px;
437 | }
438 |
439 | .contact-info :is(.contact-link, time, address) {
440 | color: var(--white-2);
441 | font-size: var(--fs-7);
442 | }
443 |
444 | .contact-info address { font-style: normal; }
445 |
446 | .social-list {
447 | display: flex;
448 | justify-content: flex-start;
449 | align-items: center;
450 | gap: 15px;
451 | padding-bottom: 4px;
452 | padding-left: 7px;
453 | }
454 |
455 | .social-item .social-link {
456 | color: var(--light-gray-70);
457 | font-size: 18px;
458 | }
459 |
460 |
461 | .social-item .social-link:hover { color: var(--light-gray); }
462 |
463 |
464 |
465 |
466 |
467 | /*-----------------------------------*\
468 | #NAVBAR
469 | \*-----------------------------------*/
470 |
471 | .navbar {
472 | position: fixed;
473 | bottom: 0;
474 | left: 0;
475 | width: 100%;
476 | background: hsla(240, 1%, 17%, 0.75);
477 | backdrop-filter: blur(10px);
478 | border: 1px solid var(--jet);
479 | border-radius: 12px 12px 0 0;
480 | box-shadow: var(--shadow-2);
481 | z-index: 5;
482 | }
483 |
484 | .navbar-list {
485 | display: flex;
486 | flex-wrap: wrap;
487 | justify-content: center;
488 | align-items: center;
489 | padding: 0 10px;
490 | }
491 |
492 | .navbar-link {
493 | color: var(--light-gray);
494 | font-size: var(--fs-8);
495 | padding: 20px 7px;
496 | transition: color var(--transition-1);
497 | }
498 |
499 | .navbar-link:hover,
500 | .navbar-link:focus { color: var(--light-gray-70); }
501 |
502 | .navbar-link.active { color: var(--orange-yellow-crayola); }
503 |
504 |
505 |
506 |
507 |
508 | /*-----------------------------------*\
509 | #ABOUT
510 | \*-----------------------------------*/
511 |
512 | .about .article-title { margin-bottom: 15px; }
513 |
514 | .about-text {
515 | color: var(--light-gray);
516 | font-size: var(--fs-6);
517 | font-weight: var(--fw-300);
518 | line-height: 1.6;
519 | }
520 |
521 | .about-text p { margin-bottom: 15px; }
522 |
523 |
524 |
525 | /**
526 | * #service
527 | */
528 |
529 | .service { margin-bottom: 35px; }
530 |
531 | .service-title { margin-bottom: 20px; }
532 |
533 | .service-list {
534 | display: grid;
535 | grid-template-columns: 1fr;
536 | gap: 20px;
537 | }
538 |
539 | .service-item {
540 | position: relative;
541 | background: var(--border-gradient-onyx);
542 | padding: 20px;
543 | border-radius: 14px;
544 | box-shadow: var(--shadow-2);
545 | z-index: 1;
546 | }
547 |
548 | .service-item::before {
549 | content: "";
550 | position: absolute;
551 | inset: 1px;
552 | background: var(--bg-gradient-jet);
553 | border-radius: inherit;
554 | z-index: -1;
555 | }
556 |
557 | .service-icon-box { margin-bottom: 10px; }
558 |
559 | .service-icon-box img { margin: auto; }
560 |
561 | .service-content-box { text-align: center; }
562 |
563 | .service-item-title { margin-bottom: 7px; }
564 |
565 | .service-item-text {
566 | color: var(--light-gray);
567 | font-size: var(--fs-6);
568 | font-weight: var(--fw-3);
569 | line-height: 1.6;
570 | }
571 |
572 |
573 | /**
574 | * #testimonials
575 | */
576 |
577 | .testimonials { margin-bottom: 30px; }
578 |
579 | .testimonials-title { margin-bottom: 20px; }
580 |
581 | .testimonials-list {
582 | display: flex;
583 | justify-content: flex-start;
584 | align-items: flex-start;
585 | gap: 15px;
586 | margin: 0 -15px;
587 | padding: 25px 15px;
588 | padding-bottom: 35px;
589 | overflow-x: auto;
590 | scroll-behavior: smooth;
591 | overscroll-behavior-inline: contain;
592 | scroll-snap-type: inline mandatory;
593 | }
594 |
595 | .testimonials-item {
596 | min-width: 100%;
597 | scroll-snap-align: center;
598 | }
599 |
600 | .testimonials-avatar-box {
601 | position: absolute;
602 | top: 0;
603 | left: 0;
604 | transform: translate(15px, -25px);
605 | background: var(--bg-gradient-onyx);
606 | border-radius: 14px;
607 | box-shadow: var(--shadow-1);
608 | }
609 |
610 | .testimonials-item-title { margin-bottom: 7px; }
611 |
612 | .testimonials-text {
613 | color: var(--light-gray);
614 | font-size: var(--fs-6);
615 | font-weight: var(--fw-300);
616 | line-height: 1.6;
617 | display: -webkit-box;
618 | line-clamp: 4;
619 | -webkit-line-clamp: 4;
620 | -webkit-box-orient: vertical;
621 | overflow: hidden;
622 | }
623 |
624 |
625 | /**
626 | * #testimonials-modal
627 | */
628 |
629 | .modal-container {
630 | position: fixed;
631 | top: 0;
632 | left: 0;
633 | width: 100%;
634 | height: 100%;
635 | display: flex;
636 | justify-content: center;
637 | align-items: center;
638 | overflow-y: auto;
639 | overscroll-behavior: contain;
640 | z-index: 20;
641 | pointer-events: none;
642 | visibility: hidden;
643 | }
644 |
645 | .modal-container::-webkit-scrollbar { display: none; }
646 |
647 | .modal-container.active {
648 | pointer-events: all;
649 | visibility: visible;
650 | }
651 |
652 | .overlay {
653 | position: fixed;
654 | top: 0;
655 | left: 0;
656 | width: 100%;
657 | height: 100vh;
658 | background: hsl(0, 0%, 5%);
659 | opacity: 0;
660 | visibility: hidden;
661 | pointer-events: none;
662 | z-index: 1;
663 | transition: var(--transition-1);
664 | }
665 |
666 | .overlay.active {
667 | opacity: 0.8;
668 | visibility: visible;
669 | pointer-events: all;
670 | }
671 |
672 | .testimonials-modal {
673 | background: var(--eerie-black-2);
674 | position: relative;
675 | padding: 15px;
676 | margin: 15px 12px;
677 | border: 1px solid var(--jet);
678 | border-radius: 14px;
679 | box-shadow: var(--shadow-5);
680 | transform: scale(1.2);
681 | opacity: 0;
682 | transition: var(--transition-1);
683 | z-index: 2;
684 | }
685 |
686 | .modal-container.active .testimonials-modal {
687 | transform: scale(1);
688 | opacity: 1;
689 | }
690 |
691 | .modal-close-btn {
692 | position: absolute;
693 | top: 15px;
694 | right: 15px;
695 | background: var(--onyx);
696 | border-radius: 8px;
697 | width: 32px;
698 | height: 32px;
699 | display: flex;
700 | justify-content: center;
701 | align-items: center;
702 | color: var(--white-2);
703 | font-size: 18px;
704 | opacity: 0.7;
705 | }
706 |
707 | .modal-close-btn:hover,
708 | .modal-close-btn:focus { opacity: 1; }
709 |
710 | .modal-close-btn ion-icon { --ionicon-stroke-width: 50px; }
711 |
712 | .modal-avatar-box {
713 | background: var(--bg-gradient-onyx);
714 | width: max-content;
715 | border-radius: 14px;
716 | margin-bottom: 15px;
717 | box-shadow: var(--shadow-2);
718 | }
719 |
720 | .modal-img-wrapper > img { display: none; }
721 |
722 | .modal-title { margin-bottom: 4px; }
723 |
724 | .modal-content time {
725 | font-size: var(--fs-6);
726 | color: var(--light-gray-70);
727 | font-weight: var(--fw-300);
728 | margin-bottom: 10px;
729 | }
730 |
731 | .modal-content p {
732 | color: var(--light-gray);
733 | font-size: var(--fs-6);
734 | font-weight: var(--fw-300);
735 | line-height: 1.6;
736 | }
737 |
738 |
739 | /**
740 | * #clients
741 | */
742 |
743 | .clients { margin-bottom: 15px; }
744 |
745 | .clients-list {
746 | display: flex;
747 | justify-content: flex-start;
748 | align-items: flex-start;
749 | gap: 15px;
750 | margin: 0 -15px;
751 | padding: 25px;
752 | padding-bottom: 25px;
753 | overflow-x: auto;
754 | scroll-behavior: smooth;
755 | overscroll-behavior-inline: contain;
756 | scroll-snap-type: inline mandatory;
757 | scroll-padding-inline: 25px;
758 | }
759 |
760 | .clients-item {
761 | min-width: 50%;
762 | scroll-snap-align: start;
763 | }
764 |
765 | .clients-item img {
766 | width: 100%;
767 | filter: grayscale(1);
768 | transition: var(--transition-1);
769 | }
770 |
771 | .clients-item img:hover { filter: grayscale(0); }
772 |
773 |
774 |
775 |
776 |
777 | /*-----------------------------------*\
778 | #RESUME
779 | \*-----------------------------------*/
780 |
781 | .article-title { margin-bottom: 30px; }
782 |
783 |
784 | /**
785 | * education and experience
786 | */
787 |
788 | .timeline { margin-bottom: 30px; }
789 |
790 | .timeline .title-wrapper {
791 | display: flex;
792 | align-items: center;
793 | gap: 15px;
794 | margin-bottom: 25px;
795 | }
796 |
797 | .timeline-list {
798 | font-size: var(--fs-6);
799 | margin-left: 45px;
800 | }
801 |
802 | .timeline-item { position: relative; }
803 |
804 | .timeline-item:not(:last-child) { margin-bottom: 20px; }
805 |
806 | .timeline-item-title {
807 | font-size: var(--fs-6);
808 | line-height: 1.3;
809 | margin-bottom: 7px;
810 | }
811 |
812 | .timeline-list span {
813 | color: var(--vegas-gold);
814 | font-weight: var(--fw-400);
815 | line-height: 1.6;
816 | }
817 |
818 | .timeline-item:not(:last-child)::before {
819 | content: "";
820 | position: absolute;
821 | top: -25px;
822 | left: -30px;
823 | width: 1px;
824 | height: calc(100% + 50px);
825 | background: var(--jet);
826 | }
827 |
828 | .timeline-item::after {
829 | content: "";
830 | position: absolute;
831 | top: 5px;
832 | left: -33px;
833 | height: 6px;
834 | width: 6px;
835 | background: var(--text-gradient-yellow);
836 | border-radius: 50%;
837 | box-shadow: 0 0 0 4px var(--jet);
838 | }
839 |
840 | .timeline-text {
841 | color: var(--light-gray);
842 | font-weight: var(--fw-300);
843 | line-height: 1.6;
844 | }
845 |
846 |
847 | /**
848 | * skills
849 | */
850 |
851 | .skills-title { margin-bottom: 20px; }
852 |
853 | .skills-list { padding: 20px; }
854 |
855 |
856 | .skills-item:not(:last-child) { margin-bottom: 15px; }
857 |
858 | .skill .title-wrapper {
859 | display: flex;
860 | align-items: center;
861 | gap: 5px;
862 | margin-bottom: 8px;
863 | }
864 |
865 | .skill .title-wrapper data {
866 | color: var(--light-gray);
867 | font-size: var(--fs-7);
868 | font-weight: var(--fw-300);
869 | }
870 |
871 | .skill-progress-bg {
872 | background: var(--jet);
873 | width: 100%;
874 | height: 8px;
875 | border-radius: 10px;
876 | }
877 |
878 | .skill-progress-fill {
879 | background: var(--text-gradient-yellow);
880 | height: 100%;
881 | border-radius: inherit;
882 | }
883 |
884 |
885 |
886 |
887 |
888 | /*-----------------------------------*\
889 | #PORTFOLIO
890 | \*-----------------------------------*/
891 |
892 | .filter-list { display: none; }
893 |
894 | .filter-select-box {
895 | position: relative;
896 | margin-bottom: 25px;
897 | }
898 |
899 | .filter-select {
900 | background: var(--eerie-black-2);
901 | color: var(--light-gray);
902 | display: flex;
903 | justify-content: space-between;
904 | align-items: center;
905 | width: 100%;
906 | padding: 12px 16px;
907 | border: 1px solid var(--jet);
908 | border-radius: 14px;
909 | font-size: var(--fs-6);
910 | font-weight: var(--fw-300);
911 | }
912 |
913 | .filter-select.active .select-icon { transform: rotate(0.5turn); }
914 |
915 | .select-list {
916 | background: var(--eerie-black-2);
917 | position: absolute;
918 | top: calc(100% + 6px);
919 | width: 100%;
920 | padding: 6px;
921 | border: 1px solid var(--jet);
922 | border-radius: 14px;
923 | z-index: 2;
924 | opacity: 0;
925 | visibility: hidden;
926 | pointer-events: none;
927 | transition: 0.15s ease-in-out;
928 | }
929 |
930 | .filter-select.active + .select-list {
931 | opacity: 1;
932 | visibility: visible;
933 | pointer-events: all;
934 | }
935 |
936 | .select-item button {
937 | background: var(--eerie-black-2);
938 | color: var(--light-gray);
939 | font-size: var(--fs-6);
940 | font-weight: var(--fw-300);
941 | text-transform: capitalize;
942 | width: 100%;
943 | padding: 8px 10px;
944 | border-radius: 8px;
945 | }
946 |
947 | .select-item button:hover { --eerie-black-2: hsl(240, 2%, 20%); }
948 |
949 | .project-list {
950 | display: grid;
951 | grid-template-columns: 1fr;
952 | gap: 30px;
953 | margin-bottom: 10px;
954 | }
955 |
956 | .project-item { display: none; }
957 |
958 | .project-item.active {
959 | display: block;
960 | animation: scaleUp 0.25s ease forwards;
961 | }
962 |
963 | @keyframes scaleUp {
964 | 0% { transform: scale(0.5); }
965 | 100% { transform: scale(1); }
966 | }
967 |
968 | .project-item > a { width: 100%; }
969 |
970 | .project-img {
971 | position: relative;
972 | width: 100%;
973 | height: 200px;
974 | border-radius: 16px;
975 | overflow: hidden;
976 | margin-bottom: 15px;
977 | }
978 |
979 | .project-img::before {
980 | content: "";
981 | position: absolute;
982 | top: 0;
983 | left: 0;
984 | width: 100%;
985 | height: 100%;
986 | background: transparent;
987 | z-index: 1;
988 | transition: var(--transition-1);
989 | }
990 |
991 | .project-item > a:hover .project-img::before { background: hsla(0, 0%, 0%, 0.5); }
992 |
993 | .project-item-icon-box {
994 | --scale: 0.8;
995 |
996 | background: var(--jet);
997 | color: var(--orange-yellow-crayola);
998 | position: absolute;
999 | top: 50%;
1000 | left: 50%;
1001 | transform: translate(-50%, -50%) scale(var(--scale));
1002 | font-size: 20px;
1003 | padding: 18px;
1004 | border-radius: 12px;
1005 | opacity: 0;
1006 | z-index: 1;
1007 | transition: var(--transition-1);
1008 | }
1009 |
1010 | .project-item > a:hover .project-item-icon-box {
1011 | --scale: 1;
1012 | opacity: 1;
1013 | }
1014 |
1015 | .project-item-icon-box ion-icon { --ionicon-stroke-width: 50px; }
1016 |
1017 | .project-img img {
1018 | width: 100%;
1019 | height: 100%;
1020 | object-fit: cover;
1021 | transition: var(--transition-1);
1022 | }
1023 |
1024 | .project-item > a:hover img { transform: scale(1.1); }
1025 |
1026 | .project-title,
1027 | .project-category { margin-left: 10px; }
1028 |
1029 | .project-title {
1030 | color: var(--white-2);
1031 | font-size: var(--fs-5);
1032 | font-weight: var(--fw-400);
1033 | text-transform: capitalize;
1034 | line-height: 1.3;
1035 | }
1036 |
1037 | .project-category {
1038 | color: var(--light-gray-70);
1039 | font-size: var(--fs-6);
1040 | font-weight: var(--fw-300);
1041 | }
1042 |
1043 |
1044 |
1045 |
1046 |
1047 | /*-----------------------------------*\
1048 | #BLOG
1049 | \*-----------------------------------*/
1050 |
1051 | .blog-posts { margin-bottom: 10px; }
1052 |
1053 | .blog-posts-list {
1054 | display: grid;
1055 | grid-template-columns: 1fr;
1056 | gap: 20px;
1057 | }
1058 |
1059 | .blog-post-item > a {
1060 | position: relative;
1061 | background: var(--border-gradient-onyx);
1062 | height: 100%;
1063 | box-shadow: var(--shadow-4);
1064 | border-radius: 16px;
1065 | z-index: 1;
1066 | }
1067 |
1068 | .blog-post-item > a::before {
1069 | content: "";
1070 | position: absolute;
1071 | inset: 1px;
1072 | border-radius: inherit;
1073 | background: var(--eerie-black-1);
1074 | z-index: -1;
1075 | }
1076 |
1077 | .blog-banner-box {
1078 | width: 100%;
1079 | height: 200px;
1080 | border-radius: 12px;
1081 | overflow: hidden;
1082 | }
1083 |
1084 | .blog-banner-box img {
1085 | width: 100%;
1086 | height: 100%;
1087 | object-fit: cover;
1088 | transition: var(--transition-1);
1089 | }
1090 |
1091 | .blog-post-item > a:hover .blog-banner-box img { transform: scale(1.1); }
1092 |
1093 | .blog-content { padding: 15px; }
1094 |
1095 | .blog-meta {
1096 | display: flex;
1097 | justify-content: flex-start;
1098 | align-items: center;
1099 | gap: 7px;
1100 | margin-bottom: 10px;
1101 | }
1102 |
1103 | .blog-meta :is(.blog-category, time) {
1104 | color: var(--light-gray-70);
1105 | font-size: var(--fs-6);
1106 | font-weight: var(--fw-300);
1107 | }
1108 |
1109 | .blog-meta .dot {
1110 | background: var(--light-gray-70);
1111 | width: 4px;
1112 | height: 4px;
1113 | border-radius: 4px;
1114 | }
1115 |
1116 | .blog-item-title {
1117 | margin-bottom: 10px;
1118 | line-height: 1.3;
1119 | transition: var(--transition-1);
1120 | }
1121 |
1122 | .blog-post-item > a:hover .blog-item-title { color: var(--orange-yellow-crayola); }
1123 |
1124 | .blog-text {
1125 | color: var(--light-gray);
1126 | font-size: var(--fs-6);
1127 | font-weight: var(--fw-300);
1128 | line-height: 1.6;
1129 | }
1130 |
1131 |
1132 |
1133 |
1134 |
1135 | /*-----------------------------------*\
1136 | #CONTACT
1137 | \*-----------------------------------*/
1138 |
1139 | .mapbox {
1140 | position: relative;
1141 | height: 250px;
1142 | width: 100%;
1143 | border-radius: 16px;
1144 | margin-bottom: 30px;
1145 | border: 1px solid var(--jet);
1146 | overflow: hidden;
1147 | }
1148 |
1149 | .mapbox figure { height: 100%; }
1150 |
1151 | .mapbox iframe {
1152 | width: 100%;
1153 | height: 100%;
1154 | border: none;
1155 | filter: grayscale(1) invert(1);
1156 | }
1157 |
1158 | .contact-form { margin-bottom: 10px; }
1159 |
1160 | .form-title { margin-bottom: 20px; }
1161 |
1162 | .input-wrapper {
1163 | display: grid;
1164 | grid-template-columns: 1fr;
1165 | gap: 25px;
1166 | margin-bottom: 25px;
1167 | }
1168 |
1169 | .form-input {
1170 | color: var(--white-2);
1171 | font-size: var(--fs-6);
1172 | font-weight: var(--fw-400);
1173 | padding: 13px 20px;
1174 | border: 1px solid var(--jet);
1175 | border-radius: 14px;
1176 | outline: none;
1177 | }
1178 |
1179 | .form-input::placeholder { font-weight: var(--fw-500); }
1180 |
1181 | .form-input:focus { border-color: var(--orange-yellow-crayola); }
1182 |
1183 | textarea.form-input {
1184 | min-height: 100px;
1185 | height: 120px;
1186 | max-height: 200px;
1187 | resize: vertical;
1188 | margin-bottom: 25px;
1189 | }
1190 |
1191 | textarea.form-input::-webkit-resizer { display: none; }
1192 |
1193 | .form-input:focus:invalid { border-color: var(--bittersweet-shimmer); }
1194 |
1195 | .form-btn {
1196 | position: relative;
1197 | width: 100%;
1198 | background: var(--border-gradient-onyx);
1199 | color: var(--orange-yellow-crayola);
1200 | display: flex;
1201 | justify-content: center;
1202 | align-items: center;
1203 | gap: 10px;
1204 | padding: 13px 20px;
1205 | border-radius: 14px;
1206 | font-size: var(--fs-6);
1207 | text-transform: capitalize;
1208 | box-shadow: var(--shadow-3);
1209 | z-index: 1;
1210 | transition: var(--transition-1);
1211 | }
1212 |
1213 | .form-btn::before {
1214 | content: "";
1215 | position: absolute;
1216 | inset: 1px;
1217 | background: var(--bg-gradient-jet);
1218 | border-radius: inherit;
1219 | z-index: -1;
1220 | transition: var(--transition-1);
1221 | }
1222 |
1223 | .form-btn ion-icon { font-size: 16px; }
1224 |
1225 | .form-btn:hover { background: var(--bg-gradient-yellow-1); }
1226 |
1227 | .form-btn:hover::before { background: var(--bg-gradient-yellow-2); }
1228 |
1229 | .form-btn:disabled {
1230 | opacity: 0.7;
1231 | cursor: not-allowed;
1232 | }
1233 |
1234 | .form-btn:disabled:hover { background: var(--border-gradient-onyx); }
1235 |
1236 | .form-btn:disabled:hover::before { background: var(--bg-gradient-jet); }
1237 |
1238 |
1239 |
1240 |
1241 |
1242 | /*-----------------------------------*\
1243 | #RESPONSIVE
1244 | \*-----------------------------------*/
1245 |
1246 | /**
1247 | * responsive larger than 450px screen
1248 | */
1249 |
1250 | @media (min-width: 450px) {
1251 |
1252 | /**
1253 | * client
1254 | */
1255 |
1256 | .clients-item { min-width: calc(33.33% - 10px); }
1257 |
1258 |
1259 |
1260 | /**
1261 | * #PORTFOLIO, BLOG
1262 | */
1263 |
1264 | .project-img,
1265 | .blog-banner-box { height: auto; }
1266 |
1267 | }
1268 |
1269 |
1270 |
1271 |
1272 |
1273 | /**
1274 | * responsive larger than 580px screen
1275 | */
1276 |
1277 | @media (min-width: 580px) {
1278 |
1279 | /**
1280 | * CUSTOM PROPERTY
1281 | */
1282 |
1283 | :root {
1284 |
1285 | /**
1286 | * typography
1287 | */
1288 |
1289 | --fs-1: 32px;
1290 | --fs-2: 24px;
1291 | --fs-3: 26px;
1292 | --fs-4: 18px;
1293 | --fs-6: 15px;
1294 | --fs-7: 15px;
1295 | --fs-8: 12px;
1296 |
1297 | }
1298 |
1299 |
1300 |
1301 | /**
1302 | * #REUSED STYLE
1303 | */
1304 |
1305 | .sidebar, article {
1306 | width: 520px;
1307 | margin-inline: auto;
1308 | padding: 30px;
1309 | }
1310 |
1311 | .article-title {
1312 | font-weight: var(--fw-600);
1313 | padding-bottom: 15px;
1314 | }
1315 |
1316 | .article-title::after {
1317 | width: 40px;
1318 | height: 5px;
1319 | }
1320 |
1321 | .icon-box {
1322 | width: 48px;
1323 | height: 48px;
1324 | border-radius: 12px;
1325 | font-size: 18px;
1326 | }
1327 |
1328 |
1329 |
1330 | /**
1331 | * #MAIN
1332 | */
1333 |
1334 | main {
1335 | margin-top: 60px;
1336 | margin-bottom: 100px;
1337 | }
1338 |
1339 |
1340 |
1341 | /**
1342 | * #SIDEBAR
1343 | */
1344 |
1345 | .sidebar {
1346 | max-height: 180px;
1347 | margin-bottom: 30px;
1348 | }
1349 |
1350 | .sidebar.active { max-height: 584px; }
1351 |
1352 | .sidebar-info { gap: 25px; }
1353 |
1354 | .avatar-box { border-radius: 30px; }
1355 |
1356 | .avatar-box img { width: 120px; }
1357 |
1358 | .info-content .name { margin-bottom: 15px; }
1359 |
1360 | .info-content .title { padding: 5px 18px; }
1361 |
1362 | .info_more-btn {
1363 | top: -30px;
1364 | right: -30px;
1365 | padding: 10px 15px;
1366 | }
1367 |
1368 | .info_more-btn span {
1369 | display: block;
1370 | font-size: var(--fs-8);
1371 | }
1372 |
1373 | .info_more-btn ion-icon { display: none; }
1374 |
1375 | .separator { margin: 32px 0; }
1376 |
1377 | .contacts-list { gap: 20px; }
1378 |
1379 | .contact-info {
1380 | max-width: calc(100% - 64px);
1381 | width: calc(100% - 64px);
1382 | }
1383 |
1384 |
1385 |
1386 | /**
1387 | * #NAVBAR
1388 | */
1389 |
1390 | .navbar { border-radius: 20px 20px 0 0; }
1391 |
1392 | .navbar-list { gap: 20px; }
1393 |
1394 | .navbar-link { --fs-8: 14px; }
1395 |
1396 |
1397 |
1398 | /**
1399 | * #ABOUT
1400 | */
1401 |
1402 | .about .article-title { margin-bottom: 20px; }
1403 |
1404 | .about-text { margin-bottom: 40px; }
1405 |
1406 | /* service */
1407 |
1408 | .service-item {
1409 | display: flex;
1410 | justify-content: flex-start;
1411 | align-items: flex-start;
1412 | gap: 18px;
1413 | padding: 30px;
1414 | }
1415 |
1416 | .service-icon-box {
1417 | margin-bottom: 0;
1418 | margin-top: 5px;
1419 | }
1420 |
1421 | .service-content-box { text-align: left; }
1422 |
1423 | /* testimonials */
1424 |
1425 | .testimonials-title { margin-bottom: 25px; }
1426 |
1427 | .testimonials-list {
1428 | gap: 30px;
1429 | margin: 0 -30px;
1430 | padding: 30px;
1431 | padding-bottom: 35px;
1432 | }
1433 |
1434 | .content-card {
1435 | padding: 30px;
1436 | padding-top: 25px;
1437 | }
1438 |
1439 | .testimonials-avatar-box {
1440 | transform: translate(30px, -30px);
1441 | border-radius: 20px;
1442 | }
1443 |
1444 | .testimonials-avatar-box img { width: 80px; }
1445 |
1446 | .testimonials-item-title {
1447 | margin-bottom: 10px;
1448 | margin-left: 95px;
1449 | }
1450 |
1451 | .testimonials-text {
1452 | line-clamp: 2;
1453 | -webkit-line-clamp: 2;
1454 | }
1455 |
1456 | /* testimonials modal */
1457 |
1458 | .modal-container { padding: 20px; }
1459 |
1460 | .testimonials-modal {
1461 | display: flex;
1462 | justify-content: flex-start;
1463 | align-items: stretch;
1464 | gap: 25px;
1465 | padding: 30px;
1466 | border-radius: 20px;
1467 | }
1468 |
1469 | .modal-img-wrapper {
1470 | display: flex;
1471 | flex-direction: column;
1472 | align-items: center;
1473 | }
1474 |
1475 | .modal-avatar-box {
1476 | border-radius: 18px;
1477 | margin-bottom: 0;
1478 | }
1479 |
1480 | .modal-avatar-box img { width: 65px; }
1481 |
1482 | .modal-img-wrapper > img {
1483 | display: block;
1484 | flex-grow: 1;
1485 | width: 35px;
1486 | }
1487 |
1488 | /* clients */
1489 |
1490 | .clients-list {
1491 | gap: 50px;
1492 | margin: 0 -30px;
1493 | padding: 45px;
1494 | scroll-padding-inline: 45px;
1495 | }
1496 |
1497 | .clients-item { min-width: calc(33.33% - 35px); }
1498 |
1499 |
1500 |
1501 | /**
1502 | * #RESUME
1503 | */
1504 |
1505 | .timeline-list { margin-left: 65px; }
1506 |
1507 | .timeline-item:not(:last-child)::before { left: -40px; }
1508 |
1509 | .timeline-item::after {
1510 | height: 8px;
1511 | width: 8px;
1512 | left: -43px;
1513 | }
1514 |
1515 | .skills-item:not(:last-child) { margin-bottom: 25px; }
1516 |
1517 |
1518 |
1519 | /**
1520 | * #PORTFOLIO, BLOG
1521 | */
1522 |
1523 | .project-img, .blog-banner-box { border-radius: 16px; }
1524 |
1525 | .blog-posts-list { gap: 30px; }
1526 |
1527 | .blog-content { padding: 25px; }
1528 |
1529 |
1530 |
1531 | /**
1532 | * #CONTACT
1533 | */
1534 |
1535 | .mapbox {
1536 | height: 380px;
1537 | border-radius: 18px;
1538 | }
1539 |
1540 | .input-wrapper {
1541 | gap: 30px;
1542 | margin-bottom: 30px;
1543 | }
1544 |
1545 | .form-input { padding: 15px 20px; }
1546 |
1547 | textarea.form-input { margin-bottom: 30px; }
1548 |
1549 | .form-btn {
1550 | --fs-6: 16px;
1551 | padding: 16px 20px;
1552 | }
1553 |
1554 | .form-btn ion-icon { font-size: 18px; }
1555 |
1556 | }
1557 |
1558 |
1559 |
1560 |
1561 |
1562 | /**
1563 | * responsive larger than 768px screen
1564 | */
1565 |
1566 | @media (min-width: 768px) {
1567 |
1568 | /**
1569 | * REUSED STYLE
1570 | */
1571 |
1572 | .sidebar, article { width: 700px; }
1573 |
1574 | .has-scrollbar::-webkit-scrollbar-button { width: 100px; }
1575 |
1576 |
1577 |
1578 | /**
1579 | * SIDEBAR
1580 | */
1581 |
1582 | .contacts-list {
1583 | grid-template-columns: 1fr 1fr;
1584 | gap: 30px 15px;
1585 | }
1586 |
1587 |
1588 |
1589 | /**
1590 | * NAVBAR
1591 | */
1592 |
1593 | .navbar-link { --fs-8: 15px; }
1594 |
1595 |
1596 |
1597 | /**
1598 | * ABOUT
1599 | */
1600 |
1601 | /* testimonials modal */
1602 |
1603 | .testimonials-modal {
1604 | gap: 35px;
1605 | max-width: 680px;
1606 | }
1607 |
1608 | .modal-avatar-box img { width: 80px; }
1609 |
1610 |
1611 |
1612 | /**
1613 | * PORTFOLIO
1614 | */
1615 |
1616 | .article-title { padding-bottom: 20px; }
1617 |
1618 | .filter-select-box { display: none; }
1619 |
1620 | .filter-list {
1621 | display: flex;
1622 | justify-content: flex-start;
1623 | align-items: center;
1624 | gap: 25px;
1625 | padding-left: 5px;
1626 | margin-bottom: 30px;
1627 | }
1628 |
1629 | .filter-item button {
1630 | color: var(--light-gray);
1631 | font-size: var(--fs-5);
1632 | transition: var(--transition-1);
1633 | }
1634 |
1635 | .filter-item button:hover { color: var(--light-gray-70); }
1636 |
1637 | .filter-item button.active { color: var(--orange-yellow-crayola); }
1638 |
1639 | /* portfolio and blog grid */
1640 |
1641 | .project-list, .blog-posts-list { grid-template-columns: 1fr 1fr; }
1642 |
1643 |
1644 |
1645 | /**
1646 | * CONTACT
1647 | */
1648 |
1649 | .input-wrapper { grid-template-columns: 1fr 1fr; }
1650 |
1651 | .form-btn {
1652 | width: max-content;
1653 | margin-left: auto;
1654 | }
1655 |
1656 | }
1657 |
1658 |
1659 |
1660 |
1661 |
1662 | /**
1663 | * responsive larger than 1024px screen
1664 | */
1665 |
1666 | @media (min-width: 1024px) {
1667 |
1668 | /**
1669 | * CUSTOM PROPERTY
1670 | */
1671 |
1672 | :root {
1673 |
1674 | /**
1675 | * shadow
1676 | */
1677 |
1678 | --shadow-1: -4px 8px 24px hsla(0, 0%, 0%, 0.125);
1679 | --shadow-2: 0 16px 30px hsla(0, 0%, 0%, 0.125);
1680 | --shadow-3: 0 16px 40px hsla(0, 0%, 0%, 0.125);
1681 |
1682 | }
1683 |
1684 |
1685 |
1686 | /**
1687 | * REUSED STYLE
1688 | */
1689 |
1690 | .sidebar, article {
1691 | width: 950px;
1692 | box-shadow: var(--shadow-5);
1693 | }
1694 |
1695 |
1696 |
1697 | /**
1698 | * MAIN
1699 | */
1700 |
1701 | main { margin-bottom: 60px; }
1702 |
1703 | .main-content {
1704 | position: relative;
1705 | width: max-content;
1706 | margin: auto;
1707 | }
1708 |
1709 |
1710 |
1711 | /**
1712 | * NAVBAR
1713 | */
1714 |
1715 | .navbar {
1716 | position: absolute;
1717 | bottom: auto;
1718 | top: 0;
1719 | left: auto;
1720 | right: 0;
1721 | width: max-content;
1722 | border-radius: 0 20px;
1723 | padding: 0 20px;
1724 | box-shadow: none;
1725 | }
1726 |
1727 | .navbar-list {
1728 | gap: 30px;
1729 | padding: 0 20px;
1730 | }
1731 |
1732 | .navbar-link { font-weight: var(--fw-500); }
1733 |
1734 |
1735 |
1736 | /**
1737 | * ABOUT
1738 | */
1739 |
1740 | /* service */
1741 |
1742 | .service-list {
1743 | grid-template-columns: 1fr 1fr;
1744 | gap: 20px 25px;
1745 | }
1746 |
1747 | /* testimonials */
1748 |
1749 | .testimonials-item { min-width: calc(50% - 15px); }
1750 |
1751 | /* clients */
1752 |
1753 | .clients-item { min-width: calc(25% - 38px); }
1754 |
1755 |
1756 |
1757 | /**
1758 | * PORTFOLIO
1759 | */
1760 |
1761 | .project-list { grid-template-columns: repeat(3, 1fr); }
1762 |
1763 |
1764 |
1765 | /**
1766 | * BLOG
1767 | */
1768 |
1769 | .blog-banner-box { height: 230px; }
1770 |
1771 | }
1772 |
1773 |
1774 |
1775 |
1776 |
1777 | /**
1778 | * responsive larger than 1250px screen
1779 | */
1780 |
1781 | @media (min-width: 1250px) {
1782 |
1783 | /**
1784 | * RESET
1785 | */
1786 |
1787 | body::-webkit-scrollbar { width: 20px; }
1788 |
1789 | body::-webkit-scrollbar-track { background: var(--smoky-black); }
1790 |
1791 | body::-webkit-scrollbar-thumb {
1792 | border: 5px solid var(--smoky-black);
1793 | background: hsla(0, 0%, 100%, 0.1);
1794 | border-radius: 20px;
1795 | box-shadow: inset 1px 1px 0 hsla(0, 0%, 100%, 0.11),
1796 | inset -1px -1px 0 hsla(0, 0%, 100%, 0.11);
1797 | }
1798 |
1799 | body::-webkit-scrollbar-thumb:hover { background: hsla(0, 0%, 100%, 0.15); }
1800 |
1801 | body::-webkit-scrollbar-button { height: 60px; }
1802 |
1803 |
1804 |
1805 | /**
1806 | * REUSED STYLE
1807 | */
1808 |
1809 | .sidebar, article { width: auto; }
1810 |
1811 | article { min-height: 100%; }
1812 |
1813 |
1814 |
1815 | /**
1816 | * MAIN
1817 | */
1818 |
1819 | main {
1820 | max-width: 1200px;
1821 | margin-inline: auto;
1822 | display: flex;
1823 | justify-content: center;
1824 | align-items: stretch;
1825 | gap: 25px;
1826 | }
1827 |
1828 | .main-content {
1829 | min-width: 75%;
1830 | width: 75%;
1831 | margin: 0;
1832 | }
1833 |
1834 |
1835 |
1836 | /**
1837 | * SIDEBAR
1838 | */
1839 |
1840 | .sidebar {
1841 | position: sticky;
1842 | top: 60px;
1843 | max-height: max-content;
1844 | height: 100%;
1845 | margin-bottom: 0;
1846 | padding-top: 60px;
1847 | z-index: 1;
1848 | }
1849 |
1850 | .sidebar-info { flex-direction: column; }
1851 |
1852 | .avatar-box img { width: 150px; }
1853 |
1854 | .info-content .name {
1855 | white-space: nowrap;
1856 | text-align: center;
1857 | }
1858 |
1859 | .info-content .title { margin: auto; }
1860 |
1861 | .info_more-btn { display: none; }
1862 |
1863 | .sidebar-info_more {
1864 | opacity: 1;
1865 | visibility: visible;
1866 | }
1867 |
1868 | .contacts-list { grid-template-columns: 1fr; }
1869 |
1870 | .contact-info :is(.contact-link) {
1871 | white-space: nowrap;
1872 | overflow: hidden;
1873 | text-overflow: ellipsis;
1874 | }
1875 |
1876 | .contact-info :is(.contact-link, time, address) {
1877 | --fs-7: 14px;
1878 | font-weight: var(--fw-300);
1879 | }
1880 |
1881 | .separator:last-of-type {
1882 | margin: 15px 0;
1883 | opacity: 0;
1884 | }
1885 |
1886 | .social-list { justify-content: center; }
1887 |
1888 |
1889 |
1890 | /**
1891 | * RESUME
1892 | */
1893 |
1894 | .timeline-text { max-width: 700px; }
1895 |
1896 | }
--------------------------------------------------------------------------------
/assets/css/terminal.css:
--------------------------------------------------------------------------------
1 | /* Terminal Button */
2 | @font-face {
3 | font-family: 'CrackedFont', monospace;
4 | src: url('path/to/Matrix-Regular.ttf'); /* Specify the correct path to the font file */
5 | font-weight: normal;
6 | font-style: normal;
7 | }
8 | .terminal-button {
9 | position: fixed;
10 | bottom: 100px;
11 | right: 20px;
12 | background-color: #00ff00;
13 | color: #000;
14 | padding: 10px 20px;
15 | border: none;
16 | border-radius: 5px;
17 | cursor: pointer;
18 | z-index: 1000;
19 | }
20 |
21 | /* Terminal Popup */
22 | .terminal-popup {
23 | font-family:cracked code;
24 | display: none;
25 | position: fixed;
26 | bottom: 100px;
27 | right: 0;
28 | width: 400px;
29 | height: 310px;
30 | font-family: inconsolata;
31 | background-color: #000;
32 | color: #00ff00;
33 | border: 2px solid #00ff00;
34 | border-radius: 5px;
35 | overflow: hidden;
36 | z-index: 1000;
37 | }
38 |
39 | /* Terminal Header */
40 | .terminal-header {
41 | background-color: #111;
42 | padding: 10px;
43 | border-top-left-radius: 5px;
44 | border-top-right-radius: 5px;
45 | }
46 |
47 | .terminal-button-close {
48 | float: right;
49 | cursor: pointer;
50 | font-size: 20px;
51 | line-height: 1;
52 | padding: 3px 8px;
53 | border-radius: 8px;
54 | font-weight: bolder;
55 | }
56 | .terminal-button-close:hover{
57 | background: red;
58 | }
59 |
60 | /* Terminal Content */
61 | .terminal-content {
62 | padding: 10px;
63 | max-height: 230px;
64 | overflow-y: scroll;
65 | background-color: #000;
66 | }
67 |
68 | /* Terminal Input */
69 | .terminal-input-container {
70 | background-color: transparent;
71 | padding: 10px;
72 | display: flex;
73 | align-items: center;
74 | }
75 |
76 | .terminal-prompt {
77 | color: #00ff00;
78 | margin-right: 5px;
79 | }
80 |
81 | .terminal-input {
82 | background-color: transparent;
83 | color: #00ff00;
84 | border: none;
85 | outline: none;
86 | width: 100%;
87 | font-family: 'Courier New', monospace;
88 | font-size: 16px;
89 | }
90 |
91 | /* Terminal Output Styles */
92 | .terminal-output {
93 | color: #00ff00;
94 | font-weight: bold;
95 | }
96 |
97 | /* Command List Styles */
98 | .terminal-content ul {
99 | list-style-type: none;
100 | margin: 0;
101 | padding: 0;
102 | }
103 |
104 | .terminal-content li {
105 | padding: 5px 0;
106 | }
107 |
108 | /* Cursor Blinking Animation */
109 | @keyframes cursor-blink {
110 | 0%, 100% {
111 | border-right: 2px solid transparent;
112 | }
113 | 50% {
114 | border-right: 2px solid;
115 | }
116 | }
117 |
118 | /* Apply cursor blink animation to the input */
119 | .terminal-input:focus {
120 | animation: cursor-blink 0.8s infinite;
121 | }
122 |
--------------------------------------------------------------------------------
/assets/font/Cracked Code.ttf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codeWithEdison/codeWithEdison-portifolio/802d58ee772e9377542eb0340798df5f4caebe7a/assets/font/Cracked Code.ttf
--------------------------------------------------------------------------------
/assets/images/BH.PNG:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codeWithEdison/codeWithEdison-portifolio/802d58ee772e9377542eb0340798df5f4caebe7a/assets/images/BH.PNG
--------------------------------------------------------------------------------
/assets/images/Binary-hub-logo.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codeWithEdison/codeWithEdison-portifolio/802d58ee772e9377542eb0340798df5f4caebe7a/assets/images/Binary-hub-logo.png
--------------------------------------------------------------------------------
/assets/images/ULK_Logo.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codeWithEdison/codeWithEdison-portifolio/802d58ee772e9377542eb0340798df5f4caebe7a/assets/images/ULK_Logo.png
--------------------------------------------------------------------------------
/assets/images/UR-AMS.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codeWithEdison/codeWithEdison-portifolio/802d58ee772e9377542eb0340798df5f4caebe7a/assets/images/UR-AMS.png
--------------------------------------------------------------------------------
/assets/images/University_of_Rwanda_-_LOGO.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codeWithEdison/codeWithEdison-portifolio/802d58ee772e9377542eb0340798df5f4caebe7a/assets/images/University_of_Rwanda_-_LOGO.png
--------------------------------------------------------------------------------
/assets/images/assee.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codeWithEdison/codeWithEdison-portifolio/802d58ee772e9377542eb0340798df5f4caebe7a/assets/images/assee.png
--------------------------------------------------------------------------------
/assets/images/avatar-1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codeWithEdison/codeWithEdison-portifolio/802d58ee772e9377542eb0340798df5f4caebe7a/assets/images/avatar-1.png
--------------------------------------------------------------------------------
/assets/images/avatar-2.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codeWithEdison/codeWithEdison-portifolio/802d58ee772e9377542eb0340798df5f4caebe7a/assets/images/avatar-2.png
--------------------------------------------------------------------------------
/assets/images/avatar-3.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codeWithEdison/codeWithEdison-portifolio/802d58ee772e9377542eb0340798df5f4caebe7a/assets/images/avatar-3.png
--------------------------------------------------------------------------------
/assets/images/avatar-4.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codeWithEdison/codeWithEdison-portifolio/802d58ee772e9377542eb0340798df5f4caebe7a/assets/images/avatar-4.png
--------------------------------------------------------------------------------
/assets/images/bakame-coders-logo.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codeWithEdison/codeWithEdison-portifolio/802d58ee772e9377542eb0340798df5f4caebe7a/assets/images/bakame-coders-logo.png
--------------------------------------------------------------------------------
/assets/images/bakame-web.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codeWithEdison/codeWithEdison-portifolio/802d58ee772e9377542eb0340798df5f4caebe7a/assets/images/bakame-web.png
--------------------------------------------------------------------------------
/assets/images/bhb.PNG:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codeWithEdison/codeWithEdison-portifolio/802d58ee772e9377542eb0340798df5f4caebe7a/assets/images/bhb.PNG
--------------------------------------------------------------------------------
/assets/images/binaryhub-website.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codeWithEdison/codeWithEdison-portifolio/802d58ee772e9377542eb0340798df5f4caebe7a/assets/images/binaryhub-website.png
--------------------------------------------------------------------------------
/assets/images/icon-app.svg:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
--------------------------------------------------------------------------------
/assets/images/icon-design.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 |
--------------------------------------------------------------------------------
/assets/images/icon-dev.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 |
--------------------------------------------------------------------------------
/assets/images/icon-photo-.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/assets/images/icon-photo.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 |
--------------------------------------------------------------------------------
/assets/images/icon-quote.svg:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
--------------------------------------------------------------------------------
/assets/images/logo.ico:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codeWithEdison/codeWithEdison-portifolio/802d58ee772e9377542eb0340798df5f4caebe7a/assets/images/logo.ico
--------------------------------------------------------------------------------
/assets/images/logo.svg:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
--------------------------------------------------------------------------------
/assets/images/meuh.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codeWithEdison/codeWithEdison-portifolio/802d58ee772e9377542eb0340798df5f4caebe7a/assets/images/meuh.png
--------------------------------------------------------------------------------
/assets/images/my-avatar.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codeWithEdison/codeWithEdison-portifolio/802d58ee772e9377542eb0340798df5f4caebe7a/assets/images/my-avatar.png
--------------------------------------------------------------------------------
/assets/images/pizza.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codeWithEdison/codeWithEdison-portifolio/802d58ee772e9377542eb0340798df5f4caebe7a/assets/images/pizza.png
--------------------------------------------------------------------------------
/assets/images/portifolio.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codeWithEdison/codeWithEdison-portifolio/802d58ee772e9377542eb0340798df5f4caebe7a/assets/images/portifolio.png
--------------------------------------------------------------------------------
/assets/images/real estate.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codeWithEdison/codeWithEdison-portifolio/802d58ee772e9377542eb0340798df5f4caebe7a/assets/images/real estate.png
--------------------------------------------------------------------------------
/assets/images/ui-cv.PNG:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codeWithEdison/codeWithEdison-portifolio/802d58ee772e9377542eb0340798df5f4caebe7a/assets/images/ui-cv.PNG
--------------------------------------------------------------------------------
/assets/images/ulk.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codeWithEdison/codeWithEdison-portifolio/802d58ee772e9377542eb0340798df5f4caebe7a/assets/images/ulk.png
--------------------------------------------------------------------------------
/assets/images/wikilix-logo.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codeWithEdison/codeWithEdison-portifolio/802d58ee772e9377542eb0340798df5f4caebe7a/assets/images/wikilix-logo.png
--------------------------------------------------------------------------------
/assets/images/wikilix.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codeWithEdison/codeWithEdison-portifolio/802d58ee772e9377542eb0340798df5f4caebe7a/assets/images/wikilix.png
--------------------------------------------------------------------------------
/assets/js/script.js:
--------------------------------------------------------------------------------
1 | 'use strict';
2 |
3 |
4 |
5 | // element toggle function
6 | const elementToggleFunc = function (elem) { elem.classList.toggle("active"); }
7 |
8 |
9 |
10 | // sidebar variables
11 | const sidebar = document.querySelector("[data-sidebar]");
12 | const sidebarBtn = document.querySelector("[data-sidebar-btn]");
13 |
14 | // sidebar toggle functionality for mobile
15 | sidebarBtn.addEventListener("click", function () { elementToggleFunc(sidebar); });
16 |
17 |
18 |
19 | // testimonials variables
20 | const testimonialsItem = document.querySelectorAll("[data-testimonials-item]");
21 | const modalContainer = document.querySelector("[data-modal-container]");
22 | const modalCloseBtn = document.querySelector("[data-modal-close-btn]");
23 | const overlay = document.querySelector("[data-overlay]");
24 |
25 | // modal variable
26 | const modalImg = document.querySelector("[data-modal-img]");
27 | const modalTitle = document.querySelector("[data-modal-title]");
28 | const modalText = document.querySelector("[data-modal-text]");
29 |
30 | // modal toggle function
31 | const testimonialsModalFunc = function () {
32 | modalContainer.classList.toggle("active");
33 | overlay.classList.toggle("active");
34 | }
35 |
36 | // add click event to all modal items
37 | for (let i = 0; i < testimonialsItem.length; i++) {
38 |
39 | testimonialsItem[i].addEventListener("click", function () {
40 |
41 | modalImg.src = this.querySelector("[data-testimonials-avatar]").src;
42 | modalImg.alt = this.querySelector("[data-testimonials-avatar]").alt;
43 | modalTitle.innerHTML = this.querySelector("[data-testimonials-title]").innerHTML;
44 | modalText.innerHTML = this.querySelector("[data-testimonials-text]").innerHTML;
45 |
46 | testimonialsModalFunc();
47 |
48 | });
49 |
50 | }
51 |
52 | // add click event to modal close button
53 | modalCloseBtn.addEventListener("click", testimonialsModalFunc);
54 | overlay.addEventListener("click", testimonialsModalFunc);
55 |
56 |
57 |
58 |
59 | // custom select variables
60 | const select = document.querySelector("[data-select]");
61 | const selectItems = document.querySelectorAll("[data-select-item]");
62 | const selectValue = document.querySelector("[data-selecct-value]");
63 | const filterBtn = document.querySelectorAll("[data-filter-btn]");
64 |
65 | select.addEventListener("click", function () { elementToggleFunc(this); });
66 |
67 | // add event in all select items
68 | for (let i = 0; i < selectItems.length; i++) {
69 | selectItems[i].addEventListener("click", function () {
70 |
71 | let selectedValue = this.innerText.toLowerCase();
72 | selectValue.innerText = this.innerText;
73 | elementToggleFunc(select);
74 | filterFunc(selectedValue);
75 |
76 | });
77 | }
78 |
79 | // filter variables
80 | const filterItems = document.querySelectorAll("[data-filter-item]");
81 |
82 | const filterFunc = function (selectedValue) {
83 |
84 | for (let i = 0; i < filterItems.length; i++) {
85 |
86 | if (selectedValue === "all") {
87 | filterItems[i].classList.add("active");
88 | } else if (selectedValue === filterItems[i].dataset.category) {
89 | filterItems[i].classList.add("active");
90 | } else {
91 | filterItems[i].classList.remove("active");
92 | }
93 |
94 | }
95 |
96 | }
97 |
98 | // add event in all filter button items for large screen
99 | let lastClickedBtn = filterBtn[0];
100 |
101 | for (let i = 0; i < filterBtn.length; i++) {
102 |
103 | filterBtn[i].addEventListener("click", function () {
104 |
105 | let selectedValue = this.innerText.toLowerCase();
106 | selectValue.innerText = this.innerText;
107 | filterFunc(selectedValue);
108 |
109 | lastClickedBtn.classList.remove("active");
110 | this.classList.add("active");
111 | lastClickedBtn = this;
112 |
113 | });
114 |
115 | }
116 |
117 |
118 |
119 | // contact form variables
120 | const form = document.querySelector("[data-form]");
121 | const formInputs = document.querySelectorAll("[data-form-input]");
122 | const formBtn = document.querySelector("[data-form-btn]");
123 |
124 | // add event to all form input field
125 | for (let i = 0; i < formInputs.length; i++) {
126 | formInputs[i].addEventListener("input", function () {
127 |
128 | // check form validation
129 | if (form.checkValidity()) {
130 | formBtn.removeAttribute("disabled");
131 | } else {
132 | formBtn.setAttribute("disabled", "");
133 | }
134 |
135 | });
136 | }
137 |
138 |
139 |
140 | // page navigation variables
141 | const navigationLinks = document.querySelectorAll("[data-nav-link]");
142 | const pages = document.querySelectorAll("[data-page]");
143 |
144 | // add event to all nav link
145 | for (let i = 0; i < navigationLinks.length; i++) {
146 | navigationLinks[i].addEventListener("click", function () {
147 |
148 | for (let i = 0; i < pages.length; i++) {
149 | if (this.innerHTML.toLowerCase() === pages[i].dataset.page) {
150 | pages[i].classList.add("active");
151 | navigationLinks[i].classList.add("active");
152 | window.scrollTo(0, 0);
153 | } else {
154 | pages[i].classList.remove("active");
155 | navigationLinks[i].classList.remove("active");
156 | }
157 | }
158 |
159 | });
160 | }
--------------------------------------------------------------------------------
/assets/js/terminal.js:
--------------------------------------------------------------------------------
1 | 'use strict';
2 | document.addEventListener("DOMContentLoaded", function () {
3 | const terminalPopup = document.getElementById("terminalPopup");
4 | const closeButton = document.getElementById("closeButton");
5 | const terminalInput = document.getElementById("terminalInput");
6 | const terminalContent = document.querySelector(".terminal-content");
7 | const openTerminalButton = document.getElementById("openTerminalButton");
8 |
9 | // Function to open or close the terminal popup
10 | function toggleTerminal() {
11 | if (terminalPopup.style.display === "block") {
12 | terminalPopup.style.display = "none";
13 | openTerminalButton.style.display = "block";
14 | } else {
15 | terminalPopup.style.display = "block";
16 | openTerminalButton.style.display = "none";
17 | }
18 | }
19 |
20 | // Function to scroll to the bottom of the terminal content
21 | function scrollToBottom() {
22 | terminalContent.scrollTop = terminalContent.scrollHeight;
23 | }
24 |
25 | // Function to escape HTML characters
26 | function escapeHtml(text) {
27 | const div = document.createElement("div");
28 | div.textContent = text;
29 | return div.innerHTML;
30 | }
31 |
32 | // Function to simulate typewriter effect with hacker-style animation
33 | function typeWriter(text) {
34 | const outputElement = document.createElement("p");
35 | outputElement.innerHTML = `$codeWithEdison/ `;
36 | terminalContent.appendChild(outputElement);
37 | scrollToBottom();
38 |
39 | let index = 0;
40 | const typingInterval = setInterval(function () {
41 | if (index < text.length) {
42 | outputElement.innerHTML += escapeHtml(text.charAt(index));
43 | scrollToBottom();
44 | index++;
45 | } else {
46 | clearInterval(typingInterval); // Stop the typing animation
47 | }
48 | }, 90); // Adjust the typing speed here (in milliseconds)
49 | }
50 |
51 |
52 | var element1 = document.getElementsByClassName("navbar-link")[0];
53 | var element2 = document.getElementsByClassName("navbar-link")[1];
54 | var element3 = document.getElementsByClassName("navbar-link")[2];
55 | var element5 = document.getElementsByClassName("navbar-link")[3];
56 |
57 | var clickEvent = new Event("click", {
58 | bubbles: true,
59 | cancelable: true
60 | });
61 |
62 | // Event listeners
63 | closeButton.addEventListener("click", toggleTerminal);
64 | openTerminalButton.addEventListener("click", toggleTerminal);
65 |
66 | // Function to handle user input
67 | function handleCommand(command) {
68 | switch (command.toLowerCase()) {
69 | case "about":
70 | // Scroll to the Home section
71 | element1.dispatchEvent(clickEvent);
72 | toggleTerminal();
73 | break;
74 | case "resume":
75 | // Scroll to the About Me section
76 | element2.dispatchEvent(clickEvent);
77 | toggleTerminal();
78 | break;
79 | case "portfolio":
80 | element3.dispatchEvent(clickEvent);
81 | toggleTerminal();
82 | break;
83 | // case "blog":
84 | // element4.dispatchEvent(clickEvent);
85 | // break;
86 | case "contact":
87 | // Scroll to the Blog section
88 | element5.dispatchEvent(clickEvent);
89 | toggleTerminal();
90 | break;
91 | case "clear":
92 | // Clear the terminal content
93 | terminalContent.innerHTML = "";
94 | break;
95 | case "exit":
96 | toggleTerminal();
97 | break;
98 | case "help":
99 | // Display the help message with hacker-style typewriter effect
100 | typeWriter(`
101 | Type one of the following commands: ------------->
102 |
103 | about - Go to the About Me section ------------>
104 | portfolio - Go to the Portfolio section -------->
105 | contact - Go to the Contact section ------------->
106 | blog - Go to the Blog section ------------------->
107 | clear - Clear the terminal -------------------->
108 | exit - to close terminal --------------------->
109 | help - Display this help message.
110 | `);
111 | break;
112 | default:
113 | // Display an error message for invalid commands with typewriter effect
114 | typeWriter(`Invalid command: ${escapeHtml(command)}. Type "help" for a list of commands.`);
115 | }
116 |
117 | // Clear the input field
118 | terminalInput.value = "";
119 | }
120 |
121 | // Listen for user input
122 | terminalInput.addEventListener("keydown", function (event) {
123 | if (event.key === "Enter") {
124 | const input = terminalInput.value;
125 | handleCommand(input);
126 | }
127 | });
128 | });
129 |
130 |
--------------------------------------------------------------------------------
/index.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 | Code With Edison - Personal Portfolio
14 |
15 |
18 |
19 |
20 |
23 |
24 |
25 |
26 |
29 |
30 |
31 |
32 |
33 |
34 |
35 |
36 |
41 |
42 |
43 |
44 |
45 |
46 |
49 |
50 |
51 |
52 |
55 |
56 |
171 |
172 |
173 |
174 |
175 |
176 |
179 |
180 |
181 |
182 |
185 |
186 |
187 |
188 |
189 |
190 |
191 | About
192 |
193 |
194 |
195 | Resume
196 |
197 |
198 |
199 | Portfolio
200 |
201 |
202 |
205 |
206 |
207 | Contact
208 |
209 |
210 |
211 |
212 |
213 |
214 |
215 |
216 |
217 |
218 |
221 |
222 |
223 |
224 |
227 |
228 |
229 |
230 | I'm specialised and Talented Front end Developer and UI/UX designer using modern framework to develop modern web based systems.
231 | i've worked on a variety of projects for clients in education, management , e-commerce,media, fashion, etc industries.
232 |
233 |
234 |
235 | I'm passionate about creating great user experiences and have strong undertanding of usability and accessibility standards.
236 |
237 | I olso participate on knowledge sharing About Programming, User interface / User Experience designer on BootCamps, Hactons, Hubs, online Sessions , Etc
238 |
239 |
240 |
241 |
244 |
245 |
246 |
247 | What i'm doing
248 |
249 |
250 |
251 |
252 |
253 |
254 |
256 |
257 |
258 |
259 |
UI / UX design
260 |
261 |
262 | The most modern and high-quality design made at a professional level.
263 |
264 |
265 |
266 |
267 |
268 |
269 |
270 |
271 |
272 |
273 |
274 |
275 |
Front end Developer
276 |
277 |
278 | High-quality development of sites at the professional level using modern Technologies.
279 |
280 |
281 |
282 |
283 |
284 |
315 |
316 |
317 |
318 |
319 |
320 |
321 |
324 |
325 |
326 |
327 | Testimonials
328 |
329 |
392 |
393 |
394 |
395 |
396 |
399 |
400 |
401 |
402 |
403 |
404 |
405 |
406 |
407 |
408 |
409 |
410 |
411 |
412 |
413 |
414 |
415 |
416 |
417 |
418 |
419 |
420 |
WIKILIX online services CEO
421 |
422 |
20 June, 2023
423 |
424 |
425 |
426 | I meet with many instructor and teacher before to teach me ho to code i was in dark.
427 | but the day i meet with Edison in Summer bootcamp i found some one who teach every one for his/her level and show you that you and him you are studying thing together.
428 | truly his abilty need appreciation.
429 |
430 |
431 |
432 |
433 |
434 |
435 |
436 |
437 |
438 |
439 |
442 |
443 |
444 |
445 | Clients
446 |
447 |
487 |
488 |
489 |
490 |
491 |
492 |
493 |
494 |
495 |
496 |
499 |
500 |
501 |
502 |
505 |
506 |
507 |
508 |
509 |
510 |
511 |
512 |
513 |
Education
514 |
515 |
516 |
517 |
518 |
519 |
520 | University of Rwanda
521 | Bachlor science in Computer Science
522 |
523 | 2021 — 2025
524 |
525 |
526 | Studying Computer Science at the University of Rwanda, advancing my tech skills and give me strong understanding on techonology. 🎓💻
527 |
528 |
529 |
530 |
531 |
532 |
533 | Marie Reinne de CONGO-NIL
534 | Advanced Diploma -MCE
535 |
536 | 2018 — 2021
537 |
538 |
539 | Studying Math, Economics, and Computer Science at Congo Nil for a diverse and comprehensive education. 📚💼💻
540 |
541 |
542 |
543 |
544 |
557 |
558 |
559 |
560 |
561 |
562 |
563 |
564 |
565 |
566 |
567 |
568 |
569 |
Experience
570 |
571 |
572 |
573 |
574 |
575 |
576 | Font end Developer & project Manger - Binary Hub
577 |
578 | 2023 — Present
579 |
580 |
581 | Thriving as a Front-End Developer & Project Manager at Binary Hub, crafting user experiences through code and design and give me time to practise on big and complex project with modern techologies on market and give me strong knowledge on management of team and time management . 🖥️🚀
582 |
583 |
584 |
585 |
586 |
587 |
588 | INSTRUCTOR - ULK-DIC
589 |
590 | 2023
591 |
592 |
593 | Elevating knowledge sharing on young talented developer in Kigali Indepence University - Digital Incubation About Computer Basic and Web Development center help me to increse my level of communication , task sheduling, leadership, and explore challenges with others. 🌐💻🚀
594 |
595 |
596 |
597 |
598 |
599 | Front end developer & UI/UX Designer -BAKAME Coders
600 |
601 | 2022- Present
602 |
603 |
604 | Elevating web development skills at Bakame Coders, shaping digital experiences through coding expertise. 🌐💻🚀
605 |
606 |
607 |
608 |
609 |
610 |
611 |
612 |
613 |
614 |
615 |
616 |
617 | My skills
618 |
619 |
620 |
621 |
622 |
623 |
624 |
React js
625 | 90%
626 |
627 |
628 |
631 |
632 |
633 |
634 |
635 |
636 |
Typescript
637 | 90%
638 |
639 |
640 |
643 |
644 |
645 |
646 |
647 |
648 |
Tailwind Css
649 | 95%
650 |
651 |
652 |
655 |
656 |
657 |
658 |
659 |
660 |
661 |
Javascript
662 | 89%
663 |
664 |
665 |
668 |
669 |
670 |
671 |
672 |
673 |
674 |
675 |
Css
676 | 90%
677 |
678 |
679 |
682 |
683 |
684 |
685 |
686 |
687 |
688 |
Figma
689 | 80%
690 |
691 |
692 |
695 |
696 |
697 |
698 |
699 |
700 |
Html 5
701 | 95%
702 |
703 |
704 |
707 |
708 |
709 |
710 |
711 |
712 |
Saas
713 | 80%
714 |
715 |
716 |
719 |
720 |
721 |
722 |
723 |
724 |
PHP - Node Js - Linux - Database - API
725 | 75%
726 |
727 |
728 |
731 |
732 |
733 |
734 |
735 |
736 |
737 |
738 |
739 |
740 |
741 |
742 |
743 |
744 |
747 |
748 |
749 |
750 |
753 |
754 |
755 |
756 |
757 |
758 |
759 | All
760 |
761 |
762 |
763 | Web design
764 |
765 |
766 |
767 | UI Design
768 |
769 |
770 |
771 | Web development
772 |
773 |
774 |
775 |
776 |
777 |
778 |
779 |
780 | Select category
781 |
782 |
783 |
784 |
785 |
786 |
787 |
788 |
789 |
790 |
791 | All
792 |
793 |
794 |
795 | Web design
796 |
797 |
798 |
799 | UI Design
800 |
801 |
802 |
803 | Web development
804 |
805 |
806 |
807 |
808 |
809 |
810 |
975 |
976 |
977 |
978 |
979 |
980 |
981 |
982 |
983 |
984 |
987 |
988 |
1172 |
1173 |
1174 |
1175 |
1176 |
1179 |
1180 |
1181 |
1182 |
1185 |
1186 |
1187 |
1188 |
1191 |
1192 |
1193 |
1194 |
1216 |
1217 |
1218 |
1219 |
1220 |
1221 | Use Terminal
1222 |
1223 |
1224 |
1247 |
1248 |
1249 |
1250 |
1251 |
1252 |
1253 |
1254 |
1255 |
1258 |
1259 |
1260 |
1263 |
1264 |
1265 |
1266 |
1276 | Powered by Smartsupp
1277 |
1278 |
1279 |
1286 |
1287 |
1288 |
1290 |
1291 |
1292 |
1293 |
1294 |
1295 |
1300 |
1301 |
1302 |
--------------------------------------------------------------------------------
/l Resume.pdf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codeWithEdison/codeWithEdison-portifolio/802d58ee772e9377542eb0340798df5f4caebe7a/l Resume.pdf
--------------------------------------------------------------------------------