:root{--bg:#ffffff;--text:#111111;--text-secondary:#666666;--border:#f0f0f0;--code-bg:#f5f5f5;--link:#111111;--overlay:rgba(0,0,0,0.3);--max-width-home:700px;--max-width-article:740px;--sidebar-width:220px;--sidebar-gap:48px;--font-body:"Inter", "Noto Sans SC", -apple-system, sans-serif;--font-mono:"JetBrains Mono", "Fira Code", monospace}[data-theme=dark]{--bg:#23292e;--text:#dcdfe4;--text-secondary:#949494;--border:#3e4451;--code-bg:#2C3138;--link:#61afef;--overlay:rgba(0,0,0,0.55)}*,*::before,*::after{box-sizing:border-box;margin:0;padding:0}html{font-size:16px;-webkit-text-size-adjust:100%}body{font-family:var(--font-body);font-size:1rem;line-height:1.75;color:var(--text);background:var(--bg);-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}a{color:var(--link);text-decoration:none;transition:color .15s ease}a:hover{text-decoration:underline;text-underline-offset:.2em}p{margin-bottom:1.2em}h1,h2,h3,h4,h5,h6{line-height:1.4;font-weight:600}img{max-width:100%;height:auto}code,pre{font-family:var(--font-mono)}pre{background:var(--code-bg);padding:16px;overflow-x:auto;font-size:.9rem;border-radius:10px}:not(pre)>code{background:var(--code-bg);padding:2px 6px;border-radius:3px;font-size:.9em}table{border-collapse:collapse;width:100%;margin:1.2em 0}th,td{border:1px solid var(--border);padding:8px 12px;text-align:left}th{font-weight:600;background:var(--code-bg)}blockquote{border-left:3px solid var(--border);padding-left:16px;color:var(--text);margin:1.2em 0}.content-wrapper{max-width:var(--max-width-article);width:100%;margin:0 auto;padding:0 clamp(16px,5vw,24px)}.home-container{max-width:var(--max-width-home);width:100%;margin:0 auto}.post-container{max-width:var(--max-width-article);width:100%}body{display:flex;flex-direction:column;min-height:100vh}main{flex:1;padding-top:80px}body.is-home main{padding-top:0}.banner{width:100%;padding:80px 0}.banner-inner{max-width:var(--max-width-home);margin:0 auto;padding:0 clamp(16px,5vw,24px);text-align:center}.banner-title{font-size:2.5rem;font-weight:600;color:var(--text);line-height:1.2;margin:0 0 8px}.banner-subtitle{font-size:1.125rem;font-weight:400;color:var(--text-secondary);margin:0 0 8px}.site-header{position:sticky;top:0;z-index:100;width:100%;background:var(--bg);border-bottom:1px solid var(--border)}.header-inner{width:100%;padding:12px clamp(16px,4vw,24px)10px;display:flex;justify-content:space-between;align-items:baseline}.site-title{font-family:var(--font-mono);font-size:1.1rem;font-weight:400;letter-spacing:.06em;color:var(--text);text-decoration:none}.site-title:hover{text-decoration:none}.site-nav a{color:var(--text-secondary);font-size:.9rem;text-decoration:none;transition:color .15s ease}.site-nav a:hover{color:var(--text);text-decoration:none}.site-footer{max-width:var(--max-width-article);width:100%;margin:0 auto;padding:28px clamp(16px,5vw,24px);margin-top:100px;border-top:1px solid var(--border);text-align:center;font-size:.75rem;color:var(--text-secondary)}.article-header{text-align:center;margin-bottom:80px}.article-header .post-title{font-size:2.2rem;font-weight:600;line-height:1.25;margin:0 0 8px;color:var(--text)}.article-subtitle{font-size:1.1rem;color:var(--text-secondary);line-height:1.5;max-width:560px;margin:0 auto 12px}.article-meta{font-size:.85rem;color:var(--text-secondary);display:flex;justify-content:center;gap:1.5em}.article-meta .article-author{color:var(--text-secondary)}.article-meta time{font-size:inherit;color:inherit;letter-spacing:.04em}.section-label{font-size:1.5rem;font-weight:600;color:var(--text);margin-bottom:24px}.post-item{padding-bottom:32px;margin-bottom:32px;border-bottom:1px solid var(--border)}.post-item:last-of-type{border-bottom:none}.post-item .post-title{font-size:1.1rem;font-weight:600;margin-bottom:4px;line-height:1.4}.post-item .post-title a{color:var(--text);text-decoration:none}.post-item .post-title a:hover{text-decoration:underline}.post-item .post-date{font-size:.8rem;letter-spacing:.03em;color:var(--text-secondary);display:block;margin-bottom:10px}.post-item .post-summary{font-size:.9rem;color:var(--text-secondary);line-height:1.7}.load-more-btn{display:block;margin:40px auto 16px;padding:8px 24px;font-size:.9rem;font-family:var(--font-body);color:var(--text-secondary);background:var(--bg);border:1px solid var(--border);border-radius:4px;cursor:pointer;transition:color .15s ease,border-color .15s ease}.load-more-btn:hover{color:var(--text);border-color:var(--text-secondary)}@media(min-width:1350px){body.has-toc .content-wrapper{max-width:none;display:flex;align-items:flex-start;padding:0 clamp(16px,5vw,24px)}body.has-toc .content-wrapper::before{content:'';display:block;width:calc(var(--sidebar-width) + var(--sidebar-gap));flex-shrink:0}body.has-toc .post-container{max-width:var(--max-width-article);width:100%;flex-shrink:0;margin:0 auto}body.has-toc .toc-sidebar{display:block;width:var(--sidebar-width);flex-shrink:0;margin-left:var(--sidebar-gap);visibility:hidden}body.toc-sidebar-visible .toc-sidebar{visibility:visible;position:sticky;top:24px}}@media(max-width:768px){.site-nav{display:none}.article-header .post-title{font-size:1.8rem}.article-subtitle{font-size:1rem}.banner{padding:48px 0}.banner-title{font-size:1.75rem}.banner-subtitle{font-size:1rem}.content-wrapper{max-width:none}}.post-content{word-wrap:break-word}.post-content h2{font-size:1.4rem;font-weight:600;margin:3em 0 .8em;line-height:1.3}.post-content h3{font-size:1.15rem;font-weight:600;margin:2em 0 .6em;line-height:1.35}.post-content h4{font-size:1rem;font-weight:600;margin:1.6em 0 .5em}.post-content p{margin-bottom:1.2em}.post-content ul,.post-content ol{margin:0 0 1.2em;padding-left:1.5em}.post-content li{margin-bottom:.3em}.post-content li>ul,.post-content li>ol{margin-top:.3em;margin-bottom:0}.post-content img{display:block;margin:2em auto;border-radius:4px;cursor:zoom-in}.post-content hr{border:none;border-top:1px solid var(--border);margin:2.5em 0}.post-content .highlight{margin:1.5em 0}.post-content .highlight pre{margin:0}[data-theme=dark] .chroma{color:#abb2bf;background-color:#2c3138}[data-theme=dark] .chroma .lnt,[data-theme=dark] .chroma .ln{color:#5c6370}[data-theme=dark] .chroma .k,[data-theme=dark] .chroma .kr,[data-theme=dark] .chroma .kt,[data-theme=dark] .chroma .kd{color:#c678dd}[data-theme=dark] .chroma .nf,[data-theme=dark] .chroma .nc{color:#61afef}[data-theme=dark] .chroma .nx{color:#abb2bf}[data-theme=dark] .chroma .bp,[data-theme=dark] .chroma .nb{color:#e5c07b}[data-theme=dark] .chroma .s,[data-theme=dark] .chroma .sa,[data-theme=dark] .chroma .sb,[data-theme=dark] .chroma .sc,[data-theme=dark] .chroma .dl,[data-theme=dark] .chroma .sd,[data-theme=dark] .chroma .s2,[data-theme=dark] .chroma .se,[data-theme=dark] .chroma .sh,[data-theme=dark] .chroma .si,[data-theme=dark] .chroma .sx,[data-theme=dark] .chroma .s1,[data-theme=dark] .chroma .ss{color:#98c379}[data-theme=dark] .chroma .c,[data-theme=dark] .chroma .ch,[data-theme=dark] .chroma .cm,[data-theme=dark] .chroma .c1,[data-theme=dark] .chroma .cs{color:#5c6370;font-style:italic}[data-theme=dark] .chroma .m,[data-theme=dark] .chroma .mi,[data-theme=dark] .chroma .mf,[data-theme=dark] .chroma .mb{color:#d19a66}[data-theme=dark] .chroma .o,[data-theme=dark] .chroma .ow{color:#56b6c2}[data-theme=dark] .chroma .p{color:#abb2bf}[data-theme=dark] .chroma .na,[data-theme=dark] .chroma .nv,[data-theme=dark] .chroma .vc,[data-theme=dark] .chroma .vg,[data-theme=dark] .chroma .vi{color:#e06c75}[data-theme=dark] .chroma .ge{font-style:italic}[data-theme=dark] .chroma .gs{font-weight:600}[data-theme=dark] .chroma .err{color:#e06c75;background-color:initial}.toc-sidebar{display:none;width:var(--sidebar-width);font-size:.85rem;line-height:1.7}.toc-sidebar-content ul{list-style:none;padding:0;margin:0}.toc-sidebar-content li{margin-bottom:6px}.toc-sidebar-content a{display:block;color:var(--text-secondary);text-decoration:none;padding:2px 0 2px 10px;border-left:2px solid transparent;transition:color .15s ease,border-color .15s ease}.toc-sidebar-content a:hover{color:var(--text)}.toc-sidebar-content a.active{color:var(--text);border-left-color:var(--text)}.toc-sidebar-content ul ul{padding-left:12px;margin-top:2px}.toc-close-btn{display:none;position:absolute;bottom:16px;right:16px;width:36px;height:36px;border-radius:8px;border:1px solid var(--border);cursor:pointer;color:var(--text-secondary);background:var(--bg);align-items:center;justify-content:center;transition:color .15s ease,border-color .15s ease;z-index:202}.toc-close-btn:hover{color:var(--text);border-color:var(--text-secondary)}@media(max-width:1349px){.toc-close-btn{display:flex}}.toc-overlay{position:fixed;inset:0;background:var(--overlay);z-index:200;opacity:0;visibility:hidden;transition:opacity .2s ease}.toc-open .toc-overlay{opacity:1;visibility:visible}@media(max-width:1349px){.toc-sidebar{display:block;position:fixed;top:0;right:0;width:280px;height:100vh;background:var(--bg);border-left:1px solid var(--border);z-index:201;transform:translateX(100%);transition:transform .2s ease;overflow-y:auto;padding:28px 24px}.toc-open .toc-sidebar{transform:translateX(0)}}@media(max-width:640px){.toc-sidebar{width:100%}}.fab{position:fixed;bottom:28px;right:28px;display:flex;flex-direction:column;gap:10px;z-index:100;align-items:flex-end}.fab-btn{width:40px;height:40px;border-radius:8px;border:1px solid var(--border);cursor:pointer;display:flex;align-items:center;justify-content:center;color:var(--text-secondary);background:var(--bg);transition:color .15s ease,border-color .15s ease}.fab-btn:hover{color:var(--text);border-color:var(--text-secondary)}#back-to-top{opacity:0;visibility:hidden;transition:opacity .2s ease,visibility .2s ease}#back-to-top.visible{opacity:1;visibility:visible}.fab-menu{display:flex;flex-direction:column;gap:10px}.fab-toggle{display:none}.fab-icon-sun{display:block}.fab-icon-moon{display:none}[data-theme=dark] .fab-icon-sun{display:none}[data-theme=dark] .fab-icon-moon{display:block}@media(max-width:768px){.fab-toggle{display:flex}.fab-menu{display:none}.fab-expanded .fab-menu{display:flex}}.post-item.hidden{display:none}.bg{background-color:#f7f7f7}.chroma{background-color:#f7f7f7;-webkit-text-size-adjust:none}.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:#dedede}.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 .or{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}