.site-menu{display:none}@media (width<=800px){.site-header[data-portfolio]{z-index:40;background:var(--background);position:relative}.site-header[data-portfolio]>.header-inner{gap:var(--spacing-2);grid-template-columns:48px minmax(0,1fr) 48px;min-height:64px;padding-block:0;display:grid}.site-header[data-portfolio]>.header-inner:after{content:"";grid-area:1/3;width:48px;height:48px}.site-header[data-portfolio] .primary-nav,.site-header[data-portfolio] .header-actions{display:none}.site-menu{grid-area:1/2;justify-self:end;display:block;position:static}.site-menu-trigger{justify-content:center;align-items:center;gap:var(--spacing-2);border-radius:var(--control-radius);min-width:88px;min-height:44px;color:var(--foreground);font:500 var(--font-size-sm)/1.4286 var(--font-heading);cursor:pointer;touch-action:manipulation;padding:12px 16px;list-style:none;display:inline-flex}.site-menu-trigger::-webkit-details-marker{display:none}.site-menu-trigger::marker{content:""}.site-menu-trigger-text{min-width:88px}.site-menu-trigger-hamburger{width:44px;min-width:44px;padding-inline:12px}.site-menu-trigger-combined{min-width:112px}.site-menu-label-open,.site-menu[open] .site-menu-label-closed{display:none}.site-menu[open] .site-menu-label-open{display:inline}.site-menu-icon{flex:0 0 18px;width:18px;height:18px;display:inline-block;position:relative}.site-menu-icon:before,.site-menu-icon:after,.site-menu-icon>span{content:"";background:currentColor;border-radius:999px;height:1.5px;transition:transform .16s cubic-bezier(.16,1,.3,1),inset-block-start .16s cubic-bezier(.16,1,.3,1);position:absolute;inset-inline:1px}.site-menu-icon:before{inset-block-start:4px}.site-menu-icon>span{inset-block-start:8px}.site-menu-icon:after{inset-block-start:12px}.site-menu[open] .site-menu-icon:before{inset-block-start:8px;transform:rotate(45deg)}.site-menu[open] .site-menu-icon>span{transform:scaleX(0)}.site-menu[open] .site-menu-icon:after{inset-block-start:8px;transform:rotate(-45deg)}.site-menu-trigger:focus-visible{outline:2px solid var(--ring);outline-offset:3px;background:var(--surface)}.site-menu-panel{z-index:1;overscroll-behavior:contain;border-top:1px solid var(--border);border-bottom:1px solid var(--border);background:var(--background);max-height:calc(100dvh - 64px);position:absolute;top:100%;left:0;right:0;overflow-y:auto;box-shadow:0 10px 24px #00000014,0 3px 8px #0000000d}.site-menu-inner{width:min(calc(100% - var(--layout-page-gutter) * 2), var(--layout-content-max));padding-block:var(--spacing-3) 1.25rem;gap:var(--spacing-4);margin-inline:auto;display:grid}.site-menu-primary{gap:var(--spacing-1);display:grid}.site-menu-primary a,.site-menu-pair a{border-radius:var(--control-radius);min-height:44px;color:var(--foreground);font:500 var(--font-size-sm)/1.4286 var(--font-heading);touch-action:manipulation;align-items:center;display:flex}.site-menu-primary a{padding:12px 16px}.site-menu-primary a[aria-current]{background:var(--surface);text-decoration:none}.site-menu-secondary{gap:var(--spacing-1);display:grid}.site-menu-secondary>p{font-size:var(--font-size-sm)}.site-menu-pair{gap:var(--spacing-2);grid-template-columns:repeat(2,minmax(0,1fr));display:grid}.site-menu-pair a{border:1px solid var(--border);padding:12px 16px}.site-menu-languages a{justify-content:center}.site-menu-languages a[aria-current=page]{color:var(--foreground);background:var(--surface);text-underline-offset:.2em;text-decoration:underline}@media (hover:hover) and (pointer:fine){.site-menu-trigger:hover,.site-menu-primary a:hover,.site-menu-pair a:hover{background:var(--surface);text-decoration:none}}.site-menu-primary a:focus-visible,.site-menu-pair a:focus-visible{outline:2px solid var(--ring);outline-offset:2px;background:var(--surface)}}@media (prefers-reduced-motion:reduce){.site-menu-icon:before,.site-menu-icon:after,.site-menu-icon>span{transition:none}}@media (forced-colors:active){.site-menu-panel{border:1px solid canvastext}.site-menu-languages a[aria-current=page]{color:canvas;background:canvastext}}:root{--blue-hover-inline:#0500aa;--blue-hover-stop-1:#3864da;--blue-hover-stop-2:#1750db;--blue-hover-stop-3:#0500aa}:root[data-theme=dark]{--blue-hover-inline:#e9f6ff;--blue-hover-stop-1:#9ddcff;--blue-hover-stop-2:#7eacff;--blue-hover-stop-3:#4f8cff}@media (prefers-color-scheme:dark){:root:not([data-theme=light]){--blue-hover-inline:#e9f6ff;--blue-hover-stop-1:#9ddcff;--blue-hover-stop-2:#7eacff;--blue-hover-stop-3:#4f8cff}}.footer-opposite-theme{--blue-hover-stop-1:#9ddcff;--blue-hover-stop-2:#7eacff;--blue-hover-stop-3:#4f8cff}:root[data-theme=dark] .footer-opposite-theme{--blue-hover-stop-1:#3864da;--blue-hover-stop-2:#1750db;--blue-hover-stop-3:#0500aa}@media (prefers-color-scheme:dark){:root:not([data-theme=light]) .footer-opposite-theme{--blue-hover-stop-1:#3864da;--blue-hover-stop-2:#1750db;--blue-hover-stop-3:#0500aa}}:is(.blue-hover-hit,.blue-hover-cta){--blue-hover-gradient:linear-gradient(90deg, var(--blue-hover-rest) 0%, var(--blue-hover-rest) 32%, var(--blue-hover-stop-1) 40%, var(--blue-hover-stop-2) 49%, var(--blue-hover-stop-3) 59%, transparent 68%, transparent 100%)}@supports (background-image:linear-gradient(90deg in srgb, red, blue)){:is(.blue-hover-hit,.blue-hover-cta){--blue-hover-gradient:linear-gradient(90deg in srgb, var(--blue-hover-rest) 0%, var(--blue-hover-rest) 32%, var(--blue-hover-stop-1) 40%, var(--blue-hover-stop-2) 49%, var(--blue-hover-stop-3) 59%, transparent 68%, transparent 100%)}}.blue-hover-hit{--blue-hover-rest:var(--foreground);--blue-hover-scale:1.025;min-width:0;color:inherit;touch-action:manipulation;align-items:center;text-decoration:none;display:inline-flex}.blue-hover-hit--nav{--blue-hover-scale:1.05}.blue-hover-hit--inline{--blue-hover-rest:var(--blue-hover-inline);color:var(--blue-hover-inline)}.blue-hover-hit:hover,.blue-hover-hit:active{background:0 0;text-decoration:none}.blue-hover-label{transform-origin:50%;min-width:0;transition:transform .25s cubic-bezier(.19,1,.22,1);display:inline-grid;position:relative;transform:scale(1)}.blue-hover-label__text,.blue-hover-label__wash{grid-area:1/1;min-width:0}.blue-hover-label__wash{pointer-events:none;position:absolute;inset:0}.blue-hover-label__wash:before{background-image:var(--blue-hover-gradient);color:#0000;content:attr(data-text);opacity:0;background-position:100%;background-size:300% 100%;-webkit-background-clip:text;background-clip:text;width:100%;height:100%;transition:background-position .7s cubic-bezier(.4,0,.2,1),opacity .16s;display:block}.blue-hover-hit .blue-hover-label:after{background-color:currentColor;background-image:var(--blue-hover-gradient);content:"";opacity:0;pointer-events:none;background-position:100%;background-size:300% 100%;height:1px;transition:background-position .7s cubic-bezier(.4,0,.2,1),opacity .16s;position:absolute;bottom:-.2em;left:0;right:0}:is(.blue-hover-hit--inline,.blue-hover-hit[aria-current]) .blue-hover-label:after{opacity:1}.blue-hover-cta{--blue-hover-rest:var(--foreground);min-width:0;max-width:100%;color:var(--foreground);touch-action:manipulation;align-items:center;text-decoration:none;display:inline-flex}.blue-hover-cta__visual{transform-origin:50%;transition-property:transform,background-color,border-color;transition-duration:.25s,.16s,.16s;transition-timing-function:cubic-bezier(.19,1,.22,1),ease,ease;transform:scale(1)}@media (hover:hover) and (pointer:fine){.blue-hover-hit:hover .blue-hover-label{transform:scale(var(--blue-hover-scale))}.blue-hover-hit:hover .blue-hover-label__wash:before,.blue-hover-cta:hover .blue-hover-label__wash:before{opacity:.98;background-position:0%}.blue-hover-hit:hover .blue-hover-label:after{opacity:1;background-position:0%}.blue-hover-cta:hover .blue-hover-cta__visual{transform:scale(1.025)}}@media (prefers-reduced-motion:reduce){.blue-hover-label,.blue-hover-cta__visual{transition:none;transform:none!important}.blue-hover-label__wash:before{content:none;transition:none}.blue-hover-hit .blue-hover-label:after{background-color:currentColor;background-image:none;background-position:0 0;transition:none}}@media (forced-colors:active){.blue-hover-hit{color:linktext}.blue-hover-label,.blue-hover-cta__visual{transition:none;transform:none!important}.blue-hover-label__wash:before{content:none;transition:none}.blue-hover-hit .blue-hover-label:after{background-color:linktext;background-image:none;background-position:0 0;transition:none}}.theme-controls{z-index:2147483000;pointer-events:none;display:none;position:fixed;inset:0}html[data-theme-controller-ready] .theme-controls{display:block}.theme-controls button{pointer-events:auto}.theme-peel{--peel-size:34px;--peel-ease:cubic-bezier(.16, 1, .3, 1);width:48px;height:48px;color:var(--foreground);cursor:pointer;touch-action:none;-webkit-tap-highlight-color:transparent;background:0 0;border:0;padding:0;position:fixed;top:0;right:0;overflow:visible}.theme-peel-sheet,.theme-peel-back,.theme-peel-shadow{pointer-events:none;transform-origin:100% 0;will-change:clip-path;width:180px;height:180px;position:absolute;top:0;right:0}.theme-peel-shadow{filter:blur(5px);clip-path:polygon(100% 0, 100% calc(var(--peel-size) + 7px), calc(100% - var(--peel-size) - 7px) 0);transition:clip-path .38s var(--peel-ease), opacity .18s ease-out;background:#00000047;transform:translate(-2px,4px)}.theme-peel-back{background:linear-gradient(135deg, transparent 44%, #ffffff85 51%, transparent 59%), color-mix(in srgb, var(--surface) 72%, var(--foreground));clip-path:polygon(100% 0, 100% calc(var(--peel-size) + 5px), calc(100% - var(--peel-size) - 5px) 0);transition:clip-path .38s var(--peel-ease), filter .18s ease-out}.theme-peel-sheet{background:radial-gradient(circle at 86% 12%, #ffffff38, transparent 24%), var(--foreground);color:var(--background);clip-path:polygon(100% 0, 100% var(--peel-size), calc(100% - var(--peel-size)) 0);transition:clip-path .38s var(--peel-ease), filter .18s ease-out;place-items:start end;padding:6px;display:grid}.theme-peel svg{fill:none;stroke:currentColor;stroke-width:1.7px;stroke-linecap:round;stroke-linejoin:round;width:20px;height:20px;overflow:visible}.theme-peel[data-dragging] .theme-peel-sheet{transition:filter .15s ease-out}.theme-peel[data-dragging] .theme-peel-back,.theme-peel[data-dragging] .theme-peel-shadow{transition:none}.theme-help{color:#fafafa;opacity:0;pointer-events:auto;visibility:hidden;background:#0a0a0ae0;border-radius:7px;max-width:17rem;padding:7px 10px;font:500 12px/1.4 -apple-system,BlinkMacSystemFont,Segoe UI,sans-serif;transition:opacity .14s ease-out,transform .14s ease-out,visibility 0s linear .14s;position:fixed;top:52px;right:12px;transform:translateY(-4px);box-shadow:0 6px 18px #0003}.theme-help:before{content:"";height:8px;position:absolute;inset:-8px 0 auto}@media (hover:hover) and (pointer:fine){.theme-peel:hover .theme-peel-sheet,.theme-peel:focus-visible .theme-peel-sheet{filter:brightness(1.08)}.theme-peel:hover,.theme-peel:focus-visible{--peel-size:44px}.theme-peel:hover+.theme-help,.theme-peel:focus-visible+.theme-help,.theme-help:hover{opacity:1;visibility:visible;transition-delay:0s;transform:translateY(0)}}html[data-theme-help-dismissed] .theme-help{pointer-events:none;opacity:0!important;visibility:hidden!important}html[data-theme=light] .theme-icon-sun,html[data-theme=dark] .theme-icon-moon{display:none}html[data-theme-fallback] body,html[data-theme-fallback] .site-header,html[data-theme-fallback] .project-card,html[data-theme-fallback] .theme-peel{transition:color .16s ease-out,background-color .16s ease-out,border-color .16s ease-out}html[data-theme-transition=peel]::view-transition-old(root){z-index:1;animation:none}html[data-theme-transition=peel]::view-transition-new(root){z-index:2;mix-blend-mode:normal;transform-origin:100% 0;animation-name:theme-peel-reveal;animation-duration:.56s;animation-timing-function:cubic-bezier(.22,.72,.38,.94);animation-fill-mode:both}html::view-transition{pointer-events:none}@keyframes theme-peel-reveal{0%{clip-path:polygon(100% 0,100% 0,100% 0,100% 0,100% 0,100% 0,100% 0)}to{clip-path:polygon(100% 0,100% 201%,70% 171%,38% 140%,0 101%,-38% 80%,-101% 0)}}@media (prefers-reduced-motion:reduce){.theme-peel-sheet,.theme-peel-back,.theme-peel-shadow,.theme-help,html[data-theme-fallback] body,html[data-theme-fallback] .site-header,html[data-theme-fallback] .project-card,html[data-theme-fallback] .theme-peel{transition:none!important}.theme-peel:hover .theme-peel-sheet,.theme-peel:focus-visible .theme-peel-sheet{filter:none}.theme-peel:hover,.theme-peel:focus-visible{--peel-size:34px}.theme-help,.theme-peel:hover+.theme-help,.theme-peel:focus-visible+.theme-help,.theme-help:hover{transform:none!important}html[data-theme-transition]::view-transition-old(root),html[data-theme-transition]::view-transition-new(root){animation:none!important}}@media (forced-colors:active){.theme-peel-sheet,.theme-peel-back{color:buttontext;background:canvas;border:1px solid buttontext}}@media (width<=800px){.theme-controls+.site-header .primary-nav{padding-inline-end:40px}}.primary-nav[data-astro-cid-fzpbxy5g] a[data-astro-cid-fzpbxy5g][aria-current]{color:var(--foreground);text-decoration:none}.privacy-settings{align-items:center;display:inline-flex}.privacy-link{min-width:var(--control-target-min);min-height:var(--control-target-min);color:inherit;font:inherit;text-underline-offset:.2em;cursor:pointer;touch-action:manipulation;background:0 0;border:0;padding:0;text-decoration:underline}.privacy-choice{width:min(42rem,100vw - 2rem);max-height:min(42rem,100dvh - 2rem);padding:clamp(var(--spacing-6), 4vw, var(--spacing-8));border:1px solid var(--border-media);border-radius:var(--control-radius);background:var(--background);color:var(--foreground);opacity:0;margin:auto;position:fixed;overflow:auto;transform:translateY(12px);box-shadow:0 18px 60px #0000003d}.privacy-choice[open]{gap:var(--spacing-4);opacity:1;animation:.24s cubic-bezier(.16,1,.3,1) privacy-enter;display:grid;transform:translateY(0)}.privacy-choice::backdrop{background:#00000094}.privacy-choice h2{max-width:calc(100% - 2.75rem);font-size:var(--font-size-lg)}.privacy-choice h2:focus{outline:none}.privacy-choice h3{font-size:var(--font-size-base)}.privacy-choice>p{max-width:var(--layout-prose-max)}.privacy-close{top:var(--spacing-3);right:var(--spacing-3);width:var(--control-target-min);height:var(--control-target-min);color:inherit;cursor:pointer;background:0 0;border:0;border-radius:50%;place-items:center;padding:0;font-size:1.5rem;line-height:1;display:inline-grid;position:absolute}.privacy-information{gap:var(--spacing-6);padding-top:var(--spacing-4);border-top:1px solid var(--border-media);font-size:var(--font-size-sm);display:grid}.privacy-information section{gap:var(--spacing-2);display:grid}.privacy-information p{max-width:var(--layout-prose-max)}.privacy-actions{gap:var(--spacing-3);flex-wrap:wrap;display:flex}.privacy-button{min-width:var(--control-target-min);min-height:calc(var(--control-target-min) + 1px);border:1px solid var(--border-media);border-radius:var(--control-radius);background:var(--background);color:var(--foreground);font:500 var(--font-size-sm)/1.4286 var(--font-heading);cursor:pointer;touch-action:manipulation;flex:11rem;padding:.625rem 1rem}.privacy-revoke{flex:none;justify-self:start}.privacy-status{font-size:var(--font-size-sm);color:var(--foreground);font-weight:600}.email-copy[hidden],.privacy-choice .privacy-actions,.privacy-choice .privacy-revoke{display:none}.privacy-choice:is([data-analytics-state=unknown],[data-analytics-state=denied]) .privacy-actions{display:flex}.privacy-choice[data-analytics-state=denied] [data-analytics-reject]{display:none}.privacy-choice:is([data-analytics-state=loading],[data-analytics-state=active],[data-analytics-state=failed]) .privacy-revoke{display:block}.privacy-policy-link{color:var(--foreground);font:500 var(--font-size-sm)/1.5 var(--font-heading);text-underline-offset:.2em;text-decoration:underline}.privacy-nojs{gap:var(--spacing-2);width:min(100%, var(--layout-prose-max));font-size:var(--font-size-sm);display:grid}.contact-email{gap:var(--spacing-3);display:grid}.email-copy{justify-self:start}@keyframes privacy-enter{0%{opacity:0;transform:translateY(12px)}}@media (hover:hover) and (pointer:fine){.privacy-link:hover{color:var(--foreground)}.privacy-button:hover,.privacy-close:hover,.email-copy:hover{background:var(--surface)}}@media (width<=400px){.privacy-choice{width:calc(100vw - 1rem);max-height:calc(100dvh - 1rem)}}@media (prefers-reduced-motion:reduce){.privacy-choice[open]{animation:none}}@media (forced-colors:active){.privacy-choice::backdrop{opacity:.75;background:canvas}}.footer-rabbit{--rabbit-find-position:72%;isolation:isolate;user-select:none;width:100%;height:64px;margin-block:0;position:relative}.footer-rabbit [hidden]{display:none!important}.footer-rabbit__ground{opacity:.28;pointer-events:none;background:currentColor;height:1px;position:absolute;bottom:8px;left:0;right:0}.footer-rabbit__actor{width:32px;height:32px;transform:translate(var(--rabbit-start-x,0), 0);transform-origin:50% 100%;pointer-events:none;position:absolute;bottom:10px;left:0}.footer-rabbit__facing{transform-origin:50% 100%;width:32px;height:32px;position:relative}[data-facing=left] .footer-rabbit__facing{transform:scaleX(-1)}.footer-rabbit__sprite{width:32px;height:32px;position:relative}[data-state=approach] .footer-rabbit__actor{animation:rabbit-approach var(--rabbit-travel-duration) linear both}[data-state=grip] .footer-rabbit__actor{animation:.18s cubic-bezier(.16,1,.3,1) both rabbit-grip}[data-state=pull] .footer-rabbit__actor{animation:.22s cubic-bezier(.16,1,.3,1) both rabbit-pull}[data-state=result] .footer-rabbit__actor{animation:.18s cubic-bezier(.16,1,.3,1) both rabbit-result}[data-state=return] .footer-rabbit__actor{animation:rabbit-return var(--rabbit-travel-duration) .14s linear both}[data-state=approach] .footer-rabbit__sprite,[data-state=return] .footer-rabbit__sprite{animation:.18s cubic-bezier(.45,0,.55,1) both rabbit-hop;animation-iteration-count:var(--rabbit-hop-count,3)}[data-state=pull] [data-rabbit-found]{animation:.22s cubic-bezier(.16,1,.3,1) both rabbit-found}@keyframes rabbit-approach{0%{transform:translate(var(--rabbit-start-x), 0)}to{transform:translate(var(--rabbit-end-x), 0)}}@keyframes rabbit-grip{0%{transform:translate(var(--rabbit-end-x), 0)}to{transform:translate(var(--rabbit-end-x), 1px) rotate(var(--rabbit-grip-rotation))}}@keyframes rabbit-pull{0%{transform:translate(var(--rabbit-end-x), 1px) rotate(var(--rabbit-grip-rotation))}to{transform:translate(var(--rabbit-pull-x), -2px) rotate(var(--rabbit-pull-rotation))}}@keyframes rabbit-result{0%{transform:translate(var(--rabbit-pull-x), -2px) rotate(var(--rabbit-pull-rotation))}to{transform:translate(var(--rabbit-result-x), var(--rabbit-result-y)) rotate(var(--rabbit-result-rotation))}}@keyframes rabbit-return{0%{transform:translate(var(--rabbit-result-x), var(--rabbit-result-y)) rotate(var(--rabbit-result-rotation))}to{transform:translate(var(--rabbit-start-x), 0)}}@keyframes rabbit-hop{0%,to{transform:translateY(0)}50%{transform:translateY(-4px)}}@keyframes rabbit-found{0%{transform:translateY(21px)}to{transform:none}}.footer-rabbit__actor img{width:32px;max-width:none;height:32px;image-rendering:pixelated;display:none;position:absolute;inset:0}[data-state=idle] .footer-rabbit__actor [data-pose=idle],[data-state=approach] .footer-rabbit__actor [data-pose=idle],[data-state=approach] .footer-rabbit__actor [data-pose=approach],[data-state=grip] .footer-rabbit__actor [data-pose=grab],[data-state=pull] .footer-rabbit__actor [data-pose=pull],[data-state=result][data-result=carrot] .footer-rabbit__actor [data-pose=happy],[data-state=result][data-result=can] .footer-rabbit__actor [data-pose=sad],[data-state=result][data-result=shovel] .footer-rabbit__actor [data-pose=sad],[data-state=return] .footer-rabbit__actor [data-pose=idle],[data-state=return] .footer-rabbit__actor [data-pose=approach]{display:block}.footer-rabbit:is([data-state=approach],[data-state=return]) .footer-rabbit__actor [data-pose=idle],.footer-rabbit:is([data-state=approach],[data-state=return]) .footer-rabbit__actor [data-pose=approach]{animation-duration:.18s;animation-timing-function:step-end;animation-fill-mode:both;animation-iteration-count:var(--rabbit-hop-count,3)}.footer-rabbit:is([data-state=approach],[data-state=return]) .footer-rabbit__actor [data-pose=approach]{animation-name:rabbit-step-approach}.footer-rabbit:is([data-state=approach],[data-state=return]) .footer-rabbit__actor [data-pose=idle]{animation-name:rabbit-step-idle}@keyframes rabbit-step-approach{0%,49.999%{opacity:1}50%,to{opacity:0}}@keyframes rabbit-step-idle{0%,49.999%{opacity:0}50%,to{opacity:1}}.footer-rabbit__find{left:clamp(0px, calc(var(--rabbit-find-position) - 22px), calc(100% - 44px));width:44px;height:44px;color:inherit;cursor:pointer;touch-action:manipulation;background:0 0;border:0;padding:0;position:absolute;bottom:10px}.footer-rabbit__find:disabled,.footer-rabbit__find[aria-disabled=true]{cursor:default}.footer-rabbit__find:active:not([aria-disabled=true]) .footer-rabbit__tips{transform:scale(.97)}.footer-rabbit__tips{transform-origin:bottom;pointer-events:none;width:16px;height:19px;position:absolute;bottom:0;left:14px}.footer-rabbit__tip{display:none;position:absolute;bottom:0;right:0}.footer-rabbit__tip--carrot{width:13px;height:15px;right:1px}.footer-rabbit__tip--can{width:15px;height:8px}.footer-rabbit__tip--shovel{width:9px;height:18px;right:3px}[data-tip=carrot] .footer-rabbit__tip--carrot,[data-tip=can] .footer-rabbit__tip--can,[data-tip=shovel] .footer-rabbit__tip--shovel{display:block}.footer-rabbit__find-window{pointer-events:none;position:absolute;inset:0 0 10px;overflow:hidden}.footer-rabbit__found{left:clamp(0px, calc(var(--rabbit-find-position) - 8px), calc(100% - 17px));width:17px;height:20px;position:absolute;bottom:3px}.footer-rabbit__carrot,.footer-rabbit__can,.footer-rabbit__shovel{width:17px;height:18px;display:none}.footer-rabbit__shovel{height:20px}.footer-rabbit__heart{width:9px;height:8px;display:none;position:absolute;top:-13px;left:3px}.footer-rabbit__sadness{width:5px;height:7px;display:none;position:absolute;top:-11px;left:-9px}[data-result=carrot] .footer-rabbit__carrot,[data-result=can] .footer-rabbit__can,[data-result=shovel] .footer-rabbit__shovel,[data-state=result][data-result=carrot] .footer-rabbit__heart,[data-state=result][data-result=can] .footer-rabbit__sadness,[data-state=result][data-result=shovel] .footer-rabbit__sadness{display:block}.footer-rabbit__nojs{max-width:22rem;color:var(--muted-foreground);font-size:var(--font-size-sm);text-align:right;position:absolute;top:0;right:0}@media (prefers-reduced-motion:reduce){.footer-rabbit *{transition:none!important;animation:none!important}}@media (forced-colors:active){.footer-rabbit__ground{opacity:1;background:canvastext}.footer-rabbit__find{forced-color-adjust:none}}.footer-layer-stage{isolation:isolate;margin-top:var(--layout-section-space);background:var(--palette-canvas-dark);position:relative}:root[data-theme=dark] .footer-layer-stage{background:var(--palette-white)}.footer-layer-content{background:var(--background);color:var(--foreground);position:relative}.footer-layer-content .site-footer{margin-top:0}.footer-opposite-theme{color-scheme:dark;--background:var(--palette-canvas-dark);--foreground:var(--palette-text-dark);--brand-foreground:var(--palette-text-dark);--muted-foreground:var(--palette-gray-dark);--border:var(--palette-rule-dark);--border-media:var(--palette-rule-dark);--selection-background:#020059;--selection-foreground:#e9f6ff;--surface:var(--palette-surface-dark);--ring:var(--palette-gray-dark)}:root[data-theme=dark] .footer-opposite-theme{color-scheme:light;--background:var(--palette-white);--foreground:var(--palette-ink);--brand-foreground:var(--palette-logo);--muted-foreground:var(--palette-gray);--border:var(--palette-rule);--border-media:var(--palette-soft-rule);--selection-background:#e9f6ff;--selection-foreground:#0500aa;--surface:var(--palette-surface);--ring:var(--palette-focus)}.footer-opposite-theme::selection,.footer-opposite-theme ::selection{background:var(--selection-background);color:var(--selection-foreground)}.footer-opposite-theme :is(a,button,input,summary):focus-visible{outline-color:var(--ring)}.footer-opposite-theme :is(.privacy-button,.email-copy,input){border-color:var(--border-media);background:var(--background);color:var(--foreground)}.footer-opposite-theme .privacy-choice{border-color:var(--border);background:var(--background);color:var(--foreground)}.footer-opposite-theme .privacy-settings{border-color:var(--border)}.footer-contact-content{width:100%;max-width:var(--layout-prose-max);gap:var(--spacing-4);flex-direction:column;margin-inline:auto;display:flex}:root.footer-layer-active .page-shell{background:var(--palette-canvas-dark)}:root[data-theme=dark].footer-layer-active .page-shell{background:var(--palette-white)}:root.footer-layer-active :is(.site-header,main){z-index:2;background:var(--background);position:relative}:root.footer-layer-active main{border-radius:0 0 clamp(1.25rem,3vw,2.25rem) clamp(1.25rem,3vw,2.25rem);padding-bottom:clamp(5rem,8vw,8rem);box-shadow:0 18px 32px #0000001f}:root.footer-layer-active .footer-layer-stage{z-index:1;background:0 0}:root.footer-layer-active .footer-layer-content{z-index:1;will-change:clip-path;position:fixed;bottom:0;left:0;right:0;overflow:hidden}.contact-email{justify-items:start;position:relative}.contact-email .email-status{max-width:calc(100% - 3rem);color:var(--foreground);font:500 var(--font-size-lg)/1.3334 var(--font-heading);opacity:0;pointer-events:none;margin:0;position:absolute;inset-block-start:50%;inset-inline-start:0;transform:translateY(-50%)}.email-copy-address[data-copy-state]+.email-status{opacity:1}.email-copy-address[data-copy-state=success] .email-copy-value{visibility:hidden}.email-copy-address[data-copy-state=failure]+.email-status{max-width:100%;font:var(--font-size-sm)/1.5 var(--font-body);color:var(--muted-foreground);padding-top:.5rem;position:static;transform:none}.email-copy-address{border-radius:var(--control-radius);min-height:48px;box-shadow:none;color:var(--foreground);font:500 var(--font-size-lg)/1.3334 var(--font-heading);cursor:pointer;touch-action:manipulation;background:0 0;border:0;align-items:center;gap:.75rem;margin-left:-.8rem;padding:.7rem .8rem;transition:background-color .14s ease-out;display:inline-flex}.footer-opposite-theme .email-copy-address{box-shadow:none;background:0 0;border:0}.footer-opposite-theme .email-copy-address:is(:focus-visible,:active){background:var(--surface)}.email-copy-icon{fill:none;stroke:currentColor;stroke-linecap:round;stroke-linejoin:round;stroke-width:1.7px;flex:none;width:20px;height:20px}.email-copy-address .copy-check,.email-copy-address[data-copy-state=success] .copy-frames{display:none}.email-copy-address[data-copy-state=success] .copy-check{display:block}.gdynia-clock{min-width:0;color:var(--muted-foreground);font-family:var(--font-mono);align-items:baseline;display:inline-flex}.clock-line{color:inherit;font-size:inherit;line-height:inherit;white-space:nowrap;align-items:baseline;display:inline-flex}.clock-line time{font-variant-numeric:tabular-nums}.weather-details{vertical-align:baseline;margin-inline-start:8px;display:inline-block;position:relative}.site-footer--portfolio{padding-block-end:0}.footer-tail{flex-direction:column;gap:0;width:100%;display:flex}.site-footer--portfolio .footer-meta{align-items:baseline;gap:var(--spacing-2) var(--spacing-6);grid-template-columns:minmax(0,1fr) auto;display:grid}.footer-origin{color:var(--muted-foreground);font-family:var(--font-mono);font-variant-numeric:tabular-nums;white-space:nowrap;justify-self:end;align-items:baseline;display:inline-flex}.footer-origin__separator{margin-inline:.45em}.footer-utility{align-items:center;gap:var(--spacing-4);color:var(--muted-foreground);font:400 .75rem/1.25rem var(--font-mono);display:flex}.weather-details[hidden]{display:none}.clock-weather{color:inherit;cursor:pointer;touch-action:manipulation;align-items:center;margin:0;list-style:none;display:inline-flex;position:relative}.clock-weather:before{content:"";position:absolute;inset:-10px}.clock-weather::-webkit-details-marker{display:none}.clock-weather::marker{content:""}.weather-source{z-index:10;box-sizing:border-box;border:1px solid var(--border);background:var(--background);width:max-content;max-width:calc(100vw - 32px);color:var(--foreground);font-family:var(--font-sans);transform:translateX(var(--weather-popover-shift,0));white-space:normal;border-radius:8px;gap:4px;margin:0;padding:10px 12px;font-size:11px;line-height:18px;display:grid;position:absolute;inset-block-end:calc(100% + 8px);inset-inline-start:0;box-shadow:0 8px 20px #0000001f}.weather-source[hidden]{display:none}.weather-source a{min-height:44px;color:inherit;text-underline-offset:3px;touch-action:manipulation;align-items:center;display:inline-flex}@media (hover:hover) and (pointer:fine){.footer-opposite-theme .email-copy-address:hover{background:var(--surface);box-shadow:none;color:var(--foreground);border:0}.email-copy-address:hover .email-copy-value{text-underline-offset:.2em;text-decoration:underline}}@media (width<=680px){:root.footer-layer-active main{padding-bottom:4rem}.site-footer--portfolio .footer-meta{grid-template-columns:minmax(0,1fr)}.footer-origin{justify-self:start}}@media (width<=380px){.footer-origin{white-space:normal;flex-wrap:wrap;row-gap:2px;width:100%;max-width:100%}.footer-origin>:first-child{flex-basis:100%}.footer-origin__separator{display:none}}@media (prefers-reduced-motion:reduce){.email-copy-address{transition:none}}[data-footer-js] .contact-address-fallback{display:none}:root{--palette-white:#fff;--palette-ink:#09090b;--palette-gray:#525252;--palette-rule:#e4e4e7;--palette-surface:#f4f4f5;--palette-blue-wash:#239ae20a;--palette-red-wash:#d5233f0a;--palette-vermilion-wash:#d81e040a;--palette-teal-wash:#009b9d0a;--palette-soft-rule:#21201c14;--palette-focus:#005fcc;--palette-logo:#171717;--palette-canvas-dark:#0a0a0a;--palette-text-dark:#fafafa;--palette-gray-dark:#a3a3a3;--palette-surface-dark:#27272a;--palette-rule-dark:#ffffff1a;--palette-blue-wash-dark:#239ae21f;--palette-red-wash-dark:#d5233f1f;--palette-vermilion-wash-dark:#d81e041f;--palette-teal-wash-dark:#009b9d1f;--font-family-sans:"Geist", Arial, Helvetica, sans-serif;--font-family-mono:"IBM Plex Mono", "Courier New", monospace;--font-size-xs:.75rem;--font-size-sm:.875rem;--font-size-base:1rem;--font-size-lg:1.125rem;--font-size-xl:1.5rem;--font-size-2xl:2.5rem;--font-weight-normal:400;--font-weight-medium:500;--spacing-unit:.25rem;--spacing-1:var(--spacing-unit);--spacing-2:calc(var(--spacing-unit) * 2);--spacing-3:calc(var(--spacing-unit) * 3);--spacing-4:calc(var(--spacing-unit) * 4);--spacing-6:calc(var(--spacing-unit) * 6);--spacing-8:calc(var(--spacing-unit) * 8);--spacing-10:calc(var(--spacing-unit) * 10);--spacing-12:calc(var(--spacing-unit) * 12);--spacing-16:calc(var(--spacing-unit) * 16);--spacing-18:calc(var(--spacing-unit) * 18);--spacing-20:calc(var(--spacing-unit) * 20);--radius-sm:.25rem;--radius-md:.625rem;--radius-lg:1rem;color-scheme:light;--background:var(--palette-white);--foreground:var(--palette-ink);--brand-foreground:var(--palette-logo);--muted-foreground:var(--palette-gray);--border:var(--palette-rule);--ring:var(--palette-focus);--selection-background:#e9f6ff;--selection-foreground:#0500aa;--surface:var(--palette-surface);--surface-canpol:var(--palette-blue-wash);--surface-alerts:var(--palette-red-wash);--surface-bitelink:var(--palette-vermilion-wash);--surface-kcalmar:var(--palette-teal-wash);--border-media:var(--palette-soft-rule);--font-body:var(--font-family-mono);--font-heading:var(--font-family-sans);--type-body-size:var(--font-size-base);--type-body-leading:1.5;--type-heading-weight:var(--font-weight-medium);--type-display-size:var(--font-size-lg);--type-title-size:clamp(2rem, 5vw, 2.5rem);--type-lead-size:var(--font-size-base);--type-card-title-size:var(--font-size-lg);--type-label-size:var(--font-size-sm);--type-caption-size:var(--font-size-sm);--layout-content-max:60.25rem;--layout-prose-max:40.25rem;--layout-page-gutter:clamp(1rem, 4vw, 2rem);--layout-section-space:var(--spacing-18);--control-target-min:2.75rem;--control-radius:var(--radius-md);--font-sans:var(--font-heading);--font-mono:var(--font-body);--color-text:var(--foreground);--color-text-muted:var(--muted-foreground);--color-background:var(--background);--color-border:var(--border);--space-4:var(--spacing-1);--space-8:var(--spacing-2);--space-12:var(--spacing-3);--space-16:var(--spacing-4);--space-24:var(--spacing-6);--space-32:var(--spacing-8);--space-48:var(--spacing-12);--space-64:var(--spacing-16);--space-72:var(--spacing-18);--space-80:var(--spacing-20);--case-width-media:60.25rem;--case-width-prose:40.25rem;--case-gap-page:var(--space-72);--case-gap-page-mobile:3.5rem;--case-gap-opening:1.25rem;--case-gap-facts:1.25rem;--case-gap-fact:var(--space-8);--case-gap-section:var(--space-32);--case-gap-copy:var(--space-16);--case-gap-media:var(--space-12);--case-padding-start:var(--space-72);--case-padding-start-mobile:var(--space-48);--case-padding-end:var(--space-64);--case-navigation-padding:2.5rem;--case-radius-media:var(--radius-lg)}@media (width<=42.25rem){:root{--type-title-size:clamp(1.875rem, 9vw, 2.25rem)}}@media (prefers-color-scheme:dark){:root:not([data-theme=light]){color-scheme:dark;--background:var(--palette-canvas-dark);--foreground:var(--palette-text-dark);--brand-foreground:var(--palette-text-dark);--muted-foreground:var(--palette-gray-dark);--border:var(--palette-rule-dark);--border-media:var(--palette-rule-dark);--selection-background:#020059;--selection-foreground:#e9f6ff;--surface:var(--palette-surface-dark);--surface-canpol:var(--palette-blue-wash-dark);--surface-alerts:var(--palette-red-wash-dark);--surface-bitelink:var(--palette-vermilion-wash-dark);--surface-kcalmar:var(--palette-teal-wash-dark);--ring:var(--palette-gray-dark)}}:root[data-theme=dark]{color-scheme:dark;--background:var(--palette-canvas-dark);--foreground:var(--palette-text-dark);--brand-foreground:var(--palette-text-dark);--muted-foreground:var(--palette-gray-dark);--border:var(--palette-rule-dark);--border-media:var(--palette-rule-dark);--selection-background:#020059;--selection-foreground:#e9f6ff;--surface:var(--palette-surface-dark);--surface-canpol:var(--palette-blue-wash-dark);--surface-alerts:var(--palette-red-wash-dark);--surface-bitelink:var(--palette-vermilion-wash-dark);--surface-kcalmar:var(--palette-teal-wash-dark);--ring:var(--palette-gray-dark)}@font-face{font-family:Geist;src:url(/fonts/Geist-Regular.woff2)format("woff2");font-style:normal;font-weight:400;font-display:swap}@font-face{font-family:Geist;src:url(/fonts/Geist-Medium.woff2)format("woff2");font-style:normal;font-weight:500;font-display:swap}@font-face{font-family:IBM Plex Mono;src:url(/fonts/IBM-Plex-Mono-Regular.woff2)format("woff2");font-style:normal;font-weight:400;font-display:swap}@font-face{font-family:IBM Plex Mono;src:url(/fonts/IBM-Plex-Mono-SemiBold.woff2)format("woff2");font-style:normal;font-weight:600;font-display:swap}@media (prefers-reduced-motion:no-preference) and (scripting:enabled){@view-transition{navigation:auto}html:not([data-theme-transition]) .site-header{view-transition-name:page-header}html:not([data-theme-transition])::view-transition-group(root),html:not([data-theme-transition])::view-transition-group(page-header){animation:none}html:not([data-theme-transition])::view-transition-old(root),html:not([data-theme-transition])::view-transition-new(root){animation-duration:.18s;animation-timing-function:cubic-bezier(.25,.46,.45,.94)}html:not([data-theme-transition])::view-transition-old(page-header){display:none}html:not([data-theme-transition])::view-transition-new(page-header){mix-blend-mode:normal;animation:none}}*{box-sizing:border-box}:root::selection{color:var(--selection-foreground);background-color:var(--selection-background)}html{background:var(--background);scroll-behavior:auto}body{color:var(--foreground);font-family:var(--font-body);font-size:var(--type-body-size);line-height:var(--type-body-leading);-webkit-font-smoothing:antialiased;margin:0}h1,h2,h3,h4,p,figure{margin:0}h1,h2,h3,h4{color:var(--foreground);font-family:var(--font-heading);font-weight:var(--type-heading-weight)}h1{font-size:var(--type-display-size);line-height:1.3334}.page-heading{font-size:var(--type-title-size);letter-spacing:-.025em;text-wrap:balance;line-height:1.2}h2{font-size:var(--font-size-xl);line-height:1.3334}h3{font-size:var(--type-card-title-size);line-height:1.3334}p{color:var(--muted-foreground)}a{color:inherit;text-decoration:none}a:hover{text-underline-offset:.2em;text-decoration:underline}a:active{background:var(--surface)}img,picture{max-width:100%;display:block}img{height:auto}button,input,summary{font:inherit}button,a,summary{-webkit-tap-highlight-color:transparent}:focus-visible{outline:3px solid var(--ring);outline-offset:4px}[id]{scroll-margin-top:1.5rem}main:focus{outline:none}main,.page-shell{min-width:0}.site-header{border-bottom:1px solid var(--border)}.header-inner{width:min(calc(100% - var(--layout-page-gutter) * 2), var(--layout-content-max));align-items:center;gap:var(--spacing-3);min-height:4rem;margin-inline:auto;display:flex}.brand{min-width:var(--control-target-min);min-height:var(--control-target-min);border-radius:var(--control-radius);font-family:var(--font-heading);flex-shrink:0;justify-content:center;align-items:center;display:inline-flex}.brand-symbol{background-color:var(--brand-foreground);width:24px;height:24px;transform:scaleY(-1);mask-image:url(/_astro/home-17.B4P1J-sg.svg);mask-position:50%;mask-size:contain;mask-repeat:no-repeat}.primary-nav{align-items:center;gap:var(--spacing-1);display:flex}.primary-nav a,.cv-nav a,.language-list a{min-height:var(--control-target-min);border-radius:var(--control-radius);color:var(--muted-foreground);font:400 var(--font-size-sm)/1.4286 var(--font-heading);align-items:center;padding-inline:.625rem;display:inline-flex}.primary-nav a{white-space:nowrap}.primary-nav a:first-child{color:var(--foreground)}.header-actions{align-items:center;gap:var(--spacing-2);flex-wrap:wrap;margin-left:auto;display:flex}.cv-nav{gap:var(--spacing-2);flex-wrap:wrap;display:flex}.language-list{margin:0;padding:0;list-style:none;display:flex}.language-list a{min-width:var(--control-target-min);justify-content:center}.language-list a[aria-current=page]{color:var(--foreground);text-underline-offset:.2em;text-decoration:underline}.text-link,.primary-action{align-items:center;gap:var(--spacing-2);min-height:var(--control-target-min);min-width:var(--control-target-min);border-radius:var(--control-radius);font:500 var(--font-size-sm)/1.4286 var(--font-heading);display:inline-flex}.lede{font-size:var(--type-lead-size)}.skip-link{z-index:20;top:.5rem;left:var(--layout-page-gutter);background:var(--background);padding:.75rem 1rem;position:absolute;transform:translateY(-200%)}.skip-link:focus{transform:translateY(0)}.sr-only{clip-path:inset(50%);white-space:nowrap;border:0;width:1px;height:1px;margin:-1px;padding:0;position:absolute;overflow:hidden}.site-footer{width:min(calc(100% - var(--layout-page-gutter) * 2), var(--layout-content-max));margin:var(--layout-section-space) auto 0;padding-block:var(--spacing-16);gap:var(--spacing-4);flex-direction:column;display:flex}.site-footer h2,.contact-address{font:500 var(--font-size-lg)/1.3334 var(--font-heading);color:var(--foreground)}.contact-copy{max-width:var(--layout-prose-max)}.contact-address{overflow-wrap:anywhere;user-select:all}.social-links{gap:var(--spacing-6);flex-wrap:wrap;display:flex}.footer-meta{justify-content:space-between;gap:var(--spacing-4);color:var(--muted-foreground);font-size:var(--font-size-sm);flex-wrap:wrap;display:flex}.error-page,.article-page,.generic-home{max-width:var(--layout-prose-max);margin:var(--layout-section-space) auto;gap:var(--spacing-6);flex-direction:column;display:flex}.error-page h1,.article-page h1{font-size:var(--type-title-size)}.article-header,.prose{gap:var(--spacing-6);flex-direction:column;display:flex}.article-list{padding-left:1.5rem}.article-card{padding-block:var(--spacing-6)}.article-card h3 a{min-height:var(--control-target-min);align-items:center;display:inline-flex}.article-index{display:none}.article-image{width:100%}@media (width<=1106px){.error-page,.article-page,.generic-home{width:calc(100% - var(--layout-page-gutter) * 2)}}@media (width<=800px){.header-inner{column-gap:var(--spacing-2);padding-block:var(--spacing-2);flex-wrap:wrap;row-gap:0}.primary-nav{flex-wrap:wrap;flex:1;column-gap:0}.primary-nav a{padding-inline:.5rem}.header-actions{justify-content:space-between;width:100%;margin-left:0}}@media (width<=680px){:root{--layout-section-space:var(--spacing-12)}.site-footer{padding-block:var(--spacing-8) var(--spacing-12)}}@media (forced-colors:active){:root::selection{color:highlighttext;background-color:highlight}.brand-symbol{forced-color-adjust:none;background-color:linktext}}.project-card{isolation:isolate;transform-origin:50%;transition:transform .2s ease-out;position:relative;overflow:visible}.project-card:after{z-index:0;border:1px solid var(--border-media);border-radius:calc(var(--radius-lg) + 6px);background:var(--surface);box-shadow:none;content:"";pointer-events:none;opacity:0;transition:opacity .2s ease-out;position:absolute;inset:-.5rem}.project-card-link{z-index:1;position:relative}.project-card-link:focus-visible{outline:3px solid var(--ring);outline-offset:4px}.project-card:has(.project-card-link:focus-visible):after{opacity:1}@media (hover:hover) and (pointer:fine){.project-card:has(.project-card-link:hover),.project-card:has(.project-card-link:focus-visible){transform:rotate(.5deg)}.project-card:has(.project-card-link:hover):after,.project-card:has(.project-card-link:focus-visible):after{opacity:1}.project-card-link:hover .project-card-cta,.project-card-link:focus-visible .project-card-cta{color:var(--foreground);text-underline-offset:.2em;text-decoration:underline}}@media (prefers-reduced-motion:reduce),(hover:none),(pointer:coarse){.project-card{transition:none;transform:none!important}.project-card:after{transition:none}}:root{--inline-link-foreground:#0500aa;--inline-link-focus-background:#e9f6ff}:root[data-theme=dark]{--inline-link-foreground:#e9f6ff;--inline-link-focus-background:#020059}@media (prefers-color-scheme:dark){:root:not([data-theme=light]){--inline-link-foreground:#e9f6ff;--inline-link-focus-background:#020059}}:is(.inline-text-link,.case-copy a,.bio a,.article-content a){color:inherit;text-underline-offset:.2em;text-decoration-line:underline;text-decoration-thickness:.08em;transition:color .14s ease-out,background-color .14s ease-out}@media (hover:hover) and (pointer:fine){:is(.inline-text-link,.case-copy a,.bio a,.article-content a):hover{color:var(--inline-link-foreground)}}:is(.inline-text-link,.case-copy a,.bio a,.article-content a):focus-visible{color:var(--inline-link-foreground);background-color:var(--inline-link-focus-background);outline:2px solid var(--inline-link-foreground);outline-offset:3px}@media (prefers-reduced-motion:reduce){:is(.inline-text-link,.case-copy a,.bio a,.article-content a){transition:none}}@media (forced-colors:active){:is(.inline-text-link,.case-copy a,.bio a,.article-content a):focus-visible{outline-color:linktext}}
