@font-face{font-family:Zilla Slab;src:url(/fonts/zilla-slab-400.woff2)format("woff2");font-weight:400;font-style:normal;font-display:swap}@font-face{font-family:Zilla Slab;src:url(/fonts/zilla-slab-italic-400.woff2)format("woff2");font-weight:400;font-style:italic;font-display:swap}@font-face{font-family:Zilla Slab;src:url(/fonts/zilla-slab-600.woff2)format("woff2");font-weight:600;font-display:swap}@font-face{font-family:Zilla Slab;src:url(/fonts/zilla-slab-700.woff2)format("woff2");font-weight:700;font-display:swap}@font-face{font-family:Departure Mono;src:url(/fonts/departure-mono-400.woff2)format("woff2");font-weight:400;font-display:swap}:root{--lake:#123f50;--cream:#f4ebdd;--terracotta:#c86b4a;--terracotta-deep:#a04e2e;--sun:#f2be55;--water-green:#78afa5;--ink:#1d2a30;--night:#071426;--surface:#fbf5ea;--surface-green:#eaf1ec;--surface-warm:color-mix(in srgb, var(--sun) 14%, var(--cream));--shadow-ink:3px 3px 0 var(--ink);--shadow-ink-sm:2px 2px 0 var(--ink);--maxw:68rem;--gutter:clamp(.75rem, 4vw, 3rem);--font:"Zilla Slab", "Iowan Old Style", Georgia, serif;--mono:"Departure Mono", "SFMono-Regular", Consolas, monospace}*{box-sizing:border-box}html{scroll-behavior:smooth;scrollbar-gutter:stable}html:has(.project-lightbox[open]){background:var(--night);overflow:hidden}body{font-family:var(--font);color:var(--ink);background-color:var(--cream);background-image:radial-gradient(#1d2a300a 1px,#0000 1px);background-size:4px 4px;margin:0;line-height:1.55}img{image-rendering:pixelated;max-width:100%}a{color:var(--lake)}:focus-visible{outline:3px solid var(--terracotta);outline-offset:2px}.site-header{z-index:30;background:color-mix(in srgb, var(--cream) 88%, transparent);backdrop-filter:blur(6px);border-bottom:2px solid var(--lake);flex-wrap:wrap;align-items:center;gap:.25rem 1rem;padding:.5rem clamp(.75rem,3vw,1.5rem);display:flex;position:fixed;inset:0 0 auto}.site-header .brand{white-space:nowrap;align-items:center;min-height:44px;font-size:1.05rem;font-weight:700;text-decoration:none;display:inline-flex}.site-nav{flex-wrap:wrap;gap:0 .9rem;margin-inline-start:auto;font-size:.95rem;display:flex}.site-nav a{align-items:center;min-height:44px;padding:.4rem .2rem;text-decoration:none;display:inline-flex}.site-nav a:hover{color:var(--terracotta-deep)}.nav-cta{border:2px solid var(--ink);background:var(--terracotta-deep);min-height:44px;color:var(--cream);white-space:nowrap;align-items:center;margin-left:.35rem;padding:.4rem .8rem;font-weight:700;text-decoration:none;display:inline-flex}.nav-cta:hover{transform:translate(1px,1px)}.site-nav a[aria-current=page]{color:var(--terracotta-deep);text-underline-offset:6px;text-decoration:underline}.header-tools{align-items:center;gap:.4rem;display:flex}.nav-menu{display:none}.lang-switch,.amb-btn{min-width:44px;min-height:44px;font-family:var(--mono);border:2px solid var(--lake);background:var(--cream);color:var(--ink);cursor:pointer;align-items:center;padding:.35rem .6rem;font-size:.8rem;text-decoration:none;display:inline-flex}.lang-switch[aria-current=true],.amb-btn[aria-pressed=true]{background:var(--lake);color:var(--cream)}.scene-wrap{position:relative}.scene{background:var(--lake);height:100dvh;min-height:42rem;transition:background 1.2s;position:relative;overflow:hidden;container-type:size}.scene .stage{--stage-w:max(100cqw, 150cqh);--stage-h:max(100cqh, 66.667cqw);width:var(--stage-w);height:var(--stage-h);left:calc((100cqw - var(--stage-w)) * var(--stage-x,.5));top:calc((100cqh - var(--stage-h)) * var(--stage-y,1));position:absolute}.scene .layer{pointer-events:none;user-select:none;width:100%;max-width:none;position:absolute;left:0}.scene .sky{object-fit:cover;height:100%;transition:opacity 1.2s;top:0}.scene[data-phase=dusk] .stage{background:linear-gradient(#3b4f7a 0%,#b5687a 32%,#f2a35e 50%,#f7cf86 58%)}.scene[data-phase=dusk] .sky{opacity:.25}.scene[data-phase=night] .stage{background:radial-gradient(1.5px 1.5px at 12% 14%, #f4ebdd 99%, transparent), radial-gradient(1.5px 1.5px at 27% 31%, #f4ebdd 99%, transparent), radial-gradient(1px 1px at 41% 9%, #f4ebdd 99%, transparent), radial-gradient(1.5px 1.5px at 58% 22%, #f4ebdd 99%, transparent), radial-gradient(1px 1px at 69% 36%, #f4ebdd 99%, transparent), radial-gradient(1.5px 1.5px at 83% 12%, #f4ebdd 99%, transparent), radial-gradient(1px 1px at 92% 28%, #f4ebdd 99%, transparent), radial-gradient(1px 1px at 6% 40%, #f4ebdd 99%, transparent), linear-gradient(180deg, var(--night) 0%, #0f2a48 45%, #1f4466 58%)}.scene[data-phase=night] .sky{opacity:0}.scene .cloud{pointer-events:none;transform:translateX(var(--rest,0%));animation:cloud-drift var(--drift,180s) linear var(--delay,0s) infinite;transition:opacity 1.2s;position:absolute;inset:0}.scene .cloud img{left:0;top:var(--y);width:var(--w);max-width:none;image-rendering:pixelated;position:absolute}.scene .cloud-a{--y:12%;--w:22%;--drift:210s;--delay:-60s;--rest:8%}.scene .cloud-b{--y:20%;--w:18%;--drift:170s;--delay:-125s;--rest:52%}.scene .cloud-c{--y:9%;--w:14%;--drift:240s;--delay:-20s;--rest:80%}.scene[data-phase=night] .cloud{opacity:.15}@keyframes cloud-drift{0%{transform:translate(-25%)}to{transform:translate(100%)}}.scene .astro{max-width:none;image-rendering:pixelated;opacity:0;pointer-events:none;transition:opacity 1.2s;position:absolute}.scene .sun-day{width:9%;bottom:56%;left:74%}.scene[data-phase=day] .sun-day{filter:drop-shadow(0 0 4cqw #f2be5573)}.scene[data-phase=day] .sky{filter:saturate(1.08)}.scene .sun-dusk{width:11%;bottom:44%;left:58%}.scene .moon{width:7.5%;left:var(--moon-x,70%);bottom:64%}.scene[data-phase=day] .sun-day,.scene[data-phase=dusk] .sun-dusk,.scene[data-phase=night] .moon{opacity:1}.scene .moon-reflection{height:26%;top:58%;left:var(--moon-x,70%);pointer-events:none;opacity:0;background:repeating-linear-gradient(#c8dce461 0 2px,#0000 2px 6px);width:9%;transition:opacity 1.2s;position:absolute;transform:translate(-8%);mask-image:linear-gradient(#0000,#000 18% 70%,#0000)}.scene[data-phase=night] .moon-reflection{opacity:.6}.scene[data-weather=rain] .moon-reflection,.scene[data-weather=cloudy] .moon-reflection{opacity:.25}.scene .shore{background:linear-gradient(#6f97ad,#3f6e86);width:100%;height:1.6%;position:absolute;top:56.6%;left:0}.scene .water{object-fit:cover;object-position:center top;height:42%;top:58%}.scene .bridge,.scene .traffic{aspect-ratio:1600/533;width:106%;top:20%;left:-1%}.scene .lights{aspect-ratio:1600/533;pointer-events:none;opacity:0;width:106%;max-width:none;transition:opacity 1.2s;position:absolute;left:-1%}.scene .bridge-lights,.scene .lights-glow{top:20%}.scene .lights-glow{filter:blur(4px)saturate(1.8)brightness(1.4);mix-blend-mode:screen}.scene .lights-reflection{transform-origin:0 0;mix-blend-mode:screen;top:59.9%;transform:skewY(.935deg)}.scene .reflection{aspect-ratio:1600/533;transform-origin:0 75.3%;opacity:.22;pointer-events:none;width:106%;max-width:none;position:absolute;top:20%;left:-1%;transform:skewY(1.87deg)scaleY(-1);mask-image:linear-gradient(#0000 50%,#000 85%),repeating-linear-gradient(#000 0 3px,#0000 3px 5px);mask-composite:intersect}.scene .tint{pointer-events:none;opacity:0;transition:opacity 1.2s,background 1.2s;position:absolute;inset:0}.scene[data-phase=dusk] .tint{opacity:.3;background:linear-gradient(#f2be5566,#c86b4a55 70%,#123f5044)}.scene[data-phase=dusk] .lights{opacity:.6}.scene[data-phase=night] .tint{opacity:.55;background:linear-gradient(#0b1f33cc,#123f50cc 55%,#0a2030dd)}.scene[data-phase=night] .lights{opacity:1}.scene .rain{pointer-events:none;opacity:0;background-image:radial-gradient(.7px 7px at 30% 40%,#d6e6f08c 99%,#0000),radial-gradient(.6px 5px at 70% 20%,#d6e6f066 99%,#0000),radial-gradient(.8px 9px at 50% 70%,#d6e6f059 99%,#0000);background-size:53px 97px,37px 71px,89px 131px;transition:opacity .8s;animation:.7s linear infinite rain-fall;position:absolute;inset:0 -15%;transform:skew(-12deg)}.scene[data-weather=rain] .rain{opacity:1}@keyframes rain-fall{0%{background-position:0 0,0 0,0 0}to{background-position:0 97px,0 142px,0 131px}}.scene .overcast{pointer-events:none;opacity:0;background:linear-gradient(#6b7783,#a3adb4);transition:opacity 1.2s;position:absolute;inset:0 0 42%}.scene[data-weather=cloudy] .overcast{opacity:.5}.scene[data-weather=rain] .overcast{opacity:.75}.scene[data-phase=night] .overcast{background:linear-gradient(#10171f,#232e38)}.scene[data-weather=cloudy] .cloud img,.scene[data-weather=rain] .cloud img{filter:grayscale(.75)brightness(.85)}.scene[data-weather=rain] .water{filter:brightness(.85)saturate(.8)}.scene .traffic{z-index:0;pointer-events:none;position:absolute}.scene .boats{pointer-events:none;position:absolute;inset:0}.scene .mover{transform-origin:0 0;will-change:transform;position:absolute;inset:0}.scene .vehicle,.scene .craft{position:absolute;top:0;left:0;translate:-50% -100%}.scene .vehicle{height:calc(1.8% * var(--h,1));image-rendering:pixelated}.scene .craft img{height:100%;image-rendering:pixelated;display:block}.scene .craft .wake{opacity:.7;height:35%;position:absolute;bottom:0}.scene .craft.ltr .wake{right:60%}.scene .craft.rtl .wake{left:60%}.scene-controls{z-index:5;align-items:center;gap:.4rem;display:flex;position:absolute;bottom:.5rem;right:clamp(.5rem,2vw,1.25rem)}.weather-badge{font-family:var(--mono);background:color-mix(in srgb, var(--ink) 70%, transparent);color:var(--cream);padding:.3rem .6rem;font-size:.75rem}.hero{z-index:4;padding:2.25rem max(var(--gutter), (100% - var(--maxw)) / 2) 1.5rem;color:var(--cream);text-shadow:0 2px #00000073;background:linear-gradient(180deg, transparent, color-mix(in srgb, var(--night) 90%, transparent) 2rem, color-mix(in srgb, var(--night) 94%, transparent));position:absolute;inset:auto 0 0}@media (width>=768px) and (width<=1023px){.scene{height:100svh}.scene-controls{top:4.5rem;bottom:auto}}.hero h1{text-wrap:balance;max-width:22ch;margin:0 0 .4rem;font-size:clamp(1.6rem,4.5vw,3rem);line-height:1.1}.hero p{text-wrap:pretty;max-width:52ch;margin:0 0 .8rem}.hero .hero-meta{font-family:var(--mono);color:var(--sun);background:color-mix(in srgb, var(--night) 60%, transparent);margin:-.3rem 0 .9rem;padding:.3rem .6rem;font-size:.8rem;display:inline-block}.cta-row{flex-wrap:wrap;gap:.6rem;display:flex}.btn{border:2px solid var(--ink);min-height:44px;text-shadow:none;background:var(--terracotta-deep);color:var(--cream);box-shadow:var(--shadow-ink);padding:.55rem 1.1rem;font-weight:700;text-decoration:none;display:inline-block}.btn-icon{vertical-align:-.15em;margin-right:.45rem}.btn.secondary{background:var(--cream);color:var(--ink)}.btn:hover{box-shadow:var(--shadow-ink-sm);transform:translate(1px,1px)}main{width:min(100% - 2 * var(--gutter), var(--maxw));counter-reset:sec;gap:3.5rem;margin:0 auto;padding:clamp(1.5rem,4vw,3rem) 0 4rem;display:grid}@media (width>=768px){.page-main{padding-top:5.5rem}}section.panel{scroll-margin-top:5.5rem;position:relative}section.panel.exologic,section.panel.personal,section.panel.featured{border:2px solid var(--lake);padding:clamp(1rem,3vw,2rem)}section.panel>:is(h1,h2):before{counter-increment:sec;content:counter(sec, decimal-leading-zero) " · ";font-family:var(--mono);color:var(--terracotta-deep);font-size:.5em;font-weight:400}section.panel.cat-shelf{padding-bottom:clamp(6.5rem,6vw,7rem)}section.panel.exologic{background:var(--surface-green);border-color:var(--water-green)}.exologic-services{gap:.35rem 2rem;max-width:40rem;margin:0 0 1.4rem;padding-left:1.1rem;list-style:square;display:grid}.exologic-services li::marker{color:var(--lake)}@media (width>=760px){.exologic-services{grid-template-columns:1fr 1fr}}section.panel.personal{background:var(--surface-warm);border-color:var(--sun)}section.panel.featured{background:var(--lake);color:var(--cream)}section.panel.featured h2{color:var(--cream)}section.panel.featured>h2:before{color:var(--sun)}section.panel>:is(h1,h2){color:var(--lake);text-wrap:balance;margin:0 0 .6rem;font-size:clamp(1.5rem,3.5vw,2rem)}section.panel p{text-wrap:pretty}.section-intro{max-width:62ch;color:var(--ink);margin-top:0}.project-list{border-top:2px solid var(--lake);margin-top:1.2rem;display:grid}.project{border-bottom:2px solid var(--lake);padding:1.1rem 0 1.3rem}.project h3{color:var(--lake);margin:.1rem 0 .15rem;font-size:1.25rem}.project .tag{font-family:var(--mono);letter-spacing:.06em;text-transform:uppercase;color:var(--terracotta-deep);margin:0;font-size:.75rem}.project .sub{margin:0 0 .4rem;font-weight:700}.project p{margin:0 0 .5rem}.project .tech{font-family:var(--mono);color:var(--lake);margin-bottom:0;font-size:.75rem}.project-evidence{margin:.9rem 0 0}.project-evidence a{cursor:zoom-in;display:block}.project-evidence img{image-rendering:auto;width:100%;height:auto;display:block}.project-evidence a:hover img,.project-evidence a:focus-visible img{outline:2px solid var(--terracotta-deep);outline-offset:3px}.project-lightbox{border:1px solid var(--lake);background:var(--night);width:min(76rem,100vw - 2rem);max-width:calc(100vw - 2rem);max-height:calc(100dvh - 2rem);color:var(--cream);padding:clamp(.75rem,2vw,1.25rem);overflow:auto}.project-lightbox[open]{gap:.75rem;display:grid}.project-lightbox::backdrop{background:color-mix(in srgb, var(--night) 90%, transparent)}.lightbox-toolbar{justify-content:space-between;align-items:center;gap:.75rem;display:flex}.project-lightbox .lightbox-title{color:var(--cream);margin:0;font-size:1.125rem;font-weight:700}.lightbox-toolbar form{margin:0}.lightbox-toolbar button{border:1px solid var(--cream);min-height:44px;color:var(--cream);font:inherit;white-space:nowrap;cursor:pointer;background:0 0;padding:.5rem .75rem}.project-lightbox .lightbox-image{object-fit:contain;object-position:center;background:0 0;border:0;width:100%;height:auto;max-height:calc(100dvh - 12rem)}.project-lightbox p{max-width:none;margin:0;font-size:.875rem}@media (width>=760px){.project,.agent-item,.work-notes{grid-template-columns:15rem minmax(0,1fr);align-items:start;column-gap:2.5rem;display:grid}}.agent-grid{border-top:1px solid color-mix(in srgb, var(--lake) 30%, transparent);margin-top:1.5rem}.agent-item{border-bottom:1px solid color-mix(in srgb, var(--lake) 18%, transparent);padding:1.2rem 0}.work-notes{margin-top:2rem}.work-notes .journey-link{margin-top:.75rem;font-weight:600}.work-notes h3{color:var(--lake);margin:0 0 .5rem;font-size:1.05rem}.work-notes p,.tech-notes p{max-width:60ch;margin:0}.tech-notes{margin-top:1.5rem}.tech-notes summary{cursor:pointer;color:var(--lake);padding:.75rem 0;font-weight:700}.tech-notes .tech-list{margin:.5rem 0 1rem}.tech-notes p+p{margin-top:.6rem}.journey{gap:1.4rem;margin:1rem 0 0;padding:0;list-style:none;display:grid}.journey li{border-left:3px solid var(--lake);padding-left:1.1rem}.journey h3{color:var(--lake);margin:0 0 .15rem;font-size:1.05rem}.journey .journey-meta{font-family:var(--mono);color:var(--terracotta-deep);margin:0 0 .3rem;font-size:.78rem}.journey p{max-width:60ch;margin:0}.journey .journey-tech{font-family:var(--mono);color:var(--lake);margin-top:.5rem;font-size:.75rem}@media (width>=1100px){.journey{grid-template-columns:repeat(5,minmax(0,1fr));gap:0;margin-top:1.75rem}.journey li{border-left:0;border-top:3px solid var(--lake);padding:1.4rem 1.5rem 0 0;position:relative}.journey li:before{content:"";background:var(--terracotta-deep);border:2px solid var(--cream);width:15px;height:15px;position:absolute;top:-9px;left:0}}.tech-list{margin:0;padding-left:1.1rem}.tech-list li{text-wrap:pretty;margin-bottom:.2rem}.agent-item h3{color:var(--lake);margin:0 0 .3rem;font-size:1.05rem}.agent-item p{margin:0}section.panel>p,.agent-item p,.tech-list li{max-width:60ch}.project p{max-width:62ch}.cat{cursor:pointer;background:0 0;border:0;min-width:44px;min-height:44px;padding:0;position:absolute}.cat img{height:calc(var(--cat-size,96px) * var(--cat-pose-scale,1));transition:transform .15s;display:block}.cat:hover img,.cat:focus-visible img{transform:translateY(-3px)}.cat-bubble{z-index:40;font-family:var(--mono);color:var(--ink);background:var(--cream);border:2px solid var(--ink);box-shadow:var(--shadow-ink);max-width:15rem;padding:.45rem .7rem;font-size:.85rem;position:fixed}.cat-bubble[hidden]{display:none}.site-footer{border-top:2px solid var(--lake);font-family:var(--mono);text-align:center;color:var(--lake);padding:1rem clamp(.75rem,4vw,3rem) 2rem;font-size:.8rem;position:relative}@media (width<=767px){.site-header{flex-wrap:nowrap;justify-content:space-between;position:relative}.header-tools{margin-inline-start:auto}.site-nav{display:none}.nav-menu{display:block;position:static}.nav-menu>summary{border:2px solid var(--ink);background:var(--cream);cursor:pointer;place-items:center;width:44px;height:44px;list-style:none;display:grid}.nav-menu>summary::-webkit-details-marker{display:none}.nav-menu-icon,.nav-menu-icon:before,.nav-menu-icon:after{background:var(--ink);width:18px;height:2px;transition:transform .15s,opacity .15s;display:block}.nav-menu-icon{position:relative}.nav-menu-icon:before,.nav-menu-icon:after{content:"";position:absolute;left:0}.nav-menu-icon:before{top:-6px}.nav-menu-icon:after{top:6px}.nav-menu[open] .nav-menu-icon{background:0 0}.nav-menu[open] .nav-menu-icon:before{transform:translateY(6px)rotate(45deg)}.nav-menu[open] .nav-menu-icon:after{transform:translateY(-6px)rotate(-45deg)}.nav-panel{z-index:20;background:var(--cream);border-bottom:2px solid var(--ink);box-shadow:var(--shadow-ink);flex-direction:column;padding:.5rem 0;display:flex;position:absolute;top:100%;left:0;right:0}.nav-panel a{align-items:baseline;gap:.75rem;padding:.85rem 1.1rem;font-size:1.35rem;font-weight:700;text-decoration:none;display:flex}.nav-panel a+a{border-top:1px solid color-mix(in srgb, var(--lake) 18%, transparent)}.nav-panel a[aria-current=page]{color:var(--terracotta-deep)}.nav-panel-index{font-family:var(--mono);color:var(--terracotta-deep);font-size:.75rem}.nav-cta{padding:.3rem .6rem;font-size:.85rem}.scene{height:78svh;min-height:clamp(32rem,100svh - 4rem,42rem)}.scene-controls{flex-wrap:nowrap;justify-content:flex-end;top:.5rem;bottom:auto;left:.5rem}.weather-badge{text-overflow:ellipsis;white-space:nowrap;flex-shrink:1;min-width:0;max-width:11rem;overflow:hidden}.amb-btn{white-space:nowrap;flex-shrink:0}.amb-btn,.weather-badge{padding:.25rem .45rem;font-size:.75rem}.scene .stage{--stage-x:.35}.scene .sun-day{bottom:52%;left:58%}.scene .sun-dusk{bottom:45%;left:42%}.scene .moon{left:var(--moon-x,62%);bottom:70%}.hero{padding:2.25rem clamp(.75rem,4vw,1.5rem) 1.2rem}.cat img{height:calc(var(--cat-size,96px) * var(--cat-pose-scale,1) * .7)}.cat.cat-top{top:auto!important;bottom:-4px!important}.tech-notes{padding-bottom:5rem}}@media (width<=480px){.hero .hero-meta{font-size:.75rem}.hero h1{font-size:clamp(1.45rem,7.5vw,2rem)}.hero p{font-size:.95rem}}@media (width<=767px) and (prefers-reduced-motion:no-preference){@supports (animation-timeline:scroll()){.hero{animation-name:hero-rise;animation-timing-function:linear;animation-fill-mode:both;animation-timeline:scroll();animation-range:0 78svh}}}@keyframes hero-rise{0%{transform:translateY(0)}to{transform:translateY(-18%)}}@media (height<=480px) and (orientation:landscape){.scene .stage{--stage-y:.45}}@media (prefers-reduced-motion:reduce){html{scroll-behavior:auto}.scene .rain,.scene .cloud{animation:none!important}*{transition-duration:.01ms!important}}
