@font-face{font-family:Fira Sans;font-style:normal;font-display:swap;font-weight:400;src:url(./fira-sans-latin-400-normal.a0AnQzuD.woff2)format("woff2"),url(./fira-sans-latin-400-normal.66xCkunx.woff)format("woff")}@font-face{font-family:Fira Sans;font-style:normal;font-display:swap;font-weight:400;src:url(./fira-sans-latin-ext-400-normal.BLG_mAEf.woff2)format("woff2"),url(./fira-sans-latin-ext-400-normal.BCUwhuGB.woff)format("woff")}@font-face{font-family:Fira Sans;font-style:normal;font-display:swap;font-weight:500;src:url(./fira-sans-latin-500-normal.Bvbxc8ch.woff2)format("woff2"),url(./fira-sans-latin-500-normal.Bkfzcwmr.woff)format("woff")}@font-face{font-family:Fira Sans;font-style:normal;font-display:swap;font-weight:500;src:url(./fira-sans-latin-ext-500-normal.OO1QnNpY.woff2)format("woff2"),url(./fira-sans-latin-ext-500-normal.CFRf4jcC.woff)format("woff")}@font-face{font-family:Fira Sans;font-style:normal;font-display:swap;font-weight:600;src:url(./fira-sans-latin-600-normal.CXKlxLG9.woff2)format("woff2"),url(./fira-sans-latin-600-normal.DtSgd811.woff)format("woff")}@font-face{font-family:Fira Sans;font-style:normal;font-display:swap;font-weight:600;src:url(./fira-sans-latin-ext-600-normal.DTQBTt1m.woff2)format("woff2"),url(./fira-sans-latin-ext-600-normal.DLMQsaV4.woff)format("woff")}:root{--bg:#fff;--surface:#f4f4f4;--text:#111;--text-muted:#5c5c5c;--line:#d9d9d9;--font-sans:"Fira Sans", "Segoe UI", sans-serif;--max-width:1140px;--gutter:40px;--lightningcss-light:initial;--lightningcss-dark: ;color-scheme:light}*,:after,:before{box-sizing:border-box}html{scroll-behavior:smooth;-webkit-text-size-adjust:100%;scroll-padding-top:24px}body{background:var(--bg);color:var(--text);font-family:var(--font-sans);margin:0;font-size:16px;line-height:1.6}h1,h2,h3,p,ul{margin:0;padding:0}h1,h2,h3{font-weight:600;line-height:1.2}ul{list-style:none}a{color:inherit;text-underline-offset:3px;text-decoration:underline;text-decoration-thickness:1px}a:hover{text-decoration-thickness:2px}button{font:inherit}img,video{max-width:100%;display:block}:focus-visible{outline:2px solid var(--text);outline-offset:3px}.wrap{width:100%;max-width:var(--max-width);padding-inline:var(--gutter);margin-inline:auto}.skip-link{z-index:100;background:var(--text);color:var(--bg);padding:12px 20px;position:fixed;top:12px;left:12px;transform:translateY(-150%)}.skip-link:focus{color:var(--bg);transform:translateY(0)}@media (width<=700px){:root{--gutter:20px}}@media (prefers-reduced-motion:reduce){html{scroll-behavior:auto}}.site-header[data-v-7f5609a6]{justify-content:flex-end;min-height:64px}.site-header[data-v-7f5609a6],.site-nav[data-v-7f5609a6]{align-items:center;display:flex}.site-nav[data-v-7f5609a6]{gap:24px}.site-nav a[data-v-7f5609a6]{align-items:center;min-height:44px;font-size:15px;text-decoration:none;display:inline-flex}.site-nav a[data-v-7f5609a6]:hover{text-decoration:underline}.hero[data-v-3331fc3a]{padding-block:40px 64px}.hero h1[data-v-3331fc3a]{font-size:40px}.hero__role[data-v-3331fc3a]{color:var(--text-muted);margin-top:6px}.hero__intro[data-v-3331fc3a]{max-width:60ch;margin-top:24px;font-size:18px}@media (width<=700px){.hero[data-v-3331fc3a]{padding-block:24px 48px}.hero h1[data-v-3331fc3a]{font-size:32px}.hero__intro[data-v-3331fc3a]{font-size:17px}}.embed__frame[data-v-ebd362d5]{border:1px solid var(--line);background:var(--surface);position:relative;overflow:hidden}.embed__iframe[data-v-ebd362d5],.embed__poster[data-v-ebd362d5]{width:100%;height:100%;position:absolute;inset:0}.embed__poster[data-v-ebd362d5]{-o-object-fit:cover;object-fit:cover;-o-object-position:top left;object-position:top left}.embed__iframe[data-v-ebd362d5]{background:var(--bg);opacity:0;border:0}.embed__iframe--ready[data-v-ebd362d5]{opacity:1}.embed__start[data-v-ebd362d5]{border:1px solid var(--text-muted);background:var(--bg);min-height:44px;color:var(--text);cursor:pointer;padding:8px 16px;position:absolute;top:50%;left:50%;transform:translate(-50%,-50%)}.embed__start[data-v-ebd362d5]:hover{background:var(--surface)}.embed__status[data-v-ebd362d5]{background:var(--bg);color:var(--text-muted);padding:2px 8px;font-size:13px;position:absolute;bottom:10px;right:12px}.embed__open[data-v-ebd362d5]{margin-top:10px;font-size:14px}.media[data-v-1fbeb601]{background:#f4f4f4;position:relative}.media--preview[data-v-1fbeb601]{aspect-ratio:16/10;overflow:hidden}.media__item[data-v-1fbeb601]{-o-object-fit:cover;object-fit:cover;width:100%;height:100%}.media__controls[data-v-1fbeb601]{gap:8px;display:flex;position:absolute;bottom:16px;right:16px}.media__toggle[data-v-1fbeb601]{border:1px solid var(--text-muted);color:var(--text);cursor:pointer;background:#fff;min-height:44px;padding:8px 16px}.media__toggle[data-v-1fbeb601]:hover{background:#f4f4f4}.media__placeholder[data-v-1fbeb601]{min-height:300px;color:var(--text-muted);place-items:center;font-size:14px;display:grid}.diagram[data-v-11614d0e]{width:100%;height:auto;font-family:var(--font-sans);display:block}.box[data-v-11614d0e]{fill:#fff}.box[data-v-11614d0e],.frame[data-v-11614d0e]{stroke:#999;stroke-width:1px}.frame[data-v-11614d0e]{fill:none;stroke-dasharray:5 4}.schema[data-v-11614d0e]{fill:var(--surface);stroke:#bbb;stroke-width:1px}.line[data-v-11614d0e]{stroke:#666;stroke-width:1.2px;fill:none}.thin[data-v-11614d0e]{stroke:#aaa}.dash[data-v-11614d0e]{stroke-dasharray:4 3}.t[data-v-11614d0e]{fill:var(--text);font-size:15px;font-weight:600}.s[data-v-11614d0e],.t[data-v-11614d0e]{text-anchor:middle}.s[data-v-11614d0e]{fill:var(--text-muted);font-size:12px}.start[data-v-11614d0e]{text-anchor:start}.diagram[data-v-309dc74b]{width:100%;height:auto;font-family:var(--font-sans);display:block}.box[data-v-309dc74b]{stroke:#999}.box[data-v-309dc74b],.note[data-v-309dc74b]{fill:#fff;stroke-width:1px}.note[data-v-309dc74b]{stroke:#bbb;stroke-dasharray:3 3}.lifeline[data-v-309dc74b]{stroke:#ccc;stroke-width:1px;stroke-dasharray:4 4}.line[data-v-309dc74b]{stroke:#666;stroke-width:1.2px;fill:none}.dash[data-v-309dc74b]{stroke-dasharray:4 3}.t[data-v-309dc74b]{fill:var(--text);font-size:14px;font-weight:600}.s[data-v-309dc74b],.t[data-v-309dc74b]{text-anchor:middle}.s[data-v-309dc74b]{fill:var(--text-muted);font-size:12px}.diagram[data-v-737d2f9a]{width:100%;height:auto;font-family:var(--font-sans);display:block}.box[data-v-737d2f9a]{fill:#fff;stroke:#999;stroke-width:1px}.line[data-v-737d2f9a]{stroke:#666;stroke-width:1.2px;fill:none;marker-end:url(#itemp-arrow)}.title[data-v-737d2f9a]{fill:var(--text);font-size:15px;font-weight:600}.label[data-v-737d2f9a],.title[data-v-737d2f9a]{text-anchor:middle}.label[data-v-737d2f9a]{fill:var(--text-muted);font-size:12px}.diagram[data-v-689f3a56]{width:100%;height:auto;font-family:var(--font-sans);display:block}.box[data-v-689f3a56]{fill:#fff;stroke:#999;stroke-width:1px}.line[data-v-689f3a56]{stroke:#666;stroke-width:1.2px;fill:none;marker-end:url(#tracker-arrow)}.line.both[data-v-689f3a56]{marker-start:url(#tracker-arrow)}.title[data-v-689f3a56]{fill:var(--text);font-size:15px;font-weight:600}.label[data-v-689f3a56],.title[data-v-689f3a56]{text-anchor:middle}.label[data-v-689f3a56]{fill:var(--text-muted);font-size:12px}.label.start[data-v-689f3a56]{text-anchor:start}.label.end[data-v-689f3a56]{text-anchor:end}.diagram[data-v-4de422cf]{width:100%;height:auto;font-family:var(--font-sans);display:block}.box[data-v-4de422cf]{fill:#fff;stroke:#999;stroke-width:1px}.line[data-v-4de422cf]{stroke:#666;stroke-width:1.2px;fill:none;marker-end:url(#subtr-arrow)}.line.dash[data-v-4de422cf]{stroke-dasharray:4 3}.title[data-v-4de422cf]{fill:var(--text);font-size:15px;font-weight:600}.label[data-v-4de422cf],.title[data-v-4de422cf]{text-anchor:middle}.label[data-v-4de422cf]{fill:var(--text-muted);font-size:12px}.label.start[data-v-4de422cf]{text-anchor:start}.diagram[data-v-007b4d95]{width:100%;height:auto;font-family:var(--font-sans);display:block}.box[data-v-007b4d95]{fill:#fff;stroke:#999;stroke-width:1px}.line[data-v-007b4d95]{stroke:#666;stroke-width:1.2px;fill:none;marker-end:url(#popmap-arrow)}.title[data-v-007b4d95]{fill:var(--text);font-size:15px;font-weight:600}.label[data-v-007b4d95],.title[data-v-007b4d95]{text-anchor:middle}.label[data-v-007b4d95]{fill:var(--text-muted);font-size:12px}.diagram[data-v-d463a4cd]{width:100%;height:auto;font-family:var(--font-sans);display:block}.box[data-v-d463a4cd]{fill:#fff;stroke:#999;stroke-width:1px}.line[data-v-d463a4cd]{stroke:#666;stroke-width:1.2px;fill:none;marker-end:url(#fxg-arrow)}.title[data-v-d463a4cd]{fill:var(--text);font-size:15px;font-weight:600}.label[data-v-d463a4cd],.title[data-v-d463a4cd]{text-anchor:middle}.label[data-v-d463a4cd]{fill:var(--text-muted);font-size:12px}.diagram[data-v-1d81ddcc]{width:100%;height:auto;font-family:var(--font-sans);display:block}.box[data-v-1d81ddcc]{fill:#fff;stroke:#999;stroke-width:1px}.line[data-v-1d81ddcc]{stroke:#666;stroke-width:1.2px;fill:none;marker-end:url(#langp-arrow)}.line.both[data-v-1d81ddcc]{marker-start:url(#langp-arrow)}.title[data-v-1d81ddcc]{fill:var(--text);font-size:15px;font-weight:600}.label[data-v-1d81ddcc],.title[data-v-1d81ddcc]{text-anchor:middle}.label[data-v-1d81ddcc]{fill:var(--text-muted);font-size:12px}.label.start[data-v-1d81ddcc]{text-anchor:start}.label.end[data-v-1d81ddcc]{text-anchor:end}.diagram[data-v-cf5db939]{width:100%;height:auto;font-family:var(--font-sans);display:block}.box[data-v-cf5db939]{fill:#fff;stroke:#999;stroke-width:1px}.line[data-v-cf5db939]{stroke:#666;stroke-width:1.2px;fill:none;marker-end:url(#pickup-arrow)}.title[data-v-cf5db939]{fill:var(--text);font-size:15px;font-weight:600}.label[data-v-cf5db939],.title[data-v-cf5db939]{text-anchor:middle}.label[data-v-cf5db939]{fill:var(--text-muted);font-size:12px}.diagram[data-v-1623ed91]{width:100%;height:auto;font-family:var(--font-sans);display:block}.box[data-v-1623ed91]{fill:#fff;stroke:#999;stroke-width:1px}.line[data-v-1623ed91]{stroke:#666;stroke-width:1.2px;fill:none;marker-end:url(#pickup-race-arrow)}.title[data-v-1623ed91]{fill:var(--text);font-size:15px;font-weight:600}.label[data-v-1623ed91],.title[data-v-1623ed91]{text-anchor:middle}.label[data-v-1623ed91]{fill:var(--text-muted);font-size:12px}.diagram[data-v-cc43b3ab]{width:100%;height:auto;font-family:var(--font-sans);display:block}.box[data-v-cc43b3ab]{fill:#fff;stroke:#999;stroke-width:1px}.line[data-v-cc43b3ab]{stroke:#666;stroke-width:1.2px;fill:none;marker-end:url(#screen-capture-arrow)}.dashed[data-v-cc43b3ab]{stroke-dasharray:4 3}.title[data-v-cc43b3ab]{fill:var(--text);font-size:15px;font-weight:600}.label[data-v-cc43b3ab],.title[data-v-cc43b3ab]{text-anchor:middle}.label[data-v-cc43b3ab]{fill:var(--text-muted);font-size:12px}.details[data-v-9dcfedc5]{border-top:1px solid var(--line);grid-column:1/-1}.details summary[data-v-9dcfedc5]{cursor:pointer;align-items:center;min-height:48px;font-size:15px;font-weight:500;list-style:none;display:flex}.details summary[data-v-9dcfedc5]::-webkit-details-marker{display:none}.details summary[data-v-9dcfedc5]:before{content:"+";width:20px}.details[open] summary[data-v-9dcfedc5]:before{content:"−"}.details__section[data-v-9dcfedc5]{padding-block:16px 32px}.details__section h4[data-v-9dcfedc5]{margin:0 0 16px;font-size:17px;font-weight:600}.details__body[data-v-9dcfedc5]{grid-template-columns:minmax(0,1.35fr) minmax(0,1fr);align-items:start;gap:40px;display:grid}.details__diagram[data-v-9dcfedc5]{background:var(--surface);padding:20px}.details__points[data-v-9dcfedc5]{color:var(--text-muted);gap:12px;padding-left:18px;font-size:15px;line-height:1.6;list-style:outside;display:grid}@media (width<=860px){.details__body[data-v-9dcfedc5]{grid-template-columns:1fr;gap:20px}.details__diagram[data-v-9dcfedc5]{padding:12px}}.project[data-v-3e4ff3f6]{grid-template-columns:minmax(0,.85fr) minmax(0,1.35fr);align-items:start;gap:48px;display:grid}.project+.project[data-v-3e4ff3f6]{border-top:1px solid var(--line);padding-top:56px}.project__content h3[data-v-3e4ff3f6]{font-size:26px}.project__status[data-v-3e4ff3f6]{color:var(--text-muted);margin-top:8px;font-size:14px}.project__tagline[data-v-3e4ff3f6]{margin-top:20px;font-size:17px;line-height:1.5}.project__description[data-v-3e4ff3f6]{color:var(--text-muted);margin-top:12px;font-size:15px;line-height:1.65}.project__stack[data-v-3e4ff3f6]{color:var(--text-muted);margin-top:20px;font-size:14px}.project__links[data-v-3e4ff3f6]{flex-wrap:wrap;gap:20px;margin-top:16px;font-size:15px;display:flex}@media (width<=1000px){.project[data-v-3e4ff3f6]{grid-template-columns:minmax(0,1fr) minmax(0,1.2fr);gap:32px}}@media (width<=760px){.project[data-v-3e4ff3f6]{grid-template-columns:1fr;gap:28px}.project+.project[data-v-3e4ff3f6]{padding-top:40px}.project__content h3[data-v-3e4ff3f6]{font-size:24px}}.projects h2[data-v-be841536]{border-top:1px solid var(--line);padding-block:24px 32px;font-size:22px}.projects__list[data-v-be841536]{gap:56px;display:grid}@media (width<=700px){.projects h2[data-v-be841536]{padding-bottom:24px}.projects__list[data-v-be841536]{gap:40px}}.site-footer[data-v-6332ee62]{border-top:1px solid var(--line);margin-top:72px;padding-block:32px}.site-footer__credit[data-v-6332ee62]{color:var(--text-muted);font-size:13px}@media (width<=700px){.site-footer[data-v-6332ee62]{margin-top:48px}}
