:root{--slice-gap: 2rem;--slice-bg: var(--r4-yellow);--slice-skew: 2deg;--slice-safe-bottom: 2rem}#content-stack{display:flex;flex-direction:column;gap:var(--slice-gap)}.content-slice{position:relative;z-index:0;overflow:visible;background:var(--slice-bg);transform:skewY(var(--slice-skew));transform-origin:top left;padding:2rem}.content-slice>.slice-content{position:relative;z-index:1;width:100%;box-sizing:border-box;display:flex;flex-direction:column;align-items:center;transform:skewY(calc(-1 * var(--slice-skew)));padding-block-end:var(--slice-safe-bottom)}@media (max-width: 600px){#content-stack{gap:1rem}}.github-profile-panel{display:grid;grid-template-columns:auto 1fr;gap:clamp(.75rem,1.2vw,1rem);padding:clamp(.75rem,1.2vw,1rem);border-radius:12px;align-items:center}.github-profile-panel .gh-avatar{width:clamp(64px,8vw,96px);height:clamp(64px,8vw,96px);border-radius:50%;object-fit:cover;border:2px solid rgba(0,0,0,.15)}.github-profile-panel .gh-main{min-width:0}.github-profile-panel .gh-name{margin:0 0 .25rem;font-size:clamp(1.25rem,2vw,1.6rem)}.github-profile-panel .gh-name a{color:inherit;text-decoration:none}.github-profile-panel .gh-name a:hover{text-decoration:underline}.github-profile-panel .gh-bio{margin:.25rem 0 .5rem}.github-profile-panel .gh-meta{display:flex;flex-wrap:wrap;gap:.75rem 1rem;margin:0 0 .75rem;padding:0;list-style:none;font-size:.95rem}.github-profile-panel .gh-actions{display:flex;gap:.5rem;flex-wrap:wrap}.github-profile-panel .btn{display:inline-flex;align-items:center;gap:.4rem;text-decoration:none;color:#fff;border:2px solid currentColor;background:var(--header-colour);padding:.45rem .9rem;border-radius:8px;font-weight:600;transition:background-color .2s,color .2s,box-shadow .2s}.github-profile-panel .btn:hover{background:var(--r4-yellow);color:#0d1b3d;box-shadow:0 2px 6px #00000040}.github-profile-panel .btn--ghost{background:transparent;color:var(--header-colour);border-color:var(--header-colour)}.github-profile-panel .btn--ghost:hover{background:var(--r4-yellow);color:#0d1b3d}@media (max-width: 560px){.github-profile-panel{grid-template-columns:1fr}}.contact-overlay{position:fixed;inset:0;background:color-mix(in oklab,var(--header-colour) 15%,transparent);display:grid;place-items:center;z-index:9999;overflow:auto;padding:clamp(12px,2vw,24px);padding-block:max(12px,env(safe-area-inset-top)) max(12px,env(safe-area-inset-bottom))}.contact-panel{width:min(680px,96svw);max-height:min(88dvh,720px);overflow:auto;-webkit-overflow-scrolling:touch;background:var(--r4-yellow);color:var(--text-color, #0d1b3d);border-radius:12px;box-shadow:0 12px 40px #00000059}@media (max-width: 480px){.contact-panel{border-radius:10px}}.contact-header{display:flex;align-items:center;justify-content:space-between;padding:.9rem 1rem;border-bottom:1px solid rgba(0,0,0,.12)}.contact-header h2{margin:0;font-size:1.25rem}.contact-close{appearance:none;background:transparent;border:0;font-size:1.5rem;line-height:1;cursor:pointer;color:currentColor;padding:.25rem .5rem;border-radius:8px}.contact-close:hover{background:#0000000f}.contact-form{display:grid;gap:.75rem;padding:1rem}.contact-form label{display:grid;gap:.4rem;font-weight:600}.contact-form input,.contact-form textarea{width:100%;border:2px solid color-mix(in oklab,#000 12%,transparent);border-radius:8px;padding:.6rem .7rem;font:inherit;color:inherit;background:#fff9}.contact-form input:focus,.contact-form textarea:focus{outline:3px solid #fff;outline-offset:2px}.contact-actions{display:flex;gap:.5rem;padding-top:.25rem}.contact-hint{margin:.25rem 0 0;font-size:.85rem;opacity:.7}.App{display:flex;flex-direction:column}.App>main{flex:1 1 auto;width:min(100% - 2rem,var(--max-w));margin-inline:auto;padding-block:var(--space-6)}#app-container{min-height:100vh;width:100vw;display:flex;flex-direction:column;position:relative;z-index:1}#site-bg{position:fixed;inset:0;z-index:0;pointer-events:none;overflow:visible}@media (prefers-reduced-motion: reduce){#site-bg{display:none}}header,#app-shell{position:relative}#app-shell{flex:1;padding:2rem;max-width:min(80%,100%);width:100%;margin:0 auto clamp(2rem,5vw,5rem) auto;box-sizing:border-box;z-index:2}header{position:relative;padding:2rem;background:transparent;display:flex;align-items:center;gap:1rem;flex-wrap:nowrap;z-index:1000}.header-cutout{position:absolute;inset:0;width:100%;height:100%;display:block;pointer-events:none;z-index:2}.header-cutout__text{font-family:Audiowide,sans-serif;font-weight:400;font-size:10vh;letter-spacing:.06em}@media (max-width: 1900px){header .logo,.header-cutout__text{font-size:clamp(3rem,9vw,7rem)}}#logo-container{flex:0 0 auto}header .logo{font-family:Audiowide,sans-serif;font-weight:400;font-size:15rem;line-height:1;white-space:nowrap;letter-spacing:.06em;color:transparent;text-decoration:none;display:inline-block}#nav-container{margin-left:auto;display:flex;gap:1rem;flex:0 0 auto;z-index:1100}#navBar{display:flex;gap:.75rem;align-items:center}@property --hex-bob{syntax: "<length>"; inherits: false; initial-value: 0px;}@keyframes hex-bob-var{0%,to{--hex-bob: 0px}50%{--hex-bob: -6px}}#navBar .sidebar-nav__link,#navBar .navBar__link{--hex-size: clamp(3rem, 6vw, 5rem);--hex-height: calc(var(--hex-size) / 1.1547);--hex-offset: 0px;--hex-scale: 1;width:var(--hex-size);aspect-ratio:1.1547;clip-path:polygon(25% 0,75% 0,100% 50%,75% 100%,25% 100%,0 50%);display:grid;place-items:center;background:var(--hex-bg, hsl(223 40% 12%));color:var(--hex-fg, #fff);border:none;text-decoration:none;transition:background .2s ease,color .2s ease,transform .15s ease,filter .2s ease;transform:translateY(calc(var(--hex-offset) + var(--hex-bob))) scale(var(--hex-scale))}#navBar>*{--hex-offset: 0px}#navBar .sidebar-nav__link:hover,#navBar .navBar__link:hover{background:var(--hex-bg-hover, hsl(223 50% 18%));animation:hex-bob-var 1.4s ease-in-out infinite;filter:drop-shadow(0 2px 6px rgba(0,0,0,.25))}@keyframes nav-icon-wiggle{0%,to{transform:rotate(0) scale(1)}25%{transform:rotate(8deg) scale(1.02)}50%{transform:rotate(0) scale(1)}75%{transform:rotate(-8deg) scale(1.02)}}#navBar svg{width:56%;height:56%;transform-origin:50% 50%;transform-box:fill-box;transform:rotate(0) scale(1);will-change:transform;animation:none}#navBar .sidebar-nav__link:is(:hover,:focus-visible) svg,#navBar .navBar__link:is(:hover,:focus-visible) svg{animation:nav-icon-wiggle 1.1s ease-in-out infinite}@media (prefers-reduced-motion: reduce),(hover: none){#navBar .sidebar-nav__link svg,#navBar .navBar__link svg{animation:none!important}}@media (min-width: 769px) and (max-width: 1050px){header{padding:1.25rem}#navBar .sidebar-nav__link,#navBar .navBar__link{--hex-size: clamp(3.75rem, 7vw, 5.75rem);transform:translateY(calc(var(--hex-offset) + var(--hex-bob))) scale(var(--hex-scale))}}@media (min-width: 1400px){#navBar>*:nth-child(2n){--hex-offset: calc(var(--hex-height) / 2)}}@media (max-width: 768px){#nav-container{position:absolute;right:.75rem;top:.75rem;z-index:1100}#navBar{flex-direction:column;align-items:flex-end;gap:.6rem}#navBar .sidebar-nav__link,#navBar .navBar__link{--hex-size: clamp(3rem, 14vw, 4.25rem);--hex-offset: 0;transform:translateY(calc(var(--hex-offset) + var(--hex-bob))) scale(var(--hex-scale))}}@media (max-width: 1050px){#app-shell{margin:0;padding:1rem;max-width:100%}#logo-container,#nav-container{flex:0 0 auto;width:100%}}@media (min-width: 1051px){header{flex-direction:row;align-items:center}#logo-container{flex:2 1 0%}#nav-container{flex:1 1 0%;margin-left:auto;justify-content:flex-end;min-width:max-content}}@media (max-width: 1900px){#navBar .sidebar-nav__link,#navBar .navBar__link{--hex-size: clamp(5rem, 6.5vw, 8rem)}}@media (min-width: 1901px){.header-cutout__text{font-size:9rem}}@media (min-width: 1051px){header{flex-direction:row;align-items:center}#logo-container{flex:1 1 auto;min-width:0}#nav-container{flex:0 1 auto;margin-left:auto;justify-content:flex-end;min-width:max-content}}@media (max-width: 600px){header{padding:1rem;gap:.75rem}header .logo{font-size:clamp(3rem,14vw,6rem);letter-spacing:.04em}#navBar{gap:.5rem}#navBar .sidebar-nav__link,#navBar .navBar__link{--hex-size: clamp(3rem, 18vw, 5rem)}}@media (max-width: 1050px) and (min-width: 769px){header{padding:1.25rem}#logo-container{flex:1 1 auto;min-width:0}#nav-container{flex:0 0 auto;margin-left:auto;width:auto}#navBar>*{--hex-offset: 0 !important}#navBar .sidebar-nav__link,#navBar .navBar__link{--hex-size: clamp(3.75rem, 7.5vw, 5.25rem);transform:translateY(calc(var(--hex-offset) + var(--hex-bob))) scale(var(--hex-scale))}}@media (hover: none){#navBar .sidebar-nav__link:hover,#navBar .navBar__link:hover{animation:none}}@media (max-width: 768px){header{padding:1rem}#nav-container{position:fixed;top:.75rem;right:.75rem;left:auto;width:max-content;margin:0;display:block;z-index:1100}#navBar{flex-direction:column;align-items:flex-end;gap:.6rem;width:max-content}#navBar>*{align-self:flex-end;--hex-offset: 0 !important}#navBar .sidebar-nav__link,#navBar .navBar__link{--hex-size: clamp(3rem, 14vw, 4.25rem);transform:translateY(calc(var(--hex-offset) + var(--hex-bob))) scale(var(--hex-scale))}}@media (min-width: 769px){#navBar>*:nth-child(2n){--hex-offset: calc(var(--hex-height) / 2) !important}}@media (max-width: 1050px) and (min-width: 769px){header{padding:1.25rem}#logo-container{flex:1 1 auto;min-width:0}#nav-container{flex:0 0 auto;margin-left:auto;width:auto}}@media (min-width: 1051px){#navBar .sidebar-nav__link,#navBar .navBar__link{--hex-size: clamp(5rem, 6.5vw, 8rem)}}@media (max-width: 420px){#nav-container{right:.5rem;top:.5rem}}.left-rectangle{position:absolute;top:var(--header-h);bottom:0;left:0;width:20vw;background:var(--r4-yellow);clip-path:polygon(0 0,calc(100% - 5vh) 0,100% 100%,0 100%);-webkit-clip-path:polygon(0 0,calc(100% - 5vh) 0,100% 100%,0 100%);z-index:1;pointer-events:none}footer{background-color:var(--header-colour);height:clamp(2rem,5rem,5rem);display:flex;align-items:center;justify-content:center;margin-top:auto;z-index:2;gap:1rem}footer p,a{margin:0;color:#fff;text-align:center}.back-link{--hex-w: clamp(5.5rem, 22vw, 8rem);--hex-stroke-w: 3px;--hex-fill: var(--header-colour);--hex-stroke: currentColor;position:relative;display:inline-grid;place-items:center;width:var(--hex-w);aspect-ratio:1.5;text-decoration:none;font-weight:600;color:#fff;border:0;isolation:isolate;transition:filter .2s,transform .15s,color .2s}.back-link:before,.back-link:after{content:"";position:absolute;inset:0;clip-path:polygon(25% 0,75% 0,100% 50%,75% 100%,25% 100%,0 50%);z-index:-1}.back-link:before{background:var(--hex-stroke)}.back-link:after{background:var(--hex-fill);inset:var(--hex-stroke-w)}.back-link:hover{--hex-fill: var(--r4-yellow);color:#0d1b3d;filter:drop-shadow(0 2px 6px rgba(0,0,0,.25))}.back-link:focus-visible{outline:3px solid #fff;outline-offset:3px}.back-link:active{transform:translateY(1px) scale(.99)}.filter-panel,.filter-panel.filter-panel--desktop{align-self:start;border-radius:12px;padding:1rem;background:color-mix(in oklab,var(--header-colour) 8%,transparent);border:1px solid color-mix(in oklab,var(--header-colour) 25%,transparent);box-shadow:0 6px 18px #0000001f;-webkit-backdrop-filter:blur(3px);backdrop-filter:blur(3px);width:100%;max-width:320px;box-sizing:border-box}.projects-filters{position:sticky;top:1rem;display:grid;gap:1rem}.filters,.projects-filters{gap:1rem}.filters__title{font-size:1.05rem;font-weight:600;margin:.5rem 0 .25rem}.filters__group{padding:.75rem;margin-top:.5rem;border-radius:10px;background:color-mix(in oklab,var(--header-colour) 6%,transparent);border:1px solid color-mix(in oklab,var(--header-colour) 18%,transparent)}.filters__label{display:block;font-size:.9rem;font-weight:600;margin-bottom:.5rem;opacity:.9}.filters__hint{font-size:.8rem;opacity:.7;margin:.25rem 0 .5rem}.filters__list{display:grid;grid-template-columns:1fr;gap:.5rem;list-style:none;padding:0}.filters__check{display:flex;align-items:center;gap:.5rem;font-size:.95rem}.filters input[type=checkbox],.projects-filters input[type=checkbox]{accent-color:var(--r4-yellow)}.filters__chips,.filters__row{display:flex;flex-wrap:wrap;gap:.5rem}.filters__chip{padding:.35rem .6rem;border-radius:999px;background:color-mix(in oklab,var(--header-colour) 10%,transparent);border:1px solid color-mix(in oklab,var(--header-colour) 25%,transparent);font-size:.85rem;cursor:pointer;-webkit-user-select:none;user-select:none;transition:transform .12s ease,background .12s ease}.filters__chip:hover{transform:translateY(-2px)}.filters__reset{margin-top:.5rem}.filters__check.hex-check,.hex-check{display:flex;align-items:center;gap:.5rem;cursor:pointer}.hex-check input[type=checkbox]{--hex-size: 28px;appearance:none;-webkit-appearance:none;inline-size:var(--hex-size, 24px);block-size:var(--hex-size, 24px);background:color-mix(in oklab,var(--header-colour) 6%,transparent);clip-path:polygon(25% 5%,75% 5%,100% 50%,75% 95%,25% 95%,0% 50%);display:grid;place-items:center;transition:background .15s ease,border-color .15s ease,box-shadow .2s ease}.hex-check input[type=checkbox]:after{content:"";inline-size:60%;block-size:60%;background:currentColor;clip-path:polygon(14% 54%,0% 68%,38% 100%,100% 20%,86% 6%,38% 70%);transform:scale(0);transform-origin:center;transition:transform .12s ease;color:#111}.hex-check input[type=checkbox]:hover{filter:brightness(1.05)}.hex-check input[type=checkbox]:focus-visible{outline:none;box-shadow:0 0 0 3px color-mix(in oklab,var(--r4-yellow) 45%,transparent)}.hex-check input[type=checkbox]:checked{background:var(--r4-yellow);border-color:var(--r4-yellow)}.hex-check input[type=checkbox]:checked:after{transform:scale(1)}.hex-check input[type=checkbox]:disabled{opacity:.55;cursor:not-allowed}@media (max-width: 600px){.hex-check input[type=checkbox]{--hex-size: 28px}}@media (max-width: 1050px){.projects-filters{display:flex;flex-direction:row;flex-wrap:wrap;align-items:center;gap:.5rem .75rem;width:100%}}.projects-grid{--card-h: clamp(180px, 20vw, 340px);--card-pad: clamp(.6rem, .5vw + .35rem, .9rem)}@media (max-width: 600px){.projects-grid{--card-h: clamp(150px, 26vw, 260px);--card-pad: clamp(.5rem, 1vw, .75rem)}}@media (max-width: 380px){.projects-grid{--card-h: clamp(135px, 28vw, 220px);--card-pad: .5rem}}.projects-grid .project-slide,.projects-grid .project-slide.project-slide--grid{width:100%!important;max-width:100%!important;height:var(--card-h)!important;padding:var(--card-pad);box-sizing:border-box;border-radius:12px;background:color-mix(in oklab,var(--header-colour) 10%,transparent);border:1px solid color-mix(in oklab,var(--header-colour) 25%,transparent);overflow:hidden}.projects-grid .project-slide img,.projects-grid .project-slide video,.projects-grid .project-slide svg{max-width:100%;height:auto;display:block}.projects-grid .project-slide,.projects-grid .project-slide *{min-width:0;max-width:100%;overflow-wrap:anywhere;word-break:break-word}.project-slide__title{font-size:var(--fs-700);line-height:1.15;margin:0 0 .35rem}.project-slide__desc{font-size:var(--fs-400);line-height:1.4}.project-slide__meta,.project-slide__tags{font-size:var(--fs-300);line-height:1.35}.keen-slider:not([data-keen-slider-disabled]){-webkit-touch-callout:none;-webkit-tap-highlight-color:transparent;align-content:flex-start;display:flex;overflow:hidden;position:relative;touch-action:pan-y;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;-khtml-user-select:none;width:100%}.keen-slider:not([data-keen-slider-disabled]) .keen-slider__slide{min-height:100%;overflow:hidden;position:relative;width:100%}.keen-slider:not([data-keen-slider-disabled])[data-keen-slider-reverse]{flex-direction:row-reverse}.keen-slider:not([data-keen-slider-disabled])[data-keen-slider-v]{flex-wrap:wrap}.swiper-slide,.keen-slider__slide{display:grid;place-items:center;--card-h: clamp(280px, 90vw, 380px)}.swiper:not(.swiper-vertical) .swiper-slide{width:var(--card-w)!important;height:auto!important}.swiper.swiper-vertical .swiper-slide{height:var(--card-h)!important;width:auto!important}.keen-slider__slide{width:var(--card-w)!important;height:var(--card-h)!important}.project-slide.project-slide--carousel{width:100%!important;height:100%!important;box-sizing:border-box;overflow:hidden}:root{--carousel-max-width: 500px;--carousel-height: 20vh;--card-w: min(92vw, 460px);--card-h: clamp(300px, 56vh, 560px)}.scene{position:relative;width:100%;max-width:var(--carousel-max-width);height:var(--carousel-height);margin:0 auto;perspective:1000px;--carousel-height: clamp(240px, 40vh, 400px)}.scene{--carousel-height: clamp(220px, 36vh, 400px);--carousel-face-h: 60%;height:var(--carousel-height);position:relative}.scene .carousel.keen-slider{position:absolute;inset:0;width:100%;height:100%;overflow:visible;transform-style:preserve-3d}.carousel.keen-slider>.keen-slider__slide.carousel__cell{position:absolute;top:50%;left:50%;width:100%!important;height:var(--carousel-face-h)!important;transform-origin:50% 50%;backface-visibility:hidden;display:flex;align-items:center;justify-content:center;will-change:transform}.scene .carousel.keen-slider{height:100%;transform-style:preserve-3d}.carousel__card{width:100%;height:100%;max-width:min(92%,420px);display:flex;flex-direction:column;justify-content:center;border-radius:12px;overflow:hidden}@media (max-width: 900px){.scene{--carousel-height: clamp(200px, 34vh, 420px);--carousel-face-h: 56%}.carousel__card{max-width:min(94%,360px)}}@media (max-width: 600px){.scene{--carousel-height: clamp(180px, 38vh, 360px);--carousel-face-h: 50%}.carousel__card{max-width:min(96%,320px)}}@media (max-width: 380px){.scene{--carousel-height: clamp(160px, 42vh, 320px);--carousel-face-h: 46%}.carousel__card{max-width:min(98%,290px)}}@media (pointer: coarse){.scene{--carousel-height: clamp(140px, 28dvh, 300px);--carousel-face-h: 46%}.carousel__card{max-width:min(96%,300px)}}@media (max-width: 600px){.scene{--carousel-height: clamp(140px, 30dvh, 300px);--carousel-face-h: 46%}}@media (max-width: 380px){.scene{--carousel-height: clamp(120px, 28dvh, 260px);--carousel-face-h: 44%}}.scene{margin-block:.5rem 1rem}.project-slide.project-slide--carousel:hover{animation:hex-bob 1.4s ease-in-out infinite}.carousel{--slide-h: clamp(220px, 50vh, 520px)}.carousel__viewport{overflow:hidden}.carousel__track{display:grid;grid-auto-flow:column;grid-auto-columns:100%;gap:var(--space-3);align-items:center}.carousel__slide{position:relative}.carousel__slide img,.carousel__slide picture{width:100%;height:var(--slide-h);object-fit:cover}.carousel__nav{display:flex;justify-content:center;gap:var(--space-3);margin-top:var(--space-3)}.carousel__button{inline-size:clamp(36px,4vw,48px);block-size:clamp(36px,4vw,48px)}.carousel.keen-slider>.keen-slider__slide.carousel__cell{width:100%!important;height:var(--carousel-face-h)!important}.project-slide.project-slide--carousel{overflow:hidden}.project-slide.project-slide--carousel,.project-slide.project-slide--carousel *{min-width:0;max-width:100%;overflow-wrap:anywhere;word-break:break-word}.project-slide.project-slide--carousel .project-slide__title{font-size:var(--fs-600);line-height:1.2;margin:0 0 .35rem;display:-webkit-box;-webkit-box-orient:vertical;-webkit-line-clamp:2;line-clamp:2;overflow:hidden}.project-slide.project-slide--carousel .project-slide__desc{font-size:var(--fs-300);line-height:1.35;display:-webkit-box;-webkit-box-orient:vertical;-webkit-line-clamp:3;line-clamp:3;overflow:hidden}.project-slide.project-slide--carousel .project-slide__meta,.project-slide.project-slide--carousel .project-slide__tags{font-size:calc(var(--fs-300) * .95);line-height:1.3}@media (max-width: 600px){.project-slide.project-slide--carousel{padding:.75rem;font-size:.88em}.project-slide.project-slide--carousel .project-slide__title{-webkit-line-clamp:2;line-clamp:2}.project-slide.project-slide--carousel .project-slide__desc{-webkit-line-clamp:3;line-clamp:3}}@media (prefers-reduced-motion: reduce){.project-slide.project-slide--carousel:hover{animation:none}}@media (pointer: coarse){.carousel{touch-action:pan-y;-ms-touch-action:pan-y}}#intro-slice,#projects-slice{background:var(--r4-yellow)}#headshot-slice{height:30vh;display:flex;justify-content:flex-end;padding-right:20vw;align-items:center;margin:4rem 0 2rem;padding-bottom:2rem}#headshot-circle{--ring-color: var(--header-colour);--ring-speed: 18s;--ring-outset: 15%;--ring-font-size: 9px;position:relative;width:clamp(140px,18vh,240px);aspect-ratio:1;border-radius:50%;overflow:visible;background:transparent;box-shadow:0 6px 18px #00000026}#headshot-circle>img{width:100%;height:100%;object-fit:cover;display:block;border-radius:50%}#headshot-circle:before{content:"";position:absolute;inset:0;border-radius:50%;box-shadow:0 0 0 6px #fff;pointer-events:none;z-index:0}#headshot-circle .headshot-ring{position:absolute;inset:calc(-1 * var(--ring-outset));width:calc(100% + 2 * var(--ring-outset));height:calc(100% + 2 * var(--ring-outset));pointer-events:none;color:var(--ring-color);animation:headshot-spin var(--ring-speed) linear infinite;z-index:1;overflow:visible}#headshot-circle .headshot-ring text{fill:currentColor;font:600 var(--ring-font-size)/1 "Space Grotesk",system-ui,sans-serif;letter-spacing:.08em;text-transform:uppercase;paint-order:stroke fill;stroke:#fff;stroke-width:.6px;text-shadow:0 1px 2px rgba(0,0,0,.25)}@media (prefers-reduced-motion: reduce){#headshot-circle .headshot-ring{animation:none}}@keyframes headshot-spin{to{transform:rotate(360deg)}}#intro-slice{height:clamp(auto,40vh,500px);display:flex;flex-direction:column;justify-content:center}#projects-slice>div{display:flex;justify-content:space-between;flex-direction:row;align-items:center;gap:2rem;margin-top:2.5rem}#projects-slice #project-previews,#this-project{flex:1}#project-previews{flex:0 0 50%;width:500px;min-width:0}#this-project{flex:0 0 50%;max-width:85%;min-width:0;padding:0 2rem 0 0}.home_link_button{display:inline-flex;align-items:center;gap:.4rem;text-decoration:none;color:#fff;border:2px solid currentColor;background:var(--header-colour);padding:.5rem 1rem;border-radius:8px;font-weight:600;cursor:pointer;transition:background-color .2s,color .2s,box-shadow .2s,transform .15s}.home_link_button:hover{background:var(--r4-yellow);color:#0d1b3d;box-shadow:0 2px 6px #00000040}.home_link_button:focus-visible{outline:3px solid #fff;outline-offset:2px}.hero{padding-block:var(--space-6)}.hero__content{display:grid;gap:var(--space-4);align-items:start}@media (min-width: 768px){.hero__content{grid-template-columns:1.2fr 1fr}}.hero__title{margin:0 0 var(--space-3)}.hero__cta{display:flex;flex-wrap:wrap;gap:var(--space-3)}#projects-slice{--slice-safe-bottom: clamp(48px, 6vh, 96px)}@media (max-width:1200px){#projects-slice>div{flex-direction:column;padding:2rem 0}#this-project{margin-top:2rem}}:root{--card-w: min(92vw, 460px);--card-h: clamp(300px, 56vh, 560px);--card-pad: clamp(.75rem, 1vw, 1.1rem);--grid-card-min-h: clamp(220px, 24vw, 360px);--grid-card-max-h: clamp(260px, 30vw, 420px)}.project-slide{width:100%;padding:var(--card-pad);box-sizing:border-box;border-radius:12px;background:color-mix(in oklab,var(--header-colour) 10%,transparent);border:1px solid color-mix(in oklab,var(--header-colour) 25%,transparent);-webkit-backdrop-filter:blur(3px);backdrop-filter:blur(3px);color:#000;display:flex;flex-direction:column;overflow:hidden;font-family:inherit}.project-slide.project-slide--grid{min-height:var(--grid-card-min-h);height:auto;max-height:var(--grid-card-max-h)}.project-slide.project-slide--carousel{width:100%;height:100%}.project-slide__header{margin:.5rem;padding:0;flex-shrink:0}.project-slide__title{font-size:var(--fs-600);line-height:1.2;margin:0 0 .35rem;display:-webkit-box;-webkit-box-orient:vertical;-webkit-line-clamp:2;line-clamp:2;overflow:hidden;font-family:inherit}.project-slide__desc{font-size:var(--fs-400);line-height:1.35;display:-webkit-box;-webkit-box-orient:vertical;-webkit-line-clamp:3;line-clamp:3;overflow:hidden;font-family:inherit}.project-slide__meta,.project-slide__tags{font-size:calc(var(--fs-300) * .95);line-height:1.3;font-family:inherit}.project-slide__actions{margin-top:auto;display:flex;gap:.5rem;flex-wrap:wrap;background:none;margin-bottom:1.5rem}.project-slide__actions a,.project-slide__actions button,.project-slide footer a,.project-slide footer button{display:inline-flex;align-items:center;gap:.4rem;text-decoration:none;color:#fff;border:2px solid currentColor;background:var(--header-colour);padding:.5rem 1rem;border-radius:8px;font-weight:600;cursor:pointer;transition:background-color .2s,color .2s,box-shadow .2s,transform .15s}.project-slide__actions a:hover,.project-slide__actions button:hover,.project-slide footer a:hover,.project-slide footer button:hover{background:var(--r4-yellow);color:#0d1b3d;box-shadow:0 2px 6px #00000040}.project-slide__actions a:focus-visible,.project-slide__actions button:focus-visible,.project-slide footer a:focus-visible,.project-slide footer button:focus-visible{outline:3px solid #fff;outline-offset:2px}@media (max-width: 600px){:root{--grid-card-min-h: clamp(200px, 36vh, 370px);--grid-card-max-h: clamp(240px, 42vh, 380px)}}:root{--card-w: clamp(280px, 90vw, 560px);--projects-grid-max: 1600px;--projects-grid-vw: 96vw}.projects-section{width:100%;max-width:720px;margin-inline:auto;background:var(--yellow);border-radius:12px;padding:12px}.projects-section .card{width:100%;max-width:var(--card-w);height:auto;margin-inline:auto}#projects-grid-slice .slice-content{display:flex;flex-direction:row;align-items:flex-start;gap:clamp(1rem,1.5vw,2rem);padding:clamp(1rem,1.2vw,2rem);width:100%;max-width:min(var(--projects-grid-max),var(--projects-grid-vw));margin-inline:auto;box-sizing:border-box}#projects-grid-container,.projects-grid-container{flex:4 1 0;min-width:0;width:100%;max-width:100%;container-type:inline-size}#projects-grid,.projects-grid{display:grid;gap:clamp(.75rem,1.2vw,1.25rem);grid-template-columns:repeat(2,minmax(0,1fr));align-content:start;align-items:stretch;width:100%;max-width:100%;box-sizing:border-box}#projects-grid>*,.projects-grid>*{min-width:0;max-width:100%;justify-self:stretch;align-self:stretch}@media (min-width: 2000px){#projects-grid,.projects-grid{grid-template-columns:repeat(3,minmax(0,1fr))}}@media (max-width: 700px){#projects-grid,.projects-grid{grid-template-columns:1fr}}@media (max-width: 1050px){#projects-grid-slice .slice-content{flex-direction:column}#projects-filters,.projects-filters{order:1;width:100%}#projects-grid-container,.projects-grid-container{order:2;width:100%}}@media (max-width: 600px){#projects-hero-slice{height:auto;margin-top:3vh}#projects-hero-slice .slice-content{padding:.75rem}#projects-grid-slice .slice-content{gap:.75rem;padding:.75rem}}@media (max-width: 380px){#projects-grid-slice .slice-content{padding:.6rem;gap:.6rem}}@media (min-width: 1920px){:root{--projects-grid-max: 2000px;--projects-grid-vw: 94vw}#projects-grid-slice .slice-content{gap:clamp(1.25rem,1vw,2.5rem);padding:clamp(1.25rem,1.2vw,2.25rem)}}.progress-heatmap{--cell: clamp(14px, 4.5vw, 20px);--gap: clamp(3px, .9vw, 5px);--col0: color-mix(in oklab, var(--header-colour) 4%, transparent);--col1: color-mix(in oklab, var(--header-colour) 18%, transparent);--col2: color-mix(in oklab, var(--header-colour) 32%, transparent);--col3: color-mix(in oklab, var(--header-colour) 48%, transparent);--col4: color-mix(in oklab, var(--header-colour) 64%, transparent);display:grid;grid-template-rows:auto auto 1fr auto;gap:.6rem;margin:0 auto;border-radius:8px;padding-bottom:1rem}.progress-heatmap .years,.progress-heatmap .months{display:flex;gap:var(--gap);padding-inline:.25rem;-webkit-user-select:none;user-select:none;max-width:100%;overflow:hidden}.progress-heatmap .years{font-size:var(--fs-500);font-weight:600;opacity:.9}.progress-heatmap .months{font-size:var(--fs-400);opacity:.9}.progress-heatmap .years .label,.progress-heatmap .months .label{flex:0 0 auto;width:auto;white-space:nowrap;min-width:0;text-align:left}.progress-heatmap .weeks{display:flex;gap:var(--gap);align-items:flex-start;overflow-x:auto;padding:.25rem;border-radius:8px;scroll-snap-type:x proximity;overscroll-behavior-x:contain;-webkit-overflow-scrolling:touch}.progress-heatmap .week{position:relative;display:grid;grid-auto-rows:var(--cell);gap:var(--gap);scroll-snap-align:start}.commit,.commit *,.progress-heatmap,.progress-heatmap *{max-width:100%;overflow-wrap:anywhere;word-break:break-word}.progress-heatmap .day{width:var(--cell);height:var(--cell);border:0;border-radius:3px;background:var(--col0);cursor:pointer;padding:0;outline-offset:2px}.progress-heatmap .day.lvl-0{background:var(--col0)}.progress-heatmap .day.lvl-1{background:var(--col1)}.progress-heatmap .day.lvl-2{background:var(--col2)}.progress-heatmap .day.lvl-3{background:var(--col3)}.progress-heatmap .day.lvl-4{background:var(--col4)}.progress-heatmap .legend{display:flex;align-items:center;gap:.5rem;margin-left:.5rem;font-size:var(--fs-400)}.progress-heatmap .legend i{width:var(--cell);height:var(--cell);border-radius:3px;display:inline-block}.progress-heatmap .legend .lvl-0{background:var(--col0)}.progress-heatmap .legend .lvl-1{background:var(--col1)}.progress-heatmap .legend .lvl-2{background:var(--col2)}.progress-heatmap .legend .lvl-3{background:var(--col3)}.progress-heatmap .legend .lvl-4{background:var(--col4)}.commit-list{display:flex;flex-direction:column;gap:.9rem;box-sizing:border-box;min-width:0;max-width:100%;overflow-x:hidden}.commit,.commit *{max-width:100%;overflow-wrap:anywhere;word-break:break-word}.commit{border:1px solid color-mix(in oklab,var(--header-colour) 25%,transparent);background:color-mix(in oklab,var(--header-colour) 8%,transparent);border-radius:10px;padding:.9rem 1rem}.commit h4{margin:0 0 .25rem;font-size:var(--fs-500)}.commit .meta{font-size:var(--fs-300);opacity:.8}.commit .blurb{margin-top:.5rem;font-size:var(--fs-400)}@media (max-width: 420px){.progress-heatmap{--cell: clamp(16px, 6vw, 22px);--gap: clamp(4px, 1.2vw, 6px)}.progress-heatmap .months{font-size:var(--fs-400)}}#project-info-hero-slice{min-height:12vh;margin-top:4vh}#project-info-hero-slice .slice-content{width:min(1200px,95vw);margin:0 auto;padding:clamp(.75rem,1vw,1.25rem);display:grid;gap:.5rem}#project-info-slice .slice-content{display:flex;flex-direction:row;gap:1.5rem}#project-info-slice .slice-content>*{min-width:0}#project-info-slice .filter-panel{grid-column:1}#project-info-slice .project-body *,#project-info-slice .project-body :is(p,h1,h2,h3,h4,h5,h6,li,a){overflow-wrap:anywhere;word-break:break-word}@media (max-width: 1050px){#project-info-slice .slice-content{flex-direction:column}}@media (max-width: 600px){#project-info-hero-slice{margin-top:3vh}#project-info-hero-slice .slice-content{padding:.75rem;gap:.4rem}}#project-progress-hero-slice .slice-content>*{max-width:100%;word-break:break-word}.project-links a,.project-links button,.project-links .btn{display:inline-flex;align-items:center;gap:.4rem;text-decoration:none;color:#fff;border:2px solid currentColor;background:var(--header-colour);padding:.5rem 1rem;border-radius:8px;font-weight:600;cursor:pointer;transition:background-color .2s,color .2s,box-shadow .2s,transform .15s}.project-links a:hover,.project-links button:hover,.project-links .btn:hover{background:var(--r4-yellow);color:#0d1b3d;box-shadow:0 2px 6px #00000040}.project-links a:focus-visible,.project-links button:focus-visible,.project-links .btn:focus-visible{outline:3px solid #fff;outline-offset:2px}.project-links .btn--ghost{background:transparent;color:var(--header-colour);border-color:var(--header-colour)}.project-links .btn--ghost:hover{background:var(--r4-yellow);color:#0d1b3d}.portfolio-info-slices>.slice-content{align-items:start;display:flex;flex-direction:column;align-items:center}.image-container{display:flex;justify-content:center;align-items:center;width:100%;margin-left:auto;margin-right:auto}.image-container>*{min-width:0}.image-container img{display:block;width:auto;height:auto;max-height:700px;object-fit:contain;border:1px solid black;border-radius:5px}@media (max-width: 520px){.image-container{grid-template-columns:1fr;gap:.75rem}}.text-container{margin:auto;padding:1rem;max-width:1000px}.keen-image-carousel{width:50vw!important;margin:2rem auto;background:color-mix(in oklab,var(--header-colour) 10%,transparent)!important;border-radius:12px;border:1px solid color-mix(in oklab,var(--header-colour) 25%,transparent)!important;-webkit-backdrop-filter:blur(3px);backdrop-filter:blur(3px);box-shadow:0 2px 16px #00000014;padding:1rem .5rem;display:flex;flex-direction:column;align-items:center;position:relative;max-height:60vh}.keen-image-carousel .keen-slider{width:100%;min-height:220px;display:flex;position:relative}.keen-image-carousel .horizontal-keen-slider__slide{width:100%!important;height:60vh!important;display:flex;align-items:center;justify-content:center;flex-shrink:0;padding:0 5rem}.keen-image-carousel img{display:block;max-width:100%;max-height:100%;height:auto;width:auto;margin:auto;object-fit:contain;border:none}.keen-arrow{position:absolute;top:85%;transform:none;z-index:4;background:#0000002e;color:#222;border:none;border-radius:50%;width:2.2rem;height:2.2rem;font-size:1.5rem;cursor:pointer;transition:background .2s;display:flex;align-items:center;justify-content:center;-webkit-user-select:none;user-select:none}.keen-arrow--left{left:.5rem}.keen-arrow--right{right:.5rem}.keen-arrow:hover{background:var(--r4-yellow, #ffd600);color:#0d1b3d}.keen-pagination{display:flex;justify-content:center;gap:.5rem;margin-top:.5rem}.keen-dot{width:.85rem;height:.85rem;border-radius:50%;border:none;background:#d3d3d3;cursor:pointer;transition:background .2s;padding:0}.keen-dot.is-active{background:var(--r4-yellow, #ffd600);box-shadow:0 0 0 2px #fff}@media (max-width: 600px){.image-container{margin:0;width:100%}.keen-image-carousel{width:95vw!important;max-width:100vw;padding:.5rem .25rem;height:auto;max-height:85vh;margin:0}.keen-image-carousel .keen-slider__slide,.keen-image-carousel .horizontal-keen-slider__slide{width:90vw!important;height:60vw!important;min-height:180px;padding:0 .25rem}.keen-image-carousel img{max-height:100%;max-width:100%;height:auto;width:auto}}.development-slice{width:100%;display:flex;flex-direction:column;align-items:center}.feedback-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(250px,1fr));gap:1rem;width:100%;max-width:60vw;margin-top:1rem}.feedback-item{background:color-mix(in oklab,var(--header-colour) 10%,transparent);border:1px solid color-mix(in oklab,var(--header-colour) 25%,transparent);border-radius:8px;padding:1rem;box-shadow:0 2px 8px #0000000d}.youtube-embeded{width:100%;height:clamp(10vh,40vh,50vh);border:none;border-radius:8px;box-shadow:0 2px 8px #0000001a}.image-modal-backdrop{position:fixed;z-index:10000;inset:0;background:#000000b3;display:flex;align-items:center;justify-content:center}.image-modal-content{position:relative;background:#fff;border-radius:10px;padding:1rem;max-width:90vw;max-height:90vh;display:flex;flex-direction:column;align-items:center}.image-modal-content img{max-width:80vw;max-height:80vh;border-radius:8px}.image-modal-close{position:absolute;top:.5rem;right:.75rem;background:none;border:none;font-size:2rem;color:#222;cursor:pointer}:root{--header-colour: #001974;--bg: #dedede;--r4-yellow: #fbc726;--bs-col-stroke: var(--bg);--bs-col-1: hsla(0, 0%, 38%, .397);--bs-col-2: hsla(0, 0%, 47%, .404);--bs-col-3: hsla(0, 0%, 78%, .459);--bs-col-4: hsla(0, 0%, 87%, .473);--hex-size: clamp(56px, 6vw, 96px);--app-pad: clamp(1rem, 2vw, 2.25rem);--max-w: 80rem;--space-1: clamp(4px, .5vw, 8px);--space-2: clamp(8px, .8vw, 12px);--space-3: clamp(12px, 1.1vw, 16px);--space-4: clamp(16px, 1.6vw, 24px);--space-5: clamp(24px, 2.4vw, 36px);--space-6: clamp(32px, 3.2vw, 48px);--radius-1: 8px;--radius-2: 12px;--fs-300: clamp(.82rem, .2vw + .78rem, .95rem);--fs-400: clamp(.95rem, .35vw + .86rem, 1.05rem);--fs-500: clamp(1.05rem, .55vw + .92rem, 1.2rem);--fs-600: clamp(1.2rem, .85vw + 1rem, 1.44rem);--fs-700: clamp(1.44rem, 1.25vw + 1.1rem, 1.8rem);--fs-800: clamp(1.8rem, 2vw + 1.1rem, 2.25rem);--fs-900: clamp(2.1rem, 3vw + 1rem, 3rem)}*,*:before,*:after{box-sizing:border-box}html{-webkit-text-size-adjust:100%;width:100%}html,body{width:100%;margin:0;overflow-x:hidden}body{margin:0;background-color:var(--bg);line-height:1.6;font-size:var(--fs-400);text-rendering:optimizeLegibility;font-family:Play,sans-serif;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}h1{font-size:var(--fs-900);line-height:1.1}h2{font-size:var(--fs-800);line-height:1.15}h3{font-size:var(--fs-700);line-height:1.2}h4{font-size:var(--fs-600);line-height:1.25}h5{font-size:var(--fs-500);line-height:1.3}h6{font-size:var(--fs-500);line-height:1.35}p,li,dd,dt,label,input,button{font-size:var(--fs-400)}small,.hud{font-size:var(--fs-300);opacity:.9}img,picture,video,canvas{display:block;max-width:100%;height:auto}main{width:100%;margin:0 auto;padding:var(--app-pad);box-sizing:border-box}.container{width:min(100% - 2rem,var(--max-w));margin-inline:auto}.section{padding-block:var(--space-6)}.grid{display:grid;gap:var(--space-4)}.grid.auto-fit{grid-template-columns:repeat(auto-fit,minmax(min(18rem,100%),1fr))}.align-center-col{display:flex;flex-direction:column;justify-content:center;align-items:center;text-align:center}#app,#app-shell,main{width:100%}@media (prefers-reduced-motion: reduce){*{animation:none!important;transition:none!important}}@media (max-width: 600px){:root{--fs-300: clamp(.76rem, .25vw + .68rem, .9rem);--fs-400: clamp(.88rem, .35vw + .78rem, 1rem);--fs-500: clamp(.98rem, .5vw + .84rem, 1.12rem);--fs-600: clamp(1.08rem, .8vw + .9rem, 1.28rem);--fs-700: clamp(1.28rem, 1.2vw + 1rem, 1.58rem);--fs-800: clamp(1.58rem, 1.8vw + 1.05rem, 2rem);--fs-900: clamp(1.9rem, 2.6vw + 1rem, 2.5rem)}body{line-height:1.55}}@media (min-width: 1920px){:root{--fs-300: clamp(.92rem, .2vw + .86rem, 1.05rem);--fs-400: clamp(1.05rem, .35vw + .98rem, 1.2rem);--fs-500: clamp(1.2rem, .55vw + 1.05rem, 1.34rem);--fs-600: clamp(1.34rem, .85vw + 1.14rem, 1.61rem);--fs-700: clamp(1.61rem, 1.25vw + 1.2rem, 2.02rem);--fs-800: clamp(2.02rem, 2vw + 1.18rem, 2.52rem);--fs-900: clamp(2.4rem, 3vw + 1.1rem, 3.36rem)}}@media (min-width: 2560px){:root{--fs-400: clamp(1.12rem, .35vw + 1.05rem, 1.3rem);--fs-700: clamp(1.75rem, 1.25vw + 1.32rem, 2.2rem);--fs-900: clamp(2.6rem, 3vw + 1.2rem, 3.6rem)}}
