506 lines
11 KiB
CSS
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);
|
|
}
|
|
}
|