@font-face{font-family:"Inter";font-style:normal;font-weight:100 900;font-display:swap;src:url("/fonts/Inter.var.woff2") format("woff2")}:root{--bg: #f6f5f4;--surface: #fbfaf9;--ink: #241f31;--muted: #5e5c64;--faint: #9a9996;--rule: #deddda;--accent: #1a5fb4;--accent-hover: #1c71d8;--code-bg: #e9eef7;--code-border: #d3def0;--row-alt: #efeeec;--selection: #cfe1f6;--measure: 42rem;--font-sans: "Inter", system-ui, -apple-system, "Segoe UI", sans-serif;--font-mono: ui-monospace, "JetBrains Mono", "SFMono-Regular", Menlo, monospace;--step: 1.6}:root[data-theme=dark]{--bg: #1e1e22;--surface: #25252b;--ink: #e3e1de;--muted: #a8a6a0;--faint: #77767b;--rule: #3a3a40;--accent: #78aeed;--accent-hover: #99c1f1;--code-bg: #26262b;--code-border: #34343c;--row-alt: #2a2a30;--selection: #2c4663}*,*::before,*::after{box-sizing:border-box}[hidden]{display:none !important}html{background:var(--bg);scrollbar-gutter:stable}body{margin:0;min-height:100vh;font-family:var(--font-sans);font-size:17px;line-height:var(--step);color:var(--ink);background:rgba(0,0,0,0);-webkit-font-smoothing:antialiased;text-rendering:optimizeLegibility;display:flex;flex-direction:column}::selection{background:var(--selection)}.container{width:100%;max-width:var(--measure);margin-inline:auto;padding-inline:1.5rem}main.container{flex:1 0 auto;padding-top:1rem;padding-bottom:4rem}h1,h2,h3,h4{line-height:1.2;font-weight:600;margin:2.2rem 0 .6rem}h1{font-weight:200;font-size:clamp(2rem,1.4rem + 2.4vw,2.8rem);letter-spacing:-.02em;margin-top:1.5rem}h2{font-size:1.35rem}h3{font-size:1.1rem}p,ul,ol{margin:0 0 1.1rem}a{color:var(--accent);font-weight:500;text-decoration:none;text-underline-offset:2px}a:hover{color:var(--accent-hover);text-decoration:underline}hr{border:0;height:1px;background:var(--rule);width:38%;margin:2.6rem auto}code{font-family:var(--font-mono);font-size:.9em;background:var(--code-bg);border:1px solid var(--code-border);padding:.12em .36em;border-radius:5px}pre{font-family:var(--font-mono);font-size:.86rem;line-height:1.5;background:var(--code-bg);border:1px solid var(--code-border);padding:1rem 1.1rem;border-radius:10px;overflow-x:auto}pre code{background:none;border:0;padding:0}table{width:100%;border-collapse:collapse;margin:1.6rem 0;font-size:.94rem}th,td{text-align:left;padding:.5rem .7rem;border-bottom:1px solid var(--rule)}thead th{border-bottom:2px solid var(--ink);font-weight:600}tbody tr:nth-child(even){background:var(--row-alt)}blockquote{margin:1.4rem 0;padding-left:1.1rem;border-left:2px solid var(--rule);color:var(--muted)}.muted{color:var(--muted)}.small{font-size:.82rem}.site-header{width:100%;max-width:var(--measure);margin-inline:auto;padding:1.4rem 1.5rem .6rem;display:flex;align-items:center;justify-content:space-between;gap:1rem}.wordmark{font-weight:600;font-size:1.05rem;color:var(--ink);letter-spacing:.01em}.wordmark:hover{color:var(--accent);text-decoration:none}.site-nav{display:flex;align-items:center;gap:.55rem;font-size:.95rem}.site-nav a{color:var(--muted);font-weight:500}.site-nav a:hover{color:var(--accent);text-decoration:none}.site-nav .dot{color:var(--faint)}.theme-toggle{width:28px;height:28px;padding:0;display:inline-grid;grid-template:1fr/1fr;place-items:center;border:1px solid var(--rule);border-radius:50%;background:var(--surface);cursor:pointer;transition:border-color .15s ease}.theme-toggle:hover{border-color:var(--accent)}.theme-toggle img{grid-area:1/1;width:16px;height:16px;display:block}.theme-toggle .th-dark{display:none}:root[data-theme=dark] .theme-toggle .th-light{display:none}:root[data-theme=dark] .theme-toggle .th-dark{display:block;filter:brightness(0) invert(1) opacity(0.6)}.intro{padding-top:1.5rem}.intro .name{margin-bottom:.2rem}.section-label{text-transform:lowercase;letter-spacing:.04em;font-size:.8rem;font-weight:600;color:var(--accent);margin:2rem 0 .6rem}.entry-list{list-style:none;margin:0;padding:0}.entry-list li{display:flex;align-items:baseline;justify-content:space-between;gap:1rem;padding:.35rem 0;border-bottom:1px solid rgba(0,0,0,0)}.entry-list li a{color:var(--ink);font-weight:500}.entry-list li a:hover{color:var(--accent);text-decoration:none}.entry-list time{color:var(--faint);font-size:.82rem;white-space:nowrap}.prose{margin-top:.5rem}.prose img{max-width:100%;height:auto;display:block;margin:1.6rem auto;border-radius:8px}.site-footer{flex-shrink:0;padding-top:2rem;padding-bottom:2.5rem;border-top:1px solid var(--rule);margin-top:2rem;display:flex;flex-direction:column;gap:.4rem}.footer-links{display:flex;gap:.55rem;align-items:center;flex-wrap:wrap}.footer-links a{color:var(--muted);font-weight:500}.footer-links .dot{color:var(--faint)}@media (prefers-reduced-motion: reduce){*,*::before,*::after{animation-duration:.001ms !important;animation-iteration-count:1 !important;transition-duration:.001ms !important}}.toc{margin:1.4rem 0 2rem;padding:.9rem 1.1rem;background:var(--surface);border:1px solid var(--rule);border-radius:10px;font-size:.92rem}.toc-label{text-transform:lowercase;letter-spacing:.04em;font-size:.78rem;font-weight:600;color:var(--muted);margin:0 0 .4rem}.toc ol{list-style:none;margin:0;padding:0}.toc ol ol{padding-left:1rem;margin-top:.2rem}.toc li{margin:.18rem 0}.toc a{color:var(--muted);font-weight:400}.toc a:hover{color:var(--accent)}.katex-display{overflow-x:auto;overflow-y:hidden;padding:.4rem 0}.book-list{list-style:none;margin:0 0 1.5rem;padding:0}.book-row{display:grid;grid-template-columns:1fr auto;column-gap:1rem;align-items:baseline;padding:.4rem 0;border-bottom:1px solid var(--rule);content-visibility:auto;contain-intrinsic-block-size:auto 65px}.book-title{grid-column:1;color:var(--ink);font-weight:500}.book-title:hover{color:var(--accent);text-decoration:none}.book-author{grid-column:1;color:var(--muted);font-size:.85rem}.book-meta{grid-column:2;grid-row:1;display:flex;align-items:baseline;gap:.6rem;white-space:nowrap}.stars{color:var(--accent);font-size:.8rem;letter-spacing:1px}.book-meta time{color:var(--faint);font-size:.8rem;font-variant-numeric:tabular-nums}.section-label-row{display:flex;align-items:baseline;justify-content:space-between;flex-wrap:wrap;gap:.2rem 1rem;margin:2rem 0 .6rem}.section-label-row .section-label{margin:0}.book-search{font:inherit;font-size:.85rem;color:var(--ink);background:none;border:0;border-bottom:1px solid var(--rule);border-radius:0;padding:0 0 .15rem;width:11rem}.book-search::placeholder{color:var(--faint)}.book-search:focus{outline:none;border-bottom-color:var(--accent)}.book-sort{display:grid;grid-template-columns:1fr auto;column-gap:1rem;align-items:baseline;padding-bottom:.3rem}.book-sort-meta{display:flex;gap:.6rem;white-space:nowrap}.sort-btn{font:inherit;font-size:.75rem;letter-spacing:.04em;color:var(--muted);background:none;border:0;padding:0;cursor:pointer}.sort-btn:hover{color:var(--accent)}.book-sort .sort-btn[data-key=title]{justify-self:start;text-align:left}.book-sort .sort-btn[data-key=rating]{min-inline-size:calc(4.1818rem + 5px);text-align:right}.sort-btn[aria-pressed=true]{color:var(--accent);font-weight:600}.book-empty{color:var(--muted);font-size:.9rem}.project-list{margin:1rem 0 2rem}.project-row{padding:1rem 0;border-bottom:1px solid var(--rule)}.project-row:first-child{border-top:1px solid var(--rule)}.project-name{margin:0;font-size:1.05rem;font-weight:600}.project-name a{color:var(--ink)}.project-name a:hover{color:var(--accent);text-decoration:none}.project-blurb{margin:.25rem 0 0;color:var(--muted);font-size:.92rem;line-height:1.5}.project-meta{display:flex;align-items:baseline;gap:.9rem;margin-top:.3rem}.project-stack{font-family:var(--font-mono);font-size:.74rem;letter-spacing:.01em;color:var(--faint)}.project-links{margin-left:auto;display:flex;gap:.9rem;font-size:.82rem;font-weight:600;white-space:nowrap}.card-links{display:flex;align-items:baseline;gap:.9rem;margin-top:.1rem;padding-top:.55rem;border-top:1px solid var(--rule);font-size:.82rem;font-weight:600}.project-detail-links{margin:.4rem 0 1rem;padding:0;border:0}.tagline-block{max-width:34em;color:var(--muted);font-size:1.05rem}.tagline-block p{margin:0}.stream-head{display:flex;justify-content:space-between;align-items:baseline;margin:2rem 0 .5rem}.stream-head .section-label{margin:0}.stream-all{font-size:.8rem;font-weight:500;color:var(--faint)}.stream-all:hover{color:var(--accent);text-decoration:none}.home-projects{list-style:none;margin:.2rem 0 0;padding:0}.home-projects li{padding:.25rem 0}.home-projects b{font-weight:600}.home-projects a{color:var(--ink)}.home-projects a:hover{color:var(--accent);text-decoration:none}.home-projects .blurb{color:var(--muted)}.fig{margin:1.8rem 0}.fig img{display:block;width:100%;height:auto;border-radius:8px}.fig figcaption{margin-top:.5rem;font-size:.85rem;color:var(--muted);text-align:center}#constellation{position:fixed;inset:0;z-index:-1;pointer-events:none}:root[data-theme=light] .z-code{color:#24292e;background-color:#fff}:root[data-theme=light] .z-hl{background-color:#f6f8fa}:root[data-theme=light] .giallo-ln{color:rgba(27,31,35,.3019607843)}:root[data-theme=light] .z-comment{color:#6a737d}:root[data-theme=light] .z-constant{color:#005cc5}:root[data-theme=light] .z-entity{color:#6f42c1}:root[data-theme=light] .z-keyword{color:#d73a49}:root[data-theme=light] .z-storage{color:#d73a49}:root[data-theme=light] .z-string{color:#032f62}:root[data-theme=light] .z-support{color:#005cc5}:root[data-theme=light] .z-variable{color:#e36209}:root[data-theme=light] .z-carriage-return{color:#fafbfc;background-color:#d73a49;font-style:italic;text-decoration:underline}:root[data-theme=light] .z-variable{color:#005cc5}:root[data-theme=light] .z-source{color:#032f62}:root[data-theme=light] .z-string.z-comment{color:#6a737d}:root[data-theme=light] .z-variable.z-language{color:#005cc5}:root[data-theme=light] .z-entity.z-name{color:#6f42c1}:root[data-theme=light] .z-storage.z-type{color:#d73a49}:root[data-theme=light] .z-meta.z-property-name{color:#005cc5}:root[data-theme=light] .z-variable.z-other{color:#24292e}:root[data-theme=light] .z-invalid.z-broken{color:#b31d28;font-style:italic}:root[data-theme=light] .z-invalid.z-deprecated{color:#b31d28;font-style:italic}:root[data-theme=light] .z-invalid.z-illegal{color:#b31d28;font-style:italic}:root[data-theme=light] .z-invalid.z-unimplemented{color:#b31d28;font-style:italic}:root[data-theme=light] .z-message.z-error{color:#b31d28}:root[data-theme=light] .z-source.z-regexp{color:#032f62}:root[data-theme=light] .z-string.z-regexp{color:#032f62}:root[data-theme=light] .z-support.z-constant{color:#005cc5}:root[data-theme=light] .z-support.z-variable{color:#005cc5}:root[data-theme=light] .z-meta.z-module-reference{color:#005cc5}:root[data-theme=light] .z-markup.z-heading{color:#005cc5;font-weight:bold}:root[data-theme=light] .z-markup.z-quote{color:#22863a}:root[data-theme=light] .z-markup.z-italic{color:#24292e;font-style:italic}:root[data-theme=light] .z-markup.z-bold{color:#24292e;font-weight:bold}:root[data-theme=light] .z-markup.z-underline{text-decoration:underline}:root[data-theme=light] .z-markup.z-strikethrough{text-decoration:line-through}:root[data-theme=light] .z-markup.z-deleted{color:#b31d28;background-color:#ffeef0}:root[data-theme=light] .z-markup.z-inserted{color:#22863a;background-color:#f0fff4}:root[data-theme=light] .z-markup.z-changed{color:#e36209;background-color:#ffebda}:root[data-theme=light] .z-markup.z-ignored{color:#f6f8fa;background-color:#005cc5}:root[data-theme=light] .z-markup.z-untracked{color:#f6f8fa;background-color:#005cc5}:root[data-theme=light] .z-meta.z-separator{color:#005cc5;font-weight:bold}:root[data-theme=light] .z-meta.z-output{color:#005cc5}:root[data-theme=light] .z-brackethighlighter.z-tag{color:#586069}:root[data-theme=light] .z-brackethighlighter.z-curly{color:#586069}:root[data-theme=light] .z-brackethighlighter.z-round{color:#586069}:root[data-theme=light] .z-brackethighlighter.z-square{color:#586069}:root[data-theme=light] .z-brackethighlighter.z-angle{color:#586069}:root[data-theme=light] .z-brackethighlighter.z-quote{color:#586069}:root[data-theme=light] .z-brackethighlighter.z-unmatched{color:#b31d28}:root[data-theme=light] .z-entity.z-name{color:#005cc5;font-weight:bold}:root[data-theme=light] .z-punctuation.z-definition.z-comment{color:#6a737d}:root[data-theme=light] .z-entity.z-name.z-constant{color:#005cc5}:root[data-theme=light] .z-variable.z-other.z-constant{color:#005cc5}:root[data-theme=light] .z-variable.z-other.z-enummember{color:#005cc5}:root[data-theme=light] .z-variable.z-parameter.z-function{color:#24292e}:root[data-theme=light] .z-entity.z-name.z-tag{color:#22863a}:root[data-theme=light] .z-storage.z-modifier.z-package{color:#24292e}:root[data-theme=light] .z-storage.z-modifier.z-import{color:#24292e}:root[data-theme=light] .z-storage.z-type.z-java{color:#24292e}:root[data-theme=light] .z-punctuation.z-definition.z-string{color:#032f62}:root[data-theme=light] .z-string.z-regexp.z-character-class{color:#032f62}:root[data-theme=light] .z-markup.z-inline.z-raw{color:#005cc5}:root[data-theme=light] .z-punctuation.z-definition.z-deleted{color:#b31d28;background-color:#ffeef0}:root[data-theme=light] .z-punctuation.z-definition.z-inserted{color:#22863a;background-color:#f0fff4}:root[data-theme=light] .z-punctuation.z-definition.z-changed{color:#e36209;background-color:#ffebda}:root[data-theme=light] .z-meta.z-diff.z-range{color:#6f42c1;font-weight:bold}:root[data-theme=light] .z-meta.z-diff.z-header{color:#005cc5}:root[data-theme=light] .z-string.z-other.z-link{color:#032f62;text-decoration:underline}:root[data-theme=light] .z-constant.z-character.z-escape{color:#032f62}:root[data-theme=light] .z-source.z-ruby.z-embedded{color:#032f62}:root[data-theme=light] .z-string.z-regexp.z-arbitrary-repitition{color:#032f62}:root[data-theme=light] .z-constant.z-character.z-escape{color:#22863a;font-weight:bold}:root[data-theme=light] .z-meta.z-diff.z-header.z-from-file{color:#b31d28;background-color:#ffeef0}:root[data-theme=light] .z-meta.z-diff.z-header.z-to-file{color:#22863a;background-color:#f0fff4}:root[data-theme=light] .z-constant.z-other.z-reference.z-link{color:#032f62;text-decoration:underline}:root[data-theme=light] .z-punctuation.z-definition.z-list.z-begin.z-markdown{color:#e36209}:root[data-theme=dark] .z-code{color:#e1e4e8;background-color:#24292e}:root[data-theme=dark] .z-hl{background-color:#2b3036}:root[data-theme=dark] .giallo-ln{color:#444d56}:root[data-theme=dark] .z-comment{color:#6a737d}:root[data-theme=dark] .z-constant{color:#79b8ff}:root[data-theme=dark] .z-entity{color:#b392f0}:root[data-theme=dark] .z-keyword{color:#f97583}:root[data-theme=dark] .z-storage{color:#f97583}:root[data-theme=dark] .z-string{color:#9ecbff}:root[data-theme=dark] .z-support{color:#79b8ff}:root[data-theme=dark] .z-variable{color:#ffab70}:root[data-theme=dark] .z-carriage-return{color:#24292e;background-color:#f97583;font-style:italic;text-decoration:underline}:root[data-theme=dark] .z-variable{color:#79b8ff}:root[data-theme=dark] .z-source{color:#9ecbff}:root[data-theme=dark] .z-string.z-comment{color:#6a737d}:root[data-theme=dark] .z-variable.z-language{color:#79b8ff}:root[data-theme=dark] .z-entity.z-name{color:#b392f0}:root[data-theme=dark] .z-storage.z-type{color:#f97583}:root[data-theme=dark] .z-meta.z-property-name{color:#79b8ff}:root[data-theme=dark] .z-variable.z-other{color:#e1e4e8}:root[data-theme=dark] .z-invalid.z-broken{color:#fdaeb7;font-style:italic}:root[data-theme=dark] .z-invalid.z-deprecated{color:#fdaeb7;font-style:italic}:root[data-theme=dark] .z-invalid.z-illegal{color:#fdaeb7;font-style:italic}:root[data-theme=dark] .z-invalid.z-unimplemented{color:#fdaeb7;font-style:italic}:root[data-theme=dark] .z-message.z-error{color:#fdaeb7}:root[data-theme=dark] .z-source.z-regexp{color:#dbedff}:root[data-theme=dark] .z-string.z-regexp{color:#dbedff}:root[data-theme=dark] .z-support.z-constant{color:#79b8ff}:root[data-theme=dark] .z-support.z-variable{color:#79b8ff}:root[data-theme=dark] .z-meta.z-module-reference{color:#79b8ff}:root[data-theme=dark] .z-markup.z-heading{color:#79b8ff;font-weight:bold}:root[data-theme=dark] .z-markup.z-quote{color:#85e89d}:root[data-theme=dark] .z-markup.z-italic{color:#e1e4e8;font-style:italic}:root[data-theme=dark] .z-markup.z-bold{color:#e1e4e8;font-weight:bold}:root[data-theme=dark] .z-markup.z-underline{text-decoration:underline}:root[data-theme=dark] .z-markup.z-strikethrough{text-decoration:line-through}:root[data-theme=dark] .z-markup.z-deleted{color:#fdaeb7;background-color:#86181d}:root[data-theme=dark] .z-markup.z-inserted{color:#85e89d;background-color:#144620}:root[data-theme=dark] .z-markup.z-changed{color:#ffab70;background-color:#c24e00}:root[data-theme=dark] .z-markup.z-ignored{color:#2f363d;background-color:#79b8ff}:root[data-theme=dark] .z-markup.z-untracked{color:#2f363d;background-color:#79b8ff}:root[data-theme=dark] .z-meta.z-separator{color:#79b8ff;font-weight:bold}:root[data-theme=dark] .z-meta.z-output{color:#79b8ff}:root[data-theme=dark] .z-brackethighlighter.z-tag{color:#d1d5da}:root[data-theme=dark] .z-brackethighlighter.z-curly{color:#d1d5da}:root[data-theme=dark] .z-brackethighlighter.z-round{color:#d1d5da}:root[data-theme=dark] .z-brackethighlighter.z-square{color:#d1d5da}:root[data-theme=dark] .z-brackethighlighter.z-angle{color:#d1d5da}:root[data-theme=dark] .z-brackethighlighter.z-quote{color:#d1d5da}:root[data-theme=dark] .z-brackethighlighter.z-unmatched{color:#fdaeb7}:root[data-theme=dark] .z-entity.z-name{color:#79b8ff;font-weight:bold}:root[data-theme=dark] .z-punctuation.z-definition.z-comment{color:#6a737d}:root[data-theme=dark] .z-entity.z-name.z-constant{color:#79b8ff}:root[data-theme=dark] .z-variable.z-other.z-constant{color:#79b8ff}:root[data-theme=dark] .z-variable.z-other.z-enummember{color:#79b8ff}:root[data-theme=dark] .z-variable.z-parameter.z-function{color:#e1e4e8}:root[data-theme=dark] .z-entity.z-name.z-tag{color:#85e89d}:root[data-theme=dark] .z-storage.z-modifier.z-package{color:#e1e4e8}:root[data-theme=dark] .z-storage.z-modifier.z-import{color:#e1e4e8}:root[data-theme=dark] .z-storage.z-type.z-java{color:#e1e4e8}:root[data-theme=dark] .z-punctuation.z-definition.z-string{color:#9ecbff}:root[data-theme=dark] .z-string.z-regexp.z-character-class{color:#dbedff}:root[data-theme=dark] .z-markup.z-inline.z-raw{color:#79b8ff}:root[data-theme=dark] .z-punctuation.z-definition.z-deleted{color:#fdaeb7;background-color:#86181d}:root[data-theme=dark] .z-punctuation.z-definition.z-inserted{color:#85e89d;background-color:#144620}:root[data-theme=dark] .z-punctuation.z-definition.z-changed{color:#ffab70;background-color:#c24e00}:root[data-theme=dark] .z-meta.z-diff.z-range{color:#b392f0;font-weight:bold}:root[data-theme=dark] .z-meta.z-diff.z-header{color:#79b8ff}:root[data-theme=dark] .z-string.z-other.z-link{color:#dbedff;text-decoration:underline}:root[data-theme=dark] .z-constant.z-character.z-escape{color:#dbedff}:root[data-theme=dark] .z-source.z-ruby.z-embedded{color:#dbedff}:root[data-theme=dark] .z-string.z-regexp.z-arbitrary-repitition{color:#dbedff}:root[data-theme=dark] .z-constant.z-character.z-escape{color:#85e89d;font-weight:bold}:root[data-theme=dark] .z-meta.z-diff.z-header.z-from-file{color:#fdaeb7;background-color:#86181d}:root[data-theme=dark] .z-meta.z-diff.z-header.z-to-file{color:#85e89d;background-color:#144620}:root[data-theme=dark] .z-constant.z-other.z-reference.z-link{color:#dbedff;text-decoration:underline}:root[data-theme=dark] .z-punctuation.z-definition.z-list.z-begin.z-markdown{color:#ffab70}