@font-face{font-family:Space Grotesk Variable;font-style:normal;font-display:swap;font-weight:300 700;src:url(/_astro/space-grotesk-vietnamese-wght-normal.D0rl6rjA.woff2)format("woff2-variations");unicode-range:U+102-103,U+110-111,U+128-129,U+168-169,U+1A0-1A1,U+1AF-1B0,U+300-301,U+303-304,U+308-309,U+323,U+329,U+1EA0-1EF9,U+20AB}@font-face{font-family:Space Grotesk Variable;font-style:normal;font-display:swap;font-weight:300 700;src:url(/_astro/space-grotesk-latin-ext-wght-normal.D9tNdqV9.woff2)format("woff2-variations");unicode-range:U+100-2BA,U+2BD-2C5,U+2C7-2CC,U+2CE-2D7,U+2DD-2FF,U+304,U+308,U+329,U+1D00-1DBF,U+1E00-1E9F,U+1EF2-1EFF,U+2020,U+20A0-20AB,U+20AD-20C0,U+2113,U+2C60-2C7F,U+A720-A7FF}@font-face{font-family:Space Grotesk Variable;font-style:normal;font-display:swap;font-weight:300 700;src:url(/_astro/space-grotesk-latin-wght-normal.BhU9QXUp.woff2)format("woff2-variations");unicode-range:U+??,U+131,U+152-153,U+2BB-2BC,U+2C6,U+2DA,U+2DC,U+304,U+308,U+329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}@font-face{font-family:JetBrains Mono Variable;font-style:normal;font-display:swap;font-weight:100 800;src:url(data:font/woff2;base64,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)format("woff2-variations");unicode-range:U+460-52F,U+1C80-1C8A,U+20B4,U+2DE0-2DFF,U+A640-A69F,U+FE2E-FE2F}@font-face{font-family:JetBrains Mono Variable;font-style:normal;font-display:swap;font-weight:100 800;src:url(/_astro/jetbrains-mono-cyrillic-wght-normal.D73BlboJ.woff2)format("woff2-variations");unicode-range:U+301,U+400-45F,U+490-491,U+4B0-4B1,U+2116}@font-face{font-family:JetBrains Mono Variable;font-style:normal;font-display:swap;font-weight:100 800;src:url(/_astro/jetbrains-mono-greek-wght-normal.Bw9x6K1M.woff2)format("woff2-variations");unicode-range:U+370-377,U+37A-37F,U+384-38A,U+38C,U+38E-3A1,U+3A3-3FF}@font-face{font-family:JetBrains Mono Variable;font-style:normal;font-display:swap;font-weight:100 800;src:url(/_astro/jetbrains-mono-vietnamese-wght-normal.Bt-aOZkq.woff2)format("woff2-variations");unicode-range:U+102-103,U+110-111,U+128-129,U+168-169,U+1A0-1A1,U+1AF-1B0,U+300-301,U+303-304,U+308-309,U+323,U+329,U+1EA0-1EF9,U+20AB}@font-face{font-family:JetBrains Mono Variable;font-style:normal;font-display:swap;font-weight:100 800;src:url(/_astro/jetbrains-mono-latin-ext-wght-normal.DBQx-q_a.woff2)format("woff2-variations");unicode-range:U+100-2BA,U+2BD-2C5,U+2C7-2CC,U+2CE-2D7,U+2DD-2FF,U+304,U+308,U+329,U+1D00-1DBF,U+1E00-1E9F,U+1EF2-1EFF,U+2020,U+20A0-20AB,U+20AD-20C0,U+2113,U+2C60-2C7F,U+A720-A7FF}@font-face{font-family:JetBrains Mono Variable;font-style:normal;font-display:swap;font-weight:100 800;src:url(/_astro/jetbrains-mono-latin-wght-normal.B9CIFXIH.woff2)format("woff2-variations");unicode-range:U+??,U+131,U+152-153,U+2BB-2BC,U+2C6,U+2DA,U+2DC,U+304,U+308,U+329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}:root{color-scheme:light dark;--bg:oklch(97.5% .003 90);--surface:oklch(100% 0 0);--text:oklch(24% .015 260);--muted:oklch(48% .02 260);--border:oklch(89% .008 260);--accent:oklch(55% .16 240);--accent-soft:oklch(55% .16 240/.1);--accent-fg:oklch(15% .02 260);--term-bg:oklch(21% .02 260);--term-border:oklch(30% .02 260);--term-text:oklch(88% .015 260);--term-muted:oklch(60% .02 260);--font-sans:"Space Grotesk Variable", ui-sans-serif, system-ui, -apple-system, sans-serif;--font-mono:"JetBrains Mono Variable", ui-monospace, "SF Mono", Menlo, monospace;--shadow-card:0 1px 3px 0 oklch(20% .02 260/.08), 0 8px 24px -12px oklch(20% .02 260/.15)}@media (prefers-color-scheme:dark){:root{--bg:oklch(16% .013 260);--surface:oklch(21% .017 260);--text:oklch(93% .01 260);--muted:oklch(67% .02 260);--border:oklch(30% .02 260);--accent:oklch(78% .13 200);--accent-soft:oklch(78% .13 200/.12)}}*,:before,:after{box-sizing:border-box}*{margin:0}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;text-decoration:none}html{scroll-behavior:smooth}body{background-color:var(--bg);min-height:100dvh;color:var(--text);font-family:var(--font-sans);text-underline-offset:.2em;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;flex-direction:column;line-height:1.5;display:flex;overflow-x:clip}::selection{background-color:var(--accent);color:var(--bg)}code{font-family:var(--font-mono);color:var(--accent);background-color:var(--accent-soft);border-radius:.25rem;padding:.125rem .375rem;font-size:.85em;font-style:italic}.site-header{z-index:10;border-bottom:1px solid var(--border);background-color:color-mix(in oklch, var(--bg) 80%, transparent);backdrop-filter:blur(8px);position:sticky;top:0}.header-inner{justify-content:space-between;align-items:center;width:100%;max-width:48rem;height:3.5rem;margin-inline:auto;padding-inline:1rem;display:flex}.brand{font-family:var(--font-mono);letter-spacing:-.025em;font-size:.875rem;font-weight:600;transition:color .15s}.brand:hover,.brand-prompt{color:var(--accent)}.site-nav{font-family:var(--font-mono);align-items:center;font-size:.8125rem;display:flex}.nav-link{color:var(--muted);border-radius:.25rem;padding:.25rem .5rem;transition:color .15s,background-color .15s}.nav-link:hover{color:var(--text)}.nav-link[aria-current=page]{background-color:var(--accent-soft);color:var(--accent)}.site-main{flex:1;width:100%;max-width:48rem;margin-inline:auto;padding:2.5rem 1.25rem}.site-footer{border-top:1px solid var(--border);margin-top:auto}.footer-inner{width:100%;max-width:48rem;font-family:var(--font-mono);color:var(--muted);flex-direction:column;justify-content:space-between;align-items:center;gap:.5rem;margin-inline:auto;padding:1.5rem 1.25rem;font-size:.75rem;display:flex}.footer-link{text-decoration:underline;text-decoration-color:var(--border);text-underline-offset:4px;transition:color .15s}.footer-link:before{content:"❯ ";color:var(--accent)}.footer-link:hover{color:var(--text)}@media (width>=40rem){.header-inner{padding-inline:1.25rem}.site-nav{gap:.25rem;font-size:.875rem}.nav-link{padding:.25rem .625rem}.footer-inner{flex-direction:row}}.bg-glow{position:relative}.bg-glow:before{content:"";background:radial-gradient(40rem 14rem ellipse at 30% 0%, color-mix(in oklch, var(--accent) 14%, transparent), transparent 70%);pointer-events:none;z-index:0;height:24rem;position:absolute;inset:-40% -20% auto}.bg-glow>*{position:relative}.term{border:1px solid var(--term-border);background-color:var(--term-bg);font-family:var(--font-mono);box-shadow:var(--shadow-card);border-radius:.75rem;font-size:.9rem;overflow:hidden}.term-bar{border-bottom:1px solid var(--term-border);align-items:center;gap:.375rem;padding:.75rem 1rem;display:flex}.term-dot{border-radius:9999px;width:.75rem;height:.75rem}.term-dot:first-child{background-color:oklch(65% .2 30)}.term-dot:nth-child(2){background-color:oklch(75% .15 90)}.term-dot:nth-child(3){background-color:oklch(72% .17 150)}.term-title{color:var(--term-muted);margin-left:.75rem;font-size:.75rem}.term-body{color:var(--term-text);padding:1.25rem;line-height:1.625}.term-body p+p{margin-top:.5rem}.term-response{margin-left:1rem}.prompt{color:var(--term-muted)}.prompt:before{content:"rob@rob-watson.uk";color:var(--accent)}.term-cursor{background-color:var(--accent);border-radius:1px;width:.625rem;height:1rem;margin-left:.25rem;animation:1.1s steps(2,start) infinite blink;display:inline-block;transform:translateY(.125rem)}@keyframes blink{to{visibility:hidden}}@media (width>=40rem){.term-body{padding-inline:1.5rem}}.hero-intro{color:var(--muted);margin-top:2rem;line-height:1.625}.btn-row{flex-wrap:wrap;gap:.75rem;margin-top:1.5rem;display:flex}.btn{font-family:var(--font-mono);border-radius:.5rem;padding:.625rem 1rem;font-size:.875rem;font-weight:500;transition:opacity .15s,color .15s,border-color .15s;display:inline-block}.btn-primary{background-color:var(--accent);color:var(--accent-fg)}.btn-primary:hover{opacity:.85}.btn-secondary{border:1px solid var(--border);color:var(--muted)}.btn-secondary:hover{border-color:var(--accent);color:var(--accent)}.card-grid{gap:1rem;margin-top:4rem;display:grid}.card{border:1px solid var(--border);background-color:var(--surface);box-shadow:var(--shadow-card);border-radius:.75rem;padding:1.25rem;transition:border-color .15s}.card:hover{border-color:color-mix(in oklch, var(--accent) 50%, transparent)}.card-label{font-family:var(--font-mono);color:var(--accent);font-size:.75rem}.card-title{margin-top:.5rem;font-size:1rem;font-weight:600}.card-body{color:var(--muted);margin-top:.5rem;font-size:.875rem;line-height:1.625}@media (width>=40rem){.card-grid{grid-template-columns:repeat(3,1fr)}}.page-title{font-family:var(--font-mono);letter-spacing:-.025em;font-size:1.875rem;font-weight:700}.page-title:before{content:"❯";color:var(--accent);margin-right:.5ch}.section-heading{font-family:var(--font-mono);letter-spacing:.025em;color:var(--muted);font-size:.875rem;font-weight:400}.section-heading:before{content:"❯";color:var(--accent);margin-right:.5ch}.article{margin-top:2.5rem}.article>*+*{margin-top:3rem}.article p{max-width:65ch;color:color-mix(in oklch, var(--text) 90%, transparent);line-height:1.625}.article h2+p,.article p+p{margin-top:1rem}.article-lead{color:var(--muted)}.link{color:var(--accent);text-decoration:underline;text-decoration-color:color-mix(in oklch, var(--accent) 40%, transparent);text-underline-offset:4px;transition:text-decoration-color .15s}.link:hover{text-decoration-color:var(--accent)}@media (width>=40rem){.page-title{font-size:2.25rem}}.contact-list{max-width:65ch;color:var(--muted);margin-top:2.5rem;line-height:1.625}.contact-list>*+*{margin-top:1.5rem}.contact-list strong{color:var(--text);font-weight:inherit}.contact-card{border:1px solid var(--border);background-color:var(--surface);box-shadow:var(--shadow-card);border-radius:.75rem;padding:1.5rem;transition:border-color .15s;display:block}.contact-card:hover{border-color:var(--accent)}.contact-card-label{font-family:var(--font-mono);color:var(--muted);font-size:.75rem}.contact-card-handle{font-family:var(--font-mono);color:var(--accent);align-items:baseline;gap:.5rem;margin-top:.5rem;font-size:1.25rem;font-weight:600;display:flex}.contact-card-handle:after{content:"→"}.contact-card-url{margin-top:.5rem;font-size:.875rem;line-height:1.625}.notfound{text-align:center;font-family:var(--font-mono);padding:4rem 0}.notfound-code{letter-spacing:-.025em;font-size:3.75rem;font-weight:700}.notfound-code:before,.notfound-code:after{content:"4";color:var(--accent)}.notfound-code+.notfound-line{margin-top:1.5rem}.notfound-line+.notfound-line{margin-top:.5rem}.notfound-line{color:var(--muted)}.notfound .btn-secondary{margin-top:2.5rem}@media (width>=40rem){.notfound-code{font-size:4.5rem}}@media (prefers-reduced-motion:reduce){html{scroll-behavior:auto}.term-cursor{animation:none}}
