From 09a862cb896ae830f6c6206b6eb99f08d22473e4 Mon Sep 17 00:00:00 2001 From: mnau23 <51322165+mnau23@users.noreply.github.com> Date: Sun, 23 Aug 2026 23:29:57 +0200 Subject: [PATCH 01/12] use textarea in contact page --- dist/contact.html | 2 +- dist/css/main.css | 9 +++++++-- scss/main.scss | 7 ++++++- 3 files changed, 14 insertions(+), 4 deletions(-) diff --git a/dist/contact.html b/dist/contact.html index 9ae1e5e..d202f96 100644 --- a/dist/contact.html +++ b/dist/contact.html @@ -109,7 +109,7 @@

Send message

- + Write your message
diff --git a/dist/css/main.css b/dist/css/main.css index d2b436d..abf9dc7 100644 --- a/dist/css/main.css +++ b/dist/css/main.css @@ -350,7 +350,8 @@ main#home h1 { width: 100%; margin-top: 10px; } -.container .contact-form .input-box input { +.container .contact-form .input-box input, +.container .contact-form .input-box textarea { width: 100%; height: 35px; padding: 5px 0; @@ -363,11 +364,15 @@ main#home h1 { outline: none; resize: none; } -.container .contact-form .input-box input:focus ~ span, .container .contact-form .input-box input:valid ~ span { +.container .contact-form .input-box input:focus ~ span, .container .contact-form .input-box input:valid ~ span, .container .contact-form .input-box textarea:focus ~ span, .container .contact-form .input-box textarea:valid ~ span { color: rgba(107, 159, 238, 0.9058823529); font-size: 12px; transform: translateY(-25px); } +.container .contact-form .input-box textarea { + min-height: 120px; + padding-top: 10px; +} .container .contact-form .input-box span { position: absolute; left: 0; diff --git a/scss/main.scss b/scss/main.scss index 9bf3924..6816790 100644 --- a/scss/main.scss +++ b/scss/main.scss @@ -234,7 +234,8 @@ main { position: relative; width: 100%; margin-top: 10px; - input { + input, + textarea { width: 100%; height: 35px; padding: 5px 0; @@ -252,6 +253,10 @@ main { transform: translateY(-25px); } } + textarea { + min-height: 120px; + padding-top: 10px; + } span { position: absolute; left: 0; From 7ba070cf83f223e572fb5b646e9c3fb878cd147f Mon Sep 17 00:00:00 2001 From: mnau23 <51322165+mnau23@users.noreply.github.com> Date: Sun, 23 Aug 2026 23:30:17 +0200 Subject: [PATCH 02/12] rename attribute to data-percentage --- dist/css/main.css | 8 ++++---- dist/education.html | 22 +++++++++++----------- dist/js/progress.js | 35 +++++++++++++++++++++++------------ scss/main.scss | 2 +- 4 files changed, 39 insertions(+), 28 deletions(-) diff --git a/dist/css/main.css b/dist/css/main.css index abf9dc7..aa0f114 100644 --- a/dist/css/main.css +++ b/dist/css/main.css @@ -241,7 +241,7 @@ main#home h1 { font-weight: 900; } .more .skills .skill-per::before { - content: attr(percentage); + content: attr(data-percentage); position: absolute; padding: 4px 6px; background-color: #fff; @@ -364,7 +364,9 @@ main#home h1 { outline: none; resize: none; } -.container .contact-form .input-box input:focus ~ span, .container .contact-form .input-box input:valid ~ span, .container .contact-form .input-box textarea:focus ~ span, .container .contact-form .input-box textarea:valid ~ span { +.container .contact-form .input-box input:focus ~ span, .container .contact-form .input-box input:valid ~ span, +.container .contact-form .input-box textarea:focus ~ span, +.container .contact-form .input-box textarea:valid ~ span { color: rgba(107, 159, 238, 0.9058823529); font-size: 12px; transform: translateY(-25px); @@ -793,5 +795,3 @@ main#home h1 { text-align: center; } } - -/*# sourceMappingURL=main.css.map */ diff --git a/dist/education.html b/dist/education.html index ddaaca8..b12f98b 100644 --- a/dist/education.html +++ b/dist/education.html @@ -55,32 +55,32 @@

Programming skills

C/C++
-
+
Haskell
-
+
HTML & CSS
-
+
Java
-
+
JavaScript
-
+
@@ -89,37 +89,37 @@

Programming skills

-
+
MATLAB
-
+
PHP
-
+
Python
-
+
Scala
-
+
SQL
-
+
diff --git a/dist/js/progress.js b/dist/js/progress.js index 5e67957..2b3f719 100644 --- a/dist/js/progress.js +++ b/dist/js/progress.js @@ -1,14 +1,25 @@ -$('.skill-per').each(function () { - var $this = $(this); - var per = $this.attr('percentage'); - $this.css("width", per + '%'); - $({ animatedValue: 0 }).animate({ animatedValue: per }, { - duration: 2000, - step: function () { - $this.attr('percentage', Math.floor(this.animatedValue) + '%'); - }, - complete: function () { - $this.attr('percentage', Math.floor(this.animatedValue) + '%'); +document.querySelectorAll('.skill-per').forEach((skillPer) => { + const percentageValue = Number.parseInt( + skillPer.getAttribute('data-percentage') || skillPer.getAttribute('percentage') || '0', + 10, + ); + const targetPercentage = Number.isNaN(percentageValue) ? 0 : percentageValue; + const durationMs = 2000; + const startTime = performance.now(); + + skillPer.style.width = `${targetPercentage}%`; + + const animatePercentage = (now) => { + const elapsed = now - startTime; + const progress = Math.min(elapsed / durationMs, 1); + const currentValue = Math.floor(progress * targetPercentage); + + skillPer.setAttribute('data-percentage', `${currentValue}%`); + + if (progress < 1) { + requestAnimationFrame(animatePercentage); } - }); + }; + + requestAnimationFrame(animatePercentage); }); diff --git a/scss/main.scss b/scss/main.scss index 6816790..5eec2c7 100644 --- a/scss/main.scss +++ b/scss/main.scss @@ -123,7 +123,7 @@ main { position: relative; font-weight: 900; &::before { - content: attr(percentage); + content: attr(data-percentage); position: absolute; padding: 4px 6px; background-color: config.set-text-color(config.$primary-color); //black; From bfd241943ae9f2184f1894bb4af6f8fc4c225053 Mon Sep 17 00:00:00 2001 From: mnau23 <51322165+mnau23@users.noreply.github.com> Date: Sun, 23 Aug 2026 23:35:57 +0200 Subject: [PATCH 03/12] guard menu initialization if DOM nodes are missing --- dist/js/menu.js | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/dist/js/menu.js b/dist/js/menu.js index 1facfab..ce49096 100644 --- a/dist/js/menu.js +++ b/dist/js/menu.js @@ -8,7 +8,9 @@ const navItems = document.querySelectorAll('.nav-item'); // Set menu initial state let showMenu = false; -menuBtn.addEventListener('click', toggleMenu); +if (menuBtn && menu && menuNav && menuPhoto) { + menuBtn.addEventListener('click', toggleMenu); +} function toggleMenu() { if (!showMenu) { From f1d54cef98457c0fff8a597b19dae9c2a517e0f4 Mon Sep 17 00:00:00 2001 From: mnau23 <51322165+mnau23@users.noreply.github.com> Date: Sun, 23 Aug 2026 23:36:47 +0200 Subject: [PATCH 04/12] guard modal overlay access in pages without overlay --- dist/js/modal.js | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/dist/js/modal.js b/dist/js/modal.js index cb4c9e9..4b3cb4a 100644 --- a/dist/js/modal.js +++ b/dist/js/modal.js @@ -9,12 +9,14 @@ openModalBtns.forEach(button => { }) }) -overlay.addEventListener('click', () => { - const modals = document.querySelectorAll('.modal.active') - modals.forEach(modal => { - closeModal(modal) +if (overlay) { + overlay.addEventListener('click', () => { + const modals = document.querySelectorAll('.modal.active') + modals.forEach(modal => { + closeModal(modal) + }) }) -}) +} closeModalBtns.forEach(button => { button.addEventListener('click', () => { @@ -24,13 +26,13 @@ closeModalBtns.forEach(button => { }) function openModal(modal) { - if (modal == null) return + if (modal == null || overlay == null) return modal.classList.add('active') overlay.classList.add('active') } function closeModal(modal) { - if (modal == null) return + if (modal == null || overlay == null) return modal.classList.remove('active') overlay.classList.remove('active') } From 7f9b77e68637eaaa0312b060e994c8ebf6aab974 Mon Sep 17 00:00:00 2001 From: mnau23 <51322165+mnau23@users.noreply.github.com> Date: Sun, 23 Aug 2026 23:39:07 +0200 Subject: [PATCH 05/12] harden typewriter against missing or invalid data --- dist/js/typewriter.js | 21 ++++++++++++++++++++- 1 file changed, 20 insertions(+), 1 deletion(-) diff --git a/dist/js/typewriter.js b/dist/js/typewriter.js index b975ef5..a16d578 100644 --- a/dist/js/typewriter.js +++ b/dist/js/typewriter.js @@ -45,7 +45,26 @@ document.addEventListener('DOMContentLoaded', init); function init() { const txtElement = document.querySelector('.txt-type'); - const words = JSON.parse(txtElement.getAttribute('data-words')); + if (!txtElement) { + return; + } + + const wordsAttr = txtElement.getAttribute('data-words'); + if (!wordsAttr) { + return; + } + + let words = []; + try { + words = JSON.parse(wordsAttr); + } catch { + return; + } + + if (!Array.isArray(words) || words.length === 0) { + return; + } + const wait = txtElement.getAttribute('data-wait'); new typeWriter(txtElement, words, wait); // Init typewriter } From cd870d0980436b6e63d784cb99b072b8b83b33e2 Mon Sep 17 00:00:00 2001 From: mnau23 <51322165+mnau23@users.noreply.github.com> Date: Sun, 23 Aug 2026 23:40:50 +0200 Subject: [PATCH 06/12] replace footer document.write year rendering --- dist/about.html | 6 +++++- dist/contact.html | 6 +++++- dist/education.html | 6 +++++- dist/thanks.html | 6 +++++- 4 files changed, 20 insertions(+), 4 deletions(-) diff --git a/dist/about.html b/dist/about.html index 2e4993e..a0acb26 100644 --- a/dist/about.html +++ b/dist/about.html @@ -111,8 +111,12 @@

Bio

This website is cookie-free!
Made with and by me © 2021 + diff --git a/dist/contact.html b/dist/contact.html index d202f96..7003379 100644 --- a/dist/contact.html +++ b/dist/contact.html @@ -144,8 +144,12 @@

Send message

This website is cookie-free!
Made with and by me © 2021 + diff --git a/dist/education.html b/dist/education.html index b12f98b..d6bb189 100644 --- a/dist/education.html +++ b/dist/education.html @@ -486,8 +486,12 @@

Certifications

This website is cookie-free!
Made with and by me © 2021 + diff --git a/dist/thanks.html b/dist/thanks.html index d920231..afc68ac 100644 --- a/dist/thanks.html +++ b/dist/thanks.html @@ -80,8 +80,12 @@

Thank you!

This website is cookie-free!
Made with and by me © 2021 + From 9f81dc54d29fcac01b027690f4b413c7ac5e579c Mon Sep 17 00:00:00 2001 From: mnau23 <51322165+mnau23@users.noreply.github.com> Date: Sun, 23 Aug 2026 23:41:59 +0200 Subject: [PATCH 07/12] add noopener/noreferrer to external blank links --- dist/about.html | 12 ++++++------ dist/contact.html | 16 ++++++++-------- dist/education.html | 34 +++++++++++++++++----------------- dist/index.html | 12 ++++++------ dist/thanks.html | 12 ++++++------ 5 files changed, 43 insertions(+), 43 deletions(-) diff --git a/dist/about.html b/dist/about.html index a0acb26..17b43a3 100644 --- a/dist/about.html +++ b/dist/about.html @@ -88,22 +88,22 @@

Bio