:root{--c-paper: #fbfbf9;--c-paper-2: #f2f3f1;--c-abyss: #1d2528;--c-abyss-2: #263033;--c-ink: #26302f;--c-ink-2: #5c6765;--c-bone: #e3e8e6;--c-bone-2: #a7b3b4;--c-sea: #276270;--c-sea-deep: #1d5364;--c-sea-light: #7fc4d9;--c-sea-pale: #a6dbea;--c-copper: #8b4920;--c-copper-lt: #e09a62;--c-rule: #e3e5e0;--c-rule-dk: #35403f;--ocean-1: #6bb3c9;--ocean-2: #4e93a6;--ocean-3: #35707f;--ocean-4: #163f4c;--bg: var(--c-paper);--surface: var(--c-paper-2);--text: var(--c-ink);--text-muted: var(--c-ink-2);--border: var(--c-rule);--link: var(--c-sea);--link-hover: var(--c-sea-deep);--accent: var(--c-copper);--focus: var(--c-sea);--code-bg: var(--c-paper-2);--selection: rgba(31, 95, 115, 0.16);--font-display: Charter, "Bitstream Charter", "Iowan Old Style", "Source Serif 4", Georgia, "Times New Roman", serif;--font-body: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif;--font-mono: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;--fs-xs: 0.8125rem;--fs-sm: 0.9375rem;--fs-base: 1.0625rem;--fs-md: 1.1875rem;--fs-lg: 1.4375rem;--fs-xl: 1.5625rem;--fs-2xl: 1.9375rem;--fs-3xl: clamp(1.875rem, 1.4rem + 1.8vw, 2.375rem);--lh-tight: 1.25;--lh-snug: 1.35;--lh-body: 1.65;--sp-1: 0.25rem;--sp-2: 0.5rem;--sp-3: 0.75rem;--sp-4: 1rem;--sp-5: 1.5rem;--sp-6: 2.25rem;--sp-7: 3.375rem;--sp-8: 5rem;--radius-sm: 5px;--radius-md: 10px;--measure: 66ch;--page-max: 68rem}:root:not([data-theme="light"]){--bg: var(--c-abyss);--surface: var(--c-abyss-2);--text: var(--c-bone);--text-muted: var(--c-bone-2);--border: var(--c-rule-dk);--link: var(--c-sea-light);--link-hover: var(--c-sea-pale);--accent: var(--c-copper-lt);--focus: var(--c-sea-light);--code-bg: var(--c-abyss-2);--selection: rgba(127, 196, 217, 0.22);--ocean-1: #4e93a6;--ocean-2: #7fc4d9;--ocean-3: #a6dbea;--ocean-4: #dff0f5}*,*::before,*::after{box-sizing:border-box}*{margin:0}html{-webkit-text-size-adjust:100%;scroll-behavior:smooth}@media (prefers-reduced-motion: reduce){html{scroll-behavior:auto}*,*::before,*::after{animation-duration:0.01ms !important;animation-iteration-count:1 !important;transition-duration:0.01ms !important}}body{background:var(--bg);color:var(--text);font-family:var(--font-body);font-size:var(--fs-base);line-height:var(--lh-body);-webkit-font-smoothing:antialiased;min-height:100vh;display:flex;flex-direction:column}::selection{background:var(--selection)}h1,h2,h3,h4{font-family:var(--font-display);font-weight:600;line-height:var(--lh-tight);text-wrap:balance;color:var(--text)}h1{font-size:var(--fs-2xl);letter-spacing:-0.005em}h2{font-size:var(--fs-xl);letter-spacing:-0.005em}h3{font-size:var(--fs-lg)}h4{font-size:var(--fs-md)}a{color:var(--link);text-decoration:underline;text-decoration-thickness:1px;text-underline-offset:0.15em}a:hover{color:var(--link-hover)}:focus-visible{outline:2px solid var(--focus);outline-offset:2px;border-radius:2px}img,svg,video{max-width:100%;height:auto;display:block}hr{border:0;border-top:1px solid var(--border);margin:var(--sp-6) 0}code,kbd,samp,pre{font-family:var(--font-mono);font-size:0.9em}code{background:var(--code-bg);padding:0.15em 0.35em;border-radius:var(--radius-sm)}pre{background:var(--code-bg);padding:var(--sp-4);border-radius:var(--radius-md);overflow-x:auto;border:1px solid var(--border)}pre code{background:none;padding:0}blockquote{border-left:3px solid var(--border);padding-left:var(--sp-4);color:var(--text-muted);font-style:italic}table{width:100%;border-collapse:collapse;font-size:var(--fs-sm)}th,td{text-align:left;padding:var(--sp-2) var(--sp-3);border-bottom:1px solid var(--border)}th{font-weight:600}.scroll-x{overflow-x:auto}.prose{max-width:var(--measure);font-family:var(--font-display);font-size:var(--fs-md);line-height:var(--lh-body)}.prose>*+*{margin-top:var(--sp-4)}.prose>*+h2{margin-top:var(--sp-7)}.prose>*+h3{margin-top:var(--sp-6)}.prose h2+*,.prose h3+*{margin-top:var(--sp-3)}.prose ul,.prose ol{padding-left:1.4em}.prose li+li{margin-top:var(--sp-2)}.skip-link{position:absolute;left:var(--sp-4);top:-4rem;z-index:100;background:var(--link);color:var(--bg);padding:var(--sp-2) var(--sp-4);border-radius:var(--radius-sm);text-decoration:none;transition:top 0.15s ease}.skip-link:focus{top:var(--sp-4);color:var(--bg)}.container{width:100%;max-width:var(--page-max);margin-inline:auto;padding-inline:var(--sp-5)}@media (min-width: 40rem){.container{padding-inline:var(--sp-6)}}main{flex:1 0 auto;padding-block:var(--sp-6) var(--sp-8)}.masthead{border-bottom:1px solid var(--border);padding-block:var(--sp-4)}.masthead__inner{display:flex;align-items:center;gap:var(--sp-4);flex-wrap:wrap}.masthead__name{font-family:var(--font-display);font-size:var(--fs-md);font-weight:600;color:var(--text);text-decoration:none;letter-spacing:-0.01em;margin-right:auto}.masthead__name:hover{color:var(--link)}.nav{display:flex;align-items:center;gap:var(--sp-4);flex-wrap:wrap;font-size:var(--fs-sm)}.nav a{color:var(--text-muted);text-decoration:none;padding-block:var(--sp-1);border-bottom:2px solid transparent}.nav a:hover{color:var(--link)}.nav a[aria-current="page"]{color:var(--text);font-weight:600;border-bottom-color:var(--accent)}.icon-btn.nav-toggle{display:none}@media (max-width: 47.99rem){.icon-btn.nav-toggle{display:inline-flex}.nav{display:none;flex-basis:100%;flex-direction:column;align-items:flex-start;gap:var(--sp-3);padding-top:var(--sp-4)}.masthead[data-nav-open="true"] .nav{display:flex}}.footer{border-top:1px solid var(--border);padding-block:var(--sp-6);font-size:var(--fs-sm);color:var(--text-muted)}.footer__inner{display:flex;flex-wrap:wrap;gap:var(--sp-4) var(--sp-6);align-items:center;justify-content:space-between}.footer a{color:var(--text-muted)}.footer a:hover{color:var(--link)}.page-head{margin-bottom:var(--sp-6)}.page-head__lede{font-family:var(--font-display);font-size:var(--fs-md);color:var(--text-muted);max-width:var(--measure);margin-top:var(--sp-3)}.section+.section{margin-top:var(--sp-7)}.section__title{font-size:var(--fs-lg);padding-bottom:var(--sp-2);border-bottom:1px solid var(--border);margin-bottom:var(--sp-5);display:flex;align-items:baseline;justify-content:space-between;gap:var(--sp-4)}.section__more{font-family:var(--font-body);font-size:var(--fs-sm);font-weight:400;white-space:nowrap}.btn{display:inline-flex;align-items:center;gap:var(--sp-2);font-family:var(--font-body);font-size:var(--fs-sm);line-height:1;padding:var(--sp-2) var(--sp-3);border:1px solid var(--border);border-radius:var(--radius-sm);background:transparent;color:var(--text-muted);text-decoration:none;cursor:pointer;transition:border-color 0.15s ease, color 0.15s ease}.btn:hover{color:var(--link);border-color:var(--link)}.btn svg{width:1em;height:1em;flex:none}.btn--primary{background:var(--link);border-color:var(--link);color:var(--bg);font-weight:500}.btn--primary:hover{background:var(--link-hover);border-color:var(--link-hover);color:var(--bg)}.btn-row{display:flex;flex-wrap:wrap;gap:var(--sp-2)}.badge{display:inline-block;font-size:var(--fs-xs);font-family:var(--font-body);letter-spacing:0.04em;text-transform:uppercase;color:var(--accent);border:1px solid currentColor;border-radius:var(--radius-sm);padding:0.1em 0.45em;vertical-align:0.15em}.year{font-family:var(--font-body);font-size:var(--fs-xs);letter-spacing:0.1em;text-transform:uppercase;color:var(--text-muted);border-bottom:1px solid var(--border);padding-bottom:var(--sp-2);margin:var(--sp-6) 0 var(--sp-4)}.year:first-child{margin-top:0}.pub{padding-block:var(--sp-4)}.pub+.pub{border-top:1px solid var(--border)}.pub__title{font-family:var(--font-display);font-size:var(--fs-md);font-weight:600;line-height:var(--lh-snug);margin-bottom:var(--sp-2)}.pub__title a{color:var(--text);text-decoration:none}.pub__title a:hover{color:var(--link);text-decoration:underline}.pub__authors{font-size:var(--fs-sm);color:var(--text-muted);margin-bottom:var(--sp-1)}.pub__authors .me{color:var(--text);font-weight:600}.pub__venue{font-size:var(--fs-sm);color:var(--text-muted);margin-bottom:var(--sp-3)}.pub__venue em{font-style:italic}.pub--compact{padding-block:var(--sp-3)}.pub--compact .pub__title{font-size:var(--fs-base)}.pub--cv{padding-block:var(--sp-2);border:0}.pub--cv+.pub--cv{border-top:0}.entry{padding-block:var(--sp-4)}.entry+.entry{border-top:1px solid var(--border)}.entry__title{font-family:var(--font-display);font-size:var(--fs-base);font-weight:600;line-height:var(--lh-snug);margin-bottom:var(--sp-1)}.entry__title a{color:var(--text);text-decoration:none}.entry__title a:hover{color:var(--link);text-decoration:underline}.entry__meta{font-size:var(--fs-sm);color:var(--text-muted)}.entry__kind{font-size:var(--fs-xs);letter-spacing:0.04em;text-transform:uppercase;color:var(--accent);margin-right:var(--sp-2)}.cards{display:grid;gap:var(--sp-4);grid-template-columns:repeat(auto-fit, minmax(15rem, 1fr))}.card{border:1px solid var(--border);border-radius:var(--radius-md);padding:var(--sp-5);background:var(--surface)}.card__title{font-family:var(--font-display);font-size:var(--fs-base);font-weight:600;margin-bottom:var(--sp-2)}.card__title a{color:var(--text);text-decoration:none}.card__title a:hover{color:var(--link)}.card p{font-size:var(--fs-sm);color:var(--text-muted)}.news{list-style:none;padding:0}.news li{padding-block:var(--sp-3);font-size:var(--fs-sm)}.news li+li{border-top:1px solid var(--border)}.news__date{color:var(--text-muted);font-variant-numeric:tabular-nums;display:block;font-size:var(--fs-xs);letter-spacing:0.04em;text-transform:uppercase;margin-bottom:var(--sp-1)}.media__outlet{font-weight:600;color:var(--text)}.media__kind{color:var(--accent);font-size:var(--fs-xs);text-transform:uppercase;letter-spacing:0.04em}.pkg{padding-block:var(--sp-4)}.pkg+.pkg{border-top:1px solid var(--border)}.pkg__name{font-family:var(--font-mono);font-size:var(--fs-base);font-weight:600}.pkg__name a{color:var(--text);text-decoration:none}.pkg__name a:hover{color:var(--link);text-decoration:underline}.pkg__lang{font-family:var(--font-body);font-size:var(--fs-xs);color:var(--text-muted);margin-left:var(--sp-2);letter-spacing:0.04em;text-transform:uppercase}.pkg p{font-size:var(--fs-sm);color:var(--text-muted);margin-top:var(--sp-2);max-width:var(--measure)}figure{margin-block:var(--sp-5)}figure img{border-radius:var(--radius-md);border:1px solid var(--border);width:100%}figcaption{font-size:var(--fs-sm);color:var(--text-muted);margin-top:var(--sp-2);max-width:var(--measure)}details.cite{border:1px solid var(--border);border-radius:var(--radius-md);padding:var(--sp-3) var(--sp-4);margin-top:var(--sp-5);font-size:var(--fs-sm)}details.cite summary{cursor:pointer;font-weight:600;font-family:var(--font-body)}details.cite pre{margin-top:var(--sp-3);font-size:var(--fs-xs);white-space:pre-wrap}.icon-btn{display:inline-flex;align-items:center;justify-content:center;width:2rem;height:2rem;padding:0;border:1px solid var(--border);border-radius:var(--radius-sm);background:transparent;color:var(--text-muted);cursor:pointer}.icon-btn:hover{color:var(--link);border-color:var(--link)}.icon-btn svg{width:1rem;height:1rem}.icon-btn .i-moon{display:none}.icon-btn .i-sun{display:block}:root[data-theme="light"] .icon-btn .i-sun{display:none}:root[data-theme="light"] .icon-btn .i-moon{display:block}.social{display:flex;flex-wrap:wrap;gap:var(--sp-2);align-items:center}.pkg__install{margin-block:var(--sp-3) 0;font-size:var(--fs-xs)}.pkg__install code{display:inline-block;padding:.15em .5em;border:1px solid var(--border);border-radius:var(--radius-sm);background:var(--surface-2);color:var(--text-2);word-break:break-all}.banner{margin:0 0 var(--sp-4);width:100vw;margin-inline:calc(50% - 50vw);overflow-x:clip;border-bottom:1px solid var(--border)}.banner__strip{display:grid;grid-template-columns:repeat(var(--frames, 4), 1fr);gap:1px;background:var(--border)}.banner__frame{display:block;width:100%;height:100%;aspect-ratio:3 / 2;object-fit:cover;background:var(--surface)}@media (max-width: 39.999rem){.banner__strip{grid-template-columns:repeat(2, 1fr)}.banner__frame:last-child:nth-child(odd){grid-column:1 / -1;aspect-ratio:2 / 1}}.banner__caption{width:100%;max-width:var(--page-max);margin-inline:auto;padding:var(--sp-2) var(--sp-5) var(--sp-3);font-size:var(--fs-xs);font-style:italic;color:var(--text-muted)}@media (min-width: 40rem){.banner__caption{padding-inline:var(--sp-6)}}.facts{border:1px solid var(--border);border-radius:var(--radius-sm);background:var(--surface);padding:var(--sp-5) var(--sp-5) var(--sp-4)}.facts__title{margin:0 0 var(--sp-4);font-size:var(--fs-xs);font-weight:600;letter-spacing:.08em;text-transform:uppercase;color:var(--text-muted)}.facts dl{margin:0}.facts dt{font-size:var(--fs-xs);color:var(--text-muted)}.facts dd{margin:0 0 var(--sp-4);font-size:var(--fs-sm);line-height:1.45}.facts dd:last-child{margin-bottom:0}.facts dd>a{font-weight:650}.home-grid{display:grid;gap:var(--sp-7);align-items:start}@media (min-width: 76rem){.home-grid,.media-strip,.hero{width:min(82rem, 100vw - 2 * var(--sp-6));margin-inline:calc(50% - min(41rem, 50vw - var(--sp-6)))}.home-grid{grid-template-columns:minmax(0, 1.15fr) minmax(0, 0.85fr);gap:var(--sp-8)}.home-side>.facts{margin-top:0}.home-side>.section:first-child{margin-top:0}}.home-side>.section{margin-top:var(--sp-7)}.home-side>.facts+.section{margin-top:var(--sp-7)}.media-strip{margin-top:var(--sp-8);padding-top:var(--sp-7);border-top:1px solid var(--border)}.media-strip .section__title{font-size:var(--fs-lg)}.media-strip .news li{padding-block:var(--sp-4);font-size:var(--fs-base)}.media-strip .news__date{display:block;margin-bottom:var(--sp-1)}@media (min-width: 76rem){.news--split{display:grid;grid-template-columns:repeat(2, minmax(0, 1fr));column-gap:var(--sp-8)}.news--split li+li{border-top:1px solid var(--border)}.news--split li:nth-child(2){border-top:0}}.pkg__demo{display:grid;gap:var(--sp-4);margin-top:var(--sp-4)}@media (min-width: 48rem){.pkg__demo{grid-template-columns:minmax(0, 1fr) minmax(0, 1fr);align-items:start}}.pkg__code pre,.pkg__code .highlight{margin:0;font-size:var(--fs-xs);overflow-x:auto}.pkg__code code{white-space:pre}.schematic{margin:0}.schematic svg{display:block;width:100%;height:auto;color:var(--text-muted);border:1px solid var(--border);border-radius:var(--radius-sm);background:var(--surface)}.schematic figcaption{margin-top:var(--sp-2);font-size:var(--fs-xs);color:var(--text-muted)}.schematic figcaption::before{content:"Schematic. ";font-style:italic}.hero{display:grid;gap:var(--sp-6);align-items:start;padding-block:var(--sp-6) var(--sp-7);border-bottom:1px solid var(--border)}@media (min-width: 48rem){.hero--with-aside{grid-template-columns:minmax(0, 1fr) 15rem}}.hero__name{font-size:var(--fs-3xl);font-weight:600;letter-spacing:-0.005em;margin-bottom:var(--sp-3)}.hero__role{font-family:var(--font-body);font-size:var(--fs-sm);letter-spacing:0.02em;color:var(--text-muted);margin-bottom:var(--sp-4)}.hero__lede{font-family:var(--font-display);font-size:var(--fs-md);line-height:var(--lh-body);max-width:54ch;margin-bottom:var(--sp-5)}.hero__aside{display:none}@media (min-width: 48rem){.hero__aside{display:block}}.portrait{width:100%;aspect-ratio:4 / 5;border:1px solid var(--border);border-radius:var(--radius-md);object-fit:cover;background:var(--surface)}.contours{display:block;width:100%;height:auto}.contours path{fill:none;stroke:var(--border);stroke-width:1.25;stroke-linecap:round}.contours path:nth-child(odd){stroke:var(--link);opacity:0.3}.visually-hidden{position:absolute !important;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0 0 0 0);white-space:nowrap;border:0}.measure{max-width:var(--measure)}.muted{color:var(--text-muted)}.text-sm{font-size:var(--fs-sm)}.mt-0{margin-top:0}.mt-5{margin-top:var(--sp-5)}.mt-6{margin-top:var(--sp-6)}.stack>*+*{margin-top:var(--sp-4)}@media print{.masthead,.footer,.icon-btn,.skip-link,.btn-row,.nav-toggle{display:none !important}:root{--bg: #fff;--surface: #fff;--text: #000;--text-muted: #333;--border: #bbb;--link: #000;--accent: #000}body{font-size:10.5pt;line-height:1.4}main{padding-block:0}.container{max-width:none;padding:0}h1{font-size:20pt}h2{font-size:13pt;margin-top:14pt}h3{font-size:11pt}a{text-decoration:none}.prose a[href^="http"]::after{content:" (" attr(href) ")";font-size:8.5pt;color:#555;word-break:break-all}.pub,.entry,.pkg,.card,figure{break-inside:avoid;page-break-inside:avoid}h2,h3{break-after:avoid;page-break-after:avoid}}
