@import "https://fonts.googleapis.com/css2?family=Fraunces:opsz,wght@9..144,400;9..144,500;9..144,600;9..144,700&family=Lora:ital,wght@0,400;0,500;0,600;1,400&family=Work+Sans:wght@400;500;600;700&family=IBM+Plex+Mono:wght@400;500;600&display=swap";:root{--sky:#e4f1fb;--sky-deep:#cfe7f7;--ink:#1e2e3f;--ink-soft:#52697f;--card:#fbfeff;--line:#c3dcef;--accent:#e38b57;--accent-2:#4e7ea8;--accent-tint:#e38b571f;--accent2-tint:#4e7ea824;--code-bg:#10233a;--code-ink:#e7eef8}html.dark{--sky:#0d1626;--sky-deep:#060b16;--ink:#e7eef8;--ink-soft:#93a8c1;--card:#131f33;--line:#263952;--accent:#e8c468;--accent-2:#6f9ac9;--accent-tint:#e8c46822;--accent2-tint:#6f9ac92a;--code-bg:#060d19;--code-ink:#e7eef8}*{box-sizing:border-box}body{color:var(--ink);background:linear-gradient(180deg, var(--sky) 0%, var(--sky-deep) 100%);background-attachment:fixed;margin:0;font-family:Work Sans,sans-serif;transition:background .35s,color .3s}a{color:inherit;text-decoration:none}button{font-family:inherit}.wrap{max-width:980px;margin:0 auto;padding:0 20px;position:relative}.display{font-family:Fraunces,serif}.read{font-family:Lora,serif}.mono{font-family:IBM Plex Mono,monospace}.site-header{z-index:40;-webkit-backdrop-filter:blur(8px);backdrop-filter:blur(8px);background:color-mix(in srgb, var(--sky) 80%, transparent);border-bottom:1px solid var(--line);position:sticky;top:0}.nav-row{justify-content:space-between;align-items:center;padding:14px 0;display:flex}.brand{color:var(--ink);align-items:center;gap:7px;font-family:Fraunces,serif;font-size:19px;font-weight:600;display:flex}.brand svg{color:var(--accent-2)}.nav-links{align-items:center;gap:22px;display:flex}.nav-links a{color:var(--ink-soft);padding:6px 2px;font-size:14px;font-weight:500;position:relative}.nav-links a.active{color:var(--ink)}.nav-links a.active:after{content:"";background:var(--accent);border-radius:2px;height:2px;position:absolute;bottom:-2px;left:0;right:0}.theme-toggle{border:1px solid var(--line);background:var(--card);color:var(--ink);cursor:pointer;border-radius:10px;padding:8px;display:flex}.theme-toggle:hover{border-color:var(--accent-2)}@media (width<=640px){.nav-links{flex-wrap:wrap;gap:12px}.nav-links a{font-size:12.5px}}.btn{cursor:pointer;border:1px solid var(--line);background:var(--card);color:var(--ink);border-radius:12px;align-items:center;gap:6px;padding:9px 15px;font-size:14px;font-weight:600;transition:transform .15s,border-color .15s;display:inline-flex}.btn:hover{border-color:var(--accent-2);transform:translateY(-1px)}a:focus-visible,button:focus-visible,[tabindex]:focus-visible{outline:2px solid var(--accent-2);outline-offset:2px}.dashed{border:none;border-top:1.5px dashed var(--line);margin:0}.stitch{border-left:1.5px dashed var(--line);padding-left:26px}.card{background:var(--card);border:1px solid var(--line);box-shadow:0 8px 24px -18px color-mix(in srgb, var(--ink) 40%, transparent);border-radius:18px}.tag{letter-spacing:.02em;background:var(--accent2-tint);color:var(--accent-2);border:1px solid color-mix(in srgb, var(--accent-2) 40%, transparent);border-radius:999px;padding:2px 8px;font-family:IBM Plex Mono,monospace;font-size:11px}.stamp{border:1.5px dashed var(--accent);color:var(--accent);text-align:center;background:var(--card);border-radius:14px;padding:20px 18px;transform:rotate(-1.2deg)}.hero h1{margin:14px 0 0;font-size:clamp(34px,6vw,54px);font-weight:600;line-height:1.08}.hero .typed{margin-top:14px;font-size:15px}.hero p.intro{max-width:620px;margin-top:26px;font-size:18px;line-height:1.8}.stats{flex-wrap:wrap;gap:28px;margin-top:46px;display:flex}.stats .k{color:var(--accent-2);text-transform:uppercase;letter-spacing:.08em;font-family:IBM Plex Mono,monospace;font-size:11px}.stats .v{margin-top:3px;font-size:14.5px}.cursor{background:var(--accent);vertical-align:text-bottom;width:8px;height:1.1em;margin-left:4px;animation:1s step-end infinite blink;display:inline-block}@keyframes blink{50%{opacity:0}}@media (prefers-reduced-motion:reduce){.cursor{animation:none}}.grid{grid-template-columns:repeat(auto-fit,minmax(260px,1fr));gap:18px;display:grid}.grid-certs{grid-template-columns:repeat(auto-fit,minmax(220px,1fr));gap:18px;display:grid}.p-card{padding:22px}.p-card .icon{margin-bottom:10px;font-size:26px}.p-card h3{margin:0 0 6px;font-family:Fraunces,serif;font-size:18px;font-weight:600}.p-card p{color:var(--ink-soft);margin:0 0 14px;font-size:14.5px;line-height:1.6}.p-card .tech{flex-wrap:wrap;gap:6px;margin-bottom:16px;display:flex}.p-card .links{gap:14px;display:flex}.p-card .links a{color:var(--ink-soft);align-items:center;gap:5px;font-size:14px;display:flex}.p-card .links a:hover{color:var(--accent-2)}.b-card{cursor:pointer;display:block;overflow:hidden}.b-card .thumb{border-bottom:1px solid var(--line);align-items:center;height:90px;padding:0 18px;display:flex}.b-card .body{padding:18px}.b-card .tags{flex-wrap:wrap;gap:6px;margin-bottom:8px;display:flex}.b-card h3{margin:0 0 8px;font-family:Fraunces,serif;font-size:17px;font-weight:600;line-height:1.3}.b-card p{color:var(--ink-soft);margin:0 0 12px;font-size:13.5px;line-height:1.6}.b-card .meta{color:var(--ink-soft);font-family:IBM Plex Mono,monospace;font-size:11.5px}.rec-row{border-bottom:1px dashed var(--line);flex-wrap:wrap;justify-content:space-between;gap:12px;padding:14px 0;display:flex}.rec-row:last-child{border-bottom:none}.rec-row .year{color:var(--accent-2);font-family:IBM Plex Mono,monospace;font-size:12.5px}.post-layout{align-items:flex-start;gap:40px;display:flex}.post-article{flex:1;max-width:660px}.post-article .tags{gap:6px;margin-bottom:12px;display:flex}.post-article h1{margin:0 0 10px;font-size:clamp(26px,4vw,36px);font-weight:600;line-height:1.2}.post-meta{color:var(--ink-soft);margin-bottom:30px;font-family:IBM Plex Mono,monospace;font-size:12.5px}.prose p{margin:0 0 1.1em;font-size:17px;line-height:1.8}.prose h2{margin:1.8em 0 .6em;font-family:Fraunces,serif;font-size:22px;font-weight:600}.code-block{background:var(--code-bg);color:var(--code-ink);border-left:3px solid var(--accent);border-radius:12px;margin:1.2em 0;padding:16px 18px;font-family:IBM Plex Mono,monospace;font-size:13.5px;line-height:1.6;overflow-x:auto}.post-img{margin:1.6em 0}.post-img img{border:1px solid var(--line);width:100%;height:auto;box-shadow:0 10px 28px -20px color-mix(in srgb, var(--ink) 45%, transparent);border-radius:14px;display:block}.post-img figcaption{color:var(--ink-soft);text-align:center;margin-top:8px;font-family:IBM Plex Mono,monospace;font-size:12px}.callout{border-left:3px solid;border-radius:12px;margin:1.2em 0;padding:12px 16px;font-size:14.5px;line-height:1.6}.callout.warn{border-color:var(--accent);background:var(--accent-tint)}.callout.info{border-color:var(--accent-2);background:var(--accent2-tint)}.callout strong.warn{color:var(--accent)}.callout strong.info{color:var(--accent-2)}.post-toc{width:180px;display:none;position:sticky;top:90px}@media (width>=860px){.post-toc{display:block}}.post-toc .label{color:var(--accent-2);letter-spacing:.05em;margin-bottom:10px;font-family:IBM Plex Mono,monospace;font-size:11px}.post-toc .item{color:var(--ink-soft);padding:5px 0;font-size:13px}.post-nav{flex-wrap:wrap;justify-content:space-between;gap:12px;margin-top:24px;display:flex}.contact-links{flex-direction:column;gap:12px;max-width:320px;display:flex}.contact-links .btn{justify-content:flex-start}.site-footer{border-top:1px solid var(--line);margin-top:60px}.site-footer .wrap{flex-wrap:wrap;justify-content:space-between;align-items:center;gap:10px;padding:26px 20px;display:flex}.site-footer span{color:var(--ink-soft);align-items:center;gap:6px;font-family:IBM Plex Mono,monospace;font-size:12.5px;display:flex}section{padding:56px 0}.page-title{margin:0;font-family:Fraunces,serif;font-size:32px;font-weight:600}.page-sub{color:var(--ink-soft);margin-top:6px;margin-bottom:34px}.fade-in{animation:.4s both fadeIn}@keyframes fadeIn{0%{opacity:0;transform:translateY(6px)}to{opacity:1;transform:translateY(0)}}@media (prefers-reduced-motion:reduce){.fade-in{animation:none}}.sky-decor{pointer-events:none;z-index:0;position:absolute;inset:0;overflow:hidden}.sky-decor svg{opacity:.55;position:absolute}.cloud-drift{animation:40s linear infinite drift}.star-twinkle{animation:3.2s ease-in-out infinite twinkle}@keyframes drift{0%{transform:translate(-6%)}to{transform:translate(6%)}}@keyframes twinkle{0%,to{opacity:.25}50%{opacity:.9}}@media (prefers-reduced-motion:reduce){.cloud-drift,.star-twinkle{opacity:.5;animation:none}}
