:root{color-scheme:dark;--font:-apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif;--lake:#1b1b1d;--land:#0c0c0c;--ink:#fff;--on-ink:#17161a;--pane:#101012b8;--pane-blur:blur(14px) saturate(.35);--well:#0000004d;--well-deep:#0000006b;--lip-dark:#0000008c;--lip-light:#ffffff1c;--hair:#ffffff29;--fill:#35c46a;--drain:#ec4a3f;--r-pane:1.375rem;--r-ctl:.75rem;--hit:2.75rem;--t-display:clamp(2.25rem, 9vw, 3.25rem);--t-h2:1.625rem;--t-h3:1.1875rem;--t-body:1.0625rem;--t-note:.875rem;--t-caption:.8125rem;--lh-body:1.6;--t-prose:var(--t-body);--t-title:var(--t-h3);--t-label:var(--t-note);--s1:.5rem;--s2:.875rem;--s3:1.25rem;--s4:2rem;--s5:2.75rem;--s6:3.5rem;--s7:5rem;--gutter:1rem;--measure:40rem;--wide:68rem;--figure:22rem}*,:before,:after{box-sizing:border-box}html{-webkit-text-size-adjust:100%;text-size-adjust:100%}body{background:var(--lake);color:var(--ink);font:400 var(--t-body)/var(--lh-body) var(--font);-webkit-font-smoothing:antialiased;margin:0}img{max-width:100%;display:block}a{color:inherit;text-underline-offset:.18em;text-decoration-thickness:1px}a:hover{text-decoration-thickness:2px}:focus-visible{outline:2px solid var(--ink);outline-offset:3px;border-radius:4px}::selection{background:var(--ink);color:var(--on-ink)}h1,h2,h3{text-wrap:balance;margin:0}p{text-wrap:pretty;margin:0}.num{font-variant-numeric:tabular-nums}.skip{position:absolute;top:0;left:-999px}.skip:focus{left:var(--gutter);top:var(--gutter);z-index:10;background:var(--ink);color:var(--on-ink);border-radius:var(--r-ctl);padding:.5rem .75rem}.wrap{width:min(100% - 2 * var(--gutter), var(--wide));margin-inline:auto}.measure{max-width:var(--measure)}.btn{min-height:var(--hit);border-radius:var(--r-ctl);font:600 .9375rem/1.15 var(--font);color:var(--ink);background:var(--well);box-shadow:inset 0 1.5px 2px var(--lip-dark), inset 0 -1px 0 var(--lip-light);border:0;justify-content:center;align-items:center;gap:.5rem;padding:0 1.05rem;text-decoration:none;transition:background .12s,box-shadow .12s,transform 80ms;display:inline-flex}.btn:hover{background:var(--well-deep);text-decoration:none}.btn:active{background:var(--well-deep);box-shadow:inset 0 2.5px 4px var(--lip-dark), inset 0 -1px 0 var(--lip-light);transform:translateY(.5px)}.btn-primary{color:var(--on-ink);background:var(--ink);box-shadow:inset 0 1px #ffffff8c,0 1px 1px #00000059,0 4px 10px #0000004d}.btn-primary:hover{background:#ececec}.btn-primary:active{background:#e0e0e0;box-shadow:inset 0 1px 2px #00000040,0 1px 1px #0000004d}.actions{flex-wrap:wrap;gap:.625rem;display:flex}.hero{--pane-top:calc(env(safe-area-inset-top,0px) + 1.25rem + 90px);isolation:isolate;min-height:100lvh;padding:var(--pane-top) 0 0;background:var(--land);position:relative}.hero-inner{top:var(--pane-top);position:sticky}.hero-inner:focus-within{opacity:1!important;pointer-events:auto!important}.hero-still{z-index:-2;position:absolute;inset:0}.hero-still img{object-fit:cover;object-position:50% 45%;width:100%;height:100%}.hero-still:after{content:"";background:linear-gradient(to bottom, #1b1b1d00, var(--lake));height:30%;position:absolute;inset:auto 0 0}.hero-map{z-index:-1;pointer-events:none;position:absolute;inset:0}.hero-live{opacity:0;will-change:transform;width:100%;height:100lvh;transition:opacity .5s;position:fixed;top:0;left:0}.hero-live.on{opacity:1}html.hero-ride .hero-live{position:absolute}html.hero-pending .hero-still,html.hero-pending .hero-inner{opacity:0}html.hero-reveal .hero-inner{transition:opacity .5s}html.hero-live-on .hero-still{display:none}main{z-index:1;position:relative}.section.section-water{padding-top:.75rem}.hero-live #map{position:absolute;inset:0}body.lg .hero .pane[data-glass]{backdrop-filter:none;box-shadow:none;background:#08080a5c}body.lg .hero .pane [data-glass=button]:not([data-glass-off]),body.lg .hero .pane [data-glass=button]:not([data-glass-off]):hover,body.lg .hero .pane [data-glass=button]:not([data-glass-off]):active{box-shadow:none;color:var(--e-glass-ink,var(--ink));background:0 0;transform:none}.pane{border-radius:var(--r-pane);background:var(--pane);backdrop-filter:var(--pane-blur);padding:1.25rem;box-shadow:inset 0 1px #ffffff17,0 10px 30px #00000059}.hero .pane{gap:1rem;max-width:36rem;display:grid}.name{letter-spacing:-.03em;font-size:clamp(2.6rem,14.9vw,6rem);font-weight:800;line-height:.95}.hero-words{text-shadow:0 2px 18px #0009;width:fit-content;margin-inline:auto;padding:1.1rem 1.1rem 0;display:block}.hero-words .name{white-space:nowrap}.crawl{text-align:center;letter-spacing:-.01em;margin-top:1.1rem;font-size:clamp(1.38rem,7.9vw,3.18rem);font-weight:700;line-height:1.5}.crawl span{white-space:nowrap;display:block}.hero.name-on-map .hero-words{color:#0000;text-shadow:none}.line{font-size:var(--t-title);font-weight:700;line-height:1.25}.hero-body{font-size:var(--t-body)}.hero-actions{grid-template-columns:repeat(3,minmax(0,1fr));gap:.6rem;display:grid}.hero-actions .btn{padding-inline:.5rem}@media (width<=40rem){.hero .pane{gap:.8rem;padding:1.1rem}.hero-actions{gap:.45rem}}@media (width<=23rem){.hero-actions .btn{padding-inline:.25rem;font-size:.8125rem}}.draft-flag{font-size:var(--t-caption);border:1px dashed var(--ink);border-radius:999px;padding:.15rem .5rem;font-weight:600;display:inline-block}.top{padding-top:calc(env(safe-area-inset-top,0px) + var(--s1));justify-content:space-between;align-items:center;gap:1rem;display:flex}.top a{min-height:var(--hit);align-items:center;font-size:.9375rem;font-weight:600;text-decoration:none;display:inline-flex}.top a:hover{text-decoration:underline}.top .top-name{letter-spacing:-.01em;font-weight:800}.top-lead{align-items:center;gap:.25rem;display:inline-flex}.top .top-back{width:var(--hit);justify-content:center;margin-left:-.75rem;display:none}@media (display-mode:standalone){.top .top-back{display:inline-flex}}.standalone .top .top-back{display:inline-flex}.section{padding:var(--s7) 0 0}.section-head{gap:var(--s2);max-width:var(--measure);display:grid}.section-head h2,.section>.wrap>h2,.foot h2{font-size:var(--t-h2);letter-spacing:-.02em;font-weight:800;line-height:1.15}.section-head .actions{margin-top:calc(var(--s3) - var(--s2))}.apps{margin:0;padding:0;list-style:none}.app{gap:var(--s4);display:grid}.app+.app{margin-top:var(--s7);padding-top:var(--s5);border-top:1px solid var(--hair)}@media (width>=52rem){.app{grid-template-columns:minmax(0, 1fr) var(--figure);align-items:start;column-gap:3rem}}.card-screen{max-width:17rem;box-shadow:0 0 0 1px var(--hair);background:#000;border-radius:1.75rem;display:block;overflow:hidden}.card-screen img{width:100%;height:auto;display:block}.card-pic{border-radius:var(--r-pane);background:var(--lake);box-shadow:0 0 0 1px var(--hair);display:block;overflow:hidden}.card-pic img{width:100%;height:auto;display:block}.prose .card-pic,.prose .card-screen{margin:var(--s4) 0}.photo-set{gap:.6rem;margin:0;display:grid}.photo-set figcaption,.gallery figcaption,.app-shot figcaption{font-size:var(--t-caption)}.photo-row{grid-template-columns:repeat(2,minmax(0,1fr));gap:.75rem;max-width:24rem;display:grid}.photo-row a{aspect-ratio:9/16;border-radius:var(--r-ctl);background:#000;display:block;overflow:hidden}.photo-row img,.photo-row picture{width:100%;height:100%;display:block}.photo-row img,.photo-row video{object-fit:cover}.photo-row video{width:100%;height:100%;display:block}.gallery{margin-bottom:var(--s5);grid-template-columns:repeat(auto-fit,minmax(min(100%,16rem),1fr));align-items:start;gap:2rem 1.25rem;display:grid}.gallery figure{margin:0}.gallery img,.gallery video{border-radius:var(--r-ctl);width:100%;height:auto;display:block}.gallery figcaption,.app-shot figcaption{margin-top:.5rem}.app-shot{max-width:22rem;margin:var(--s4) 0;display:block}.app-shot img{border-radius:var(--r-pane);width:100%;height:auto;display:block}.app-screen{margin:0 0 var(--s4)}.rows{max-width:var(--measure);margin:0;padding:0;list-style:none}.rows>li{padding:var(--s2) 0;border-top:1px solid var(--hair);gap:.3rem;display:grid}.rows>li:first-child{border-top:0;padding-top:0}.rows h3{font-size:var(--t-h3);font-weight:700;line-height:1.25}.rows h3 a{text-decoration:none}.rows h3 a:hover{text-decoration:underline}.rows .links{flex-wrap:wrap;gap:0 1.25rem;font-size:.9375rem;font-weight:600;display:flex}.rows .links a{align-items:center;min-height:2.25rem;display:inline-flex}.facts{max-width:var(--measure);grid-template-columns:auto 1fr;gap:.45rem 1.25rem;margin:0;display:grid}.facts dt{font-variant-numeric:tabular-nums;text-align:right;font-weight:700}.facts dd{margin:0}.legend{font-size:var(--t-note);flex-wrap:wrap;gap:.5rem 1.25rem;display:flex}.legend span{align-items:center;gap:.5rem;display:inline-flex}.legend i{border-radius:.3rem;width:1.5rem;height:1rem;display:inline-block}.flow{flex-wrap:wrap;align-items:stretch;gap:.5rem 1.4rem;margin:0;padding:0;list-style:none;display:flex}.step{min-width:7.5rem;max-width:13rem;font-size:var(--t-note);flex:8rem;align-content:start;gap:.15rem;padding:.5rem .7rem .6rem;line-height:1.3;display:grid;position:relative}.step .k{font-size:.75rem;font-weight:600}.step .t{font-weight:500}.step+.step:before{content:"";background:var(--hair);width:1.1rem;height:1px;position:absolute;top:50%;left:-1.25rem}.step[data-kind=input],.step[data-kind=output]{border-radius:var(--r-ctl);background:var(--well);box-shadow:inset 0 1.5px 2px var(--lip-dark), inset 0 -1px 0 var(--lip-light)}.step[data-kind=model]{border-radius:var(--r-ctl);border:1.5px dashed var(--ink)}.step[data-kind=code]{border:1.5px solid var(--ink);border-radius:.25rem}.step[data-kind=human]{border-radius:var(--r-ctl);background:var(--ink);color:var(--on-ink);box-shadow:0 1px 1px #00000059,0 4px 10px #0000004d}.legend i[data-kind=io]{background:var(--well);box-shadow:inset 0 1.5px 2px var(--lip-dark), inset 0 -1px 0 var(--lip-light)}.legend i[data-kind=model]{border:1.5px dashed var(--ink)}.legend i[data-kind=code]{border:1.5px solid var(--ink);border-radius:.15rem}.legend i[data-kind=human]{background:var(--ink)}.flow-lg .step{max-width:15rem;padding:.7rem .9rem .8rem;font-size:1rem}@media (width<=40rem){.flow{border-left:1px solid var(--hair);flex-direction:column;gap:.55rem;padding-left:.9rem}.step{flex:none;min-width:0;max-width:none;padding:.4rem .65rem;font-size:.875rem;display:block}.flow-lg .step{max-width:none;padding:.5rem .75rem;font-size:.9375rem}.step+.step:before{display:none}.step .k{font-size:inherit;font-weight:700}.step .k:after{content:": "}}.case-head{padding:var(--s5) 0 0;gap:var(--s2);max-width:var(--measure);display:grid}.case-head h1{font-size:var(--t-display);letter-spacing:-.03em;font-weight:800;line-height:1.02}.case-head .prose,.case-head .lede{font-size:1.1875rem;line-height:1.5}.case-head .actions{margin-top:calc(var(--s3) - var(--s2))}.case-head .flow,.case-head .case-proof{margin-top:var(--s1)}.case-meta{font-size:var(--t-note);font-weight:600}.case-proof{gap:.5rem;margin:0;padding:0;list-style:none;display:grid}.case-proof li{border-radius:var(--r-ctl);background:var(--well);box-shadow:inset 0 1.5px 2px var(--lip-dark), inset 0 -1px 0 var(--lip-light);padding:.55rem .75rem;font-size:.9375rem;font-weight:600;line-height:1.4}.prose{max-width:var(--measure)}.prose>*+*{margin-top:var(--s2)}.prose h2{font-size:var(--t-h2);letter-spacing:-.02em;margin-top:var(--s6);padding-top:var(--s4);border-top:1px solid var(--hair);font-weight:800;line-height:1.15}.prose h3{font-size:var(--t-h3);margin-top:var(--s5);font-weight:700;line-height:1.25}.prose h2+h3{margin-top:var(--s3)}.prose ul,.prose ol{padding-left:1.2em}.prose li+li{margin-top:.5em}.prose code{background:var(--well);border-radius:.3em;padding:.05em .3em;font-size:.92em}.prose strong{font-weight:700}.prose .legend+.flow,.prose .flow+p,.prose .actions,.prose .rows,.prose .facts{margin-top:var(--s3)}.prose .rows,.prose .facts{padding-left:0}.prose .rows>li+li,.prose .rows h3{margin-top:0}.prose .legend{margin-top:var(--s3)}main>.prose:first-of-type>:first-child{margin-top:0}main>.prose:first-of-type{margin-top:var(--s5)}main>.apps{margin-top:var(--s6)}.nextprev{margin-top:var(--s6);flex-wrap:wrap;gap:.625rem;display:flex}.foot{margin-top:var(--s7);padding:0 0 var(--s6)}.foot .wrap{border-top:1px solid var(--hair);padding-top:var(--s5)}.colophon-line{margin-top:var(--s5);font-size:var(--t-caption);max-width:var(--measure)}.jobs{gap:2rem;max-width:46rem;margin:0;padding:0;list-style:none;display:grid}.job{gap:.35rem;display:grid}.job h3{font-size:var(--t-h3);font-weight:700;line-height:1.25}.job .org{font-weight:600}.job .when{font-size:var(--t-note);font-variant-numeric:tabular-nums}.job ul{max-width:var(--measure);gap:.4rem;margin:.35rem 0 0;padding-left:1.1em;display:grid}@media (width>=52rem){.job{grid-template-columns:11rem 1fr;column-gap:2rem}.job .when{grid-row:1/span 3;padding-top:.3rem}}.cv{padding:var(--s4) 0 0}.cv-head{gap:.5rem;margin-bottom:2rem;display:grid}.cv-head h1{font-size:var(--t-display);letter-spacing:-.03em;font-weight:800;line-height:1}.cv-contact{font-size:var(--t-note);flex-wrap:wrap;gap:.25rem 1.25rem;display:flex}.cv h2{font-size:var(--t-h3);border-bottom:1px solid var(--hair);max-width:46rem;margin:2.25rem 0 .9rem;padding-bottom:.4rem;font-weight:800}.cv .lane{flex-wrap:wrap;gap:.5rem;margin-top:.75rem;display:flex}.cv .lane .btn[aria-current=page]{background:#ffffff29;box-shadow:inset 0 1px #ffffff24,0 1px 3px #0006}.cv .projects{max-width:var(--measure);gap:.75rem;margin:0;padding:0;list-style:none;display:grid}.cv .projects strong{font-weight:700}.cv .skills{max-width:var(--measure);gap:.5rem;margin:0;display:grid}.cv .skills dt{font-weight:700;display:inline}.cv .skills dd{margin:0;display:inline}.cv .skills div{line-height:1.5}@media (prefers-reduced-motion:reduce){*{transition:none!important}}@media print{:root{color-scheme:light;--ink:#000;--hair:#bbb}@page{size:Letter;margin:.55in .6in}body{color:#000;background:#fff;font-size:10pt;line-height:1.38}.noprint,.skip{display:none!important}.wrap{width:auto}.cv{padding:0}.cv-head{gap:.2rem;margin-bottom:.6rem}.cv-head h1{font-size:22pt}.cv-contact{font-size:9pt}.cv h2{break-after:avoid;border-color:#999;margin:.9rem 0 .4rem;padding-bottom:.15rem;font-size:11.5pt}.jobs{gap:.7rem}.job{break-inside:avoid;grid-template-columns:1fr}.job h3{font-size:11pt}.job .when{grid-row:auto;padding:0;font-size:9pt}.job ul{gap:.15rem}.cv .projects{gap:.3rem}.cv .projects li{break-inside:avoid}a{text-decoration:none}}
