@font-face{font-family:Newsreader;font-style:normal;font-weight:200 800;font-display:swap;src:url(/_next/static/media/b5963afcf1479527-s.woff2) format("woff2");unicode-range:u+0102-0103,u+0110-0111,u+0128-0129,u+0168-0169,u+01a0-01a1,u+01af-01b0,u+0300-0301,u+0303-0304,u+0308-0309,u+0323,u+0329,u+1ea0-1ef9,u+20ab}@font-face{font-family:Newsreader;font-style:normal;font-weight:200 800;font-display:swap;src:url(/_next/static/media/5ed7d4ff5e59016d-s.woff2) format("woff2");unicode-range:u+0100-02ba,u+02bd-02c5,u+02c7-02cc,u+02ce-02d7,u+02dd-02ff,u+0304,u+0308,u+0329,u+1d00-1dbf,u+1e00-1e9f,u+1ef2-1eff,u+2020,u+20a0-20ab,u+20ad-20c4,u+2113,u+2c60-2c7f,u+a720-a7ff}@font-face{font-family:Newsreader;font-style:normal;font-weight:200 800;font-display:swap;src:url(/_next/static/media/84adbee2f2a7cb50-s.p.woff2) format("woff2");unicode-range:u+00??,u+0131,u+0152-0153,u+02bb-02bc,u+02c6,u+02da,u+02dc,u+0304,u+0308,u+0329,u+2000-206f,u+20ac,u+2122,u+2191,u+2193,u+2212,u+2215,u+feff,u+fffd}@font-face{font-family:Newsreader Fallback;src:local("Times New Roman");ascent-override:69.68%;descent-override:25.12%;line-gap-override:0.00%;size-adjust:105.48%}.__className_47c7a6{font-family:Newsreader,Newsreader Fallback;font-style:normal}.__variable_47c7a6{--font-newsreader:"Newsreader","Newsreader Fallback"}@font-face{font-family:IBM Plex Mono;font-style:normal;font-weight:400;font-display:swap;src:url(/_next/static/media/58f386aa6b1a2a92-s.woff2) format("woff2");unicode-range:u+0460-052f,u+1c80-1c8a,u+20b4,u+2de0-2dff,u+a640-a69f,u+fe2e-fe2f}@font-face{font-family:IBM Plex Mono;font-style:normal;font-weight:400;font-display:swap;src:url(/_next/static/media/011e180705008d6f-s.woff2) format("woff2");unicode-range:u+0301,u+0400-045f,u+0490-0491,u+04b0-04b1,u+2116}@font-face{font-family:IBM Plex Mono;font-style:normal;font-weight:400;font-display:swap;src:url(/_next/static/media/7ba5fb2a8c88521c-s.woff2) format("woff2");unicode-range:u+0102-0103,u+0110-0111,u+0128-0129,u+0168-0169,u+01a0-01a1,u+01af-01b0,u+0300-0301,u+0303-0304,u+0308-0309,u+0323,u+0329,u+1ea0-1ef9,u+20ab}@font-face{font-family:IBM Plex Mono;font-style:normal;font-weight:400;font-display:swap;src:url(/_next/static/media/92eeb95d069020cc-s.woff2) format("woff2");unicode-range:u+0100-02ba,u+02bd-02c5,u+02c7-02cc,u+02ce-02d7,u+02dd-02ff,u+0304,u+0308,u+0329,u+1d00-1dbf,u+1e00-1e9f,u+1ef2-1eff,u+2020,u+20a0-20ab,u+20ad-20c4,u+2113,u+2c60-2c7f,u+a720-a7ff}@font-face{font-family:IBM Plex Mono;font-style:normal;font-weight:400;font-display:swap;src:url(/_next/static/media/d3ebbfd689654d3a-s.p.woff2) format("woff2");unicode-range:u+00??,u+0131,u+0152-0153,u+02bb-02bc,u+02c6,u+02da,u+02dc,u+0304,u+0308,u+0329,u+2000-206f,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(/_next/static/media/ef4d5661765d0e49-s.woff2) format("woff2");unicode-range:u+0460-052f,u+1c80-1c8a,u+20b4,u+2de0-2dff,u+a640-a69f,u+fe2e-fe2f}@font-face{font-family:IBM Plex Mono;font-style:normal;font-weight:500;font-display:swap;src:url(/_next/static/media/d29838c109ef09b4-s.woff2) format("woff2");unicode-range:u+0301,u+0400-045f,u+0490-0491,u+04b0-04b1,u+2116}@font-face{font-family:IBM Plex Mono;font-style:normal;font-weight:500;font-display:swap;src:url(/_next/static/media/e40af3453d7c920a-s.woff2) format("woff2");unicode-range:u+0102-0103,u+0110-0111,u+0128-0129,u+0168-0169,u+01a0-01a1,u+01af-01b0,u+0300-0301,u+0303-0304,u+0308-0309,u+0323,u+0329,u+1ea0-1ef9,u+20ab}@font-face{font-family:IBM Plex Mono;font-style:normal;font-weight:500;font-display:swap;src:url(/_next/static/media/99dcf268bda04fe5-s.woff2) format("woff2");unicode-range:u+0100-02ba,u+02bd-02c5,u+02c7-02cc,u+02ce-02d7,u+02dd-02ff,u+0304,u+0308,u+0329,u+1d00-1dbf,u+1e00-1e9f,u+1ef2-1eff,u+2020,u+20a0-20ab,u+20ad-20c4,u+2113,u+2c60-2c7f,u+a720-a7ff}@font-face{font-family:IBM Plex Mono;font-style:normal;font-weight:500;font-display:swap;src:url(/_next/static/media/98e207f02528a563-s.p.woff2) format("woff2");unicode-range:u+00??,u+0131,u+0152-0153,u+02bb-02bc,u+02c6,u+02da,u+02dc,u+0304,u+0308,u+0329,u+2000-206f,u+20ac,u+2122,u+2191,u+2193,u+2212,u+2215,u+feff,u+fffd}@font-face{font-family:IBM Plex Mono Fallback;src:local("Arial");ascent-override:76.16%;descent-override:20.43%;line-gap-override:0.00%;size-adjust:134.59%}.__className_9f0762{font-family:IBM Plex Mono,IBM Plex Mono Fallback;font-style:normal}.__variable_9f0762{--font-ibm-plex-mono:"IBM Plex Mono","IBM Plex Mono Fallback"}@font-face{font-family:Noto Sans Canadian Aboriginal;font-style:normal;font-weight:100 900;font-display:swap;src:url(/_next/static/media/d18c6f873ad7f70e-s.p.woff2) format("woff2");unicode-range:u+02c7,u+02d8-02d9,u+02db,u+0307,u+1400-167f,u+18b0-18f5,u+25cc,u+11ab?}@font-face{font-family:Noto Sans Canadian Aboriginal;font-style:normal;font-weight:100 900;font-display:swap;src:url(/_next/static/media/22b1f3cb9d822c13-s.woff2) format("woff2");unicode-range:u+0302-0303,u+0305,u+0307-0308,u+0310,u+0312,u+0315,u+031a,u+0326-0327,u+032c,u+032f-0330,u+0332-0333,u+0338,u+033a,u+0346,u+034d,u+0391-03a1,u+03a3-03a9,u+03b1-03c9,u+03d1,u+03d5-03d6,u+03f0-03f1,u+03f4-03f5,u+2016-2017,u+2034-2038,u+203c,u+2040,u+2043,u+2047,u+2050,u+2057,u+205f,u+2070-2071,u+2074-209f,u+20d0-20dc,u+20e1,u+20e5-20ef,u+2100-2112,u+2114-2115,u+2117-2121,u+2123-214f,u+2190,u+2192,u+2194-21ae,u+21b0-21e5,u+21f1-21f2,u+21f4-2211,u+2213-2214,u+2216-22ff,u+2308-230b,u+2310,u+2319,u+231c-2321,u+2336-237a,u+237c,u+2395,u+239b-23b7,u+23d0,u+23dc-23e1,u+2474-2475,u+25af,u+25b3,u+25b7,u+25bd,u+25c1,u+25ca,u+25cc,u+25fb,u+266d-266f,u+27c0-27ff,u+2900-2aff,u+2b0e-2b11,u+2b30-2b4c,u+2bfe,u+3030,u+ff5b,u+ff5d,u+1d400-1d7ff,u+1ee??}@font-face{font-family:Noto Sans Canadian Aboriginal;font-style:normal;font-weight:100 900;font-display:swap;src:url(/_next/static/media/64a77fe3b6037ffa-s.woff2) format("woff2");unicode-range:u+0001-000c,u+000e-001f,u+007f-009f,u+20dd-20e0,u+20e2-20e4,u+2150-218f,u+2190,u+2192,u+2194-2199,u+21af,u+21e6-21f0,u+21f3,u+2218-2219,u+2299,u+22c4-22c6,u+2300-243f,u+2440-244a,u+2460-24ff,u+25a0-27bf,u+28??,u+2921-2922,u+2981,u+29bf,u+29eb,u+2b??,u+4dc0-4dff,u+fff9-fffb,u+10140-1018e,u+10190-1019c,u+101a0,u+101d0-101fd,u+102e0-102fb,u+10e60-10e7e,u+1d2c0-1d2d3,u+1d2e0-1d37f,u+1f0??,u+1f100-1f1ae,u+1f1e6-1f1ff,u+1f30d-1f30f,u+1f315,u+1f31c,u+1f31e,u+1f320-1f32c,u+1f336,u+1f378,u+1f37d,u+1f382,u+1f393-1f39f,u+1f3a7-1f3a8,u+1f3ac-1f3af,u+1f3c2,u+1f3c4-1f3c6,u+1f3ca-1f3ce,u+1f3d4-1f3e0,u+1f3ed,u+1f3f1-1f3f3,u+1f3f5-1f3f7,u+1f408,u+1f415,u+1f41f,u+1f426,u+1f43f,u+1f441-1f442,u+1f444,u+1f446-1f449,u+1f44c-1f44e,u+1f453,u+1f46a,u+1f47d,u+1f4a3,u+1f4b0,u+1f4b3,u+1f4b9,u+1f4bb,u+1f4bf,u+1f4c8-1f4cb,u+1f4d6,u+1f4da,u+1f4df,u+1f4e3-1f4e6,u+1f4ea-1f4ed,u+1f4f7,u+1f4f9-1f4fb,u+1f4fd-1f4fe,u+1f503,u+1f507-1f50b,u+1f50d,u+1f512-1f513,u+1f53e-1f54a,u+1f54f-1f5fa,u+1f610,u+1f650-1f67f,u+1f687,u+1f68d,u+1f691,u+1f694,u+1f698,u+1f6ad,u+1f6b2,u+1f6b9-1f6ba,u+1f6bc,u+1f6c6-1f6cf,u+1f6d3-1f6d7,u+1f6e0-1f6ea,u+1f6f0-1f6f3,u+1f6f7-1f6fc,u+1f700-1f80b,u+1f810-1f847,u+1f850-1f859,u+1f860-1f887,u+1f890-1f8ad,u+1f8b0-1f8bb,u+1f8c0-1f8c1,u+1f8d0-1f8d8,u+1f900-1f90b,u+1f93b,u+1f946,u+1f984,u+1f996,u+1f9e9,u+1fa00-1fa6f,u+1fa70-1fa7c,u+1fa80-1fac6,u+1fac8,u+1facc-1fadd,u+1fadf-1faeb,u+1faef-1fafa,u+1fb??}@font-face{font-family:Noto Sans Canadian Aboriginal;font-style:normal;font-weight:100 900;font-display:swap;src:url(/_next/static/media/dcb651833bb6798c-s.woff2) format("woff2");unicode-range:u+0100-02ba,u+02bd-02c5,u+02c7-02cc,u+02ce-02d7,u+02dd-02ff,u+0304,u+0308,u+0329,u+1d00-1dbf,u+1e00-1e9f,u+1ef2-1eff,u+2020,u+20a0-20ab,u+20ad-20c4,u+2113,u+2c60-2c7f,u+a720-a7ff}@font-face{font-family:Noto Sans Canadian Aboriginal;font-style:normal;font-weight:100 900;font-display:swap;src:url(/_next/static/media/413053e69924d224-s.woff2) format("woff2");unicode-range:u+00??,u+0131,u+0152-0153,u+02bb-02bc,u+02c6,u+02da,u+02dc,u+0304,u+0308,u+0329,u+2000-206f,u+20ac,u+2122,u+2191,u+2193,u+2212,u+2215,u+feff,u+fffd}@font-face{font-family:Noto Sans Canadian Aboriginal Fallback;src:local("Arial");ascent-override:99.49%;descent-override:27.27%;line-gap-override:0.00%;size-adjust:107.45%}.__className_49d1e4{font-family:Noto Sans Canadian Aboriginal,Noto Sans Canadian Aboriginal Fallback;font-style:normal}.__variable_49d1e4{--font-syllabics:"Noto Sans Canadian Aboriginal","Noto Sans Canadian Aboriginal Fallback"}@property --shift-t{syntax:"<number>";inherits:false;initial-value:0}:root{--bg:#f2f0ea;--fg:#171715;--muted:#6d6b64;--faint:#b0aea6;--rule:color-mix(in srgb,var(--fg) 14%,transparent);--gutter:clamp(1.15rem,5vw,3.5rem);--measure:70rem;--ease-out:cubic-bezier(0.22,1,0.36,1);color-scheme:light}html.dark{--bg:#10100f;--fg:#ebe8e1;--muted:#929088;--faint:#4a4944;--rule:color-mix(in srgb,var(--fg) 15%,transparent);color-scheme:dark}*,:after,:before{box-sizing:border-box}html{min-height:100%;scroll-behavior:smooth;scroll-padding-top:1.5rem;text-size-adjust:100%}body,html{background:var(--bg)}body{margin:0;min-height:100vh;color:var(--fg);font-family:var(--font-newsreader),"Iowan Old Style","Palatino Linotype",Georgia,serif;font-size:1.125rem;line-height:1.55;font-optical-sizing:auto;font-feature-settings:"kern";font-kerning:normal;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;text-rendering:optimizeLegibility}a{text-decoration:none}a,button{color:inherit}button{font:inherit}::selection{background:var(--fg);color:var(--bg)}:focus-visible{outline:1px solid var(--fg);outline-offset:4px}.site-body{display:flex;min-height:100vh;flex-direction:column}.site-main{flex:1 1}.page-transition{animation:page-arrive .26s var(--ease-out) both}@keyframes page-arrive{0%{opacity:0;transform:translateY(6px)}to{opacity:1;transform:translateY(0)}}.wrap{width:100%;max-width:calc(var(--measure) + var(--gutter) * 2);margin-inline:auto;padding-inline:var(--gutter)}.mono{font-family:var(--font-ibm-plex-mono),"SFMono-Regular",Consolas,monospace;font-size:.75rem;line-height:1.5;letter-spacing:.01em;font-feature-settings:"tnum";font-variant-numeric:tabular-nums}.site-header{display:flex;min-height:5.25rem;align-items:center;justify-content:space-between;gap:1.5rem;border-bottom:1px solid var(--rule)}.desktop-nav{display:flex}.mobile-controls,.mobile-menu{display:none}.page-wrap{width:min(100%,56rem);margin-inline:auto;padding:clamp(3.5rem,10vw,7rem) var(--gutter) clamp(4.5rem,10vw,7rem)}.page-intro{margin-bottom:clamp(2.5rem,7vw,4.5rem)}.eyebrow{margin-bottom:1.25rem;color:var(--muted);text-transform:lowercase}.page-intro h1{font-size:clamp(3.25rem,10vw,7rem);font-weight:300;line-height:.96;letter-spacing:-.045em;text-wrap:balance}.home-lede,.page-lede{max-width:37rem;margin-top:1.25rem;color:var(--muted);font-size:clamp(1.2rem,2.5vw,1.55rem);line-height:1.4;text-wrap:pretty}.intro-list{border-top:1px solid var(--rule)}.intro-row{display:grid;grid-template-columns:minmax(6rem,.28fr) minmax(0,1fr);grid-gap:clamp(1rem,4vw,3rem);gap:clamp(1rem,4vw,3rem);padding-block:1.1rem 1.2rem;border-bottom:1px solid var(--rule)}.intro-row dt{padding-top:.3rem;color:var(--muted)}.intro-row dd{margin:0}.intro-row dd p+p{color:var(--muted)}.skills-section{margin-top:clamp(3.5rem,9vw,6rem)}.section-heading{padding-bottom:.8rem;border-bottom:1px solid var(--rule);color:var(--muted)}.skills-list{margin:0;padding:0;list-style:none}.skills-list li{padding-block:.65rem;border-bottom:1px solid var(--rule);color:var(--muted)}.home-cta,.text-page-link{margin-top:2.25rem;font-family:var(--font-ibm-plex-mono),"SFMono-Regular",Consolas,monospace;font-size:.85rem}.text-page{max-width:52rem;min-height:55vh}.text-page .page-intro{margin-bottom:2rem}.prose-copy{max-width:43rem;font-size:clamp(1.3rem,3vw,1.8rem);line-height:1.55;text-wrap:pretty}.contact-list{border-top:1px solid var(--rule)}.contact-row{display:grid;grid-template-columns:minmax(6rem,.28fr) minmax(0,1fr);grid-gap:clamp(1rem,4vw,3rem);gap:clamp(1rem,4vw,3rem);align-items:baseline;padding-block:1.1rem;border-bottom:1px solid var(--rule)}.contact-row h2{margin:0;color:var(--muted);font-weight:400}.contact-row a{width:-moz-fit-content;width:fit-content;overflow-wrap:anywhere;font-size:clamp(1.05rem,2.4vw,1.35rem)}.contact-email,.copy-email{display:flex;align-items:center;gap:.75rem}.copy-email-button{min-width:44px;min-height:44px;padding:.5rem;border:1px solid var(--rule);background:transparent;color:var(--muted);cursor:pointer;transition:border-color .2s ease,color .2s ease}.copy-email-button:hover{border-color:var(--fg);color:var(--fg)}.copy-email-feedback{color:var(--muted);font-size:.68rem}.contact-placeholder{color:var(--muted);font-family:var(--font-ibm-plex-mono),"SFMono-Regular",Consolas,monospace;font-size:.72rem}.not-found-page{display:flex;min-height:58vh;flex-direction:column;justify-content:center}.not-found-page h1{font-size:clamp(3.25rem,10vw,7rem);font-weight:300;line-height:.96;letter-spacing:-.045em;text-wrap:balance}.not-found-code{margin-bottom:.6rem;color:var(--muted)}.not-found-page p:not(.not-found-code){max-width:28rem;margin-top:1.25rem;color:var(--muted)}.not-found-page .link{margin-top:1.8rem;font-family:var(--font-ibm-plex-mono),"SFMono-Regular",Consolas,monospace;font-size:.85rem}.work-page{width:min(100%,64rem)}.project-list{margin:0;padding:0;border-top:1px solid var(--rule);list-style:none}.project-entry{padding-block:clamp(1.5rem,4.5vw,2.6rem);border-bottom:1px solid var(--rule);transition:opacity .35s ease}.project-meta{display:flex;flex-wrap:wrap;gap:.5rem 1.25rem;margin-bottom:.7rem;color:var(--muted)}.project-name{margin:0;font-size:clamp(2rem,5vw,3.25rem);font-weight:350;line-height:1.08;letter-spacing:-.025em;transition:font-style .2s ease}.project-tagline{margin-top:.3rem;font-size:clamp(1.05rem,2.4vw,1.35rem)}.project-description{max-width:43rem;margin-top:.45rem;color:var(--muted);text-wrap:pretty}.project-link{display:inline-block;margin-top:.8rem;color:var(--muted)}@media (hover:hover){.project-list:has(.project-entry:hover) .project-entry:not(:hover){opacity:.32}.project-entry:hover .project-name{font-style:italic}}.github-section{margin-top:clamp(4.5rem,11vw,7.5rem);padding-top:clamp(2rem,5vw,3.25rem);border-top:1px solid var(--rule)}.github-section-header{display:flex;align-items:flex-end;justify-content:space-between;gap:1.5rem;margin-bottom:2rem}.github-section-header .eyebrow{margin-bottom:.5rem}.github-section-header h2{margin:0;font-size:clamp(2.6rem,7vw,4rem);font-weight:300;line-height:1;letter-spacing:-.04em}.github-muted,.github-snapshot-note,.github-updated{color:var(--muted)}.github-snapshot-note{margin-top:.75rem;font-size:.68rem}.github-updated{padding-bottom:.35rem;text-align:right}.github-overview{display:grid;grid-template-columns:1.15fr .85fr 1fr;grid-gap:clamp(1.25rem,4vw,3rem);gap:clamp(1.25rem,4vw,3rem);padding-block:1.4rem;border-block:1px solid var(--rule)}.github-number{font-size:clamp(2.6rem,6.5vw,4.6rem);font-weight:300;line-height:1;letter-spacing:-.04em;font-feature-settings:"tnum";font-variant-numeric:tabular-nums}.github-label{margin:0;color:var(--muted)}.github-contribution .github-label,.github-repo-count .github-label{margin-top:.45rem}.github-languages ul{margin:.55rem 0 0;padding:0;list-style:none}.github-languages li{display:flex;justify-content:space-between;gap:.75rem;padding-block:.12rem}.github-languages .github-muted,.github-recent>.github-muted{margin-top:.55rem;font-size:.95rem}.github-recent{margin-top:2.5rem}.github-recent>.github-label{padding-bottom:.7rem;border-bottom:1px solid var(--rule)}.github-repo-list{margin:0;padding:0;list-style:none}.github-repo{padding-block:1.15rem;border-bottom:1px solid var(--rule)}.github-repo-heading{display:flex;align-items:baseline;justify-content:space-between;gap:1rem}.github-repo-name{font-size:clamp(1.35rem,3vw,1.8rem);letter-spacing:-.015em}.github-repo-heading .github-muted{flex:none}.github-repo-description{margin-top:.15rem;color:var(--muted);text-wrap:pretty}.github-repo-meta{display:flex;gap:1rem;margin-top:.4rem;color:var(--muted);font-size:.68rem}.blog-lane+.blog-lane{margin-top:clamp(2.5rem,7vw,4rem)}.blog-list{margin:0;padding:0;list-style:none}.blog-entry{border-bottom:1px solid var(--rule);transition:opacity .35s ease}.blog-entry-link{display:block;padding-block:clamp(1.1rem,3vw,1.6rem)}.blog-entry-meta{display:flex;flex-wrap:wrap;gap:.4rem 1.1rem;color:var(--muted)}.blog-entry-title{margin:.3rem 0 0;font-size:clamp(1.5rem,3.5vw,2.1rem);font-weight:350;line-height:1.12;letter-spacing:-.02em;transition:font-style .2s ease}.blog-entry-description{max-width:38rem;margin-top:.3rem;color:var(--muted);text-wrap:pretty}.blog-empty{padding-block:1.1rem;border-bottom:1px solid var(--rule);color:var(--muted);font-style:italic}.blog-feed-link{margin-top:2.25rem}.post-meta{display:flex;flex-wrap:wrap;gap:.4rem 1.1rem;margin-top:1.5rem;color:var(--muted)}.blog-post .blog-prose{margin-top:clamp(2.5rem,6vw,3.5rem)}.blog-prose{max-width:43rem;font-size:clamp(1.1rem,2.2vw,1.28rem);line-height:1.62;text-wrap:pretty}.blog-prose>*+*{margin-top:1.35em}.blog-prose h2{margin-top:2.4em;margin-bottom:0;font-size:clamp(1.6rem,3.6vw,2.1rem);font-weight:350;line-height:1.14;letter-spacing:-.025em}.blog-prose h3{margin-top:2em;margin-bottom:0;font-size:clamp(1.3rem,3vw,1.55rem);font-weight:400;letter-spacing:-.015em}.blog-prose ol,.blog-prose ul{padding-left:1.35em}.blog-prose li+li{margin-top:.5em}.blog-prose li::marker{color:var(--muted)}.blog-prose blockquote{padding-left:1.1rem;border-left:1px solid var(--rule);color:var(--muted);font-style:italic}.blog-prose strong{font-weight:600}.blog-prose code{padding:.12em .32em;background:color-mix(in srgb,var(--fg) 8%,transparent);font-family:var(--font-ibm-plex-mono),"SFMono-Regular",Consolas,monospace;font-size:.82em}.blog-prose img{display:block;max-width:100%;height:auto;margin-inline:auto}.blog-prose div:has(>img+img),.blog-prose p:has(>img+img){display:flex;flex-wrap:wrap;align-items:center;justify-content:center;gap:.5rem}.blog-prose div:has(>img+img) img,.blog-prose p:has(>img+img) img{flex:none;width:3.25rem;height:3.25rem;margin-inline:0;object-fit:cover}.blog-prose input[type=checkbox]{width:.95em;height:.95em;margin-right:.45em;accent-color:var(--fg);vertical-align:baseline}.blog-prose li:has(>input[type=checkbox]){list-style:none;margin-left:-1.35em;padding-left:1.35em}.code-block{position:relative;margin-block:1.75em;background:color-mix(in srgb,var(--fg) 94%,transparent);color:var(--bg)}.code-block-head{display:flex;align-items:center;justify-content:space-between;gap:1rem;padding:.45rem .35rem .45rem .9rem;border-bottom:1px solid color-mix(in srgb,var(--bg) 22%,transparent);color:color-mix(in srgb,var(--bg) 72%,transparent)}.code-block-copy{min-width:44px;min-height:44px;padding:.4rem .55rem;border:0;background:transparent;color:inherit;cursor:pointer;transition:color .2s ease}.code-block-copy:hover{color:var(--bg)}.code-block-body{margin:0;padding:.95rem .9rem 1.1rem;overflow-x:auto;font-family:var(--font-ibm-plex-mono),"SFMono-Regular",Consolas,monospace;font-size:.82rem;line-height:1.65;-moz-tab-size:2;tab-size:2}.code-block-body code{padding:0;background:transparent;font-size:inherit}.code-block-feedback{position:absolute;top:.5rem;right:3.4rem;color:color-mix(in srgb,var(--bg) 72%,transparent)}.post-pagination{display:grid;grid-template-columns:repeat(auto-fit,minmax(min(100%,14rem),1fr));grid-gap:0 2rem;gap:0 2rem;margin-top:clamp(3rem,8vw,5rem);padding-top:1.2rem;border-top:1px solid var(--rule)}.post-pagination-link{display:flex;flex-direction:column;gap:.3rem;padding-block:.85rem;color:var(--muted)}.post-pagination-link.is-older{text-align:right}.post-pagination-title{color:var(--fg);text-wrap:balance;transition:font-style .2s ease}@media (hover:hover){.blog-list:has(.blog-entry:hover) .blog-entry:not(:hover){opacity:.32}.blog-entry:hover .blog-entry-title,.post-pagination-link:hover .post-pagination-title{font-style:italic}}@media (max-width:38rem){.post-pagination{grid-template-columns:1fr}.post-pagination-link.is-older{text-align:left}}@media print{.blog-feed-link,.code-block-copy,.code-block-feedback,.mobile-controls,.post-pagination,.site-footer,.site-header,.skip-link{display:none!important}body{background:#fff;color:#000;font-size:11pt}.page-wrap{width:100%;max-width:none;padding:0}.blog-prose{max-width:none;font-size:11pt}.page-intro h1{font-size:22pt}.blog-prose a{text-decoration:underline}.blog-prose a[href^=http]:after{content:" (" attr(href) ")";font-size:8pt;word-break:break-all}.code-block{background:#fff;color:#000;border:1px solid #999;page-break-inside:avoid;break-inside:avoid}.code-block-head{color:#000;border-bottom-color:#999}.code-block-body{white-space:pre-wrap}.code-block,h2,h3,img{page-break-inside:avoid;break-inside:avoid}}.wordmark{flex:none;font-family:var(--font-syllabics),"Noto Sans Canadian Aboriginal","Segoe UI Historic","Euphemia UCAS",sans-serif;font-size:1rem;line-height:1;letter-spacing:.04em}.footer-socials,.site-nav{display:flex;align-items:center;gap:clamp(.75rem,2.7vw,1.6rem);color:var(--muted)}.theme-toggle{display:grid;width:44px;height:44px;flex:none;place-items:center;margin:-.35rem -.45rem -.35rem 0;padding:0;border:0;background:transparent;cursor:pointer}.theme-glyph{width:1.15rem;height:1.15rem;overflow:visible;transition:transform .35s var(--ease-out)}.theme-disc{fill:var(--bg);transition:fill .25s ease,stroke .25s ease}.theme-disc,.theme-split{stroke:currentColor;stroke-width:1.2}.theme-split{transition:stroke .25s ease}.theme-toggle.is-dark .theme-glyph{transform:rotate(180deg)}@media (hover:hover){.theme-toggle:hover .theme-glyph{transform:rotate(180deg)}.theme-toggle.is-dark:hover .theme-glyph{transform:rotate(0)}.theme-toggle:hover .theme-disc{fill:var(--fg)}.theme-toggle:hover .theme-split{stroke:var(--bg)}}.link{width:-moz-fit-content;width:fit-content;padding-bottom:1px;background:linear-gradient(currentColor,currentColor) no-repeat 0 100% /0 1px;transition:color .25s ease,background-size .4s var(--ease-out)}.link:focus-visible,.link:hover{color:var(--fg);background-size:100% 1px}.site-footer{padding-top:1.2rem;padding-bottom:1.5rem;border-top:1px solid var(--rule);color:var(--muted)}.footer-bottom,.footer-main{display:flex;align-items:center;justify-content:space-between;gap:1rem}.footer-bottom{margin-top:1.1rem;padding-top:.9rem;border-top:1px solid var(--rule);font-size:.68rem}.footer-top{white-space:nowrap}.skip-link{position:fixed;z-index:100;top:.75rem;left:.75rem;padding:.6rem .8rem;transform:translateY(-160%);background:var(--fg);color:var(--bg)}.skip-link:focus{transform:translateY(0)}.mobile-menu{position:fixed;z-index:90;inset:0;display:flex;visibility:hidden;flex-direction:column;padding:clamp(1.25rem,5vw,2rem) var(--gutter);transform:translateY(-.75rem);background:var(--bg);opacity:0;pointer-events:none;transition:opacity .24s ease,transform .24s var(--ease-out),visibility .24s}.mobile-menu.is-open{visibility:visible;transform:translateY(0);opacity:1;pointer-events:auto}.mobile-menu-head{display:flex;min-height:2.5rem;align-items:center;justify-content:space-between}.menu-close,.menu-open{min-width:44px;min-height:44px;padding:.5rem;border:0;background:transparent;color:var(--muted);cursor:pointer}.mobile-menu-links{display:flex;flex:1 1;flex-direction:column;justify-content:center;gap:.35rem;padding-block:2rem}.mobile-menu-links a{width:-moz-fit-content;width:fit-content;font-size:clamp(3rem,14vw,5.75rem);font-weight:300;line-height:1.08;letter-spacing:-.04em}.mobile-menu-note{color:var(--muted)}::view-transition-new(root),::view-transition-old(root){animation:none;mix-blend-mode:normal}@keyframes ink-columns{0%{--shift-t:0}to{--shift-t:1}}@media (max-width:38rem){.site-header{min-height:4.5rem;gap:.75rem}.page-wrap{padding-top:3.5rem;padding-bottom:4.5rem}.contact-row,.intro-row{grid-template-columns:1fr;gap:.35rem}.intro-row dt{padding-top:0}.contact-row{gap:.15rem}.github-section-header{align-items:flex-start;flex-direction:column;gap:.65rem}.github-updated{text-align:left}.github-overview{grid-template-columns:1fr 1fr;row-gap:1.5rem}.github-languages{grid-column:1/-1}.github-repo-heading{align-items:flex-start;flex-direction:column;gap:.2rem}.text-page{min-height:60vh}.footer-main{flex-wrap:wrap}.footer-tagline{order:3;flex-basis:100%}.footer-bottom{align-items:flex-start;flex-direction:column}.footer-socials{flex-wrap:wrap;gap:.5rem 1rem}}@media (max-width:51rem){.desktop-nav{display:none}.mobile-controls{display:flex;align-items:center;gap:.65rem}}@media (min-width:51.001rem){.mobile-menu{display:none}}@media (prefers-reduced-motion:reduce){html{scroll-behavior:auto}*,:after,:before{scroll-behavior:auto!important;transition-duration:.01ms!important;animation-duration:.01ms!important;animation-iteration-count:1!important}.page-transition{animation:none}}