.project-preview .preview-art--butterfly,.project-butterfly-demo-stage>.preview-art--butterfly{object-fit:contain;pointer-events:none;width:76%;height:76%;inset:12%}.project-butterfly-demo{justify-items:center;gap:var(--space-2);display:grid}.project-butterfly-demo-stage{background:var(--preview-background);width:100%;height:clamp(11rem,25vw,15rem);position:relative;overflow:hidden}.project-butterfly-demo-stage[data-playing=true]>.preview-art--butterfly{visibility:hidden}.project-butterfly-replay{min-height:2.75rem;padding:.5rem var(--space-2);border:1px solid var(--color-blue);color:var(--color-blue);font:inherit;cursor:pointer;background:0 0;border-radius:0;font-size:.875rem}.project-butterfly-replay:hover:enabled{border-color:var(--color-ink);color:var(--color-ink)}.project-butterfly-replay:disabled{opacity:.6;cursor:default}.project-butterfly-demo .project-butterfly-demo-status{color:var(--color-muted);font-size:var(--text-small);text-align:center;margin:0}@media (prefers-reduced-motion:reduce){.project-butterfly-demo-stage>.preview-art--butterfly{visibility:visible}}.projects-region{isolation:isolate;position:relative}.butterfly-transition{z-index:1;contain:layout paint;pointer-events:none;visibility:hidden;position:absolute;inset:0;overflow:clip}.butterfly-transition.is-active{visibility:visible}.butterfly-transition .butterfly{top:0;left:var(--butterfly-mobile-x);width:calc(var(--butterfly-size) * .72);opacity:0;position:absolute}.butterfly-transition .butterfly:nth-child(3n){display:none}.butterfly-transition img{width:100%;height:auto;display:block}@media (width>=40rem){.butterfly-transition .butterfly{left:var(--butterfly-x);width:var(--butterfly-size)}.butterfly-transition .butterfly:nth-child(3n){display:block}}@media (prefers-reduced-motion:reduce){.butterfly-transition{display:none}}@font-face{font-family:Bodoni Moda;font-style:normal;font-weight:400 700;font-display:swap;src:url(/fonts/bodoni-moda-latin.woff2)format("woff2")}:root{--lightningcss-light:initial;--lightningcss-dark: ;color-scheme:light;--navigation-height:2.75rem;--color-paper:#fdfbf7;--color-ink:#222321;--color-muted:#625e59;--color-blue:#385b86;--color-green:#3d5545;--color-plum:#725a79;--color-rule:#c8c3ba;--font-body:system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif;--font-heading:"Bodoni Moda", Georgia, "Times New Roman", serif;--text-small:.75rem;--text-body:1rem;--text-h2:clamp(1.875rem, 3vw, 2.5rem);--text-h3:clamp(1.5rem, 2vw, 1.75rem);--space-1:.375rem;--space-2:.75rem;--space-3:1rem;--space-4:1.5rem;--space-5:2rem;--space-6:3rem;--page-gutter:clamp(1.125rem, 3vw, 2.75rem);--section-space:clamp(1.5rem, 3vw, 2.5rem);--content-width:92rem;--reading-width:66ch;--board-gap:clamp(1.125rem, 2vw, 1.75rem)}*{box-sizing:border-box}html{scroll-padding-top:var(--navigation-height);scroll-padding-bottom:var(--space-4)}#main-content{scroll-margin-top:var(--space-3)}body{background:var(--color-paper);color:var(--color-ink);font-family:var(--font-body);font-size:var(--text-body);overflow-wrap:anywhere;margin:0;line-height:1.65}::selection{background:var(--color-blue);color:var(--color-paper)}.container{width:100%;max-width:var(--content-width);padding-inline:var(--page-gutter);margin-inline:auto}a{color:var(--color-blue);text-underline-offset:.25em;text-decoration-thickness:1px}a:hover{color:var(--color-ink);text-decoration-thickness:2px}:focus-visible{outline:3px solid var(--color-blue);outline-offset:4px;box-shadow:0 0 0 2px var(--color-paper)}.visually-hidden{clip-path:inset(50%);white-space:nowrap;border:0;width:1px;height:1px;padding:0;position:absolute;overflow:hidden}.skip-link{top:var(--space-3);left:var(--page-gutter);z-index:30;padding:var(--space-2) var(--space-3);background:var(--color-paper);position:fixed;transform:translateY(calc(-100% - 2rem))}.skip-link:focus{transform:translateY(0)}.header-content{padding-top:var(--space-3);text-align:center}.masthead-kicker{letter-spacing:.15em;text-transform:uppercase;max-width:none;margin:0;font-size:.6875rem;font-weight:600}.masthead{margin:0 0 var(--space-2);letter-spacing:-.06em;word-spacing:.08em;text-transform:uppercase;font-size:clamp(2.5rem,12vw,10.75rem);font-weight:500;line-height:1.14}.masthead a{color:var(--color-ink);text-decoration:none;display:inline-block}.site-navigation{z-index:20;background:var(--color-paper);position:sticky;top:0}.navigation-list{justify-content:center;gap:0 var(--space-4);border-block:1px solid var(--color-rule);flex-wrap:wrap;margin:0;padding:0;list-style:none;display:flex}.navigation-list a{padding-block:var(--space-2);color:var(--color-ink);font-size:var(--text-small);letter-spacing:.08em;text-transform:uppercase;font-weight:600;text-decoration:none;display:inline-block}.navigation-list a:hover{text-decoration:underline}section{min-width:0;padding-block:var(--section-space);scroll-margin-top:var(--space-4)}h1,h2,h3{margin:0 0 var(--space-3);font-family:var(--font-heading);text-wrap:balance;font-weight:500;line-height:1.2}h2{font-size:var(--text-h2);letter-spacing:-.035em}h3{font-size:var(--text-h3);letter-spacing:-.025em}p{max-width:var(--reading-width);margin:0 0 var(--space-3)}p:last-child{margin-bottom:0}.placeholder-label,.section-note{color:var(--color-muted);font-size:var(--text-small);line-height:1.6}.placeholder-label{margin-bottom:var(--space-1);letter-spacing:.04em}#introduction{padding-block:clamp(1.5rem,4vw,2rem)}#introduction .introduction-content{gap:var(--space-2);text-align:center;max-width:45rem;margin-inline:auto;display:grid}#introduction p{max-width:none;margin:0}#introduction .introduction-lead{font-family:var(--font-heading);font-size:clamp(1.5rem,3vw,2.25rem);font-weight:500;line-height:1.25}#introduction .introduction-text{font-family:var(--font-body);font-size:clamp(.9375rem,1.2vw,1rem);line-height:1.65}#projects{padding-top:0}.section-heading{justify-content:space-between;align-items:baseline;gap:var(--space-1) var(--space-4);margin-bottom:var(--space-4);padding-top:var(--space-3);border-top:1px solid var(--color-rule);flex-wrap:wrap;display:flex}.section-heading h2,.section-heading p{margin:0}.project-toolbar{justify-content:space-between;align-items:center;gap:var(--space-3) var(--space-4);margin-bottom:var(--space-4);flex-wrap:wrap;display:flex}.project-filters{flex-wrap:wrap;gap:.5rem;display:flex}.project-filter{min-width:2.75rem;min-height:2.75rem;padding:.5rem var(--space-2);border:1px solid var(--color-rule);color:var(--color-ink);font-family:var(--font-body);cursor:pointer;background:0 0;border-radius:0;font-size:.8125rem;font-weight:600;line-height:1.5}.project-filter:hover{border-color:var(--color-blue)}.project-filter[aria-pressed=true]{border-color:var(--color-blue);background:var(--color-blue);color:var(--color-paper)}.project-count{color:var(--color-muted);font-size:var(--text-small);margin:0}.project-board{--board-columns:1;column-count:var(--board-columns);column-gap:var(--board-gap);margin:0;padding:0;list-style:none}.project-board>li{break-inside:avoid;margin-bottom:var(--space-5)}.project-card{--preview-background:#dbe4ec;--preview-ink:#385b86;min-width:0}.project-card--green{--preview-background:#e2e7dc;--preview-ink:#3d5545}.project-card--plum{--preview-background:#dfd5df;--preview-ink:#624b6a}.project-card--paper{--preview-background:#eee9df;--preview-ink:#4b514a}.project-card--ink{--preview-background:#293d35;--preview-ink:#f0f1e9}.project-card figure{margin:0}.project-preview{background:var(--preview-background);width:100%;position:relative;overflow:hidden}.project-screenshot{width:100%;max-width:100%;height:auto;display:block}.project-screenshot-caption{color:var(--color-muted);font-size:var(--text-small);line-height:1.6}.project-screenshot-caption p{margin-bottom:var(--space-1)}.preview-label{top:var(--space-2);left:var(--space-2);z-index:1;background:var(--color-paper);color:var(--color-ink);letter-spacing:.06em;text-transform:uppercase;padding:.125rem .375rem;font-size:.625rem;font-weight:600;position:absolute}.preview-number{right:var(--space-2);bottom:var(--space-2);color:var(--preview-ink);font-size:var(--text-small);position:absolute}.preview-art{width:100%;height:100%;display:block;position:absolute;inset:0}.preview-paper{fill:#fdfbf7;stroke:var(--preview-ink);stroke-opacity:.25}.preview-fill{fill:var(--preview-ink)}.preview-wash{fill:var(--preview-ink);fill-opacity:.15}.preview-line,.preview-guide{stroke:var(--preview-ink);stroke-width:1.2px}.preview-guide{stroke-opacity:.2}.preview-display{fill:var(--preview-ink);font-family:var(--font-heading);font-weight:400}.preview-light{fill:var(--color-paper)}.preview-code{fill:var(--preview-ink);font-family:ui-monospace,SFMono-Regular,Consolas,monospace}.project-category{margin:var(--space-2) 0 var(--space-1);color:var(--color-blue);letter-spacing:.06em;text-transform:uppercase;font-size:.6875rem;font-weight:600}.project-card--green .project-category{color:var(--color-green)}.project-card--plum .project-category{color:var(--color-plum)}.project-card h3{margin-bottom:var(--space-1)}.project-caption{color:var(--color-muted);font-size:.875rem;line-height:1.6}.project-image-button,.project-title-button{width:100%;color:inherit;font:inherit;letter-spacing:inherit;overflow-wrap:inherit;text-align:left;text-wrap:inherit;cursor:pointer;background:0 0;border:0;border-radius:0;padding:0;display:block}.project-title-button{min-height:2.75rem}.project-title-button:hover{text-underline-offset:.15em;text-decoration:underline;text-decoration-thickness:1px}.project-board figcaption{margin-top:var(--space-2)}.project-role{margin-block:var(--space-2);font-size:.875rem}.project-tech-tags{gap:var(--space-1) var(--space-3);margin:var(--space-2) 0;flex-wrap:wrap;padding:0;font-size:.8125rem;font-weight:600;list-style:none;display:flex}.project-contributions,.project-links{padding-left:var(--space-4);margin:0}.project-contributions li+li,.project-links li+li{margin-top:var(--space-2)}.project-testing-tools{color:var(--color-muted);font-size:.875rem}.project-dialog{border:1px solid var(--color-rule);background:var(--color-paper);width:min(72rem,100% - 1.5rem);max-width:none;max-height:calc(100dvh - 1.5rem);color:var(--color-ink);margin:auto;padding:0;position:fixed;inset:0;overflow:hidden}.project-dialog[open]{flex-direction:column;display:flex}.project-dialog::backdrop{background:#222321a6}.project-dialog-header{justify-content:space-between;align-items:center;gap:var(--space-3);padding:var(--space-3) clamp(1rem, 2.5vw, 2rem);border-bottom:1px solid var(--color-rule);flex-shrink:0;display:flex}.project-dialog-header>div{min-width:0}.project-dialog-header h2{margin:0}.project-dialog-close{align-items:center;gap:var(--space-2);min-height:2.75rem;padding:.5rem var(--space-2);border:1px solid var(--color-ink);background:var(--color-paper);color:var(--color-ink);font-family:var(--font-body);cursor:pointer;border-radius:0;flex-shrink:0;font-size:.875rem;display:inline-flex}.project-dialog-close:hover{border-color:var(--color-blue);color:var(--color-blue)}.project-dialog-body{overscroll-behavior:contain;scrollbar-gutter:stable;min-height:0;padding:clamp(1rem,2.5vw,2rem);overflow-y:auto}.project-dialog-body:focus-visible{outline-offset:-4px}.project-dialog-layout{align-items:start;gap:var(--space-4) var(--space-5);grid-template-columns:minmax(0,1fr);display:grid}.project-dialog-preview{width:100%;max-width:34rem;margin:0 auto}.project-dialog-preview figcaption{margin-top:var(--space-2)}.project-dialog-copy{min-width:0}.project-dialog-section{margin-bottom:var(--space-4);padding:0}.project-dialog-section:last-child{margin-bottom:0}.project-dialog-section h3{margin-bottom:var(--space-2);color:var(--color-green);font-size:1.5rem}#skills,#about,#writing{border-top:1px solid var(--color-rule)}.skills-groups{gap:var(--space-4);grid-template-columns:minmax(0,1fr);display:grid}.skills-group{gap:var(--space-1) var(--space-4);grid-template-columns:minmax(0,1fr);align-items:start;min-width:0;display:grid}.skills-group h3{color:var(--color-green);margin:0;font-size:1.25rem;line-height:1.3}.skills-group p{max-width:60ch;margin:0}.skills-development{color:var(--color-blue);font-weight:600}.skills-note{color:var(--color-muted);font-size:.8125rem;line-height:1.6}.about-note h3{margin-top:var(--space-4);color:var(--color-green);font-size:1.375rem}.associations-list{max-width:var(--reading-width);padding-left:var(--space-4);margin:0}.associations-list li+li{margin-top:var(--space-2)}.botanical-decoration{width:1.5rem;height:1.875rem;margin-left:var(--space-1);color:var(--color-green);vertical-align:-.1em;display:inline-block}#writing .placeholder-area>p:last-child{font-family:var(--font-heading);font-size:1.5rem;line-height:1.5}#contact{--contact-background:#e8eff6;justify-items:center;gap:var(--space-4);margin-block:var(--space-4) var(--space-6);border-block:1px solid var(--color-rule);background:var(--contact-background);color:var(--color-ink);text-align:center;grid-template-columns:minmax(0,1fr);padding:clamp(1.5rem,4vw,3rem) clamp(1.25rem,4vw,4rem);display:grid}#contact h2{font-family:var(--font-heading);margin:0;font-size:clamp(3rem,7vw,6.5rem);line-height:1.05}#contact .contact-actions,#contact .contact-email-group{justify-items:center;min-width:0;display:grid}#contact .contact-actions{gap:var(--space-3)}#contact .contact-email-group{gap:var(--space-2);max-width:100%}#contact .contact-email{justify-content:center;align-items:center;gap:var(--space-1) var(--space-2);max-width:100%;min-height:2.75rem;padding:var(--space-1) 0;color:var(--color-blue);font:inherit;cursor:pointer;background:0 0;border:0;border-radius:0;flex-wrap:wrap;display:inline-flex}#contact .contact-email-address{overflow-wrap:anywhere;text-underline-offset:.25em;min-width:0;max-width:100%;text-decoration:underline;text-decoration-thickness:1px}#contact .contact-copy-label{align-items:center;gap:var(--space-1);font-size:var(--text-small);display:inline-flex}#contact .contact-social-link{border:1px solid var(--color-blue);justify-content:center;align-items:center;min-height:2.75rem;padding:.5rem 1.25rem;font-weight:600;text-decoration:none;display:inline-flex}#contact .contact-copy-status{margin:0;font-size:.8125rem}#contact .contact-manual-email{border:1px solid var(--color-blue);background:var(--color-paper);width:100%;min-width:0;min-height:2.75rem;color:var(--color-ink);font:inherit;border-radius:0;padding:.5rem}#contact .contact-email:hover{color:var(--color-ink)}#contact .contact-email:hover .contact-email-address{text-decoration-thickness:2px}#contact .contact-socials{justify-content:center;gap:var(--space-2);flex-wrap:wrap;display:flex}#contact .contact-social-link{color:var(--color-ink)}#contact .contact-social-link:hover{border-color:var(--color-ink);background:var(--color-paper)}.site-footer{border-top:1px solid var(--color-ink);font-size:var(--text-small)}.footer-content{align-items:center;gap:var(--space-1);padding-block:var(--space-4);text-align:center;flex-direction:column;display:flex}.footer-content p{margin:0}.footer-content .footer-credit{color:var(--color-muted)}.footer-credit a{display:inline-block}@media (width>=40rem){.project-board{--board-columns:2}#skills,#about,#writing{gap:var(--space-4);grid-template-columns:10rem minmax(0,1fr);align-items:start;display:grid}}@media (width>=64rem){.skills-group{grid-template-columns:15rem minmax(0,1fr)}.skills-group>p{grid-column:2}.project-board{--board-columns:3}.navigation-list{gap:0 var(--space-6)}}@media (width>=56rem){.project-dialog-layout{grid-template-columns:minmax(0,.95fr) minmax(0,1fr)}}@media (width>=80rem){.project-board{--board-columns:4}}@media (forced-colors:active){.project-filter[aria-pressed=true]{color:highlighttext;background:highlight;border-color:highlight}:focus-visible{outline-color:highlight}.project-preview{border:1px solid canvastext}}
