@import "https://fonts.googleapis.com/css2?family=Atkinson+Hyperlegible:wght@400;700&family=Gabarito:wght@500;700;900&display=swap";.astro-route-announcer{clip:rect(0 0 0 0);clip-path:inset(50%);white-space:nowrap;width:1px;height:1px;position:absolute;top:0;left:0;overflow:hidden}:root{color-scheme:dark;--paper:oklch(17% .018 132);--paper-deep:oklch(13% .016 132);--ink:oklch(91% .026 104);--muted:oklch(72% .026 112);--dim:oklch(56% .024 118);--line:oklch(31% .026 132);--line-strong:oklch(62% .042 112);--acid:oklch(84% .16 122);--rust:oklch(74% .105 52);--blueprint:oklch(76% .075 224);--font-display:"Gabarito", ui-sans-serif, sans-serif;--font-body:"Atkinson Hyperlegible", ui-sans-serif, sans-serif;--space-1:.25rem;--space-2:.5rem;--space-3:.75rem;--space-4:1rem;--space-5:1.25rem;--space-6:1.5rem;--space-8:2rem;--space-12:3rem;--space-16:4rem;background:#1b2119}*{box-sizing:border-box}html{color:var(--ink);font-family:var(--font-body);-webkit-font-smoothing:antialiased;text-rendering:optimizelegibility;scrollbar-gutter:stable;background-color:#1b2119}body{background-color:#1b2119;min-width:320px;margin:0}body:before{content:"";pointer-events:none;opacity:.22;background-image:linear-gradient(90deg,oklch(82% .06 118/.055) 1px,#0000 1px),linear-gradient(oklch(82% .06 118/.045) 1px,#0000 1px);background-size:42px 42px;position:fixed;inset:0;mask-image:linear-gradient(#000,#0000 72%)}::selection{background:var(--acid);color:var(--paper-deep)}a{color:inherit;text-decoration-color:color-mix(in oklch, var(--rust), transparent 35%);text-underline-offset:.18em;text-decoration-thickness:.1em}a:hover{color:var(--rust)}img,svg{max-width:100%}button,input,textarea,select{font:inherit}main{position:relative}.site-shell{width:min(1180px,100% - 32px);margin-inline:auto}.site-header{z-index:20;background:0 0;position:sticky;top:0}.site-header:before{content:"";pointer-events:none;background:linear-gradient(to bottom, color-mix(in oklch, var(--paper), transparent 2%), color-mix(in oklch, var(--paper), transparent 24%) 46%, transparent);height:92px;position:absolute;inset:0 0 auto}.nav{z-index:1;justify-content:space-between;align-items:flex-end;gap:var(--space-4);min-height:64px;padding-bottom:1.15rem;display:flex;position:relative}.nav-links{flex-wrap:wrap;align-items:flex-end;gap:clamp(.7rem,2vw,1.5rem);display:flex}.nav-links a{color:var(--muted);font-size:.95rem;line-height:1;text-decoration:none}.nav-links a:hover,.nav-links a[aria-current=page]{color:var(--ink)}.site-footer{padding:var(--space-8) 0;color:var(--muted)}.footer-grid{gap:var(--space-6);grid-template-columns:minmax(0,1fr) auto;align-items:baseline;display:grid}.footer-links{gap:var(--space-4);flex-wrap:wrap;justify-content:flex-end;display:flex}.footer-links a{color:var(--dim);font-size:.9rem;text-decoration:none}.footer-links a:hover{color:var(--rust)}.site-brand{align-items:flex-end;gap:var(--space-2);min-width:0;font-family:var(--font-display);letter-spacing:-.04em;font-weight:900;text-decoration:none;transition:gap .17s cubic-bezier(.2,0,0,1) 55ms;display:inline-flex}.site-brand:hover,.site-brand:focus-visible{gap:.28rem}.site-brand__mark{width:8.1ch;height:1.05em;color:var(--ink);view-transition-name:howaboua-mark;flex:none;font-size:1rem;line-height:1;transition:width .17s cubic-bezier(.2,0,0,1) 55ms;display:inline-block;position:relative;overflow:hidden}.site-brand:hover .site-brand__mark,.site-brand:focus-visible .site-brand__mark{width:2.78em}.site-brand__word,.site-brand__home{white-space:nowrap;align-items:flex-end;line-height:1;display:inline-flex;position:absolute;inset:0 auto auto 0}.site-brand__word{transform-origin:0 100%;transition:opacity 12ms linear 96ms,transform .18s cubic-bezier(.2,0,0,1)}.site-brand:hover .site-brand__word,.site-brand:focus-visible .site-brand__word{opacity:0;transform:scaleX(.52)translateY(-.04em)}.site-brand__letter{transition:color .16s cubic-bezier(.2,0,0,1),transform .22s cubic-bezier(.2,0,0,1);transition-delay:calc(var(--i) * 10ms);display:inline-block}.site-brand__letter:nth-child(2),.site-brand__letter:nth-child(6){color:color-mix(in oklch, var(--blueprint), var(--ink) 35%)}.site-brand__letter:nth-child(3),.site-brand__letter:nth-child(7){color:color-mix(in oklch, var(--acid), var(--ink) 45%)}.site-brand__letter:nth-child(4),.site-brand__letter:nth-child(8){color:color-mix(in oklch, var(--rust), var(--ink) 30%)}.site-brand:hover .site-brand__letter,.site-brand:focus-visible .site-brand__letter{color:var(--rust);transform:translateY(calc((var(--i) - 3.5) * -.01em))}.site-brand__home{color:var(--rust);opacity:0;transform-origin:0 100%;transition:opacity 12ms linear 98ms}.site-brand:hover .site-brand__home,.site-brand:focus-visible .site-brand__home{opacity:1}@media (prefers-reduced-motion:reduce){.site-brand__mark,.site-brand__word,.site-brand__letter,.site-brand__home{transition-duration:1ms;animation-duration:1ms}}.site-brand__phrase{white-space:nowrap;width:clamp(15ch,24vw,27ch);min-width:0;color:var(--dim);font-family:var(--font-body);letter-spacing:.01em;align-self:flex-end;align-items:flex-end;gap:.26em;font-size:.82rem;font-weight:700;line-height:1;display:inline-flex;overflow:hidden}.site-brand__phrase:before{content:"/";color:color-mix(in oklch, var(--line-strong), transparent 15%);margin-right:.08em;line-height:1}.site-brand__phrase-word{opacity:.84;transition:opacity .15s cubic-bezier(.2,0,0,1),transform .15s cubic-bezier(.2,0,0,1),color .16s cubic-bezier(.2,0,0,1);transition-delay:calc(var(--i) * 18ms);display:inline-block;transform:translateY(0)}.site-brand__phrase[data-phase=out] .site-brand__phrase-word{opacity:0;transform:translateY(-.45em)rotate(-1deg)}.site-brand__phrase[data-phase=in] .site-brand__phrase-word{animation:.18s cubic-bezier(.2,0,0,1) both brand-phrase-in;animation-delay:calc(var(--i) * 22ms)}.site-brand:hover .site-brand__phrase-word{color:var(--muted)}::view-transition-group(howaboua-mark){animation-duration:.26s}@keyframes brand-phrase-in{0%{opacity:0;transform:translateY(.45em)rotate(1deg)}to{opacity:.84;transform:translateY(0)rotate(0)}}@media (width<=980px){.site-brand__phrase{display:none}}@media (prefers-reduced-motion:reduce){.site-brand__phrase-word{transition-duration:1ms;animation-duration:1ms}}.kicker,.eyebrow{color:var(--rust);letter-spacing:.12em;text-transform:uppercase;margin:0;font-size:.78rem;font-weight:700}h1,h2,h3{font-family:var(--font-display);letter-spacing:-.025em;text-wrap:balance;margin:0}h1{max-width:10ch;font-size:clamp(3.4rem,11vw,8.8rem);line-height:.82}h2{font-size:clamp(2rem,5vw,4.8rem);line-height:.9}h3{font-size:clamp(1.25rem,2vw,1.7rem);line-height:1}.lede{max-width:62ch;color:var(--muted);text-wrap:pretty;font-size:clamp(1.08rem,1.6vw,1.35rem);line-height:1.55}.meta-line{width:fit-content;margin-bottom:var(--space-1);grid-template-columns:1.15rem auto;align-items:center;gap:.42rem;display:grid}.meta-line .kicker{line-height:1}.meta-back{width:1.15rem;height:.78rem;color:var(--dim);place-items:center;text-decoration:none;display:grid}.meta-back svg{width:.86rem;height:.86rem;display:block;overflow:visible;transform:translateY(-.08em)}.meta-back path{fill:none;stroke:currentColor;stroke-linecap:round;stroke-linejoin:round;stroke-width:1.8px}.meta-back:hover,.meta-back:focus-visible{color:var(--rust)}.page-title{padding:var(--space-12) 0 var(--space-8);max-width:900px}.page-title h1{max-width:12ch}.minihero{max-width:880px;padding:var(--space-5) 0 var(--space-4)}.minihero>.kicker{margin-bottom:var(--space-1);line-height:1}.minihero h1{max-width:none;font-size:clamp(1.7rem,2.8vw,2.6rem);line-height:1.04}.minihero-copy p{max-width:78ch;margin:var(--space-2) 0 0;color:var(--muted);text-wrap:pretty;font-size:.98rem;line-height:1.48}.list-page .page-title{padding:var(--space-6) 0 var(--space-5);max-width:900px}.list-page .page-title h1{max-width:none;font-size:clamp(1.8rem,3vw,2.7rem);line-height:1.02}.list-page .lede{max-width:78ch;margin-top:var(--space-2);font-size:.98rem;line-height:1.48}.article-page .page-title{max-width:none;padding:var(--space-5) 0 clamp(.9rem, 1.8vw, 1.4rem)}.article-page .page-title h1{max-width:min(72vw,840px);font-size:clamp(2.15rem,4.7vw,4.55rem);line-height:.96}.article-page .lede{max-width:min(72vw,840px);color:var(--ink);font-family:var(--font-display);letter-spacing:-.03em;text-wrap:balance;margin:clamp(.65rem,1.7vw,1.15rem) 0 0;font-size:clamp(1.45rem,2.35vw,2.15rem);line-height:1.14}@media (width>=900px){.article-page .page-title h1{max-width:none}.article-page .page-title h1+.lede{margin-top:.45rem}}.prose{max-width:min(72vw,840px);padding-bottom:var(--space-16);position:relative}.prose>*+*{margin-top:var(--space-4)}.prose>:first-child{margin-top:0}.prose a{color:var(--ink);text-decoration-color:color-mix(in oklch, var(--blueprint), transparent 25%)}.prose a:hover{color:var(--rust)}.prose strong{color:var(--ink)}.prose em{color:color-mix(in oklch, var(--ink), var(--muted) 18%)}.prose p,.prose li{color:var(--muted);hyphens:manual;text-wrap:pretty;line-height:1.72}.prose h2{margin-top:var(--space-12);margin-bottom:var(--space-4);font-size:clamp(1.7rem,3vw,2.6rem)}.prose h3{margin-top:var(--space-8);margin-bottom:var(--space-3);font-size:clamp(1.25rem,2vw,1.7rem);line-height:1.05}.prose h4{margin-top:var(--space-6);margin-bottom:var(--space-2);color:var(--ink);letter-spacing:.02em;text-transform:uppercase;font-size:1rem}.prose ul,.prose ol{color:var(--muted);padding-left:1.35rem}.prose li+li,.prose li>ul,.prose li>ol{margin-top:.35rem}.prose blockquote{margin:var(--space-8) 0;padding:var(--space-4) var(--space-5);border-left:3px solid var(--rust);background:color-mix(in oklch, var(--paper-deep), var(--rust) 5%)}.prose blockquote p{color:var(--ink);font-size:inherit;margin:0;font-style:italic;line-height:1.72}.prose blockquote p+p{margin-top:var(--space-3)}.prose hr{margin:var(--space-8) 0;border:0;border-top:1px solid var(--line-strong)}.prose .contains-task-list{padding-left:0;list-style:none}.prose .task-list-item{align-items:baseline;gap:.55rem;display:flex}.prose .task-list-item input{accent-color:var(--rust);transform:translateY(.08em)}.prose-callout{padding:var(--space-4) var(--space-5);border:1px solid color-mix(in oklch, var(--rust), transparent 32%);background:color-mix(in oklch, var(--paper-deep), var(--rust) 8%);color:var(--ink);font-family:var(--font-display);border-radius:14px;font-size:clamp(1.05rem,1.5vw,1.25rem);line-height:1.38}.prose-callout a{color:var(--rust)}.prose code{background:var(--paper-deep);border-radius:4px;padding:.1em .25em;font-size:.9em}.prose pre.astro-code{margin:var(--space-6) 0;padding:var(--space-6) var(--space-5) var(--space-5);border:1px solid var(--line-strong);box-shadow:inset 0 1px 0 color-mix(in oklch, var(--ink), transparent 92%);border-radius:14px;font-size:.92rem;line-height:1.55;position:relative;background:color-mix(in oklch, var(--paper-deep), black 18%)!important}.prose pre.astro-code:before{content:attr(data-language);color:var(--dim);letter-spacing:.08em;text-transform:uppercase;font-family:ui-monospace,monospace;font-size:.68rem;position:absolute;top:.55rem;left:.85rem}.copy-code{border:1px solid var(--line);background:color-mix(in oklch, var(--paper), transparent 12%);color:var(--dim);cursor:pointer;letter-spacing:.04em;text-transform:uppercase;border-radius:999px;padding:.18rem .45rem;font-family:ui-monospace,monospace;font-size:.68rem;position:absolute;top:.45rem;right:.5rem}.copy-code:hover{color:var(--ink);border-color:var(--rust)}.prose pre code{background:0 0;min-width:max-content;padding:0;display:block}.prose table{width:100%;margin:var(--space-6) 0;border-collapse:collapse;white-space:nowrap;font-size:.94rem;display:block;overflow-x:auto}.prose th,.prose td{border-bottom:1px solid var(--line);text-align:left;padding:.65rem .8rem}.prose th{color:var(--ink);font-family:var(--font-display);font-weight:700}.prose td{color:var(--muted)}.prose img,.prose video{width:100%;margin:var(--space-6) 0;border:1px solid var(--line-strong);border-radius:14px;display:block}.side-video{margin:var(--space-6) 0}.side-video p{margin:var(--space-2) 0 0;color:var(--ink);font-style:italic}@media (width>=1100px){.side-video{left:calc(100% + var(--space-8));width:min(26vw,340px);margin:0;position:absolute}.side-video video{margin:0}.side-video p{margin-top:var(--space-2);text-align:left}}.content-section{padding:var(--space-3) 0}.content-section+.content-section{margin-top:var(--space-4)}.content-section-head{width:fit-content;max-width:100%;padding:var(--space-5) 0 var(--space-1);justify-content:flex-start;align-items:baseline;gap:.48em;display:flex}.content-section-head h2{color:var(--rust);letter-spacing:-.03em;flex:none;font-size:1.08rem;line-height:1.1}.content-section-head p,.content-section-head a{color:var(--dim);font-size:.9rem;text-decoration:none}.content-section-head p{min-width:0;max-width:78ch;color:var(--muted);text-align:left;white-space:nowrap;text-overflow:ellipsis;margin:0;line-height:1.35;overflow:hidden}.content-section-head p:before,.content-section-head .rotating-link:before{content:"/";color:color-mix(in oklch, var(--line-strong), transparent 15%);margin-right:.48em}.content-section-head a:hover,.content-section-head a:focus-visible{color:var(--rust)}.content-list{gap:0;display:grid}.content-row{gap:var(--space-4);grid-template-columns:minmax(0,1fr) max-content;align-items:baseline;padding:.38rem 0;display:grid}.content-row-main{white-space:nowrap;text-overflow:ellipsis;align-items:baseline;gap:.45em;min-width:0;max-width:100%;display:flex;overflow:hidden}.content-row-title{white-space:nowrap;text-overflow:ellipsis;flex:none;min-width:0;max-width:100%;font-size:1rem;line-height:1.15;transition:color .16s cubic-bezier(.2,0,0,1);display:block;overflow:hidden}.content-row-title .motion-title,.content-row-title .motion-title-inner,.content-row-copy .motion-title,.content-row-copy .motion-title-inner{display:inline}.content-row-title .motion-word,.content-row-copy .motion-word{min-inline-size:0;color:inherit;line-height:inherit;margin-right:.24em;display:inline-block}.content-row-copy{min-width:0;max-width:100%;color:var(--muted);white-space:nowrap;text-overflow:ellipsis;flex:auto;margin:0;line-height:1.35;display:block;overflow:hidden}.content-row-meta{justify-content:flex-end;align-items:baseline;gap:var(--space-2);white-space:nowrap;min-width:max-content;display:flex;overflow:visible}.content-label{font-variant-numeric:tabular-nums;font-size:.78rem}.content-label--tag{color:var(--blueprint)}.content-label--status{color:var(--dim)}.content-row-date{color:var(--dim);font-variant-numeric:tabular-nums;white-space:nowrap;font-size:.9rem}.content-row-link{text-decoration:none}.content-row-link:hover .content-row-title,.content-row-link:hover .content-row-copy,.content-row-link:hover .content-row-date,.content-row-link:hover .motion-word,.content-row-link:focus-visible .content-row-title,.content-row-link:focus-visible .content-row-copy,.content-row-link:focus-visible .content-row-date,.content-row-link:focus-visible .motion-word{color:var(--rust)}.projects-head{padding-bottom:var(--space-2)}.project-card{background:0 0;position:relative}.project-card--linked{cursor:pointer}.project-row-link{z-index:1;border-radius:.2rem;position:absolute;inset:-.16rem 0}.project-row-link:focus-visible{outline:1px solid var(--rust);outline-offset:.15rem}.project-main{z-index:2;position:relative}.project-card--linked .project-main{pointer-events:none}.project-card--linked:hover .content-row-title,.project-card--linked:hover .project-summary,.project-card--linked:hover .motion-word,.project-card--linked:has(.project-row-link:focus-visible) .content-row-title,.project-card--linked:has(.project-row-link:focus-visible) .project-summary,.project-card--linked:has(.project-row-link:focus-visible) .motion-word{color:var(--rust)}.project-meta{z-index:3;position:relative}.project-icon-link{color:var(--dim);align-items:center;display:inline-flex;translate:0 .08em}.project-icon-link:hover{color:var(--rust)}.github-icon{fill:currentColor;display:block}.note{color:var(--rust)}.article-page .prose{font-size:clamp(1rem,1.05vw,1.08rem)}.post-list{padding-bottom:var(--space-12)}.post-row{min-width:0}.post-row-link{grid-template-columns:max-content minmax(0,1fr) max-content}.post-main-link{flex:auto}.post-meta{min-width:0;overflow:hidden}@media (width<=680px){.post-row-link{grid-template-columns:max-content minmax(0,1fr)}}.motion-title{display:block}.motion-link .motion-title{display:inline}.motion-title-inner{flex-wrap:wrap;align-items:baseline;gap:.08em .24em;display:inline-flex}.motion-word{min-inline-size:var(--x-min-width);flex-grow:var(--x-flex-grow);color:var(--ink);view-transition-name:var(--x-view-transition-name);line-height:.92;transition:color .16s cubic-bezier(.2,0,0,1);display:inline-block}.motion-title-row .motion-title-inner{flex-wrap:nowrap;column-gap:.24em;max-inline-size:100%;display:inline-flex}.motion-title-row .motion-word{min-inline-size:0;line-height:inherit;flex:none;display:inline-block}.motion-title-page .motion-title-inner{flex-wrap:wrap;gap:.1em .24em;max-inline-size:none;display:inline-flex}.motion-title-page .motion-word{min-inline-size:0;line-height:inherit;text-wrap:nowrap;flex:none;display:inline-block}.motion-title-page .motion-word:nth-child(3n+2){color:color-mix(in oklch, var(--blueprint), var(--ink) 34%)}.motion-title-page .motion-word:nth-child(3n+3){color:color-mix(in oklch, var(--acid), var(--ink) 42%)}.motion-title-page .motion-word:nth-child(5n){color:color-mix(in oklch, var(--rust), var(--ink) 28%);font-family:"Baskervville", var(--font-display), serif;letter-spacing:-.025em;font-style:italic;font-weight:700}.lede .motion-title{display:block}.lede .motion-title-inner{flex-wrap:wrap;justify-content:flex-start;align-items:baseline;gap:.08em .24em;display:flex}.lede .motion-word{min-inline-size:0;color:inherit;line-height:inherit;flex:none}a:hover .motion-word{color:var(--rust)}@media (prefers-reduced-motion:reduce){.motion-word{transition-duration:1ms}::view-transition-group(*){animation-duration:1ms}}.home-journal{padding-bottom:var(--space-12)}.home-section{margin-top:var(--space-2)}.content-section-head .section-title-link{color:var(--ink);font-size:inherit}.home-list{margin-top:0}.home-post-row{padding:.7rem 0}.home-post-row .content-row-title,.home-post-row .content-row-copy{display:inline}.home-post-row:hover .content-row-title,.home-post-row:hover .motion-word{color:var(--rust)}.home-post-row:hover .content-row-copy .motion-word{color:inherit}.home-list .project-meta{margin-left:.55em}.home-list .project-label{margin-right:.45em}.about-layout{padding:var(--space-5) 0 var(--space-8);grid-template-columns:minmax(0,2fr) minmax(180px,1fr);align-items:start;gap:clamp(1.5rem,6vw,4rem);display:grid}.about-main{min-width:0}.about-intro{max-width:760px;margin-bottom:var(--space-6)}.about-intro h1{max-width:none;font-size:clamp(1.7rem,2.8vw,2.6rem);line-height:1.04}.about-intro .lede{margin-top:var(--space-4);max-width:54ch;color:var(--ink);font-family:var(--font-display);letter-spacing:-.03em;text-wrap:balance;font-size:clamp(1.3rem,2vw,1.8rem);line-height:1.16}.about-layout .prose{padding-bottom:var(--space-12)}.about-media{gap:var(--space-4);justify-items:end;display:grid;position:sticky;top:6rem}.about-photo{width:min(100%,240px);margin:0}.about-photo img{aspect-ratio:1;object-fit:cover;object-position:20% 50%;border:1px solid var(--line-strong);filter:saturate(.85)contrast(1.04);border-radius:16px;width:100%;height:auto;display:block}.about-photo figcaption{margin-top:var(--space-2);color:var(--dim);font-size:.82rem}.about-photo--secondary img{object-position:50% 50%}@media (width<=860px){.about-layout,.footer-grid{grid-template-columns:1fr}.about-layout{gap:var(--space-2)}.about-media{justify-items:stretch;gap:var(--space-3);max-width:min(460px,100%);margin-bottom:var(--space-6);grid-template-columns:repeat(2,minmax(0,1fr));position:static}.about-photo{width:100%;margin:0}.content-section-head{flex-wrap:wrap}.content-section-head p{text-align:left}.article-page .prose{margin-left:0}}@media (width<=720px){.projects-page .content-section-head p{display:none}}@media (width<=680px){.home-post-meta,.post-meta,.project-meta{display:none}}@media (width<=760px){.project-card{grid-template-columns:minmax(0,1fr) max-content}}@media (width<=560px){.site-shell{width:min(100% - 20px,1180px)}.nav{flex-direction:row;align-items:flex-end;padding:0 0 1.15rem}.nav-links{gap:var(--space-3);flex-wrap:nowrap;flex:none}.site-brand{flex:auto}h1{font-size:clamp(2.4rem,14vw,4rem)}.minihero h1{font-size:clamp(2rem,11vw,3.2rem)}}
