@import"https://fonts.googleapis.com/css2?family=Newsreader:ital,opsz,wght@0,6..72,400..700;1,6..72,400..700&display=swap";:root{--font-serif: "Newsreader", "Iowan Old Style", Georgia, "Times New Roman", serif;--font-sans: ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif;--text-meta: .75rem;--text-ui: 1.05rem;--text-body: 1.125rem;--text-page: 1.2rem;--text-display: clamp(1.65rem, 4vw, 2.1rem);--text-section: 1.25rem;--leading-tight: 1.2;--leading-snug: 1.45;--leading-normal: 1.6;--leading-relaxed: 1.7;--space-1: .25rem;--space-2: .5rem;--space-3: .75rem;--space-4: 1rem;--space-5: 1.5rem;--space-6: 2rem;--space-7: 2.75rem;--space-8: 4rem;--space-9: 5rem;--max-width: 480px;--max-width-prose: 640px;--page-pad-x: 1.25rem;--page-pad-top: 2.75rem;--page-pad-bottom: 5rem;--bar-pad-top: 1.15rem;--t-fast: color .15s ease, background-color .15s ease, border-color .15s ease}[data-theme=light]{--bg: #fff;--text: #1a1a1a;--muted: #5c5c5c;--meta: #8a8a8a;--rule: #ebebeb;--code-bg: #f5f5f5;--media-bg: #f0f0f0}[data-theme=dark]{--bg: #111;--text: #ececec;--muted: #9a9a9a;--meta: #6e6e6e;--rule: #2a2a2a;--code-bg: #1c1c1c;--media-bg: #1a1a1a}:root{color-scheme:light dark}*,*:before,*:after{box-sizing:border-box;margin:0;padding:0}html{font-size:16px;-webkit-text-size-adjust:100%;scroll-behavior:smooth}body{min-height:100vh;background:var(--bg);color:var(--text);font-family:var(--font-serif);font-size:var(--text-ui);line-height:var(--leading-normal);-webkit-font-smoothing:antialiased;text-rendering:optimizeLegibility;transition:var(--t-fast)}a{color:inherit;text-decoration:none;text-decoration-thickness:1px;text-underline-offset:.15em;transition:var(--t-fast)}a:hover{text-decoration:underline}::selection{background:var(--text);color:var(--bg)}.meta{font-family:var(--font-sans);font-size:var(--text-meta);font-weight:400;line-height:var(--leading-snug);color:var(--meta);font-variant-numeric:tabular-nums}.site-bar{display:flex;align-items:center;justify-content:space-between;max-width:var(--max-width);margin:0 auto;padding:var(--bar-pad-top) var(--page-pad-x) 0}.site-bar--prose{max-width:var(--max-width-prose)}.site-bar--home{justify-content:flex-end}.site-name{font-family:var(--font-serif);font-size:var(--text-ui);font-weight:500;line-height:var(--leading-snug);color:var(--muted);text-decoration:none;white-space:nowrap;transition:color .15s ease}.site-name:hover,.site-name:focus-visible{color:var(--text);text-decoration:none}.site-name-mark{display:inline-flex;align-items:baseline}.site-name-rest,.site-name-gap{display:grid;grid-template-columns:1fr;opacity:1}.site-name-rest>span,.site-name-gap>span{overflow:hidden;white-space:nowrap}@media(hover:hover){.site-name-rest,.site-name-gap{grid-template-columns:0fr;opacity:0;transition:grid-template-columns .4s cubic-bezier(.2,0,0,1),opacity .28s cubic-bezier(.2,0,0,1)}.site-name:hover .site-name-rest,.site-name:focus-visible .site-name-rest,.site-name:hover .site-name-gap,.site-name:focus-visible .site-name-gap{grid-template-columns:1fr;opacity:1}}.theme-toggle{display:inline-flex;align-items:center;justify-content:center;width:2rem;height:2rem;margin-right:-.35rem;padding:0;border:none;background:transparent;color:var(--meta);cursor:pointer;transition:var(--t-fast)}.theme-toggle:hover{color:var(--text)}.theme-toggle svg{width:1rem;height:1rem}[data-theme=light] .theme-toggle .icon-sun,[data-theme=dark] .theme-toggle .icon-moon{display:none}.page{max-width:var(--max-width);margin:0 auto;padding:var(--page-pad-top) var(--page-pad-x) var(--page-pad-bottom)}.page--prose{max-width:var(--max-width-prose)}.page-title{font-size:var(--text-page);font-weight:500;letter-spacing:-.015em;line-height:var(--leading-tight);text-wrap:balance;margin-bottom:var(--space-5)}.page-title--flush{margin-bottom:var(--space-2)}.entry-title{font-size:var(--text-display);font-weight:500;letter-spacing:-.02em;line-height:var(--leading-tight);text-wrap:balance;margin-bottom:var(--space-2)}.entry-eyebrow{font-style:italic;font-size:var(--text-ui);line-height:var(--leading-snug);color:var(--muted);text-wrap:pretty;margin-bottom:var(--space-2)}.entry-dek{font-size:var(--text-body);line-height:var(--leading-normal);color:var(--text);text-wrap:pretty;margin-bottom:var(--space-2)}.entry-meta{font-family:var(--font-sans);font-size:var(--text-meta);line-height:var(--leading-snug);color:var(--meta);font-variant-numeric:tabular-nums;margin-bottom:var(--space-6)}.entry-meta a{color:var(--muted);text-decoration:none}.entry-meta a:hover{color:var(--text);text-decoration:underline}.entry-meta-sep{margin:0 .4rem}.bio{font-size:var(--text-body);line-height:var(--leading-normal);color:var(--text);text-wrap:pretty;max-width:36em;margin-bottom:var(--space-7)}.list{list-style:none;margin-bottom:var(--space-6)}.list:last-child{margin-bottom:0}.list li{display:flex;justify-content:space-between;align-items:baseline;gap:var(--space-4);padding:.35rem 0}.list a{text-decoration:none}.list a:hover{text-decoration:underline}.list-meta{font-family:var(--font-sans);font-size:var(--text-meta);line-height:var(--leading-snug);color:var(--meta);white-space:nowrap;flex-shrink:0;font-variant-numeric:tabular-nums}.draft-label{margin-right:var(--space-2);color:var(--muted)}.footer-links{display:flex;flex-wrap:wrap;gap:var(--space-2) var(--space-5);margin-top:var(--space-2)}.footer-links a{text-decoration:none}.footer-links a:hover{text-decoration:underline}.empty{color:var(--muted)}.favorites-quote{margin:var(--space-9) 0 0;padding:0;border:0;opacity:1;transition:opacity .7s ease}.favorites-quote.is-pending,.favorites-quote.is-fading{opacity:0}.favorites-quote p{margin:0;font-style:italic;font-size:var(--text-body);line-height:var(--leading-normal);color:var(--muted)}.favorites-quote cite{display:block;margin-top:var(--space-3);font-family:var(--font-sans);font-size:var(--text-meta);font-style:normal;letter-spacing:.04em;color:var(--meta)}.lib-group{margin-bottom:var(--space-6)}.lib-group:last-child{margin-bottom:0}.lib-group h2{font-size:var(--text-meta);font-family:var(--font-sans);font-weight:500;letter-spacing:.08em;text-transform:uppercase;color:var(--meta);margin-bottom:var(--space-3)}.lib-row{display:flex;justify-content:space-between;align-items:baseline;gap:var(--space-4);padding:.35rem 0;text-decoration:none}.lib-row:hover{text-decoration:none}.lib-row:hover .lib-title{text-decoration:underline}.lib-title{flex:1;min-width:0}.lib-by{font-family:var(--font-sans);font-size:var(--text-meta);color:var(--meta);white-space:nowrap;flex-shrink:0}.project .entry-meta{margin-bottom:var(--space-6)}.project-video{position:relative;margin:0 0 var(--space-6);background:var(--media-bg);aspect-ratio:1512 / 948;overflow:hidden}.project-video video,.project-video img:not(.project-video-device-bezel),.project-video-lightbox-frame video,.project-video-device-screen video{display:block;width:100%;height:100%;object-fit:cover}.project-video--contain video,.project-video--contain img:not(.project-video-device-bezel){object-fit:contain}.project-video--device{background:transparent;aspect-ratio:auto;overflow:visible;display:flex;justify-content:center}.project-video-device,.project-video-lightbox-device{position:relative;width:min(100%,280px);aspect-ratio:1350 / 2760;overflow:hidden;border-radius:15.5%/7.6%}.project-video-device-screen{position:absolute;inset:2.5% 5.333%;overflow:hidden;border-radius:15.5%/7.15%;background:#000}.project-video-device-bezel{position:absolute;inset:0;z-index:1;display:block;width:100%;height:100%;pointer-events:none;user-select:none}.project-video--device .project-video-open{z-index:2}.project-video-open{position:absolute;inset:0;border:0;padding:0;margin:0;background:transparent;cursor:zoom-in}.project-video-lightbox{border:none;padding:0;margin:auto;background:transparent;max-width:min(96vw,1120px);width:100%;overflow:hidden}.project-video-lightbox::backdrop{background:color-mix(in srgb,#000 45%,transparent);-webkit-backdrop-filter:blur(6px);backdrop-filter:blur(6px)}.project-video-lightbox-frame{width:min(100%,calc(90vh * 1512 / 948));margin-inline:auto;background:var(--media-bg);aspect-ratio:1512 / 948;overflow:hidden;cursor:zoom-out}.project-video-lightbox-device{width:min(72vw,calc(90vh * 1350 / 2760),360px);margin-inline:auto;cursor:zoom-out}@media(prefers-reduced-motion:no-preference){.project-video-lightbox[open]{animation:project-video-in .22s cubic-bezier(.2,0,0,1)}.project-video-lightbox[open]::backdrop{animation:project-video-backdrop-in .22s cubic-bezier(.2,0,0,1)}}@keyframes project-video-in{0%{opacity:0;transform:scale(.98)}to{opacity:1;transform:scale(1)}}@keyframes project-video-backdrop-in{0%{opacity:0}to{opacity:1}}.project-body{display:flex;flex-direction:column;gap:var(--space-4);font-size:var(--text-body);line-height:var(--leading-relaxed);color:var(--text);text-wrap:pretty;margin-bottom:var(--space-5)}.project-stack{font-family:var(--font-sans);font-size:var(--text-meta);line-height:var(--leading-snug);color:var(--meta)}.essay .entry-meta{margin-bottom:var(--space-6)}.essay-body{margin-bottom:0}.essay .draft-label{margin-right:0;text-transform:lowercase}.prose{font-size:var(--text-body);line-height:var(--leading-relaxed);color:var(--text)}.prose>*+*{margin-top:1.25em}.prose h2,.prose h3,.prose h4{font-weight:500;letter-spacing:-.015em;line-height:var(--leading-tight);color:var(--text);text-wrap:balance}.prose h2{font-size:var(--text-section);margin-top:2.25em}.prose h3{font-size:var(--text-body);margin-top:1.75em}.prose a{text-decoration:none}.prose a:hover{text-decoration:underline}.prose p,.prose li{text-wrap:pretty}.prose ul,.prose ol{padding-left:1.2em}.prose li+li{margin-top:.4em}.prose blockquote{margin:1.75em 0;padding:0 0 0 var(--space-5);border-left:1.5px solid var(--text);font-style:italic;font-size:1.05em;line-height:var(--leading-relaxed);color:var(--text)}.prose blockquote>*+*{margin-top:.75em}.prose blockquote p:last-child:not(:only-child){font-family:var(--font-sans);font-size:var(--text-meta);font-style:normal;color:var(--meta);margin-top:var(--space-3)}.prose code{font-family:var(--font-sans);font-size:.86em;background:var(--code-bg);padding:.12em .35em;border-radius:3px}.prose pre{background:var(--code-bg);padding:var(--space-4);border-radius:4px;overflow-x:auto;font-size:.85rem;line-height:1.5}.prose pre code{background:none;padding:0;font-size:inherit}.prose hr{border:none;border-top:1px solid var(--rule);margin:2.5em 0}.prose figure{margin:2em 0}.prose figure img,.prose>p>img{display:block;width:100%;height:auto;background:var(--media-bg);outline:1px solid rgba(0,0,0,.1)}[data-theme=dark] .prose figure img,[data-theme=dark] .prose>p>img{outline-color:#ffffff1a}.prose figcaption{font-family:var(--font-sans);font-size:var(--text-meta);color:var(--meta);margin-top:var(--space-3);text-wrap:pretty}.prose strong{font-weight:600}.toc{display:none}@media(min-width:1100px){.toc{display:block;position:fixed;top:5rem;left:max(1rem,calc(50% - var(--max-width-prose) / 2 - 11rem));width:9.5rem;font-family:var(--font-sans);font-size:var(--text-meta);line-height:1.4}.toc-title{color:var(--meta);letter-spacing:.08em;text-transform:uppercase;margin-bottom:var(--space-3);font-size:.65rem}.toc ul{list-style:none}.toc li+li{margin-top:.35rem}.toc a{color:var(--meta);text-decoration:none}.toc a:hover,.toc a.active{color:var(--text);text-decoration:none}.toc .depth-3{padding-left:.65rem}}.resume .entry-meta{margin-bottom:var(--space-7)}.resume-body>h2{font-family:var(--font-sans);font-size:var(--text-meta);font-weight:500;letter-spacing:.08em;text-transform:uppercase;color:var(--meta);margin-top:var(--space-7);margin-bottom:var(--space-4)}.resume-body>h2:first-child{margin-top:0}.resume-employer,.resume-entry{margin-bottom:var(--space-6)}.resume-body>*+.resume-employer,.resume-body>*+.resume-entry{margin-top:0}.resume-entry-header{display:flex;justify-content:space-between;align-items:baseline;gap:var(--space-4);margin-bottom:var(--space-2)}.resume-entry-company{font-size:var(--text-body);font-weight:500;color:var(--text)}.resume-entry-location{font-family:var(--font-sans);font-size:var(--text-meta);color:var(--meta);margin-left:var(--space-2)}.resume-entry-dates,.resume-role-period{font-family:var(--font-sans);font-size:var(--text-meta);color:var(--meta);white-space:nowrap;font-variant-numeric:tabular-nums}.resume-entry-title,.resume-role-title{font-size:var(--text-body);font-weight:400;color:var(--text);margin:0 0 var(--space-2)}.timeline-roles{display:flex;flex-direction:column;margin-top:var(--space-3)}.timeline-entry{display:grid;grid-template-columns:14px 1fr;gap:14px}.timeline-track{display:flex;flex-direction:column;align-items:center;padding-top:.4rem}.timeline-dot{width:9px;height:9px;border:1.5px solid var(--text);background:var(--bg);border-radius:50%;flex-shrink:0;position:relative;z-index:1}.timeline-dot--current{background:var(--text);box-shadow:0 0 0 3px color-mix(in srgb,var(--text) 12%,transparent)}.timeline-line{flex:1 0 auto;width:1px;margin-top:0;margin-bottom:calc(-.4rem - 4.5px);background:var(--rule);min-height:1rem}.timeline-body{min-width:0;padding:.15rem 0 1rem}.timeline-entry:last-child .timeline-body{padding-bottom:.35rem}.resume-role-header{display:flex;justify-content:space-between;align-items:baseline;gap:var(--space-4);margin-bottom:var(--space-2)}.resume-role-title{margin-bottom:0}.resume-role-team{font-family:var(--font-sans);font-size:var(--text-meta);font-weight:400;color:var(--meta)}.resume-role-period{margin:0}.timeline-body ul,.resume-entry ul{padding-left:1.15em;font-size:var(--text-body);line-height:var(--leading-normal);color:var(--text);text-wrap:pretty}.timeline-body ul li+li,.resume-entry ul li+li{margin-top:.35em}.resume-edu-line{font-size:var(--text-body);line-height:var(--leading-normal);color:var(--text);margin:0}.resume-projects{margin-bottom:0}.resume-skills{display:flex;flex-direction:column;gap:var(--space-3)}.resume-skill{display:grid;grid-template-columns:7.5rem 1fr;gap:var(--space-4);align-items:baseline}.resume-skill-label{font-family:var(--font-sans);font-size:var(--text-meta);color:var(--muted)}.resume-skill-items{font-family:var(--font-sans);font-size:var(--text-meta);line-height:var(--leading-snug);color:var(--meta)}@media(max-width:520px){.resume-entry-header,.resume-role-header{flex-direction:column;align-items:flex-start;gap:var(--space-1)}.resume-skill{grid-template-columns:1fr;gap:var(--space-1)}.list li,.lib-row{flex-direction:column;align-items:flex-start;gap:.1rem}.list-meta,.lib-by{white-space:normal}}
