Files
2026-10-25 19:35:32 +01:00

506 lines
11 KiB
CSS

@layer layout {
.container {
width: 100%;
max-width: calc(var(--container) + 2 * var(--gutter));
margin-inline: auto;
padding-inline: max(var(--gutter), env(safe-area-inset-left)) max(var(--gutter), env(safe-area-inset-right));
}
.container--wide {
max-width: calc(92rem + 2 * var(--gutter));
}
.section {
padding-top: var(--section);
}
.section--flush {
padding-top: 0;
}
.section--tight {
padding-top: calc(var(--section) * 0.75);
}
.section-head {
display: flex;
flex-wrap: wrap;
align-items: baseline;
gap: 0.5rem 1.25rem;
margin-bottom: clamp(1.75rem, 4vw, 3.25rem);
padding-top: 1.25rem;
border-top: 1px solid var(--line);
}
.section-head__index {
font-family: var(--font-mono);
font-size: 0.8rem;
color: var(--pink-text);
}
.section-head__title {
flex: 1 1 auto;
font-size: var(--step-4);
}
.section-head__more {
display: inline-flex;
align-items: center;
gap: 0.4rem;
min-height: 2.75rem;
color: var(--muted);
font-size: 0.95rem;
text-decoration: none;
transition: color 0.2s;
&:hover {
color: var(--text);
}
}
/* Header. The header itself is never transformed, otherwise it would become
the containing block for the fixed mobile menu inside it. */
.site-header {
position: fixed;
inset: 0 0 auto;
z-index: 50;
height: calc(var(--header-h) + env(safe-area-inset-top));
padding-top: env(safe-area-inset-top);
&::before {
content: "";
position: absolute;
inset: 0;
background: rgb(12 10 18 / 0.72);
-webkit-backdrop-filter: blur(14px) saturate(140%);
backdrop-filter: blur(14px) saturate(140%);
border-bottom: 1px solid var(--line);
opacity: 0;
transition: opacity 0.3s, translate 0.45s var(--ease-out);
}
&.is-scrolled::before {
opacity: 1;
}
&.is-hidden {
pointer-events: none;
&::before,
.site-header__inner {
translate: 0 -110%;
}
}
}
.site-header__inner {
position: relative;
height: 100%;
display: flex;
align-items: center;
justify-content: space-between;
gap: 1rem;
transition: translate 0.45s var(--ease-out);
}
.brand {
position: relative;
z-index: 1;
display: inline-flex;
align-items: center;
gap: 0.6rem;
min-height: 2.75rem;
text-decoration: none;
}
.brand__mark {
width: 2.25rem;
height: 2.25rem;
border-radius: 50%;
box-shadow: 0 0 0 1px var(--line-strong), 0 0 20px rgb(255 118 164 / 0.3);
transition: rotate 0.4s var(--ease-out), scale 0.4s var(--ease-out);
}
.brand:hover .brand__mark {
rotate: -8deg;
scale: 1.06;
}
.brand__name {
font-family: var(--font-display);
font-size: 1.4rem;
font-weight: 700;
letter-spacing: -0.04em;
line-height: 1;
}
.menu-toggle {
position: relative;
z-index: 1;
display: none;
align-items: center;
gap: 0.75rem;
min-height: 2.75rem;
padding: 0 0.25rem 0 0.9rem;
border: 1px solid var(--line-strong);
border-radius: 99px;
background: rgb(12 10 18 / 0.5);
font-size: 0.9rem;
}
.menu-toggle__icon {
position: relative;
display: grid;
place-items: center;
width: 2.25rem;
height: 2.25rem;
& span {
position: absolute;
width: 1rem;
height: 1.5px;
border-radius: 2px;
background: currentColor;
transition: translate 0.35s var(--ease-out), rotate 0.35s var(--ease-out);
}
& span:first-child {
translate: 0 -3px;
}
& span:last-child {
translate: 0 3px;
}
}
.menu-open .menu-toggle__icon {
& span:first-child {
translate: none;
rotate: 45deg;
}
& span:last-child {
translate: none;
rotate: -45deg;
}
}
.site-nav {
display: flex;
align-items: center;
gap: 2rem;
}
.site-nav__list {
display: flex;
gap: 1.75rem;
margin: 0;
padding: 0;
list-style: none;
}
.site-nav__link {
position: relative;
display: inline-flex;
align-items: center;
min-height: 2.75rem;
color: var(--muted);
font-size: 0.95rem;
text-decoration: none;
transition: color 0.2s;
&::after {
content: "";
position: absolute;
left: 0;
right: 0;
bottom: 0.55rem;
height: 1px;
background: var(--fluid);
scale: 0 1;
transform-origin: right;
transition: scale 0.4s var(--ease-out);
}
&:hover,
&[aria-current="page"] {
color: var(--text);
&::after {
scale: 1 1;
transform-origin: left;
}
}
}
.lang-switch {
display: inline-flex;
align-items: center;
gap: 0.35rem;
min-height: 2.5rem;
padding-inline: 0.85rem;
border: 1px solid var(--line-strong);
border-radius: 99px;
font-family: var(--font-mono);
font-size: 0.78rem;
text-decoration: none;
transition: border-color 0.2s, background-color 0.2s;
&:hover {
border-color: var(--text);
background: rgb(243 238 248 / 0.06);
}
}
.lang-switch__current,
.lang-switch__sep {
color: var(--faint);
}
@media (max-width: 47.99em) {
.menu-toggle {
display: inline-flex;
}
.site-nav {
position: fixed;
inset: 0;
z-index: -1;
flex-direction: column;
align-items: flex-start;
justify-content: center;
gap: 2.5rem;
padding: calc(var(--header-h) + env(safe-area-inset-top) + 1rem) var(--gutter) calc(2.5rem + env(safe-area-inset-bottom));
overflow-y: auto;
background:
radial-gradient(90% 60% at 100% 0%, rgb(192 17 215 / 0.28), transparent 70%),
radial-gradient(80% 60% at 0% 100%, rgb(47 60 190 / 0.35), transparent 70%),
var(--bg);
clip-path: circle(0 at calc(100% - 2.75rem) 2.1rem);
visibility: hidden;
transition: clip-path 0.55s var(--ease-in-out), visibility 0s 0.55s;
}
.menu-open .site-nav {
clip-path: circle(150% at calc(100% - 2.75rem) 2.1rem);
visibility: visible;
transition: clip-path 0.7s var(--ease-out), visibility 0s;
}
.menu-open .site-header::before {
opacity: 0;
}
.site-nav__list {
flex-direction: column;
gap: 0.25rem;
}
.site-nav__link {
font-family: var(--font-display);
font-size: clamp(2.25rem, 11vw, 3.25rem);
font-weight: 600;
letter-spacing: -0.03em;
color: var(--text);
opacity: 0;
translate: 0 1rem;
transition: opacity 0.4s, translate 0.5s var(--ease-out);
&::after {
bottom: 0.4rem;
}
}
.menu-open .site-nav__link {
opacity: 1;
translate: none;
}
.menu-open .site-nav__item:nth-child(1) .site-nav__link { transition-delay: 0.12s; }
.menu-open .site-nav__item:nth-child(2) .site-nav__link { transition-delay: 0.18s; }
.menu-open .site-nav__item:nth-child(3) .site-nav__link { transition-delay: 0.24s; }
.menu-open .site-nav__item:nth-child(4) .site-nav__link { transition-delay: 0.3s; }
.menu-open .site-nav__item:nth-child(5) .site-nav__link { transition-delay: 0.36s; }
.lang-switch {
min-height: 2.75rem;
font-size: 0.85rem;
}
}
/* Without JS the menu button can't do anything, so show the links inline */
@media (max-width: 47.99em) and (scripting: none) {
.site-header {
position: absolute;
height: auto;
}
.site-header__inner {
flex-wrap: wrap;
padding-block: 0.75rem;
}
.menu-toggle {
display: none;
}
.site-nav {
position: static;
flex-direction: row;
flex-wrap: wrap;
gap: 0.5rem 1rem;
padding: 0;
background: none;
clip-path: none;
visibility: visible;
}
.site-nav__list {
flex-direction: row;
flex-wrap: wrap;
gap: 0 1rem;
}
.site-nav__link {
font-family: var(--font-body);
font-size: 0.95rem;
opacity: 1;
translate: none;
}
}
.menu-open,
.lightbox-open {
overflow: hidden;
}
/* Subpage heads */
.page-head {
position: relative;
isolation: isolate;
padding-block: calc(var(--header-h) + clamp(3rem, 9vw, 7.5rem)) clamp(2.5rem, 5vw, 4.5rem);
}
.page-head__glow {
position: absolute;
top: 0;
right: 0;
z-index: -1;
width: min(62rem, 100%);
height: min(36rem, 90%);
background:
radial-gradient(closest-side at 72% 32%, rgb(192 17 215 / 0.32), transparent),
radial-gradient(closest-side at 92% 12%, rgb(255 118 164 / 0.28), transparent),
radial-gradient(closest-side at 46% 4%, rgb(47 60 190 / 0.4), transparent);
filter: blur(28px);
pointer-events: none;
animation: drift 20s ease-in-out infinite alternate;
}
.page-head__kicker {
margin-bottom: 1rem;
font-family: var(--font-mono);
font-size: 0.8rem;
letter-spacing: 0.08em;
text-transform: uppercase;
color: var(--pink-text);
}
/* long German compounds don't fit on phones otherwise */
.page-head__title,
.project-head__title {
hyphens: auto;
}
.page-head__title {
max-width: 16ch;
font-size: var(--step-5);
letter-spacing: -0.045em;
line-height: 0.98;
}
.page-head__lead {
max-width: 56ch;
margin-top: 1.25rem;
font-size: var(--step-1);
color: var(--muted);
}
/* Footer */
.site-footer {
padding-block: clamp(3rem, 6vw, 5rem) calc(2rem + env(safe-area-inset-bottom));
border-top: 1px solid var(--line);
background: linear-gradient(180deg, transparent, rgb(47 60 190 / 0.07));
font-size: 0.95rem;
& ul {
display: grid;
gap: 0.35rem;
margin: 0;
padding: 0;
list-style: none;
}
& a {
display: inline-block;
padding-block: 0.2rem;
color: var(--muted);
text-decoration: none;
overflow-wrap: anywhere;
transition: color 0.2s;
&:hover {
color: var(--text);
}
}
}
.site-footer__grid {
display: grid;
gap: 2.25rem;
@media (min-width: 40em) {
grid-template-columns: repeat(2, minmax(0, 1fr));
}
@media (min-width: 60em) {
grid-template-columns: minmax(0, 1.6fr) minmax(0, 1fr) minmax(0, 1fr);
}
}
.site-footer__intro {
@media (min-width: 40em) and (max-width: 59.99em) {
grid-column: 1 / -1;
}
}
.site-footer .brand {
display: inline-flex;
padding: 0;
color: var(--text);
}
.site-footer__heading {
margin-bottom: 0.75rem;
font-family: var(--font-mono);
font-size: 0.75rem;
font-weight: 500;
letter-spacing: 0.1em;
text-transform: uppercase;
color: var(--faint);
}
.site-footer__bottom {
display: flex;
flex-wrap: wrap;
align-items: center;
justify-content: space-between;
gap: 0.75rem 1.5rem;
margin-top: clamp(2.5rem, 5vw, 4rem);
padding-top: 1.5rem;
border-top: 1px solid var(--line);
font-size: 0.875rem;
color: var(--faint);
}
}