@layer pages { /* Hero */ .hero { position: relative; isolation: isolate; display: grid; align-items: end; min-height: 100vh; min-height: 100svh; padding-block: calc(var(--header-h) + 3rem) clamp(2.5rem, 7vh, 5rem); overflow: hidden; } .hero__bg { position: absolute; inset: 0; z-index: -1; background: radial-gradient(60% 50% at 80% 18%, rgb(192 17 215 / 0.55), transparent 70%), radial-gradient(50% 45% at 25% 8%, rgb(255 118 164 / 0.45), transparent 70%), radial-gradient(70% 55% at 75% 75%, rgb(47 60 190 / 0.6), transparent 70%), var(--bg); /* readability: darken towards the text and fade into the page */ &::after { content: ""; position: absolute; inset: 0; z-index: 1; background: linear-gradient(180deg, rgb(12 10 18 / 0.25) 0%, rgb(12 10 18 / 0) 25%, rgb(12 10 18 / 0.45) 62%, var(--bg) 100%), linear-gradient(90deg, rgb(12 10 18 / 0.6) 0%, rgb(12 10 18 / 0.15) 60%, transparent 100%); } /* film grain */ &::before { content: ""; position: absolute; inset: 0; z-index: 2; background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='160' height='160'%3E%3Cfilter id='n'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='0.85' numOctaves='3' stitchTiles='stitch'/%3E%3C/filter%3E%3Crect width='100%25' height='100%25' filter='url(%23n)'/%3E%3C/svg%3E"); opacity: 0.12; mix-blend-mode: overlay; pointer-events: none; } } .hero__canvas { position: absolute; inset: 0; width: 100%; height: 100%; opacity: 0; transition: opacity 1.6s var(--ease-out); &.is-ready { opacity: 1; } } .hero__inner { display: grid; gap: clamp(1.25rem, 3vh, 2rem); } .hero__kicker { display: flex; align-items: center; gap: 0.75rem; font-family: var(--font-mono); font-size: clamp(0.72rem, 0.68rem + 0.2vw, 0.82rem); letter-spacing: 0.08em; text-transform: uppercase; color: rgb(243 238 248 / 0.8); &::before { content: ""; flex: none; width: 2rem; height: 1px; background: var(--fluid); } } .hero__title { display: flex; flex-wrap: wrap; align-items: flex-start; gap: 0.5rem 1.25rem; font-weight: 700; } .hero__name { display: block; margin-left: -0.05em; padding-bottom: 0.04em; font-size: clamp(6rem, 2rem + 24vw, 19rem); line-height: 0.8; letter-spacing: -0.045em; color: var(--text); text-shadow: 0 0 60px rgb(12 10 18 / 0.35); } .hero__pronouns { margin-top: clamp(0.25rem, 1.5vw, 1.5rem); padding: 0.4rem 0.85rem; border: 1px solid var(--line-strong); border-radius: 99px; background: rgb(12 10 18 / 0.45); -webkit-backdrop-filter: blur(10px); backdrop-filter: blur(10px); font-family: var(--font-mono); font-size: 0.8rem; font-weight: 400; letter-spacing: 0.02em; line-height: 1.4; } .hero__bottom { display: grid; gap: 2rem; @media (min-width: 60em) { grid-template-columns: minmax(0, 1fr) auto; align-items: end; } } .hero__lead { max-width: 40ch; font-size: var(--step-1); color: rgb(243 238 248 / 0.88); } .hero__actions { display: flex; flex-wrap: wrap; gap: 0.75rem; margin-top: 1.75rem; } .now { width: min(100%, 22rem); padding: 1.1rem 1.25rem 1.2rem; border: 1px solid var(--line); border-radius: var(--radius-l); background: rgb(12 10 18 / 0.55); -webkit-backdrop-filter: blur(16px); backdrop-filter: blur(16px); } .now__title { display: flex; align-items: center; gap: 0.6rem; margin-bottom: 0.6rem; font-family: var(--font-mono); font-size: 0.75rem; font-weight: 500; letter-spacing: 0.1em; text-transform: uppercase; color: var(--muted); } .now__pulse { position: relative; width: 0.5rem; height: 0.5rem; border-radius: 50%; background: var(--pink); &::after { content: ""; position: absolute; inset: 0; border-radius: 50%; background: var(--pink); animation: ping 2.2s var(--ease-out) infinite; } } .now__list { display: grid; gap: 0.35rem; margin: 0; padding: 0; list-style: none; font-size: 0.95rem; } /* Bento */ .bento { display: grid; gap: clamp(0.75rem, 1.5vw, 1.25rem); @media (min-width: 40em) { grid-template-columns: repeat(2, minmax(0, 1fr)); grid-template-areas: "server server" "homelab homelab" "scripts study" "video video"; } @media (min-width: 64em) { grid-template-columns: repeat(4, minmax(0, 1fr)); grid-template-areas: "server server homelab homelab" "server server scripts study" "video video video video"; } } .tile { display: flex; flex-direction: column; gap: 1.5rem; min-height: 16rem; padding: clamp(1.25rem, 2.5vw, 1.75rem); border: 1px solid var(--line); border-radius: var(--radius-l); background: linear-gradient(180deg, var(--surface), var(--bg-raised)); } /* only where the grid actually defines these areas, otherwise all tiles end up in one cell */ @media (min-width: 40em) { .tile--server { grid-area: server; } .tile--homelab { grid-area: homelab; } .tile--scripts { grid-area: scripts; } .tile--study { grid-area: study; } .tile--video { grid-area: video; } } .tile__visual { flex: 1; display: grid; place-items: center; min-height: 8rem; } .tile__body { display: grid; gap: 0.6rem; } .tile__title { font-size: var(--step-2); } .tile__text { max-width: 48ch; color: var(--muted); } .tile__link { display: inline-flex; align-items: center; gap: 0.4rem; width: fit-content; margin-top: 0.35rem; font-size: 0.92rem; font-weight: 500; color: var(--pink-text); text-decoration: none; /* the whole tile is clickable */ &::after { content: ""; position: absolute; inset: 0; z-index: 1; border-radius: inherit; } &:focus-visible { outline: none; &::after { outline: 2px solid var(--pink-text); outline-offset: 3px; } } & .icon { transition: translate 0.3s var(--ease-out); } } .tile:hover .tile__link .icon { translate: 3px 0; } @media (min-width: 64em) { .tile--server .tile__visual { min-height: 14rem; } .tile--video { flex-direction: row; align-items: center; min-height: 0; & .tile__visual { order: 2; flex: 1.4; } & .tile__body { flex: 1; } } } /* Featured projects: first card gets the full width */ .project-grid--featured > li:first-child { @media (min-width: 40em) { grid-column: 1 / -1; } @media (min-width: 64em) { & .card__link { flex-direction: row; } & .card__media { flex: 1.35; aspect-ratio: auto; min-height: 24rem; border-radius: calc(var(--radius-l) - 1px) 0 0 calc(var(--radius-l) - 1px); } & .card__body { flex: 1; align-content: center; padding: clamp(1.5rem, 3vw, 3rem); } & .card__title { font-size: var(--step-3); } } } /* Tools marquee */ .marquee { display: flex; overflow: hidden; -webkit-mask-image: linear-gradient(90deg, transparent, #000 8%, #000 92%, transparent); mask-image: linear-gradient(90deg, transparent, #000 8%, #000 92%, transparent); user-select: none; &:hover .marquee__track { animation-play-state: paused; } } .marquee__track { display: flex; flex: none; align-items: center; margin: 0; padding: 0; list-style: none; animation: marquee 45s linear infinite; } .marquee__item { display: flex; align-items: center; gap: clamp(1.25rem, 3vw, 2.5rem); padding-right: clamp(1.25rem, 3vw, 2.5rem); font-family: var(--font-display); font-size: var(--step-4); font-weight: 600; letter-spacing: -0.03em; white-space: nowrap; color: transparent; -webkit-text-stroke: 1px rgb(243 238 248 / 0.45); &:nth-child(3n + 1) { color: var(--text); -webkit-text-stroke: 0; } &::after { content: ""; width: 0.6rem; height: 0.6rem; border-radius: 50%; background: var(--pink); } &:nth-child(3n + 2)::after { background: var(--violet-text); } &:nth-child(3n)::after { background: var(--blue-text); } } @media (prefers-reduced-motion: reduce) { .marquee { -webkit-mask-image: none; mask-image: none; padding-inline: var(--gutter); } .marquee__track { flex-wrap: wrap; flex-shrink: 1; gap: 0.5rem 0; animation: none; &[aria-hidden] { display: none; } } .marquee__item { font-size: var(--step-2); } } /* Contact teaser */ .cta__inner { position: relative; overflow: hidden; padding: clamp(2.25rem, 6vw, 5rem) clamp(1.25rem, 6vw, 5rem); border: 1px solid var(--line); border-radius: clamp(1.25rem, 3vw, 2rem); background: radial-gradient(70% 90% at 100% 0%, rgb(192 17 215 / 0.32), transparent 60%), radial-gradient(60% 90% at 0% 100%, rgb(47 60 190 / 0.42), transparent 60%), radial-gradient(40% 60% at 60% 110%, rgb(255 118 164 / 0.25), transparent 70%), var(--surface); } .cta__title { max-width: 18ch; font-size: var(--step-4); } .cta__text { max-width: 52ch; margin-top: 1.1rem; font-size: var(--step-1); color: rgb(243 238 248 / 0.8); } .cta__actions { display: flex; flex-wrap: wrap; align-items: center; gap: 1rem 1.75rem; margin-top: 2rem; } .cta__mail { font-family: var(--font-mono); font-size: 0.95rem; overflow-wrap: anywhere; transition: color 0.2s; &:hover { color: var(--pink-text); } } }