:root{--paper: #f6f5f1;--ink: #1c1b18;--ink-soft: #55534c;--line: #d8d5cc;--accent: #3e5c55;--accent-soft: #7a9089}@media (prefers-color-scheme: dark){:root{--paper: #17181a;--ink: #eceae4;--ink-soft: #a19d92;--line: #34342f;--accent: #8fb3a8;--accent-soft: #5c7a70}}*{box-sizing:border-box}body{margin:0;background:var(--paper);color:var(--ink);font-family:var(--font-mono, "IBM Plex Mono"),ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;font-size:15px;line-height:1.65}.wrap{max-width:var(--page-width, 640px);margin:0 auto;padding:4.5rem 1.5rem 6rem}@media (max-width: 480px){.wrap{padding:3rem 1.25rem 4rem}}.avatar{width:var(--avatar-size, 72px);height:var(--avatar-size, 72px);border-radius:50%;object-fit:cover;border:1px solid var(--line);flex-shrink:0}header.intro{display:flex;justify-content:space-between;align-items:flex-start;gap:2rem;margin-bottom:3.5rem}.intro-text{min-width:0;flex:1}@media (max-width: 520px){header.intro{flex-direction:column-reverse;gap:1.1rem}}h1{font-family:var(--font-serif, "IBM Plex Serif"),Georgia,serif;font-weight:400;font-size:1.9rem;letter-spacing:-.01em;margin:0 0 .85rem}.role{color:var(--ink-soft);margin:0 0 1.1rem;font-size:.95rem}.bio{max-width:56ch;margin:0 0 1.4rem}.bio a{color:var(--accent)}nav.links{display:flex;gap:1.25rem;font-size:.9rem}nav.links a{color:var(--ink-soft);text-decoration:none;border-bottom:1px solid transparent}nav.links a:hover,nav.links a:focus-visible{color:var(--accent);border-bottom-color:var(--accent-soft)}section{margin-bottom:3.25rem}section>h2{font-family:var(--font-serif, "IBM Plex Serif"),Georgia,serif;font-weight:400;font-style:italic;font-size:1.05rem;color:var(--ink-soft);margin:0 0 1.25rem}.row{display:block;padding:1.15rem 0;border-top:1px solid var(--line);text-decoration:none;color:inherit}.row-top{display:flex;justify-content:space-between;align-items:baseline;gap:1rem}.row-title{font-size:1rem;font-weight:500}a.row:hover .row-title,a.row:focus-visible .row-title{color:var(--accent)}.row-year{color:var(--ink-soft);font-size:.85rem;white-space:nowrap}.row-desc{color:var(--ink-soft);margin-top:.4rem;font-size:.9rem;max-width:58ch}.row-tags{margin-top:.55rem;font-size:.78rem;color:var(--accent-soft)}.row-tags span:not(:last-child):after{content:" · ";color:var(--line)}footer{color:var(--ink-soft);font-size:.72rem;padding-top:1.5rem;border-top:1px solid var(--line);white-space:nowrap;overflow-x:auto}@media (max-width: 480px){footer{white-space:normal;overflow-x:visible}}footer a{color:var(--ink-soft)}.row--with-image{display:flex;gap:1.25rem;align-items:flex-start}.row-thumb{width:var(--thumb-width, 220px);height:var(--thumb-height, 150px);object-fit:cover;border:1px solid var(--line);flex-shrink:0;margin-top:.15rem}.row-body{flex:1;min-width:0}@media (max-width: 620px){.row--with-image{flex-direction:column;gap:.85rem}.row-thumb{width:100%;height:auto;aspect-ratio:16 / 10}}.hero{width:100%;height:auto;border:1px solid var(--line);margin-bottom:2rem;display:block}.gallery{margin-top:2.5rem;display:grid;grid-template-columns:repeat(auto-fill,minmax(160px,1fr));gap:.75rem}.gallery img{width:100%;height:140px;object-fit:cover;border:1px solid var(--line)}:focus-visible{outline:2px solid var(--accent);outline-offset:2px}.prose{max-width:100%}.prose>*+*{margin-top:1.1em}.prose h1,.prose h2,.prose h3{font-family:var(--font-serif, "IBM Plex Serif"),Georgia,serif;font-weight:400;line-height:1.3;margin-top:1.8em}.prose h1{font-size:1.4rem}.prose h2{font-size:1.2rem}.prose h3{font-size:1.05rem}.prose p{color:var(--ink)}.prose a{color:var(--accent)}.prose ul,.prose ol{padding-left:1.3em}.prose li+li{margin-top:.35em}.prose img{max-width:100%;height:auto;border:1px solid var(--line);display:block}.prose blockquote{margin:0;padding-left:1em;border-left:2px solid var(--accent-soft);color:var(--ink-soft);font-style:italic}.prose code{font-size:.85em;background:var(--line);padding:.1em .35em;border-radius:3px}.prose pre{background:var(--line);padding:1em;overflow-x:auto;border-radius:4px}.prose pre code{background:none;padding:0}.prose hr{border:none;border-top:1px solid var(--line)}#bg-canvas{position:fixed;inset:0;z-index:0;pointer-events:none}@media (prefers-reduced-motion: reduce){#bg-canvas{display:none}}.wrap{position:relative;z-index:1}
