:root{--slate-950:#0a0c10;--slate-900:#0f131a;--slate-850:#141922;--slate-800:#1a2029;--slate-750:#212934;--slate-700:#2a333f;--slate-600:#3b4653;--slate-500:#566373;--slate-400:#798696;--slate-300:#a3aebc;--slate-200:#c8d0da;--slate-100:#e5e9ef;--slate-50:#f4f6f9;--lime-700:#6f9410;--lime-600:#8bb51f;--lime-500:#a9d92e;--lime-400:#c6f24e;--lime-300:#d8f882;--cyan-600:#1b93a8;--cyan-400:#3fd0e6;--red-500:#f0554e;--red-400:#ff756e;--amber-500:#f0a52b;--amber-400:#ffbe57;--green-500:#35c281;--green-400:#52e39c;color-scheme:dark;--surface-base:var(--slate-950);--surface-sunken:#06080b;--surface-raised:var(--slate-900);--surface-card:var(--slate-850);--surface-inset:var(--slate-800);--surface-hover:var(--slate-750);--text-strong:var(--slate-50);--text-body:var(--slate-200);--text-muted:var(--slate-400);--text-faint:var(--slate-500);--text-accent:var(--lime-400);--text-link:var(--cyan-400);--border-subtle:#ffffff14;--border-default:#ffffff1f;--border-strong:#ffffff33;--border-accent:var(--lime-400);--accent:var(--lime-400);--accent-hover:var(--lime-300);--accent-press:var(--lime-500);--accent-quiet:#c6f24e1f;--accent-on:var(--slate-950);--accent-glow:0 0 0 1px #c6f24e40, 0 0 24px -4px #c6f24e66;--success:var(--green-400);--warning:var(--amber-400);--danger:var(--red-400);--focus-ring:0 0 0 2px var(--surface-base), 0 0 0 4px var(--lime-400);--selection-bg:#c6f24e33;--shadow-lg:0 12px 32px -6px #00000080, 0 4px 10px -4px #0000005c;--font-display:'Space Grotesk', 'Segoe UI', system-ui, sans-serif;--font-body:'IBM Plex Sans', 'Segoe UI', system-ui, sans-serif;--font-mono:'JetBrains Mono', ui-monospace, 'SF Mono', Menlo, monospace;--radius-xs:3px;--radius-sm:5px;--radius-md:7px;--radius-lg:10px;--radius-xl:14px;--radius-pill:999px;--ease-out:cubic-bezier(0.22, 0.61, 0.36, 1);--dur-fast:120ms;--dur-base:200ms}[data-theme=light]{color-scheme:light;--surface-base:#f7f9fb;--surface-sunken:#eef1f5;--surface-raised:#ffffff;--surface-card:#ffffff;--surface-inset:#eef1f5;--surface-hover:#eaeef3;--text-strong:#0f131a;--text-body:#2a333f;--text-muted:#566373;--text-faint:#798696;--text-accent:#6f9410;--text-link:#1b93a8;--border-subtle:#0a0c1010;--border-default:#0a0c101f;--border-strong:#0a0c1033;--border-accent:var(--lime-600);--accent:#8bb51f;--accent-hover:#a9d92e;--accent-press:#6f9410;--accent-quiet:#8bb51f1f;--accent-on:#0a0c10;--accent-glow:0 0 0 1px #8bb51f40, 0 0 20px -6px #8bb51f80;--success:var(--green-500);--warning:var(--amber-500);--danger:var(--red-500);--focus-ring:0 0 0 2px var(--surface-base), 0 0 0 4px var(--lime-600);--selection-bg:#8bb51f33}*,*::before,*::after{box-sizing:border-box}html{font-family:var(--font-body);font-size:15px;line-height:1.5;-webkit-font-smoothing:antialiased;text-rendering:optimizeLegibility}body{margin:0;min-height:100vh;display:flex;flex-direction:column;background:var(--surface-base);color:var(--text-body)}main{flex:1}::selection{background:var(--selection-bg)}::-webkit-scrollbar{width:10px;height:10px}::-webkit-scrollbar-thumb{background:var(--slate-700);border-radius:999px}a:focus-visible,button:focus-visible,input:focus-visible{outline:none;box-shadow:var(--focus-ring)}.wrap{max-width:900px;margin:0 auto;padding-left:28px;padding-right:28px}@keyframes ledpulse{0%{box-shadow:0 0 color-mix(in srgb,var(--accent) 55%,transparent)}70%{box-shadow:0 0 0 7px transparent}100%{box-shadow:0 0 transparent}}@media(prefers-reduced-motion:reduce){*,*::before,*::after{animation:none!important;transition:none!important}}.site-header{position:sticky;top:0;z-index:100;display:flex;align-items:center;justify-content:space-between;gap:16px;min-height:64px;padding:8px 28px;flex-wrap:wrap;background:color-mix(in srgb,var(--surface-base) 82%,transparent);backdrop-filter:blur(10px);border-bottom:1px solid var(--border-subtle)}.logo{display:flex;align-items:center;gap:10px;text-decoration:none}.logo .led{width:11px;height:11px;border-radius:50%;background:var(--accent);box-shadow:0 0 12px -1px var(--accent);animation:ledpulse 2.4s var(--ease-out)infinite}.logo .wordmark{font-family:var(--font-display);font-weight:700;font-size:18px;letter-spacing:-.03em;color:var(--text-strong)}.logo .wordmark span{color:var(--text-faint);font-weight:500}.site-nav{display:flex;align-items:center;gap:26px;flex-wrap:wrap}.site-nav a{font-family:var(--font-display);font-size:14px;font-weight:500;text-decoration:none;color:var(--text-muted);transition:color var(--dur-fast)var(--ease-out)}.site-nav a:hover,.site-nav a[aria-current=page]{color:var(--text-strong)}.header-actions{display:flex;align-items:center;gap:10px}.theme-toggle{width:36px;height:36px;display:grid;place-items:center;background:var(--surface-card);border:1px solid var(--border-default);border-radius:var(--radius-md);color:var(--text-body);cursor:pointer;padding:0;transition:background var(--dur-fast)var(--ease-out),border-color var(--dur-fast)var(--ease-out)}.theme-toggle:hover{background:var(--surface-hover);border-color:var(--border-strong)}.theme-toggle:active{transform:translateY(1px)}.theme-toggle .icon-moon{display:none}[data-theme=light] .theme-toggle .icon-sun{display:none}[data-theme=light] .theme-toggle .icon-moon{display:block}.header-repo{display:flex;align-items:center;gap:7px;height:36px;padding:0 14px;background:var(--surface-card);border:1px solid var(--border-default);border-radius:var(--radius-md);font-family:var(--font-display);font-size:13px;font-weight:500;color:var(--text-body);text-decoration:none;transition:background var(--dur-fast)var(--ease-out),border-color var(--dur-fast)var(--ease-out)}.header-repo:hover{background:var(--surface-hover);border-color:var(--border-strong)}.eyebrow{font-family:var(--font-mono);font-size:12px;letter-spacing:.14em;text-transform:uppercase;color:var(--accent);margin-bottom:14px}.page-head{padding-top:64px}.page-title{margin:0 0 8px;font-family:var(--font-display);font-weight:700;font-size:clamp(30px,6vw,42px);letter-spacing:-.03em;line-height:1.05;color:var(--text-strong)}.page-lede{margin:0 0 38px;font-size:17px;color:var(--text-muted);max-width:560px}.mono-note{font-family:var(--font-mono);font-size:13px;color:var(--text-faint)}.hero{padding-top:88px;padding-bottom:40px}.hero .eyebrow{margin-bottom:22px}.hero h1{margin:0;font-family:var(--font-display);font-weight:700;font-size:clamp(40px,8.5vw,66px);line-height:1.02;letter-spacing:-.035em;color:var(--text-strong);max-width:780px}.hero .subtitle{margin:24px 0 0;font-size:19px;line-height:1.6;color:var(--text-body);max-width:560px}.hero .tagline{margin:10px 0 0;font-family:var(--font-mono);font-size:13px;color:var(--text-faint)}.hero-actions{display:flex;gap:12px;margin-top:34px;flex-wrap:wrap}.hero-meta{margin-top:30px;font-family:var(--font-mono);font-size:12px;color:var(--text-faint);display:flex;gap:18px;flex-wrap:wrap}.btn{display:inline-flex;align-items:center;gap:8px;height:44px;padding:0 20px;border-radius:var(--radius-md);font-family:var(--font-display);font-size:15px;text-decoration:none;cursor:pointer;transition:background var(--dur-base)var(--ease-out),border-color var(--dur-base)var(--ease-out),box-shadow var(--dur-base)var(--ease-out)}.btn:active{transform:translateY(1px)}.btn-primary{background:var(--accent);color:var(--accent-on);border:none;font-weight:600}.btn-primary:hover{background:var(--accent-hover);box-shadow:var(--accent-glow)}.btn-secondary{background:var(--surface-card);color:var(--text-body);border:1px solid var(--border-default);font-weight:500}.btn-secondary:hover{background:var(--surface-hover);border-color:var(--border-strong)}.btn-chip{display:inline-flex;align-items:center;height:40px;padding:0 16px;background:var(--surface-card);border:1px solid var(--border-default);border-radius:var(--radius-md);font-family:var(--font-mono);font-size:13px;color:var(--text-body);text-decoration:none;transition:background var(--dur-fast)var(--ease-out),border-color var(--dur-fast)var(--ease-out)}.btn-chip:hover{background:var(--surface-hover);border-color:var(--border-strong)}.section-head{display:flex;align-items:baseline;justify-content:space-between;margin-bottom:6px;border-bottom:1px solid var(--border-subtle);padding-bottom:14px}.section-head h2{margin:0;font-family:var(--font-display);font-size:22px;font-weight:600;letter-spacing:-.02em;color:var(--text-strong)}.section-head .more{font-family:var(--font-mono);font-size:12px;color:var(--text-muted);text-decoration:none}.section-head .more:hover{color:var(--text-strong)}.post-list{display:flex;flex-direction:column}.post-row{display:flex;align-items:baseline;gap:20px;padding:18px 4px;border-bottom:1px solid var(--border-subtle);text-decoration:none;transition:background var(--dur-fast)var(--ease-out)}.post-row:hover{background:var(--surface-raised)}.post-row .date{font-family:var(--font-mono);font-size:12px;color:var(--text-faint);width:92px;flex-shrink:0}.post-row .body{flex:1;min-width:0}.post-row .title{display:block;font-family:var(--font-display);font-size:17px;font-weight:500;color:var(--text-strong);letter-spacing:-.01em}.post-row .summary{display:block;font-size:14px;color:var(--text-muted);margin-top:4px}.post-row .mins{font-family:var(--font-mono);font-size:11px;color:var(--text-faint);flex-shrink:0}.post-row.compact{padding:12px 4px;gap:18px}.post-row.compact .date{width:56px}.post-row.compact .title{font-size:16px}.archive-year{font-family:var(--font-display);font-size:15px;font-weight:600;color:var(--text-faint);padding:18px 0 8px;letter-spacing:-.01em}.post{max-width:760px;margin:0 auto;padding:56px 28px 0}.backlink{font-family:var(--font-mono);font-size:12px;color:var(--text-muted);text-decoration:none;display:inline-block;margin-bottom:26px}.backlink:hover{color:var(--text-strong)}.post-meta{display:flex;align-items:center;gap:12px;font-family:var(--font-mono);font-size:12px;color:var(--text-faint);margin-bottom:14px;flex-wrap:wrap}.post-title{margin:0 0 20px;font-family:var(--font-display);font-weight:700;font-size:clamp(30px,6vw,40px);line-height:1.08;letter-spacing:-.03em;color:var(--text-strong)}.post-tags{display:flex;gap:8px;flex-wrap:wrap;margin-bottom:34px}.tag-pill{font-family:var(--font-mono);font-size:11px;letter-spacing:.04em;color:var(--text-muted);background:var(--surface-card);border:1px solid var(--border-subtle);border-radius:var(--radius-pill);padding:4px 11px;text-decoration:none;transition:border-color var(--dur-fast)var(--ease-out),color var(--dur-fast)var(--ease-out)}a.tag-pill:hover{border-color:var(--border-accent);color:var(--text-strong)}.post-footer{display:flex;align-items:center;gap:12px;margin:44px 0 0;padding:22px 0;border-top:1px solid var(--border-subtle);flex-wrap:wrap;font-family:var(--font-mono);font-size:12px}.post-footer .label{color:var(--text-faint)}.post-footer a{color:var(--text-link);text-decoration:none}.post-footer a:hover{text-decoration:underline}.post-footer .edit{margin-left:auto;color:var(--text-muted)}.post-footer button{font-family:var(--font-mono);font-size:12px;color:var(--text-link);background:0 0;border:none;padding:0;cursor:pointer}.post-license{font-family:var(--font-mono);font-size:11px;color:var(--text-faint);padding:0 0 6px}.post-license a{color:var(--text-muted);text-decoration:none}.post-license a:hover{text-decoration:underline}.post-nav{display:flex;justify-content:space-between;gap:12px;padding:18px 0 0;border-top:1px solid var(--border-subtle);font-family:var(--font-mono);font-size:12px}.post-nav a{color:var(--text-muted);text-decoration:none;max-width:46%}.post-nav a:hover{color:var(--text-strong)}.prose{color:var(--text-body);font-size:17px;line-height:1.65}.prose>*:first-child{margin-top:0}.prose h1,.prose h2,.prose h3,.prose h4{font-family:var(--font-display);letter-spacing:-.015em;color:var(--text-strong)}.prose h1{font-size:28px;font-weight:700;margin:40px 0 14px;line-height:1.15}.prose h2{font-size:25px;font-weight:600;margin:40px 0 14px;line-height:1.2}.prose h3{font-size:20px;font-weight:600;margin:32px 0 10px}.prose p{margin:0 0 18px}.prose a{color:var(--text-link);text-decoration:none;border-bottom:1px solid color-mix(in srgb,var(--text-link) 35%,transparent)}.prose a:hover{border-bottom-color:var(--text-link)}.prose ul,.prose ol{margin:0 0 18px;padding-left:22px}.prose li{margin:0 0 8px}.prose strong{color:var(--text-strong);font-weight:600}.prose blockquote{margin:22px 0;padding:4px 20px;border-left:2px solid var(--accent);color:var(--text-muted)}.prose blockquote p{margin:0 0 8px}.prose code{font-family:var(--font-mono);font-size:.85em;background:var(--accent-quiet);color:var(--text-accent);padding:2px 6px;border-radius:var(--radius-xs)}.prose pre{background:#06080b!important;border:1px solid var(--border-subtle);border-radius:var(--radius-lg);padding:18px 20px;overflow-x:auto;margin:0 0 20px}.prose pre code{background:0 0;color:var(--slate-100);padding:0;font-size:13px;line-height:1.6}.prose .highlight{position:relative;margin:0 0 20px}.prose .highlight pre{margin:0}.prose img{max-width:100%;height:auto;border:1px solid var(--border-subtle);border-radius:var(--radius-lg);margin:6px 0}.prose figure{margin:0 0 20px}.prose hr{border:none;border-top:1px solid var(--border-subtle);margin:32px 0}.prose table{border-collapse:collapse;margin:0 0 20px;width:100%}.prose th,.prose td{border:1px solid var(--border-default);padding:8px 12px;text-align:left}.prose th{font-family:var(--font-display);color:var(--text-strong);background:var(--surface-raised)}.prose details summary{cursor:pointer;font-family:var(--font-display);color:var(--text-strong)}.copy-code{position:absolute;top:8px;right:8px;font-family:var(--font-mono);font-size:11px;color:var(--text-muted);background:var(--slate-850);border:1px solid var(--border-default);border-radius:var(--radius-sm);padding:3px 9px;cursor:pointer;opacity:0;transition:opacity var(--dur-fast)var(--ease-out)}.prose .highlight:hover .copy-code,.prose pre:hover+.copy-code,.copy-code:focus-visible{opacity:1}.tag-cloud{display:flex;gap:10px;flex-wrap:wrap}.tag-card{display:inline-flex;align-items:center;gap:8px;padding:8px 14px;background:var(--surface-card);border:1px solid var(--border-subtle);border-radius:var(--radius-pill);text-decoration:none;transition:background var(--dur-fast)var(--ease-out),border-color var(--dur-fast)var(--ease-out)}.tag-card:hover{border-color:var(--border-accent);background:var(--surface-hover)}.tag-card .name{font-family:var(--font-display);font-size:14px;font-weight:500;color:var(--text-strong)}.tag-card .count{font-family:var(--font-mono);font-size:11px;color:var(--accent)}.projects-wrap{max-width:1e3px;margin:0 auto;padding-left:28px;padding-right:28px}.project-grid{display:grid;grid-template-columns:repeat(2,1fr);gap:16px}.project-card{display:flex;flex-direction:column;background:var(--surface-card);border:1px solid var(--border-subtle);border-radius:var(--radius-xl);padding:22px;text-decoration:none;transition:transform var(--dur-base)var(--ease-out),box-shadow var(--dur-base)var(--ease-out),border-color var(--dur-base)var(--ease-out)}.project-card:hover{transform:translateY(-2px);box-shadow:var(--shadow-lg);border-color:var(--border-strong)}.project-card .card-top{display:flex;align-items:center;justify-content:space-between;margin-bottom:14px}.project-card .kind{font-family:var(--font-mono);font-size:11px;letter-spacing:.06em;text-transform:uppercase;color:var(--text-faint)}.project-card .dot{width:8px;height:8px;border-radius:50%}.project-card .dot.active{background:var(--success)}.project-card .dot.wip{background:var(--warning)}.project-card .dot.parked{background:var(--text-faint)}.project-card h3{margin:0 0 8px;font-family:var(--font-display);font-size:20px;font-weight:600;letter-spacing:-.02em;color:var(--text-strong)}.project-card p{margin:0 0 16px;font-size:14px;line-height:1.55;color:var(--text-muted);flex:1}.project-card .stack{display:flex;gap:6px;flex-wrap:wrap}.project-card .stack span{font-family:var(--font-mono);font-size:11px;color:var(--text-muted);background:var(--surface-inset);border-radius:var(--radius-sm);padding:3px 8px}.narrow{max-width:720px;margin:0 auto;padding-left:28px;padding-right:28px}.cv-links{display:flex;gap:10px;flex-wrap:wrap;margin:30px 0 34px}.contact-card{background:var(--surface-card);border:1px solid var(--border-subtle);border-radius:var(--radius-xl);padding:22px 24px;border-top:2px solid var(--accent)}.contact-card .card-label{font-family:var(--font-mono);font-size:11px;letter-spacing:.08em;text-transform:uppercase;color:var(--text-faint);margin-bottom:12px}.contact-row{display:flex;align-items:center;gap:10px;margin-bottom:8px}.contact-row:last-child{margin-bottom:0}.contact-row .key{color:var(--text-muted);font-size:14px;width:74px;font-family:var(--font-mono);flex-shrink:0}.contact-row a{color:var(--text-link);text-decoration:none;font-size:15px}.contact-row a:hover{text-decoration:underline}.search-box{display:flex;align-items:center;gap:10px;background:var(--surface-card);border:1px solid var(--border-default);border-radius:var(--radius-md);padding:0 14px;height:48px}.search-box:focus-within{border-color:var(--border-strong)}.search-box svg{color:var(--text-faint);flex-shrink:0}.search-box input{flex:1;background:0 0;border:none;outline:none;color:var(--text-strong);font-family:var(--font-body);font-size:16px}.search-box input::placeholder{color:var(--text-faint)}.search-results{margin-top:24px}.search-empty{padding:24px 4px;font-family:var(--font-mono);font-size:13px;color:var(--text-faint)}.error-page{text-align:left;padding-top:96px;padding-bottom:40px}.error-code{font-family:var(--font-mono);font-size:13px;color:var(--text-faint);margin-top:18px}.site-footer{border-top:1px solid var(--border-subtle);margin-top:80px;padding:28px;display:flex;align-items:center;justify-content:space-between;flex-wrap:wrap;gap:16px}.site-footer .brand{display:flex;align-items:center;gap:10px}.site-footer .brand .led{width:9px;height:9px;border-radius:50%;background:var(--accent)}.site-footer .brand span,.site-footer nav a{font-family:var(--font-mono);font-size:12px}.site-footer .brand span{color:var(--text-faint)}.site-footer nav{display:flex;gap:18px}.site-footer nav a{color:var(--text-muted);text-decoration:none}.site-footer nav a:hover{color:var(--text-strong)}@media(max-width:720px){.site-header{padding:8px 18px}.wrap,.narrow,.projects-wrap,.post{padding-left:18px;padding-right:18px}.hero{padding-top:56px}.page-head{padding-top:40px}.project-grid{grid-template-columns:1fr}.post-row{flex-wrap:wrap;gap:6px 14px}.post-row .date{width:auto}.post-row .body{flex-basis:100%;order:3}.header-repo span{display:none}}