:root{color-scheme:light;--paper:#faf7f1;--paper-sunk:#f1eae0;--ink:#221e1a;--ink-soft:#5e574d;--ink-faint:#8c8478;--line:#e4dccd;--line-strong:#d3c8b5;--rust:#b0461e;--rust-deep:#8a3415;--rust-wash:#f3e4d8;--brand-orange:#d88b69;--shadow-soft:0 14px 40px #3a26121a;--font-display:"Fraunces", Georgia, "Times New Roman", serif;--font-body:"Hanken Grotesk", ui-sans-serif, system-ui, -apple-system, sans-serif;--font-mono:"IBM Plex Mono", ui-monospace, "SFMono-Regular", monospace;--fs-meta:.78rem;--fs-sm:.9rem;--fs-base:1.0625rem;--fs-md:clamp(1.15rem, 1.05rem + .5vw, 1.35rem);--fs-lg:clamp(1.45rem, 1.2rem + 1.2vw, 1.9rem);--fs-xl:clamp(2rem, 1.45rem + 2.6vw, 3.05rem);--fs-display:clamp(2.9rem, 1.7rem + 5.4vw, 5.2rem);--sp-1:.5rem;--sp-2:.75rem;--sp-3:1rem;--sp-4:1.5rem;--sp-5:2.25rem;--sp-6:3.5rem;--sp-7:5.25rem;--sp-8:7.5rem;--measure:62ch;--container:1080px;--gutter:clamp(1.25rem, 5vw, 3rem);--ease-out:cubic-bezier(.22, 1, .36, 1)}*{box-sizing:border-box}html{background:var(--paper);color:var(--ink);font-family:var(--font-body);-webkit-font-smoothing:antialiased;text-rendering:optimizelegibility;font-size:100%;line-height:1.55}body{min-width:320px;font-size:var(--fs-base);margin:0}body.home-page,body.projects-page,body.resume-page,body.project-detail-page{background:#fff;padding-top:clamp(1rem,2.5vw,2rem)}img{max-width:100%;height:auto;display:block}p{max-width:var(--measure);margin:0}h1,h2,h3{font-family:var(--font-display);letter-spacing:-.015em;color:var(--ink);margin:0;font-weight:560;line-height:1.04}h1{font-size:var(--fs-display);font-optical-sizing:auto;max-width:16ch}h2{font-size:var(--fs-xl);max-width:18ch}h3{font-size:var(--fs-lg);line-height:1.12}a{color:var(--rust-deep);text-underline-offset:.18em;text-decoration-thickness:.07em;text-decoration-color:color-mix(in srgb, var(--rust-deep) 45%, transparent);transition:color .18s var(--ease-out), text-decoration-color .18s var(--ease-out)}a:hover{color:var(--rust);text-decoration-color:currentColor}:focus-visible{outline:2.5px solid var(--rust);outline-offset:3px;border-radius:1px}.skip-link{top:var(--sp-3);left:var(--sp-3);z-index:30;background:var(--ink);color:var(--paper);font-family:var(--font-mono);font-size:var(--fs-sm);transition:transform .2s var(--ease-out);padding:.7rem 1rem;text-decoration:none;position:fixed;transform:translateY(-160%)}.skip-link:focus{transform:translateY(0)}.marker{font-family:var(--font-mono);font-size:var(--fs-meta);letter-spacing:.12em;text-transform:uppercase;color:var(--rust);align-items:center;gap:.6rem;margin:0;font-weight:500;display:inline-flex}.marker:before{content:"";background:var(--rust);width:1.6rem;height:2px}.shell{width:100%;max-width:var(--container);padding-inline:var(--gutter);margin-inline:auto}.site-header{z-index:20;justify-content:space-between;align-items:baseline;gap:var(--sp-4);padding-block:var(--sp-4) var(--sp-3);border-bottom:1px solid var(--line);flex-wrap:wrap;display:flex;position:relative}:is(.home-page,.projects-page,.resume-page,.project-detail-page) .site-header{width:min(100% - clamp(2rem,7vw,6rem),1280px);max-width:1280px;padding:clamp(1rem, 2vw, 1.5rem) clamp(2.25rem, 4.5vw, 4.75rem) var(--sp-2);background:var(--paper);border-bottom:0;border-radius:clamp(1.25rem,2.5vw,2rem) clamp(1.25rem,2.5vw,2rem) 0 0;margin-top:0}.brand{font-family:var(--font-display);letter-spacing:-.01em;color:var(--ink);align-content:center;align-items:center;gap:.7rem;min-height:44px;font-size:1.3rem;font-weight:600;text-decoration:none;display:inline-flex}.brand-mark{flex:none;width:1.7rem;height:1.7rem}.site-nav{flex-wrap:wrap;gap:clamp(.9rem,2.5vw,1.8rem);display:flex}.menu-toggle{display:none}.site-nav a{min-height:44px;font-family:var(--font-mono);font-size:var(--fs-sm);letter-spacing:.02em;color:var(--ink-soft);align-items:center;text-decoration:none;display:inline-flex;position:relative}.site-nav a:hover,.site-nav a[aria-current=page]{color:var(--ink)}.site-nav a[aria-current=page]:after{content:"";background:var(--rust);width:100%;height:2px;position:absolute;bottom:.55rem;left:0}.hero{background:var(--paper);text-align:left;border-radius:clamp(1.25rem,2.5vw,2rem);grid-template-columns:minmax(20rem,.9fr) minmax(0,1.15fr);align-items:center;gap:clamp(2rem,5vw,5.5rem);width:min(100% - clamp(2rem,7vw,6rem),1280px);max-width:1280px;margin-top:clamp(1.25rem,3vw,2.5rem);padding:clamp(2.25rem,4.5vw,4.75rem);display:grid;overflow:hidden}.home-page .hero{border-radius:0 0 clamp(1.25rem,2.5vw,2rem) clamp(1.25rem,2.5vw,2rem);margin-top:0;padding-top:clamp(1.25rem,2.75vw,2.5rem)}.hero-copy{gap:var(--sp-4);justify-items:start;display:grid}.hero h1{max-width:none;font-size:clamp(3.4rem,2.15rem + 4vw,5.8rem)}.hero h1 em{color:var(--rust-deep);font-style:normal;display:inline-block;position:relative}.hero h1 em:after{content:"";background:var(--rust);opacity:.72;border-radius:999px;height:.08em;position:absolute;bottom:-.04em;left:.02em;right:.02em;transform:rotate(-1.5deg)}.lede{color:var(--ink-soft);max-width:38ch;font-size:clamp(1.2rem,1.05rem + .8vw,1.6rem);line-height:1.48}.hero-actions{align-items:center;gap:var(--sp-4);margin-top:var(--sp-1);flex-wrap:wrap;display:flex}.profile-links{align-items:center;gap:var(--sp-3);margin-top:calc(var(--sp-1) * -1);font-family:var(--font-mono);font-size:var(--fs-meta);flex-wrap:wrap;display:flex}.hero-portrait{aspect-ratio:1;isolation:isolate;justify-self:center;width:min(100%,27rem);margin:0;position:relative;overflow:hidden}.hero-portrait:before{content:"";z-index:-2;aspect-ratio:1;border:1px solid color-mix(in srgb, var(--rust) 45%, transparent);border-radius:50%;width:88%;position:absolute;top:11%;left:6%}.portrait-shape{z-index:-1;aspect-ratio:1;background:var(--brand-orange);border-radius:50%;width:84%;position:absolute;top:15%;left:8%}.portrait-cutout{z-index:0;position:absolute;inset:0;overflow:hidden;mask:linear-gradient(#000 0 0) top/100% 40% no-repeat,radial-gradient(circle at 50% 57%,#000 0 42%,#0000 42.5%)}.portrait-cutout img{filter:drop-shadow(0 16px 22px #3a26121f);width:125%;max-width:none;transform:translate(-10%)}.home-page .section{background:#fff;border-top:0}.project-list.home-project-list{border-top:0;grid-template-columns:repeat(3,minmax(0,1fr));gap:clamp(1rem,2vw,1.5rem);display:grid}.home-project-list .project{align-content:start;gap:var(--sp-3);background:var(--paper);border:0;border-radius:1.4rem;grid-template-columns:1fr;min-width:0;padding:clamp(1.5rem,2.5vw,2rem)}.home-project-list .project-index{padding-top:0}.home-project-list .project-main{max-width:none}.home-project-list .project h3{font-size:clamp(1.45rem,1.2rem + .6vw,1.8rem)}.projects-page :is(.site-header,.projects-hero,.projects-catalog){width:min(calc(100% - clamp(2rem, 7vw, 6rem)), var(--container));max-width:var(--container)}.projects-page .projects-catalog{padding-inline:0}.projects-hero{background:var(--paper);border-radius:clamp(1.25rem,2.5vw,2rem);width:min(100% - clamp(2rem,7vw,6rem),1280px);max-width:1280px;margin-top:clamp(1rem,3vw,2rem);padding:clamp(2.25rem,5vw,4.75rem)}.projects-page .projects-hero{border-radius:0 0 clamp(1.25rem,2.5vw,2rem) clamp(1.25rem,2.5vw,2rem);margin-top:0;padding-top:clamp(1.25rem,2.75vw,2.5rem)}.projects-hero-copy{gap:var(--sp-3);display:grid}.home-project-list .project:has(a[href="/projects/casetrends/"]){isolation:isolate;--ink-soft:var(--ink);--ink-faint:var(--ink);position:relative;overflow:hidden}.home-project-list .project:has(a[href="/projects/casetrends/"]):before{content:"";z-index:-1;aspect-ratio:1;background:var(--brand-orange);outline:1px solid color-mix(in srgb, var(--rust) 45%, transparent);outline-offset:9px;opacity:.6;pointer-events:none;border-radius:50%;width:34rem;position:absolute;top:5rem;left:60%}.projects-hero h1{max-width:12ch;font-size:clamp(3.1rem,2rem + 4.8vw,5.4rem)}.projects-hero .lede{max-width:46ch}.projects-page .section{border-top:0}.projects-catalog{padding-top:clamp(1.25rem,3vw,2.25rem)}.project-list.projects-grid{border-top:0;grid-template-columns:repeat(2,minmax(0,1fr));gap:clamp(1rem,2.5vw,1.75rem);display:grid}.projects-grid .project{align-content:start;gap:var(--sp-3);background:var(--paper);border:0;border-radius:1.4rem;grid-template-columns:1fr;min-width:0;padding:clamp(1.5rem,3vw,2.25rem)}.projects-grid .project-index{padding-top:0}.projects-grid .project-main{max-width:none}.projects-grid .project h2{font-size:clamp(1.65rem,1.35rem + 1vw,2.15rem)}.projects-grid .project--visual{padding:0;overflow:hidden}.projects-grid .project--visual:hover,.projects-grid .project--visual:focus-within{box-shadow:0 18px 46px #3a261224}.project-card-link{height:100%;color:inherit;grid-template-rows:auto auto 1fr;text-decoration:none;display:grid}.project-card-link:hover{color:inherit;text-decoration:none}.project-card-link:focus-visible{outline:3px solid var(--rust);outline-offset:-4px;border-radius:1.4rem}.projects-grid .project-card-title{padding:clamp(1.5rem, 3vw, 2.25rem) clamp(1.5rem, 3vw, 2.25rem) var(--sp-3)}.project-thumbnail{aspect-ratio:5/3;background:var(--paper-sunk);margin:0;overflow:hidden}.project-thumbnail img{object-fit:cover;width:100%;height:100%}.projects-grid .project--visual .project-main{padding:var(--sp-4) clamp(1.5rem, 3vw, 2.25rem) clamp(1.5rem, 3vw, 2.25rem)}.project-card-action{width:fit-content;min-height:44px;font-family:var(--font-mono);font-size:var(--fs-meta);color:var(--rust-deep);align-items:center;gap:.45rem;margin-top:auto;display:inline-flex}.project-card-action:after{content:"→"}.profile-links span{color:var(--ink-faint);letter-spacing:.08em;text-transform:uppercase}.profile-links a{min-height:44px;color:var(--ink-soft);align-items:center;gap:.3rem;text-decoration:none;display:inline-flex}.profile-links a:after{content:"↗";color:var(--ink-faint);transition:transform .18s var(--ease-out)}.profile-links a:hover{color:var(--rust)}.profile-links a:hover:after{transform:translate(2px,-2px)}.button{background:var(--ink);min-height:44px;color:var(--paper);font-family:var(--font-mono);font-size:var(--fs-sm);letter-spacing:.01em;transition:background .18s var(--ease-out), transform .18s var(--ease-out);border-radius:.65rem;align-items:center;gap:.5rem;padding:.7rem 1.2rem;text-decoration:none;display:inline-flex}.button:hover{background:var(--rust-deep);color:var(--paper);transform:translateY(-1px)}.text-link{font-family:var(--font-mono);font-size:var(--fs-sm);color:var(--rust-deep);align-items:center;gap:.4rem;text-decoration:none;display:inline-flex}.text-link:after{content:"→";transition:transform .18s var(--ease-out)}.text-link:hover{color:var(--rust)}.text-link:hover:after{transform:translate(3px)}.section{border-top:1px solid var(--line);padding-block:clamp(2.75rem,6vw,4.75rem)}.section-head{justify-content:space-between;align-items:baseline;gap:var(--sp-4);margin-bottom:var(--sp-5);flex-wrap:wrap;display:flex}.section-head h2{margin-top:var(--sp-2)}.section-head-text{gap:var(--sp-2);display:grid}.about{grid-template-columns:minmax(0,.62fr) minmax(0,1fr);align-items:start;gap:clamp(1.5rem,5vw,4rem);display:grid}.about-body{gap:var(--sp-3);display:grid}.about-body p{font-size:var(--fs-md);color:var(--ink-soft);line-height:1.55}.about-body p strong{color:var(--ink);font-weight:600}.entry-list{border-top:1px solid var(--line);margin:0;padding:0;list-style:none}.entry{padding-block:var(--sp-4);border-bottom:1px solid var(--line);color:var(--ink);transition:background .18s var(--ease-out);grid-template-columns:8.5rem minmax(0,1fr);gap:clamp(.75rem,3vw,2.5rem);text-decoration:none;display:grid}.entry:hover{background:var(--rust-wash)}.entry-date{font-family:var(--font-mono);font-size:var(--fs-meta);letter-spacing:.03em;color:var(--ink-faint);padding-top:.35rem}.entry-main{gap:var(--sp-2);display:grid}.entry-title{font-family:var(--font-display);font-size:var(--fs-lg);letter-spacing:-.01em;color:var(--ink);font-weight:560;line-height:1.1}.entry:hover .entry-title{color:var(--rust-deep)}.entry-desc{color:var(--ink-soft);font-size:var(--fs-base)}.project-list{border-top:1px solid var(--line);margin:0;padding:0;list-style:none}.project{padding-block:var(--sp-5);border-bottom:1px solid var(--line);grid-template-columns:4rem minmax(0,1fr);gap:clamp(.75rem,3vw,2.5rem);display:grid}.project-index{font-family:var(--font-mono);font-size:var(--fs-md);color:var(--rust);padding-top:.2rem}.project-main{gap:var(--sp-3);max-width:56ch;display:grid}.project-status{font-family:var(--font-mono);font-size:var(--fs-meta);letter-spacing:.08em;text-transform:uppercase;color:var(--ink-faint)}.project h2,.project h3{font-size:var(--fs-lg)}.project h2 a,.project h3 a{color:inherit;text-decoration-color:color-mix(in srgb, var(--rust-deep) 30%, transparent)}.project-desc{color:var(--ink-soft)}.tag-row{flex-wrap:wrap;gap:.5rem;margin:0;padding:0;list-style:none;display:flex}.tag-row li{font-family:var(--font-mono);font-size:var(--fs-meta);letter-spacing:.02em;color:var(--ink-soft);border:1px solid var(--line-strong);border-radius:.4rem;padding:.25rem .55rem}.card-links{flex-wrap:wrap;gap:1.1rem;display:flex}.card-links a{font-family:var(--font-mono);font-size:var(--fs-meta)}.resume-page .site-header,.experience-intro,.experience-sections{width:min(calc(100% - clamp(2rem, 7vw, 6rem)), var(--container));max-width:var(--container);margin-inline:auto}.experience-intro{align-items:center;gap:var(--sp-5);padding:var(--sp-5) clamp(1rem, 4.5vw, 4.75rem) var(--sp-6);background:var(--paper);border-radius:0 0 2rem 2rem;grid-template-columns:minmax(0,1.4fr) minmax(0,.85fr);display:grid}.experience-intro-copy{gap:var(--sp-3);display:grid}.experience-photo{aspect-ratio:3/4;object-fit:cover;object-position:center 52%;border-radius:1.25rem;width:100%;height:auto}.experience-intro h1{max-width:18ch;font-size:clamp(2.7rem,5vw,4.5rem)}.experience-intro .lede{max-width:48ch}.experience-sections{gap:var(--sp-5);margin-block:var(--sp-5) var(--sp-6);display:grid}.experience-section{background:var(--paper);border-radius:2rem;padding:clamp(1.5rem,4.5vw,3.5rem)}.experience-section-heading{gap:var(--sp-2);margin-bottom:var(--sp-5);display:grid}.experience-section h2{font-size:clamp(1.9rem,3vw,2.6rem)}.experience-section-heading>p:last-child:not(.marker){color:var(--ink-soft)}.experience-role{gap:var(--sp-4);padding-block:var(--sp-4);border-top:1px solid var(--line);grid-template-columns:11rem 1fr;display:grid}.experience-role h3{font-size:var(--fs-md)}.role-dates{font:var(--fs-meta)/1.6 var(--font-mono);color:var(--ink-faint);padding-top:.3rem}.role-title{color:var(--rust-deep);font-size:var(--fs-sm);margin-block:.25rem var(--sp-2)}.experience-role div>p:last-child{color:var(--ink-soft)}.experience-education{border-top:1px solid var(--line);padding-top:var(--sp-4);font-size:var(--fs-sm);max-width:none}.skills-layout{gap:var(--sp-5);grid-template-columns:1.2fr 1fr;align-items:center;display:grid}.skills-radar{min-width:0;margin:0}.skills-radar svg{width:100%;height:auto;display:block;overflow:visible}.radar-guide{fill:none;stroke:var(--line);stroke-width:1.5px}.radar-value{fill:var(--rust);fill-opacity:.14;stroke:var(--rust);stroke-width:2.5px}.radar-point{fill:var(--rust);stroke:var(--paper);stroke-width:2px}.skills-radar text{fill:var(--ink);font:17px var(--font-mono)}.skill-evidence details{border-bottom:1px solid var(--line)}.skill-evidence summary{cursor:pointer;justify-content:space-between;align-items:center;gap:.5rem;min-height:56px;list-style:none;display:flex}.skill-evidence summary::-webkit-details-marker{display:none}.skill-count{font:var(--fs-meta) var(--font-mono);color:var(--ink-soft)}.skill-count span{color:var(--rust);margin-left:.5rem;display:inline-block}.skill-evidence details[open] .skill-count span{transform:rotate(45deg)}.skill-evidence ul{font-size:var(--fs-sm);margin:0 0 1rem;padding-left:1.25rem}.skill-evidence li+li{margin-top:.5rem}.section-resume-link{margin-top:var(--sp-4);min-height:44px}.resume-document .personal-section{border-top:1px solid var(--line);padding-top:var(--sp-4);margin-top:var(--sp-2)}.resume-document .personal-section h2{font-size:var(--fs-md)}.resume-document .personal-section .experience-section-heading{margin-bottom:var(--sp-3)}.resume-document .personal-facts li{border-top:0;align-items:baseline;gap:.75rem;padding-top:0;display:flex}.resume-document .personal-facts li:before{content:"•";color:var(--rust-deep)}.resume-document .personal-facts p{font-size:var(--fs-sm)}.personal-facts{gap:var(--sp-3) var(--sp-5);grid-template-columns:repeat(2,minmax(0,1fr));margin:0;padding:0;list-style:none;display:grid}.personal-facts li{border-top:1px solid var(--line);padding-top:var(--sp-4)}.personal-facts p{color:var(--ink-soft)}.fact-media-link{color:var(--rust-deep);text-underline-offset:.2em;white-space:nowrap}@media (width<=700px){.personal-facts{gap:var(--sp-4);grid-template-columns:1fr}}.resume-document{gap:var(--sp-4);padding:clamp(1.25rem,3vw,2rem);display:grid}.resume-document-copy{justify-content:space-between;align-items:center;gap:var(--sp-3);flex-wrap:wrap;display:flex}.resume-document-actions{gap:var(--sp-2);flex-wrap:wrap;display:flex}.button-outline{color:var(--ink);border:1px solid var(--line);background:0 0}.resume-document-copy>p:not(.marker){color:var(--ink-soft)}.resume-preview{width:min(100%,720px);transition:transform .2s var(--ease-out);margin-inline:auto;display:block}.resume-preview:hover{transform:translateY(-3px)}.resume-preview img{border:1px solid var(--line);width:100%;height:auto;box-shadow:0 8px 30px #38281917}@media (width<=700px){.experience-photo{justify-self:center;max-width:340px}.experience-intro,.experience-role,.skills-layout,.resume-document{grid-template-columns:1fr}.experience-role{gap:var(--sp-1)}.experience-section,.experience-intro{border-radius:1.25rem}.experience-intro{border-radius:0 0 1.25rem 1.25rem}.skills-radar{width:100%;max-width:450px;margin-inline:auto}.resume-document{gap:var(--sp-5)}}.article-head{gap:var(--sp-3);margin-bottom:var(--sp-6);display:grid}.article-head h1{max-width:24ch}.project-detail{background:var(--paper);border-radius:0 0 clamp(1.25rem,2.5vw,2rem) clamp(1.25rem,2.5vw,2rem);width:min(100% - clamp(2rem,7vw,6rem),1280px);max-width:1280px;margin-inline:auto;padding:clamp(2.25rem,5vw,4.75rem)}.project-detail-inner{width:100%;max-width:52rem;margin-inline:auto}.project-detail .article-head h1{max-width:18ch}.project-detail .article-head .lede{max-width:46ch}.article-back{font-family:var(--font-mono);font-size:var(--fs-sm)}.article-body{font-size:var(--fs-md);color:var(--ink);line-height:1.7}.article-body>*+*{margin-top:var(--sp-3)}.article-body p{max-width:var(--measure)}.article-body pre{max-width:100%;margin-block:var(--sp-4);padding:var(--sp-3);font-size:var(--fs-sm);background:#fff;border-radius:.85rem;overflow-x:auto}.article-body pre code{background:0 0;padding:0}.article-body h2,.article-body h3{margin-top:var(--sp-5)}.article-body h2{font-size:var(--fs-lg)}.article-body h3{font-size:var(--fs-md)}.article-body a{font-weight:500}.article-body ul,.article-body ol{padding-left:1.3rem}.article-body li+li{margin-top:.4rem}.article-body blockquote{margin:var(--sp-4) 0;padding-left:var(--sp-4);border-left:2px solid var(--rust);color:var(--ink-soft);font-style:italic}.article-body code{font-family:var(--font-mono);background:var(--paper-sunk);padding:.1em .35em;font-size:.88em}.article-body table{width:min(100%,42rem);margin:var(--sp-4) auto;border-collapse:collapse;border:1px solid var(--line-strong);background:var(--paper);color:var(--ink);font-size:var(--fs-base);border-radius:.85rem;line-height:1.25}.article-body th,.article-body td{text-align:center;vertical-align:middle;padding:.9rem 1rem}.article-body th{border-bottom:1px solid var(--line-strong);background:var(--paper-sunk);color:var(--ink);font-family:var(--font-mono);font-size:var(--fs-meta);letter-spacing:.04em;text-transform:uppercase;font-weight:600}.article-body td{border-bottom:1px solid var(--line);color:var(--ink-soft)}.article-body tbody tr:last-child td{border-bottom:0}.article-body td strong{color:var(--rust-deep);font-weight:700}.article-body .explain-term{color:var(--rust-deep);cursor:help;text-decoration-line:underline;text-decoration-style:dotted;text-decoration-thickness:.09em;text-decoration-color:var(--rust);text-underline-offset:.18em;align-items:baseline;display:inline-flex;position:relative}.article-body .explain-term:focus-visible{outline:2px solid var(--rust);outline-offset:.18em}.article-body .explain-term__bubble{z-index:20;border:1px solid var(--line-strong);background:var(--paper);width:min(22rem,100vw - 2rem);box-shadow:0 .85rem 2rem color-mix(in srgb, var(--ink) 16%, transparent);color:var(--ink-soft);font-family:var(--font-sans);font-size:var(--fs-sm);text-align:left;opacity:0;visibility:hidden;pointer-events:none;transition:opacity .16s var(--ease-out), transform .16s var(--ease-out), visibility .16s var(--ease-out);padding:.75rem .85rem;font-weight:400;line-height:1.45;text-decoration:none;position:absolute;bottom:calc(100% + .65rem);left:0;transform:translateY(.25rem)}.article-body .explain-term__bubble:after{content:"";background:var(--paper);border-right:1px solid var(--line-strong);border-bottom:1px solid var(--line-strong);width:.7rem;height:.7rem;position:absolute;top:100%;left:1.1rem;transform:translateY(-50%)rotate(45deg)}.article-body .explain-term:hover .explain-term__bubble,.article-body .explain-term:focus .explain-term__bubble,.article-body .explain-term:focus-visible .explain-term__bubble,.article-body .explain-term:focus-within .explain-term__bubble{opacity:1;visibility:visible;transform:translateY(0)}@media (width<=560px){.article-body table{font-size:var(--fs-sm)}.article-body th,.article-body td{padding:.75rem .55rem}.article-body th{letter-spacing:.02em;font-size:.68rem}.article-body .explain-term__bubble{width:auto;position:fixed;inset:1rem 1rem auto;transform:translateY(-.2rem)}.article-body .explain-term__bubble:after{display:none}}.tldr-card{gap:var(--sp-4);margin-bottom:var(--sp-6);background:#fff;border-radius:1.25rem;padding:clamp(1.25rem,3vw,2rem);display:grid}.tldr-head{gap:var(--sp-2);display:grid}.tldr-head p:last-child,.tldr-verdict{color:var(--ink-soft);max-width:none}.tldr-stats{background:var(--line);border:1px solid var(--line);border-radius:.85rem;grid-template-columns:repeat(4,minmax(0,1fr));gap:1px;margin:0;display:grid;overflow:hidden}.tldr-stat{min-width:0;padding:var(--sp-3);background:var(--paper);align-content:start;gap:.25rem;display:grid}.tldr-stat dt,.tldr-stat span{font-family:var(--font-mono);font-size:var(--fs-meta);letter-spacing:.02em;color:var(--ink-faint)}.tldr-stat dd{font-family:var(--font-display);color:var(--rust-deep);overflow-wrap:anywhere;margin:0;font-size:clamp(1.55rem,1.32rem + .9vw,1.9rem);line-height:1.04}.tldr-verdict{padding-left:var(--sp-3);border-left:2px solid var(--rust)}.article-body .project-figure{margin:var(--sp-5) 0;padding:var(--sp-3);background:#fff;border-radius:1.25rem;overflow:hidden}.article-body .project-figure img{width:100%}.article-body .project-figure figcaption{margin-top:var(--sp-2);font-family:var(--font-mono);font-size:var(--fs-meta);color:var(--ink-soft)}.article-body .project-download{gap:var(--sp-3);margin-top:var(--sp-4);padding:var(--sp-4);background:#fff;border-radius:1rem;align-items:start;display:grid}.article-body .project-download p{color:var(--ink-soft);font-size:var(--fs-sm)}.site-footer{margin-top:var(--sp-6);margin-bottom:var(--sp-4);background:var(--brand-orange);--ink-soft:var(--ink);--ink-faint:var(--ink);border-radius:clamp(1.25rem,2.5vw,2rem);padding:clamp(1.25rem,3vw,2.5rem)}:is(.home-page,.projects-page,.resume-page,.project-detail-page) .site-footer,:is(.home-page,.projects-page,.resume-page,.project-detail-page) .footer-bottom{border-top:0}.footer-main{gap:clamp(var(--sp-6), 8vw, var(--sp-8));grid-template-columns:minmax(0,1.45fr) minmax(18rem,.8fr);align-items:start;display:grid}.footer-brand{gap:var(--sp-3);max-width:42ch;display:grid}.footer-lockup{align-items:center;gap:var(--sp-3);width:fit-content;color:var(--ink);text-decoration:none;display:inline-flex}.footer-lockup img{flex:none;width:3.25rem;height:3.25rem}.footer-lockup span{gap:.15rem;display:grid}.footer-lockup strong{font-family:var(--font-display);font-size:var(--fs-md);color:var(--ink);font-weight:600;line-height:1.1}.footer-lockup small{font-family:var(--font-mono);letter-spacing:.1em;text-transform:uppercase;color:var(--ink);font-size:.68rem;font-weight:500}.footer-brand>p{color:var(--ink-soft);font-size:var(--fs-sm);line-height:1.55}.footer-socials{gap:var(--sp-2);margin-top:var(--sp-1);flex-wrap:wrap;display:flex}.footer-socials a{border:1px solid var(--line);background:var(--paper-sunk);width:3rem;height:3rem;color:var(--ink);transition:color .18s var(--ease-out), border-color .18s var(--ease-out), background-color .18s var(--ease-out);border-radius:50%;place-items:center;text-decoration:none;display:inline-grid}.footer-socials a:hover{border-color:color-mix(in srgb, var(--rust) 48%, var(--line));background:var(--rust-wash);color:var(--rust-deep)}.footer-directory{gap:var(--sp-5);grid-template-columns:repeat(2,minmax(0,1fr));display:grid}.footer-link-group{align-content:start;gap:var(--sp-2);display:grid}.footer-link-group p{font-family:var(--font-mono);font-size:var(--fs-meta);letter-spacing:.1em;text-transform:uppercase;color:var(--ink-faint);font-weight:500}.footer-link-group a{width:fit-content;min-height:44px;color:var(--ink-soft);font-size:var(--fs-sm);align-items:center;display:inline-flex}.footer-link-group a:hover{color:var(--ink);text-decoration-thickness:2px}.footer-bottom{justify-content:space-between;gap:var(--sp-3);margin-top:var(--sp-6);padding-top:var(--sp-3);border-top:1px solid var(--line);flex-wrap:wrap;display:flex}.footer-bottom p{font-family:var(--font-mono);font-size:var(--fs-meta);color:var(--ink-faint);letter-spacing:.02em}@media (prefers-reduced-motion:no-preference){html:has(.resume-page){scroll-behavior:smooth}.projects-grid .project--visual{transition:transform .22s var(--ease-out), box-shadow .22s var(--ease-out)}.projects-grid .project--visual:hover,.projects-grid .project--visual:focus-within{transform:translateY(-6px)}.project-card-action:after{transition:transform .18s var(--ease-out)}.project-card-link:hover .project-card-action:after,.project-card-link:focus-visible .project-card-action:after{transform:translate(3px)}.reveal{opacity:0;animation:reveal .6s var(--ease-out) forwards;transform:translateY(12px)}.reveal-1{animation-delay:50ms}.reveal-2{animation-delay:.13s}.footer-socials a{transition:transform .18s var(--ease-out), color .18s var(--ease-out), border-color .18s var(--ease-out), background-color .18s var(--ease-out)}.footer-socials a:hover{transform:translateY(-2px)}@keyframes reveal{to{opacity:1;transform:none}}}@media (width<=820px){.hero{gap:var(--sp-4);text-align:center;grid-template-columns:1fr}.hero-copy{justify-items:center}.hero-actions{justify-content:center}.hero-portrait{width:min(100%,21rem)}.about,.resume{grid-template-columns:1fr}.footer-main{gap:var(--sp-6);grid-template-columns:1fr}.tldr-stats{grid-template-columns:repeat(2,minmax(0,1fr))}.project-list.projects-grid{grid-template-columns:1fr}}@media (width<=640px){.site-header{padding-block:var(--sp-2);flex-wrap:nowrap;align-items:center}:is(.home-page,.projects-page,.resume-page,.project-detail-page) .site-header{padding:var(--sp-2) var(--sp-3) var(--sp-1);border-radius:1.25rem 1.25rem 0 0}body.home-page,body.projects-page,body.resume-page,body.project-detail-page{padding-top:var(--sp-2)}.brand{white-space:nowrap;gap:.5rem;min-width:0;font-size:clamp(1.02rem,4.7vw,1.18rem)}.brand-mark{width:1.5rem;height:1.5rem}.menu-toggle{width:44px;height:44px;color:var(--ink);cursor:pointer;background:#d88b69;border:0;border-radius:.75rem;flex:none;place-items:center;margin-left:auto;padding:0;display:inline-grid}.menu-toggle:hover{background:var(--rust-wash)}.menu-toggle svg{fill:none;stroke:currentColor;stroke-width:1.8px;stroke-linecap:round}.site-nav{top:calc(100% + .5rem);right:var(--gutter);border:1px solid var(--line);background:var(--paper);min-width:12rem;box-shadow:var(--shadow-soft);border-radius:1rem;flex-direction:column;gap:.15rem;padding:.5rem;display:none;position:absolute}.menu-toggle[aria-expanded=true]+.site-nav{display:flex}.site-nav a{border-radius:.65rem;min-height:44px;padding-inline:.85rem}.site-nav a:hover,.site-nav a[aria-current=page]{background:var(--rust-wash)}.site-nav a[aria-current=page]:after{display:none}}@media (width<=1040px) and (width>=681px){.project-list.home-project-list{grid-template-columns:repeat(2,minmax(0,1fr))}}@media (width<=560px){.hero{padding:var(--sp-4) var(--sp-3) var(--sp-5);border-radius:1.25rem}.home-page .hero{padding-top:var(--sp-2);border-radius:0 0 1.25rem 1.25rem;margin-top:0}.projects-hero{padding:var(--sp-5) var(--sp-3);border-radius:1.25rem}.projects-page .projects-hero,.resume,.project-detail{border-radius:0 0 1.25rem 1.25rem}.resume,.project-detail{padding:var(--sp-4) var(--sp-3) var(--sp-5)}.resume-block{gap:var(--sp-2);padding-block:var(--sp-2);grid-template-columns:1fr}.projects-hero h1,.hero h1{font-size:clamp(2.7rem,12vw,3.55rem)}.project-list.home-project-list{grid-template-columns:1fr}.entry{gap:var(--sp-2);grid-template-columns:1fr}.entry-date{padding-top:0}.project{gap:var(--sp-2);grid-template-columns:1fr}.site-footer{padding-block:var(--sp-6) var(--sp-4)}.footer-directory{gap:var(--sp-4)}.footer-bottom{margin-top:var(--sp-5);display:grid}.tldr-stats{grid-template-columns:1fr}.article-body table{table-layout:fixed;white-space:normal;width:100%;max-width:100%;display:table}.article-body pre{white-space:pre-wrap;overflow-wrap:anywhere}.article-body th,.article-body td{overflow-wrap:anywhere;padding:.55rem .25rem}.article-body th:first-child,.article-body td:first-child{text-align:left;width:29%}}.tableau-dashboard{border:1px solid var(--line);background:var(--paper);border-radius:16px;margin-block:2rem;padding:1rem}.tableau-dashboard [hidden]{display:none!important}.tableau-preview{border-radius:8px;width:100%;height:auto;display:block}.tableau-actions{flex-wrap:wrap;align-items:center;gap:1rem;margin-top:1rem;display:flex}.tableau-status{color:var(--ink-soft);font-size:.85rem}.tableau-dashboard [data-tableau-frame]{overflow-x:auto}.tableau-dashboard iframe{background:#fff;border:0;width:1200px;height:900px;display:block}@media (width<=600px){.tableau-dashboard{padding:.65rem}.tableau-dashboard iframe{width:100%;height:1450px}}@media (width>=900px){.tableau-dashboard{width:min(1240px,100vw - 32px);margin-left:calc(50% + min(1240px,100vw - 32px)/-2)}}.fact-image-dialog{background:var(--paper);border:0;border-radius:1.25rem;max-width:min(92vw,650px);max-height:92dvh;padding:1rem}.fact-image-dialog::backdrop{background:#1e1914a6}.fact-image-dialog img{object-fit:contain;width:auto;max-width:100%;height:auto;max-height:calc(92dvh - 6rem);margin-inline:auto;display:block}.fact-image-close{cursor:pointer;border:0;margin:0 0 .75rem auto;display:flex}html:has(.fact-image-dialog[open]){overflow:hidden}
