diff --git a/IMPRINT/index.html b/IMPRINT/index.html index 6065d65..eef0dc3 100644 --- a/IMPRINT/index.html +++ b/IMPRINT/index.html @@ -3,10 +3,9 @@ - Julian Lechner - + @@ -35,7 +34,7 @@

Contact:

Phone: +43 (0) 660 9254001
- E-Mail: julian@lechner.top + E-Mail: contact@fraujulian.xyz


@@ -101,7 +100,7 @@
- +

Back

@@ -114,20 +113,9 @@
diff --git a/LICENSE.md b/LICENSE.md index 19ee8a4..2b7027c 100644 --- a/LICENSE.md +++ b/LICENSE.md @@ -1,6 +1,6 @@ # License Agreement -**Copyright © 2024 Julian Lechner. All rights reserved.** +**Copyright © 2025 Julian Lechner. All rights reserved.** ## 1. Grant of License diff --git a/README.md b/README.md index fe04ad9..ad23ab0 100644 --- a/README.md +++ b/README.md @@ -1,21 +1,12 @@ # 🖼️ FrauJulian's Portfolio Website - -**My portfolio resume website!** -## 👀 Features -- view all github repositories - - view readme - - view primary language - - view stars +### [🙋‍♂️ Website Preview](https://fraujulian.xyz/) ## 👂 Languages/Framework/Packages: - Javascript - CSS - HTML -## 🙋‍♂️ Usefull Links: -- [Website](https://fraujulian.xyz/) - ## 📋 Credits: ~ made by [**FrauJulian**](https://fraujulian.xyz/). diff --git a/Resources/Javascript.js b/Resources/Javascript.js index 4449a15..1c9a1cf 100644 --- a/Resources/Javascript.js +++ b/Resources/Javascript.js @@ -1,14 +1,39 @@ +let _pathName = window.location.pathname; +let _knowledgeIndex = 0; let _todayDate = new Date(); +let _birthdayDate = "2009-03-03"; +let _numberOfLoadedRepositories = 999; +let _numberOfShownRepositories = 999; +let _customProjects = [ + { + "Title": "Azure Devops Effort Tracker", + "Description": "🕙 A desktop application to track the effort of your work items in azure devops.", + "Language": "C# - Avalonia", + "Link": "" + }, + { + "Title": "SynRadio", + "Description": "🖥️ An internet radio station that is available on various media.", + "Language": "TS | JS | HTML | CSS", + "Link": "https://www.synradio.de/" + }, + { + "Title": "SynHost", + "Description": "❓ A support system integrating various platforms and media to offer employees a unified overview.", + "Language": "TS | JS", + "Link": "https://www.synhost.de/" + }]; -if (window.location.pathname.endsWith("index.html")) { - LoadHomepage(); -} else { +if (_pathName.endsWith("/IMPRINT/index.html") || _pathName.endsWith("/IMPRINT/")) { ReplaceCurrentYearPlaceholder(); +} else { + LoadHomepage(); } function LoadHomepage() { ReplacePlaceholders(); - LoadGithubProjects(999, 16); + LoadGithubProjects(); + KnowledgeCarousel(); } function ReplacePlaceholders() { @@ -19,19 +44,40 @@ function ReplacePlaceholders() { } function ReplaceAgePlaceholder() { - let birthDate = new Date('2009-03-03'); + let birthDate = new Date(_birthdayDate); let diffTime = Math.abs(_todayDate - birthDate); - let diffTimeInYears = diffTime / (1000 * 60 * 60 * 24 * 365.25); - let age = diffTimeInYears.toFixed(1); + let diffTimeInYearsCalculation = diffTime / (1000 * 60 * 60 * 24 * 365.25); + let tempAge = diffTimeInYearsCalculation.toFixed(1) + let age = tempAge % 1 === 0 ? diffTimeInYearsCalculation.toFixed(0) : diffTimeInYearsCalculation.toFixed(1); document.body.innerHTML = document.body.innerHTML.replace("%AGE%", age); } function ReplaceCurrentYearPlaceholder() { - let fullCurrentYear = _todayDate.getFullYear(); + let fullCurrentYear = _todayDate.getFullYear().toString(); document.body.innerHTML = document.body.innerHTML.replace("%CURRENT_YEAR%", fullCurrentYear); } -function LoadGithubProjects(numberOfLoadedRepositories, numberOfShownRepositories) { +function KnowledgeCarousel() { + let bioContainer = document.getElementsByClassName("bio")[0]; + let rawListItems = bioContainer.getElementsByTagName("div"); + bioContainer.style = "display: grid !important;"; + + for (let i = 1; i < rawListItems.length; i++) { + rawListItems[i].style = "display: none;"; + } + + _knowledgeIndex++; + + if (_knowledgeIndex > rawListItems.length || _knowledgeIndex === 1) { + _knowledgeIndex = 2 + } + + rawListItems[_knowledgeIndex - 1].style.display = "block"; + + setTimeout(KnowledgeCarousel, 1000); +} + +function LoadGithubProjects() { const sortOnKey = (key, descending) => { return (a, b) => { a = a[key]; @@ -40,7 +86,7 @@ function LoadGithubProjects(numberOfLoadedRepositories, numberOfShownRepositorie }; } - fetch(`https://api.github.com/users/fraujulian/repos?per_page=${numberOfLoadedRepositories}`) + fetch(`https://api.github.com/users/fraujulian/repos?per_page=${_numberOfLoadedRepositories}`) .then((rawResponse) => rawResponse.json()) .then((allProjects) => { allProjects = allProjects.sort(sortOnKey("stargazers_count", true)); @@ -49,22 +95,42 @@ function LoadGithubProjects(numberOfLoadedRepositories, numberOfShownRepositorie projectsDiv.innerHTML = ""; projectsDiv.classList = ""; - for (let currentProjectIndex = 0; currentProjectIndex < numberOfShownRepositories; currentProjectIndex++) { + for (let i = 0; i < _customProjects.length; i++) { + let currentProjectDiv = document.createElement("div"); + currentProjectDiv.classList = "card hoverable"; + + currentProjectDiv.innerHTML = ` +
+
+ + ${_customProjects[i].Title} + +
+ ${_customProjects[i].Language} +
+
+

${_customProjects[i].Description}

+
+ `; + + projectsDiv.appendChild(currentProjectDiv); + } + + for (let currentProjectIndex = 0; currentProjectIndex < _numberOfShownRepositories; currentProjectIndex++) { let currentProjectDiv = document.createElement("div"); currentProjectDiv.classList = "card hoverable"; let currentProject = allProjects[currentProjectIndex]; - if (currentProject !== undefined && - currentProject.fork !== true) { - if (currentProject.description == null) currentProject.description = ""; - if (currentProject.language == null) currentProject.language = ""; + if (currentProject === undefined || currentProject.fork === true) return; + if (currentProject.description == null) currentProject.description = ""; + if (currentProject.language == null) currentProject.language = ""; - currentProject.name = currentProject.name - .replaceAll("_", " ") - .replaceAll("-", " "); + currentProject.name = currentProject.name + .replaceAll("_", " ") + .replaceAll("-", " "); - currentProjectDiv.innerHTML = ` + currentProjectDiv.innerHTML = `
`; - fetch(`https://raw.githubusercontent.com/${currentProject.full_name}/${currentProject.default_branch}/README.md`) - .then((rawResponse) => rawResponse.text()) - .then((readmeText) => { - let markdownToHtmlConverter = new showdown.Converter(); - let readmeInHtml = markdownToHtmlConverter.makeHtml(readmeText); + fetch(`https://raw.githubusercontent.com/${currentProject.full_name}/${currentProject.default_branch}/README.md`) + .then((rawResponse) => rawResponse.text()) + .then((readmeText) => { + let markdownToHtmlConverter = new showdown.Converter(); + let readmeInHtml = markdownToHtmlConverter.makeHtml(readmeText); - let projectReadmeModalDiv = document.createElement("div"); - projectReadmeModalDiv.classList = "modal github-modal hidden"; + let projectReadmeModalDiv = document.createElement("div"); + projectReadmeModalDiv.classList = "modal github-modal hidden"; - projectReadmeModalDiv.innerHTML = ` + projectReadmeModalDiv.innerHTML = ` `; - currentProjectDiv.onclick = function () { - projectReadmeModalDiv.classList.remove("hidden"); - document.body.scrollTop = 0; - document.documentElement.scrollTop = 0; - document.body.style.opacity = 0.2.toString(); + currentProjectDiv.onclick = function () { + projectReadmeModalDiv.classList.remove("hidden"); + document.body.scrollTop = 0; + document.documentElement.scrollTop = 0; + document.body.style.opacity = 0.2.toString(); + } + + projectReadmeModalDiv.onclick = function (mouseClick) { + if (mouseClick.target === projectReadmeModalDiv || + mouseClick.target === document.getElementById("projectReadmeModalDiv-Close")) { + projectReadmeModalDiv.classList.add("hidden"); + document.body.style.opacity = 1.0.toString(); } + } - projectReadmeModalDiv.onclick = function (mouseClick) { - if (mouseClick.target === projectReadmeModalDiv || - mouseClick.target === document.getElementById("projectReadmeModalDiv-Close")) { - projectReadmeModalDiv.classList.add("hidden"); - document.body.style.opacity = 1.0.toString(); - } - } + document + .getElementsByTagName("html")[0] + .appendChild(projectReadmeModalDiv); + }); - document - .getElementsByTagName("html")[0] - .appendChild(projectReadmeModalDiv); - }); + projectsDiv.appendChild(currentProjectDiv); - projectsDiv.appendChild(currentProjectDiv); - } } }); } -let _shortBioTextButton = document.getElementById("short-bio-text"); -let _longBioText = document.getElementsByClassName("long-bio-text")[0]; -let _isLongBioTextShown = true; +let longBioText = document.getElementsByClassName("long-bio-text")[0]; +let isLongBioTextShown = false; -_shortBioTextButton.onclick = function () { +document.getElementById("short-bio-text").onclick = function () { let leftArrow = document.getElementById("left-arrow"); let rightArrow = document.getElementById("right-arrow"); - if (_isLongBioTextShown) { - _longBioText.classList.remove("hidden"); + isLongBioTextShown = !isLongBioTextShown; + + if (isLongBioTextShown) { + longBioText.classList.remove("hidden"); leftArrow.classList.remove("fa-arrow-right"); leftArrow.classList.add("fa-arrow-down"); rightArrow.classList.remove("fa-arrow-left"); rightArrow.classList.add("fa-arrow-down"); leftArrow.style.position = "relative"; rightArrow.style.position = "relative"; - FadeOut(_longBioText); + FadeIn(longBioText); } else { - _longBioText.classList.add("hidden"); + longBioText.classList.add("hidden"); leftArrow.classList.remove("fa-arrow-down"); leftArrow.classList.add("fa-arrow-right"); rightArrow.classList.remove("fa-arrow-down"); rightArrow.classList.add("fa-arrow-left"); leftArrow.style.position = "relative"; rightArrow.style.position = "relative"; - FadeIn(_longBioText); + FadeOut(longBioText); } - - _isLongBioTextShown = !_isLongBioTextShown; }; -_longBioText.onclick = function (mouseClick) { - if (mouseClick.target === _longBioText) { - _longBioText.classList.add("hidden"); +longBioText.onclick = function (mouseClick) { + if (mouseClick.target === longBioText) { + longBioText.classList.add("hidden"); document.body.style.opacity = 1.0.toString(); } }; function FadeOut(element) { - let currentOpacity = 1; - const fadeInterval = setInterval(() => { - if (currentOpacity <= 0.1) { - clearInterval(fadeInterval); + let transparency = 1; + const interval = setInterval(() => { + if (transparency <= 0.1) { + clearInterval(interval) element.style.display = 'none'; return; } - setElementOpacity(element, currentOpacity); - currentOpacity *= 0.9; + transparency *= 0.9; + ApplyTransparency(element, transparency); }, 5); } function FadeIn(element) { - let currentOpacity = 0.1; + let transparency = 0.1; element.style.display = 'block'; - const fadeInterval = setInterval(() => { - if (currentOpacity >= 1) { - clearInterval(fadeInterval); + const interval = setInterval(() => { + if (transparency >= 1) { + clearInterval(interval); + ApplyTransparency(element, 1); return; } - setElementOpacity(element, currentOpacity); - currentOpacity *= 1.1; + transparency *= 1.1; + ApplyTransparency(element, transparency); }, 5); } -function setElementOpacity(element, opacity) { - const opacityPercentage = opacity * 100; - element.style.opacity = opacity; - element.style.filter = `alpha(opacity=${opacityPercentage})`; +function ApplyTransparency(element, transparency) { + element.style.opacity = transparency; + element.style.filter = `alpha(opacity=${Math.round(transparency * 100)})`; } diff --git a/Resources/Style.css b/Resources/Style.css index 2d3c055..860e68f 100644 --- a/Resources/Style.css +++ b/Resources/Style.css @@ -1,14 +1,14 @@ ::-webkit-scrollbar { - width: 5px; - height: 5px; + width: var(--scroll-width); + height: var(--scroll-width); } ::-webkit-scrollbar-thumb { - background: #eaebfe; + background: var(--scroll-thumb-bg); } ::-webkit-scrollbar-track { - background: transparent; + background: var(--scroll-track-bg); } :root { @@ -22,11 +22,30 @@ --padding-big: 20px; --padding-small: 5px; --main-container-width: 750px; - --main-txt-color: #dbe9f4; - --main-shadow-color: #634b28ad; + --main-txt-color: White; + --main-shadow-color: #6F3E38; --donation-modal-height: 200px; --donation-modal-width: 600px; --donation-modal-top: 50%; + --scroll-width: 5px; + --scroll-thumb-bg: Red; + --scroll-track-bg: transparent; + --background-image: url("Images/Background.webp"); + --blur-small: 20px; + --blur-large: 160px; + --shadow-y: 4px; + --shadow-blur: 16px; + --shadow-spread: 0; + --shadow-hover-y: 8px; + --shadow-hover-blur: 16px; + --font-size-large: 20px; + --width-medium: 60%; + --max-width-large: 90%; + --grid-column-width: 24%; + --portfolio-item-height: 128px; + --transition-duration-long: 0.5s; + --transition-duration-short: 0.3s; + --modal-card-height: 80%; } a, @@ -44,13 +63,12 @@ html { background-repeat: no-repeat; background-size: cover; background-attachment: fixed; - background-image: url("Images/background.webp"); - /*background-color: #2f3136; */ + background-image: var(--background-image); height: 100%; } footer { - padding-bottom: 5px; + padding-bottom: var(--main-padding); max-width: 100%; } @@ -67,9 +85,9 @@ ul.nav { list-style-type: none; margin: 0; overflow: hidden; - backdrop-filter: blur(150px); - box-shadow: 0 4px 8px 0 var(--main-shadow-color); - transition: 0.3s; + backdrop-filter: blur(var(--blur-large)); + box-shadow: 0 var(--shadow-y) var(--shadow-blur) var(--shadow-spread) var(--main-shadow-color); + transition: var(--transition-duration-short); } ul.nav li { @@ -169,42 +187,42 @@ ul.nav li.left { } .long-bio-text { - font-size: 20px; + font-size: var(--font-size-large); opacity: 0; - width: 60%; - margin-bottom: 15px !important; + width: var(--width-medium); + margin-bottom: var(--main-padding) !important; margin: auto; - padding: 10px; + padding: var(--main-margin); } .card { margin-top: var(--main-padding); - box-shadow: 0 4px 8px 0 var(--main-shadow-color); - transition: 0.3s; - backdrop-filter: blur(20px); + box-shadow: 0 var(--shadow-y) var(--shadow-blur) var(--shadow-spread) var(--main-shadow-color); + transition: var(--transition-duration-short); + backdrop-filter: blur(var(--blur-small)); padding: var(--main-padding); text-align: center; - color: var(#9ee700); + color: var(--main-txt-color); } .card-projects { display: grid; - box-shadow: 0 4px 8px 0 var(--main-shadow-color); - transition: 0.3s; - backdrop-filter: blur(150px); + box-shadow: 0 var(--shadow-y) var(--shadow-blur) var(--shadow-spread) var(--main-shadow-color); + transition: var(--transition-duration-short); + backdrop-filter: blur(var(--blur-large)); } .card-projects:hover { - box-shadow: 0 8px 16px 0 var(--main-shadow-color); + box-shadow: 0 var(--shadow-hover-y) var(--shadow-hover-blur) var(--shadow-spread) var(--main-shadow-color); } .card:hover { - box-shadow: 0 8px 16px 0 var(--main-shadow-color); + box-shadow: 0 var(--shadow-hover-y) var(--shadow-hover-blur) var(--shadow-spread) var(--main-shadow-color); } .container { background: transparent; - backdrop-filter: blur(20px); + backdrop-filter: blur(var(--blur-small)); margin: auto; width: var(--main-container-width); } @@ -217,8 +235,8 @@ ul.nav li.left { max-width: 100%; } -.github-modal>.card { - height: 80% !important; +.github-modal > .card { + height: var(--modal-card-height) !important; overflow-y: auto; text-align: start; } @@ -233,7 +251,7 @@ ul.nav li.left { .grid-item { width: var(--main-bio-size); margin-left: var(--main-padding); - backdrop-filter: blur(150px); + backdrop-filter: blur(var(--blur-large)); border-radius: var(--main-border-radius); } @@ -265,7 +283,7 @@ ul.nav li.left { .hover-items, .hover-items a { color: var(--main-txt-color); - padding: var(--main-padding) 10px; + padding: var(--main-padding) var(--main-margin); font-size: large; margin: auto; line-height: 1.5em; @@ -273,12 +291,12 @@ ul.nav li.left { } .hoverable:hover { - backdrop-filter: blur(150px); + backdrop-filter: blur(var(--blur-large)); cursor: pointer; } .contact-area a { - color: var(#9ee700); + color: var(--main-txt-color); } .contact-area i { @@ -291,7 +309,7 @@ ul.nav li.left { .contact-area i:hover { cursor: pointer; - backdrop-filter: blur(150px); + backdrop-filter: blur(var(--blur-large)); } .warning-text { @@ -301,7 +319,7 @@ ul.nav li.left { } .max60 { - max-width: 90%; + max-width: var(--max-width-large); margin: auto; } @@ -344,13 +362,13 @@ ul.nav li.left { .portfolio-done { display: grid; - grid-template-columns: 24% 24% 24% 24%; + grid-template-columns: repeat(4, var(--grid-column-width)); justify-content: space-between; margin-bottom: 2em; } .portfolio-done-item { - height: 128px; + height: var(--portfolio-item-height); } .profile img { @@ -368,14 +386,14 @@ ul.nav li.left { display: block; width: 100%; height: auto; - transition: .5s ease; + transition: var(--transition-duration-long) ease; backface-visibility: hidden; - box-shadow: 0 4px 8px 0 var(--main-shadow-color); - transition: 0.3s; + box-shadow: 0 var(--shadow-y) var(--shadow-blur) var(--shadow-spread) var(--main-shadow-color); + transition: var(--transition-duration-short); } .project p { - transition: .5s ease; + transition: var(--transition-duration-long) ease; opacity: 0; position: absolute; top: 50%; @@ -457,6 +475,9 @@ ul.nav li.left { --donation-modal-height: 350px; --donation-modal-width: 600px; --donation-modal-top: 50%; + --mobile-margin: 5px; + --main-container-width: 95%; + --mobile-width: 90%; } body, @@ -480,12 +501,6 @@ ul.nav li.left { } @media screen and (max-width:700px) { - :root { - --mobile-margin: 5px; - --main-container-width: 95%; - --mobile-width: 90%; - } - footer { width: 90%; } diff --git a/index.html b/index.html index c4dc3c8..692011b 100644 --- a/index.html +++ b/index.html @@ -3,6 +3,7 @@ + Julian Lechner @@ -41,23 +42,25 @@
- + @@ -137,6 +149,14 @@ + + + + + + + +
@@ -147,7 +167,7 @@