@font-face{font-family:Alata;src:url(/fonts/alata.woff2)format("woff2");font-weight:400;font-display:swap}@font-face{font-family:Outfit;src:url(/fonts/outfit.woff2)format("woff2");font-weight:100 900;font-display:swap}@font-face{font-family:jetbrains mono;src:url(/fonts/jetbrains-mono.woff2)format("woff2");font-weight:100 800;font-display:swap}:root{--bg:#f9faf7;--surface:#ffffff;--fg:#1f1915;--muted:#66706a;--line:#e3e7df;--line-strong:#c6d2c2;--accent:#2f7a35;--accent-soft:#e6f2e2;--code-bg:#eff2ec;--media-bg:#edf1e9;--todo:#b3261e;--shadow:0 1px 2px rgb(31 25 21 / 6%), 0 3px 10px rgb(31 25 21 / 6%);--shadow-hover:0 2px 4px rgb(31 25 21 / 7%), 0 10px 24px rgb(31 25 21 / 9%);--font-body:Outfit, system-ui, sans-serif;--font-head:Alata, system-ui, sans-serif;--font-mono:"JetBrains Mono", ui-monospace, Consolas, monospace;--width:56rem;--sx-comment:#6e7781;--sx-keyword:#cf222e;--sx-string:#0a3069;--sx-number:#0550ae;--sx-func:#8250df;--sx-type:#953800;--sx-meta:#116329;interpolate-size:allow-keywords}*{box-sizing:border-box}html{scroll-behavior:smooth}body{margin:0;background:var(--bg);color:var(--fg);font:16.5px/1.65 var(--font-body);font-synthesis:none;-webkit-text-size-adjust:100%}main{max-width:var(--width);margin:0 auto;padding:3rem 1.25rem 4rem}.topbar{position:sticky;top:0;z-index:10;border-bottom:1px solid transparent;transition:background-color .25s,border-color .25s,backdrop-filter .25s}.topbar.scrolled{background:rgb(249 250 247/72%);backdrop-filter:blur(12px);-webkit-backdrop-filter:blur(12px);border-bottom-color:rgb(31 25 21/6%)}.topbar-inner{max-width:var(--width);margin:0 auto;padding:1.1rem 1.25rem;display:flex;align-items:center;gap:2rem}.topbar a{color:#5f5f5f;font-family:var(--font-head);font-size:1.02rem;text-decoration:none}.topbar a:hover{color:var(--fg)}.topbar .brand{margin-right:auto;color:var(--fg)}section[id]{scroll-margin-top:4.5rem}img{display:block;max-width:100%}a{color:var(--accent);text-decoration:underline;text-decoration-color:transparent;text-underline-offset:3px;transition:text-decoration-color .15s,color .15s,background-color .15s,border-color .15s}a:hover{text-decoration-color:initial}h1,h2,h3{font-family:var(--font-head);line-height:1.2}h2{font-size:1.5rem;font-weight:600;margin:3.5rem 0 1.25rem}.todo{color:var(--todo)}.muted{color:var(--muted);margin-top:0}.icon{display:inline-flex}.icon svg{width:1.05em;height:1.05em}.icon svg:not([fill]){fill:currentColor}.home .top{display:grid;grid-template-columns:minmax(0,1fr)minmax(0,1.1fr);gap:3rem;align-items:start}.avatar{width:136px;height:136px;border-radius:24%;object-fit:cover;margin-bottom:1.5rem;border:3px solid var(--surface);box-shadow:0 0 0 1px var(--line),0 6px 18px rgb(31 25 21/8%)}.intro h1{font-size:3.4rem;font-weight:700;letter-spacing:-.03em;line-height:1.02;margin:0}.intro .meta{display:flex;flex-wrap:wrap;gap:.25rem 1.25rem;margin:.75rem 0 .5rem;color:var(--muted);font-size:1rem}.intro .meta a,.intro .meta span{display:inline-flex;align-items:center;gap:.4rem;color:var(--muted)}.intro .meta a:hover{color:var(--accent)}.typed{font-family:var(--font-mono);font-size:.95rem;margin:0 0 1.5rem;min-height:1.6em}.typed-word{color:var(--accent);font-weight:500}.caret{display:inline-block;width:.55em;height:1.1em;margin-left:2px;vertical-align:-.15em;background:var(--accent);animation:blink 1s steps(1)infinite}@keyframes blink{50%{opacity:0}}.links{display:flex;flex-wrap:wrap;gap:.5rem}.links a{display:inline-flex;align-items:center;gap:.4rem;padding:.42rem .8rem;border-radius:8px;background:var(--surface);border:1px solid var(--line);box-shadow:var(--shadow);color:var(--fg);font-size:.9rem;font-weight:500;text-decoration:none}.links a:hover{border-color:var(--accent);color:var(--accent)}.links a.primary{background:var(--accent);border-color:var(--accent);color:#fff}.links a.primary:hover{background:#256329;border-color:#256329;color:#fff}.about{background:var(--surface);border:1px solid var(--line);border-radius:16px;box-shadow:var(--shadow);padding:.5rem 1.75rem}.about h2{font-size:1.15rem;margin:1.25rem 0 .25rem}.tag{display:inline;padding:.12em .5em;border-radius:6px;font-size:.92em;line-height:1;text-decoration:none;white-space:nowrap;transition:background-color .15s}.tag .icon{display:inline;margin-right:.3em}.tag .icon svg{width:.95em;height:.95em;vertical-align:-.12em}.tag-green{background:#e5f2da;color:#4a7a26}.tag-green:hover{background:#d5eac4;color:#4a7a26}.tag-blue{background:#e1eefa;color:#1d6aa5}.tag-blue:hover{background:#cfe3f6;color:#1d6aa5}.tag-orange{background:#fdeed8;color:#b3640c}.tag-orange:hover{background:#fbe1bd;color:#b3640c}.tag-slate{background:#e8eaf0;color:#3f4a5c}.tag-slate:hover{background:#d9dde6;color:#3f4a5c}.tool-row{display:grid;grid-template-columns:10rem 1fr;gap:1rem;align-items:start;padding:.6rem 0}.tool-group{font-family:var(--font-body);font-size:.9rem;font-weight:400;color:var(--muted);margin:.45rem 0 0}.tool-grid{list-style:none;display:flex;flex-wrap:wrap;gap:.55rem;padding:0;margin:0}.tool{display:flex;align-items:center;gap:.5rem;min-width:6.5rem;padding:.4rem .8rem .4rem .6rem;background:var(--surface);border:1px solid var(--line);border-radius:9px;box-shadow:var(--shadow);font-size:.88rem;transition:transform .15s,box-shadow .15s}.tool:hover{transform:translateY(-1px);box-shadow:var(--shadow-hover)}.tool img{width:20px;height:20px;object-fit:contain;flex:none}.project-list{display:grid;gap:1.25rem}.card{display:grid;grid-template-columns:250px 1fr;gap:1.75rem;align-items:start;padding:1.25rem;background:var(--surface);border:1px solid var(--line);border-radius:16px;box-shadow:var(--shadow);position:relative;transition:box-shadow .25s ease,border-color .25s ease}.card::before{content:"";position:absolute;left:-1px;top:1.25rem;bottom:1.25rem;width:3px;border-radius:0 3px 3px 0;background:var(--accent);opacity:0;transition:opacity .25s ease}.card:hover{border-color:#cddbc6;box-shadow:var(--shadow-hover)}.card:hover::before{opacity:1}.card h3{transition:color .25s ease}.card:hover h3{color:var(--accent)}.card-media{width:250px;aspect-ratio:4/3;border-radius:12px;overflow:hidden;position:relative;background:var(--media-bg)}.card-media img,.card-video,.media-fallback{position:absolute;inset:0;width:100%;height:100%}.card-media img{object-fit:cover}.card-video{object-fit:cover;opacity:0;transition:opacity .3s ease}.card-video.playing{opacity:1}.card-media img.fit-contain{object-fit:contain;padding:10%}.card-media.plain{background:0 0}.media-fallback{display:grid;place-items:center;font-family:var(--font-head);font-size:3rem;color:var(--accent)}.card-head{display:flex;flex-wrap:wrap;justify-content:space-between;align-items:baseline;gap:0 1rem}.card h3{font-size:1.45rem;font-weight:600;margin:0}.card-body>p{font-size:1.02rem}.dates{color:var(--muted);font-size:.85rem;font-variant-numeric:tabular-nums}.tags{list-style:none;display:flex;flex-wrap:wrap;gap:.35rem;padding:0;margin:.5rem 0 .75rem}.tags li{padding:.15rem .65rem;border-radius:999px;background:hsl(var(--h) 70% 93%);color:hsl(var(--h) 45% 30%);font-size:.78rem;font-weight:500}.card p{margin:.5rem 0}.card-foot{position:relative;display:flex;justify-content:flex-end;margin-top:.6rem;line-height:1.6}.card-foot details{flex:1}.card-foot:has(details) .card-links{position:absolute;top:0;right:0}.card summary{display:flex;width:fit-content;align-items:center;gap:.35rem;cursor:pointer;list-style:none;color:var(--muted);font-size:.875rem;font-weight:500}.card summary::-webkit-details-marker{display:none}.card summary::before{content:"";width:.4rem;height:.4rem;border-right:1.5px solid;border-bottom:1.5px solid;transform:rotate(-45deg);transition:transform .2s}.card details[open]:not(.is-closing) summary::before{transform:rotate(45deg)}.card summary:hover{color:var(--accent)}.details-body{overflow:hidden}.highlights{margin:.5rem 0 0;padding-left:1.2rem;font-size:.925rem;color:#3f4640}.highlights li{margin:.25rem 0}.card-links{display:inline-flex;flex-wrap:wrap;gap:.15rem .85rem;font-size:.84rem}.card-links a{display:inline-flex;align-items:center;gap:.25rem;color:var(--muted);text-decoration:none}.card-links a:hover{color:var(--accent)}.card-links .icon svg{width:.95em;height:.95em}.site-footer{width:min(var(--width) - 2.5rem,100% - 2.5rem);margin:0 auto;padding:1.5rem 0 2.5rem;border-top:1px solid var(--line);display:flex;justify-content:space-between;align-items:center;color:var(--muted);font-size:.875rem}.footer-links{display:flex;gap:1rem}.footer-links a{color:var(--muted)}.footer-links a:hover{color:var(--accent)}.footer-links .icon svg{width:1.15rem;height:1.15rem}.not-found{text-align:center;padding:4rem 0}.not-found h1{font-size:4rem;margin:0;color:var(--accent)}.post-list{list-style:none;padding:0;margin:0}.post-list li{display:flex;gap:1rem;padding:.3rem 0}.post-list time{flex:0 0 6.5rem;color:var(--muted);font-size:.9rem;font-variant-numeric:tabular-nums;padding-top:.1rem}.post{max-width:42rem}.post h1{font-size:2rem;margin:0 0 .25rem}.post h2{font-size:1.35rem;margin:2.25rem 0 .75rem}.post h3{font-size:1.1rem;margin:1.75rem 0 .5rem}.post img{height:auto}blockquote{margin:1rem 0;padding-left:1rem;border-left:3px solid var(--line);color:var(--muted)}table{border-collapse:collapse;margin:1rem 0}th,td{border-bottom:1px solid var(--line);padding:.35rem .75rem .35rem 0;text-align:left}hr{border:0;border-top:1px solid var(--line);margin:2rem 0}code,pre{font-family:var(--font-mono);font-size:.875em;font-variant-ligatures:none}:not(pre)>code{background:var(--code-bg);padding:.1em .35em;border-radius:4px}pre{background:var(--code-bg);padding:.9rem 1rem;border-radius:8px;overflow-x:auto;line-height:1.5}.highlight{margin:1rem 0}.highlight pre{margin:0}.katex-display{overflow-x:auto;overflow-y:hidden;padding:.25rem 0}.chroma .c,.chroma .c1,.chroma .cm,.chroma .ch,.chroma .cs{color:var(--sx-comment);font-style:italic}.chroma .cp,.chroma .cpf{color:var(--sx-meta)}.chroma .k,.chroma .kc,.chroma .kd,.chroma .kn,.chroma .kp,.chroma .kr{color:var(--sx-keyword)}.chroma .kt,.chroma .nc,.chroma .nb,.chroma .bp{color:var(--sx-type)}.chroma .nf,.chroma .fm{color:var(--sx-func)}.chroma .s,.chroma .s1,.chroma .s2,.chroma .sa,.chroma .sb,.chroma .sc,.chroma .sd,.chroma .se,.chroma .sh,.chroma .si,.chroma .sr,.chroma .ss,.chroma .dl{color:var(--sx-string)}.chroma .m,.chroma .mb,.chroma .mf,.chroma .mh,.chroma .mi,.chroma .mo,.chroma .il{color:var(--sx-number)}@media(max-width:760px){.home .top{grid-template-columns:1fr;gap:.5rem}.intro h1{font-size:2.6rem}.avatar{width:104px;height:104px}}@media(max-width:560px){main{padding-top:2rem}.topbar-inner{gap:1.1rem;justify-content:flex-end}.topbar .brand{display:none}.card{grid-template-columns:1fr;gap:1rem}.tool-row{grid-template-columns:1fr;gap:.5rem}.tool-group{margin:0}.card-media{width:100%;aspect-ratio:16/9}.post-list li{flex-direction:column;gap:0}.post-list time{flex:none}}@media(prefers-reduced-motion:reduce){*,*::before,*::after{transition:none!important;animation:none!important}}