:root{--banner-height:44px;--sticky-top-offset:var(--banner-height);--toc-anchor-offset:96px;--font-serif:"Linux Libertine", Georgia, "Times New Roman", serif;--bg:#f6f6f6;--paper:#fff;--ink:#202122;--ink-muted:#54595d;--line:#a2a9b1;--line-soft:#c8ccd1;--accent:#0645ad;--accent-visited:#0b0080;--panel:#f8f9fa;--banner-top:#f9fbff;--banner-bottom:#f2f5fa;--hover-bg:#eaf3ff}html[data-theme=light]{--bg:#f6f6f6;--paper:#fff;--ink:#202122;--ink-muted:#54595d;--line:#a2a9b1;--line-soft:#c8ccd1;--accent:#0645ad;--accent-visited:#0b0080;--panel:#f8f9fa;--banner-top:#f9fbff;--banner-bottom:#f2f5fa}html[data-theme=dark]{--lightningcss-light: ;--lightningcss-dark:initial;color-scheme:dark;--bg:#15171a;--paper:#1f2328;--ink:#e6e9ee;--ink-muted:#a8b0bb;--line:#536070;--line-soft:#3d4652;--accent:#79a9ff;--accent-visited:#a9b7ff;--panel:#232830;--banner-top:#222831;--banner-bottom:#1b2027;--hover-bg:#2f3948}html[data-theme=accessible]{--bg:#fff;--paper:#fff;--ink:#000;--ink-muted:#111;--line:#111;--line-soft:#2a2a2a;--accent:#0030a8;--accent-visited:indigo;--panel:#ededed;--banner-top:#f5f5f5;--banner-bottom:#e8e8e8;--hover-bg:#d9e6ff}@media (prefers-color-scheme:dark){html[data-theme=system]{--lightningcss-light: ;--lightningcss-dark:initial;color-scheme:dark;--bg:#15171a;--paper:#1f2328;--ink:#e6e9ee;--ink-muted:#a8b0bb;--line:#536070;--line-soft:#3d4652;--accent:#79a9ff;--accent-visited:#a9b7ff;--panel:#232830;--banner-top:#222831;--banner-bottom:#1b2027;--hover-bg:#2f3948}}.skip-to-content{z-index:999;background:var(--bg);color:var(--ink);border:2px solid var(--accent);border-radius:4px;padding:.5rem 1rem;font-size:.9rem;text-decoration:none;position:absolute;top:-100%;left:1rem}.skip-to-content:focus{top:.5rem}*{box-sizing:border-box}html,body{color:var(--ink);background:var(--bg);margin:0;padding:0;font-family:sans-serif;font-size:14.5px;overflow-x:hidden}html{scroll-padding-top:calc(var(--banner-height) + var(--toc-anchor-offset))}a{color:var(--accent);text-decoration:none}a:visited{color:var(--accent-visited)}a:hover{text-decoration:underline}.wiki-root.theme-accessible{letter-spacing:.01em}.wiki-root.theme-accessible .wiki-content p,.wiki-root.theme-accessible .wiki-content li,.wiki-root.theme-accessible .discussion-meta,.wiki-root.theme-accessible .toc,.wiki-root.theme-accessible .wiki-sidebar,.wiki-root.theme-accessible .entry-table th,.wiki-root.theme-accessible .entry-table td,.wiki-root.theme-accessible .appearance-panel{line-height:1.72}.wiki-root.theme-accessible.text-small .wiki-content p,.wiki-root.theme-accessible.text-small .wiki-content li,.wiki-root.theme-accessible.text-small .discussion-meta,.wiki-root.theme-accessible.text-small .toc,.wiki-root.theme-accessible.text-small .wiki-sidebar,.wiki-root.theme-accessible.text-small .entry-table th,.wiki-root.theme-accessible.text-small .entry-table td,.wiki-root.theme-accessible.text-small .appearance-panel{font-size:1rem}.wiki-root.theme-accessible.text-standard .wiki-content p,.wiki-root.theme-accessible.text-standard .wiki-content li,.wiki-root.theme-accessible.text-standard .discussion-meta,.wiki-root.theme-accessible.text-standard .toc,.wiki-root.theme-accessible.text-standard .wiki-sidebar,.wiki-root.theme-accessible.text-standard .entry-table th,.wiki-root.theme-accessible.text-standard .entry-table td,.wiki-root.theme-accessible.text-standard .appearance-panel{font-size:1.08rem}.wiki-root.theme-accessible.text-large .wiki-content p,.wiki-root.theme-accessible.text-large .wiki-content li,.wiki-root.theme-accessible.text-large .discussion-meta,.wiki-root.theme-accessible.text-large .toc,.wiki-root.theme-accessible.text-large .wiki-sidebar,.wiki-root.theme-accessible.text-large .entry-table th,.wiki-root.theme-accessible.text-large .entry-table td,.wiki-root.theme-accessible.text-large .appearance-panel{font-size:1.18rem}.wiki-root.theme-accessible h1{font-size:clamp(2.2rem,4.6vw,3rem)}.wiki-root.theme-accessible .wiki-heading{border-bottom-width:2px;font-size:1.85rem}.wiki-root.theme-accessible .toc h2,.wiki-root.theme-accessible .wiki-sidebar h2,.wiki-root.theme-accessible .appearance-panel h2{font-size:1.12rem}.wiki-root.theme-accessible a{text-underline-offset:2px;text-decoration:underline;text-decoration-thickness:2px}a:focus-visible,button:focus-visible,input:focus-visible,textarea:focus-visible{outline:2px solid var(--accent);outline-offset:2px}.wiki-root.theme-accessible a:focus-visible,.wiki-root.theme-accessible input:focus-visible{outline-offset:2px;outline:3px solid #000}.wiki-root.theme-accessible .entry-table th,.wiki-root.theme-accessible .entry-table td,.wiki-root.theme-accessible .discussion-card,.wiki-root.theme-accessible .toc,.wiki-root.theme-accessible .infobox{border-width:2px}.wiki-root{background:var(--bg);min-height:100vh;overflow:visible}.wiki-banner{border-top:1px solid var(--line-soft);border-bottom:1px solid var(--line-soft);background:linear-gradient(180deg, var(--banner-top) 0%, var(--banner-bottom) 100%);height:var(--banner-height);z-index:1000;align-items:center;padding:0 1rem;display:flex;position:fixed;top:0;left:0;right:0}.wiki-banner-inner{justify-content:flex-end;align-items:center;width:min(1450px,100%);height:100%;margin:0 auto;display:flex;position:relative}.mobile-appearance-toggle,.mobile-appearance-menu{display:none}.wiki-page{width:min(1450px,100%);padding-top:var(--banner-height);grid-template-columns:190px minmax(0,1fr) 220px;margin:0 auto;display:grid;overflow:visible}.wiki-root.width-standard .wiki-page{width:min(1450px,100%)}.wiki-root.width-wide .wiki-page{width:min(1700px,100%)}.wiki-sidebar{max-height:calc(100vh - var(--banner-height));background:var(--bg);z-index:65;align-self:start;padding:1rem .7rem 2rem;font-size:.82rem;position:sticky;overflow:auto;top:var(--banner-height)!important}.wiki-sidebar h2{margin:0 0 .45rem;font-size:.84rem;font-weight:700}.wiki-sidebar ul{margin:0;padding:0;list-style:none}.wiki-sidebar li{margin-bottom:.42rem}.wiki-content{background:var(--paper);border-right:1px solid var(--line-soft);grid-column:2;min-height:calc(100vh - 3.35rem);padding:.95rem 1.5rem 2rem}.wiki-sidebar+.wiki-content{border-left:1px solid var(--line-soft)}.article-tabs{border-bottom:1px solid var(--line-soft);top:var(--banner-height);z-index:900;background:var(--paper);justify-content:space-between;gap:.75rem;margin-bottom:.6rem;padding-top:2px;display:flex;position:sticky}@media (min-width:1081px){.wiki-page{align-items:start}.wiki-sidebar,.appearance-panel{transform:translateZ(0)}}.article-tabs-left,.article-tabs-right{align-items:flex-end;gap:.12rem;display:flex}.article-tabs a{color:var(--accent);border:1px solid var(--line-soft);background:var(--panel);border-bottom:0;padding:.55rem .8rem;font-size:.95rem}.article-tabs a.active,.article-tabs .active{color:var(--ink);border-color:var(--line-soft);background:var(--paper);border-style:solid solid none;border-width:1px 1px 0;border-bottom-color:currentColor;padding:.55rem .8rem;font-size:.95rem;display:inline-block}.page-header{border-bottom:1px solid var(--line-soft);margin-bottom:1rem;padding-bottom:.75rem;position:static}.page-header.no-divider{border-bottom:0;margin-bottom:.8rem;padding-bottom:0}.eyebrow{color:var(--ink-muted);text-transform:uppercase;letter-spacing:.05em;margin:0;font-size:.8rem}h1{font-family:var(--font-serif);margin:.2rem 0 .35rem;font-size:clamp(1.9rem,4vw,2.5rem);font-weight:400;line-height:1.2}.lede{color:var(--ink);max-width:82ch;margin:0;font-size:1.05rem;line-height:1.65}.entry-meta{color:var(--ink-muted);flex-wrap:wrap;gap:.7rem;margin-top:.5rem;margin-bottom:.7rem;font-size:.85rem;display:flex}.infobox{float:right;border:1px solid var(--line);background:var(--panel);width:min(248px,100%);margin:0 0 1rem 1rem;padding:.55rem}.infobox h2{text-align:center;font-size:1rem;font-family:var(--font-serif);margin:0 0 .45rem;font-weight:700}.infobox-image{margin:0 0 .5rem}.infobox-image img{border:1px solid var(--line);background:#78a8b8;width:100%;max-width:230px;height:auto;margin:0 auto;display:block}.infobox-image figcaption{margin-top:.2rem;font-size:.78rem}.fact-row{border-top:1px solid #dbe0e7;padding:.4rem 0}.fact-row:first-child{border-top:0;padding-top:0}.fact-row dt{margin-bottom:.12rem;font-size:.8rem;font-weight:700}.fact-row dd{margin:0;font-size:.92rem}.toc{border:1px solid var(--line);background:linear-gradient(180deg, var(--paper) 0%, var(--panel) 100%);border-radius:6px;width:min(360px,100%);min-width:240px;margin:1rem 0 1.15rem;padding:.7rem .85rem;font-size:.9rem;box-shadow:0 1px #0000000a}.toc h2{letter-spacing:.02em;text-transform:uppercase;color:var(--ink-muted);border-bottom:0;margin:0 0 .45rem;padding-bottom:0;font-size:.95rem}.toc ol{margin:0;padding-left:1.15rem}.toc li{margin:.45rem 0;padding-left:.12rem}.toc a{border-radius:4px;padding:.16rem .34rem;line-height:1.4;display:inline-block}.toc a:hover{background:var(--hover-bg);text-decoration:none}.wiki-content section+section{margin-top:1.15rem}.wiki-content section[id],.wiki-content .wiki-heading[id],.wiki-content [data-sidebar-link=true][id]{scroll-margin-top:calc(var(--banner-height) + var(--toc-anchor-offset))}#experience article+article{border-top:1px solid var(--line-soft);margin-top:1.35rem;padding-top:1.35rem}#experience article:first-of-type{margin-top:.9rem}#experience article p{margin:0 0 .55rem}#experience{padding-bottom:1.4rem}.wiki-heading{font-family:var(--font-serif);border-bottom:1px solid var(--line-soft);margin:0 0 .62rem;padding-bottom:.12rem;font-size:1.56rem;font-weight:400}.wiki-heading.no-rule{box-shadow:none;border-bottom:0;padding-bottom:0}section:target .wiki-heading,.wiki-heading:target,.projects-year-heading:target{animation:1s ease-out wiki-heading-rule-flash}@keyframes wiki-heading-rule-flash{0%{border-bottom-color:#f0c34a;box-shadow:inset 0 -2px #f0c34a}to{border-bottom-color:var(--line-soft);box-shadow:none}}.wiki-content p,.wiki-content li{font-size:1rem;line-height:1.65}.wiki-root.text-small .wiki-content p,.wiki-root.text-small .wiki-content li,.wiki-root.text-small .wiki-sidebar,.wiki-root.text-small .toc,.wiki-root.text-small .entry-table th,.wiki-root.text-small .entry-table td{font-size:.9rem}.wiki-root.text-standard .wiki-content p,.wiki-root.text-standard .wiki-content li,.wiki-root.text-standard .wiki-sidebar,.wiki-root.text-standard .toc,.wiki-root.text-standard .entry-table th,.wiki-root.text-standard .entry-table td{font-size:1rem}.wiki-root.text-large .wiki-content p,.wiki-root.text-large .wiki-content li,.wiki-root.text-large .wiki-sidebar,.wiki-root.text-large .toc,.wiki-root.text-large .entry-table th,.wiki-root.text-large .entry-table td{font-size:1.08rem}.entry-table{border-collapse:collapse;width:100%;margin-top:.5rem}.entry-table th,.entry-table td{border:1px solid var(--line);text-align:left;padding:.5rem;font-size:.89rem}.entry-table thead{background:var(--panel)}.breadcrumb{margin:0 0 .7rem}.breadcrumb ol{scrollbar-width:none;flex-wrap:nowrap;align-items:center;gap:.42rem;margin:0;padding:0;list-style:none;display:flex;overflow-x:auto}.breadcrumb ol::-webkit-scrollbar{display:none}.breadcrumb li{white-space:nowrap;align-items:center;gap:.42rem;min-width:0;display:inline-flex}.breadcrumb a,.breadcrumb span{color:var(--ink-muted);font-size:.78rem;font-weight:400;line-height:1.2}.breadcrumb a{text-underline-offset:3px}.breadcrumb li:last-child>span{color:var(--ink);font-weight:600}.breadcrumb-sep{color:var(--ink-muted);opacity:.82;align-items:center;display:inline-flex}.breadcrumb-sep-icon{width:.86rem;height:.86rem;display:block}.references{margin:.35rem 0 0}.references li{margin-bottom:.24rem}.discussion-note h3{font-family:var(--font-serif);margin:.2rem 0 .35rem;font-size:1.15rem;font-weight:600}.discussion-meta{color:var(--ink-muted);margin:0;font-size:.9rem}.discussion-list{gap:.8rem;display:grid}.wiki-card{border:1px solid var(--line-soft);background:var(--paper);border-radius:0;padding:.58rem .78rem .62rem;transition:border-color .14s,box-shadow .14s;position:relative}.wiki-card:not(:has(.wiki-card-link)){opacity:.55}.wiki-card:hover{border-color:var(--line);box-shadow:inset 0 0 0 1px var(--line-soft)}.wiki-card-link{z-index:1;position:absolute;inset:0}.wiki-card-content{position:relative}.discussion-card h3{margin:.12rem 0 .22rem;line-height:1.32}.discussion-card h3 a{text-underline-offset:2px;border-radius:0;padding:0;display:inline-block}.discussion-card h3 a:hover{color:var(--accent);background:0 0;text-decoration:underline}.discussion-card p:last-child{margin-bottom:0}.discussion-card:target{animation:1.1s ease-out discussion-target-flash}@keyframes discussion-target-flash{0%{box-shadow:inset 0 0 0 2px #f0c34a}to{box-shadow:none}}.article-markdown p,.article-markdown li{font-size:1rem;line-height:1.48}.contact-form{gap:.42rem;max-width:760px;margin-top:.2rem;display:grid}.contact-form label{font-size:.9rem;font-weight:600}.contact-form input,.contact-form textarea{border:1px solid var(--line);background:var(--paper);width:100%;color:var(--ink);font:inherit;border-radius:2px;padding:.5rem .55rem}.contact-form textarea{resize:vertical}.contact-form button{border:1px solid var(--line);background:var(--panel);color:var(--ink);cursor:pointer;font:inherit;justify-self:start;padding:.45rem .8rem}.contact-form button[disabled]{opacity:.7;cursor:not-allowed}.contact-honeypot{opacity:0;pointer-events:none;position:absolute;left:-10000px}.contact-toast{right:1rem;top:calc(var(--sticky-top-offset) + .6rem);border:1px solid var(--line);background:linear-gradient(180deg, var(--paper) 0%, var(--panel) 100%);width:auto;max-width:min(480px,100vw - 2.5rem);color:var(--ink);z-index:70;padding:.78rem .88rem;font-size:.98rem;line-height:1.5;position:fixed;box-shadow:0 2px 8px #0000001f}.contact-toast.ok{border-left:4px solid #2f6f44}.contact-toast.error{border-left:4px solid #9b1b1b}.projects-grid{gap:.8rem;display:grid}.projects-filter{border:1px solid var(--line-soft);background:var(--panel);align-items:center;gap:.16rem;margin:0 0 .7rem;display:inline-flex}.projects-filter a{color:var(--accent);padding:.24rem .54rem;font-size:.86rem;display:inline-block}.projects-filter a.active{background:var(--paper);color:var(--ink);text-decoration:none}.projects-year-group+.projects-year-group{margin-top:1rem}.projects-year-heading{font-family:var(--font-serif);border-bottom:1px solid var(--line-soft);margin:0 0 .4rem;padding-bottom:.12rem;font-size:1.1rem;font-weight:600}.project-card h3{font-family:var(--font-serif);color:var(--accent-visited);margin:.03rem 0 0;font-size:1.08rem;font-weight:600}.project-head{justify-content:space-between;align-items:flex-start;gap:.6rem;display:flex}.project-head h3{margin:.03rem 0 0}.project-head h3 a,.project-head h3 a:visited{color:var(--accent-visited)}.project-head-actions{z-index:2;align-items:center;gap:.33rem;display:flex;position:relative}.project-card>p{color:var(--ink);margin:.05rem 0 .46rem}.project-discussion-action{z-index:2;color:#000;filter:drop-shadow(0 0 1px #000000a6);justify-content:center;align-items:center;width:22px;height:22px;line-height:1;text-decoration:none;transition:color .12s;display:inline-flex;position:absolute;bottom:.18rem;right:0}.project-discussion-action svg{width:20px;height:20px}.project-discussion-action:hover{color:var(--accent);text-decoration:none}.project-oss-icon{z-index:2;color:#000;filter:drop-shadow(0 0 1px #000000a6);justify-content:center;align-items:center;width:20px;height:20px;margin-top:.12rem;transition:color .12s;display:inline-flex;position:relative}.project-oss-icon svg{width:17px;height:17px}.project-oss-icon:hover{color:var(--accent)}.project-status-dot:after,.project-discussion-action:after,.project-oss-icon:after{content:attr(data-tooltip);white-space:nowrap;border:1px solid var(--line-soft);background:var(--paper);color:var(--ink);opacity:0;pointer-events:none;z-index:90;border-radius:2px;padding:.08rem .32rem;font-size:.72rem;transition:opacity .12s;position:absolute;top:50%;right:calc(100% + .38rem);transform:translateY(-50%);box-shadow:0 1px 2px #0000001f}.project-status-dot{border:0;border-radius:999px;flex:none;width:15px;height:15px;margin-top:.18rem;position:relative}html[data-theme=dark] .project-oss-icon,html[data-theme=dark] .project-discussion-action{color:var(--ink)}@media (prefers-color-scheme:dark){html[data-theme=system] .project-oss-icon,html[data-theme=system] .project-discussion-action{color:var(--ink)}}.project-status-dot:hover:after,.project-discussion-action:hover:after,.project-oss-icon:hover:after{opacity:1}.project-status-dot.working{background:#d6b600}.project-status-dot.shipped{background:#208a3d}.project-status-dot.canceled{background:#b33030}.project-status-dot.offline{background:#999}.project-stack{flex-wrap:wrap;gap:.22rem;margin:.14rem 0 0;display:flex}.project-chip{border:1px solid var(--line-soft);background:var(--panel);color:var(--ink);border-radius:2px;padding:.06rem .34rem;font-size:.72rem;line-height:1.2;display:inline-block}.project-card:hover .project-chip-vibecoded{background:linear-gradient(var(--paper), var(--paper)) padding-box, repeating-linear-gradient(90deg, #ff003c 0%, #ff8a00 16.66%, #ffd500 33.33%, #00c853 50%, #00b0ff 66.66%, #7c4dff 83.33%, #ff003c 100%) border-box;background-size:100% 100%,200% 100%;border-color:#0000;animation:2.4s linear infinite vibecoded-rainbow-slide}@keyframes vibecoded-rainbow-slide{0%{background-position:0 0,0 0}to{background-position:0 0,-200% 0}}.article-markdown h2,.article-markdown h3,.article-markdown h4{font-family:var(--font-serif);margin:.82rem 0 .34rem}.article-markdown h2{font-size:1.52rem}.article-markdown h3{font-size:1.26rem}.article-markdown h4{font-size:1.08rem}.article-markdown ul,.article-markdown ol{margin:.18rem 0 .48rem;padding-left:1.25rem}.article-markdown pre{background:var(--panel);border:1px solid var(--line-soft);margin:.4rem 0 .62rem;padding:.7rem;overflow-x:auto}.article-markdown code{font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace;font-size:.88rem}.article-markdown hr{border:0;border-top:1px solid var(--line-soft);margin:1rem 0}.article-markdown .article-image{float:right;clear:right;border:1px solid var(--line-soft);background:var(--paper);width:min(620px,100%);margin:.2rem 0 .9rem 1rem;padding:3px}.article-markdown .article-image img{border:1px solid var(--line-soft);background:var(--paper);width:100%;height:auto;display:block}.article-markdown .article-image figcaption{color:var(--ink-muted);margin-top:.24rem;font-size:.78rem;line-height:1.4}@media (max-width:1080px){.article-markdown .article-image{float:none;width:100%;margin:.55rem 0 .85rem}}.appearance-panel{border-right:1px solid var(--line-soft);border-left:1px solid var(--line-soft);background:var(--panel);max-height:calc(100vh - var(--banner-height));z-index:65;grid-column:3;align-self:start;padding:1rem .75rem;font-size:.84rem;overflow:auto;top:var(--banner-height)!important;position:sticky!important}.wiki-sidebar{grid-column:1}.appearance-panel h2{margin:0;font-size:.95rem}.appearance-group{border-top:1px solid var(--line-soft);margin-top:.6rem;padding-top:.6rem}.appearance-group p{color:var(--ink-muted);margin:0 0 .3rem}.appearance-group label{margin-bottom:.28rem;display:block}@media (max-width:1080px){:root{--toc-anchor-offset:132px}.wiki-page{padding-top:0}.wiki-banner{align-items:stretch;height:auto;padding:.7rem 1rem;position:sticky}.wiki-banner-inner{flex-direction:column;align-items:stretch;width:100%;height:auto;display:flex}.mobile-appearance-toggle{border:1px solid var(--line-soft);background:var(--paper);color:var(--ink);font:inherit;cursor:pointer;align-self:flex-end;padding:.22rem .5rem;font-size:.88rem;display:inline-block}.mobile-appearance-menu{border-top:1px solid var(--line-soft);border-bottom:1px solid var(--line-soft);z-index:60;width:100%;box-shadow:none;background:0 0;border-left:0;border-right:0;margin-top:.38rem;padding:.42rem 0 .45rem;display:block;position:relative;top:auto;left:auto;right:auto}.mobile-appearance-menu .appearance-group{margin-top:.4rem;padding-top:.4rem}.mobile-appearance-menu .appearance-group:first-child{border-top:0;margin-top:0;padding-top:0}.wiki-page{grid-template-columns:1fr}.wiki-sidebar,.appearance-panel{display:none}.wiki-content{border-left:0;border-right:0;padding:1rem}.infobox{float:none;width:100%;margin:0 0 1rem}.article-tabs{flex-flow:wrap;align-items:flex-end;gap:.35rem}}@media (min-width:1081px){.wiki-sidebar{width:190px;height:calc(100vh - var(--banner-height));max-height:calc(100vh - var(--banner-height));left:calc(50vw - min(1450px,100vw)/2);overflow:auto;top:var(--banner-height)!important;position:fixed!important}.appearance-panel{width:220px;height:calc(100vh - var(--banner-height));max-height:calc(100vh - var(--banner-height));right:calc(50vw - min(1450px,100vw)/2);overflow:auto;top:var(--banner-height)!important;position:fixed!important}.wiki-root.width-wide .wiki-sidebar{left:calc(50vw - min(1700px,100vw)/2)}.wiki-root.width-wide .appearance-panel{right:calc(50vw - min(1700px,100vw)/2)}}
