:root{--ink: #0c0e0d;--surface: #121614;--raise: #181d1a;--line: #262e29;--line-strong: #34403a;--text: #eef0ea;--muted: #a1a9a2;--dim: #838c85;--accent: #8cc8ff;--warn: #f4b860;--on-accent: #0c0e0d;--ease-out: cubic-bezier(.16, 1, .3, 1);--ease-in-out: cubic-bezier(.65, 0, .35, 1);--font-sans: "Schibsted Grotesk", ui-sans-serif, system-ui, -apple-system, "Segoe UI", sans-serif;--font-mono: "JetBrains Mono", ui-monospace, SFMono-Regular, Menlo, monospace;color-scheme:dark}*{box-sizing:border-box}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border:0}html{scroll-behavior:smooth}body{margin:0;color:var(--text);background:var(--ink);font-family:var(--font-sans);line-height:1.6;-webkit-font-smoothing:antialiased}::selection{color:var(--on-accent);background:var(--accent)}a,button{color:inherit;font:inherit}a{text-decoration:none}a:hover{color:var(--accent)}button{cursor:pointer}a:focus-visible,button:focus-visible{outline:2px solid var(--accent);outline-offset:4px;border-radius:6px}h1,h2,h3,p{margin-top:0}.mono{font-family:var(--font-mono)}.section-shell,.nav-container{width:min(100% - 32px,1200px);margin:0 auto}.site-header{position:sticky;top:0;z-index:20;background:color-mix(in oklab,var(--ink) 82%,transparent);border-bottom:1px solid var(--line);backdrop-filter:blur(12px);-webkit-backdrop-filter:blur(12px)}.nav-container{display:flex;align-items:center;justify-content:space-between;gap:16px;min-height:72px}.brand{display:flex;align-items:center;gap:10px;color:var(--text);font-family:var(--font-mono);font-size:.94rem;font-weight:700;letter-spacing:.06em}.brand-mark{display:inline-grid;width:30px;height:30px;place-items:center;color:var(--on-accent);background:var(--accent);border-radius:8px;font-size:.75rem}.brand:hover{color:var(--text)}.site-nav{display:flex;align-items:center;gap:28px;font-size:.94rem;font-weight:500}.nav-links{display:flex;gap:28px;color:var(--muted)}.underline-link{background:linear-gradient(currentColor,currentColor) 0 100% / 0 1px no-repeat;transition:background-size .45s var(--ease-out),color .2s}.underline-link:hover{background-size:100% 1px}.scroll-progress{position:absolute;right:0;bottom:-1px;left:0;height:2px;background:var(--accent);transform:scaleX(0);transform-origin:0 50%}.button{display:inline-flex;align-items:center;justify-content:center;gap:10px;min-height:44px;padding:0 18px;color:var(--text);background:transparent;border:1px solid var(--line-strong);border-radius:999px;font-size:.94rem;font-weight:600;transition:transform .35s var(--ease-out),background-color .2s,border-color .2s,color .2s}.button:hover{color:var(--text);border-color:var(--text);transform:translateY(-2px)}.button svg{flex:0 0 auto;transition:transform .35s var(--ease-out)}.button:hover .nudge{transform:translate(2px,-2px)}.button:hover .drop{transform:translateY(3px)}.button.primary{color:var(--on-accent);background:var(--accent);border-color:var(--accent)}.button.primary:hover{color:var(--on-accent);background:var(--text);border-color:var(--text)}.button.compact{min-height:40px;font-size:.875rem}.hero{position:relative;display:grid;gap:56px;align-items:end;padding:96px 0 112px}.moon{position:absolute;top:22px;right:4px;z-index:-1;width:52px;aspect-ratio:1;border-radius:50%;background:radial-gradient(circle at 34% 38%,rgb(160 174 186 / .55) 0 9%,transparent 10%),radial-gradient(circle at 62% 64%,rgb(160 174 186 / .45) 0 7%,transparent 8%),radial-gradient(circle at 66% 30%,rgb(160 174 186 / .35) 0 5%,transparent 6%),radial-gradient(circle at 35% 30%,#f6f8f4,#d7e0e6 62%,#b9c6d0);box-shadow:inset -6px -4px 12px #0c0e0d59,0 0 28px 4px #8cc8ff38,0 0 90px 24px #8cc8ff14;animation:moon-glow 6s var(--ease-in-out) infinite alternate}.rain{position:fixed;inset:0;z-index:-1;overflow:hidden;pointer-events:none}.rain i{position:absolute;top:0;left:var(--x);width:1px;height:var(--len);background:linear-gradient(transparent,#c4e2ffe6);opacity:var(--o);translate:0 -40px;rotate:12deg;animation:fall var(--speed) linear var(--delay) infinite;will-change:translate}.hero-eyebrow{display:flex;align-items:center;gap:10px;margin:0 0 28px;color:var(--dim);font-family:var(--font-mono);font-size:.81rem;letter-spacing:.04em;text-transform:uppercase}.pulse{width:8px;height:8px;background:var(--accent);border-radius:50%;animation:pulse 1.4s var(--ease-in-out) infinite}.hero h1{margin:0;font-size:clamp(3.75rem,9vw,8.5rem);font-weight:900;line-height:.9;letter-spacing:-.045em}.hero h1 .accent-line{color:var(--accent)}.mask{display:block;padding-bottom:.04em;clip-path:inset(-.5em -100vw 0 -.5em)}.mask>span{display:block;animation:rise 1s var(--ease-out) both}.fade{animation:fade-up .8s var(--ease-out) both}.delay-1{animation-delay:.05s}.delay-2{animation-delay:.16s}.delay-3{animation-delay:.38s}.delay-4{animation-delay:.5s}.delay-5{animation-delay:.62s}.hero-role{max-width:34ch;margin:36px 0 0;font-size:1.25rem;font-weight:600;line-height:1.4}.hero-summary{max-width:52ch;margin:14px 0 0;color:var(--muted);font-size:1.06rem}.hero-actions{display:flex;flex-wrap:wrap;gap:12px;margin-top:36px}.bug-hunt{--progress: 0;overflow:hidden;background:var(--surface);border:1px solid var(--line);border-radius:18px;animation:fade-up .9s var(--ease-out) .45s both}.hunt-header{display:flex;align-items:center;justify-content:space-between;gap:12px;padding:12px 14px 12px 18px;background:var(--raise);border-bottom:1px solid var(--line);font-family:var(--font-mono);font-size:.81rem}.hunt-title{color:var(--muted)}.hunt-status{padding:4px 10px;color:var(--warn);background:color-mix(in oklab,var(--warn) 12%,transparent);border-radius:999px;font-size:.75rem;transition:color .3s,background-color .3s}.done .hunt-status{color:var(--accent);background:color-mix(in oklab,var(--accent) 14%,transparent)}.arena{position:relative;height:280px;overflow:hidden;cursor:crosshair;background-image:radial-gradient(var(--line) 1px,transparent 1px);background-size:18px 18px}.arena-hint{position:absolute;top:16px;left:18px;margin:0;color:var(--dim);font-family:var(--font-mono);font-size:.75rem;line-height:1.6;pointer-events:none;transition:opacity .4s}.touched .arena-hint{opacity:0}.bug{position:absolute;top:var(--y);left:var(--x);display:grid;width:44px;height:44px;margin:-22px 0 0 -22px;padding:0;place-items:center;color:var(--warn);background:transparent;border:0;border-radius:50%;cursor:crosshair;animation:var(--wander) var(--speed) linear var(--delay) infinite}.bug>span{grid-area:1 / 1;display:grid;place-items:center}.bug-body{animation:var(--turn) var(--speed) linear var(--delay) infinite;transition:scale .25s var(--ease-out)}.bug-body svg{animation:skitter .16s steps(2) infinite alternate}.bug:hover .bug-body{scale:1.2}.bug-check{width:32px;height:32px;color:var(--on-accent);background:var(--accent);border-radius:50%;transform:scale(0)}.bug:after{content:"";position:absolute;inset:0;border:2px solid var(--accent);border-radius:50%;opacity:0;pointer-events:none}.bug.squashed{cursor:default;animation-play-state:paused}.bug.squashed .bug-body{scale:0;animation-play-state:paused}.bug.squashed .bug-body svg{animation:none}.bug.squashed .bug-check{transform:scale(1);transition:transform .45s cubic-bezier(.34,1.56,.64,1) .08s}.bug.squashed:after{animation:ring .6s var(--ease-out) both}.ship-it{position:absolute;inset:0;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:6px;color:var(--muted);background:color-mix(in oklab,var(--surface) 78%,transparent);font-family:var(--font-mono);font-size:.81rem;opacity:0;pointer-events:none;transition:opacity .5s var(--ease-out) .35s}.ship-it strong{color:var(--text);font-family:var(--font-sans);font-size:2.25rem;font-weight:900;line-height:1.1;letter-spacing:-.03em}.ship-it .icon-tile{margin-bottom:6px}.done .ship-it{opacity:1}.done .ship-it .icon-tile{animation:launch 1.6s var(--ease-in-out) .5s infinite}.confetti{position:absolute;top:50%;left:50%;pointer-events:none}.confetti i{position:absolute;width:8px;height:8px;margin:-4px;background:var(--c);border-radius:2px;opacity:0}.confetti i:nth-child(3n){border-radius:50%}.done .confetti i{animation:burst 1.1s var(--ease-out) .3s both}.hunt-footer{padding:16px 18px 18px;border-top:1px solid var(--line)}.hunt-bar{height:4px;overflow:hidden;background:var(--line);border-radius:4px}.hunt-bar span{display:block;height:100%;background:var(--accent);transform:scaleX(var(--progress));transform-origin:0 50%;transition:transform .6s var(--ease-out)}.hunt-stats{display:flex;flex-wrap:wrap;align-items:center;gap:8px 24px;margin-top:14px;font-family:var(--font-mono)}.hunt-stats div{display:flex;align-items:baseline;gap:6px}.hunt-stats strong{font-size:1.25rem}.hunt-stats span{color:var(--dim);font-size:.75rem}.hunt-stats .failed strong{color:var(--warn);transition:color .3s}.done .hunt-stats .failed strong{color:var(--accent)}.respawn{display:inline-flex;align-items:center;gap:8px;min-height:36px;margin-left:auto;padding:0 12px;color:var(--text);background:transparent;border:1px solid var(--line-strong);border-radius:8px;font-size:.78rem;transition:border-color .2s}.respawn:hover{border-color:var(--text)}@keyframes skitter{0%{transform:rotate(-7deg)}to{transform:rotate(7deg)}}@keyframes wander-a{0%,to{translate:0 0}25%{translate:46px -18px}50%{translate:28px 30px}75%{translate:-22px 14px}}@keyframes turn-a{0%{rotate:70deg}25%{rotate:150deg}50%{rotate:255deg}75%{rotate:345deg}to{rotate:430deg}}@keyframes wander-b{0%,to{translate:0 0}30%{translate:-40px 10px}55%{translate:-12px 36px}80%{translate:26px 8px}}@keyframes turn-b{0%{rotate:-80deg}30%{rotate:-160deg}55%{rotate:-255deg}80%{rotate:-345deg}to{rotate:-440deg}}@keyframes wander-c{0%,to{translate:0 0}20%{translate:36px 20px}45%{translate:-6px 40px}70%{translate:-40px 4px}}@keyframes turn-c{0%{rotate:20deg}20%{rotate:120deg}45%{rotate:205deg}70%{rotate:295deg}to{rotate:380deg}}@keyframes ring{0%{opacity:.9;transform:scale(.6)}to{opacity:0;transform:scale(2)}}@keyframes burst{0%{opacity:1;transform:rotate(var(--a)) translateY(0) scale(.4)}70%{opacity:1}to{opacity:0;transform:rotate(var(--a)) translateY(calc(var(--d) * -1)) rotate(180deg) scale(1)}}@keyframes launch{0%,to{transform:translateY(0)}50%{transform:translateY(-6px)}}.section-block{padding-bottom:128px}.section-label{display:flex;align-items:center;gap:14px;margin:0;color:var(--dim);font-family:var(--font-mono);font-size:.81rem;letter-spacing:.04em;text-transform:uppercase}.section-label:after{content:"";flex:1;height:1px;background:var(--line)}.section-label b{color:var(--accent);font-weight:500}.section-title{max-width:16ch;margin:28px 0 48px;font-size:clamp(2.125rem,4.6vw,3.75rem);font-weight:800;line-height:1.04;letter-spacing:-.025em}.section-intro{display:flex;flex-wrap:wrap;align-items:end;justify-content:space-between;gap:24px;margin:28px 0 48px}.section-intro .section-title{max-width:14ch;margin:0}.section-intro p{max-width:40ch;margin:0;color:var(--muted)}.kicker{margin:0 0 14px;color:var(--accent);font-family:var(--font-mono);font-size:.81rem}.icon-tile{display:inline-grid;flex:0 0 auto;width:44px;height:44px;place-items:center;color:var(--accent);background:color-mix(in oklab,var(--accent) 10%,transparent);border:1px solid color-mix(in oklab,var(--accent) 24%,transparent);border-radius:12px;transition:color .3s,background-color .3s,border-color .3s,transform .45s var(--ease-out)}.lane:hover .icon-tile,.drive-list li:hover .icon-tile,.contact-list a:hover .icon-tile{color:var(--on-accent);background:var(--accent);border-color:var(--accent);transform:translateY(-2px)}.focus-grid{display:grid;gap:32px}.lane{position:relative;padding-top:28px;border-top:1px solid var(--line-strong)}.lane:before{content:"";position:absolute;top:-1px;right:0;left:0;height:1px;background:var(--accent);transform:scaleX(0);transform-origin:0 50%;transition:transform .7s var(--ease-out)}.lane:hover:before{transform:scaleX(1)}.lane-head{display:flex;align-items:center;gap:14px;margin-bottom:20px}.lane-head .kicker{margin:0}.lane h3{margin-bottom:10px;font-size:1.5rem;font-weight:700;letter-spacing:-.01em}.lane p:last-child{margin:0;color:var(--muted)}.work-list{border-bottom:1px solid var(--line)}.work-row{display:grid;gap:8px;align-items:baseline;margin:0 -12px;padding:30px 12px;border-top:1px solid var(--line);border-radius:12px;transition:background-color .3s}.work-row:hover{background:var(--raise)}.work-row .period{margin:0;color:var(--dim);font-family:var(--font-mono);font-size:.81rem;transition:color .3s}.work-row:hover .period{color:var(--accent)}.work-row h3{margin:0;font-size:1.31rem;font-weight:700;line-height:1.3}.work-row .role-line{margin:4px 0 0;color:var(--muted);font-size:.94rem}.work-row>p:last-of-type{margin:0;color:var(--muted)}.work-row .row-arrow{display:none;color:var(--accent);opacity:0;transform:translate(-8px);transition:opacity .3s,transform .45s var(--ease-out)}.work-row:hover .row-arrow{opacity:1;transform:none}.project-grid{display:grid;gap:24px}.project-card{display:flex;flex-direction:column;gap:18px;padding:14px 14px 22px;background:var(--surface);border:1px solid var(--line);border-radius:18px;transition:transform .5s var(--ease-out),border-color .3s}.project-card:hover{border-color:var(--line-strong);transform:translateY(-4px)}.project-cover{aspect-ratio:16 / 10;overflow:hidden;background:var(--raise);border:1px solid var(--line);border-radius:10px}.project-cover img{display:block;width:100%;height:100%;object-fit:cover;object-position:top left;transition:transform .9s var(--ease-out)}.project-card:hover .project-cover img{transform:scale(1.04)}.project-content{padding:0 8px}.project-title{display:flex;flex-wrap:wrap;align-items:baseline;justify-content:space-between;column-gap:12px}.project-title h3{margin:0 0 8px;font-size:1.31rem;font-weight:700}.project-link{display:inline-flex;align-items:center;gap:4px;min-height:44px;color:var(--accent);font-family:var(--font-mono);font-size:.81rem}.project-link:hover{color:var(--text)}.project-content p{margin:0 0 16px;color:var(--muted);font-size:.94rem}.tag-row{display:flex;flex-wrap:wrap;gap:8px}.tag-row span{padding:5px 10px;color:var(--muted);border:1px solid var(--line);border-radius:6px;font-family:var(--font-mono);font-size:.75rem}.tool-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(80px,1fr));gap:8px;margin:0 0 48px;padding:0;list-style:none}.tool{display:flex;flex-direction:column;align-items:center;gap:10px;padding:18px 6px 14px;color:var(--muted);background:var(--surface);border:1px solid var(--line);border-radius:12px;font-family:var(--font-mono);font-size:.72rem;text-align:center;transition:transform .45s var(--ease-out),border-color .3s,color .2s}.tool:hover{color:var(--text);border-color:var(--line-strong);transform:translateY(-4px)}.tool-logo svg{display:block;width:36px;height:36px;opacity:.85;filter:grayscale(1);transition:filter .4s,opacity .4s,transform .45s var(--ease-out)}.tool:hover .tool-logo svg{opacity:1;filter:none;transform:scale(1.08)}.tool-logo.invert svg,.tool:hover .tool-logo.invert svg{filter:grayscale(1) invert(1)}.group-title{display:flex;align-items:center;gap:8px}.skills-grid{display:grid;grid-template-columns:minmax(0,1fr);border-top:1px solid var(--line-strong)}.skill-col{padding:24px 0 28px}.skill-col ul{margin:0;padding:0;list-style:none;font-size:.94rem}.skill-col li{padding:7px 0;color:var(--muted);border-bottom:1px solid var(--line);transition:color .2s,padding-left .35s var(--ease-out)}.skill-col li:hover{padding-left:6px;color:var(--text)}.skills-panels{display:grid;gap:24px;margin-top:64px}.panel{padding:32px;background:var(--surface);border:1px solid var(--line);border-radius:18px}.panel h3{margin-bottom:6px;font-size:1.375rem;font-weight:700}.panel>p{margin-bottom:24px;color:var(--muted)}.drive-list{margin:0;padding:0;list-style:none}.drive-list li{display:grid;grid-template-columns:44px minmax(0,1fr);gap:12px;padding:16px 0;border-top:1px solid var(--line)}.drive-list li:last-child{padding-bottom:0}.drive-list strong{font-weight:700}.drive-list p{margin:2px 0 0;color:var(--muted)}.numbers-panel{display:flex;flex-direction:column}.number-grid{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:10px}.number-grid div{display:flex;flex-direction:column;gap:6px;padding:22px;background:var(--raise);border-radius:12px;transition:background-color .3s}.number-grid div:hover{background:var(--line)}.number-grid strong{font-size:2.75rem;font-weight:800;line-height:1;letter-spacing:-.03em}.number-grid div:nth-child(2) strong{color:var(--accent)}.number-grid span{color:var(--muted);font-size:.875rem}.focus-note{margin:auto 0 0;padding-top:24px;color:var(--muted);font-size:.94rem}.numbers-panel .number-grid{margin-bottom:24px}.numbers-panel .focus-note{border-top:1px solid var(--line)}.contact-section{background:var(--surface);border-top:1px solid var(--line)}.contact-section .section-shell{padding:112px 0}.contact-grid{display:grid;gap:48px;align-items:end;margin-top:40px}.contact-title{margin:0;font-size:clamp(2.75rem,7vw,6.5rem);font-weight:900;line-height:.95;letter-spacing:-.04em}.contact-title span{color:var(--accent)}.contact-lede{max-width:40ch;margin:28px 0 0;color:var(--muted);font-size:1.125rem}.contact-mail{margin:36px 0 0}.contact-mail a{padding-bottom:6px;font-size:clamp(1.375rem,2.6vw,2.125rem);font-weight:700;letter-spacing:-.015em;overflow-wrap:anywhere;background:linear-gradient(var(--accent),var(--accent)) 0 100% / 0 3px no-repeat;transition:background-size .6s var(--ease-out),color .2s}.contact-mail a:hover{color:var(--text);background-size:100% 3px}.contact-list{border-bottom:1px solid var(--line)}.contact-list a{display:flex;align-items:center;gap:16px;min-height:76px;border-top:1px solid var(--line);transition:padding .4s var(--ease-out)}.contact-list a:hover{padding:0 8px}.contact-list small{display:block;color:var(--dim);font-family:var(--font-mono);font-size:.75rem;letter-spacing:.04em;text-transform:uppercase}.contact-list strong{font-weight:600}.contact-text{flex:1;min-width:0}.contact-arrow{flex:0 0 auto;transition:transform .4s var(--ease-out)}.contact-list a:hover .contact-arrow{transform:translate(3px,-3px)}.site-footer{background:var(--surface);border-top:1px solid var(--line)}.site-footer .section-shell{display:flex;flex-wrap:wrap;align-items:center;justify-content:space-between;gap:12px;padding:12px 0;color:var(--dim);font-family:var(--font-mono);font-size:.81rem}.site-footer p{margin:0}.site-footer a{display:inline-flex;align-items:center;gap:6px;min-height:44px}.resume-dialog{width:min(920px,calc(100% - 24px));height:min(760px,calc(100% - 24px));padding:0;color:var(--text);background:var(--surface);border:1px solid var(--line);border-radius:18px}.resume-dialog[open]{animation:dialog-in .45s var(--ease-out)}.resume-dialog::backdrop{background:#000000b8}.resume-dialog-bar{display:flex;flex-wrap:wrap;align-items:center;justify-content:space-between;gap:10px;padding:10px 10px 10px 18px;border-bottom:1px solid var(--line)}.resume-dialog-bar div{display:flex;align-items:center;gap:10px}.icon-button{display:grid;width:44px;height:44px;place-items:center;color:var(--text);background:transparent;border:1px solid var(--line-strong);border-radius:999px;transition:border-color .2s}.icon-button:hover{border-color:var(--text)}.resume-dialog iframe{width:100%;height:calc(100% - 65px);border:0}@keyframes fall{to{translate:-22vh 110vh}}@keyframes moon-glow{to{box-shadow:inset -6px -4px 12px #0c0e0d59,0 0 36px 8px #8cc8ff4d,0 0 120px 36px #8cc8ff1a}}@keyframes rise{0%{transform:translateY(108%)}to{transform:none}}@keyframes fade-up{0%{opacity:0;transform:translateY(16px)}to{opacity:1;transform:none}}@keyframes fill{0%{transform:scaleX(0)}to{transform:scaleX(1)}}@keyframes pulse{0%,to{opacity:1}50%{opacity:.35}}@keyframes dialog-in{0%{opacity:0;transform:translateY(12px) scale(.98)}to{opacity:1;transform:none}}@supports (animation-timeline: view()){@media(prefers-reduced-motion:no-preference){.reveal{animation:fade-up linear both;animation-timeline:view();animation-range:entry 0% entry 45%}.reveal-2{animation-range:entry 8% entry 55%}.reveal-3{animation-range:entry 16% entry 65%}.scroll-progress{animation:fill linear both;animation-timeline:scroll(root)}}}@media(max-width:559px){.brand-name{display:none}.site-nav,.nav-links{gap:16px}}@media(max-width:719px){.site-nav .button{display:none}}@media(min-width:560px){.skills-grid{grid-template-columns:repeat(2,minmax(0,1fr))}.skill-col:nth-child(2n){padding-left:24px;border-left:1px solid var(--line)}}@media(min-width:900px){.moon{top:36px;right:6%;width:84px}.hero{grid-template-columns:minmax(0,1.35fr) minmax(0,1fr);gap:64px}.focus-grid{grid-template-columns:repeat(3,minmax(0,1fr))}.work-row{grid-template-columns:220px minmax(0,1fr) minmax(0,1.15fr) 28px;gap:32px}.work-row .row-arrow{display:block}.project-grid{grid-template-columns:minmax(0,1.7fr) minmax(0,1fr)}.project-card.featured{grid-row:span 2}.project-card.featured .project-cover{flex:1;min-height:360px;aspect-ratio:auto}.project-card.featured h3{font-size:1.625rem;letter-spacing:-.015em}.skills-grid{grid-template-columns:repeat(4,minmax(0,1fr))}.skill-col{padding-right:24px}.skill-col+.skill-col{padding-left:24px;border-left:1px solid var(--line)}.skills-panels{grid-template-columns:minmax(0,1.2fr) minmax(0,1fr)}.contact-grid{grid-template-columns:minmax(0,1.3fr) minmax(0,1fr)}}@media(prefers-reduced-motion:reduce){html{scroll-behavior:auto}.rain{display:none}*,*:before,*:after{animation-duration:.01ms!important;animation-delay:0s!important;animation-iteration-count:1!important;transition-duration:.01ms!important}}
