:root{--bg:#fbfaf7;--surface:#ffffff;--text:#1d1d1f;--muted:#6b6b70;--rule:#e4e1da;--link:#1f5fbf;--accent:#c2410c;--code-bg:#f2efe8;--series-1:#8a8f98;--series-2:#4c78a8;--series-3:#e45756;--series-4:#54a24b;--series-5:#b279a2;--font:system-ui, -apple-system, "Segoe UI", Roboto, sans-serif;--mono:ui-monospace, "SF Mono", "JetBrains Mono", Menlo, monospace;color-scheme:light}@media(prefers-color-scheme:dark){:root{--bg:#16171a;--surface:#1e2024;--text:#e7e6e3;--muted:#9a9aa0;--rule:#2e3036;--link:#7fb0ff;--accent:#fb923c;--code-bg:#24262b;--series-1:#9aa0a8;--series-2:#72a7e0;--series-3:#ff7b7a;--series-4:#7ccf72;--series-5:#d59ccc;color-scheme:dark}}*{box-sizing:border-box}html{-webkit-text-size-adjust:100%}body{margin:0;background:var(--bg);color:var(--text);font:17px/1.65 var(--font)}.wrap{max-width:44rem;margin:0 auto;padding:0 16px}a{color:var(--link)}a:hover{text-decoration-thickness:2px}.site-header{border-bottom:1px solid var(--rule);margin-bottom:2.5rem}.site-header .wrap{display:flex;align-items:baseline;justify-content:space-between;gap:1rem;padding-top:1.1rem;padding-bottom:1.1rem;flex-wrap:wrap}.site-title{font-weight:700;font-size:1.15rem;color:var(--text);text-decoration:none}.site-header nav a{color:var(--muted);text-decoration:none;margin-left:1rem}.site-header nav a:hover{color:var(--text)}.site-footer{border-top:1px solid var(--rule);margin-top:4rem;padding:1.5rem 0 2.5rem;color:var(--muted);font-size:.9rem}.site-footer a{color:inherit}.intro{color:var(--muted);font-size:1.05rem;margin:0 0 2.5rem}.year{display:grid;grid-template-columns:4.5rem 1fr;gap:0 1rem;margin-bottom:1.75rem}.year-label{font-size:1rem;color:var(--muted);margin:.15rem 0 0;font-variant-numeric:tabular-nums}.post-list{list-style:none;margin:0;padding:0}.post-item{display:flex;gap:.9rem;align-items:baseline;padding:.2rem 0}.post-item time{color:var(--muted);font-size:.88rem;min-width:3.6rem;font-variant-numeric:tabular-nums}.badge{font-size:.7rem;text-transform:uppercase;letter-spacing:.06em;color:var(--accent);border:1px solid;border-radius:3px;padding:0 .3rem;white-space:nowrap}@media(max-width:520px){.year{grid-template-columns:1fr}.post-item{flex-wrap:wrap;gap:0 .7rem}}.post h1{font-size:2rem;line-height:1.2;margin:0 0 .4rem;letter-spacing:-.01em}.meta{color:var(--muted);margin:0 0 2rem;font-size:.92rem}.meta a{color:inherit}.content h2{margin-top:2.2rem;font-size:1.35rem}.content h3{margin-top:1.8rem;font-size:1.1rem}.content img{max-width:100%;height:auto;border-radius:4px}.content blockquote{margin:1.5rem 0;padding:.2rem 1rem;border-left:3px solid var(--rule);color:var(--muted)}.content .update{border-left:3px solid var(--accent);padding:.5rem 1rem;background:var(--code-bg);border-radius:0 4px 4px 0;font-size:.95rem}.content table{border-collapse:collapse;width:100%;font-size:.92rem;margin:1.5rem 0;display:block;overflow-x:auto}.content th,.content td{padding:.4rem .7rem;border-bottom:1px solid var(--rule);text-align:left;white-space:nowrap}.content td{font-variant-numeric:tabular-nums}code,pre{font-family:var(--mono);font-size:.88em}:not(pre)>code{background:var(--code-bg);padding:.1em .35em;border-radius:3px}pre{background:var(--code-bg);padding:1rem;border-radius:6px;overflow-x:auto;line-height:1.45}.highlight pre{background:var(--code-bg)!important}.prev-next{display:flex;justify-content:space-between;gap:1rem;margin-top:3.5rem;padding-top:1.2rem;border-top:1px solid var(--rule);font-size:.95rem}.prev-next .next{margin-left:auto;text-align:right}.tag-cloud{list-style:none;padding:0;display:flex;flex-wrap:wrap;gap:.5rem 1.2rem}.tag-cloud span{color:var(--muted);font-size:.85rem}.widget{margin:2rem 0;padding:1rem;background:var(--surface);border:1px solid var(--rule);border-radius:8px}.widget figcaption{color:var(--muted);font-size:.88rem;margin-top:.75rem}.widget-fallback{color:var(--muted);font-style:italic;margin:0}.widget :is(button,select,input,textarea){font:inherit;font-size:.9rem;color:var(--text);background:var(--bg);border:1px solid var(--rule);border-radius:5px;padding:.3rem .55rem}.widget button{cursor:pointer}.widget button[aria-pressed=true]{border-color:var(--link);color:var(--link)}.todo{display:inline;background:#fff3b0;color:#5a4500;border:1px dashed #c9a400;border-radius:3px;padding:.05rem .35rem;font-size:.92em}@media(prefers-color-scheme:dark){.todo{background:#3d3410;color:#f5dd7a;border-color:#8a7420}}.on-light img{background:#fff;padding:.5rem}.built-with{margin-top:2.5rem;color:var(--muted);font-size:.9rem}