@import url("https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700&family=JetBrains+Mono:wght@400;500;600&display=swap");:root{--canvas:oklch(0.16 0.008 265);--canvas-deep:oklch(0.08 0.008 265);--surface:oklch(0.20 0.008 265);--surface-elev:oklch(0.25 0.008 265);--hairline:oklch(0.24 0.008 265);--hairline-soft:oklch(0.21 0.008 265);--hairline-strong:oklch(0.32 0.008 265);--ink:oklch(0.98 0.003 265);--text:oklch(0.95 0.003 265);--body:oklch(0.72 0.008 265);--muted:oklch(0.55 0.010 265);--muted-soft:oklch(0.42 0.010 265);--accent:oklch(0.45 0.24 264);--accent-glow:oklch(0.50 0.26 264);--accent-dim:oklch(0.38 0.16 264);--bg:var(--canvas);--line:var(--hairline-soft);--line-strong:var(--hairline-strong);--font-sans:"Inter",ui-sans-serif,system-ui,sans-serif;--font-mono:"JetBrains Mono","Fira Code",monospace;--sans:var(--font-sans);--mono:var(--font-mono);--s-xxs:4px;--s-xs:8px;--s-sm:12px;--s-md:16px;--s-lg:20px;--s-xl:24px;--s-2xl:32px;--s-3xl:48px;--s-4xl:64px;--s-5xl:96px}*,:after,:before{box-sizing:border-box;border-radius:0!important;margin:0;padding:0}html{scroll-behavior:auto}body{background:var(--canvas);color:var(--text);font-family:var(--font-sans);font-feature-settings:"ss01","cv11","calt";line-height:1.5;-webkit-font-smoothing:antialiased;text-rendering:optimizeLegibility}img{max-width:100%;display:block}a{color:inherit;text-underline-offset:.2em}.skip-link{position:absolute;left:16px;top:-10rem;background:var(--canvas);color:var(--ink);border:1px solid var(--hairline-strong);padding:8px 14px;z-index:300;font-family:var(--font-mono);font-size:11px;font-weight:600;letter-spacing:.06em}.skip-link:focus-visible{top:16px;outline:2px solid var(--accent);outline-offset:2px}.js-reveal{opacity:0;transform:translateY(20px);transition:opacity .75s cubic-bezier(.16,1,.3,1),transform .75s cubic-bezier(.16,1,.3,1)}.js-reveal.is-visible{opacity:1;transform:none}.site-nav{position:fixed;top:0;left:0;right:0;z-index:200;border-bottom:1px solid var(--hairline-soft);background:color-mix(in oklch,var(--canvas) 92%,transparent);-webkit-backdrop-filter:blur(10px);backdrop-filter:blur(10px)}.nav-inner{max-width:1200px;margin:0 auto;padding:0 32px;height:64px;display:flex;align-items:center;justify-content:space-between}.nav-brand{font-family:var(--font-mono);font-size:13px;font-weight:600;letter-spacing:.1em;color:var(--ink);text-decoration:none;line-height:1}.nav-links{display:flex;gap:28px;list-style:none;align-items:center}.nav-links a{font-family:var(--font-sans);font-size:14px;font-weight:500;text-decoration:none;color:var(--body);transition:color .18s cubic-bezier(.16,1,.3,1)}.nav-links a:focus-visible,.nav-links a:hover{color:var(--ink);outline:none}.copy-notice{font-family:var(--font-mono);font-size:11px;font-weight:500;color:var(--accent)}.hero-stage{height:2100svh;background:var(--canvas);--hero-compass-opacity:0;--hero-ascii-opacity:1;--hero-copy-opacity:0;--hero-visual-basis:100%;--hero-copy-basis:0%;--hero-exit-progress:0;--hero-compass-art-scale:1;--hero-compass-caption-opacity:1}.hero-sticky{position:-webkit-sticky;position:sticky;top:0;height:100svh;overflow:hidden;transform:translateY(calc(var(--hero-exit-progress, 0) * -8vh));opacity:calc(1 - var(--hero-exit-progress, 0) * .1);will-change:transform,opacity;background:radial-gradient(ellipse 55% 45% at 50% 55%,oklch(.5 .24 264/.13),transparent 68%)}.hero-sticky:after{content:"";position:absolute;inset:0;pointer-events:none;z-index:10;background:repeating-linear-gradient(0deg,transparent,transparent 3px,rgba(0,0,0,.025) 0,rgba(0,0,0,.025) 4px)}.hero-content{position:relative;height:100%;max-width:none;margin:0 auto;padding:0 48px}.beat{position:absolute;left:max(32px,calc((100vw - 1200px) / 2 + 32px));right:max(32px,calc((100vw - 1200px) / 2 + 32px))}.beat-1{top:50%;transform:translateY(-50%);transition:top .85s cubic-bezier(.16,1,.3,1),transform .85s cubic-bezier(.16,1,.3,1)}.beat-1.pushed{top:11%;transform:translateY(0)}.beat-2{top:22%;opacity:0;pointer-events:none;display:grid;grid-template-rows:auto auto auto;grid-row-gap:clamp(24px,4vh,56px);row-gap:clamp(24px,4vh,56px);transition:opacity .5s cubic-bezier(.16,1,.3,1)}.beat-2.active{opacity:1;pointer-events:auto}.b2-post,.b2-pre{transition:opacity .4s cubic-bezier(.16,1,.3,1)}.beat-3{bottom:9%;opacity:0;pointer-events:none;transition:opacity .5s cubic-bezier(.16,1,.3,1)}.beat-3.active{opacity:1;pointer-events:auto}.hero-stage.handoff-ready .b2-post,.hero-stage.handoff-ready .b2-pre,.hero-stage.handoff-ready .beat-1,.hero-stage.handoff-ready .beat-3{opacity:calc(1 - var(--hero-handoff-progress, 0))!important;transform:none!important;transition:none!important}.hero-stage.handoff-ready .beat-1{top:11%}.hero-stage.handoff-ready .beat-3{pointer-events:none}.b1-line,.b3-line{font-family:var(--font-mono);font-size:clamp(.95rem,1.25vw,1.05rem);font-weight:500;letter-spacing:.06em;color:var(--body)}.b1-line{min-height:1.5em}.b2-post,.b2-pre{font-family:var(--font-sans);font-size:clamp(2rem,5.2vw,3.5rem);font-weight:500;letter-spacing:-.03em;line-height:1.05;color:var(--ink);display:block;block-size:1.05em;margin:0;overflow:visible;white-space:nowrap}.b3-line{line-height:1.65;max-width:62ch;min-height:1.65em}.ascii-stage{--ascii-aspect:760/120;position:relative;width:100%;margin:0;aspect-ratio:var(--ascii-aspect);opacity:0;transition:opacity .5s cubic-bezier(.16,1,.3,1)}.ascii-stage.visible{opacity:1}.ascii-stage #asciiCanvas{display:block;position:absolute;inset:0;width:100%;height:100%}.ascii-stage.transitioning{position:relative;width:100%;margin:0;aspect-ratio:var(--ascii-aspect);opacity:var(--hero-ascii-opacity);pointer-events:none}.ascii-stage.transitioning #asciiCanvas{position:fixed;inset:0;z-index:35;width:100vw;height:100svh}.particles-bg{position:fixed!important;inset:0!important;z-index:19;pointer-events:none;opacity:var(--particles-opacity,0);transition:opacity .6s ease}.hero-stage.handoff-ready .particles-bg{transition:none;transform:scale(var(--particles-scale,1))}.particles-bg canvas{display:block;position:absolute!important;inset:0!important;width:100%!important;height:100%!important}.hero-compass-overlay{position:fixed;inset:0;z-index:20;display:flex;align-items:stretch;justify-content:stretch;opacity:var(--hero-compass-opacity);pointer-events:none}.hero-capability-visual{flex:0 0 var(--hero-visual-basis);justify-content:center;padding:clamp(32px,5vw,96px);position:relative}.hero-capability-copy,.hero-capability-visual{min-width:0;height:100%;display:flex;align-items:center;overflow:hidden}.hero-capability-copy{flex:0 0 var(--hero-copy-basis);padding:96px 80px 96px 64px;opacity:var(--hero-copy-opacity)}.hero-capability-beats{position:relative;width:100%;max-width:520px}.hero-capability-beat{position:absolute;top:50%;transform:translateY(-50%);width:100%;opacity:0;transition:opacity .45s cubic-bezier(.16,1,.3,1)}.hero-capability-beat.active{opacity:1}.hero-capability-beat:first-child{position:relative;top:auto;transform:none}.hero-compass-overlay .anamorphic-root{width:100%;height:100%}.hero-compass-3d{position:absolute;inset:0;display:flex;align-items:center;justify-content:center;transform:scale(var(--hero-compass-art-scale));transform-origin:center center;will-change:transform,opacity}.hero-stage.handoff-ready .compass-caption{opacity:var(--hero-compass-caption-opacity)!important;transition:none!important}.hero-svg-overlay{position:absolute;inset:0;display:flex;align-items:center;justify-content:center;opacity:0;pointer-events:none}.hero-svg-frame{position:relative;width:min(76%,calc(100% - 96px));max-width:680px;aspect-ratio:1/1;transform:scale(var(--hero-compass-art-scale));transform-origin:center center;will-change:transform,opacity}.hero-svg-layer{position:absolute;inset:0;transform:translate(-1px,2px)}.hero-stage.handoff-complete .ascii-stage.transitioning{opacity:0}.hero-project-parallax{--project-entry-progress:0;position:relative;z-index:30;margin-top:-72vh;padding-top:24vh;background:linear-gradient(to bottom,transparent 0,color-mix(in oklch,var(--canvas) 35%,transparent) 36vh,var(--canvas) calc(24vh + 96px),var(--canvas) 100%);transform:translateY(calc((1 - var(--project-entry-progress, 0)) * 42vh));transition:opacity .35s cubic-bezier(.16,1,.3,1);will-change:transform}.hero-stage:not(.handoff-svg-rendered)+.hero-project-parallax{opacity:0;visibility:hidden;pointer-events:none}.cursor{display:inline-block;width:.4em;height:1em;background:var(--ink);vertical-align:text-bottom;margin-left:3px;animation:blink 1s steps(1) infinite}.beat-3 .cursor{background:var(--accent)}@keyframes blink{0%,55%{opacity:1}55.01%,to{opacity:0}}body.hero-locked,html.hero-locked{overscroll-behavior:none}.hero-capability-label{font-family:var(--font-mono);font-size:11px;font-weight:600;letter-spacing:.088em;text-transform:uppercase;color:var(--accent-glow);margin-bottom:24px;display:flex;align-items:center;gap:12px}.hero-capability-label:before{content:"";display:inline-block;width:24px;height:1px;background:var(--accent-glow)}.hero-capability-headline{font-family:var(--font-sans);font-size:clamp(1.75rem,3.2vw,2.25rem);font-weight:500;letter-spacing:-.025em;line-height:1.15;color:var(--ink);margin-bottom:24px}.hero-capability-body{font-family:var(--font-sans);font-size:16px;font-weight:400;line-height:1.6;letter-spacing:-.003em;color:var(--body);max-width:50ch}.projects{position:relative;max-width:none;margin:0 auto;padding:clamp(88px,10vw,132px) clamp(20px,4vw,56px) clamp(96px,12vw,152px);overflow:hidden}.section-label{font-family:var(--font-mono);font-size:11px;font-weight:600;letter-spacing:.088em;text-transform:uppercase;color:var(--muted);width:min(100%,1120px);margin:0 auto clamp(28px,4vw,48px)}.project-feed{display:flex;flex-direction:column;align-items:center;gap:clamp(20px,3vw,36px)}.project-item{display:grid;grid-template-columns:minmax(280px,.92fr) minmax(0,1.08fr);align-items:stretch;grid-column-gap:clamp(24px,4vw,56px);column-gap:clamp(24px,4vw,56px);width:min(100%,1120px);min-height:clamp(340px,34vw,430px);padding:clamp(16px,2vw,24px);border:1px solid var(--hairline);background:linear-gradient(135deg,color-mix(in oklch,var(--surface) 86%,var(--accent) 5%),var(--surface) 54%),var(--surface);color:var(--text);text-decoration:none;opacity:0;transform:translateY(12px);transition:opacity .65s cubic-bezier(.16,1,.3,1),transform .65s cubic-bezier(.16,1,.3,1),border-color .22s cubic-bezier(.16,1,.3,1),background .22s cubic-bezier(.16,1,.3,1)}.project-item.is-visible{opacity:1;transform:none}.project-item:focus-visible,.project-item:hover{border-color:color-mix(in oklch,var(--accent) 54%,var(--hairline-strong));background:linear-gradient(135deg,color-mix(in oklch,var(--surface-elev) 82%,var(--accent) 8%),var(--surface) 58%),var(--surface)}.project-item:focus-visible{outline:2px solid var(--accent);outline-offset:6px}.project-cover-wrap{position:relative;grid-column:1;align-self:stretch;width:100%;height:100%;min-width:0;overflow:hidden;background:var(--canvas-deep);border-radius:0!important}.project-cover{width:100%;height:100%;object-fit:cover;filter:grayscale(100%) contrast(1.04);transform:scale(1);transition:transform .7s cubic-bezier(.16,1,.3,1),filter .7s cubic-bezier(.16,1,.3,1)}.project-item:focus-visible .project-cover,.project-item:hover .project-cover{filter:grayscale(20%) contrast(1.08);transform:scale(1.035)}.project-info{grid-column:2;display:grid;grid-template-rows:auto auto 1fr auto auto;align-content:stretch;min-width:0;padding:clamp(4px,1vw,10px) 0}.project-meta{display:flex;align-items:center;flex-wrap:wrap;gap:8px;margin-bottom:clamp(22px,3vw,36px)}.project-index{display:inline-flex;align-items:center;justify-content:center;min-width:34px;height:24px;padding:0 8px;border:1px solid var(--hairline-strong);line-height:1;letter-spacing:.02em;color:var(--ink);-webkit-user-select:none;-moz-user-select:none;user-select:none}.project-index,.project-year-tag{font-family:var(--font-mono);font-size:11px;font-weight:600}.project-year-tag{letter-spacing:.06em;color:var(--muted)}.project-cat{font-family:var(--font-mono);font-size:10px;font-weight:600;letter-spacing:.08em;text-transform:uppercase;padding:4px 8px;border:1px solid;line-height:1}.project-cat.ml{color:oklch(.78 .13 180)}.project-cat.res{color:oklch(.72 .1 250)}.project-cat.des{color:oklch(.74 .14 20)}.project-name{max-width:680px;font-family:var(--font-sans);font-size:clamp(30px,3.6vw,48px);font-weight:600;line-height:.98;letter-spacing:-.035em;color:var(--ink)}.project-desc{max-width:62ch;margin-top:clamp(18px,2.4vw,28px);font-size:clamp(14px,1.25vw,16px);font-weight:500;line-height:1.62;color:var(--body)}.project-tags{display:flex;flex-wrap:wrap;gap:8px;align-self:end;margin-top:clamp(24px,3vw,40px);padding-top:clamp(16px,2vw,24px);border-top:1px solid var(--hairline-soft);list-style:none}.project-tag{font-size:10px;color:color-mix(in oklch,var(--body) 86%,var(--ink));letter-spacing:.04em;background:color-mix(in oklch,var(--surface-elev) 74%,var(--canvas));border:1px solid var(--hairline-strong);padding:6px 9px;line-height:1}.project-link,.project-tag{font-family:var(--font-mono);font-weight:600}.project-link{justify-self:start;align-self:end;display:inline-flex;align-items:center;gap:8px;margin-top:clamp(18px,2vw,28px);font-size:11px;letter-spacing:.06em;color:var(--ink);border-bottom:1px solid;padding-bottom:4px;transition:color .18s cubic-bezier(.16,1,.3,1),border-color .18s cubic-bezier(.16,1,.3,1)}.project-item:focus-visible .project-link,.project-item:hover .project-link{color:var(--accent);border-color:var(--accent)}.site-footer{border-top:1px solid var(--hairline-soft);padding:48px 32px;max-width:1200px;margin:0 auto;display:flex;justify-content:space-between;align-items:center;flex-wrap:wrap;gap:16px}.footer-copy{font-family:var(--font-mono);font-size:11px;font-weight:500;color:var(--muted);letter-spacing:.04em}.footer-links{display:flex;gap:24px;list-style:none}.footer-links a{font-family:var(--font-sans);font-size:14px;font-weight:500;text-decoration:none;color:var(--body);transition:color .18s cubic-bezier(.16,1,.3,1)}.footer-links a:hover{color:var(--ink)}@media (max-width:1100px){.hero-content{padding:0 40px}.beat{left:32px;right:32px}}@media (max-width:900px){.hero-compass-overlay{flex-direction:column}.hero-capability-visual{flex-basis:62%}.hero-capability-copy{flex-basis:38%;padding:24px 40px 24px 20px;align-items:center}.hero-capability-beats{max-width:none}.hero-capability-headline{font-size:clamp(1.5rem,4.5vw,1.875rem);margin-bottom:16px}.hero-capability-body{font-size:15px;line-height:1.55}.hero-capability-label{margin-bottom:16px}.project-item{grid-template-columns:minmax(0,1fr);min-height:0;padding:clamp(14px,3vw,20px);row-gap:22px}.project-cover-wrap{grid-column:1;height:auto;aspect-ratio:16/10}.project-info{grid-column:1;padding:0}.project-meta{margin-bottom:20px}.project-name{font-size:clamp(28px,6vw,42px);line-height:1}.nav-inner{padding:0 24px}.beat{left:24px;right:24px}}@media (max-width:680px){.nav-inner{padding:0 20px}.nav-links{gap:18px}.nav-links a{font-size:13px}.hero-content{padding:0 24px}.beat{left:20px;right:20px}.beat-1.pushed{top:12%}.beat-2{top:22%;row-gap:clamp(18px,3vh,32px)}.beat-3{bottom:12%}.b1-line{font-size:12px}.b2-post,.b2-pre{font-size:clamp(1.625rem,7vw,2.25rem);letter-spacing:-.025em}.b3-line{font-size:15px;line-height:1.6}.projects{padding:64px 18px 84px}.section-label{margin-bottom:28px}.project-feed{gap:18px}.project-item{padding:12px;row-gap:18px}.project-cover-wrap{aspect-ratio:1/.76}.project-meta{gap:6px;margin-bottom:16px}.project-index{height:22px;min-width:30px;padding:0 7px;font-size:10px}.project-year-tag{font-size:10px}.project-cat{font-size:9px;padding:4px 7px}.project-name{font-size:clamp(24px,7.2vw,33px);letter-spacing:-.03em}.project-desc{margin-top:14px;font-size:14px;line-height:1.58}.project-tags{gap:6px;margin-top:20px;padding-top:14px}.project-tag{font-size:9px;padding:6px 8px}.project-link{margin-top:18px;font-size:10px}.site-footer{padding:32px 20px}.hero-capability-body{max-width:42ch}}@media (max-width:480px){.b1-line{font-size:11px;letter-spacing:.08em}.b2-post,.b2-pre{font-size:clamp(1.375rem,8vw,1.875rem)}.hero-capability-label:before{width:16px}}@media (prefers-reduced-motion:reduce){*,:after,:before{transition:none!important;animation:none!important}.beat-2,.beat-3,.js-reveal,.project-item{opacity:1!important;transform:none!important}.ascii-stage{opacity:1!important}.cursor{animation:none!important}}