:root{--text-xs:.75rem;--text-sm:.875rem;--text-base:1rem;--text-lg:1.125rem;--text-xl:1.333rem;--text-2xl:1.777rem;--text-3xl:2.369rem;--text-4xl:3.157rem;--space-1:.25rem;--space-2:.5rem;--space-3:.75rem;--space-4:1rem;--space-6:1.5rem;--space-8:2rem;--space-12:3rem;--space-16:4rem;--primary-50:#f0f7f7;--primary-100:#dceae8;--primary-200:#badcd8;--primary-300:#8ec8c3;--primary-400:#5eafa9;--primary-500:#3d9690;--primary-600:#2d7471;--primary-700:#235a58;--primary-800:#1c4744;--primary-900:#173736;--neutral-50:#f9fafb;--neutral-100:#f2f4f7;--neutral-200:#e5e8ed;--neutral-300:#d1d6df;--neutral-400:#9ba5b7;--neutral-500:#667085;--neutral-600:#4d5871;--neutral-700:#384259;--neutral-800:#1e2a3b;--neutral-900:#121926;--accent-coral:#ff7a5c;--accent-gold:#f4b942;--accent-blue:#4ea5d9;--color-ink:#16191d;--color-ink-soft:#4a515a;--color-link:#235a58;--color-error:#b42318;--font-sans:"Inter", "Inter Fallback", system-ui, -apple-system, BlinkMacSystemFont, sans-serif;--font-display:"Inter", "Inter Fallback", system-ui, -apple-system, BlinkMacSystemFont, sans-serif;--font-serif:"Newsreader", "Newsreader Fallback", Georgia, "Times New Roman", serif;--line-tight:1.2;--line-snug:1.375;--line-normal:1.5;--line-relaxed:1.75;--transition-fast:.15s ease;--transition-normal:.25s ease;--transition-slow:.35s cubic-bezier(.4, 0, .2, 1);--shadow-sm:0 1px 2px #1018280d;--shadow-md:0 2px 6px #10182814;--shadow-lg:0 8px 16px #1018281a;--radius-sm:.25rem;--radius-md:.5rem;--radius-lg:1rem;--radius-full:9999px;font-family:var(--font-sans);line-height:var(--line-normal);font-synthesis:none;text-rendering:optimizelegibility;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;--lightningcss-light:initial;--lightningcss-dark: ;--lightningcss-light:initial;--lightningcss-dark: ;color-scheme:light;color:var(--neutral-800);background-color:var(--neutral-50);font-weight:400}*,:before,:after{box-sizing:border-box}html{scroll-behavior:smooth}body{background-color:var(--neutral-100);min-width:320px;min-height:100vh;color:var(--neutral-800);margin:0;padding:0}a{color:var(--primary-600);transition:color var(--transition-fast);font-weight:500;text-decoration:none}a:hover{color:var(--primary-500);text-decoration:underline}h1,h2,h3,h4,h5,h6{font-family:var(--font-display);font-weight:600;line-height:var(--line-tight);color:var(--neutral-900);margin-top:0}h1{font-size:var(--text-4xl);letter-spacing:-.02em}h2{font-size:var(--text-3xl);letter-spacing:-.01em}h3{font-size:var(--text-2xl)}h4{font-size:var(--text-xl)}button{border-radius:var(--radius-md);padding:var(--space-2) var(--space-4);font-size:var(--text-base);background-color:var(--primary-500);color:#fff;cursor:pointer;transition:background-color var(--transition-normal), transform var(--transition-normal), box-shadow var(--transition-normal);border:1px solid #0000;font-family:inherit;font-weight:500}button:hover{background-color:var(--primary-600);box-shadow:var(--shadow-md);transform:translateY(-2px)}button:focus,button:focus-visible{outline:2px solid var(--primary-300);outline-offset:2px}.text-center{text-align:center}.container{width:100%;max-width:1100px;padding:0 var(--space-4);margin:0 auto}.back-link,.home-link,.subtle-download{box-sizing:border-box;min-height:44px;color:var(--primary-600);font-weight:500;font-size:var(--text-base);padding:var(--space-2) var(--space-4);border-radius:var(--radius-md);box-shadow:var(--shadow-sm);cursor:pointer;transition:all var(--transition-normal);background-color:#fff;border:none;justify-content:center;align-items:center;font-family:inherit;line-height:1.2;text-decoration:none;display:inline-flex}.back-link:hover,.home-link:hover,.subtle-download:hover{color:var(--primary-500);background-color:var(--primary-50);box-shadow:var(--shadow-md);text-decoration:none;transform:translateY(-2px)}.tap-target-link{min-height:44px;padding:var(--space-2) 0;align-items:center;font-weight:500;display:inline-flex}@font-face{font-family:Newsreader;src:url(/fonts/newsreader-roman.c4b10fbd.woff2)format("woff2");font-style:normal;font-weight:400 500;font-display:swap}@font-face{font-family:Newsreader;src:url(/fonts/newsreader-italic.30a9315f.woff2)format("woff2");font-style:italic;font-weight:400 500;font-display:swap}@font-face{font-family:Inter;src:url(/fonts/inter-latin.9295811b.woff2)format("woff2");font-style:normal;font-weight:400 700;font-display:swap}@font-face{font-family:Newsreader Fallback;src:local(Georgia);size-adjust:96.14%;ascent-override:76.45%;descent-override:27.56%;line-gap-override:0%}@font-face{font-family:Inter Fallback;src:local(Arial);size-adjust:106.8%;ascent-override:90.71%;descent-override:22.59%;line-gap-override:0%}:root{--site-column:720px;--site-gutter:var(--space-6);--site-header-gap:calc(var(--space-12) * 2);color:var(--color-ink);background-color:#fff}body{color:var(--color-ink);background-color:#fff}a,a:hover{color:var(--color-link)}h1,h2,h3,h4{font-family:var(--font-serif);color:var(--color-ink);font-weight:500}:focus-visible{outline:2px solid var(--color-link);outline-offset:2px}#root{flex-direction:column;min-height:100dvh;display:flex}#root>*{width:100%}.site-header,.site-footer,.home-page,.resume-page,.posts-index,.projects-index,.contact-page,.not-found{max-width:calc(var(--site-column) + 2 * var(--site-gutter));padding-inline:var(--site-gutter);margin-inline:auto}.site-header{justify-content:space-between;align-items:center;gap:var(--space-2) var(--space-4);margin-bottom:var(--site-header-gap);flex-wrap:wrap;padding-top:28px;display:flex}.site-header__home{align-items:center;gap:var(--space-3);min-height:44px;font-family:var(--font-serif);color:var(--color-ink);font-size:1.25rem;font-weight:500;line-height:1.2;text-decoration:none;display:inline-flex}.site-header__home:hover{color:var(--color-ink);text-decoration:none}.site-header__photo{border-radius:var(--radius-full);object-fit:cover;flex-shrink:0;width:40px;height:40px}.site-nav__list{gap:var(--space-1);margin:0;padding:0;list-style:none;display:flex}.site-nav__link{min-height:44px;padding:0 var(--space-3);font-family:var(--font-sans);font-size:var(--text-sm);color:var(--neutral-700);text-underline-offset:6px;align-items:center;font-weight:500;line-height:1;text-decoration:none;text-decoration-thickness:1px;display:inline-flex}.site-nav__link:hover,.site-nav__link[aria-current=page]{color:var(--color-ink);text-decoration:underline}.site-nav__link[aria-current=page]{font-weight:600}.site-menu{display:none}.site-footer{justify-content:space-between;align-items:center;gap:0 var(--space-6);padding-top:var(--site-header-gap);padding-bottom:var(--space-8);font-family:var(--font-sans);color:var(--neutral-600);flex-wrap:wrap;margin-top:auto;font-size:.8125rem;line-height:1.4;display:flex}.site-footer__copy{margin:0}.site-footer__links{flex-wrap:wrap;margin:0 -10px 0 0;padding:0;list-style:none;display:flex}.site-footer__links a{min-height:44px;color:inherit;text-underline-offset:3px;align-items:center;padding:0 10px;font-weight:400;text-decoration:underline;text-decoration-thickness:1px;display:inline-flex}.site-footer__links a:hover{color:var(--color-ink)}@media (width<=480px){:root{--site-gutter:20px;--site-header-gap:var(--space-12)}.site-header{column-gap:var(--space-3);padding-top:var(--space-4);margin-bottom:var(--space-8)}.site-header__home{gap:10px;font-size:1.1875rem}.site-header__photo{width:32px;height:32px}.site-nav{display:none}.site-menu{display:block}.site-menu__button{width:44px;height:44px;color:var(--color-ink);cursor:pointer;margin-right:-8px;list-style:none;display:flex}.site-menu__button::-webkit-details-marker{display:none}.site-menu__button:before{content:"";background:currentColor;border-radius:1px;width:17px;height:2px;margin:auto;box-shadow:0 -4px,0 4px}html:has(.site-menu[open]){overflow:hidden}.site-header:has(.site-menu[open]){z-index:1;position:sticky;top:0}.site-menu__panel{z-index:-1;padding:77px var(--site-gutter) var(--space-8);background:#fff;flex-direction:column;display:flex;position:fixed;inset:0;overflow-y:auto}.site-menu__list,.site-menu__more{margin:0;padding:0;list-style:none}.site-menu__list a{border-bottom:1px solid var(--neutral-200);min-height:65px;font-family:var(--font-serif);color:var(--color-ink);justify-content:space-between;align-items:center;font-size:2rem;font-weight:500;line-height:1.2;text-decoration:none;display:flex}.site-menu__list a:after{content:"";border:solid var(--neutral-400);border-width:1.5px 1.5px 0 0;width:8px;height:8px;margin-right:8px;transform:rotate(45deg)}.site-menu__more{padding-top:var(--space-8);font-family:var(--font-sans);flex-wrap:wrap;column-gap:20px;margin-top:auto;font-size:.9375rem;display:flex}.site-menu__more a{text-underline-offset:3px;align-items:center;min-height:44px;font-weight:400;text-decoration:underline;text-decoration-thickness:1px;display:inline-flex}.site-menu__more li:last-child{flex-basis:100%}.site-menu__more li:last-child a{color:var(--neutral-600)}}.project-preview{gap:var(--space-2);box-sizing:border-box;border:1px solid var(--neutral-200);background:var(--neutral-50);border-radius:12px;height:160px;padding:14px;display:flex;overflow:hidden}.project-preview--posts{border-color:var(--primary-100);background:var(--primary-50)}.project-preview--image{background:0 0;border:0;padding:0}.project-preview--image img{object-fit:cover;width:100%;height:100%;display:block}.project-preview--idea{border:1px dashed var(--neutral-300);font-family:var(--font-sans);color:var(--neutral-500);background:0 0;justify-content:center;align-items:center;font-size:.8125rem}.project-mini__pane{border:1px solid var(--neutral-200);background:#fff;border-radius:6px;flex-direction:column;flex:1 1 0;gap:6px;min-width:0;padding:10px;display:flex}.project-mini__pane--wide{flex-grow:1.4}.project-mini__bar{background:var(--neutral-300);border-radius:3px;flex-shrink:0;width:72%;height:5px}.project-mini__bar--title{background:var(--neutral-900);border-radius:4px;width:55%;height:8px}.project-mini__bar--short{width:60%}.project-mini__bar--light{background:var(--neutral-200);width:75%;height:4px}.project-mini__bar--sub{background:var(--neutral-700);width:45%;height:6px}.project-mini__button{background:var(--primary-600);border-radius:4px;align-self:flex-end;width:44px;height:16px;margin-top:auto}.project-mini__heading{font-family:var(--font-serif);color:var(--color-ink);margin-bottom:2px;font-size:.8125rem;line-height:1}.project-mini__task{align-items:center;gap:5px;display:flex}.project-mini__task .project-mini__bar{flex:0 70%}.project-mini__check{box-sizing:border-box;border:1.5px solid var(--neutral-400);border-radius:2px;flex-shrink:0;width:9px;height:9px}.project-mini__check--done{border-color:var(--primary-600);background:var(--primary-600)}.project-list{border-top:1px solid var(--color-ink);margin:0;padding:0;list-style:none}.project-card{border-bottom:1px solid var(--neutral-200)}.project-card__link{align-items:start;column-gap:var(--space-8);font-weight:inherit;color:inherit;grid-template-columns:240px minmax(0,1fr);padding:36px 0;text-decoration:none;display:grid}a.project-card__link:hover{color:inherit;text-decoration:none}a.project-card__link:focus-visible{outline-offset:4px}.project-card__name{color:var(--color-ink);text-underline-offset:.15em;margin:8px 0 0;font-size:2rem;line-height:1.2;text-decoration-thickness:1px}a.project-card__link:hover .project-card__name,a.project-card__link:focus-visible .project-card__name{text-decoration-line:underline}.project-card__pitch{font-family:var(--font-serif);color:var(--color-ink-soft);margin:10px 0 0;font-size:1.1875rem;line-height:1.5}.project-card__stack{font-family:var(--font-sans);color:var(--neutral-600);margin:8px 0 0;font-size:.8125rem;line-height:1.4}.project-list--home{gap:var(--space-8);padding-top:var(--space-8);border-top:0;grid-template-columns:repeat(2,minmax(0,1fr));display:grid}.project-list--home .project-card{border-bottom:0}.project-list--home .project-card__link{flex-direction:column;align-items:stretch;padding:0;display:flex}.project-list--home .project-preview{height:188px;margin-bottom:15px}.project-list--home .project-card__name{margin-top:14px;font-size:1.75rem}.project-list--home .project-card__pitch{margin-top:12px;font-size:1.125rem}.project-list--home .project-card__stack{display:none}@media (width<=480px){.project-card__link{flex-direction:column;align-items:stretch;padding:20px 0 19px;display:flex}.project-preview,.project-list--home .project-preview{height:130px;margin-bottom:8px}.project-card__name,.project-list--home .project-card__name{margin-top:7px;font-size:1.625rem}.project-card__pitch,.project-list--home .project-card__pitch{margin-top:10px;font-size:1.0625rem;line-height:1.45}.project-card__stack{display:none}.project-list--home{grid-template-columns:minmax(0,1fr);gap:0;padding-top:0}.project-list--home .project-card{border-bottom:1px solid var(--neutral-200)}.project-list--home .project-card__link{padding:20px 0}}.project-stage{align-items:center;gap:var(--space-2);font-family:var(--font-sans);color:var(--color-link);margin:0;font-size:.75rem;font-weight:600;line-height:1.1;display:flex}.project-stage:before{content:"";box-sizing:border-box;border-radius:var(--radius-full);background:var(--primary-600);flex-shrink:0;width:8px;height:8px}.project-stage[data-stage=building]{color:#7a5a12}.project-stage[data-stage=building]:before{background:#c28d24}.project-stage[data-stage=idea]{color:var(--neutral-600)}.project-stage[data-stage=idea]:before{background:0 0;border:1.5px dashed}@media (prefers-reduced-motion:no-preference){.project-stage[data-stage=building]:before{animation:2.4s ease-in-out infinite project-stage-pulse}}@keyframes project-stage-pulse{50%{opacity:.35}}.home-hero{padding-top:13px}.home-hero__name{letter-spacing:-.02em;margin:0;font-size:4.25rem;line-height:1.1}.home-hero__title{font-family:var(--font-serif);color:var(--color-link);margin:14px 0 0;font-size:1.625rem;font-style:italic;line-height:1.3}.home-hero__about{margin-top:27px}.home-hero__about p,.home-hero__links{font-family:var(--font-serif);color:#2b3138;margin:0}.home-hero__about p{font-size:1.4375rem;line-height:1.6}.home-hero__about p+p{margin-top:var(--space-4)}.home-hero__links{margin-top:28px;font-size:1.25rem;line-height:1.6}.home-hero__links a,.home-section__more{text-underline-offset:3px;font-weight:400;text-decoration:underline;text-decoration-thickness:1px}.home-section{margin-top:100px}.home-section+.home-section{margin-top:83px}.home-section__head{justify-content:space-between;align-items:center;gap:var(--space-4);border-bottom:1px solid var(--color-ink);display:flex}.home-section__label{font-family:var(--font-sans);letter-spacing:.12em;text-transform:uppercase;color:var(--color-ink);margin:0;font-size:.8125rem;font-weight:600;line-height:1}.home-section__more{min-height:44px;font-family:var(--font-sans);font-size:var(--text-sm);align-items:center;font-weight:500;display:inline-flex}.home-posts{margin:0;padding:0;list-style:none}.home-post{border-bottom:1px solid var(--neutral-200);padding:27px 0 25px}.home-post__title{margin:0;font-size:1.875rem;line-height:1.25}.home-post__title a{font-weight:inherit;color:var(--color-ink);text-decoration:none}.home-post__title a:hover{color:var(--color-link);text-underline-offset:4px;text-decoration:underline;text-decoration-thickness:1px}.home-post__excerpt{margin:var(--space-2) 0 0;font-family:var(--font-serif);color:var(--color-ink-soft);font-size:1.1875rem;line-height:1.5}.home-post__date{font-family:var(--font-sans);color:var(--neutral-600);margin-top:6px;font-size:.84375rem;line-height:1.4;display:block}@media (width<=480px){.home-hero{padding-top:8px}.home-hero__name{font-size:2.875rem}.home-hero__title{margin-top:3px;font-size:1.3125rem}.home-hero__about{margin-top:15px}.home-hero__about p{font-size:1.1875rem;line-height:1.55}.home-hero__links{margin-top:16px;font-size:1.0625rem;line-height:1.55}.home-section,.home-section+.home-section{margin-top:26px}.home-section__head{padding-bottom:8px}.home-section__label{line-height:1.4}.home-section__more{display:none}.home-post{padding:16px 0 15px}.home-post__title{font-size:1.5rem}.home-post__excerpt{margin-top:5px;font-size:1.0625rem;line-height:1.45}.home-post__date{margin-top:3px}}.resume-page{--resume-date-column:150px;--resume-column-gap:32px}.resume-intro__title{letter-spacing:-.01em;color:var(--color-ink);margin:0;font-size:3.75rem;font-weight:500;line-height:1.1}.resume-intro__headline{font-family:var(--font-serif);color:var(--color-ink-soft);margin:17px 0 0;font-size:1.5rem;font-style:italic;line-height:1.4}.resume-intro__summary{font-family:var(--font-serif);color:#2b3138;margin:28px 0 0;font-size:1.3125rem;line-height:1.6}.resume-intro__actions{align-items:center;gap:var(--space-2) var(--space-4);flex-wrap:wrap;margin:28px 0 0;display:flex}.resume-download{justify-content:center;align-items:center;gap:var(--space-2);background-color:var(--color-ink);min-height:44px;font-family:var(--font-sans);font-size:var(--text-sm);color:#fff;border-radius:6px;padding:0 18px;font-weight:600;line-height:1;text-decoration:none;display:inline-flex}.resume-download:hover{background-color:var(--neutral-800);color:#fff;text-decoration:none}.resume-download:focus-visible{outline-offset:2px}.resume-download__icon{flex-shrink:0}.resume-intro__link{min-height:44px;font-family:var(--font-sans);font-size:var(--text-sm);color:var(--color-link);text-underline-offset:3px;align-items:center;font-weight:500;text-decoration:underline;text-decoration-thickness:1px;display:inline-flex}.resume-intro__link:hover{color:var(--color-link);text-decoration-thickness:2px}.resume-bear-note{justify-content:space-between;align-items:flex-start;gap:var(--space-4);margin:var(--space-6) 0 0;padding:var(--space-3) var(--space-4);background-color:var(--primary-50);border:1px solid var(--primary-200);border-radius:var(--radius-md);color:var(--neutral-700);font-size:var(--text-sm);display:flex}.resume-bear-note p{line-height:var(--line-relaxed);margin:0}.resume-bear-note a{color:var(--primary-700);font-weight:500}.resume-bear-note__dismiss{color:var(--neutral-500);cursor:pointer;font-size:var(--text-lg);padding:0 var(--space-1);background:0 0;border:none;flex-shrink:0;line-height:1}.resume-bear-note__dismiss:hover{color:var(--neutral-800)}.resume-section{margin-top:72px}.resume-section:first-child{margin-top:56px}.resume-section__label{border-bottom:1px solid var(--color-ink);font-family:var(--font-sans);letter-spacing:.12em;text-transform:uppercase;color:var(--color-ink);margin:0;padding-bottom:13px;font-size:.8125rem;font-weight:600;line-height:1.4}.resume-roles,.resume-earlier__list{margin:0;padding:0;list-style:none}.resume-role,.resume-earlier__item,.resume-skill{grid-template-columns:var(--resume-date-column) minmax(0, 1fr);column-gap:var(--resume-column-gap);align-items:baseline;display:grid}.resume-role{border-bottom:1px solid var(--neutral-200);padding:28px 0 32px}.resume-role__dates,.resume-skill dt{font-family:var(--font-sans);font-variant-numeric:tabular-nums;color:var(--neutral-600);margin:0;font-size:.8125rem;line-height:1.4}.resume-role__note{margin-top:2px;display:block}.resume-role__title{color:var(--color-ink);margin:0;font-size:1.5625rem;font-weight:500;line-height:1.3}.resume-role__company{color:var(--color-ink-soft);font-style:italic;font-weight:400}.resume-role__bullets{font-family:var(--font-serif);color:#2b3138;margin:12px 0 0;padding-left:20px;font-size:1.125rem;line-height:1.6;list-style:outside}.resume-role__bullets li+li{margin-top:4px}.resume-earlier__summary{justify-content:space-between;align-items:center;gap:var(--space-4);cursor:pointer;padding:24px 0 12px;list-style:none;display:flex}.resume-earlier__summary::-webkit-details-marker{display:none}.resume-earlier__label{font-family:var(--font-sans);font-size:var(--text-sm);font-variant-numeric:tabular-nums;color:var(--neutral-700);font-weight:600}.resume-earlier__toggle{min-height:40px;padding:0 var(--space-3);border:1px solid var(--neutral-300);font-family:var(--font-sans);white-space:nowrap;color:var(--color-ink);border-radius:8px;align-items:center;font-size:.8125rem;font-weight:500;display:inline-flex}.resume-earlier__summary:hover .resume-earlier__toggle{border-color:var(--neutral-600)}.resume-earlier__hide,.resume-earlier__details[open] .resume-earlier__show,.resume-earlier__details[open]+.resume-earlier__list{display:none}.resume-earlier__details[open] .resume-earlier__hide{display:inline}.resume-earlier__details .resume-roles,.resume-earlier__list{border-top:1px solid var(--neutral-200)}.resume-earlier__item{padding:7px 0}.resume-earlier__item+.resume-earlier__item{border-top:1px solid var(--neutral-200)}.resume-earlier__role,.resume-education__title{font-family:var(--font-serif);color:var(--color-ink);margin:0;font-size:1.25rem;font-weight:400;line-height:1.3}.resume-competencies{font-family:var(--font-serif);color:#2b3138;margin:20px 0 0;font-size:1.1875rem;line-height:1.6}.resume-skills{border-top:1px solid var(--neutral-200);margin:20px 0 0}.resume-skill{padding:12px 0}.resume-skill+.resume-skill{border-top:1px solid var(--neutral-200)}.resume-skill dt{color:var(--neutral-700);font-weight:600}.resume-skill dd{font-family:var(--font-serif);color:#2b3138;margin:0;font-size:1.125rem;line-height:1.5}.resume-roles--education .resume-role{padding:18px 0}.resume-education__place{font-family:var(--font-serif);color:var(--color-ink-soft);margin:2px 0 0;font-size:1.0625rem;font-style:italic;line-height:1.4}@media (width<=480px){.resume-intro__title{font-size:2.5rem}.resume-intro__headline{font-size:1.25rem}.resume-intro__summary{font-size:1.1875rem}.resume-download{border-radius:8px;flex:1 0 100%;min-height:48px;font-size:.9375rem}.resume-section:first-child{margin-top:40px}.resume-section{margin-top:56px}.resume-role,.resume-earlier__item,.resume-skill{display:block}.resume-role{padding:22px 0 26px}.resume-role__dates,.resume-skill dt{margin-bottom:4px}.resume-role__title{font-size:1.375rem}.resume-role__bullets{font-size:1.0625rem;line-height:1.5}.resume-earlier__item{padding:10px 0}.resume-earlier__role,.resume-education__title{font-size:1.125rem}.resume-skill dd{font-size:1.0625rem}}.posts-index__header{margin-bottom:40px}.posts-index h1{letter-spacing:-.01em;color:var(--color-ink);margin:0;font-size:3.75rem;font-weight:500;line-height:1.1}.posts-index__intro{font-family:var(--font-serif);color:var(--color-ink-soft);margin:17px 0 0;font-size:1.5rem;font-style:italic;line-height:1.4}.posts-index__rss{min-height:44px;font-size:var(--text-sm);color:var(--color-link);text-underline-offset:3px;align-items:center;margin-top:4px;font-weight:500;text-decoration:underline;text-decoration-thickness:1px;display:inline-flex}.posts-index__rss:hover{color:var(--color-link);text-decoration-thickness:2px}.posts-index__empty{font-family:var(--font-serif);color:var(--color-ink-soft);margin:0;font-size:1.1875rem}.posts-year+.posts-year{margin-top:56px}.posts-year__label{border-bottom:1px solid var(--color-ink);font-family:var(--font-sans);letter-spacing:.12em;font-variant-numeric:tabular-nums;text-transform:uppercase;color:var(--color-ink);margin:0;padding-bottom:13px;font-size:.8125rem;font-weight:600;line-height:1.4}.posts-year__list{margin:0;padding:0;list-style:none}.post-preview{border-bottom:1px solid var(--neutral-200)}.post-preview__link{align-items:baseline;column-gap:var(--space-6);font-weight:inherit;color:inherit;grid-template-columns:minmax(0,1fr) auto;padding:25px 0 28px;text-decoration:none;display:grid}.post-preview__link:hover{color:inherit;text-decoration:none}.post-preview__link:focus-visible{outline-offset:4px}.post-preview__title{color:var(--color-ink);text-underline-offset:.15em;margin:0;font-size:1.75rem;font-weight:500;line-height:1.25;text-decoration-thickness:1px}.post-preview__link:hover .post-preview__title,.post-preview__link:focus-visible .post-preview__title{text-decoration-line:underline}.post-preview__date{font-family:var(--font-sans);font-variant-numeric:tabular-nums;white-space:nowrap;color:var(--neutral-600);font-size:.8125rem;line-height:1.4}.post-preview__excerpt{font-family:var(--font-serif);color:var(--color-ink-soft);grid-column:1/-1;margin:6px 0 0;font-size:1.1875rem;line-height:1.5}@media (width<=480px){.posts-index__header{margin-bottom:13px;padding-top:4px}.posts-index h1{font-size:2.875rem}.posts-index__intro{margin-top:9px;font-size:1.1875rem;line-height:1.45}.posts-index__rss{margin-top:-4px}.posts-year__label{padding-bottom:8px}.post-preview__link{flex-direction:column;align-items:flex-start;padding:16px 0;display:flex}.post-preview__title{font-size:1.5rem}.post-preview__date{order:1;margin-top:3px}.post-preview__excerpt{margin-top:5px;font-size:1.0625rem;line-height:1.45}}.not-found{--not-found-title-size:3.75rem;--not-found-text-size:1.3125rem;--not-found-label-gap:10px;--not-found-text-gap:20px;--not-found-list-gap:28px;--not-found-row-height:56px;--not-found-row-size:1.5rem;--not-found-bears-gap:18px}.not-found__label{margin:0 0 var(--not-found-label-gap);font-family:var(--font-sans);letter-spacing:.12em;color:var(--neutral-600);font-size:.8125rem;font-weight:600;line-height:1.4}.not-found h1{font-size:var(--not-found-title-size);margin:0;line-height:1.1}.not-found__text{margin:var(--not-found-text-gap) 0 0;font-family:var(--font-serif);font-size:var(--not-found-text-size);color:#2b3138;line-height:1.5}.not-found__links{margin:var(--not-found-list-gap) 0 0;border-top:1px solid var(--color-ink);padding:0;list-style:none}.not-found__links li{border-bottom:1px solid var(--neutral-200)}.not-found__links a{min-height:var(--not-found-row-height);font-family:var(--font-serif);font-size:var(--not-found-row-size);color:var(--color-ink);justify-content:space-between;align-items:center;font-weight:400;line-height:1.25;text-decoration:none;display:flex}.not-found__links a:after{content:"";border-top:1.5px solid var(--neutral-400);border-right:1.5px solid var(--neutral-400);width:7px;height:7px;margin-right:10px;transform:rotate(45deg)}.not-found__links a:hover{color:var(--color-ink);text-underline-offset:.18em;text-decoration:underline;text-decoration-thickness:1px}.not-found__bears{margin:var(--not-found-bears-gap) 0 0;font-family:var(--font-sans);color:var(--color-ink);font-size:.9375rem;line-height:1.5}.not-found__bears a{color:var(--color-link);text-underline-offset:3px;font-weight:400;text-decoration:underline;text-decoration-thickness:1px}.not-found__bears a:hover{text-decoration-thickness:2px}@media (width<=480px){.not-found{--not-found-title-size:2.75rem;--not-found-text-size:1.1875rem;--not-found-label-gap:4px;--not-found-text-gap:12px;--not-found-list-gap:24px}}.post-page{--post-measure:680px;--post-body-size:1.3125rem;--post-prose:#22272d;max-width:calc(var(--post-measure) + 2 * var(--site-gutter));padding-inline:var(--site-gutter);font-family:var(--font-serif);color:var(--post-prose);margin-inline:auto}.post-header{margin-bottom:48px}.post-meta{font-family:var(--font-sans);color:var(--neutral-600);margin:0 0 14px;font-size:.8125rem;line-height:1.4}.post-date{font-variant-numeric:tabular-nums}.post-page h1{letter-spacing:-.01em;color:var(--color-ink);margin:0;font-size:3.75rem;font-weight:500;line-height:1.1}.post-excerpt{color:var(--color-ink-soft);margin:17px 0 0;font-size:1.5rem;font-style:italic;line-height:1.4}.post-part-of{font-family:var(--font-sans);color:var(--neutral-600);margin:14px 0 0;font-size:.8125rem;line-height:1.4}.post-part-of a{color:inherit;text-decoration:underline}.post-content{font-size:var(--post-body-size);overflow-wrap:break-word;line-height:1.7}.post-content>:first-child{margin-top:0}.post-content>:last-child{margin-bottom:0}.post-content p,.post-content ul,.post-content ol,.post-content blockquote,.post-content figure,.post-content pre,.post-content .post-table{margin:0 0 1.2em}.post-content h2,.post-content h3,.post-content h4,.post-content h5,.post-content h6{font-family:var(--font-serif);letter-spacing:0;color:var(--color-ink);margin:1.75em 0 .5em;font-weight:500;line-height:1.25}.post-content h2{font-size:2rem}.post-content h3{font-size:1.5rem}.post-content h4{font-size:1.3125rem}.post-content h5,.post-content h6{font-size:1.125rem}.post-content a,.post-author a{font-weight:inherit;color:var(--color-link);text-underline-offset:.18em;text-decoration:underline;text-decoration-thickness:1px}.post-content a:hover,.post-author a:hover{text-decoration-thickness:2px}.post-content strong{color:var(--color-ink);font-weight:500}.post-content ul,.post-content ol{padding-left:1.4em}.post-content li{margin:.3em 0}.post-content li>ul,.post-content li>ol{margin:.3em 0 0}.post-content li:has(>input[type=checkbox]){list-style:none}.post-content input[type=checkbox]{accent-color:var(--color-link);margin:0 .4em 0 -1.2em}.post-content blockquote{border-left:2px solid var(--color-ink);color:var(--color-ink-soft);padding-left:1em;font-style:italic}.post-content code{border-radius:var(--radius-sm);background-color:var(--neutral-100);color:var(--color-ink);padding:.1em .3em;font-family:ui-monospace,SF Mono,Menlo,Consolas,monospace;font-size:.8em}.post-content pre{border:1px solid var(--neutral-200);border-radius:var(--radius-md);background-color:var(--neutral-50);padding:16px 20px;line-height:1.6;overflow-x:auto}.post-content pre code{background:0 0;padding:0;font-size:.95rem}.post-content img{max-width:100%;height:auto;display:block}.post-content figcaption{font-family:var(--font-sans);color:var(--neutral-600);margin-top:10px;font-size:.8125rem;line-height:1.5}.post-content .post-table{overflow-x:auto}.post-content table{border-collapse:collapse;font-size:1.0625rem;line-height:1.5}.post-content th,.post-content td{border-bottom:1px solid var(--neutral-200);text-align:left;vertical-align:top;min-width:7em;padding:.5em .75em}.post-content th:first-child,.post-content td:first-child{padding-left:0}.post-content th{border-bottom-color:var(--color-ink);color:var(--color-ink);font-weight:500}.post-content hr{border:0;border-top:1px solid var(--neutral-300);margin:2.4em 0}.post-author{border-top:1px solid var(--color-ink);color:#2b3138;margin-top:64px;padding-top:24px;font-size:1.1875rem;line-height:1.6}.post-author p{margin:0}.post-author strong{color:var(--color-ink);font-weight:500}.post-loading{font-family:var(--font-sans);color:var(--neutral-600);margin:0}@media (width<=480px){.post-page{--post-body-size:1.1875rem}.post-header{margin-bottom:22px}.post-meta{margin-bottom:8px}.post-page h1{font-size:2.625rem}.post-excerpt{margin-top:9px;font-size:1.25rem}.post-content{line-height:1.65}.post-content p{margin-bottom:1em}.post-content h2{font-size:1.625rem}.post-content h3{font-size:1.3125rem}.post-content pre{padding:12px 14px}.post-content pre code{font-size:.875rem}.post-author{margin-top:48px;padding-top:24px;font-size:1.0625rem}}.contact-page{--contact-title-size:3.75rem;--contact-intro-size:1.5rem;--contact-intro-gap:17px;--contact-header-gap:28px;--contact-field-gap:12px;--contact-label-gap:6px;--contact-label-color:var(--neutral-700);--contact-control-height:48px;--contact-control-padding:11px 14px;--contact-control-border:var(--neutral-500);--contact-control-radius:10px;--contact-message-height:120px;--contact-button-height:50px;--contact-button-width:auto;--contact-success-size:2rem}.contact-page__header{margin-bottom:var(--contact-header-gap)}.contact-page h1{font-size:var(--contact-title-size);letter-spacing:-.01em;margin:0;line-height:1.1}.contact-page__intro{margin:var(--contact-intro-gap) 0 0;font-family:var(--font-serif);font-size:var(--contact-intro-size);color:var(--color-ink-soft);font-style:italic;line-height:1.4}.contact-form{gap:var(--contact-field-gap);display:grid;position:relative}.hp-field{width:1px;height:1px;position:absolute;top:auto;left:-10000px;overflow:hidden}.contact-field label{margin-bottom:var(--contact-label-gap);font-family:var(--font-sans);font-size:var(--text-sm);color:var(--contact-label-color);font-weight:600;line-height:1.3;display:block}.contact-field input,.contact-field textarea{width:100%;min-height:var(--contact-control-height);padding:var(--contact-control-padding);border:1px solid var(--contact-control-border);border-radius:var(--contact-control-radius);font-family:var(--font-sans);font-size:var(--text-base);color:var(--color-ink);background:#fff;margin:0;line-height:1.5;display:block}.contact-field ::placeholder{color:#757575;opacity:1}.contact-field textarea{min-height:var(--contact-message-height);resize:vertical}.contact-field input:focus,.contact-field textarea:focus{border-color:var(--color-link);outline:2px solid var(--color-link);outline-offset:1px}.contact-field [aria-invalid=true]{border-color:var(--color-error);box-shadow:inset 0 0 0 1px var(--color-error)}.contact-field__error{margin:var(--contact-label-gap) 0 0;font-family:var(--font-sans);font-size:var(--text-sm);color:var(--color-error);font-weight:500;line-height:1.4}.contact-form__status{margin:0}.contact-form__status:empty{position:absolute}.contact-form__message{border:1px solid var(--color-error);border-radius:var(--contact-control-radius);font-family:var(--font-sans);font-size:var(--text-sm);color:var(--color-error);background:#fef3f2;padding:12px 14px;font-weight:500;line-height:1.4;display:block}.contact-form__submit{width:var(--contact-button-width);min-height:var(--contact-button-height);border-radius:var(--contact-control-radius);background:var(--color-link);font-family:var(--font-sans);font-size:var(--text-base);color:#fff;box-shadow:none;transition:background-color var(--transition-fast);border:0;justify-self:start;margin-top:2px;padding:0 24px;font-weight:600;line-height:1}.contact-form__submit:hover{background:var(--primary-800);box-shadow:none;transform:none}.contact-form__submit:focus-visible{outline:2px solid var(--color-link);outline-offset:2px}.contact-form__submit:focus:not(:focus-visible){outline:none}.contact-form__submit[aria-disabled=true]{cursor:progress;opacity:.7}.contact-success h2{font-size:var(--contact-success-size);margin:0;line-height:1.25}.contact-success p{font-family:var(--font-serif);color:#2b3138;margin:12px 0 0;font-size:1.1875rem;line-height:1.6}.contact-success__links{gap:0 var(--space-6);flex-wrap:wrap;margin:20px 0 0;padding:0;list-style:none;display:flex}.contact-success__links a{min-height:44px;font-family:var(--font-sans);font-size:var(--text-base);color:var(--color-link);text-underline-offset:3px;align-items:center;font-weight:500;text-decoration:underline;text-decoration-thickness:1px;display:inline-flex}@media (width<=480px){.contact-page{--contact-title-size:2.875rem;--contact-intro-size:1.1875rem;--contact-intro-gap:7px;--contact-header-gap:20px;--contact-button-width:100%;--contact-success-size:1.625rem}}.projects-index__header{margin-bottom:56px}.projects-index h1{letter-spacing:-.01em;color:var(--color-ink);margin:0;font-size:3.75rem;font-weight:500;line-height:1.1}.projects-index__intro{font-family:var(--font-serif);color:var(--color-ink-soft);margin:17px 0 0;font-size:1.5rem;font-style:italic;line-height:1.4}.projects-index__empty{border-top:1px solid var(--color-ink);font-family:var(--font-serif);color:var(--color-ink-soft);margin:0;padding-top:25px;font-size:1.1875rem}@media (width<=480px){.projects-index__header{margin-bottom:12px}.projects-index h1{font-size:2.875rem}.projects-index__intro{margin-top:7px;font-size:1.125rem;line-height:1.45}.projects-index__empty{padding-top:16px;font-size:1.0625rem}}.project-page{--project-measure:680px;--project-demo-width:1072px;--post-body-size:1.3125rem;--post-prose:#22272d}.project-header,.project-demo,.project-main,.project-loading{box-sizing:border-box;padding-inline:var(--site-gutter);margin-inline:auto}.project-header,.project-loading{max-width:calc(var(--site-column) + 2 * var(--site-gutter))}.project-main{max-width:calc(var(--project-measure) + 2 * var(--site-gutter));font-family:var(--font-serif);color:var(--post-prose)}.project-header{margin-top:-10px;margin-bottom:48px}.project-back{font-family:var(--font-sans);margin:0;font-size:.875rem;line-height:1.4}.project-back a{color:var(--color-link);font-weight:500;text-decoration:none}.project-back a:hover,.project-back a:focus-visible{text-underline-offset:3px;text-decoration:underline}.project-header .project-stage{margin-top:17px}.project-header h1{letter-spacing:-.01em;color:var(--color-ink);margin:18px 0 0;font-size:3.75rem;font-weight:500;line-height:1.1}.project-pitch{font-family:var(--font-serif);color:var(--color-ink-soft);margin:16px 0 0;font-size:1.5rem;font-style:italic;line-height:1.45}.project-demo{max-width:calc(var(--project-demo-width) + 2 * var(--site-gutter));margin-top:59px;margin-bottom:70px}.project-demo__label{box-sizing:border-box;max-width:var(--project-measure);font-family:var(--font-sans);letter-spacing:.12em;text-transform:uppercase;color:var(--color-ink);margin:0 auto 16px;font-size:.8125rem;font-weight:600;line-height:1}.project-demo__stage{border:1px solid var(--neutral-200);background:#fff;border-radius:16px;overflow:hidden;box-shadow:0 12px 32px #0f172a0f}.project-demo:has(.demo-frame--split){position:relative}.project-demo__stage:has(>.demo-frame--split){box-shadow:none;background:0 0;border:0;border-radius:0;overflow:visible}.project-demo .demo-frame__note--label{top:0;right:calc(var(--site-gutter) + max(0px, (100% - 2 * var(--site-gutter) - var(--project-measure)) / 2));position:absolute}.project-demo .project-preview{border:0;border-radius:0;gap:16px;height:444px;padding:28px}.project-demo .project-preview--image{aspect-ratio:1072/444;height:auto;padding:0}.project-demo .project-preview--image img{object-position:top center}.project-body h2{margin-top:1.55em}.project-body ol{counter-reset:project-step;border-top:1px solid var(--neutral-200);padding:0;list-style:none}.project-body ol>li{border-bottom:1px solid var(--neutral-200);counter-increment:project-step;grid-template-columns:48px minmax(0,1fr);align-items:baseline;margin:0;padding:16px 0;font-size:1.1875rem;line-height:1.6;display:grid}.project-body ol>li:before{content:counter(project-step, decimal-leading-zero);font-family:var(--font-sans);font-variant-numeric:tabular-nums;color:var(--color-link);font-size:.8125rem;font-weight:600}.project-body ol>li>*{grid-column:2}.project-body dl{border-top:1px solid var(--neutral-200);margin:0 0 1.2em}.project-body dl>div{border-bottom:1px solid var(--neutral-200);grid-template-columns:172px minmax(0,1fr);align-items:baseline;column-gap:26px;padding:16px 0;display:grid}.project-body dt{font-family:var(--font-sans);color:var(--neutral-700);font-size:.8125rem;font-weight:600;line-height:1.4}.project-body dd{margin:0;font-size:1.1875rem;line-height:1.6}.project-stack{font-family:var(--font-sans);color:var(--neutral-600);margin:18px 0 0;font-size:.8125rem;line-height:1.4}.project-links{font-family:var(--font-sans);flex-wrap:wrap;gap:0 20px;margin:8px 0 0;padding:0;font-size:.875rem;font-weight:500;list-style:none;display:flex}.project-links a{min-height:44px;color:var(--color-link);text-underline-offset:3px;align-items:center;text-decoration:underline;text-decoration-thickness:1px;display:inline-flex}.project-build-log{margin-top:52px}.project-build-log h2{color:var(--color-ink);margin:0;font-size:2rem;font-weight:500;line-height:1.25}.project-build-log__list{border-top:1px solid var(--neutral-200);margin:16px 0 0;padding:0;list-style:none}.project-build-log__entry{border-bottom:1px solid var(--neutral-200)}.project-build-log__link{font-weight:inherit;color:inherit;flex-direction:column;gap:12px;padding:20px 0 18px;text-decoration:none;display:flex}.project-build-log__link:hover{color:inherit;text-decoration:none}.project-build-log__title{color:var(--color-ink);text-underline-offset:.15em;margin:0;font-size:1.5rem;font-weight:500;line-height:1.25;text-decoration-thickness:1px}.project-build-log__link:hover .project-build-log__title,.project-build-log__link:focus-visible .project-build-log__title{text-decoration-line:underline}.project-build-log__date{font-family:var(--font-sans);font-variant-numeric:tabular-nums;color:var(--neutral-600);font-size:.8125rem;line-height:1.4}.project-build-log__empty{font-size:var(--post-body-size);color:var(--color-ink-soft);margin:18px 0 0;line-height:1.6}.project-build-log__empty a{color:var(--color-link);text-underline-offset:.18em;text-decoration:underline;text-decoration-thickness:1px}.project-loading{font-family:var(--font-sans);color:var(--neutral-600);margin-block:0}@media (width<=760px){.project-demo .demo-frame__note--label{margin:-4px 0 12px;line-height:1.4;position:static}}@media (width<=480px){.project-page{--post-body-size:1.1875rem}.project-header{margin-top:-8px;margin-bottom:18px}.project-header h1{font-size:2.625rem}.project-pitch{margin-top:7px;font-size:1.125rem}.project-demo{margin-top:18px;margin-bottom:48px}.project-demo__label{margin-bottom:8px}.project-demo .project-preview:not(.project-preview--image){gap:10px;height:254px;padding:16px}.project-body dl>div{grid-template-columns:minmax(0,1fr);row-gap:4px}.project-body ol>li{grid-template-columns:36px minmax(0,1fr);font-size:1.0625rem}.project-body dd{font-size:1.0625rem}.project-build-log h2{font-size:1.625rem}.project-build-log__title{font-size:1.3125rem}}
