website-v3/static/style.css

1023 lines
No EOL
20 KiB
CSS

/* FONTS */
@import url('/fonts/source-sans-3.css');
/* GENERAL */
html{scroll-behavior: smooth;}
body{
/* STYLING */
margin: 0;
padding: 0;
background: var(--background);
color: var(--color);
font-family: var(--font);
/* VARIABLES */
--primary: #3498db;
--secondary: #2980b9;
--background: #181818;
--color: #f8f8f8;
--font: "Source Sans 3", sans-serif;
--border: 2px solid var(--color);
--baseRadius: 12px;
--baseTransition: all var(--baseDuration);
--baseDuration: 250ms;
--navSmallHeight: 66px;
--animationOffset: 100px;
--animationScale: 0.75;
--animationCoverValue: 40%;
}
/* CONTENT */
.content{
margin: auto;
}
.inner-width{
margin: auto;
width: 100%;
max-width: clamp(1100px, 90%, 1250px);
}
/* NAVIGATION */
nav{
width: 100%;
height: 96px;
background: transparent;
position: fixed;
top: 0;
left: 0;
transition: var(--baseTransition);
z-index: 1001;
}
nav.small{
height: var(--navSmallHeight);
background: var(--primary);
}
nav .inner-width{
height: 100%;
display: flex;
flex-direction: row;
justify-content: space-between;
align-content: center;
align-items: center;
}
nav img{
width: auto;
height: 56px;
}
nav.small img{
height: 41px;
}
.nav-links a{
/* STYLE */
color: var(--color);
font-size: 1.2rem;
text-decoration: none;
margin: 5px 10px;
/* HOVER EFFECT */
position: relative;
}
.nav-links a:hover,
.nav-links a:focus{
text-decoration: none;
outline: none;
}
.nav-links a:not(:last-child)::after{
content: "";
position: absolute;
top: 100%;
left: 0;
width: 100%;
height: 4px;
background: var(--color);
border-radius: 4px;
transition: var(--baseTransition);
transform: scaleX(0);
}
.nav-links a:not(:last-child):hover::after,
.nav-links a:not(:last-child):focus::after{
transform: scaleX(0.5);
}
.nav-links a:last-child{
padding: 3px 16px;
background: var(--primary);
color: var(--color);
border: 2px solid transparent;
border-radius: var(--baseRadius);
transition: var(--baseTransition);
}
nav.small .nav-links a:last-child{
background: var(--color);
color: var(--primary);
}
.nav-links a:last-child:hover,
.nav-links a:last-child:focus{
padding: 3px 30px;
background: var(--secondary);
border: var(--border);
}
nav.small .nav-links a:last-child:hover,
nav.small .nav-links a:last-child:focus{
background: var(--secondary);
color: var(--color);
}
.nav-toggle{
display: none;
}
@media screen and (max-width:640px){
.nav-toggle{
display: block;
}
.nav-links{
display: none;
}
nav .inner-width{
justify-content: space-between;
padding: 0 20px;
box-sizing: border-box;
}
nav.open{
height: 100dvh;
background: var(--background);
}
nav.open .inner-width{
flex-direction: column;
flex-wrap: wrap;
justify-content: space-around;
align-content: center;
align-items: center;
}
nav.open .nav-links{
display: flex;
flex-direction: column;
flex-wrap: wrap;
justify-content: center;
align-content: center;
align-items: center;
}
nav.open .nav-links a, nav i{
font-size: 2rem;
}
nav i{
font-size: 3rem;
}
.nav-links a:hover::after{
display: none;
}
.nav-links a:last-child,
.nav-links a:last-child:hover,
.nav-links a:last-child:focus,
nav.small .nav-links a:last-child,
nav.small .nav-links a:last-child:hover,
nav.small .nav-links a:last-child:focus{
background: inherit;
padding: inherit;
color: inherit;
border: none;
}
}
/* HERO */
.hero{
display: flex;
flex-direction: column;
justify-content: center;
align-content: center;
align-items: center;
height: 100dvh;
background-image: url("assets/hero/bg_animated_4.svg");
background-size: cover;
background-repeat: repeat-x;
background-position: center;
}
.hero h1{
margin: 0 20px;
font-size: 6rem;
transition: var(--baseTransition);
letter-spacing: -0.6rem;
}
@media screen and (max-width:310px){
.hero h1{
font-size: 4rem;
letter-spacing: -0.4rem;
}
}
@media screen and (max-width:180px){
.hero h1{
font-size: 2.5rem;
letter-spacing: -0.3rem;
}
}
.hero h1 span{
display: inline-block;
animation: wave 2s ease-in-out infinite;
animation-delay: calc(0.1s * (var(--i) - 1));
}
.hero h1 span .name-part{
white-space: nowrap;
display: block;
}
.hero h1 span:nth-child(1) { --i: 1; }
.hero h1 span:nth-child(2) { --i: 2; }
.hero h1 span:nth-child(3) { --i: 3; }
.hero h1 span:nth-child(4) { --i: 4; }
.hero h1 span:nth-child(5) { --i: 5; }
.hero h1 span:nth-child(6) { --i: 6; }
.hero h1 span:nth-child(7) { --i: 7; }
.hero h1 span:nth-child(8) { --i: 8; }
.hero h1 span:nth-child(9) { --i: 9; }
.hero h1 span:nth-child(10) { --i: 10; }
.hero h1 span:nth-child(11) { --i: 11; }
.hero h1 span:nth-child(12) { --i: 12; }
.hero h1 span:nth-child(13) { --i: 13; }
.hero h1 span:nth-child(14) { --i: 14; }
@keyframes wave{
0%, 100%{
transform: translateY(0);
}
50%{
transform: translateY(-20px);
}
}
.hero p{
margin: 0 20px;
font-size: 2rem;
}
.hero a{
margin: 60px 0 0 0;
color: var(--color);
text-decoration: none;
font-size: 3rem;
padding: 5px 15px;
border-radius: 50%;
transition: var(--baseTransition);
animation: scrollHint 2000ms infinite;
}
.hero a:hover,
.hero a:focus{
filter: drop-shadow(0 0 1.1rem var(--primary));
}
@keyframes scrollHint{
0%, 100%{
transform: translateY(0%);
}
40%{
transform: translateY(10%);
}
}
/* ABOUT */
.about{
display: flex;
flex-direction: row;
justify-content: space-between;
align-content: stretch;
align-items: stretch;
padding: 20px;
scroll-margin-top: var(--navSmallHeight);
}
@media screen and (max-width:690px){
.about{
flex-direction: column;
}
}
.about-part{
width: calc(100% - 20px);
margin: 0 10px;
box-sizing: border-box;
}
.about img{
padding: 10px;
width: 100%;
box-sizing: border-box;
border-radius: 50%;
border: var(--baseRadius) solid var(--primary);
transition: var(--baseTransition);
}
@media (pointer: fine){
.about img:hover{
padding: 0px;
}
}
.about a{
color: var(--color);
text-decoration: underline;
text-decoration-thickness: 2px;
text-decoration-color: var(--primary);
transition: var(--baseTransition);
}
.about a:hover,
.about a:focus{
background: var(--primary);
outline: none;
}
.about var{
font-style: normal;
}
/* PROJECTS */
.projects{
text-align: center;
scroll-margin-top: calc(var(--navSmallHeight) + 20px);
}
.tag-filter{
display: flex;
flex-direction: row;
justify-content: center;
align-content: flex-start;
align-items: baseline;
flex-wrap: wrap;
-webkit-user-select: none;
user-select: none;
}
.tag{
background: var(--color);
color: var(--primary);
margin: 10px 5px;
padding: 5px 16px;
font-size: 1rem;
border-radius: var(--baseRadius);
transition: var(--baseTransition);
border: 2px solid var(--primary);
cursor: pointer;
}
.tag input{
display: none;
}
.tag:has(:checked){
background: var(--primary);
color: var(--color);
}
.tag:hover,
.tag:focus{
padding: 5px 26px;
background: var(--secondary);
color: var(--color);
border: var(--border);
}
.project-list{
padding: 20px 0;
display: flex;
flex-direction: row;
flex-wrap: wrap;
justify-content: center;
align-content: stretch;
align-items: stretch;
}
.project-load-btn{
padding: 10px 20px;
background: var(--primary);
color: var(--color);
font-size: 1rem;
border: 2px solid transparent;
border-radius: var(--baseRadius);
transition: var(--baseTransition);
opacity: 1;
}
.project-load-btn.hidden{
opacity: 0;
}
.project-load-btn:hover,
.project-load-btn:focus{
padding: 10px 40px;
background: var(--secondary);
border: var(--border);
cursor: pointer;
}
.no-projects{
font-size: 1.8rem;
font-weight: 600;
transition: var(--baseTransition);
}
.no-projects.hidden{
opacity: 0;
scale: 0;
height: 0;
}
.no-projects i{
font-size: 3rem;
}
/* hide load more btn when no projects are shown */
.project-list:not(:has(.project-card:not(.hidden))) ~ .project-load .project-load-btn{
display: none;
}
/* Card animation: https://uiverse.io/suleymanlaarabidev/perfect-husky-88 */
.project-card{
width: 30%;
min-width: 300px;
min-height: 250px;
margin: 20px 10px;
padding: 0 10px;
background: var(--primary);
background-size: cover;
background-repeat: no-repeat;
background-position: center;
border-radius: var(--baseRadius);
transition: var(--baseTransition);
box-shadow: var(--boxShadow);
overflow: hidden;
position: relative;
--boxShadow: 0px 0px 10px 5px rgba(0, 0, 0, 0.705);
--backgroundImage: url("assets/projects/sprinkle.svg");
--fontSizeH2: 1.2rem;
--fontSizeIcon: 2.5rem;
--fontSizeP: 1.1rem;
--fontWeightP: 600;
}
.project-card a{
color: inherit;
text-decoration: none;
font-style: inherit;
}
.project-card.hidden{
animation: fade-out var(--baseDuration) ease-in-out;
animation-fill-mode: forwards;
}
.card-first img{
position: absolute;
top: 50%;
left: 50%;
transform: translate(-50%, -50%);
width: auto;
height: 100%;
}
@media (pointer: fine){
.project-card:hover,
.project-card:focus{
background: var(--primary);
background-image: var(--backgroundImage);
background-size: cover;
background-repeat: no-repeat;
background-position: center;
box-shadow: var(--boxShadow);
cursor: pointer;
overflow: hidden;
}
.card-first{
width: 100%;
height: 100%;
display: flex;
flex-direction: column;
justify-content: center;
align-items: center;
transition: var(--baseTransition);
opacity: 1;
}
.project-card:hover .card-first,
.project-card:focus .card-first{
height: 0;
opacity: 0;
}
.card-second{
width: 100%;
height: 0;
display: flex;
flex-direction: column;
justify-content: center;
align-items: center;
transition: var(--baseTransition);
opacity: 0;
font-size: 0;
transform: rotate(90deg) scale(-1);
}
.project-card:hover .card-second,
.project-card:focus .card-second{
height: 100%;
opacity: 1;
font-size: 1rem;
transform: rotate(0deg);
}
.project-card:hover .card-second h2,
.project-card:focus .card-second h2{
font-size: var(--fontSizeH2);
}
.project-card:hover .card-second p,
.project-card:focus .card-second p{
font-size: var(--fontSizeP);;
font-weight: var(--fontWeightP);
}
.project-card:hover .card-second i,
.project-card:focus .card-second i{
font-size: var(--fontSizeIcon);;
}
}
@media (pointer: coarse) or (pointer: none){
.project-card{
background: var(--primary);
background-image: var(--backgroundImage);
background-size: cover;
background-repeat: no-repeat;
background-position: center;
box-shadow: var(--boxShadow);
}
.card-first img{
height: calc(100% + 60px);
filter: blur(6px);
}
.card-second{
width: 100%;
height: 100%;
display: flex;
flex-direction: column;
justify-content: center;
align-items: center;
transition: var(--baseTransition);
height: 100%;
opacity: 1;
font-size: 1rem;
transform: rotate(0deg);
}
.project-card .card-second h2{
font-size: var(--fontSizeH2);
}
.project-card .card-second p{
font-size: var(--fontSizeP);
font-weight: var(--fontWeightP);
}
.project-card .card-second i{
font-size: var(--fontSizeIcon);
}
}
/* PROJECTS LOADER */
/* credits: https://uiverse.io/AbanoubMagdy1/evil-bullfrog-30 */
.project-loader-wrapper{
width: 100%;
height: calc(var(--size) * 2);
margin: 0 0 var(--size) 0;
display: flex;
justify-content: center;
align-content: center;
align-items: center;
--size: 2.5rem;
--factor: 2.5;
--duration: 2s;
--background: var(--primary);
}
.project-loader-wrapper.hidden{
display: none;
}
.project-loader{
width: var(--size);
height: var(--size);
position: relative;
animation: circleLoader var(--duration) linear infinite;
transition: var(--baseTransition);
}
.project-loader:hover{
--size: 3rem;
--background: var(--secondary);
}
.project-loader-circle{
width: calc(var(--size) / var(--factor));
height: calc(var(--size) / var(--factor));
background: var(--background);
border-radius: 50%;
position: absolute;
transition: var(--baseTransition);
}
.project-loader-circle:nth-child(1){
top: 0;
left: 0;
}
.project-loader-circle:nth-child(2){
top: 0;
right: 0;
}
.project-loader-circle:nth-child(3){
bottom: 0;
left: 0;
}
.project-loader-circle:nth-child(4){
bottom: 0;
right: 0;
}
@keyframes circleLoader{
0%{
scale: 1;
rotate: 0deg;
}
20%, 25%{
scale: 1.3;
rotate: 90deg;
}
45%, 50%{
scale: 1;
rotate: 180deg;
}
70%, 75%{
scale: 1.3;
rotate: 270deg;
}
95%, 100%{
scale: 1;
rotate: 360deg;
}
}
/* CONTACT */
.contact{
display: flex;
flex-direction: column;
justify-content: center;
align-content: center;
align-items: center;
height: 100dvh;
background-image: url("assets/hero/bg_animated_4.svg");
background-size: cover;
background-repeat: repeat-x;
background-position: center;
}
.contact h1{
margin: inherit 20px;
font-size: clamp(1.5rem, 10vw, 6rem);
word-break: break-word;
overflow: hidden;
border-right: 0.15em solid var(--primary);
white-space: nowrap;
}
@media (prefers-reduced-motion: no-preference){ /* Only runs when user did not disable animations */
.typewriter-animation{
animation: typing 2s steps(32, end), caret .75s step-end infinite; /* Typewriter effect: https://css-tricks.com/snippets/css/typewriter-effect/ */
}
}
@keyframes typing{
0%{
width: 0;
}
100%{
width: 100%;
}
}
@keyframes caret {
0%, 100%{
border-color: transparent;
}
50%{
border-color: var(--primary);
}
}
.contact div{
display: flex;
flex-direction: row;
justify-content: space-around;
align-content: center;
align-items: center;
}
@media screen and (max-width:330px){
.contact div{
flex-direction: column;
}
}
.contact a{
margin: 10px;
font-size: 3rem;
color: var(--color);
text-decoration: none;
transition: var(--baseTransition);
}
.contact a:hover,
.contact a:focus{
margin: 10px 20px;
color: var(--color);
text-decoration: none;
transform: scale(1.8);
outline: none;
}
/* SCROLL TOP */
.scroll-top{
width: 40px;
height: 40px;
margin: 15px;
background: var(--primary);
color: var(--color);
border-radius: var(--baseRadius);
position: fixed;
bottom: 0;
right: 0;
display: flex;
justify-content: center;
font-size: 28px;
transition: var(--baseTransition);
}
.scroll-top a{
text-decoration: none;
color: var(--color);
margin-top: 0;
transition: var(--baseTransition);
}
.scroll-top a:hover,
.scroll-top a:focus{
margin-top: -5px;
}
.scroll-top i{
stroke-width: 3px;
}
/* FOOTER */
.footer{
width: 100%;
height: auto;
padding: 10px 80px 10px 40px;
box-sizing: border-box;
background: var(--primary);
color: var(--color);
font-size: 1rem;
display: flex;
flex-direction: row;
justify-content: space-between;
align-content: center;
align-items: baseline;
background-image: url("assets/projects/sprinkle.svg");
background-size: cover;
background-repeat: repeat-x;
background-position: center;
}
.footer-part, .sm-icons{
display: flex;
flex-direction: row;
justify-content: space-around;
align-content: center;
align-items: center;
padding: 0 10px;
}
@media screen and (max-width:490px){
.footer, .footer-part{
flex-direction: column-reverse;
}
.footer-part{
width: calc(100% + 20px);
}
.sm-icons{
flex-direction: row;
}
.sm-icons i{
font-size: 1.4rem;
}
}
.footer a{
margin: 10px;
font-size: 1rem;
color: var(--color);
text-decoration: none;
transition: var(--baseTransition);
}
.footer a:hover,
.footer a:focus{
color: var(--color);
text-decoration: none;
outline: none;
}
@media (pointer: fine){
.footer a:hover:has(i),
.footer a:focus:has(i){
transform: scale(1.4);
}
.footer a:hover:not(:has(i)),
.footer a:focus:not(:has(i)){
transform: scale(1.1);
}
}
.footer select{
background: var(--color);
color: var(--primary);
margin: 10px 5px;
padding: 5px 16px;
border-radius: var(--baseRadius);
transition: var(--baseTransition);
border: 1px solid var(--primary);
outline: none;
}
/* GENERAL ANIMATIONS */
/* only css on scroll animations: https://www.youtube.com/watch?v=0TnO1GzKWPc */
@media (prefers-reduced-motion: no-preference){
.fade-up{
animation: fade-up linear;
animation-timeline: view();
animation-composition: add;
animation-range: entry 0 cover var(--animationCoverValue);
overflow: hidden;
}
.fade-down{
animation: fade-down var(--baseDuration) linear;
animation-timeline: view();
animation-composition: add;
animation-range: entry 0 cover var(--animationCoverValue);
overflow: hidden;
}
.fade-left{
animation: fade-left var(--baseDuration) linear;
animation-timeline: view();
animation-composition: add;
animation-range: entry 0 cover var(--animationCoverValue);
overflow: hidden;
}
.fade-right{
animation: fade-right var(--baseDuration) linear;
animation-timeline: view();
animation-composition: add;
animation-range: entry 0 cover var(--animationCoverValue);
overflow: hidden;
}
}
@keyframes fade-up{
0%{
opacity: 0;
translate: 0px var(--animationOffset);
scale: var(--animationScale);
}
100%{
opacity: 1;
translate: 0px 0px;
scale: 1;
}
}
@keyframes fade-down{
0%{
opacity: 0;
translate: 0px calc(var(--animationOffset) * -1);
scale: var(--animationScale);
}
100%{
opacity: 1;
translate: 0px 0px;
scale: 1;
}
}
@keyframes fade-left{
0%{
opacity: 0;
translate: calc(var(--animationOffset) * -1) 0px;
scale: var(--animationScale);
}
100%{
opacity: 1;
translate: 0px 0px;
scale: 1;
}
}
@keyframes fade-right{
0%{
opacity: 0;
translate: var(--animationOffset) 0px;
scale: var(--animationScale);
}
100%{
opacity: 1;
translate: 0px 0px;
scale: 1;
}
}
@keyframes fade-in{
0%{
opacity: 0;
scale: 0;
}
100%{
opacity: 1;
scale: 1;
}
}
@keyframes fade-out{
0%{
opacity: 1;
scale: 1;
}
100%{
opacity: 0;
scale: 0;
}
}