.bedroom-skylight{pointer-events:none;width:100%;height:100%;position:absolute;inset:0}.skylight-clouds{animation:84s ease-in-out infinite alternate skylight-drift}@keyframes skylight-drift{0%{transform:translate(-9px,1px)}to{transform:translate(10px,-2px)}}.skylight-airplane{animation:112s linear infinite skylight-flight}@keyframes skylight-flight{0%,11%{opacity:0;transform:translate(518px,135px)}12%{opacity:.64}27%{opacity:.64}28%,to{opacity:0;transform:translate(1384px,67px)}}.bedroom-skylight[data-paused=true] :is(.skylight-clouds,.skylight-airplane,.skylight-rain){animation-play-state:paused}.bedroom-skylight[data-suspended=true]{visibility:hidden}@media (prefers-reduced-motion:reduce){.bedroom-skylight[data-weather=default],.skylight-airplane,.skylight-rain{display:none}.bedroom-skylight :is(.skylight-clouds,.skylight-airplane,.skylight-rain){animation:none}}.bedroom-skylight[data-weather=clear] .skylight-tone{filter:brightness(1.08)saturate(1.08)}.bedroom-skylight[data-weather=partly-cloudy] .skylight-tone{filter:brightness(.96)saturate(.9)}.bedroom-skylight[data-weather=overcast] .skylight-tone{filter:saturate(.38)contrast(.78)brightness(.91)}.bedroom-skylight[data-weather=rain] .skylight-tone{filter:saturate(.4)contrast(.83)brightness(.66)}.bedroom-skylight[data-weather=night] .skylight-tone{filter:saturate(.74)brightness(.48)}.skylight-rain{opacity:.24;animation:1.35s linear infinite skylight-rain}@keyframes skylight-rain{to{transform:translateY(57px)}}.weather-control{margin-inline-start:.75em;display:inline-block}.weather-control button{font:inherit;color:inherit;text-underline-offset:.15em;background:0 0;border:0;padding:.25em .35em;text-decoration:underline}.weather-control a{text-decoration:underline}.profile-grid{grid-template-columns:repeat(2,minmax(0,1fr));gap:1rem;display:grid}.profile-grid section{background:#102534;border:1px solid #246274;border-radius:.65rem;padding:1rem}.profile-grid h3,.profile-experience h4{color:#c5fff6;margin:0 0 .35rem}.profile-grid h3{align-items:center;gap:.45rem;display:flex}.profile-grid h3 svg{flex:none}.profile-grid ul{margin:.5rem 0 0;padding-inline-start:1.1rem}.profile-experience{padding:0;list-style:none}.profile-experience li{border-bottom:1px solid #275168;margin-bottom:.9rem}.profile-experience small{color:#b5c9d5;margin-top:.25rem;display:block}.profile-links{flex-wrap:wrap;gap:1rem;display:flex}.contact-form{gap:.8rem;max-width:35rem;display:grid}.contact-form label{gap:.25rem;font-weight:600;display:grid}.contact-form :is(input,select,textarea){color:#f4fbff;width:100%;font:inherit;background:#102534;border:1px solid #42748b;border-radius:.4rem;padding:.7rem}.contact-form textarea{resize:vertical}.contact-form .primary{justify-self:start}.contact-form [role=alert]{color:#ffcfab}.contact-form [role=status]:empty{display:none}.sr-only{clip-path:inset(50%);white-space:nowrap;width:1px;height:1px;position:absolute;overflow:hidden}@media (width<=520px){.profile-grid{grid-template-columns:minmax(0,1fr)}.room nav{gap:clamp(2px,1vw,6px)}.room nav :is(a,button){font-size:clamp(.67rem,2.7vw,.86rem)}.room nav .environment-toggle{gap:2px;min-width:34px;padding-inline:3px}.room nav .environment-toggle svg{width:12px;height:12px}}.transition-status{clip-path:inset(50%);white-space:nowrap;width:1px;height:1px;padding:0;position:absolute;overflow:hidden}.environment-transition{--duration:5.6s;z-index:10;touch-action:none;isolation:isolate;animation:shift-overlay var(--duration) linear both;background:#030810;position:fixed;inset:0;overflow:hidden}.shift-rock{z-index:-1;width:100%;height:100%;animation:shift-rock var(--duration) ease both;position:absolute;inset:0}@keyframes shift-rock{0%,12%,88%,to{opacity:0}36%,70%{opacity:.62}}.shift-light{z-index:-1;animation:shift-light var(--duration) ease both;background:radial-gradient(at 57% 72%,#14527673 0,#0615221a 43%,#0000 70%);position:absolute;inset:0}.shift-structure{position:absolute;overflow:hidden}.environment-transition>.shift-structure{z-index:1}.shift-incoming{--offset:var(--elapsed);position:absolute;inset:0}.shift-part,.shift-shell,.shift-screen-power,.shift-floor-extension{animation-duration:var(--duration);animation-timing-function:cubic-bezier(.42,0,.22,1);animation-fill-mode:both;animation-delay:var(--offset,0s)}.shift-part{transform-box:fill-box;transform-origin:50%}.shift-bedroom .shift-part{animation-name:bedroom-retract}.shift-bedroom [data-timing=roof]{animation-name:bedroom-unlock}.shift-bedroom .shift-shell{animation-name:bedroom-shell}.shift-batcave .shift-part{animation-name:cave-assemble}.shift-batcave [data-timing=shell]{animation-name:cave-shell-assemble}.shift-batcave .shift-shell,.shift-floor-extension{animation-name:cave-shell}.shift-screen-power{fill:#020812}.shift-bedroom .shift-screen-power{animation-name:bedroom-power}.shift-batcave .shift-screen-power{animation-name:cave-power}.shift-batcave [data-screen-index="1"]{animation-name:cave-power-center}.shift-batcave [data-screen-index="2"]{animation-name:cave-power-right}.shift-batcave [data-timing=water]{animation-name:cave-water-reveal}.environment-transition[data-direction=to-bedroom] :is(.shift-part,.shift-shell,.shift-screen-power,.shift-floor-extension){animation-direction:reverse}@keyframes shift-overlay{0%,2%{opacity:0}9%,90%{opacity:1}to{opacity:0}}@keyframes shift-light{0%,19%,85%,to{opacity:0}47%,67%{opacity:1}}@keyframes bedroom-unlock{0%,12%{opacity:1;filter:brightness();transform:none}23%{filter:brightness(.47)}35%{opacity:1}52%,to{transform:var(--travel);opacity:0;filter:brightness(.42)}}@keyframes bedroom-retract{0%,19%{opacity:1;transform:none}26%{filter:brightness(.54)}43%{opacity:1}57%,to{transform:var(--travel);opacity:0;filter:brightness(.43)}}@keyframes bedroom-shell{0%,12%{opacity:1;filter:brightness()}24%{opacity:1;filter:brightness(.5)}43%{opacity:.62}53%,to{opacity:0;filter:brightness(.45)}}@keyframes bedroom-power{0%,9%{opacity:0}17%,to{opacity:.98}}@keyframes cave-shell-assemble{0%,36%{transform:var(--travel);opacity:0;filter:brightness(.38)}50%{opacity:.88}74%,to{opacity:1;filter:brightness();transform:none}}@keyframes cave-assemble{0%,44%{transform:var(--travel);opacity:0;filter:brightness(.37)}55%{opacity:.86}84%,to{opacity:1;filter:brightness();transform:none}}@keyframes cave-shell{0%,46%{opacity:0;filter:brightness(.35)}80%,to{opacity:1;filter:brightness()}}@keyframes cave-power{0%,70%{opacity:.98}86%,to{opacity:0}}@keyframes cave-power-center{0%,74%{opacity:.98}87%,to{opacity:0}}@keyframes cave-power-right{0%,78%{opacity:.98}89%,to{opacity:0}}@keyframes cave-water-reveal{0%,49%{transform:var(--travel);opacity:0}83%,to{opacity:1;transform:none}}@media (width<=1000px){.environment-transition{clip-path:var(--scene-aperture)}.room:has(~.environment-transition) :is(main,footer){visibility:hidden}.shift-floor-extension{display:none}.shift-rock,.shift-light{height:45%;top:12%}}@media (prefers-reduced-motion:reduce){.environment-transition{display:none}}:root{color:#f5f8fa;--lightningcss-light: ;--lightningcss-dark:initial;color-scheme:dark;--teal:#04dfad;--muted:#d3e0e8;background:#091017;font-family:Segoe UI,Arial,sans-serif}*{box-sizing:border-box}body{margin:0}button,a{font:inherit}a{color:inherit;text-decoration:none}button{cursor:pointer;color:inherit}:focus-visible{outline-offset:4px;outline:3px solid #fff}.skip{z-index:5;background:#07131b;padding:12px;position:fixed;top:10px;left:12px;transform:translateY(-200%)}.skip:focus{transform:none}.room{isolation:isolate;grid-template-rows:auto 1fr auto;min-height:max(650px,100svh);display:grid;position:relative;overflow:hidden}.scene{z-index:-1;position:absolute;inset:0;overflow:hidden;container-type:size}.artwork{transform-origin:72% 37%;width:max(100cqw,177.68cqh);height:max(100cqh,56.28cqw);transition:transform .65s cubic-bezier(.22,.7,.2,1);position:absolute;top:50%;left:max(50%,7px + max(100cqw,177.68cqh)/2.27273);transform:translate(-50%,-50%);container-type:inline-size}.room[data-zoom=true] .artwork{transform:translate(-50%,-50%)scale(2.3)}.scene:after{content:"";pointer-events:none;background:linear-gradient(90deg,#050c16b0 0%,#050c166b 34%,#0000 62%),linear-gradient(#0000 76%,#050c1699);position:absolute;inset:0}.artwork>img,.bedside-clock{width:100%;height:100%;display:block}.bedside-clock{pointer-events:none;position:absolute;inset:0}.clock-digits{color:#25ecff;fill:none;stroke:currentColor;stroke-width:2.4px;stroke-linecap:round;filter:drop-shadow(0 0 1.8px #00d6ed)}.clock-digits text{fill:currentColor;stroke:none;font:700 9px monospace}.computer,.room-secret{z-index:1;background:0 0;border:0;border-radius:3px;padding:0;position:absolute}.computer{width:10.6%;height:10.6%;top:32%;left:66.51%}.computer:hover{box-shadow:inset 0 0 12px #03dcab45}.room-secret{width:3.65%;height:6.95%;top:26.65%;left:27.55%}.room-secret:focus-visible{outline-offset:1px;outline:1px solid #fff}.monitor-code{pointer-events:none;clip-path:polygon(0 8%,100% 3%,99% 100%,0 98%);color:#a2d7df;white-space:pre;background:linear-gradient(120deg,#101a28,#0d1726);width:5.55%;height:8.7%;padding:.42cqw .24cqw;font:.32cqw/1.24 Consolas,monospace;position:absolute;top:33.05%;left:68.85%;overflow:hidden}.editor-lines{transform-origin:0 0;animation:22s ease-in-out infinite editor-scroll;rotate:-2deg}.editor-lines i{color:#ec9ea9;font-style:normal}.editor-lines b{color:#d8bd88;font-weight:400}.typing{border-right:.09cqw solid #65deed;width:0;max-width:max-content;animation:22s steps(13,end) infinite editor-type,1.25s step-end infinite editor-cursor;overflow:hidden}@keyframes editor-scroll{0%,55%,to{transform:translateY(0)}67%,87%{transform:translateY(-.85cqw)}}@keyframes editor-type{0%,55%{width:0}72%,95%{width:13ch}to{width:0}}@keyframes editor-cursor{50%{border-color:#0000}}header{background:#050e17da;justify-content:space-between;align-items:center;gap:28px;padding:17px clamp(24px,2.8vw,58px);display:flex;position:relative}.brand{align-items:center;gap:17px;display:inline-flex}.brand strong,.brand small{display:block}.brand strong{font-size:1.24rem;font-weight:650}.brand small{color:var(--muted);white-space:nowrap;font-size:.87rem}.brand b{color:#81d4d7}.monogram{letter-spacing:-.12em;padding-right:.1em;font:italic 800 2.65rem/1 Segoe Script,Brush Script MT,cursive}nav{align-items:center;gap:clamp(14px,2vw,32px);display:flex}nav button,nav a{background:0 0;border:0;border-bottom:2px solid #0000;padding:10px 0;font-size:.9rem;font-weight:650}nav a[aria-current],nav button:hover{color:#6effdb;border-color:var(--teal)}main{pointer-events:none;align-self:stretch;position:relative}main button{pointer-events:auto}.welcome{max-width:min(38vw,550px);position:absolute;top:49%;left:13.7%;transform:translateY(-50%)}.eyebrow{color:#41ffce;text-transform:uppercase;letter-spacing:.055em;text-shadow:0 1px 7px #000;margin:0 0 .35rem;font-size:.79rem;font-weight:700}h1{letter-spacing:-.04em;text-shadow:0 2px 14px #000;margin:0;font-size:clamp(2.15rem,2.62vw,3.35rem);line-height:1.06}h1 em{color:var(--teal);font-style:normal}.intro{text-shadow:0 1px 8px #000,0 1px 3px #000;max-width:44ch;margin:.85rem 0 1.3rem;font-size:clamp(.93rem,1vw,1.05rem);line-height:1.5}.actions{flex-wrap:wrap;gap:10px;display:flex}.primary,.secondary{border-radius:30px;justify-content:center;align-items:center;gap:8px;min-height:43px;padding:8px 17px;font-size:.88rem;font-weight:650;display:inline-flex}.primary svg,.secondary svg{width:17px;height:17px}.primary{background:var(--teal);color:#041617;border:1px solid var(--teal)}.primary:hover{background:#72ffdb}.secondary{background:#091526cf;border:1px solid #d9e9f3}.secondary:hover{background:#1c3447}.quick{background:#061a21ed;border:1px solid #268e92;border-radius:11px;width:clamp(145px,9.4vw,170px);padding:15px 13px;position:absolute;bottom:8%;right:2.4%;box-shadow:0 8px 24px #0006}.quick h2{margin:4px 5px 9px;font-size:.88rem}.quick button{text-align:left;background:0 0;border:0;border-top:1px solid #224750;align-items:center;gap:8px;width:100%;min-height:41px;padding:7px 5px;font-size:.83rem;display:flex}.quick button:hover{color:#6effdb}.quick button span{color:#86c9cd;margin-left:auto}.room-hint{color:var(--muted);text-align:center;text-shadow:0 1px 5px #000;place-self:end center;padding:22px 18px;font-size:.8rem}nav .environment-toggle{background:#0a1929;border:1px solid #53757f;border-radius:20px;flex:none;justify-content:center;align-items:center;gap:4px;min-width:48px;min-height:34px;padding:4px 6px;display:inline-flex}.environment-toggle svg{width:15px;height:15px}.environment-toggle svg:first-child{color:#ffd34d}.environment-toggle svg:last-child{color:#a0b3c7}nav .environment-toggle:hover{border-color:var(--teal)}dialog{color:#f5f8fa;background:#0a1722;border:1px solid #367d87;border-radius:18px;width:min(880px,100% - 36px);max-height:calc(100dvh - 40px);padding:clamp(19px,4vw,37px);overflow:auto;box-shadow:0 16px 70px #000a}dialog::backdrop{background:#030b14b8}dialog[data-gallery=true][open]{animation:.65s both reveal}@keyframes reveal{0%,26%{opacity:0;transform:scale(.9)}to{opacity:1;transform:none}}#panel-title{margin:20px 0 14px;font-size:clamp(1.65rem,4vw,2.5rem)}dialog p{color:var(--muted);line-height:1.55}.gallery{grid-template-columns:repeat(auto-fit,minmax(min(100%,205px),1fr));gap:12px;padding:0;list-style:none;display:grid}.gallery li{background:#112632;border:1px solid #265261;border-radius:8px;padding:14px}.gallery h3{color:#79f6d8;margin:0;font-size:1rem}.gallery p{margin:.5rem 0;font-size:.91rem}.gallery small{color:#b8cbd7}.gallery .project-subtitle{margin-bottom:.25rem}.gallery .project-status{color:#8cf2d9;font-weight:650;display:block}.skills{flex-wrap:wrap;gap:10px 30px;padding-left:20px;display:flex}@media (width<=780px),(width<=1100px) and (aspect-ratio<=1){.room{min-height:100svh}header{flex-direction:column;align-items:flex-start;gap:8px;padding:14px 19px 8px}nav{justify-content:space-between;gap:8px;width:100%}nav button,nav a{min-height:44px}.scene{height:clamp(176px,60vw,400px);top:112px}.artwork{width:max(100cqw,177.68cqh);height:max(100cqh,56.28cqw);left:50%}.scene:after{background:linear-gradient(#0000 70%,#091017)}main{align-content:end;gap:20px;padding:clamp(182px,61vw,400px) 19px 13px;display:grid}.welcome,.quick{max-width:none;position:static;transform:none}.intro{max-width:43ch}.quick{grid-template-columns:repeat(2,1fr);width:100%;display:grid}.quick h2{grid-column:1/-1}}@media (width<=360px){.brand{gap:14px}nav{gap:3px}nav button,nav a{font-size:.8rem}}@media (prefers-reduced-motion:reduce){.artwork{transition:none}.editor-lines,.typing{animation:none}.typing{border-color:#0000;width:13ch}dialog[data-gallery=true][open]{animation:none}}.cave{--teal:#00d7f5;background:#02070e;grid-template-rows:auto 1fr;grid-template-columns:minmax(0,1fr)}.cave header{background:linear-gradient(90deg,#030811ec,#03081126 45% 60%,#030811ec)}.cave nav a[aria-current],.cave nav button:hover{color:#65ebff}.cave-scene{z-index:-1;position:absolute;inset:0 0 auto}.cave-art{aspect-ratio:1942/810;width:100%;position:relative;container-type:inline-size}.cave-art img{width:100%;height:100%;display:block}.cave-ambience{pointer-events:none;position:absolute;inset:0}.cave-waterfall,.cave-reflection,.cave-servers,.cave-map,.cave-terminal,.cave-emblem{position:absolute}.cave-waterfall{clip-path:polygon(2% 0,98% 0,94% 96%,0 100%);width:10.2%;height:19.7%;top:14.6%;left:49.5%;overflow:hidden;-webkit-mask-image:linear-gradient(#0000,#000 12% 86%,#0000);mask-image:linear-gradient(#0000,#000 12% 86%,#0000)}.cave-waterfall i{background-color:#0000;background-image:radial-gradient(8% 42% at 17%,#acf5ff8c,#0000),radial-gradient(6% 50% at 41% 20%,#ddfaff9e,#0000),radial-gradient(8% 37% at 63% 72%,#8defff8f,#0000),radial-gradient(5% 46% at 84% 48%,#81eaff91,#0000);background-position:0 0,0 0,0 0,0 0;background-repeat:repeat,repeat,repeat,repeat;background-size:100% 20%;background-attachment:scroll,scroll,scroll,scroll;background-origin:padding-box,padding-box,padding-box,padding-box;background-clip:border-box,border-box,border-box,border-box;height:125%;animation:1.7s linear infinite cave-water-flow;position:absolute;inset:0 0 auto}.cave-waterfall i+i{opacity:.62;animation-duration:2.6s;animation-delay:-1.1s;left:7%;right:9%}@keyframes cave-water-flow{0%{transform:translateY(-20%)}to{transform:translateY(0)}}.cave-screen-layer{width:100%;height:100%;position:absolute;inset:0}.cave-display-motion{animation:ease-in-out infinite alternate cave-screen-update}@keyframes cave-screen-update{0%,22%{transform:none}74%,to{transform:translateY(var(--screen-shift))}}.cave-reflection{background:radial-gradient(#00c8ff30,#0000 65%);width:26%;height:17%;animation:11s ease-in-out infinite alternate cave-glow;top:79%;left:44%}.cave-servers{background:radial-gradient(circle at 13% 30%,#45dcff99,#0000 4%),radial-gradient(circle at 49% 63%,#54e4ffb0,#0000 4%),radial-gradient(circle at 91% 43%,#79e8ffba,#0000 4%);width:8.7%;height:14%;animation:5s ease-in-out infinite alternate cave-glow;top:27%;left:33.4%}@keyframes cave-glow{0%{opacity:.2}to{opacity:.8}}.cave-map{width:9.8%;height:12%;top:42%;left:46.6%}.cave-map svg{width:100%;height:100%}.cave-map circle{fill:#b5fbff;animation:4s ease-in-out infinite alternate cave-glow}.map-route{fill:none;stroke:#a3f5ff;stroke-width:.55px;stroke-dasharray:2 8;opacity:.78;animation:12s linear infinite cave-route}@keyframes cave-route{to{stroke-dashoffset:-30px}}.cave-terminal{clip-path:polygon(0 4%,100% 0,100% 100%,0 96%);color:#99ebef;white-space:pre;background:#071928dc;width:5.8%;height:9%;padding:.33cqw;font:.39cqw/1.55 Consolas,monospace;top:44.8%;left:57.9%;overflow:hidden}.cave-terminal div{animation:13s ease-in-out infinite alternate cave-scroll}@keyframes cave-scroll{0%,40%{translate:0}85%,to{translate:0 -.8cqw}}.cave-emblem{background:0 0;border:0;border-radius:45%;width:9.5%;min-width:28px;height:16%;min-height:24px;padding:0;top:25.3%;left:87.8%}.cave-emblem:hover{box-shadow:inset 0 0 15px #5aeaff38}.cave-emblem:focus-visible{outline-offset:1px;outline:2px solid #a5f4ff}.cave main{min-height:max(470px,41.71vw - 78px)}.cave .welcome{max-width:35vw;top:max(92px,12.15vw - 78px);left:11%;transform:none}.cave .eyebrow{color:#51f1ff}.cave h1{font-size:clamp(1.9rem,2.28vw,3.35rem)}.cave .intro{max-width:39ch}.cave .primary:hover{background:#96f4ff}.cave .featured{background:#051729f5;border-color:#167a9b;width:clamp(173px,12.2vw,260px);padding:9px 11px;top:max(42px,9.68vw - 78px);bottom:auto;right:14.2%}.cave .featured button{border-color:#183b50;min-height:clamp(34px,2vw,44px)}.cave .featured button svg{color:#5adfff;width:16px;height:16px}.cave .featured button:hover{color:#8aeaff}.project-status{color:#8cf2d9}.cave-scene[data-paused=true] .cave-ambience *,.cave-scene[data-paused=true] .cave-ambience{animation-play-state:paused}@media (width>=1001px){.cave .welcome{isolation:isolate}.cave .welcome:before{content:"";z-index:-1;background:radial-gradient(#02070eb3 18%,#0000 70%);position:absolute;inset:-15% -13% -15% -23%}.cave-scene:after,.shift-floor-extension{content:"";pointer-events:none;transform-origin:top;background:url(/batcave.png) bottom/100% no-repeat;height:clamp(0px,40svh - 16.684vw,8vw);position:absolute;inset:100% 0 auto;transform:scaleY(-2.5)translateY(-100%);-webkit-mask-image:linear-gradient(#0000 6%,#000 96%);mask-image:linear-gradient(#0000 6%,#000 96%)}}@media (width<=1000px){.cave header{background:#030811;flex-direction:column;align-items:flex-start;gap:8px;padding:14px 19px 8px}.cave nav{justify-content:space-between;width:100%}.cave nav button,.cave nav a{min-height:44px}.cave-scene{z-index:auto;grid-row:2;min-width:0;position:relative}.cave{grid-template-rows:auto auto 1fr}.cave main{align-content:start;gap:22px;min-height:0;padding:19px 19px 25px;display:grid}.cave .welcome,.cave .featured{max-width:none;position:static}.cave .featured{grid-template-columns:repeat(2,minmax(0,1fr));width:100%;display:grid}.cave .featured h2{grid-column:1/-1}.cave .featured button{min-height:44px}.cave .intro{max-width:53ch}}@media (prefers-reduced-motion:reduce){.cave-ambience *{animation:none!important}.cave-screen-layer{display:none}}@media (width<=600px){.cave-terminal{font-size:max(2px,.39cqw)}.cave-terminal div{position:relative}.cave-terminal div:after{content:"";background:#65deed;width:28%;height:1px;position:absolute;top:45%;right:8%}}
