@font-face{font-family:DM Sans Variable;font-style:normal;font-weight:100 1000;font-display:swap;src:url(/assets/dm-sans-latin-wght-normal-Xz1IZZA0.woff2) format("woff2-variations");unicode-range:U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+0304,U+0308,U+0329,U+2000-206F,U+2074,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}@font-face{font-family:IBM Plex Mono;font-style:normal;font-weight:400;font-display:swap;src:url(/assets/ibm-plex-mono-latin-400-normal-DMJ8VG8y.woff2) format("woff2");unicode-range:U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+0304,U+0308,U+0329,U+2000-206F,U+2074,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}@font-face{font-family:IBM Plex Mono;font-style:normal;font-weight:500;font-display:swap;src:url(/assets/ibm-plex-mono-latin-500-normal-DSY6xOcd.woff2) format("woff2");unicode-range:U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+0304,U+0308,U+0329,U+2000-206F,U+2074,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}:root{--bg: #0a0a0b;--bg-2: #0e0e10;--surface: #131316;--rule: #232327;--rule-soft: #1a1a1e;--ink: #f2f2f3;--ink-2: #b4b4bc;--ink-3: #8b8b94;--ink-4: #6e6e77;--st-live: #4ade80;--st-building: #818cf8;--st-paused: #fbbf24;--st-shelved: #a78bfa;--st-archived: #8a8a96;--link: #a5b4fc;--mono: "IBM Plex Mono", ui-monospace, SFMono-Regular, Menlo, monospace;--sans: "DM Sans Variable", "DM Sans", -apple-system, BlinkMacSystemFont, sans-serif;--t-xs: .72rem;--t-sm: .82rem;--t-base: clamp(.94rem, .9rem + .15vw, 1rem);--t-md: clamp(1.05rem, 1rem + .3vw, 1.2rem);--t-lg: clamp(1.5rem, 1.25rem + 1vw, 2.1rem);--t-xl: clamp(2rem, 1.5rem + 2.4vw, 3.4rem);--tracking: .16em;--page: 58rem;--gutter: clamp(1.15rem, 4vw, 2.5rem);--measure: 50ch;--radius: 3px;--s1: .25rem;--s2: .5rem;--s3: .75rem;--s4: 1rem;--s5: 1.5rem;--s6: 2rem;--s7: clamp(2.5rem, 6vh, 3.75rem);--s8: clamp(3.5rem, 9vh, 5.5rem);--ease: cubic-bezier(.22, 1, .36, 1);--dur: .16s}*,*:before,*:after{box-sizing:border-box;margin:0;padding:0}html{scroll-behavior:smooth;-webkit-text-size-adjust:100%}body{background:var(--bg);color:var(--ink);font-family:var(--sans);font-size:var(--t-base);line-height:1.65;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}h1,h2,h3{font-family:var(--sans);font-weight:600;line-height:1.2;text-wrap:balance}p{text-wrap:pretty}ul,ol,dl,dd{list-style:none}a{color:inherit}img{display:block;max-width:100%;height:auto}:focus-visible{outline:2px solid var(--link);outline-offset:3px;border-radius:2px}::selection{background:color-mix(in srgb,var(--link) 30%,transparent);color:var(--ink)}.vh{position:absolute;width:1px;height:1px;margin:-1px;overflow:hidden;clip-path:inset(50%);white-space:nowrap}.skip-link{position:absolute;top:0;left:50%;translate:-50% -150%;z-index:100;padding:.55rem 1rem;background:var(--surface);border:1px solid var(--rule);border-radius:0 0 var(--radius) var(--radius);font-family:var(--mono);font-size:var(--t-xs);text-decoration:none;transition:translate var(--dur) var(--ease)}.skip-link:focus-visible{translate:-50% 0}.page{width:min(100% - var(--gutter) * 2,var(--page));margin-inline:auto}main{display:block}.work>.group:first-of-type .group__head{padding-top:clamp(2.5rem,6vh,3.5rem)}.label{font-family:var(--mono);font-size:var(--t-xs);font-weight:500;letter-spacing:var(--tracking);text-transform:uppercase;color:var(--ink-2)}.label--status{display:inline-flex;align-items:center;gap:.55em;color:var(--status-color, var(--ink-2))}.dot{width:.5em;height:.5em;border-radius:50%;background:currentColor}.masthead{display:flex;flex-wrap:wrap;gap:1rem 2rem;align-items:baseline;justify-content:space-between;padding-block:var(--s8) var(--s5)}.masthead__name{font-size:var(--t-xl);font-weight:600;letter-spacing:-.03em;line-height:1}.masthead__role{margin-top:.5rem;font-family:var(--mono);font-size:var(--t-sm);letter-spacing:.04em;color:var(--ink-2)}.masthead__nav{display:flex;gap:1.25rem;font-family:var(--mono);font-size:var(--t-sm)}.masthead__nav a{color:var(--ink-2);text-decoration:none;padding-bottom:2px;border-bottom:1px solid transparent;transition:color var(--dur) var(--ease),border-color var(--dur) var(--ease)}.masthead__nav a:hover{color:var(--ink);border-bottom-color:var(--ink-3)}.intro{padding-block:0 var(--s7);border-bottom:1px solid var(--rule)}.intro__lede{max-width:var(--measure);font-size:var(--t-md);line-height:1.7;color:var(--ink-2)}.intro__lede #greeting{color:var(--ink)}.outcomes{padding-block:var(--s7);border-bottom:1px solid var(--rule)}.outcomes__list{display:grid;gap:var(--s6) var(--s7);grid-template-columns:repeat(auto-fit,minmax(min(100%,13rem),1fr));margin-top:var(--s5)}.outcome__metric{font-family:var(--mono);font-size:var(--t-lg);font-weight:500;letter-spacing:-.02em;color:var(--ink)}.outcome__label{margin-top:.2rem;font-family:var(--mono);font-size:var(--t-xs);letter-spacing:var(--tracking);text-transform:uppercase;color:var(--ink-3)}.outcome__body{margin-top:.65rem;font-size:var(--t-sm);line-height:1.6;color:var(--ink-2)}.group__head{display:flex;flex-wrap:wrap;align-items:baseline;gap:var(--s1) var(--s4);padding-block:var(--s7) var(--s3)}.group__blurb{flex:1;font-size:var(--t-sm);color:var(--ink-3)}.group__count{font-family:var(--mono);font-size:var(--t-xs);color:var(--ink-3)}.group[data-status=live]{--status-color: var(--st-live)}.group[data-status=building]{--status-color: var(--st-building)}.group[data-status=paused]{--status-color: var(--st-paused)}.group[data-status=shelved]{--status-color: var(--st-shelved)}.group[data-status=archived]{--status-color: var(--st-archived)}.entry{position:relative;padding-block:var(--s5);border-top:1px solid var(--rule-soft)}.entry:before{content:"";position:absolute;left:-1rem;top:calc(var(--s5) + .15rem);width:2px;height:1.05em;background:var(--status-color, transparent);opacity:.85}.entry__head{display:flex;flex-wrap:wrap;gap:var(--s2) var(--s5);align-items:baseline;justify-content:space-between}.entry__name{font-size:var(--t-md);font-weight:600;letter-spacing:-.01em}.entry__actions{display:flex;gap:var(--s5);font-family:var(--mono);font-size:var(--t-sm)}.entry__link,.entry__repo{display:inline-flex;align-items:center;min-height:24px;padding-block:var(--s1);margin-block:calc(var(--s1) * -1)}.entry__link{color:var(--link);text-decoration:none}.entry__link:hover{text-decoration:underline;text-underline-offset:.25em}.entry__link span{display:inline-block;margin-left:.4em;transition:translate var(--dur) var(--ease)}.entry__link:hover span{translate:3px 0}.entry__repo{color:var(--ink-3);text-decoration:none}.entry__repo:hover{color:var(--ink)}.entry__stars{color:var(--ink-3)}.entry__tagline{margin-top:var(--s2);max-width:var(--measure);color:var(--ink-2)}.entry__desc,.entry__detail{margin-top:var(--s2);max-width:var(--measure);font-size:var(--t-sm);line-height:1.7;color:var(--ink-3)}.entry__stack{margin-top:var(--s3);font-family:var(--mono);font-size:var(--t-xs);text-transform:lowercase;color:var(--ink-3);line-height:1.9}.entry--flagship{padding-block:var(--s6) var(--s7)}.entry--flagship .entry__name{font-size:var(--t-lg);letter-spacing:-.025em}.entry--flagship .entry__tagline{font-size:var(--t-md);color:var(--ink)}.entry--flagship .entry__desc{font-size:var(--t-base);color:var(--ink-2)}.also{border-top:1px solid var(--rule)}.also__list{display:grid;gap:var(--s5) var(--s7);grid-template-columns:repeat(auto-fit,minmax(min(100%,20rem),1fr))}.also__item{padding-top:var(--s4);border-top:1px solid var(--rule-soft)}.also__name{font-size:var(--t-base);font-weight:600}.also__desc{margin-top:.3rem;font-size:var(--t-sm);line-height:1.6;color:var(--ink-3)}.also__item .entry__stack{margin-top:.55rem}.skills{border-top:1px solid var(--rule)}.skills__groups{display:grid;gap:var(--s6) var(--s7);grid-template-columns:repeat(auto-fit,minmax(min(100%,16rem),1fr))}.skill-group__title{font-size:var(--t-base);font-weight:600;padding-bottom:.7rem;border-bottom:1px solid var(--rule-soft)}.skill-list{display:grid;gap:var(--s3);margin-top:var(--s4)}.skill{display:grid;grid-template-columns:1fr auto;gap:.15rem .75rem;align-items:baseline}.skill__name{font-size:var(--t-sm);color:var(--ink)}.skill__meter{display:inline-flex;gap:.22rem}.pip{width:.34rem;height:.34rem;border-radius:50%;background:var(--ink-4)}.pip.is-on{background:var(--ink-2)}.skill__desc{grid-column:1 / -1;font-size:var(--t-xs);line-height:1.6;color:var(--ink-3)}.about{border-top:1px solid var(--rule)}.about__grid{display:grid;grid-template-columns:auto minmax(0,1fr);gap:clamp(1.25rem,4vw,2.5rem);align-items:start}.avatar{width:84px;height:84px;border-radius:50%;filter:grayscale(1) contrast(1.05);opacity:.85}.about__body{display:grid;gap:1rem;max-width:var(--measure);color:var(--ink-3);font-size:var(--t-sm);line-height:1.75}.about__lede{font-size:var(--t-base);color:var(--ink-2)}.about__list{display:grid;gap:.35rem}.about__list li:before{content:"— ";color:var(--ink-4)}.contact{padding-block:var(--s7);border-top:1px solid var(--rule)}.contact__body{margin-top:1rem;max-width:var(--measure);font-size:var(--t-md);color:var(--ink-2)}.contact__email{display:inline-block;margin-top:.9rem;font-family:var(--mono);font-size:var(--t-md);color:var(--link);text-decoration:none;border-bottom:1px solid color-mix(in srgb,var(--link) 40%,transparent)}.contact__email:hover{border-bottom-color:var(--link)}.footer{display:flex;flex-wrap:wrap;gap:var(--s1) var(--s5);padding-block:var(--s6) var(--s8);border-top:1px solid var(--rule);font-family:var(--mono);font-size:var(--t-xs);color:var(--ink-3)}.toast{position:fixed;left:50%;bottom:1.75rem;translate:-50% .75rem;z-index:60;padding:.5rem .9rem;border:1px solid var(--rule);border-radius:var(--radius);background:var(--surface);font-family:var(--mono);font-size:var(--t-xs);color:var(--ink-2);opacity:0;pointer-events:none;transition:opacity var(--dur) var(--ease),translate var(--dur) var(--ease)}.toast.is-visible{opacity:1;translate:-50% 0}@media(max-width:34rem){.about__grid{grid-template-columns:1fr}.entry:before{left:-.55rem}}@media(prefers-reduced-motion:no-preference){.js .masthead__name,.js .masthead__role,.js .masthead__nav,.js .intro__lede{animation:rise .62s var(--ease) backwards}.js .masthead__role{animation-delay:60ms}.js .masthead__nav{animation-delay:.11s}.js .intro__lede{animation-delay:.15s}.js [data-reveal]{opacity:0;translate:0 12px;transition:opacity .52s var(--ease),translate .52s var(--ease)}.js [data-reveal].is-revealed{opacity:1;translate:none}.js [data-reveal] .entry{transition-delay:calc(var(--i, 0) * 45ms)}}@keyframes rise{0%{opacity:0;translate:0 14px}to{opacity:1;translate:none}}@media(prefers-reduced-motion:no-preference){.group[data-status=building] .label--status .dot{animation:breathe 2.6s var(--ease) infinite}}@keyframes breathe{0%,to{opacity:1}50%{opacity:.35}}@media(prefers-reduced-motion:reduce){html{scroll-behavior:auto}*,*:before,*:after{animation-duration:.01ms!important;animation-iteration-count:1!important;transition-duration:.01ms!important}}
