/* Bundled Ubuntu Sans 1.006 makes typography independent of the OS. */
@font-face{font-family:'Ubuntu Sans';src:url('/assets/fonts/ubuntu-sans-variable.woff2') format('woff2');font-weight:100 800;font-style:normal;font-display:swap}
@font-face{font-family:'Ubuntu Sans';src:url('/assets/fonts/ubuntu-sans-italic-variable.woff2') format('woff2');font-weight:100 800;font-style:italic;font-display:swap}
@font-face{font-family:Akzidenz Grotesk;src:url('/assets/fonts/akzidenz-regular.otf') format('opentype');font-weight:400;font-style:normal;font-display:swap}
@font-face{font-family:Akzidenz Grotesk;src:url('/assets/fonts/akzidenz-bold.otf') format('opentype');font-weight:600;font-style:normal;font-display:swap}
:root{color-scheme:light;--font-body:'Ubuntu Sans',Arial,sans-serif;--font-heading:var(--font-body);--font-name:'Akzidenz Grotesk',Arial,sans-serif;--font-mono:ui-monospace,SFMono-Regular,Consolas,monospace;--content-width:48.5rem;--title-ink:var(--ink);--subtitle-ink:var(--muted);--ink:#262626;--muted:#0006;--line:#0000001a;--paper:#fff;--surface:#fafafa;--hover:#f1f1f1;--underline:#aaa;--tag-border:#cecece;--tag-ink:#646464;--badge-bg:#fff7de;--badge-ink:#856315;--icon:#888;--note-bg:#f7f7f5;--note-border:#c9c9c1;--code-bg:#f5f5f5;--focus:#3b6a86}
/* Rust pairs warm ivory paper with soft brown ink and muted copper accents. */
:root[data-theme="rust"]{color-scheme:light;--ink:#423a31;--muted:#706351;--line:#d2c1a8;--paper:#f2e7d5;--surface:#e9ddc9;--hover:#dfceb3;--underline:#a48b6f;--tag-border:#c9b494;--tag-ink:#725b45;--badge-bg:#e8d2b2;--badge-ink:#744b2c;--icon:#80674d;--note-bg:#eaddc8;--note-border:#ad8862;--code-bg:#e9ddc9;--focus:#8b5e3c}
:root[data-theme="coal"]{color-scheme:dark;--ink:#e5e5e5;--muted:#a6a6ab;--line:#35363a;--paper:#18191b;--surface:#222326;--hover:#2d2e32;--underline:#77787f;--tag-border:#51525a;--tag-ink:#b7b7bd;--badge-bg:#38311e;--badge-ink:#e5c779;--icon:#a6a6ab;--note-bg:#232427;--note-border:#64656d;--code-bg:#292a2e;--focus:#94c6e5}
:root[data-theme="navy"]{color-scheme:dark;--ink:#d9dfed;--muted:#a0aac2;--line:#343b50;--paper:#161923;--surface:#202635;--hover:#2b3245;--underline:#7986a8;--tag-border:#56617e;--tag-ink:#b7c2da;--badge-bg:#3b3540;--badge-ink:#ead0a4;--icon:#a0aac2;--note-bg:#202635;--note-border:#657595;--code-bg:#202635;--focus:#9bbcf2}
:root[data-theme="ayu"]{color-scheme:dark;--ink:#c5c5c5;--muted:#a0a7b0;--line:#30373e;--paper:#0f1419;--surface:#1b222a;--hover:#262e38;--underline:#778391;--tag-border:#465462;--tag-ink:#afbcca;--badge-bg:#3c3020;--badge-ink:#ffb454;--icon:#a0a7b0;--note-bg:#1b222a;--note-border:#566778;--code-bg:#161e26;--focus:#ffb454}
:root[data-theme="supernova"]{color-scheme:dark;--ink:#e5e5e5;--muted:#aaaab0;--line:#333338;--paper:#000;--surface:#111114;--hover:#252529;--underline:#777780;--tag-border:#505058;--tag-ink:#bcbcc4;--badge-bg:#30291a;--badge-ink:#e5c779;--icon:#aaaab0;--note-bg:#111114;--note-border:#62626b;--code-bg:#17171c;--focus:#b4d7f0}
/* Exact RGB inverse of Supernova; media retain their original colors. */
:root[data-theme="novasuper"]{color-scheme:light;--ink:#1a1a1a;--muted:#55554f;--line:#ccccc7;--paper:#ffffff;--surface:#eeeeeb;--hover:#dadad6;--underline:#88887f;--tag-border:#afafa7;--tag-ink:#43433b;--badge-bg:#cfd6e5;--badge-ink:#1a3886;--icon:#55554f;--note-bg:#eeeeeb;--note-border:#9d9d94;--code-bg:#e8e8e3;--focus:#4b280f}
:root[data-theme="light"]{--title-ink:#1a1a1a;--subtitle-ink:#0006}
@media(prefers-color-scheme:light){:root:not([data-theme]){--title-ink:#1a1a1a;--subtitle-ink:#0006}}
/* Keep one fixed, non-interactive star field behind every page's content. */
:root:is([data-theme="supernova"],[data-theme="novasuper"]) body{isolation:isolate}
.supernova-background{position:fixed;inset:0;width:100%;height:100%;z-index:-1;pointer-events:none;opacity:0;transition:opacity .6s ease}
.supernova-background.is-ready{opacity:1}
:root[data-theme="novasuper"] .supernova-background{filter:invert(1)}
@media print{.supernova-background{display:none}}
@media(prefers-color-scheme:dark){:root:not([data-theme]){color-scheme:dark;--ink:#e5e5e5;--muted:#a6a6ab;--line:#35363a;--paper:#18191b;--surface:#222326;--hover:#2d2e32;--underline:#77787f;--tag-border:#51525a;--tag-ink:#b7b7bd;--badge-bg:#38311e;--badge-ink:#e5c779;--icon:#a6a6ab;--note-bg:#232427;--note-border:#64656d;--code-bg:#292a2e;--focus:#94c6e5}}
*{box-sizing:border-box}
html{font-size:16.2px;scroll-behavior:smooth;scroll-padding-top:24px}
body{margin:0;background:var(--paper);color:var(--ink);font-family:var(--font-body);line-height:1.6;-webkit-font-smoothing:antialiased}
a{color:inherit;text-decoration:none;transition:color .15s ease}
a:hover{color:var(--muted)}
a:focus-visible,button:focus-visible,summary:focus-visible,input:focus-visible{outline:2px solid var(--focus);outline-offset:5px;border-radius:2px}
p,h1,h2,h3,figure,dl,dd{margin:0}
strong{font-weight:600}
img{display:block;max-width:100%;height:auto}
svg{width:1em;height:1em;vertical-align:-.1em}
.skip-link{position:absolute;left:16px;top:-100px;background:var(--paper);padding:8px 14px;z-index:10}
.skip-link:focus{top:10px}
.contents{max-width:calc(var(--content-width) + 32px);margin:0 auto;padding:2rem 16px 0;display:flex;flex-direction:column;gap:3rem}
.top{position:relative;display:flex;align-items:center;min-height:120px;margin-bottom:24px}
.identity{display:flex;align-items:center;gap:20px}
.portrait{width:120px;height:120px;object-fit:cover;border-radius:50%;flex-shrink:0}
/* Homepage type scale from the supplied font-inspector screenshots.
   Akzidenz is reserved for the name; other headings use Ubuntu Sans. */
.name{font-family:var(--font-name);font-size:2.5rem;line-height:1;font-weight:600;letter-spacing:-.08rem;color:var(--ink)}
.page-title{font-family:var(--font-heading);font-size:2rem;line-height:1.2;font-weight:600;color:var(--ink)}
.subtitle{font-family:var(--font-body);color:var(--subtitle-ink);font-size:1.17rem;font-weight:400;line-height:1.2}
.social{position:absolute;right:0;top:30px;display:flex;gap:10px}
.social a,.theme-picker summary{display:flex;align-items:center;justify-content:center;width:32px;height:32px;border-radius:50%;background:var(--surface);color:var(--muted)}
.social a:hover,.theme-picker summary:hover{background:var(--hover);color:var(--ink)}
.social svg{width:17px;height:17px}
.social .cv-icon{font-size:.75rem;font-weight:700;letter-spacing:-.02em}
/* The way to the message page, under the social links and styled like them. */
.message-link{position:absolute;right:0;top:76px;display:inline-flex;align-items:center;gap:7px;padding:5px 13px 5px 11px;border-radius:999px;background:var(--surface);color:var(--muted);font-size:.8rem;line-height:1.4;white-space:nowrap}
.message-link:hover{background:var(--hover);color:var(--ink)}
.message-link svg{width:15px;height:15px}
.appearance-controls{display:flex;align-items:center;gap:8px;flex-shrink:0}
.appearance-controls:has(.theme-picker[hidden]):not(:has(.theme-picker:not([hidden]))){display:none}
.theme-picker{position:relative;flex-shrink:0;z-index:70}
.theme-picker[hidden]{display:none}
.theme-picker summary{list-style:none;cursor:pointer;width:32px;height:32px;padding:7px;background:var(--surface);border-radius:50%;color:var(--muted)}
.theme-picker summary::-webkit-details-marker{display:none}
.theme-picker summary svg{display:block;width:18px;height:18px}
.theme-menu{position:absolute;top:40px;right:0;width:174px;margin:0;padding:12px 8px 8px;border:1px solid var(--line);border-radius:6px;background:var(--paper);box-shadow:0 6px 24px #0002;font-size:.85rem;color:var(--ink);text-align:left}
.theme-menu legend{padding:0 6px;font-size:.75rem;color:var(--muted)}
.theme-menu label{display:flex;align-items:center;gap:10px;padding:8px;cursor:pointer;border-radius:3px;line-height:1.25}
.theme-menu label:hover,.theme-menu label:has(input:checked){background:var(--hover)}
.theme-menu input{margin:0;accent-color:var(--focus)}
.theme-swatch{width:14px;height:14px;border:1px solid #888;border-radius:50%;flex-shrink:0}
.swatch-auto{background:linear-gradient(90deg,#fff 50%,#18191b 50%)}.swatch-light{background:#fff}.swatch-rust{background:#f2e7d5}.swatch-coal{background:#18191b}.swatch-navy{background:#161923}.swatch-ayu{background:#0f1419}.swatch-novasuper{background:radial-gradient(circle at 30% 30%,#000 0 1px,transparent 1.5px),radial-gradient(circle at 70% 65%,#000 0 .8px,transparent 1.3px),#fff}.swatch-supernova{background:radial-gradient(circle at 30% 30%,#fff 0 1px,transparent 1.5px),radial-gradient(circle at 70% 65%,#fff 0 .8px,transparent 1.3px),#000}
.page-tools{display:flex;align-items:center;justify-content:space-between;gap:16px;margin-bottom:32px}
.page-tools .back-link{margin-bottom:0}
.info{padding:1rem 1rem 0}
.info p+p{margin-top:1rem}
.info a:hover,.now a:hover,.prose a:hover,.contact-copy a:hover{text-decoration:underline;text-underline-offset:3px}
/* Section underlines and 3rem gaps distinguish the main sections. */
.section-title,.prose h2{font-family:var(--font-body);font-size:1.4rem;font-weight:500;line-height:1.6;margin:0 0 1rem;border-bottom:1px solid var(--line)}
.now{display:flex;flex-direction:column;gap:1rem}
.now-row{display:grid;grid-template-columns:6rem 1fr;line-height:1.3}
.now-label{font-size:.8rem;font-weight:400;line-height:1.3;color:var(--muted);padding-top:2px}
.project-list{display:flex;flex-direction:column;gap:4rem}
.project{display:grid;grid-template-columns:243px minmax(0,1fr);gap:32px;align-items:center}
.project-image{display:block}
.project-image img{width:243px;aspect-ratio:2/1;object-fit:cover;object-position:center;border-radius:2px;transition:opacity .15s ease}
.project-image:hover img{opacity:.86}
.project-meta{display:flex;align-items:center;flex-wrap:wrap;gap:6px;font-size:.85rem;line-height:1.6rem;margin-bottom:.15rem}
.tag{border:1px solid var(--tag-border);border-radius:4px;padding:2px 5px;color:var(--tag-ink)}
.badge{background:var(--badge-bg);color:var(--badge-ink);border-radius:4px;padding:3px 6px}
.project-title,.writing-list h3,.recommendation-title,.notes h3{font-family:var(--font-body);font-size:1rem;font-weight:600;line-height:1.6}
.project-description,.writing-list p,.software-entry p,.notes p{font-size:.95rem;font-weight:400;color:var(--ink);line-height:1.3}
.book-author{font-size:.85rem;font-weight:400;color:var(--muted);line-height:1.5}
.project-links{display:flex;flex-wrap:wrap;gap:1rem;margin-top:.75rem;font-size:.85rem;line-height:1.6}
.project-links a{display:inline-flex;align-items:center;gap:5px}
.project-links svg{color:var(--icon);width:12px;height:12px}
.text-link{font-size:.88rem;color:var(--muted)}
.more-link{display:block;text-align:center;margin-top:25px;font-size:.88rem;color:var(--muted)}
.more-link:hover{color:var(--ink)}
.writing-heading{display:flex;align-items:baseline;justify-content:space-between;gap:1rem;margin:0 0 1rem;border-bottom:1px solid var(--line)}
.writing-heading .section-title{border:0;margin:0}.writing-heading>a{font-size:.85rem;color:var(--muted)}
.writing-list{list-style:none;padding:0;margin:0}
.writing-list>li{padding:.75rem 0;border-bottom:1px solid var(--line)}
.writing-entry{display:grid;gap:24px;align-items:center;min-width:0}
.writing-entry.has-thumbnail{grid-template-columns:minmax(0,1fr) 132px}
.writing-thumbnail{display:block;width:132px;height:132px;object-fit:contain;border-radius:4px;background:var(--surface)}
.writing-summary{min-width:0;overflow-wrap:break-word}
.writing-list h3{margin:0 0 .25rem}
.writing-entry:hover h3,.writing-entry:focus-visible h3{text-decoration:underline;text-underline-offset:3px}
.writing-list p{margin-bottom:.5rem}
.writing-list time{font-size:.8rem;line-height:1.3;color:var(--muted)}
@media(max-width:500px){.writing-entry{gap:16px;align-items:start}.writing-entry.has-thumbnail{grid-template-columns:minmax(0,1fr) 88px}.writing-thumbnail{width:88px;height:88px}}
.notes{display:grid;grid-template-columns:1fr 1fr;gap:32px}
.notes h3{margin-bottom:.25rem}

.notes a{text-decoration:underline;text-decoration-color:var(--underline);text-underline-offset:3px}
.section-intro{margin-bottom:.75rem}
.book-list,.software-list{list-style:none;margin:0;padding:0;display:grid;gap:1.5rem}
.book-list{grid-template-columns:repeat(3,minmax(0,1fr))}
.book-entry,.software-entry{display:block;height:100%;min-width:0}
.book-cover{height:210px;display:flex;align-items:flex-end;justify-content:flex-start;margin-bottom:14px}
.book-cover img{width:auto;height:auto;max-height:100%;max-width:100%;object-fit:contain;box-shadow:0 2px 8px #0002;border-radius:1px}
.recommendation-title{margin:0 0 .25rem}

.software-entry:hover .recommendation-title{text-decoration:underline;text-underline-offset:3px}
.software-list{grid-template-columns:repeat(2,minmax(0,1fr));gap:0 32px}
.software-list>li{border-bottom:1px solid var(--line)}
.software-entry{padding:.75rem 0}
.software-arrow{color:var(--muted);font-size:.85em;margin-left:3px}
.recommendations-sections{display:flex;flex-direction:column;gap:3rem;margin-top:3rem}
@media(max-width:500px){.book-list{grid-template-columns:repeat(2,minmax(0,1fr));gap:28px 20px}.book-cover{height:180px}.software-list{grid-template-columns:1fr}}
.contact-copy{font-size:1rem}
.footer{display:flex;align-items:center;justify-content:center;flex-wrap:wrap;gap:8px 20px;margin:0 auto;padding:72px 16px 40px;color:var(--muted);font-size:.75rem}
.footer a:hover{color:var(--ink)}
.page{max-width:calc(var(--content-width) + 32px);margin:0 auto;padding:2rem 16px 0}
.back-link{display:inline-flex;gap:8px;align-items:center;font-size:.9rem;color:var(--muted);margin-bottom:32px}
.page-title{margin-bottom:.75rem}
.page-subtitle{color:var(--muted);margin-bottom:20px;line-height:1.5}
.page-links{border-bottom:1px solid var(--line);padding-bottom:24px;margin-bottom:28px}
.cover{width:100%;aspect-ratio:2/1;object-fit:cover;border-radius:3px;margin-bottom:10px}
.cover-caption{font-size:.78rem;color:var(--muted);margin-bottom:32px}
.prose{overflow-wrap:break-word}
.prose p{margin:0 0 .75rem}
.prose section{margin-top:1.5rem}

.prose h3{font-size:1rem;font-weight:600;line-height:1.6;margin:1rem 0 .5rem}
.prose ul,.prose ol{padding-left:24px;margin:16px 0 24px}
.prose li+li{margin-top:8px}
.article-lead{font-size:1rem}
.article-note{background:var(--note-bg);border-left:2px solid var(--note-border);padding:16px 20px;margin:24px 0;font-size:.9rem}
.article-note p:last-child{margin-bottom:0}
.metrics{display:grid;grid-template-columns:repeat(4,1fr);gap:16px;margin:28px 0;padding:20px 0;border-top:1px solid var(--line);border-bottom:1px solid var(--line)}
.metrics dt{font-size:1.4rem;font-weight:500}
.metrics dd{font-size:.75rem;line-height:1.5;color:var(--muted);margin-top:4px}
.table-scroll{max-width:100%;overflow-x:auto;margin:24px 0}
.prose table{border-collapse:collapse;width:100%;font-size:.85rem}
.prose td,.prose th{padding:12px;text-align:left;vertical-align:top;border-bottom:1px solid var(--line);min-width:100px}
.prose th{font-weight:600;background:var(--surface)}
.prose code{font-family:var(--font-mono);font-size:.85em;background:var(--code-bg);border-radius:3px;padding:2px 4px;overflow-wrap:anywhere}
.code-block{margin:24px 0;border:1px solid var(--line);border-radius:5px;overflow:hidden}
.code-block figcaption{font-size:.75rem;color:var(--muted);padding:8px 16px;border-bottom:1px solid var(--line)}
.prose pre{overflow-x:auto;margin:0;background:var(--surface);padding:20px;font-size:.86rem;line-height:1.7;max-width:100%}
.prose pre code{background:none;padding:0;overflow-wrap:normal}
.article-end{border-top:1px solid var(--line);padding-top:24px;margin-top:48px;display:flex;flex-wrap:wrap;justify-content:space-between;gap:16px;font-size:.9rem}
.simple-page{min-height:65vh}
@media(max-width:760px){.top{flex-wrap:wrap}.social{position:static;margin-left:140px;margin-top:16px}.message-link{position:static;margin:16px 0 0 auto}.identity{width:100%}.project{grid-template-columns:220px minmax(0,1fr);gap:24px}.project-image img{width:220px}}
@media(max-width:700px){.contents{padding-top:2rem}.info{padding:0}.top{margin-bottom:24px}.name{font-size:2.2rem}.subtitle{font-size:.85rem}.portrait{width:100px;height:100px}.identity{gap:16px}.social{margin-left:116px;margin-top:12px;gap:12px}.project-list{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:36px 24px}.project{display:flex;flex-direction:column;align-items:stretch;gap:16px}.project-image img{width:100%}.now-row{grid-template-columns:80px 1fr}.notes{gap:24px}.metrics{grid-template-columns:repeat(2,1fr)}.footer{padding-top:48px}}
@media(max-width:500px){.project-list{grid-template-columns:1fr;gap:36px}.project-image img{aspect-ratio:2/1}.project{gap:14px}.now-row{display:block}.now-label{display:block;margin-bottom:4px}.notes{grid-template-columns:1fr;gap:24px}.portrait{width:86px;height:86px}.social{margin-left:102px}.contents{padding-left:20px;padding-right:20px}.page{padding-left:20px;padding-right:20px}}
@media(max-width:500px){.social{margin-left:0;width:100%;justify-content:flex-end}}
@media(prefers-reduced-motion:reduce){html{scroll-behavior:auto}*{transition:none!important}}
@media print{:root[data-theme],:root:not([data-theme]){color-scheme:light;--ink:#262626;--muted:#0006;--line:#0000001a;--paper:#fff;--surface:#fafafa;--underline:#aaa;--note-bg:#f7f7f5;--note-border:#c9c9c1;--code-bg:#f5f5f5;--tag-border:#cecece;--tag-ink:#646464;--badge-bg:#fff7de;--badge-ink:#856315;--icon:#888}.social,.message-link,.footer,.back-link,.skip-link,.theme-picker,.page-tools{display:none}.page,.contents{padding:0;max-width:none}body{font-size:11pt}.prose pre{white-space:pre-wrap}.project,.prose section{break-inside:avoid}}

/* Shared side-footnote apparatus. A symmetric gutter keeps the text centered. */
.with-margin{display:flow-root}
.margin-note{border-left:1px solid var(--note-border);padding:4px 0 4px 16px;margin:0 0 20px;font-size:.8rem;line-height:1.4;color:var(--muted);overflow-wrap:anywhere;scroll-margin-top:82px}
.margin-note>a:first-child{vertical-align:super;margin-right:5px;color:var(--focus)}
.margin-note p:last-child{margin-bottom:0}
.prose sup a[id]{scroll-margin-top:82px}
.margin-note:target{outline:1px solid var(--focus);outline-offset:6px}
@media screen and (min-width:1200px){.with-margin{display:grid;grid-template-columns:minmax(0,1fr) 160px;gap:24px;margin-right:-184px;align-items:start}.with-margin>.margin-note{grid-column:2;grid-row:1;border:0;padding:3px 0;margin:0 0 20px}}
@media print{.with-margin{display:block;margin-right:0}.margin-note{border-left:1px solid var(--note-border);padding-left:12px}.appearance-controls{display:none}}
