:root{--color-bg:#06080d;--color-text:#e8edf0;--color-muted:#6a7a88;--color-accent:#e74c3c;--color-accent-alpha-03:#e74c3c08;--color-accent-alpha-05:#e74c3c0d;--color-accent-alpha-08:#e74c3c14;--color-accent-alpha-10:#e74c3c1a;--color-accent-alpha-12:#e74c3c1f;--color-accent-alpha-15:#e74c3c26;--color-accent-alpha-20:#e74c3c33;--color-accent-alpha-30:#e74c3c4d;--color-accent-alpha-40:#e74c3c66;--color-accent-alpha-50:#e74c3c80;--color-text-alpha-05:#e8edf00d;--color-text-alpha-06:#e8edf00f;--color-text-alpha-08:#e8edf014;--color-text-alpha-10:#e8edf01a;--color-text-alpha-12:#e8edf01f;--color-text-alpha-15:#e8edf026;--color-text-alpha-20:#e8edf033;--color-text-alpha-30:#e8edf04d;--color-text-alpha-40:#e8edf066;--color-text-alpha-50:#e8edf080;--color-bg-alpha-87:#06080ddd;--color-bg-alpha-93:#06080dee;--color-error-text:#f34;--color-error-fill:#ff33441a;--color-error-border:#ff334430;--color-selection-text:#000;--motion-reduced-duration:.01ms;--content-wrapper-z:1;--line-width-hairline:1px;--shadow-offset-zero:0;--font-heading:"Space Grotesk", sans-serif;--font-body:"Space Grotesk", sans-serif;--font-mono:"JetBrains Mono", monospace;--spacing-page-x:clamp(24px, 6vw, 120px);--spacing-section-y:clamp(80px, 12vw, 160px);--spacing-divider-mb:clamp(80px, 10vw, 140px);--spacing-content-gap-xs:4px;--spacing-content-gap-sm:8px;--spacing-content-gap-md:12px;--spacing-content-gap-lg:16px;--spacing-content-gap-xl:24px;--spacing-content-gap-2xl:28px;--spacing-content-gap-3xl:32px;--spacing-content-gap-4xl:40px;--spacing-content-gap-5xl:48px;--spacing-content-gap-6xl:56px;--spacing-content-gap-7xl:64px;--spacing-reveal-y-sm:30px;--spacing-reveal-y-md:40px;--spacing-reveal-y-lg:60px;--nav-height:64px;--nav-z:100;--nav-scroll-threshold:60;--nav-border-width:1px;--nav-horizontal-padding:clamp(16px, 4vw, 60px);--nav-scrolled-fill:var(--color-bg-alpha-93);--nav-scrolled-border:var(--color-text-alpha-08);--nav-blur-radius:16px;--nav-transition-duration:.4s;--nav-transition-easing:ease;--nav-link-gap:28px;--nav-logo-letter-spacing:.05em;--nav-logo-line-height:1;--nav-link-letter-spacing:2px;--nav-link-font-size:11px;--nav-logo-font-size:16px;--nav-logo-focus-radius:2px;--nav-compact-breakpoint:767px;--nav-compact-gap:6px;--nav-compact-button-size:34px;--nav-compact-icon-size:15px;--nav-compact-button-border:var(--color-text-alpha-12);--nav-compact-button-border-value:var(--line-width-hairline) solid var(--nav-compact-button-border);--nav-compact-button-fill:var(--color-text-alpha-05);--nav-compact-hover-border:var(--color-accent-alpha-50);--nav-compact-hover-fill:var(--color-accent-alpha-10);--nav-compact-hover-colour:var(--color-accent);--nav-compact-focus-ring-width:2px;--nav-compact-focus-ring-colour:var(--color-accent-alpha-30);--transition-fast:.15s ease-out;--transition-normal:.3s ease-out;--transition-slow:.6s ease;--reveal-easing:cubic-bezier(.16, 1, .3, 1);--reveal-root-margin:0px 0px 70% 0px;--reveal-duration:.8s;--reveal-duration-fast:.7s;--reveal-duration-slow:.9s;--hero-min-height:100vh;--hero-grid-size:60px;--hero-grid-line-width:1px;--hero-grid-line-colour:var(--color-accent-alpha-08);--hero-grid-background:linear-gradient(to right, var(--hero-grid-line-colour) var(--hero-grid-line-width), transparent var(--hero-grid-line-width)), linear-gradient(to bottom, var(--hero-grid-line-colour) var(--hero-grid-line-width), transparent var(--hero-grid-line-width));--hero-grid-mask:radial-gradient(ellipse 80% 60% at center, #000, transparent);--hero-grid-opacity:8;--hero-scanline-colour:var(--color-accent-alpha-03);--hero-scanline-start:0px;--hero-scanline-clear-size:2px;--hero-scanline-stripe-size:4px;--hero-scanline-background:repeating-linear-gradient(0deg, transparent var(--hero-scanline-start), transparent var(--hero-scanline-clear-size), var(--hero-scanline-colour) var(--hero-scanline-clear-size), var(--hero-scanline-colour) var(--hero-scanline-stripe-size));--hero-scanline-opacity:3;--hero-scanline-layer-opacity:.5;--hero-glow-size:600px;--hero-glow-colour:var(--color-accent-alpha-15);--hero-glow-opacity:15;--hero-glow-falloff:70%;--hero-glow-lag:.3s ease-out;--hero-mouse-centre:.5;--hero-glow-mouse-range:100;--hero-content-fade-distance:600;--hero-parallax-grid-factor:.08;--hero-parallax-content-factor:.06;--hero-scroll-indicator-fade:200;--hero-content-padding-x:24px;--hero-tag-font-size:13px;--hero-tag-letter-spacing:4px;--hero-tag-line-width:40px;--hero-tag-line-height:1px;--hero-name-size:clamp(48px, 8vw, 120px);--hero-name-letter-spacing:0;--hero-name-line-height:.95;--hero-subtitle-size:clamp(16px, 2vw, 22px);--hero-subtitle-width:560px;--hero-scroll-bottom:40px;--hero-scroll-line-width:1px;--hero-scroll-line-height:40px;--hero-scroll-text-size:10px;--hero-scroll-text-letter-spacing:3px;--hero-scroll-pulse-duration:2s;--hero-scroll-pulse-opacity-min:.3;--hero-scroll-pulse-scale-min:.5;--section-heading-letter-spacing:0;--section-tag-font-size:11px;--section-tag-letter-spacing:4px;--section-tag-margin-bottom:12px;--projects-header-gap:64px;--projects-header-wrap-gap:12px;--projects-heading-size:clamp(36px, 5vw, 64px);--projects-count-font-size:14px;--projects-grid-min:min(100%, 380px);--projects-grid-template:repeat(auto-fit, minmax(var(--projects-grid-min), 1fr));--projects-grid-gap:24px;--about-grid-min:min(100%, 380px);--about-grid-template:repeat(auto-fit, minmax(var(--about-grid-min), 1fr));--about-grid-gap:clamp(40px, 6vw, 80px);--about-heading-size:clamp(32px, 4vw, 52px);--about-heading-line-height:1.1;--about-body-size:clamp(14px, 1.4vw, 16px);--about-body-line-height:1.8;--divider-height:1px;--divider-centre-colour:var(--color-accent-alpha-30);--divider-edge-colour:transparent;--divider-gradient:linear-gradient(to right, var(--divider-edge-colour), var(--divider-centre-colour), var(--divider-edge-colour));--btn-font-size:13px;--btn-letter-spacing:2px;--btn-font-weight:700;--btn-padding-block:16px;--btn-padding-inline:36px;--btn-clip-offset:12px;--btn-hover-lift:-2px;--btn-hover-shadow-offset-y:8px;--btn-hover-shadow-blur:30px;--btn-hover-shadow-opacity:40;--btn-hover-shadow-colour:var(--color-accent-alpha-40);--btn-hover-shadow:var(--shadow-offset-zero) var(--btn-hover-shadow-offset-y) var(--btn-hover-shadow-blur) var(--btn-hover-shadow-colour);--btn-hover-transition:.3s ease;--btn-secondary-border:var(--color-text-alpha-30);--btn-secondary-border-value:var(--line-width-hairline) solid var(--btn-secondary-border);--btn-disabled-opacity:.5;--card-aspect:21 / 9;--card-fill:var(--color-text-alpha-05);--card-border:var(--color-text-alpha-10);--card-border-value:var(--line-width-hairline) solid var(--card-border);--card-hover-border:var(--color-accent-alpha-40);--card-overlay-fill:linear-gradient(to top, var(--color-bg-alpha-87) 0%, transparent 50%);--card-role-fill:var(--color-accent-alpha-10);--card-role-border:var(--color-accent-alpha-50);--card-role-border-value:var(--line-width-hairline) solid var(--card-role-border);--card-parallax-x:20;--card-parallax-y:10;--card-mouse-centre:.5;--card-inset:-20px;--card-hover-line-height:2px;--card-hover-line-transition:.5s var(--reveal-easing);--card-image-brightness-default:.6;--card-image-brightness-hover:.8;--card-image-saturate-default:.8;--card-image-saturate-hover:1.3;--card-image-transition:var(--transition-slow);--card-reveal-stagger:.12s;--card-image-default-scale:1;--card-image-hover-scale:1.02;--card-overlay-padding:28px;--card-index-font-size:11px;--card-index-letter-spacing:2px;--card-title-size:clamp(22px, 3vw, 32px);--card-studio-font-size:14px;--card-role-font-size:10px;--card-role-letter-spacing:2px;--card-role-padding-block:6px;--card-role-padding-inline:14px;--avatar-frame-border-colour:var(--color-accent-alpha-30);--avatar-frame-border:var(--line-width-hairline) solid var(--avatar-frame-border-colour);--avatar-frame-inset:-1px;--avatar-bracket-size:20px;--avatar-bracket-inset:-4px;--avatar-bracket-width:2px;--avatar-border-opacity:30;--avatar-glow-blur:40px;--avatar-glow-colour:var(--color-accent-alpha-20);--avatar-glow-opacity:20;--avatar-max-width:380px;--avatar-label-offset:12px;--avatar-label-font-size:10px;--avatar-label-letter-spacing:2px;--avatar-label-opacity:.8;--timeline-year-col:100px;--timeline-year-col-mobile:80px;--timeline-line-col:1px;--timeline-line-width:1px;--timeline-line-colour:var(--color-text-alpha-12);--timeline-reveal-opacity-start:0;--timeline-mobile-breakpoint:768px;--timeline-narrow-breakpoint:480px;--timeline-gap:28px;--timeline-gap-mobile:16px;--timeline-gap-narrow:8px;--timeline-min-height:100px;--timeline-dot-size:9px;--timeline-dot-offset-top:8px;--timeline-dot-offset-left:-4px;--timeline-dot-default-colour:var(--color-text-alpha-40);--timeline-dot-game-colour:var(--color-accent);--timeline-rail-reveal-colour:var(--color-accent-alpha-40);--timeline-rail-reveal-glow-colour:var(--color-accent-alpha-15);--timeline-rail-reveal-gradient:linear-gradient(to bottom, transparent, var(--timeline-rail-reveal-glow-colour), var(--timeline-rail-reveal-colour), var(--timeline-rail-reveal-glow-colour), transparent);--timeline-rail-reveal-width:3px;--timeline-rail-reveal-inset:0 auto 0 50%;--timeline-rail-reveal-offset:-50%;--timeline-rail-reveal-distance:36px;--timeline-rail-reveal-opacity:.8;--timeline-rail-reveal-duration:.85s;--timeline-rail-reveal-easing:var(--reveal-easing);--timeline-dot-reveal-colour:var(--color-accent);--timeline-dot-reveal-shadow-colour:var(--color-accent-alpha-30);--timeline-dot-reveal-shadow-blur:14px;--timeline-dot-reveal-shadow-spread:1px;--timeline-dot-reveal-base-scale:1;--timeline-dot-reveal-scale:1.55;--timeline-dot-reveal-opacity:.72;--timeline-dot-reveal-duration:.62s;--timeline-dot-reveal-easing:var(--reveal-easing);--timeline-dot-reveal-delay:.12s;--timeline-project-tag-fill:var(--color-accent-alpha-10);--timeline-project-tag-border:var(--color-accent-alpha-40);--timeline-project-tag-border-value:var(--line-width-hairline) solid var(--timeline-project-tag-border);--timeline-reveal-offset:-30px;--timeline-reveal-stagger:80ms;--timeline-header-gap:64px;--timeline-heading-size:clamp(36px, 5vw, 64px);--timeline-content-max-width:700px;--timeline-content-padding-bottom:36px;--timeline-year-font-size:12px;--timeline-year-letter-spacing:.5px;--timeline-title-font-size:18px;--timeline-place-font-size:14px;--timeline-project-tag-font-size:10px;--timeline-project-tag-letter-spacing:2px;--timeline-project-tag-padding-block:4px;--timeline-project-tag-padding-inline:10px;--timeline-description-font-size:13px;--timeline-description-opacity:.67;--tech-grid-min:min(100%, 280px);--tech-grid-template:repeat(auto-fit, minmax(var(--tech-grid-min), 1fr));--tech-grid-gap:40px;--tech-heading-size:clamp(36px, 5vw, 64px);--tech-chip-fill:var(--color-text-alpha-05);--tech-chip-border:var(--color-text-alpha-12);--tech-chip-border-value:var(--line-width-hairline) solid var(--tech-chip-border);--tech-chip-hover-border:var(--color-accent-alpha-50);--tech-chip-padding-block:6px;--tech-chip-padding-inline:12px;--tech-chip-gap:8px;--tech-chip-font-size:12px;--tech-chip-transition:.3s ease;--tech-category-label-font-size:10px;--tech-category-label-letter-spacing:3px;--contact-max-width:560px;--contact-success-reset-ms:3000;--contact-form-column-min:min(100%, 240px);--contact-form-grid-template:repeat(auto-fit, minmax(var(--contact-form-column-min), 1fr));--contact-header-gap:48px;--contact-form-gap:24px;--contact-form-row-gap:24px;--contact-field-fill:var(--color-text-alpha-06);--contact-field-border:var(--color-text-alpha-15);--contact-field-border-value:var(--line-width-hairline) solid var(--contact-field-border);--contact-field-focus-border:var(--color-accent);--contact-field-padding-block:14px;--contact-field-padding-inline:16px;--contact-field-font-size:15px;--contact-field-transition:.3s;--contact-textarea-min-height:120px;--contact-turnstile-gap:8px;--contact-submit-spacing:0;--contact-social-gap:32px;--contact-social-spacing:56px;--contact-success-fill:var(--color-accent-alpha-08);--contact-success-border:var(--color-accent-alpha-30);--contact-success-border-value:var(--line-width-hairline) solid var(--contact-success-border);--contact-success-padding-block:48px;--contact-success-padding-inline:24px;--contact-success-heading-size:24px;--contact-social-font-size:12px;--contact-error-banner-padding:12px;--contact-error-border-value:var(--line-width-hairline) solid var(--color-error-border);--contact-label-font-size:10px;--contact-label-letter-spacing:3px;--contact-error-font-size:11px;--contact-error-banner-font-size:12px;--contact-heading-size:clamp(36px, 5vw, 64px);--contact-subtitle-font-size:16px;--footer-border-colour:var(--color-text-alpha-08);--footer-border:var(--line-width-hairline) solid var(--footer-border-colour);--footer-padding-block:40px;--footer-background-fill:var(--color-bg);--footer-text-opacity:.8;--footer-font-size:11px;--footer-letter-spacing:2px;--parallax-image-inset:-20px;--parallax-image-overflow:40px;--parallax-image-filter:saturate(.5) brightness(.35);--parallax-crossfade-duration:.8s;--parallax-crossfade-easing:ease-in-out;--parallax-source-retain-ms:900;--parallax-vignette:radial-gradient(ellipse 80% 70% at 50% 50%, transparent 20%, var(--color-bg) 80%);--parallax-active-section-top-threshold:.7;--parallax-active-section-bottom-threshold:.3;--scroll-offset:-80}::selection{background:var(--color-accent);color:var(--color-selection-text)}*,:before,:after{box-sizing:border-box;margin:0;padding:0}html{scroll-behavior:smooth}body{background-color:var(--color-bg);color:var(--color-text);font-family:var(--font-body);-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;line-height:1.6}h1,h2,h3,h4,h5,h6{font-family:var(--font-heading);font-weight:700;line-height:1.2}a{color:var(--color-accent);text-decoration:none}code,pre{font-family:var(--font-mono)}img{max-width:100%;display:block}@media (prefers-reduced-motion:reduce){*,:before,:after{animation-duration:var(--motion-reduced-duration)!important;transition-duration:var(--motion-reduced-duration)!important;scroll-behavior:auto!important;animation-iteration-count:1!important}}.parallax-bg[data-v-4501057a]{z-index:0;pointer-events:none;background-color:var(--color-bg);position:fixed;inset:0}.parallax-image[data-v-4501057a]{inset:var(--parallax-image-inset);width:calc(100% + var(--parallax-image-overflow));height:calc(100% + var(--parallax-image-overflow));object-fit:cover;filter:var(--parallax-image-filter);opacity:0;transition:opacity var(--parallax-crossfade-duration) var(--parallax-crossfade-easing);position:absolute}.parallax-image.active[data-v-4501057a]{opacity:1}.parallax-vignette[data-v-4501057a]{background:var(--parallax-vignette);position:absolute;inset:0}.nav[data-v-63da6f3e]{height:var(--nav-height);z-index:var(--nav-z);padding:0 var(--nav-horizontal-padding);-webkit-backdrop-filter:none;backdrop-filter:none;border-bottom:var(--nav-border-width) solid transparent;transition:background-color var(--nav-transition-duration) var(--nav-transition-easing), border-color var(--nav-transition-duration) var(--nav-transition-easing), backdrop-filter var(--nav-transition-duration) var(--nav-transition-easing);background:0 0;justify-content:space-between;align-items:center;display:flex;position:fixed;top:0;left:0;right:0}.nav.scrolled[data-v-63da6f3e]{background:var(--nav-scrolled-fill);-webkit-backdrop-filter:blur(var(--nav-blur-radius));backdrop-filter:blur(var(--nav-blur-radius));border-bottom-color:var(--nav-scrolled-border)}.logo[data-v-63da6f3e]{appearance:none;font-family:var(--font-heading);font-size:var(--nav-logo-font-size);text-transform:uppercase;letter-spacing:var(--nav-logo-letter-spacing);font-weight:800;line-height:var(--nav-logo-line-height);color:var(--color-text);cursor:pointer;-webkit-user-select:none;user-select:none;background:0 0;border:0;align-items:center;padding:0;display:inline-flex}.logo[data-v-63da6f3e]:focus-visible{border-radius:var(--nav-logo-focus-radius);box-shadow:0 0 0 var(--nav-compact-focus-ring-width) var(--nav-compact-focus-ring-colour);outline:none}.logo-dot[data-v-63da6f3e]{color:var(--color-accent)}.nav-links[data-v-63da6f3e]{gap:var(--nav-link-gap);display:flex}.nav-link[data-v-63da6f3e]{font-family:var(--font-mono);font-size:var(--nav-link-font-size);letter-spacing:var(--nav-link-letter-spacing);text-transform:uppercase;color:var(--color-muted);cursor:pointer;transition:color var(--transition-normal);text-decoration:none}.nav-link[data-v-63da6f3e]:hover{color:var(--color-accent)}.nav-icon-links[data-v-63da6f3e]{gap:var(--nav-compact-gap);display:none}.nav-icon-button[data-v-63da6f3e]{width:var(--nav-compact-button-size);height:var(--nav-compact-button-size);border:var(--nav-compact-button-border-value);background:var(--nav-compact-button-fill);color:var(--color-muted);font-family:var(--font-mono);font-size:var(--nav-compact-icon-size);cursor:pointer;transition:color var(--transition-normal), border-color var(--transition-normal), background-color var(--transition-normal), box-shadow var(--transition-normal);justify-content:center;align-items:center;line-height:1;display:inline-flex}.nav-icon-button[data-v-63da6f3e]:hover,.nav-icon-button[data-v-63da6f3e]:focus-visible{color:var(--nav-compact-hover-colour);border-color:var(--nav-compact-hover-border);background:var(--nav-compact-hover-fill);box-shadow:0 0 0 var(--nav-compact-focus-ring-width) var(--nav-compact-focus-ring-colour);outline:none}.nav.compact .nav-links[data-v-63da6f3e]{display:none}.nav.compact .nav-icon-links[data-v-63da6f3e]{display:flex}.hero[data-v-6e608e81]{min-height:var(--hero-min-height);background:var(--color-bg);justify-content:center;align-items:center;display:flex;position:relative;overflow:hidden}.hero-grid[data-v-6e608e81]{background-image:var(--hero-grid-background);background-size:var(--hero-grid-size) var(--hero-grid-size);-webkit-mask-image:var(--hero-grid-mask);mask-image:var(--hero-grid-mask);-webkit-mask-image:var(--hero-grid-mask);will-change:transform;position:absolute;inset:0}.hero-scanlines[data-v-6e608e81]{background:var(--hero-scanline-background);pointer-events:none;opacity:var(--hero-scanline-layer-opacity);position:absolute;inset:0}.hero-glow[data-v-6e608e81]{width:var(--hero-glow-size);height:var(--hero-glow-size);background:radial-gradient(circle, var(--hero-glow-colour), transparent var(--hero-glow-falloff));transition:left var(--hero-glow-lag), top var(--hero-glow-lag);pointer-events:none;will-change:left, top;border-radius:50%;position:absolute;transform:translate(-50%,-50%)}.hero-content[data-v-6e608e81]{z-index:2;text-align:center;padding:0 var(--hero-content-padding-x);will-change:transform, opacity;position:relative}.hero-tag[data-v-6e608e81]{font-family:var(--font-mono);font-size:var(--hero-tag-font-size);letter-spacing:var(--hero-tag-letter-spacing);text-transform:uppercase;color:var(--color-accent);justify-content:center;align-items:center;gap:var(--spacing-content-gap-md);margin-bottom:var(--spacing-content-gap-xl);display:flex}.hero-tag-line[data-v-6e608e81]{width:var(--hero-tag-line-width);height:var(--hero-tag-line-height);background:var(--color-accent)}.hero-name[data-v-6e608e81]{font-family:var(--font-heading);font-size:var(--hero-name-size);letter-spacing:var(--hero-name-letter-spacing);font-weight:800;line-height:var(--hero-name-line-height);margin-bottom:var(--spacing-content-gap-2xl)}.hero-name-accent[data-v-6e608e81],.hero-name-dot[data-v-6e608e81]{color:var(--color-accent)}.hero-subtitle[data-v-6e608e81]{font-family:var(--font-body);font-size:var(--hero-subtitle-size);color:var(--color-muted);max-width:var(--hero-subtitle-width);margin:0 auto;margin-bottom:var(--spacing-content-gap-4xl);line-height:1.6}.hero-ctas[data-v-6e608e81]{gap:var(--spacing-content-gap-lg);flex-wrap:wrap;justify-content:center;display:flex}.btn-primary[data-v-6e608e81]{font-family:var(--font-mono);font-size:var(--btn-font-size);letter-spacing:var(--btn-letter-spacing);text-transform:uppercase;font-weight:var(--btn-font-weight);background:var(--color-accent);color:var(--color-bg);padding:var(--btn-padding-block) var(--btn-padding-inline);clip-path:polygon(0 0, calc(100% - var(--btn-clip-offset)) 0, 100% 100%, var(--btn-clip-offset) 100%);cursor:pointer;transition:var(--btn-hover-transition);border:none}.btn-primary[data-v-6e608e81]:hover{transform:translateY(var(--btn-hover-lift));box-shadow:var(--btn-hover-shadow)}.btn-secondary[data-v-6e608e81]{font-family:var(--font-mono);font-size:var(--btn-font-size);letter-spacing:var(--btn-letter-spacing);text-transform:uppercase;font-weight:var(--btn-font-weight);color:var(--color-text);border:var(--btn-secondary-border-value);padding:var(--btn-padding-block) var(--btn-padding-inline);clip-path:polygon(0 0, calc(100% - var(--btn-clip-offset)) 0, 100% 100%, var(--btn-clip-offset) 100%);cursor:pointer;transition:var(--btn-hover-transition);background:0 0}.btn-secondary[data-v-6e608e81]:hover{border-color:var(--color-accent);color:var(--color-accent)}.hero-scroll-indicator[data-v-6e608e81]{bottom:var(--hero-scroll-bottom);align-items:center;gap:var(--spacing-content-gap-sm);transition:opacity var(--transition-normal);flex-direction:column;display:flex;position:absolute;left:50%;transform:translate(-50%)}.hero-scroll-line[data-v-6e608e81]{width:var(--hero-scroll-line-width);height:var(--hero-scroll-line-height);background:linear-gradient(to bottom, var(--color-accent), transparent);animation:scrollPulse-6e608e81 var(--hero-scroll-pulse-duration) ease-in-out infinite}.hero-scroll-text[data-v-6e608e81]{font-family:var(--font-mono);font-size:var(--hero-scroll-text-size);letter-spacing:var(--hero-scroll-text-letter-spacing);text-transform:uppercase;color:var(--color-muted)}@keyframes scrollPulse-6e608e81{0%,to{opacity:var(--hero-scroll-pulse-opacity-min);transform:scaleY(var(--hero-scroll-pulse-scale-min));transform-origin:top}50%{opacity:1;transform-origin:top;transform:scaleY(1)}}.section-tag[data-v-f5ba7fc0]{font-family:var(--font-mono);font-size:var(--section-tag-font-size);letter-spacing:var(--section-tag-letter-spacing);text-transform:uppercase;color:var(--color-accent);margin-bottom:var(--section-tag-margin-bottom);display:block}.project-card[data-v-7634d06a]{cursor:default;aspect-ratio:var(--card-aspect);background:var(--card-fill);border:var(--card-border-value);opacity:0;transform:translateY(var(--spacing-reveal-y-lg));transition:all var(--reveal-duration) var(--reveal-easing);position:relative;overflow:hidden}.project-card[data-v-7634d06a]:hover{border-color:var(--card-hover-border)}.project-card.visible[data-v-7634d06a]{opacity:1;transform:translateY(0)}.card-image-container[data-v-7634d06a]{inset:var(--card-inset);transition:transform var(--transition-normal), filter var(--card-image-transition);position:absolute}.card-image[data-v-7634d06a]{object-fit:cover;width:100%;height:100%;filter:brightness(var(--card-image-brightness-default)) saturate(var(--card-image-saturate-default));transition:filter var(--transition-slow)}.card-image.hovered[data-v-7634d06a]{filter:brightness(var(--card-image-brightness-hover)) saturate(var(--card-image-saturate-hover))}.card-overlay[data-v-7634d06a]{background:var(--card-overlay-fill);padding:var(--card-overlay-padding);flex-direction:column;justify-content:flex-end;display:flex;position:absolute;inset:0}.card-index[data-v-7634d06a]{font-family:var(--font-mono);font-size:var(--card-index-font-size);color:var(--color-accent);letter-spacing:var(--card-index-letter-spacing);margin-bottom:var(--spacing-content-gap-sm)}.card-title[data-v-7634d06a]{font-family:var(--font-heading);font-size:var(--card-title-size);color:var(--color-text);margin-bottom:var(--spacing-content-gap-xs);font-weight:700;line-height:1.2}.card-studio[data-v-7634d06a]{font-family:var(--font-body);font-size:var(--card-studio-font-size);color:var(--color-muted);margin-bottom:var(--spacing-content-gap-md)}.card-role[data-v-7634d06a]{font-family:var(--font-mono);font-size:var(--card-role-font-size);letter-spacing:var(--card-role-letter-spacing);text-transform:uppercase;color:var(--color-accent);padding:var(--card-role-padding-block) var(--card-role-padding-inline);border:var(--card-role-border-value);background:var(--card-role-fill);align-self:flex-start;display:inline-block}.card-hover-line[data-v-7634d06a]{height:var(--card-hover-line-height);background:var(--color-accent);transform-origin:0;transition:transform var(--card-hover-line-transition);position:absolute;top:0;left:0;right:0;transform:scaleX(0)}.card-hover-line.hovered[data-v-7634d06a]{transform:scaleX(1)}.projects-section[data-v-3a05a0d5]{padding:var(--spacing-section-y) var(--spacing-page-x);background:0 0;position:relative}.projects-header[data-v-3a05a0d5]{margin-bottom:var(--projects-header-gap);justify-content:space-between;align-items:baseline;gap:var(--projects-header-wrap-gap);opacity:0;transform:translateY(var(--spacing-reveal-y-sm));transition:all var(--reveal-duration) var(--reveal-easing);flex-wrap:wrap;display:flex}.projects-header.visible[data-v-3a05a0d5]{opacity:1;transform:translateY(0)}.projects-heading[data-v-3a05a0d5]{font-family:var(--font-heading);font-size:var(--projects-heading-size);letter-spacing:var(--section-heading-letter-spacing);font-weight:800}.projects-count[data-v-3a05a0d5]{font-family:var(--font-mono);font-size:var(--projects-count-font-size);color:var(--color-muted)}.projects-grid[data-v-3a05a0d5]{grid-template-columns:var(--projects-grid-template);gap:var(--projects-grid-gap);display:grid}.section-divider[data-v-934dd007]{width:100%;height:var(--divider-height);margin-bottom:var(--spacing-divider-mb);background:var(--divider-gradient)}.about-section[data-v-66d001e4]{padding:var(--spacing-section-y) var(--spacing-page-x);background:0 0;position:relative}.about-grid[data-v-66d001e4]{grid-template-columns:var(--about-grid-template);gap:var(--about-grid-gap);opacity:0;transform:translateY(var(--spacing-reveal-y-md));transition:all var(--reveal-duration-slow) var(--reveal-easing);display:grid}.about-grid.visible[data-v-66d001e4]{opacity:1;transform:translateY(0)}.about-heading[data-v-66d001e4]{font-family:var(--font-heading);font-size:var(--about-heading-size);font-weight:800;line-height:var(--about-heading-line-height);letter-spacing:var(--section-heading-letter-spacing);margin-bottom:var(--spacing-content-gap-2xl)}.about-body[data-v-66d001e4]{font-family:var(--font-body);font-size:var(--about-body-size);color:var(--color-muted);line-height:var(--about-body-line-height);gap:var(--spacing-content-gap-lg);flex-direction:column;display:flex}.about-avatar-wrapper[data-v-66d001e4]{justify-content:center;align-items:center;display:flex}.about-avatar-frame[data-v-66d001e4]{width:100%;max-width:var(--avatar-max-width);position:relative}.avatar-border[data-v-66d001e4]{inset:var(--avatar-frame-inset);border:var(--avatar-frame-border);pointer-events:none;position:absolute}.avatar-bracket[data-v-66d001e4]{width:var(--avatar-bracket-size);height:var(--avatar-bracket-size);position:absolute}.avatar-bracket-tl[data-v-66d001e4]{top:var(--avatar-bracket-inset);left:var(--avatar-bracket-inset);border-top:var(--avatar-bracket-width) solid var(--color-accent);border-left:var(--avatar-bracket-width) solid var(--color-accent)}.avatar-bracket-tr[data-v-66d001e4]{top:var(--avatar-bracket-inset);right:var(--avatar-bracket-inset);border-top:var(--avatar-bracket-width) solid var(--color-accent);border-right:var(--avatar-bracket-width) solid var(--color-accent)}.avatar-bracket-bl[data-v-66d001e4]{bottom:var(--avatar-bracket-inset);left:var(--avatar-bracket-inset);border-bottom:var(--avatar-bracket-width) solid var(--color-accent);border-left:var(--avatar-bracket-width) solid var(--color-accent)}.avatar-bracket-br[data-v-66d001e4]{bottom:var(--avatar-bracket-inset);right:var(--avatar-bracket-inset);border-bottom:var(--avatar-bracket-width) solid var(--color-accent);border-right:var(--avatar-bracket-width) solid var(--color-accent)}.avatar-image[data-v-66d001e4]{width:100%;image-rendering:pixelated;filter:drop-shadow(0 0 var(--avatar-glow-blur) var(--avatar-glow-colour));display:block}.avatar-label[data-v-66d001e4]{bottom:var(--avatar-label-offset);left:var(--avatar-label-offset);font-family:var(--font-mono);font-size:var(--avatar-label-font-size);letter-spacing:var(--avatar-label-letter-spacing);color:var(--color-accent);text-transform:uppercase;opacity:var(--avatar-label-opacity);position:absolute}.timeline-entry[data-v-16769f72]{grid-template-columns:var(--timeline-year-col) var(--timeline-line-col) 1fr;gap:var(--timeline-gap);min-height:var(--timeline-min-height);display:grid}.timeline-year[data-v-16769f72]{font-family:var(--font-mono);font-size:var(--timeline-year-font-size);color:var(--color-accent);letter-spacing:var(--timeline-year-letter-spacing);padding-top:var(--timeline-project-tag-padding-block);text-align:right;line-height:1.5}.timeline-line[data-v-16769f72]{background:var(--timeline-line-colour);width:var(--timeline-line-width);position:relative}.timeline-line[data-v-16769f72]:before{content:"";inset:var(--timeline-rail-reveal-inset);width:var(--timeline-rail-reveal-width);background:var(--timeline-rail-reveal-gradient);opacity:var(--timeline-rail-reveal-current-opacity);transform:translate(var(--timeline-rail-reveal-offset), var(--timeline-rail-reveal-current-distance));transition:opacity var(--timeline-rail-reveal-duration) var(--timeline-rail-reveal-easing), transform var(--timeline-rail-reveal-duration) var(--timeline-rail-reveal-easing);pointer-events:none;will-change:opacity, transform;position:absolute}.timeline-dot[data-v-16769f72]{top:var(--timeline-dot-offset-top);left:var(--timeline-dot-offset-left);width:var(--timeline-dot-size);height:var(--timeline-dot-size);clip-path:polygon(50% 0%,100% 50%,50% 100%,0% 50%);background:var(--timeline-dot-default-colour);position:absolute}.timeline-dot[data-v-16769f72]:after{content:"";inset:var(--shadow-offset-zero);clip-path:inherit;background:var(--timeline-dot-reveal-colour);opacity:var(--timeline-dot-reveal-current-opacity);transform:scale(var(--timeline-dot-reveal-current-scale));transition:opacity var(--timeline-dot-reveal-duration) var(--timeline-dot-reveal-easing) var(--timeline-dot-reveal-delay), transform var(--timeline-dot-reveal-duration) var(--timeline-dot-reveal-easing) var(--timeline-dot-reveal-delay);box-shadow:var(--shadow-offset-zero) var(--shadow-offset-zero) var(--timeline-dot-reveal-shadow-blur) var(--timeline-dot-reveal-shadow-spread) var(--timeline-dot-reveal-shadow-colour);pointer-events:none;will-change:opacity, transform;position:absolute}.timeline-dot.dot-game[data-v-16769f72]{background:var(--timeline-dot-game-colour)}.timeline-content[data-v-16769f72]{padding-bottom:var(--timeline-content-padding-bottom)}.timeline-title[data-v-16769f72]{font-family:var(--font-heading);font-size:var(--timeline-title-font-size);color:var(--color-text);margin-bottom:calc(var(--spacing-content-gap-xs) / 2);font-weight:700}.timeline-place[data-v-16769f72]{font-family:var(--font-body);font-size:var(--timeline-place-font-size);color:var(--color-muted);margin-bottom:var(--spacing-content-gap-sm)}.timeline-project-tag[data-v-16769f72]{font-family:var(--font-mono);font-size:var(--timeline-project-tag-font-size);letter-spacing:var(--timeline-project-tag-letter-spacing);text-transform:uppercase;color:var(--color-accent);padding:var(--timeline-project-tag-padding-block) var(--timeline-project-tag-padding-inline);border:var(--timeline-project-tag-border-value);background:var(--timeline-project-tag-fill);margin-bottom:var(--spacing-content-gap-sm);display:inline-block}.timeline-desc[data-v-16769f72]{font-family:var(--font-body);font-size:var(--timeline-description-font-size);color:var(--color-muted);opacity:var(--timeline-description-opacity);line-height:1.6}.timeline-entry.mobile[data-v-16769f72]{grid-template-columns:var(--timeline-year-col-mobile) var(--timeline-line-col) 1fr;gap:var(--timeline-gap-mobile)}.timeline-entry.narrow[data-v-16769f72]{gap:var(--timeline-gap-narrow);grid-template-columns:1fr}.timeline-entry.narrow .timeline-line[data-v-16769f72]{display:none}.timeline-entry.narrow .timeline-year[data-v-16769f72]{text-align:left}@media (prefers-reduced-motion:reduce){.timeline-line[data-v-16769f72]:before,.timeline-dot[data-v-16769f72]:after{opacity:var(--timeline-reveal-opacity-start);transition:none;animation-name:none}}.timeline-section[data-v-411a3777]{padding:var(--spacing-section-y) var(--spacing-page-x);--timeline-rail-reveal-current-opacity:var(--timeline-reveal-opacity-start);--timeline-rail-reveal-current-distance:var(--timeline-rail-reveal-distance);--timeline-dot-reveal-current-opacity:var(--timeline-reveal-opacity-start);--timeline-dot-reveal-current-scale:var(--timeline-dot-reveal-base-scale);background:0 0}.timeline-section.timeline-section-decorated[data-v-411a3777]{--timeline-rail-reveal-current-opacity:var(--timeline-rail-reveal-opacity);--timeline-rail-reveal-current-distance:var(--shadow-offset-zero);--timeline-dot-reveal-current-opacity:var(--timeline-dot-reveal-opacity);--timeline-dot-reveal-current-scale:var(--timeline-dot-reveal-scale)}.timeline-header[data-v-411a3777]{margin-bottom:var(--timeline-header-gap);opacity:0;transform:translateY(var(--spacing-reveal-y-sm));transition:all var(--reveal-duration) var(--reveal-easing)}.timeline-header.visible[data-v-411a3777]{opacity:1;transform:translateY(0)}.timeline-heading[data-v-411a3777]{font-family:var(--font-heading);font-size:var(--timeline-heading-size);letter-spacing:var(--section-heading-letter-spacing);font-weight:800}.timeline-entries[data-v-411a3777]{max-width:var(--timeline-content-max-width)}.tech-section[data-v-84ce50ff]{padding:0 var(--spacing-page-x) var(--spacing-section-y);background:var(--color-bg)}.tech-content[data-v-84ce50ff]{opacity:0;transform:translateY(var(--spacing-reveal-y-md));transition:all var(--reveal-duration-slow) var(--reveal-easing)}.tech-content.visible[data-v-84ce50ff]{opacity:1;transform:translateY(0)}.tech-heading[data-v-84ce50ff]{font-family:var(--font-heading);font-size:var(--tech-heading-size);letter-spacing:var(--section-heading-letter-spacing);margin-bottom:var(--spacing-content-gap-6xl);font-weight:800}.tech-grid[data-v-84ce50ff]{grid-template-columns:var(--tech-grid-template);gap:var(--tech-grid-gap);display:grid}.tech-category-label[data-v-84ce50ff]{font-family:var(--font-mono);font-size:var(--tech-category-label-font-size);letter-spacing:var(--tech-category-label-letter-spacing);text-transform:uppercase;color:var(--color-accent);margin-bottom:var(--spacing-content-gap-lg);display:block}.tech-chips[data-v-84ce50ff]{gap:var(--tech-chip-gap);flex-wrap:wrap;display:flex}.tech-chip[data-v-84ce50ff]{font-family:var(--font-mono);font-size:var(--tech-chip-font-size);color:var(--color-muted);padding:var(--tech-chip-padding-block) var(--tech-chip-padding-inline);border:var(--tech-chip-border-value);background:var(--tech-chip-fill);transition:var(--tech-chip-transition);cursor:default}.tech-chip[data-v-84ce50ff]:hover{border-color:var(--tech-chip-hover-border);color:var(--color-text)}.contact-section[data-v-deaf9029]{padding:var(--spacing-section-y) var(--spacing-page-x);background:var(--color-bg);position:relative}.contact-content[data-v-deaf9029]{max-width:var(--contact-max-width);opacity:0;transform:translateY(var(--spacing-reveal-y-md));transition:all var(--reveal-duration-slow) var(--reveal-easing);margin:0 auto}.contact-content.visible[data-v-deaf9029]{opacity:1;transform:translateY(0)}.contact-header[data-v-deaf9029]{text-align:center;margin-bottom:var(--contact-header-gap)}.contact-heading[data-v-deaf9029]{font-family:var(--font-heading);font-size:var(--contact-heading-size);letter-spacing:var(--section-heading-letter-spacing);font-weight:800}.contact-subtitle[data-v-deaf9029]{font-family:var(--font-body);font-size:var(--contact-subtitle-font-size);color:var(--color-muted);line-height:1.7}.contact-form[data-v-deaf9029]{gap:var(--contact-form-gap);flex-direction:column;display:flex}.form-row[data-v-deaf9029]{grid-template-columns:var(--contact-form-grid-template);gap:var(--contact-form-row-gap);display:grid}.form-group[data-v-deaf9029]{flex-direction:column;display:flex}.form-label[data-v-deaf9029]{font-family:var(--font-mono);font-size:var(--contact-label-font-size);letter-spacing:var(--contact-label-letter-spacing);text-transform:uppercase;color:var(--color-muted);margin-bottom:var(--spacing-content-gap-sm);display:block}.contact-form input[data-v-deaf9029],.contact-form textarea[data-v-deaf9029]{font-family:var(--font-body);font-size:var(--contact-field-font-size);color:var(--color-text);background:var(--contact-field-fill);border:var(--contact-field-border-value);padding:var(--contact-field-padding-block) var(--contact-field-padding-inline);width:100%;transition:border-color var(--contact-field-transition);box-sizing:border-box;outline:none}.contact-form input.focused[data-v-deaf9029],.contact-form textarea.focused[data-v-deaf9029]{border-color:var(--contact-field-focus-border)}.contact-form input.has-error[data-v-deaf9029],.contact-form textarea.has-error[data-v-deaf9029]{border-color:var(--color-error-text)}.contact-form textarea[data-v-deaf9029]{resize:vertical;min-height:var(--contact-textarea-min-height)}.form-error[data-v-deaf9029]{font-family:var(--font-mono);font-size:var(--contact-error-font-size);color:var(--color-error-text);margin-top:var(--spacing-content-gap-xs)}.form-error-banner[data-v-deaf9029]{font-size:var(--contact-error-banner-font-size);color:var(--color-error-text);padding:var(--contact-error-banner-padding);background:var(--color-error-fill);border:var(--contact-error-border-value)}.btn-primary[data-v-deaf9029]{font-family:var(--font-mono);font-size:var(--btn-font-size);letter-spacing:var(--btn-letter-spacing);text-transform:uppercase;font-weight:var(--btn-font-weight);background:var(--color-accent);color:var(--color-bg);padding:var(--btn-padding-block) var(--btn-padding-inline);clip-path:polygon(0 0, calc(100% - var(--btn-clip-offset)) 0, 100% 100%, var(--btn-clip-offset) 100%);cursor:pointer;transition:var(--btn-hover-transition);border:none;align-self:flex-start}.btn-primary[data-v-deaf9029]:hover:not(:disabled){transform:translateY(var(--btn-hover-lift));box-shadow:var(--btn-hover-shadow)}.btn-primary[data-v-deaf9029]:disabled{opacity:var(--btn-disabled-opacity);cursor:not-allowed}.btn-submit[data-v-deaf9029]{margin-top:var(--contact-submit-spacing)}.turnstile-wrapper[data-v-deaf9029]{gap:var(--contact-turnstile-gap);flex-direction:column;display:flex}.contact-success[data-v-deaf9029]{text-align:center;padding:var(--contact-success-padding-block) var(--contact-success-padding-inline);border:var(--contact-success-border-value);background:var(--contact-success-fill)}.success-heading[data-v-deaf9029]{font-family:var(--font-heading);font-size:var(--contact-success-heading-size);color:var(--color-text);margin-bottom:var(--spacing-content-gap-sm);font-weight:700}.success-subtext[data-v-deaf9029]{font-family:var(--font-mono);font-size:var(--contact-social-font-size);color:var(--color-muted)}.social-links[data-v-deaf9029]{justify-content:center;gap:var(--contact-social-gap);margin-top:var(--contact-social-spacing);display:flex}.social-link[data-v-deaf9029]{font-family:var(--font-mono);font-size:var(--contact-social-font-size);letter-spacing:var(--btn-letter-spacing);text-transform:uppercase;color:var(--color-muted);transition:color var(--transition-normal);text-decoration:none}.social-link[data-v-deaf9029]:hover{color:var(--color-accent)}.site-footer[data-v-ae416a6b]{padding:var(--footer-padding-block) var(--spacing-page-x);background:var(--footer-background-fill);border-top:var(--footer-border);justify-content:space-between;align-items:center;display:flex}.footer-left[data-v-ae416a6b],.footer-right[data-v-ae416a6b]{font-family:var(--font-mono);font-size:var(--footer-font-size);letter-spacing:var(--footer-letter-spacing);text-transform:uppercase;color:var(--color-muted)}.footer-right[data-v-ae416a6b]{opacity:var(--footer-text-opacity)}.content-wrapper{z-index:var(--content-wrapper-z);position:relative}
