@keyframes spin{to{transform:rotate(360deg)}}@keyframes warpIn{0%{opacity:0;transform:translateY(20px) scale(.98);filter:blur(2px)}to{opacity:1;transform:translateY(0) scale(1);filter:blur(0)}}@keyframes accentPulse{0%,to{opacity:.5}50%{opacity:1}}@keyframes gentlePing{0%{transform:scale(1);opacity:.4}50%{transform:scale(1.3);opacity:0}to{transform:scale(1);opacity:0}}@keyframes shimmer{0%{background-position:-200%center}to{background-position:200%center}}@keyframes scanlineScroll{0%{background-position:0 0}to{background-position:0 100px}}@keyframes crtFlicker{0%,92%,94%,to{opacity:1}93%{opacity:.8}}:root{--void:#292524;--space:#1c1917;--nebula:#44403c;--star:#fafaf9;--dim:#a8a29e;--accent:#f59e0b;--accent-light:#fbbf24;--accent-dark:#d97706;--accent-glow:rgba(245, 158, 11, 0.4);--colour-success:#22c55e;--colour-warning:#f59e0b;--colour-danger:#ef4444;--colour-info:#3b82f6;--font-main:"Space Grotesk", "Space Grotesk Fallback", sans-serif;--pixel-size:4px}body{font-family:var(--font-main)}*{transition:background-color .15s ease,color .15s ease,border-color .15s ease}.gradient-text{color:var(--accent)}.security-badge{box-shadow:0 0 20px var(--accent-glow)}.card-hover{transition:transform .15s ease,box-shadow .15s ease,border-color .15s ease;border:1px solid transparent}.card-hover:hover{transform:translateY(-2px);box-shadow:0 0 30px var(--accent-glow);border-color:var(--accent)}.project-banner{background:linear-gradient(to right,color-mix(in srgb,var(--accent) 25%,transparent),color-mix(in srgb,var(--accent) 5%,transparent))}.bg-accent-faint{background-color:color-mix(in srgb,var(--accent) 10%,transparent)}.border-accent-muted{border-color:color-mix(in srgb,var(--accent) 30%,transparent)}.text-status-pass{color:color-mix(in srgb,var(--colour-success) 60%,var(--star))}.text-status-warn{color:color-mix(in srgb,var(--colour-warning) 60%,var(--star))}.text-status-fail{color:color-mix(in srgb,var(--colour-danger) 60%,var(--star))}.text-status-info{color:color-mix(in srgb,var(--colour-info) 60%,var(--star))}.bg-status-pass{background-color:color-mix(in srgb,var(--colour-success) 15%,var(--space))}.bg-status-warn{background-color:color-mix(in srgb,var(--colour-warning) 15%,var(--space))}.bg-status-fail{background-color:color-mix(in srgb,var(--colour-danger) 15%,var(--space))}.bg-status-info{background-color:color-mix(in srgb,var(--colour-info) 15%,var(--space))}.border-status-pass{border-color:color-mix(in srgb,var(--colour-success) 30%,var(--nebula))}.border-status-warn{border-color:color-mix(in srgb,var(--colour-warning) 30%,var(--nebula))}.border-status-fail{border-color:color-mix(in srgb,var(--colour-danger) 30%,var(--nebula))}.dot-pass{background-color:var(--colour-success)}.dot-fail{background-color:var(--colour-danger)}.dot-unknown{background-color:var(--dim)}.htmx-indicator{opacity:0}.htmx-request .htmx-indicator,.htmx-request.htmx-indicator{opacity:1;transition:opacity 200ms ease-in}.btn{transition:all .15s ease;overflow:hidden}.btn::before{content:"";position:absolute;top:0;left:-100%;width:100%;height:100%;background:linear-gradient(90deg,transparent,rgba(255,255,255,.1),transparent);transition:left .5s ease}.btn:hover::before{left:100%}.btn:hover{transform:translateY(-1px)}.btn:active{transform:translateY(0)}.btn-glow:hover{box-shadow:0 0 25px var(--accent-glow)}.btn,.link-underline{position:relative}.link-underline::after{content:"";position:absolute;bottom:-2px;left:0;width:0;height:2px;background:var(--accent);box-shadow:0 0 10px var(--accent-glow);transition:width .3s ease}.link-underline:focus::after,.link-underline:hover::after{width:100%}.link-underline[aria-current=page]::after{width:100%}#main-content:focus,.link-underline:focus{outline:0}.footer-columns{display:grid;grid-template-columns:repeat(auto-fit,minmax(10rem,1fr));gap:2rem}.focus-ring:focus{outline:0;box-shadow:0 0 0 3px var(--accent-glow)}.icon-hover svg{transition:transform .3s ease,filter .3s ease}.icon-hover:focus svg,.icon-hover:hover svg{transform:translateX(4px);filter:drop-shadow(0 0 4px var(--accent-glow))}.tag-hover{transition:all .2s ease}.tag-hover:hover{transform:scale(1.05);box-shadow:0 0 15px var(--accent-glow)}a.tag-link{text-decoration:none;cursor:pointer}a.tag-link:hover{color:var(--star)}.spinner{animation:spin 1s linear infinite}.pulse-glow{position:relative}.gradient-border::before,.pulse-glow::after{content:"";position:absolute;inset:0;border-radius:inherit;pointer-events:none}.pulse-glow::after{box-shadow:0 0 35px var(--accent-glow);animation:accentPulse 3s ease-in-out infinite}.animate-gentle-ping{animation:gentlePing 4s ease-out infinite}.icon-rotate svg,.scale-hover{transition:transform .3s ease}.scale-hover:hover{transform:scale(1.02)}.gradient-border,.streak-hover{position:relative}.gradient-border::before{padding:1px;background:linear-gradient(135deg,var(--accent),var(--accent-dark));-webkit-mask:linear-gradient(#fff 0 0) content-box,linear-gradient(#fff 0 0);mask:linear-gradient(#fff 0 0) content-box,linear-gradient(#fff 0 0);-webkit-mask-composite:xor;mask-composite:exclude;opacity:0;transition:opacity .3s ease}.gradient-border:hover::before{opacity:1}.icon-rotate:hover svg{transform:rotate(15deg)}.text-shimmer:hover{background:linear-gradient(90deg,var(--accent) 0%,var(--accent-light) 50%,var(--accent) 100%);background-size:200%auto;-webkit-background-clip:text;-webkit-text-fill-color:transparent;background-clip:text;animation:shimmer 2s linear infinite}.streak-hover{overflow:hidden}.streak-hover::after{content:"";position:absolute;top:50%;left:50%;width:0;height:0;background:radial-gradient(circle,var(--accent-glow) 0%,transparent 70%);transform:translate(-50%,-50%);transition:width .5s ease,height .5s ease}.streak-hover:hover::after{width:300px;height:300px}.fade-in{animation:warpIn .4s ease forwards}.scanlines::before{content:"";position:fixed;top:0;left:0;width:100%;height:100%;pointer-events:none;z-index:9998;background:repeating-linear-gradient(0deg,transparent,transparent 2px,rgba(0,0,0,.1) 2px,rgba(0,0,0,.1) 4px);animation:scanlineScroll 8s linear infinite}.pixel-trail{position:relative}.pixel-trail::after,.pixel-trail::before{content:"";position:absolute;width:var(--pixel-size);height:var(--pixel-size);background:var(--accent);opacity:0;transition:opacity .1s steps(2),transform .2s steps(4)}.pixel-trail::before{top:0;left:0}.pixel-trail::after{bottom:0;right:0}.pixel-trail:hover::before{opacity:.6;transform:translate(-8px,-8px)}.pixel-trail:hover::after{opacity:.6;transform:translate(8px,8px)}.pixel-motion{transition-timing-function:steps(6,end)!important}.pixel-glow:hover{box-shadow:4px 0 0 0 var(--accent),-4px 0 0 0 var(--accent),0 4px 0 0 var(--accent),0-4px 0 0 var(--accent)}.crt-flicker{animation:crtFlicker 4s ease-in-out infinite}.pixel-cursor-trail{position:fixed;width:6px;height:6px;background:var(--accent);pointer-events:none;z-index:9999;opacity:.5}.settings-panel{backdrop-filter:blur(12px);background:color-mix(in srgb,var(--space) 95%,transparent);border:1px solid color-mix(in srgb,var(--nebula) 80%,transparent)}.settings-panel-body{max-height:calc(100vh - 10rem);overflow-y:auto;scrollbar-width:thin;scrollbar-color:var(--accent) transparent}.settings-panel-body::-webkit-scrollbar{width:4px}.settings-panel-body::-webkit-scrollbar-track{background:0 0}.settings-panel-body::-webkit-scrollbar-thumb{background:var(--nebula);border-radius:2px}.project-detail-panel::-webkit-scrollbar-thumb:hover,.settings-panel-body::-webkit-scrollbar-thumb:hover,.settings-scrollbar::-webkit-scrollbar-thumb:hover{background:var(--accent)}.settings-customise-panel{border-top:1px solid color-mix(in srgb,var(--nebula) 50%,transparent)}.bar-w-5{width:5%}.bar-w-10{width:10%}.bar-w-15{width:15%}.bar-w-20{width:20%}.bar-w-25{width:25%}.bar-w-30{width:30%}.bar-w-35{width:35%}.bar-w-40{width:40%}.bar-w-45{width:45%}.bar-w-50{width:50%}.bar-w-55{width:55%}.bar-w-60{width:60%}.bar-w-65{width:65%}.bar-w-70{width:70%}.bar-w-75{width:75%}.bar-w-80{width:80%}.bar-w-85{width:85%}.bar-w-90{width:90%}.bar-w-95{width:95%}.bar-w-97{width:97%}.bar-w-99{width:99%}.bar-w-100{width:100%}@media (max-width:639px){#settings-panel{inset-inline:0;bottom:0;width:100%;right:auto;border-radius:12px 12px 0 0}.settings-panel-body{max-height:calc(100vh - 6rem)}}@media (max-width:374px){.settings-section .grid{gap:6px}}.settings-section{border-bottom:1px solid rgba(255,255,255,.05)}.settings-option{transition:all .15s ease}.settings-option:hover{background:rgba(255,255,255,.05)}.settings-option.active{background:var(--accent-glow);border-color:var(--accent)}.colour-swatch,.palette-swatch{border-radius:6px;border:2px solid transparent;cursor:pointer;transition:transform .15s ease,border-color .15s ease}.colour-swatch{width:32px;height:32px}.colour-swatch:hover{transform:scale(1.15)}.colour-swatch.active{border-color:var(--star);transform:scale(1.1)}.palette-swatch{width:100%;aspect-ratio:1}.palette-swatch:hover{transform:scale(1.1)}.palette-swatch.active{border-color:var(--accent);transform:scale(1.05)}.settings-gear{transition:transform .3s ease}.settings-gear:hover{transform:rotate(45deg)}.settings-gear.open{transform:rotate(180deg)}.settings-btn{z-index:99999;box-shadow:0 4px 20px rgba(0,0,0,.5)}.settings-btn:hover{box-shadow:0 4px 30px var(--accent-glow),0 0 15px var(--accent-glow)}.theme-swatch,.theme-swatch-lg{cursor:pointer;transition:transform .15s ease,ring-color .15s ease;border-radius:8px}.theme-swatch:hover{transform:scale(1.1)}.theme-swatch-lg{padding:4px;transition:transform .15s ease}.theme-swatch-lg:hover{transform:scale(1.03)}.swatch-preview{aspect-ratio:16/9}.swatch-theme-hyperspace{background:#030305}.swatch-theme-nordic-rust{background:#0f172a}.swatch-theme-forest-security{background:#052e16}.swatch-theme-bold-purple{background:#1e1b4b}.swatch-theme-warm-amber{background:#1c1917}.swatch-theme-daylight{background:#fff}.swatch-palette-hyperspace{background:linear-gradient(135deg,#0a0a12,#030305 50%,#12121a)}.swatch-palette-nordic-rust{background:linear-gradient(135deg,#1e293b,#0f172a 50%,#334155)}.swatch-palette-forest-security{background:linear-gradient(135deg,#14532d,#052e16 50%,#166534)}.swatch-palette-bold-purple{background:linear-gradient(135deg,#312e81,#1e1b4b 50%,#4338ca)}.swatch-palette-warm-amber{background:linear-gradient(135deg,#292524,#1c1917 50%,#44403c)}.swatch-palette-daylight{background:linear-gradient(135deg,#faf8f5,#fff 50%,#e8e4de)}.swatch-accent-amber{background:#f59e0b}.swatch-accent-cyan{background:#06b6d4}.swatch-accent-emerald{background:#10b981}.swatch-accent-gold{background:#eab308}.swatch-accent-indigo{background:#6366f1}.swatch-accent-lavender{background:#a78bfa}.swatch-accent-off-white{background:#d4d4dc}.swatch-accent-pale-gold{background:#d4a574}.swatch-accent-rose{background:#f43f5e}.swatch-accent-rust{background:#d97f3f}.swatch-accent-silver-blue{background:#94a3b8}.swatch-accent-teal{background:#14b8a6}.font-preview-atkinson-hyperlegible{font-family:"Atkinson Hyperlegible",sans-serif}.font-preview-cascadia-code{font-family:"Cascadia Code",monospace}.font-preview-dm-sans{font-family:"DM Sans",sans-serif}.font-preview-fira-code{font-family:"Fira Code",monospace}.font-preview-ibm-plex-mono{font-family:"IBM Plex Mono",monospace}.font-preview-inter{font-family:"Inter",sans-serif}.font-preview-jetbrains-mono{font-family:"JetBrains Mono",monospace}.font-preview-nunito{font-family:"Nunito",sans-serif}.font-preview-outfit{font-family:"Outfit",sans-serif}.font-preview-plus-jakarta-sans{font-family:"Plus Jakarta Sans",sans-serif}.font-preview-source-code-pro{font-family:"Source Code Pro",monospace}.font-preview-space-grotesk{font-family:"Space Grotesk",sans-serif}.font-preview-syne{font-family:"Syne",sans-serif}.font-preview-system{font-family:system-ui,-apple-system,sans-serif}.font-preview-work-sans{font-family:"Work Sans",sans-serif}.settings-scrollbar{scrollbar-width:thin;scrollbar-color:var(--accent) transparent}.settings-scrollbar::-webkit-scrollbar{width:4px}.settings-scrollbar::-webkit-scrollbar-track{background:0 0}.settings-scrollbar::-webkit-scrollbar-thumb{background:var(--nebula);border-radius:2px}:focus-visible{outline:2px solid var(--accent);outline-offset:2px}:focus:not(:focus-visible){outline:0}.skip-link{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border-width:0}.skip-link:focus{width:auto;height:auto;top:1rem;left:1rem;padding:.5rem 1rem;margin:0;overflow:visible;clip:auto;white-space:normal;background-color:var(--accent);color:var(--void);border-radius:.5rem;z-index:50;font-weight:500}[x-cloak]{display:none!important}.pointer-events-none{pointer-events:none}.pointer-events-auto{pointer-events:auto}.scroll-mt-20{scroll-margin-top:5rem}.projects-layout{display:flex;flex-direction:row;min-height:0}.projects-grid-container{flex:1 1 100%;min-width:0;container-type:inline-size}.projects-grid{display:grid;gap:1.5rem;grid-template-columns:1fr}@container (min-width: 480px){.projects-grid{grid-template-columns:repeat(2,1fr)}}@container (min-width: 768px){.projects-grid{grid-template-columns:repeat(3,1fr)}}.project-detail-panel{background:var(--space);border-left:1px solid var(--nebula);scrollbar-width:thin;scrollbar-color:var(--accent) transparent}.project-detail-panel::-webkit-scrollbar{width:4px}.project-detail-panel::-webkit-scrollbar-track{background:0 0}.project-detail-panel::-webkit-scrollbar-thumb{background:var(--nebula);border-radius:2px}@media (min-width:1024px){.project-detail-panel{position:sticky;top:4rem;height:calc(100vh - 4rem);flex-shrink:0;width:0;overflow:hidden;opacity:0;transition:width .25s ease,opacity .2s ease}.project-detail-panel.project-panel-visible-desktop{width:32rem;opacity:1;overflow-y:auto;overscroll-behavior-y:auto}}@media (max-width:1023px){.project-detail-panel{position:fixed;top:0;right:0;height:100%;width:100%;max-width:32rem;z-index:50;overflow-y:auto;transform:translateX(100%);transition:transform .2s ease}.project-detail-panel.project-panel-visible{transform:translateX(0)}}@media (max-width:639px){.project-detail-panel{max-width:100%}}.project-backdrop{display:none}@media (max-width:1023px){.project-backdrop{display:block;position:fixed;inset:0;z-index:40;background:var(--void);opacity:.6}}.panel-open-mobile{overflow:hidden}