/*! tailwindcss v4.3.3 | MIT License | https://tailwindcss.com */
@layer properties{@supports (((-webkit-hyphens:none)) and (not (margin-trim:inline))) or ((-moz-orient:inline) and (not (color:rgb(from red r g b)))){*,:before,:after,::backdrop{--tw-rotate-x:initial;--tw-rotate-y:initial;--tw-rotate-z:initial;--tw-skew-x:initial;--tw-skew-y:initial;--tw-border-style:solid;--tw-outline-style:solid;--tw-blur:initial;--tw-brightness:initial;--tw-contrast:initial;--tw-grayscale:initial;--tw-hue-rotate:initial;--tw-invert:initial;--tw-opacity:initial;--tw-saturate:initial;--tw-sepia:initial;--tw-drop-shadow:initial;--tw-drop-shadow-color:initial;--tw-drop-shadow-alpha:100%;--tw-drop-shadow-size:initial;--tw-ease:initial}}}@layer theme{:root,:host{--font-sans:-apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", "Noto Sans", Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";--font-mono:ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace;--ease-in:cubic-bezier(.4, 0, 1, 1);--ease-out:cubic-bezier(0, 0, .2, 1);--ease-in-out:cubic-bezier(.4, 0, .2, 1);--default-transition-duration:.15s;--default-transition-timing-function:cubic-bezier(.4, 0, .2, 1);--default-font-family:var(--font-sans);--default-mono-font-family:var(--font-mono)}}@layer base{*,:after,:before,::backdrop{box-sizing:border-box;border:0 solid;margin:0;padding:0}::file-selector-button{box-sizing:border-box;border:0 solid;margin:0;padding:0}html,:host{-webkit-text-size-adjust:100%;tab-size:4;line-height:1.5;font-family:var(--default-font-family,-apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", "Noto Sans", Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji");font-feature-settings:var(--default-font-feature-settings,normal);font-variation-settings:var(--default-font-variation-settings,normal);-webkit-tap-highlight-color:transparent}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;-webkit-text-decoration:inherit;-webkit-text-decoration:inherit;-webkit-text-decoration:inherit;-webkit-text-decoration:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,samp,pre{font-family:var(--default-mono-font-family,ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace);font-feature-settings:var(--default-mono-font-feature-settings,normal);font-variation-settings:var(--default-mono-font-variation-settings,normal);font-size:1em}small{font-size:80%}sub,sup{vertical-align:baseline;font-size:75%;line-height:0;position:relative}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}:-moz-focusring:where(:not(iframe)){outline:auto}progress{vertical-align:baseline}summary{display:list-item}ol,ul,menu{list-style:none}img,svg,video,canvas,audio,iframe,embed,object{vertical-align:middle;display:block}img,video{max-width:100%;height:auto}button,input,select,optgroup,textarea{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}::file-selector-button{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}:where(select:is([multiple],[size])) optgroup{font-weight:bolder}:where(select:is([multiple],[size])) optgroup option{padding-inline-start:20px}::file-selector-button{margin-inline-end:4px}::placeholder{opacity:1}@supports (not ((-webkit-appearance:-apple-pay-button))) or (contain-intrinsic-size:1px){::placeholder{color:currentColor}@supports (color:color-mix(in lab, red, red)){::placeholder{color:color-mix(in oklab, currentcolor 50%, transparent)}}}textarea{resize:vertical}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-date-and-time-value{min-height:1lh;text-align:inherit}::-webkit-datetime-edit{display:inline-flex}::-webkit-datetime-edit-fields-wrapper{padding:0}::-webkit-datetime-edit{padding-block:0}::-webkit-datetime-edit-year-field{padding-block:0}::-webkit-datetime-edit-month-field{padding-block:0}::-webkit-datetime-edit-day-field{padding-block:0}::-webkit-datetime-edit-hour-field{padding-block:0}::-webkit-datetime-edit-minute-field{padding-block:0}::-webkit-datetime-edit-second-field{padding-block:0}::-webkit-datetime-edit-millisecond-field{padding-block:0}::-webkit-datetime-edit-meridiem-field{padding-block:0}::-webkit-calendar-picker-indicator{line-height:1}:-moz-ui-invalid{box-shadow:none}button,input:where([type=button],[type=reset],[type=submit]){appearance:button}::file-selector-button{appearance:button}::-webkit-inner-spin-button{height:auto}::-webkit-outer-spin-button{height:auto}[hidden]:where(:not([hidden=until-found])){display:none!important}}@layer components;@layer utilities{.visible{visibility:visible}.fixed{position:fixed}.static{position:static}.sticky{position:sticky}.container{width:100%}@media (width>=40rem){.container{max-width:40rem}}@media (width>=48rem){.container{max-width:48rem}}@media (width>=64rem){.container{max-width:64rem}}@media (width>=80rem){.container{max-width:80rem}}@media (width>=96rem){.container{max-width:96rem}}.block{display:block}.flex{display:flex}.grid{display:grid}.hidden{display:none}.inline{display:inline}.table{display:table}.grow{flex-grow:1}.transform{transform:var(--tw-rotate-x,) var(--tw-rotate-y,) var(--tw-rotate-z,) var(--tw-skew-x,) var(--tw-skew-y,)}.flex-wrap{flex-wrap:wrap}.rounded{border-radius:.25rem}.border{border-style:var(--tw-border-style);border-width:1px}.outline{outline-style:var(--tw-outline-style);outline-width:1px}.filter{filter:var(--tw-blur,) var(--tw-brightness,) var(--tw-contrast,) var(--tw-grayscale,) var(--tw-hue-rotate,) var(--tw-invert,) var(--tw-saturate,) var(--tw-sepia,) var(--tw-drop-shadow,)}.transition{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to,opacity,box-shadow,transform,translate,scale,rotate,filter,-webkit-backdrop-filter,backdrop-filter,display,content-visibility,overlay,pointer-events;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.ease-in{--tw-ease:var(--ease-in);transition-timing-function:var(--ease-in)}.ease-in-out{--tw-ease:var(--ease-in-out);transition-timing-function:var(--ease-in-out)}.ease-out{--tw-ease:var(--ease-out);transition-timing-function:var(--ease-out)}}@font-face{font-family:Hanken Grotesk;src:url(/fonts/hanken-grotesk-latin.woff2)format("woff2");font-weight:300 600;font-style:normal;font-display:swap}@font-face{font-family:Major Mono Display;src:url(/fonts/major-mono-display-latin.woff2)format("woff2");font-weight:400;font-style:normal;font-display:optional}:root{--paper:#fff;--ink:#000;--charcoal:#2c2222;--ink-muted:#6f716e;--fossil:#b2b4b1;--slate-iris:#495472;--on-slate-iris:#fff;--rule:#000;--focus:#495472;--heat-0:#eceeeb;--heat-1:#b2b4b1;--heat-2:#6f716e;--heat-3:#383a37;--heat-4:#000;--link-hover:#495472;--lightningcss-light:initial;--lightningcss-dark: ;color-scheme:light;--font-sans:"Hanken Grotesk", system-ui, sans-serif;--font-mono:"Major Mono Display", "Hanken Grotesk", monospace;--space-5:5px;--space-10:10px;--space-21:21px;--space-42:42px;--space-84:84px;--space-147:147px;--ease-out:cubic-bezier(.23, 1, .32, 1);--ease-in-out:cubic-bezier(.77, 0, .175, 1);--duration-press:.16s;--duration-fade:.2s;--duration-reveal:.25s;--duration-page:.28s}@media (prefers-color-scheme:dark){:root:not([data-theme=light]){--paper:#0d0e0d;--ink:#eceeeb;--charcoal:#cfd1cd;--ink-muted:#9a9c98;--fossil:#454744;--slate-iris:#56628a;--on-slate-iris:#fff;--rule:#eceeeb;--focus:#a7b2d8;--link-hover:#a7b2d8;--heat-0:#1b1c1b;--heat-1:#3a3c39;--heat-2:#6f716e;--heat-3:#b2b4b1;--heat-4:#eceeeb;--lightningcss-light: ;--lightningcss-dark:initial;color-scheme:dark}}:root[data-theme=dark]{--paper:#0d0e0d;--ink:#eceeeb;--charcoal:#cfd1cd;--ink-muted:#9a9c98;--fossil:#454744;--slate-iris:#56628a;--on-slate-iris:#fff;--rule:#eceeeb;--focus:#a7b2d8;--link-hover:#a7b2d8;--heat-0:#1b1c1b;--heat-1:#3a3c39;--heat-2:#6f716e;--heat-3:#b2b4b1;--heat-4:#eceeeb;--lightningcss-light: ;--lightningcss-dark:initial;color-scheme:dark}*,:before,:after{box-sizing:border-box}html{background:var(--paper);color:var(--ink);font-family:var(--font-sans);letter-spacing:.011em;-webkit-text-size-adjust:100%;font-size:17px;font-weight:300;line-height:1.3}body{background:var(--paper);color:var(--ink);min-height:100vh;margin:0}::selection{background:var(--slate-iris);color:var(--on-slate-iris)}img,svg{max-width:100%;display:block}h1,h2,h3,p,dl,dd,ul{margin:0}ul{padding:0;list-style:none}a{color:inherit;text-underline-offset:.2em;text-decoration-thickness:1px}a:hover{color:var(--link-hover)}:focus-visible{outline:2px solid var(--focus);outline-offset:2px}.container{width:100%;max-width:1200px;padding:0 var(--space-21);margin:0 auto}.display-mono{font-family:var(--font-mono);letter-spacing:0;font-size:62px;font-weight:400;line-height:1}.display{letter-spacing:.011em;font-size:62px;font-weight:400;line-height:1}.heading{font-size:30px;font-weight:400;line-height:1.1}.heading-sm{font-size:21px;font-weight:400;line-height:1.15}.subheading{font-size:19px;font-weight:400;line-height:1.15}.caption{font-size:15px;font-weight:400;line-height:1.2}.muted{color:var(--ink-muted)}.prose{max-width:68ch}.prose p+p{margin-top:var(--space-21)}.skip-link{top:var(--space-10);left:var(--space-10);padding:var(--space-10) var(--space-21);background:var(--slate-iris);color:var(--on-slate-iris);font-size:15px;position:absolute;transform:translateY(-200%)}.skip-link:focus{transform:none}.site-header{justify-content:space-between;align-items:center;gap:var(--space-21);padding:var(--space-21) 0;border-bottom:1px solid var(--rule);flex-wrap:wrap;display:flex}.wordmark{font-family:var(--font-mono);color:var(--ink);font-size:21px;line-height:1.15;text-decoration:none}.wordmark:hover{color:var(--ink)}.index-nav ul{gap:var(--space-10) var(--space-21);flex-wrap:wrap;display:flex}.header-end{align-items:center;gap:var(--space-10) var(--space-42);flex-wrap:wrap;display:flex}.theme-toggle{padding:var(--space-5);margin:calc(-1 * var(--space-5));color:var(--ink-muted);cursor:pointer;background:0 0;border:0;justify-content:center;align-items:center;display:inline-flex}.theme-toggle[hidden]{display:none}.theme-icon{width:20px;height:20px;display:block}.theme-icon-sun{display:none}@media (prefers-color-scheme:dark){:root:not([data-theme=light]) .theme-icon-moon{display:none}:root:not([data-theme=light]) .theme-icon-sun{display:block}}:root[data-theme=dark] .theme-icon-moon{display:none}:root[data-theme=dark] .theme-icon-sun{display:block}@media (hover:hover) and (pointer:fine){.theme-toggle:hover{color:var(--ink)}}.index-nav a{color:var(--ink-muted);border-bottom:2px solid #0000;font-size:15px;text-decoration:none}.index-nav a:hover,.index-nav a[aria-current=page]{color:var(--ink);border-bottom-color:var(--ink)}.index-nav a[aria-current=page]{border-bottom-color:var(--ink)}.section{gap:var(--space-21);padding:var(--space-84) 0 0;display:grid}.section>h2{font-size:30px;font-weight:400;line-height:1.1}.section-body{min-width:0}.hero{gap:var(--space-21);padding:var(--space-147) 0 var(--space-84);display:grid}.hero-actions{margin-top:var(--space-42)}.hero-portrait{aspect-ratio:1;object-fit:cover;object-position:top;border-radius:50%;width:100%;height:auto}.hero-wordmark{margin-top:var(--space-21)}.hero-github-section{margin-top:var(--space-84)}.hero-github-heading{margin-bottom:var(--space-21)}.hero-heatmap{margin-top:var(--space-42);display:none}@media (width>=48rem){.hero-heatmap{display:block}}.button{padding:var(--space-21);background:var(--slate-iris);color:var(--on-slate-iris);font-size:15px;line-height:1.2;text-decoration:none;display:inline-block}.button:hover{background:var(--ink);color:var(--paper)}.rows>*+*{border-top:1px solid var(--rule)}.hero,.section,.row{grid-template-columns:minmax(0,1fr)}.row{gap:var(--space-10);padding:var(--space-21) 0;display:grid}.row>*{min-width:0}.row-date{color:var(--charcoal);font-size:15px}.row-title{font-size:21px;font-weight:400;line-height:1.15}.row-meta{color:var(--charcoal);font-size:15px}.row ul:not(.tags){gap:var(--space-5);margin-top:var(--space-10);padding-left:var(--space-21);list-style:outside;display:grid}.tags{gap:var(--space-5);margin-top:var(--space-10);flex-wrap:wrap;display:flex}.tag{padding:var(--space-5) var(--space-10);border:1px solid var(--ink);font-size:15px;line-height:1.2}.contact-line{font-size:30px;font-weight:400;line-height:1.1}.site-footer{justify-content:space-between;gap:var(--space-10) var(--space-21);margin-top:var(--space-84);padding:var(--space-21) 0;border-top:1px solid var(--rule);color:var(--charcoal);flex-wrap:wrap;font-size:15px;display:flex}.site-footer p{gap:var(--space-5) var(--space-10);flex-wrap:wrap;display:flex}.hero-role,.contact-note{margin-top:var(--space-21)}.hero-lede,.row-summary{margin-top:var(--space-10)}@media (width>=48rem){html{font-size:17px}.hero,.section{grid-template-columns:200px 1fr}.row{gap:var(--space-21);grid-template-columns:10rem 1fr}.row-meta-col{grid-column:2}}@media (width<=47.99rem){.display-mono,.display{font-size:40px}.hero-identity{max-width:200px}.section>h2{font-size:30px}}.section-more{margin-top:var(--space-42)}.page-head{gap:var(--space-21);padding:var(--space-84) 0 0;grid-template-columns:minmax(0,1fr);display:grid}.page-head-count,.breadcrumb{color:var(--charcoal);font-size:15px;line-height:1.2}.page-head h1{text-wrap:balance}.page-head-lede{max-width:52ch;margin-top:var(--space-21);text-wrap:pretty}.breadcrumb ol{gap:var(--space-5);flex-wrap:wrap;margin:0;padding:0;list-style:none;display:flex}.breadcrumb li+li:before{content:"/";margin-right:var(--space-5);color:var(--ink-muted)}.filter{margin-top:var(--space-42)}.filter ul{gap:var(--space-10);flex-wrap:wrap;display:flex}.filter a{align-items:baseline;gap:var(--space-10);padding:var(--space-10) var(--space-21);border:1px solid var(--ink);color:var(--ink);font-size:15px;font-weight:400;line-height:1.2;text-decoration:none;display:inline-flex}.filter a:hover{color:var(--ink);text-decoration:underline}.filter-count{font-variant-numeric:tabular-nums}.gallery:not(:has(.kind:target)) .filter-all{background:var(--ink);color:var(--paper)}.gallery:has(.kind:target) .kind:not(:target){display:none}.gallery,.kind{scroll-margin-top:100vh}.kind-head{align-content:start;gap:var(--space-5);display:grid}.kind-head h2{font-size:30px;font-weight:400;line-height:1.1}.kind-count{color:var(--charcoal);font-size:15px;line-height:1.2}.kind-reset{margin-top:var(--space-10);font-size:15px;line-height:1.2;display:none}.kind:target .kind-reset{display:inline}.kind-body{min-width:0;container-type:inline-size}.card-grid{gap:var(--space-21);grid-template-columns:minmax(0,1fr);display:grid}.card{grid-row:span 2;grid-template-rows:subgrid;border:1px solid var(--ink);background:var(--paper);color:var(--ink);row-gap:0;display:grid;position:relative}.card-frame{--frame-ratio:62.5%;border-bottom:1px solid var(--ink);grid-row:1;align-items:flex-end;display:flex;position:relative;overflow:hidden}.card-frame:before{content:"";width:0;padding-top:var(--frame-ratio);flex:none}.card-frame picture{position:absolute;inset:0}.card-body{align-content:start;gap:var(--space-10);padding:var(--space-21);grid-row:2;display:grid}.card-frame picture,.card-image{width:100%;height:100%}.card-image{object-fit:cover;object-position:top}.card-frame-text{padding:var(--space-21);text-wrap:pretty;font-size:21px;font-weight:400;line-height:1.15}.card-title{text-wrap:balance;font-size:21px;font-weight:400;line-height:1.15}.card-title a{color:inherit;text-decoration:none}.card-title a:after{content:"";position:absolute;inset:0}.card:hover .card-title a{color:inherit;text-decoration:underline}.card-title a:focus-visible{outline:none}.card:has(.card-title a:focus-visible){outline:2px solid var(--focus);outline-offset:2px}.card-meta{color:var(--charcoal);font-size:15px;line-height:1.2}.card .tags{margin-top:var(--space-5)}.card-accent{background:var(--slate-iris);border-color:var(--slate-iris);color:var(--on-slate-iris)}.card-accent .card-frame{border-bottom-color:var(--on-slate-iris)}.card-accent .card-meta{color:var(--on-slate-iris)}.card-accent .tag{border-color:var(--on-slate-iris)}.tags-flush{margin-top:0}.link-list{gap:var(--space-5);display:grid}.project-title{max-width:18ch}.project-cover{margin-top:var(--space-84);border:1px solid var(--ink)}.project-cover img{width:100%;height:auto}.prose h2,.prose h3{margin-top:var(--space-42);font-size:21px;font-weight:400;line-height:1.15}.prose ul,.prose ol{margin:var(--space-21) 0 0;padding-left:var(--space-21);list-style:outside}.prose li+li{margin-top:var(--space-5)}@container (width>=34rem){.card-grid{grid-template-columns:repeat(2,minmax(0,1fr))}.card-lead{grid-column:span 2}.card-lead .card-frame{--frame-ratio:42.857%}.card-lead .card-frame-text{max-width:24ch;font-size:30px;line-height:1.1}}@container (width>=52rem){.card-grid{grid-template-columns:repeat(3,minmax(0,1fr))}.card-lead .card-frame{--frame-ratio:0%}}@media (width>=48rem){.page-head{grid-template-columns:200px 1fr}}@media (prefers-reduced-motion:no-preference){html{scroll-behavior:smooth}}.section:not(.kind){scroll-margin-top:var(--space-21)}.hero-github,.hero-github-fallback{transition:opacity var(--duration-reveal) var(--ease-out)}@starting-style{.hero-github,.hero-github-fallback{opacity:0}}.hero-wordmark{width:max-content}@media (prefers-reduced-motion:no-preference){.hero-wordmark{animation:.32s steps(4,end) .15s both wordmark-type}.wordmark-caret{animation:.5s step-end .47s 2 wordmark-blink}}@keyframes wordmark-type{0%{clip-path:inset(-50% 100% -50% 0)}to{clip-path:inset(-50% 0)}}@keyframes wordmark-blink{50%{opacity:0}}@view-transition{navigation:auto}.card-title,.project-title{view-transition-class:project-title}::view-transition-old(root){animation-duration:var(--duration-fade);animation-timing-function:var(--ease-out)}::view-transition-new(root){animation-duration:var(--duration-fade);animation-timing-function:var(--ease-out)}::view-transition-group(.project-title){animation-duration:var(--duration-page);animation-timing-function:var(--ease-out)}::view-transition-old(.project-title){display:none}::view-transition-new(.project-title){width:auto;height:100%;animation-duration:var(--duration-page)}@media (prefers-reduced-motion:reduce){.card-title,.project-title{view-transition-name:none!important}}.theme-switching :is(.card-title,.project-title){view-transition-name:none!important}.kind{transition:opacity var(--duration-fade) var(--ease-out)}@starting-style{.gallery:has(.kind:target) .kind:target{opacity:0}}@supports (animation-timeline:view()){.card{animation:card-in var(--ease-out) both;animation-timeline:view();animation-range:entry entry 35%}@media (prefers-reduced-motion:reduce){.card{animation-name:card-fade}}}@keyframes card-in{0%{opacity:0;transform:translateY(12px)}}@keyframes card-fade{0%{opacity:0}}@media (prefers-reduced-motion:no-preference){.button{transition:transform var(--duration-press) var(--ease-out)}.button:active{transform:scale(.97)}}@property --tw-rotate-x{syntax:"*";inherits:false}@property --tw-rotate-y{syntax:"*";inherits:false}@property --tw-rotate-z{syntax:"*";inherits:false}@property --tw-skew-x{syntax:"*";inherits:false}@property --tw-skew-y{syntax:"*";inherits:false}@property --tw-border-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-outline-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-blur{syntax:"*";inherits:false}@property --tw-brightness{syntax:"*";inherits:false}@property --tw-contrast{syntax:"*";inherits:false}@property --tw-grayscale{syntax:"*";inherits:false}@property --tw-hue-rotate{syntax:"*";inherits:false}@property --tw-invert{syntax:"*";inherits:false}@property --tw-opacity{syntax:"*";inherits:false}@property --tw-saturate{syntax:"*";inherits:false}@property --tw-sepia{syntax:"*";inherits:false}@property --tw-drop-shadow{syntax:"*";inherits:false}@property --tw-drop-shadow-color{syntax:"*";inherits:false}@property --tw-drop-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-drop-shadow-size{syntax:"*";inherits:false}@property --tw-ease{syntax:"*";inherits:false}
