diff --git a/css/donation.css b/css/donation.css new file mode 100644 index 0000000..6fdd497 --- /dev/null +++ b/css/donation.css @@ -0,0 +1,70 @@ +:root { + --donation-modal-height: 200px; + --donation-modal-width: 600px; + --donation-modal-top: 50%; +} + +#donate { + text-decoration-line: underline; +} + +#donate:hover { + cursor: pointer; +} + +#donateModal { + display: none; +} + +.modal { + top: 0; + right: 0; + position: absolute; + margin: auto; + height: 100vh; + width: 100%; +} + +.modal .card { + opacity: 1; + position: absolute; + left: 0; + right: 0; + top: 0; + bottom: 0; + margin: auto; + height: var(--donation-modal-height); + width: var(--donation-modal-width); + max-width: 100%; +} + +.refer-area { + text-decoration-line: underline; +} + +@media screen and (max-width: 700px) { + :root { + --donation-modal-height: 350px; + --donation-modal-width: 600px; + --donation-modal-top: 50%; + } + + .modal .card { + vertical-align: middle; + width: 80%; + opacity: 1; + } + + .modal { + position: absolute; + margin: auto; + height: 100%; + width: 100%; + background: rgba(0, 0, 0, 0.4); + } + + html, + body { + height: 100% !important; + } +} \ No newline at end of file diff --git a/css/github.css b/css/github.css new file mode 100644 index 0000000..c4f38b1 --- /dev/null +++ b/css/github.css @@ -0,0 +1,60 @@ +.hoverable:hover { + backdrop-filter: blur(150px); + cursor: pointer; +} + +#github_projects .stargazers { + padding-right: var(--padding-small); +} + +#github_projects .stars { + color: var(--main-txt-color) !important; +} + +#github_projects a { + text-transform: capitalize; + text-decoration-line: none; +} + +.github-modal>.card { + height: 80% !important; + overflow-y: auto; +} + +#github_projects .card { + padding: var(--padding-big); + text-align: left; +} + +#github_projects .card a { + color: var(--main-txt-color) !important; +} + +#github_projects .card p { + margin: 0; +} + +.github-hidden { + display: none; +} + +.github-modal>.card { + text-align: start; +} + +.github-modal img { + max-width: 100%; +} + +::-webkit-scrollbar { + width: 5px; + height: 5px; +} + +::-webkit-scrollbar-track { + background: transparent; +} + +::-webkit-scrollbar-thumb { + background: #eaebfe; +} \ No newline at end of file diff --git a/css/style.css b/css/style.css new file mode 100644 index 0000000..100109f --- /dev/null +++ b/css/style.css @@ -0,0 +1,423 @@ +:root { + --main-padding: 15px; + --main-margin: 10px; + --main-img-size: 200px; + --main-bio-size: 200px; + --main-bio-margin: 5px; + --main-icon-width: 80px; + --main-border-radius: 5px; + --padding-big: 20px; + --padding-small: 5px; + --main-container-width: 750px; +} + +@media (prefers-color-scheme: dark) { + :root { + --main-txt-color: #fff; + } +} + +@media (prefers-color-scheme: light) { + :root { + --main-txt-color: #fff; + } +} + +h2 { + line-height-step: 100px; +} + +html, +body { + font-family: 'Comic Sans MS', Arial, sans-serif; + margin: 0; + color: var(--main-txt-color); + text-align: center; + background-repeat: no-repeat; + background-size: cover; + background-attachment: fixed; + background-image: url("../img/background.webp"); + height: 100%; +} + +a { + color: var(--main-txt-color); + text-decoration-line: none; +} + +footer { + padding-bottom: 5px; + max-width: 100%; +} + +footer a { + color: var(--main-txt-color); + text-decoration-line: underline; +} + +.js-reminder { + font-style: normal; + font-weight: 900; + padding: var(--main-padding); +} + +.bio { + display: none !important; + font-style: normal; + font-weight: 900; + padding: var(--main-padding); +} + +.grid-container { + margin: var(--main-margin); + display: grid; + justify-content: center; + grid-template-columns: auto auto; +} + +.grid-item { + width: var(--main-bio-size); + margin-left: var(--main-padding); + backdrop-filter: blur(150px); + border-radius: var(--main-border-radius); +} + +.grid-item h1, +.grid-item-start h1 { + margin: var(--main-bio-margin); +} + +.grid-item-start { + grid-row-start: 1; + grid-row-end: 8; +} + +.bio table .right { + cursor: pointer; + border-radius: var(--main-border-radius); + backdrop-filter: blur(150px); +} + +.social { + border: 0; + margin: auto; +} + +.project { + position: relative; +} + +.project img { + opacity: 1; + display: block; + width: 100%; + height: auto; + transition: .5s ease; + backface-visibility: hidden; + box-shadow: 0 4px 8px 0 #0e85b456; + transition: 0.3s; +} + +.project:hover img { + opacity: 0.3 +} + +.project:hover p { + opacity: 1.0 +} + +.project p { + transition: .5s ease; + opacity: 0; + position: absolute; + top: 50%; + left: 50%; + transform: translate(-50%, -50%); + -ms-transform: translate(-50%, -50%) +} + +.portfolio { + display: grid; + grid-template-columns: repeat(auto-fill, 128px); + justify-content: space-between; +} + +.portfolio-done { + display: grid; + grid-template-columns: 24% 24% 24% 24%; + justify-content: space-between; + margin-bottom: 2em; +} + +.portfolio-done-item { + height: 128px; +} + +.social a { + border: 0; +} + +ul.nav { + list-style-type: none; + margin: 0; + overflow: hidden; + backdrop-filter: blur(150px); + box-shadow: 0 4px 8px 0 #0e85b456; + transition: 0.3s; +} + +.hidden { + display: none; +} + +ul.nav li { + float: right; +} + +ul.nav li a { + display: block; + color: white; + text-decoration: none; +} + +ul.nav li a:hover:not(.active) { + background-color: #111; +} + +ul.nav li a.active { + background-color: #2F3136; +} + +ul.nav li.left { + float: left; +} + +.card-projects { + display: grid; + box-shadow: 0 4px 8px 0 #0e85b456; + transition: 0.3s; + backdrop-filter: blur(150px); +} + +.card-projects:hover { + box-shadow: 0 8px 16px 0 #0e85b456; +} + +.icon-area i { + justify-content: space-between; + width: var(--main-icon-width); + padding-top: var(--main-padding); + padding-bottom: var(--main-padding); + border-radius: var(--main-border-radius); +} + +.icon-area i:hover { + cursor: pointer; + backdrop-filter: blur(150px); +} + +.icon-area a { + color: var(--main-txt-color); +} + +.card { + margin-top: var(--main-padding); + box-shadow: 0 4px 8px 0 #0e85b456; + transition: 0.3s; + backdrop-filter: blur(20px); + padding: var(--main-padding); + text-align: center; + color: var(--main-txt-color); +} + +.nomargin { + margin: 0; +} + +.hover-items, +.hover-items a { + color: var(--main-txt-color); + padding: var(--main-padding) 10px; + font-size: large; + margin: auto; + line-height: 1.5em; + text-align: center; +} + +.hover-items a:hover { + cursor: pointer; + opacity: 0.8; +} + + +.profile img { + margin: auto; + max-width: var(--main-img-size); + border-radius: 50%; +} + +.card:hover { + box-shadow: 0 8px 16px 0 #0e85b456; +} + +.container { + background: transparent; + backdrop-filter: blur(20px); + margin: auto; + width: var(--main-container-width); +} + +.media-body { + color: var(--main-txt-color) !important; + margin-bottom: 10px; +} + +.table { + color: var(--main-txt-color) !important; + font-weight: lighter; +} + +@media screen and (max-width: 700px) { + :root { + --mobile-margin: 5px; + --main-container-width: 95%; + --mobile-width: 90%; + } + + ul.nav li.right, + ul.nav li { + float: none; + } + + ul.nav li.left { + display: none; + } + + .portfolio-done { + grid-template-columns: auto; + justify-content: initial; + width: 100%; + } + + .portfolio-done-item { + width: 100%; + } + + .grid-container { + grid-template-columns: auto; + } + + .icon-area i { + margin-top: var(--mobile-margin); + } + + .short_desc { + width: var(--mobile-width); + } + + footer { + width: var(--main-container-width); + } + + .bio-text { + width: 95% !important; + } + + #left-arrow { + position: initial !important; + margin-right: 10px; + } + + #right-arrow { + position: initial !important; + margin-left: 10px; + } + + .max60 { + max-width: 100%; + } +} + +#bio { + text-decoration-line: underline; +} + +.max60 { + max-width: 90%; + margin: auto; +} + +#bio:hover { + cursor: pointer; +} + +#right-arrow { + position: relative; + -webkit-animation: linear infinite alternate; + -webkit-animation-name: runRight; + -webkit-animation-duration: 2s; +} + +#left-arrow { + position: relative; + -webkit-animation: linear infinite alternate; + -webkit-animation-name: runLeft; + -webkit-animation-duration: 2s; +} + +@-webkit-keyframes runLeft { + 0% { + left: 50%; + } + + 50% { + left: 70%; + } + + 100% { + left: 50%; + } +} + +@-webkit-keyframes runRight { + 0% { + right: 50%; + } + + 50% { + right: 70%; + } + + 100% { + right: 50%; + } +} + +.hover-items { + display: grid; + grid-template-columns: auto auto auto; + align-items: center; +} + +.bio-text { + font-size: 20px; + opacity: 0; + width: 60%; + margin-bottom: 15px !important; + margin: auto; + padding: 10px; +} + +@media only screen and (min-width: 1025px) { + .circle { + height: 24px; + width: 24px; + border-radius: 24px; + background-color: black; + position: fixed; + top: 0; + left: 0; + pointer-events: none; + z-index: 99999999; + } +} \ No newline at end of file diff --git a/img/background.webp b/img/background.webp new file mode 100644 index 0000000..3727fe3 Binary files /dev/null and b/img/background.webp differ diff --git a/img/logo.webp b/img/logo.webp new file mode 100644 index 0000000..e887ae4 Binary files /dev/null and b/img/logo.webp differ diff --git a/imprint.html b/imprint.html index 8c2e3b8..3d8584e 100644 --- a/imprint.html +++ b/imprint.html @@ -2,21 +2,18 @@ - - - - + + + + - Julian Lechner - - - - - - - - + Julian Lechner + + + + + @@ -72,31 +69,30 @@ + diff --git a/index.html b/index.html index 1d5e041..e5481c5 100644 --- a/index.html +++ b/index.html @@ -14,17 +14,13 @@ - - - -
- +

Hy! 👋 I'm Julian Lechner!

aka. FrauJulian

@@ -54,7 +50,6 @@

Just contact me!

-

ENABLE JAVASCRIPT

@@ -128,13 +123,12 @@ Julian Lechner - All rights reserved.

- - - + + - + - + - + diff --git a/js/dynamic.js b/js/dynamic.js new file mode 100644 index 0000000..5c2e8f3 --- /dev/null +++ b/js/dynamic.js @@ -0,0 +1,60 @@ +let bioBtn = document.getElementById('short-desc'); +let bioModel = document.getElementsByClassName('bio-text')[0]; +let leftArrow = document.getElementById("left-arrow"); +let rightArrow = document.getElementById("right-arrow"); +let hidden = true; +bioBtn.onclick = function () { + if (hidden) { + bioModel.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"; + unfade(bioModel); + } else { + bioModel.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"; + fade(bioModel); + } + hidden = !hidden; +}; + +bioModel.onclick = function (evt) { + if (evt.target == bioModel) { + bioModel.classList.add("hidden"); + document.body.style.opacity = 1; + } +}; + +function fade(element) { + var op = 1; + var timer = setInterval(function () { + if (op <= 0.1) { + clearInterval(timer); + element.style.display = 'none'; + } + element.style.opacity = op; + element.style.filter = 'alpha(opacity=' + op * 100 + ")"; + op -= op * 0.1; + }, 5); +} + +function unfade(element) { + var op = 0.1; + element.style.display = 'block'; + var timer = setInterval(function () { + if (op >= 1) { + clearInterval(timer); + } + element.style.opacity = op; + element.style.filter = 'alpha(opacity=' + op * 100 + ")"; + op += op * 0.1; + }, 5); +} diff --git a/js/github.js b/js/github.js new file mode 100644 index 0000000..503d4a0 --- /dev/null +++ b/js/github.js @@ -0,0 +1,84 @@ + window.onload = function () { + let script = document.createElement("script"); + script.src = "https://cdnjs.cloudflare.com/ajax/libs/showdown/2.1.0/showdown.min.js"; + document.body.appendChild(script); + + const sortOnKey = (key, desc) => { + return (a, b) => { + a = a[key]; + b = b[key]; + return desc ? b - a : a - b; + } + }; + + String.prototype.replaceAt = function (index, replacement) { + return this.substr(0, index) + replacement + this.substr(index + replacement.length); + } + fetch("https://api.github.com/users/fraujulian/repos?per_page=999") + .then(response => response.json()) + .then(projects => { + projects = projects.sort(sortOnKey("stargazers_count", true)); + let projectsDiv = document.getElementById("github_projects"); + projectsDiv.innerHTML = ""; + projectsDiv.classList = ""; + for (let i = 0; i < 16; i++) { + let projectDiv = document.createElement("div"); + projectDiv.classList = "card hoverable"; + let project = projects[i]; + if (project != undefined) { + if (project.description == null) + project.description = "This project has no description"; + if (project.language == null) + project.language = "No language stored!"; + project.name = project.name.replaceAll('_', ' ').replaceAll('-', ' '); + projectDiv.innerHTML = ` +
+
+ + ${project.name} + +
+ 📕 ${project.language}
+ ⭐ ${project.stargazers_count} +
+
+

${project.description}

+
+ `; + fetch(`https://raw.githubusercontent.com/${project.full_name}/master/README.md`) + .then(response => response.text()) + .then(text => { + let converter = new showdown.Converter(); + let html = converter.makeHtml(text); + let projectModal = document.createElement("div"); + projectModal.classList = "modal github-modal hidden"; + projectModal.innerHTML = ` +
+ + Visit on GitHub +
+
+ ${html} +
+ `; + + projectDiv.onclick = function () { + projectModal.classList.remove("hidden"); + document.body.scrollTop = 0; // Safari + document.documentElement.scrollTop = 0; // Chrome Firefox IE Opera + document.body.style.opacity = 0.2; + }; + + projectModal.onclick = function (evt) { + if (evt.target == projectModal) { + projectModal.classList.add("hidden"); + document.body.style.opacity = 1; + } + }; + document.getElementsByTagName("html")[0].appendChild(projectModal); + }); + projectsDiv.appendChild(projectDiv); + } + } + }); + }; \ No newline at end of file