website-v3/static/style.css

689 lines
No EOL
13 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;
--baseRadius: 12px;
--baseTransition: all 250ms;
--navSmallHeight: 66px;
}
/* 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 a:focus{
text-decoration: 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{
transform: scaleX(0.5);
}
.nav-links a:last-child{
padding: 5px 16px;
background: var(--primary);
color: var(--color);
border: none;
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{
background: var(--secondary);
}
nav.small .nav-links a:last-child:hover{
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{
background: inherit;
padding: inherit;
}
}
/* 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{
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{
background: var(--primary);
}
/* 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;
user-select: none;
}
.tag{
background: var(--color);
color: var(--primary);
margin: 10px 5px;
padding: 5px 16px;
border-radius: var(--baseRadius);
transition: var(--baseTransition);
border: 1px solid var(--primary);
}
.tag input{
display: none;
}
.tag:has(:checked){
background: var(--primary);
color: var(--color);
}
.project-list{
padding: 20px 0;
display: flex;
flex-direction: row;
flex-wrap: wrap;
justify-content: center;
align-content: stretch;
align-items: stretch;
}
/* 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-image: url(https://blog.michivonah.ch/content/images/size/w1200/2024/12/ResortPass-Review--1-.jpg);
background-size: cover;
background-repeat: no-repeat;
background-position: center;
border-radius: var(--baseRadius);
transition: var(--baseTransition);
box-shadow: 0px 0px 10px 5px rgba(0, 0, 0, 0.705);
overflow: hidden;
}
@media (pointer: fine){
.project-card:hover{
background: var(--primary);
background-image: url("assets/projects/sprinkle.svg");
background-size: cover;
background-repeat: no-repeat;
background-position: center;
box-shadow: 0px 0px 10px 5px rgba(0, 0, 0, 0.705);
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{
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{
height: 100%;
opacity: 1;
font-size: 1rem;
transform: rotate(0deg);
}
.project-card:hover .card-second h2{
font-size: 1.2rem;
}
.project-card:hover .card-second p{
font-size: 1.1rem;
font-weight: 600;
}
.project-card:hover .card-second i{
font-size: 2.5rem;
}
}
@media (pointer: coarse) or (pointer: none){
.project-card{
background: var(--primary);
background-image: url("assets/projects/sprinkle.svg");
background-size: cover;
background-repeat: no-repeat;
background-position: center;
box-shadow: 0px 0px 10px 5px rgba(0, 0, 0, 0.705);
}
.card-first{
display: none;
}
.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: 1.2rem;
}
.project-card .card-second p{
font-size: 1.1rem;
font-weight: 600;
}
.project-card .card-second i{
font-size: 2.5rem;
}
}
/* 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{
margin: 10px 20px;
color: var(--color);
text-decoration: none;
transform: scale(1.8);
}
/* 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;
}
@media screen and (max-width:490px){
.footer, .footer-part{
width: calc(100% + 20px);
flex-direction: column-reverse;
}
.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{
color: var(--color);
text-decoration: none;
}
@media (pointer: fine){
.footer a:hover:has(i){
transform: scale(1.4);
}
.footer a:hover: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;
}