:root{--bg:#eef3f9;--bg-soft:#f7fAfd;--surface:#ffffff;--surface-alt:#f4f8fc;--line:#dce5f0;--line-strong:#c3d2e4;--ink:#16202b;--ink-soft:#5a6b7d;--ink-faint:#8694a5;--accent:#0f6cbd;--accent-dark:#0a4f8c;--accent-tint:#e7f1fb;--radius:12px;--radius-sm:7px;--shadow:0 1px 2px rgba(16, 40, 70, .05), 0 6px 18px rgba(16, 40, 70, .05);--shadow-hover:0 2px 4px rgba(16, 40, 70, .07), 0 12px 28px rgba(16, 40, 70, .09);--wrap:1080px;--measure:72ch;--teaser-lines:8;--font:-apple-system, BlinkMacSystemFont, "Segoe UI", "Segoe UI Variable Text",
          Roboto, "Helvetica Neue", Arial, sans-serif;--mono:"Cascadia Code", "SF Mono", "JetBrains Mono", Consolas, "Liberation Mono", monospace}*,*::before,*::after{box-sizing:border-box}html{font-size:17px;-webkit-text-size-adjust:100%;scroll-behavior:smooth;scroll-padding-top:90px}body{margin:0;background:var(--bg);color:var(--ink);font-family:var(--font);font-size:1rem;line-height:1.72;-webkit-font-smoothing:antialiased;text-rendering:optimizeLegibility}img,svg,video{max-width:100%;height:auto}a{color:var(--accent);text-decoration-color:rgba(15,108,189,.35);text-underline-offset:3px}a:hover{color:var(--accent-dark);text-decoration-color:initial}:focus-visible{outline:3px solid var(--accent);outline-offset:2px;border-radius:3px}.wrap{max-width:var(--wrap);margin-inline:auto;padding-inline:22px}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0 0 0 0);white-space:nowrap;border:0}.skip-link{position:absolute;left:-9999px;top:0;z-index:100;background:var(--surface);color:var(--accent);padding:12px 18px;border-radius:0 0 var(--radius-sm)0;font-weight:600}.skip-link:focus{left:0}.site-header{position:sticky;top:0;z-index:50;background:rgba(255,255,255,.92);backdrop-filter:saturate(180%)blur(12px);border-bottom:1px solid var(--line)}.header-inner{display:flex;align-items:center;justify-content:space-between;gap:20px;min-height:68px}.brand{display:inline-flex;align-items:center;gap:12px;text-decoration:none;color:inherit}.brand-mark{display:grid;place-items:center;width:42px;height:42px;flex:0 0 42px;border-radius:10px;background:linear-gradient(140deg,var(--accent) 0%,#2b8ae0 100%);color:#fff;font-size:12px;font-weight:700;letter-spacing:.02em}.brand-text{display:flex;flex-direction:column;line-height:1.25}.brand-title{font-weight:700;font-size:1.06rem;letter-spacing:-.01em}.brand-sub{font-size:.76rem;color:var(--ink-faint)}.site-nav ul{display:flex;gap:4px;list-style:none;margin:0;padding:0}.site-nav a{display:block;padding:8px 13px;border-radius:var(--radius-sm);font-size:.94rem;font-weight:500;color:var(--ink-soft);text-decoration:none;transition:background .15s,color .15s}.site-nav a:hover{background:var(--accent-tint);color:var(--accent-dark)}.site-nav a.is-active{background:var(--accent-tint);color:var(--accent-dark);font-weight:600}.nav-burger{display:none;cursor:pointer;padding:10px;border-radius:var(--radius-sm)}.nav-burger span{display:block;width:22px;height:2px;background:var(--ink);border-radius:2px}.nav-burger span+span{margin-top:5px}.site-main{padding:40px 0 72px}.hero{margin-bottom:34px;padding-bottom:26px;border-bottom:1px solid var(--line)}.hero-title{margin:0;font-size:2.1rem;line-height:1.15;letter-spacing:-.025em}.hero-sub{margin:6px 0 0;color:var(--accent);font-weight:600;font-size:.95rem}.hero-lead{margin-top:14px;max-width:68ch}.hero-lead p{margin:0;color:var(--ink-soft);font-size:1.05rem;line-height:1.65}.hero-more{margin-top:14px;max-width:68ch}.hero-more>summary{cursor:pointer;display:inline-flex;align-items:center;gap:7px;font-size:.9rem;font-weight:600;color:var(--accent);list-style:none;padding:5px 0}.hero-more>summary::-webkit-details-marker{display:none}.hero-more>summary::after{content:"▾";font-size:.8em;transition:transform .18s ease}.hero-more[open]>summary::after{transform:rotate(180deg)}.hero-more-body{margin-top:10px;padding:18px 22px;background:var(--surface);border:1px solid var(--line);border-left:3px solid var(--accent);border-radius:0 var(--radius-sm)var(--radius-sm)0;color:var(--ink-soft);font-size:.97rem}.hero-more-body>:first-child{margin-top:0}.hero-more-body>:last-child{margin-bottom:0}.hero-more-body h2{font-size:1.02rem;color:var(--ink);margin:1.1em 0 .4em}.section-label{font-size:.78rem;font-weight:700;letter-spacing:.09em;text-transform:uppercase;color:var(--ink-faint);margin:0 0 18px;padding-bottom:10px;border-bottom:1px solid var(--line)}.post-list{display:flex;flex-direction:column;gap:22px}.post-card{background:var(--surface);border:1px solid var(--line);border-radius:var(--radius);padding:28px 32px;box-shadow:var(--shadow);transition:box-shadow .18s ease,border-color .18s ease,transform .18s ease}.post-card:hover{border-color:var(--line-strong);box-shadow:var(--shadow-hover);transform:translateY(-2px)}.post-meta{display:flex;flex-wrap:wrap;align-items:center;gap:8px;margin:0 0 8px;font-size:.82rem;color:var(--ink-faint)}.post-meta .dot{color:var(--line-strong)}.meta-cat{color:var(--accent);font-weight:600;text-decoration:none}.meta-cat:hover{text-decoration:underline}.post-card-title{margin:0 0 12px;font-size:1.42rem;line-height:1.3;letter-spacing:-.015em}.post-card-title a{color:var(--ink);text-decoration:none}.post-card-title a:hover{color:var(--accent)}.post-teaser{margin:0 0 18px;color:var(--ink-soft);font-size:1.05rem;line-height:1.72;display:-webkit-box;-webkit-box-orient:vertical;-webkit-line-clamp:var(--teaser-lines);line-clamp:var(--teaser-lines);overflow:hidden;max-height:calc(var(--teaser-lines) * 1.72em)}@supports(-webkit-line-clamp:10){.post-teaser{max-height:none}}.post-card-foot{display:flex;flex-wrap:wrap;align-items:center;justify-content:space-between;gap:14px;padding-top:16px;border-top:1px solid var(--line)}.readmore{display:inline-flex;align-items:center;gap:7px;font-weight:600;font-size:.94rem;text-decoration:none;color:var(--accent)}.readmore .arrow{transition:transform .18s ease}.readmore:hover .arrow{transform:translateX(4px)}.tag-list{display:flex;flex-wrap:wrap;gap:7px;list-style:none;margin:0;padding:0}.tag{display:inline-block;padding:3px 11px;border-radius:999px;background:var(--accent-tint);color:var(--accent-dark);font-size:.78rem;font-weight:600;text-decoration:none;border:1px solid transparent}.tag:hover{border-color:var(--accent)}.page-head{margin-bottom:30px}.page-title{margin:0 0 6px;font-size:2rem;line-height:1.2;letter-spacing:-.02em}.kicker{display:block;font-size:.76rem;font-weight:700;letter-spacing:.09em;text-transform:uppercase;color:var(--accent);margin-bottom:4px}.page-lead{color:var(--ink-soft)}.page-count{margin:0;font-size:.86rem;color:var(--ink-faint)}.empty-note{color:var(--ink-faint)}.term-cloud{display:flex;flex-wrap:wrap;gap:10px;list-style:none;margin:0;padding:0}.term-chip{display:inline-flex;align-items:center;gap:9px;background:var(--surface);border:1px solid var(--line);border-radius:999px;padding:9px 9px 9px 17px;font-weight:600;font-size:.94rem;text-decoration:none;color:var(--ink);box-shadow:var(--shadow)}.term-chip:hover{border-color:var(--accent);color:var(--accent-dark)}.term-count{display:grid;place-items:center;min-width:24px;height:24px;padding:0 7px;border-radius:999px;background:var(--accent-tint);color:var(--accent-dark);font-size:.76rem}.post{background:var(--surface);border:1px solid var(--line);border-radius:var(--radius);box-shadow:var(--shadow);padding:46px 52px 50px;max-width:860px;margin-inline:auto}.post-head{margin-bottom:30px;padding-bottom:24px;border-bottom:1px solid var(--line)}.post-title{margin:6px 0 0;font-size:2.15rem;line-height:1.22;letter-spacing:-.022em}.post-lead{margin:14px 0 0;color:var(--ink-soft);font-size:1.06rem}.post-body{max-width:var(--measure);font-size:1.04rem}.post-body>:first-child{margin-top:0}.post-body h2{margin:2.1em 0 .6em;font-size:1.5rem;line-height:1.3;letter-spacing:-.015em;padding-bottom:.3em;border-bottom:1px solid var(--line)}.post-body h3{margin:1.8em 0 .5em;font-size:1.2rem}.post-body h4{margin:1.6em 0 .4em;font-size:1.04rem;color:var(--ink-soft)}.post-body p{margin:0 0 1.15em}.post-body ul,.post-body ol{margin:0 0 1.15em;padding-left:1.45em}.post-body li{margin-bottom:.4em}.post-body li>ul,.post-body li>ol{margin-top:.4em}.post-body blockquote{margin:1.6em 0;padding:14px 22px;background:var(--surface-alt);border-left:3px solid var(--accent);border-radius:0 var(--radius-sm)var(--radius-sm)0;color:var(--ink-soft);font-style:italic}.post-body blockquote p:last-child{margin-bottom:0}.post-body hr{border:0;border-top:1px solid var(--line);margin:2.4em 0}.post-body code{font-family:var(--mono);font-size:.88em;background:var(--surface-alt);border:1px solid var(--line);border-radius:5px;padding:.12em .4em}.post-body pre{margin:1.5em 0;padding:18px 20px;overflow-x:auto;background:var(--surface-alt);border:1px solid var(--line);border-radius:var(--radius-sm);font-size:.88rem;line-height:1.6}.post-body pre code{background:0 0;border:0;padding:0;font-size:inherit}.highlight{margin:1.5em 0}.highlight pre{margin:0}.post-body table{width:100%;margin:1.6em 0;border-collapse:collapse;font-size:.94rem;display:block;overflow-x:auto}.post-body th,.post-body td{padding:10px 14px;text-align:left;border:1px solid var(--line);vertical-align:top}.post-body th{background:var(--surface-alt);font-weight:600;white-space:nowrap}.post-body tbody tr:nth-child(even){background:var(--bg-soft)}.post-body .footnotes{margin-top:2.6em;padding-top:1.2em;border-top:1px solid var(--line);font-size:.88rem;color:var(--ink-soft)}.post-body .footnotes ol{padding-left:1.3em}.post-body .footnotes li{margin-bottom:.35em}.post-body sup{font-size:.72em}.post-body sup a{text-decoration:none;font-weight:600;padding:0 1px}.post-body .footnote-backref{text-decoration:none}.post-tags{margin-top:36px;padding-top:22px;border-top:1px solid var(--line)}.toc{margin:0 0 30px;background:var(--surface-alt);border:1px solid var(--line);border-radius:var(--radius-sm);padding:18px 22px;font-size:.9rem}.toc-title{margin:0 0 8px;font-size:.74rem;font-weight:700;letter-spacing:.09em;text-transform:uppercase;color:var(--ink-faint)}.toc nav ul{list-style:none;margin:0;padding:0}.toc nav ul ul{padding-left:15px;margin-top:4px}.toc nav li{margin:0 0 5px;line-height:1.45}.toc nav a{color:var(--ink-soft);text-decoration:none}.toc nav a:hover{color:var(--accent);text-decoration:underline}@media(min-width:1180px){.post.has-toc{max-width:1100px;display:grid;grid-template-columns:minmax(0,1fr)250px;grid-template-areas:"head head" "body toc" "tags tags";column-gap:46px}.post.has-toc .post-head{grid-area:head}.post.has-toc .post-body{grid-area:body}.post.has-toc .post-tags{grid-area:tags}.post.has-toc .toc{grid-area:toc;margin:0;position:sticky;top:92px;align-self:start;max-height:calc(100vh - 130px);overflow-y:auto;background:0 0;border:0;border-left:2px solid var(--line);border-radius:0;padding:2px 0 2px 18px}}.post-nav{display:grid;grid-template-columns:1fr 1fr;gap:16px;max-width:860px;margin:26px auto 0}.post-nav-item{background:var(--surface);border:1px solid var(--line);border-radius:var(--radius);padding:16px 20px;text-decoration:none;display:flex;flex-direction:column;gap:4px;box-shadow:var(--shadow)}.post-nav-item:hover{border-color:var(--accent)}.post-nav-item.next{grid-column:2;text-align:right}.post-nav-label{font-size:.78rem;color:var(--ink-faint)}.post-nav-title{font-weight:600;color:var(--ink);font-size:.96rem;line-height:1.35}.pagination{display:flex;align-items:center;justify-content:center;gap:14px;margin-top:36px}.page-btn{background:var(--surface);border:1px solid var(--line);border-radius:var(--radius-sm);padding:9px 18px;font-weight:600;font-size:.92rem;text-decoration:none;color:var(--accent);box-shadow:var(--shadow)}.page-btn:hover{border-color:var(--accent)}.page-btn.is-disabled{color:var(--ink-faint);box-shadow:none;opacity:.55}.page-status{font-size:.88rem;color:var(--ink-faint)}.search-form{margin-bottom:28px}.search-form input[type=search]{width:100%;padding:15px 20px;font-size:1.05rem;font-family:inherit;color:var(--ink);background:var(--surface);border:1px solid var(--line-strong);border-radius:var(--radius);box-shadow:var(--shadow);-webkit-appearance:none}.search-form input[type=search]::placeholder{color:var(--ink-faint)}.search-form input[type=search]:focus{outline:3px solid var(--accent-tint);border-color:var(--accent)}.search-hint{margin:10px 2px 0;font-size:.84rem;color:var(--ink-faint)}.post-teaser.is-snippet{-webkit-line-clamp:4;line-clamp:4;max-height:none}mark{background:#fff3bf;color:inherit;padding:0 2px;border-radius:3px}.site-footer{background:var(--surface);border-top:1px solid var(--line);padding:28px 0}.footer-inner{display:flex;flex-wrap:wrap;align-items:center;justify-content:space-between;gap:14px}.footer-copy{margin:0;font-size:.86rem;color:var(--ink-faint)}.footer-nav ul{display:flex;flex-wrap:wrap;gap:18px;list-style:none;margin:0;padding:0}.footer-nav a{font-size:.86rem;color:var(--ink-soft);text-decoration:none}.footer-nav a:hover{color:var(--accent)}@media(max-width:860px){html{font-size:16.5px}.post{padding:32px 24px 36px;border-radius:var(--radius)}.post-title{font-size:1.72rem}.post-card{padding:22px}.post-card-title{font-size:1.22rem}.intro-body{padding:24px 22px}.post-nav{grid-template-columns:1fr}.post-nav-item.next{grid-column:1;text-align:left}.nav-burger{display:block}.site-nav{position:absolute;left:0;right:0;top:100%;background:var(--surface);border-bottom:1px solid var(--line);box-shadow:var(--shadow-hover);display:none;padding:10px 22px 16px}.nav-toggle:checked~.site-nav{display:block}.site-nav ul{flex-direction:column;gap:2px}.site-nav a{padding:11px 12px}}@media(max-width:480px){.brand-sub{display:none}.post{padding:26px 18px 30px}.post-card{padding:20px 18px}}@media print{.site-header,.site-footer,.post-nav,.pagination,.toc,.skip-link{display:none!important}body{background:#fff;font-size:11pt}.post{box-shadow:none;border:0;padding:0;max-width:none}a{color:#000;text-decoration:underline}}@media(prefers-reduced-motion:reduce){html{scroll-behavior:auto}*,*::before,*::after{animation-duration:.001ms!important;transition-duration:.001ms!important}}.bg{background-color:#fff}.chroma{background-color:#fff}.chroma .err{color:#f6f8fa;background-color:#82071e}.chroma .lnlinks{outline:none;text-decoration:none;color:inherit}.chroma .lntd{vertical-align:top;padding:0;margin:0;border:0}.chroma .lntable{border-spacing:0;padding:0;margin:0;border:0}.chroma .hl{background-color:#e5e5e5}.chroma .lnt{white-space:pre;-webkit-user-select:none;user-select:none;margin-right:.4em;padding:0 .4em;color:#7f7f7f}.chroma .ln{white-space:pre;-webkit-user-select:none;user-select:none;margin-right:.4em;padding:0 .4em;color:#7f7f7f}.chroma .line{display:flex}.chroma .k{color:#cf222e}.chroma .kc{color:#cf222e}.chroma .kd{color:#cf222e}.chroma .kn{color:#cf222e}.chroma .kp{color:#cf222e}.chroma .kr{color:#cf222e}.chroma .kt{color:#cf222e}.chroma .na{color:#1f2328}.chroma .nc{color:#1f2328}.chroma .no{color:#0550ae}.chroma .nd{color:#0550ae}.chroma .ni{color:#6639ba}.chroma .nl{color:#900;font-weight:700}.chroma .nn{color:#24292e}.chroma .nx{color:#1f2328}.chroma .nt{color:#0550ae}.chroma .nb{color:#6639ba}.chroma .bp{color:#6a737d}.chroma .nv{color:#953800}.chroma .vc{color:#953800}.chroma .vg{color:#953800}.chroma .vi{color:#953800}.chroma .vm{color:#953800}.chroma .nf{color:#6639ba}.chroma .fm{color:#6639ba}.chroma .s{color:#0a3069}.chroma .sa{color:#0a3069}.chroma .sb{color:#0a3069}.chroma .sc{color:#0a3069}.chroma .dl{color:#0a3069}.chroma .sd{color:#0a3069}.chroma .s2{color:#0a3069}.chroma .se{color:#0a3069}.chroma .sh{color:#0a3069}.chroma .si{color:#0a3069}.chroma .sx{color:#0a3069}.chroma .sr{color:#0a3069}.chroma .s1{color:#0a3069}.chroma .ss{color:#032f62}.chroma .m{color:#0550ae}.chroma .mb{color:#0550ae}.chroma .mf{color:#0550ae}.chroma .mh{color:#0550ae}.chroma .mi{color:#0550ae}.chroma .il{color:#0550ae}.chroma .mo{color:#0550ae}.chroma .o{color:#0550ae}.chroma .ow{color:#0550ae}.chroma .p{color:#1f2328}.chroma .c{color:#57606a}.chroma .ch{color:#57606a}.chroma .cm{color:#57606a}.chroma .c1{color:#57606a}.chroma .cs{color:#57606a}.chroma .cp{color:#57606a}.chroma .cpf{color:#57606a}.chroma .gd{color:#82071e;background-color:#ffebe9}.chroma .ge{color:#1f2328}.chroma .gi{color:#116329;background-color:#dafbe1}.chroma .go{color:#1f2328}.chroma .gl{text-decoration:underline}.chroma .w{color:#fff}