@font-face{font-family:commit mono;src:url(/fonts/commit-mono-400.woff2)format("woff2");font-weight:400;font-display:swap}@font-face{font-family:commit mono;src:url(/fonts/commit-mono-700.woff2)format("woff2");font-weight:700;font-display:swap}:root{--bg:#fbfbf9;--fg:#1b1d21;--muted:#6b7280;--rule:#e5e5e0;--accent:#0f8a3c;--code-bg:#0e1014;--mono:"Commit Mono", ui-monospace, "JetBrains Mono", "Source Code Pro", Menlo, monospace;--sans:system-ui, -apple-system, "Segoe UI", sans-serif}@media(prefers-color-scheme:dark){:root{--bg:#0e1014;--fg:#e4e7ec;--muted:#8a93a3;--rule:#22262e;--accent:#3dff7a}}*{box-sizing:border-box}html{background:var(--bg);color:var(--fg);color-scheme:light dark;-webkit-text-size-adjust:100%;text-size-adjust:100%}body{margin:0 auto;max-width:42rem;padding:2.5rem max(1.25rem,env(safe-area-inset-right))4rem max(1.25rem,env(safe-area-inset-left));font:1.0625rem/1.7 var(--sans);overflow-wrap:break-word}a{color:inherit;text-decoration-color:var(--accent);text-underline-offset:.2em;-webkit-tap-highlight-color:transparent}a:active{color:var(--accent)}@media(hover:hover){a:hover{color:var(--accent)}}header.site{display:flex;flex-wrap:wrap;justify-content:space-between;align-items:center;gap:.5rem 1.5rem;margin-bottom:3rem;font-family:var(--mono);font-size:.9rem}header.site .name{display:inline-flex;align-items:center;gap:.6rem;font-weight:700;text-decoration:none}header.site .mark{width:32px;height:32px;border-radius:50%;object-fit:cover}.cursor{display:inline-block;width:.55em;height:1.05em;margin-left:.15em;vertical-align:-.15em;background:var(--accent);animation:blink 1.1s steps(1)infinite}@keyframes blink{50%{opacity:0}}@media(prefers-reduced-motion:reduce){.cursor{animation:none}}header.site .short{display:none}nav{display:flex;align-items:center;margin-right:-.5rem}nav a{color:var(--muted);text-decoration:none;padding:.6rem .5rem;line-height:1}.intro{color:var(--muted);margin:0 0 2.5rem}h1,h2,h3{line-height:1.3}h1{font-size:1.75rem;margin:0 0 .25rem}.year h2{font:600 .85rem var(--mono);color:var(--muted);margin:2rem 0 .5rem}ul.posts{list-style:none;padding:0;margin:0}ul.posts li{display:flex;gap:1rem;padding:.35rem 0;border-bottom:1px solid var(--rule)}ul.posts time,.meta{font:.85rem/1.6 var(--mono);color:var(--muted)}ul.posts time{min-width:4.5rem;padding-top:.15rem;white-space:nowrap}article header{margin-bottom:2rem}article img{max-width:100%;height:auto;border-radius:6px}code{font:.9em var(--mono)}:not(pre)>code{background:var(--rule);padding:.1em .35em;border-radius:4px}pre{padding:1rem;border:1px solid var(--rule);border-radius:6px;overflow-x:auto;background:var(--code-bg)!important;line-height:1.5}blockquote{margin:1.5rem 0;padding-left:1rem;border-left:3px solid var(--accent);color:var(--muted)}hr{border:0;border-top:1px solid var(--rule);margin:2.5rem 0}footer.site{margin-top:4rem;padding-top:1rem;border-top:1px solid var(--rule);font:.8rem var(--mono);color:var(--muted)}.avatar{display:block;width:160px;height:160px;border-radius:50%;object-fit:cover;margin-bottom:1.5rem}form.contact{display:grid;gap:1rem;margin:1rem 0 .5rem}form.contact label{display:grid;gap:.3rem;font:.85rem var(--mono);color:var(--muted)}form.contact input,form.contact textarea{font:1rem var(--sans);color:var(--fg);background:0 0;border:1px solid var(--rule);border-radius:6px;padding:.6rem .75rem;min-height:2.75rem;width:100%}form.contact textarea{resize:vertical}form.contact input:focus,form.contact textarea:focus{outline:2px solid var(--accent);outline-offset:1px}form.contact button{justify-self:start;font:700 .9rem var(--mono);cursor:pointer;color:var(--bg);background:var(--fg);border:0;border-radius:6px;padding:.6rem 1.25rem;min-height:2.75rem}form.contact button:active{background:var(--accent)}@media(hover:hover){form.contact button:hover{background:var(--accent)}}form.contact .hp{position:absolute;left:-9999px}dl.setup{margin:0}dl.setup dt{margin-top:1rem;font:700 1rem var(--mono)}dl.setup dd{margin:.2rem 0 0}table{width:100%;border-collapse:collapse;margin:1rem 0 1.5rem;font-size:.95rem}th,td{text-align:left;vertical-align:top;padding:.45rem 1rem .45rem 0;border-bottom:1px solid var(--rule)}th{font:600 .8rem var(--mono);color:var(--muted)}td:first-child code,td:nth-child(2) code{white-space:nowrap}body.wide{max-width:66rem}.docs{display:grid;grid-template-columns:14rem minmax(0,42rem);gap:3.5rem;align-items:start}.docs-nav{position:sticky;top:1.5rem;max-height:calc(100vh - 3rem);overflow-y:auto;font:.85rem/1.4 var(--mono)}.docs-nav-title{color:var(--muted);margin:.4rem 0 .75rem}.docs-nav nav{display:block;margin:0}.docs-nav ul{list-style:none;margin:0;padding:0}.docs-nav ul ul{margin:.15rem 0 .6rem;padding-left:.75rem;border-left:1px solid var(--rule)}.docs-nav a{display:block;padding:.25rem 0;line-height:1.4;color:var(--fg);text-decoration:none}.docs-nav ul ul a{color:var(--muted)}.docs-nav a[aria-current]{color:var(--accent)}@media(hover:hover){.docs-nav a:hover{color:var(--accent)}}.docs h2{margin-top:3rem;padding-top:2rem;border-top:1px solid var(--rule)}.docs h2,.docs h3{scroll-margin-top:1.5rem}header.project .logo,ul.projects .logo{display:block;border-radius:0}header.project .logo{margin-bottom:1rem}.lede{color:var(--muted);font-size:1.15rem;margin:.5rem 0 1rem}.links{display:flex;gap:1.25rem;margin:0;font:.85rem var(--mono)}ul.projects{list-style:none;padding:0;margin:2rem 0 0}ul.projects li{display:flex;gap:1rem;padding:1.25rem 0;border-top:1px solid var(--rule)}ul.projects li>div{min-width:0}ul.projects .logo{flex:none;width:40px;height:40px}ul.projects h2{font:700 1rem var(--mono);margin:.45rem 0 .25rem}ul.projects p{margin:0}ul.projects .meta{display:flex;gap:1rem;margin-top:.35rem}@media(max-width:56rem){.docs{grid-template-columns:minmax(0,1fr);gap:1.5rem}.docs-nav{position:static;max-height:none;padding-bottom:1rem;border-bottom:1px solid var(--rule)}.docs-nav ul ul{display:none}.docs-nav nav>ul{display:flex;flex-wrap:wrap;gap:0 1.25rem}}@media(max-width:30rem){body{padding-top:1.5rem;padding-bottom:3rem}header.site{margin-bottom:2rem;gap:.5rem 1rem}header.site .full{display:none}header.site .short{display:inline}nav .not-phone{display:none}nav{margin-inline:-.4rem}nav a{padding-inline:.4rem}.avatar{width:128px;height:128px}ul,ol{padding-left:1.25rem}ul.posts li{flex-direction:column;gap:0;padding:.6rem 0}ul.posts time{min-width:0;padding-top:0}form.contact button{justify-self:stretch}table{display:block;overflow-x:auto}}@media(max-width:23.75rem){header.site .mark{display:none}}