@charset "UTF-8";@view-transition{navigation:auto}::view-transition{background:var(--bg,#fff)}::view-transition-group(root){animation-duration:140ms}::view-transition-old(root){animation:tech-vt-out 100ms ease-out both}::view-transition-new(root){animation:tech-vt-in 140ms ease-out both}@keyframes tech-vt-out{to{opacity:0}}@keyframes tech-vt-in{from{opacity:0}to{opacity:1}}:root,[data-theme="light"]{color-scheme:light;--bg:#fff;--nav-bg:rgba(255,255,255,.72);--bg-subtle:#f6f8fa;--bg-code:#f6f8fa;--border:#d0d7de;--border-strong:#afb8c1;--text:#1f2328;--text-secondary:#656d76;--accent:#0969da;--accent-weak:#ddf4ff;--quote-bg:#eef1f6;--success:#1a7f37;--warning:#9a6700;--danger:#cf222e;--shadow:0 1px 3px rgba(31,35,40,.06);--overlay:rgba(31,35,40,.5);--code-bg:#f6f8fa;--hl-keyword:#cf222e;--hl-string:#0a3069;--hl-title:#8250df;--hl-comment:#6e7781;--hl-number:#0550ae;--hl-builtin:#953800;--hl-variable:#953800;--hl-tag:#116329;--hl-attr:#0550ae;--hl-symbol:#8250df;--hl-meta:#1f2328;--ring-a:rgba(9,105,218,.32);--ring-b:rgba(130,80,223,.32)}[data-theme="dark"]{color-scheme:dark;--bg:#0d1117;--nav-bg:rgba(13,17,23,.72);--bg-subtle:#161b22;--bg-code:#161b22;--border:#30363d;--border-strong:#484f58;--text:#e6edf3;--text-secondary:#8b949e;--accent:#58a6ff;--accent-weak:rgba(56,139,253,.15);--ring-a:#58a6ff;--ring-b:#d2a8ff;--quote-bg:#1b222c;--success:#3fb950;--warning:#d29922;--danger:#f85149;--shadow:0 1px 3px rgba(1,4,9,.4);--overlay:rgba(1,4,9,.6);--code-bg:#161b22;--hl-keyword:#ff7b72;--hl-string:#a5d6ff;--hl-title:#d2a8ff;--hl-comment:#8b949e;--hl-number:#79c0ff;--hl-builtin:#ffa657;--hl-variable:#ffa657;--hl-tag:#7ee787;--hl-attr:#79c0ff;--hl-symbol:#d2a8ff;--hl-meta:#ffa657}*{box-sizing:border-box}html{-webkit-text-size-adjust:100%;scroll-behavior:smooth;scrollbar-gutter:stable;-webkit-tap-highlight-color:transparent}body{margin:0;min-height:100vh;display:flex;flex-direction:column;font-family:"PingFang SC","Microsoft YaHei",-apple-system,BlinkMacSystemFont,"Segoe UI",sans-serif;font-size:15px;line-height:1.7;color:var(--text);background:var(--bg);-webkit-font-smoothing:antialiased;transition:background .2s,color .2s}a{color:var(--accent)}img{max-width:100%}::selection{background:var(--accent-weak)}.skip-link{position:absolute;left:-9999px;top:0;z-index:300;padding:8px 16px;background:var(--accent);color:#fff;border-radius:0 0 6px 0;text-decoration:none}.skip-link:focus{left:0}.tech-shell{max-width:1000px;margin:0 auto;padding:0 20px}.tech-main .tech-shell{max-width:1000px}.tech-nav{position:sticky;top:0;z-index:100;background:var(--nav-bg);border-bottom:1px solid var(--border);backdrop-filter:saturate(180%) blur(14px);-webkit-backdrop-filter:saturate(180%) blur(14px);box-shadow:0 -1px 0 0 var(--nav-bg)}.tech-nav-inner{display:flex;align-items:center;justify-content:flex-start;height:56px;gap:12px}.tech-logo{display:inline-flex;align-items:center;gap:2px;font-size:17px;font-weight:700;color:var(--text);text-decoration:none;white-space:nowrap}@media(hover:hover) and (pointer:fine){.tech-logo:hover{color:var(--accent)}}.tech-logo-cursor{font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;font-weight:400;font-size:.95em;line-height:1;color:var(--accent);margin-left:1px;transform:translateY(-1px)}@media(hover:hover) and (pointer:fine){.tech-logo:hover .tech-logo-cursor{color:var(--hl-title)}}.tech-logo-blink{animation:tech-blink 1.2s steps(2,start) infinite}@keyframes tech-blink{0%,100%{opacity:1}50%{opacity:0}}@media(prefers-reduced-motion:reduce){*,*::before,*::after{animation-duration:.001ms !important;animation-iteration-count:1 !important;transition-duration:.001ms !important;scroll-behavior:auto !important}.tech-quote-cursor{animation:none !important}@view-transition{navigation:none}::view-transition-old(root),::view-transition-new(root){animation:none !important}html.page-enter .tech-main{animation:none !important}}.tech-nav-links{display:flex;gap:2px;margin:0 auto}.tech-nav-link{padding:8px 12px;font-size:15px;color:var(--text-secondary);text-decoration:none;border-radius:6px;white-space:nowrap;position:relative}@media(hover:hover) and (pointer:fine){.tech-nav-link:hover{color:var(--text);background:var(--bg-subtle)}}.tech-nav-link.active{color:var(--accent);font-weight:600}.tech-nav-link.active::after{content:"";position:absolute;left:12px;right:12px;bottom:-9px;height:2px;border-radius:2px;background:var(--accent)}.tech-nav-actions{display:flex;align-items:center;gap:4px}.tech-burger{display:none}.tech-icon-btn{width:40px;height:40px;display:flex;align-items:center;justify-content:center;border:0;background:0;color:var(--text-secondary);border-radius:6px;cursor:pointer;padding:0}@media(hover:hover) and (pointer:fine){.tech-icon-btn:hover{color:var(--text);background:var(--bg-subtle)}}.tech-icon-btn.active{color:var(--accent)}[data-theme="light"] .icon-sun{display:none}[data-theme="dark"] .icon-moon{display:none}.tech-icon-btn{position:relative}html[data-theme-mode="auto"] #theme-toggle::after{content:'';position:absolute;top:3px;right:3px;width:7px;height:7px;border-radius:50%;background:var(--accent);pointer-events:none}.tech-burger{display:none}.tech-drawer-overlay{position:fixed;inset:0;z-index:200;background:var(--overlay);opacity:0;visibility:hidden;transition:opacity .2s,visibility .2s}.tech-drawer-overlay.open{opacity:1;visibility:visible}.tech-drawer{position:fixed;top:0;right:0;bottom:0;z-index:201;width:min(320px,85vw);background:var(--bg);border-left:1px solid var(--border);transform:translateX(100%);visibility:hidden;transition:transform .25s ease,visibility .25s;display:flex;flex-direction:column;padding-bottom:env(safe-area-inset-bottom)}.tech-drawer.open{transform:none;visibility:visible}.tech-drawer-head{display:flex;align-items:center;justify-content:space-between;padding:16px 20px;border-bottom:1px solid var(--border)}.tech-drawer-title{font-size:16px;font-weight:700}.tech-drawer-close{width:40px;height:40px;display:flex;align-items:center;justify-content:center;border:0;background:0;color:var(--text-secondary);border-radius:6px;cursor:pointer;font-size:20px}@media(hover:hover) and (pointer:fine){.tech-drawer-close:hover{color:var(--text);background:var(--bg-subtle)}}.tech-drawer-link{display:block;padding:14px 20px;font-size:16px;color:var(--text);text-decoration:none;border-bottom:1px solid var(--border)}@media(hover:hover) and (pointer:fine){.tech-drawer-link:hover{background:var(--bg-subtle)}}.tech-drawer-link.active{color:var(--accent);font-weight:600}.tech-main{flex:1;padding:24px 0 40px}@keyframes tech-page-enter{from{opacity:0}to{opacity:1}}html.page-enter .tech-main{animation:tech-page-enter 140ms ease-out both}.tech-main:has(.tech-page-head--center){padding-top:0}.tech-main:has(.tech-about-hero){padding-top:32px}.tech-main:has(.tech-about-hero){padding-bottom:40px}.tech-footer{border-top:1px solid var(--border);padding:24px 0 calc(24px + env(safe-area-inset-bottom));color:var(--text-secondary);font-size:14px}.tech-footer-inner{display:flex;flex-wrap:wrap;gap:8px 20px;align-items:center;justify-content:space-between}.tech-footer-links{display:flex;flex-wrap:wrap;gap:4px 16px}.tech-footer-links a{color:var(--text-secondary);text-decoration:none}@media(hover:hover) and (pointer:fine){.tech-footer-links a:hover{color:var(--accent)}}.tech-footer-copy{margin:0}.tech-footer-beian{width:100%}.tech-footer-beian a{color:var(--text-secondary);text-decoration:none;margin-right:16px}@media(hover:hover) and (pointer:fine){.tech-footer-beian a:hover{color:var(--accent)}}.tech-top{position:fixed;right:20px;bottom:calc(20px + env(safe-area-inset-bottom));width:44px;height:44px;z-index:150;display:flex;align-items:center;justify-content:center;border:1px solid var(--border);border-radius:8px;background:var(--bg);color:var(--text-secondary);cursor:pointer;box-shadow:var(--shadow);opacity:0;visibility:hidden;transition:opacity .2s,visibility .2s}.tech-top.show{opacity:1;visibility:visible}@media(hover:hover) and (pointer:fine){.tech-top:hover{color:var(--accent);border-color:var(--accent)}}.tech-top.hide{opacity:0 !important;visibility:hidden !important}.tech-top.scrolled{width:36px;height:36px;right:28px;bottom:calc(28px + env(safe-area-inset-bottom));border-radius:50%}.tech-page-head{margin-bottom:16px;padding-bottom:12px;border-bottom:1px solid var(--border);position:relative}.tech-page-head::after{content:"";position:absolute;left:0;bottom:-1px;width:64px;height:3px;border-radius:2px;background:linear-gradient(90deg,var(--accent),var(--hl-title))}.tech-page-title{font-size:26px;font-weight:700;line-height:1.4;margin:0 0 8px}.tech-page-desc{font-size:14px;color:var(--text-secondary);margin:0}.tech-page-head--center{text-align:center;padding:48px 12px 32px;margin-bottom:28px}.tech-page-head--center::after{left:50%;transform:translateX(-50%);width:64px}.tech-page-head--center .tech-page-title{font-size:28px;letter-spacing:.01em;margin:0 0 12px}.tech-page-head--center .tech-page-desc{font-size:15px}@media(min-width:769px){.tech-page-head--center .tech-page-title{font-size:34px}.tech-quote{margin-top:20px;font-size:15px}.tech-quote .tech-quote-refresh svg{width:16px;height:16px}}.tech-quote{display:flex;align-items:center;justify-content:center;flex-wrap:wrap;gap:4px 10px;margin-top:28px;min-height:26px;font-size:14px;line-height:1.9;color:var(--text);padding-bottom:10px}.tech-quote-text{word-break:break-word}.tech-quote-src{font-size:13px;color:var(--text-secondary)}.tech-quote-src:empty{display:none}.tech-quote-cursor{flex:none;width:2px;height:17px;margin-left:1px;background:var(--accent);border-radius:1px;animation:tech-blink 1.2s steps(2,start) infinite}.tech-quote-refresh{display:inline-flex;align-items:center;justify-content:center;width:24px;height:24px;padding:0;color:var(--text-secondary);background:0;border:0;border-radius:6px;cursor:pointer;transition:color .15s,background .15s}.tech-quote-refresh svg{width:14px;height:14px;transition:transform .28s ease}@media(hover:hover) and (pointer:fine){.tech-quote-refresh:hover{color:var(--accent);background:var(--bg-subtle)}}.tech-quote-refresh.spin svg{transform:rotate(360deg)}.tech-page-desc--mono{font-family:ui-monospace,SFMono-Regular,"SF Mono",Menlo,Consolas,"Liberation Mono",monospace;letter-spacing:.01em}.tech-search-layer{position:fixed;top:56px;left:0;right:0;z-index:99;display:none;padding:12px 0 14px;border-top:1px solid var(--border);background:var(--nav-bg);backdrop-filter:saturate(180%) blur(14px);-webkit-backdrop-filter:saturate(180%) blur(14px)}.tech-search-layer.open{display:block;animation:tech-search-drop .18s ease}@keyframes tech-search-drop{from{opacity:0;transform:translateY(-6px)}to{opacity:1;transform:translateY(0)}}.tech-search-form{display:flex;align-items:center;gap:8px}.tech-search-input{flex:1;min-width:0;height:44px;padding:0 14px;font-size:16px;color:var(--text);background:var(--bg);border:1px solid var(--border);border-radius:8px;outline:0}.tech-search-input:focus{border-color:var(--accent);box-shadow:0 0 0 3px var(--accent-weak)}.tech-search-btn{height:44px;padding:0 20px;flex-shrink:0;font-size:15px;font-weight:600;color:#fff;background:var(--accent);border:0;border-radius:8px;cursor:pointer}@media(hover:hover) and (pointer:fine){.tech-search-btn:hover{filter:brightness(1.1)}}.tech-search-close{flex:none;width:44px;height:44px;display:flex;align-items:center;justify-content:center;border:0;background:0;color:var(--text-secondary);font-size:24px;line-height:1;border-radius:8px;cursor:pointer}@media(hover:hover) and (pointer:fine){.tech-search-close:hover{color:var(--text);background:var(--bg-subtle)}}.tech-post-list{list-style:none;margin:0;padding:0}.tech-post-item{position:relative;padding:16px;margin:0 -8px 24px;border-radius:10px;border-bottom:1px solid var(--border);-webkit-tap-highlight-color:transparent;transition:background-color .18s ease}.tech-post-item:last-child{border-bottom:0}@media(hover:hover) and (pointer:fine) and (min-width:768px){.tech-post-item:hover{background:var(--bg-subtle)}.tech-post-item:hover .tech-post-title a{color:var(--accent)}.tech-post-item:hover .tech-post-arrow{opacity:1;transform:translateX(0)}}.tech-post-arrow{position:absolute;top:17px;right:8px;font-size:18px;line-height:1;color:var(--accent);opacity:0;transform:translateX(-6px);transition:opacity .18s ease,transform .18s ease;pointer-events:none}@media(max-width:767px){.tech-post-item{margin:0 0 20px;padding:14px 0}.tech-post-arrow{display:none}}.tech-post-meta{display:flex;flex-wrap:wrap;gap:6px 16px;font-size:13px;color:var(--text-secondary);margin-bottom:6px}.tech-badge-featured{display:inline-block;flex:none;color:var(--accent);font-size:12px;font-weight:600}.tech-post-title{font-size:17px;font-weight:600;line-height:1.5;margin:0 0 6px}.tech-post-title a{color:var(--text);text-decoration:none;transition:color .15s}.tech-post-excerpt{font-size:14px;color:var(--text-secondary);line-height:1.7;margin:0 0 10px;display:-webkit-box;-webkit-line-clamp:2;line-clamp:2;-webkit-box-orient:vertical;overflow:hidden}.tech-post-tags{display:flex;flex-wrap:wrap;gap:6px}.tech-tag{display:inline-flex;align-items:center;gap:4px;font-size:12px;color:var(--accent);background:var(--bg-subtle);border:1px solid var(--border);padding:2px 10px;border-radius:12px;text-decoration:none;cursor:pointer;transition:border-color .15s,color .15s,background-color .15s,transform .1s}@media(hover:hover) and (pointer:fine){.tech-tag:hover{border-color:var(--accent);color:var(--accent);background:color-mix(in srgb,var(--accent) 10%,var(--bg-subtle))}}.tech-tag:active{transform:translateY(1px)}.tech-filter-bar{display:flex;flex-wrap:wrap;gap:8px;margin-bottom:24px;padding-bottom:16px;border-bottom:1px solid var(--border)}.tech-cs{position:relative;flex:1;min-width:150px}.tech-cs-trigger{width:100%;height:40px;padding:0 12px;display:flex;align-items:center;justify-content:space-between;gap:8px;font-size:14px;color:var(--text);background:var(--bg);border:1px solid var(--border);border-radius:6px;outline:0;cursor:pointer;transition:border-color .15s,box-shadow .15s}@media(hover:hover) and (pointer:fine){.tech-cs-trigger:hover{border-color:var(--border-strong)}}.tech-cs.is-open .tech-cs-trigger,.tech-cs-trigger:focus-visible{border-color:var(--accent);box-shadow:0 0 0 3px var(--accent-weak)}.tech-cs-arrow{flex:none;opacity:.6;transition:transform .15s}.tech-cs.is-open .tech-cs-arrow{transform:rotate(180deg)}.tech-cs-trigger>span{flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;text-align:left}.tech-cs-items{position:absolute;top:calc(100% + 4px);left:0;right:0;z-index:40;max-height:264px;overflow-y:auto;padding:4px;margin:0;list-style:none;background:var(--bg);border:1px solid var(--border);border-radius:8px;box-shadow:0 8px 24px rgba(0,0,0,.14);display:none}.tech-cs.is-open .tech-cs-items{display:block}.tech-cs-item{display:block;width:100%;padding:8px 10px;margin:0;text-align:left;font-size:14px;line-height:1.4;color:var(--text);background:transparent;border:0;border-radius:5px;cursor:pointer;transition:background .12s,color .12s}@media(hover:hover) and (pointer:fine){.tech-cs-item:hover{background:var(--bg-subtle)}}.tech-cs-item.is-selected{color:var(--accent);font-weight:600;background:var(--accent-weak)}.tech-more-wrap{display:flex;justify-content:center;margin-top:32px}.tech-pagination{display:flex;flex-wrap:wrap;gap:6px;justify-content:center;margin-top:32px}.tech-page-btn{min-width:40px;height:40px;padding:0 12px;display:flex;align-items:center;justify-content:center;border:1px solid var(--border);border-radius:6px;color:var(--text-secondary);text-decoration:none;font-size:14px}@media(hover:hover) and (pointer:fine){.tech-page-btn:hover{border-color:var(--accent);color:var(--accent)}}.tech-page-btn.active{background:var(--accent);border-color:var(--accent);color:#fff}.tech-page-ellipsis{display:flex;align-items:center;color:var(--text-secondary);padding:0 4px}.tech-empty{text-align:center;padding:60px 20px;color:var(--text-secondary)}.tech-empty-icon{font-size:40px;margin-bottom:12px;opacity:.4}.tech-empty h3{font-size:18px;color:var(--text);margin:0 0 6px}.tech-empty p{margin:0;font-size:14px}.tech-reading-progress{position:fixed;top:0;left:0;z-index:200;width:0;height:3px;background:linear-gradient(90deg,var(--accent),var(--hl-title));transition:width .1s linear}.tech-post-wrap{max-width:1000px;margin:0 auto}.tech-post-layout{display:block}.tech-toc-sidebar{margin:16px 0}@media(min-width:1400px){.tech-toc-sidebar{position:fixed;top:80px;left:calc(50% + 520px);width:180px;margin:0}.tech-toc-summary{cursor:default}.tech-toc-summary::after{display:none}}.tech-post-header{margin-bottom:16px;padding-bottom:12px;border-bottom:1px solid var(--border)}.tech-post-title-lg{font-size:24px;font-weight:700;line-height:1.35;margin:0 0 10px}.tech-post-meta-lg{display:flex;flex-wrap:wrap;gap:4px 14px;font-size:13px;color:var(--text-secondary);margin-bottom:8px}.tech-post-tags-lg{display:flex;flex-wrap:wrap;gap:6px}.tech-post-body :is(h1,h2,h3,h4,h5,h6){scroll-margin-top:72px}.tech-toc{border:1px solid var(--border);border-radius:8px;background:var(--bg-subtle)}.tech-toc-summary{padding:10px 14px;font-size:14px;font-weight:600;cursor:pointer;user-select:none;list-style:none;display:flex;align-items:center;justify-content:space-between}.tech-toc-summary::-webkit-details-marker{display:none}.tech-toc-summary::after{content:"";width:8px;height:8px;flex-shrink:0;border-right:2px solid var(--text-secondary);border-bottom:2px solid var(--text-secondary);transform:rotate(45deg);transition:transform .2s;margin-top:-4px}.tech-toc[open] .tech-toc-summary::after{transform:rotate(-135deg);margin-top:4px}.tech-toc-body{padding:0 14px 12px;max-height:60vh;overflow-y:auto}.tech-toc-body::-webkit-scrollbar{width:6px}.tech-toc-body::-webkit-scrollbar-track{background:transparent}.tech-toc-body::-webkit-scrollbar-thumb{background:var(--border);border-radius:3px}@media(hover:hover) and (pointer:fine){.tech-toc-body::-webkit-scrollbar-thumb:hover{background:var(--text-secondary)}}@supports(-moz-appearance:none){.tech-toc-body{scrollbar-width:thin;scrollbar-color:var(--border) transparent}}.tech-toc-body .toc{margin:0}.tech-toc-body ul{list-style:none;margin:0;padding:0}.tech-toc-body ul ul{padding-left:16px}.tech-toc-body a{display:block;padding:3px 0;font-size:13px;line-height:1.6;color:var(--text-secondary);text-decoration:none;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}@media(hover:hover) and (pointer:fine){.tech-toc-body a:hover{color:var(--accent)}}.tech-toc-body a.is-active{color:var(--accent);font-weight:600;border-left:2px solid var(--accent);padding-left:8px;margin-left:-10px}.tech-post-body,.tech-post-body.markdown-body{font-size:15px;line-height:1.65;word-wrap:break-word}.tech-post-body h1,.tech-post-body h2,.tech-post-body h3,.tech-post-body h4,.tech-post-body h5,.tech-post-body h6,.tech-post-body.markdown-body h1,.tech-post-body.markdown-body h2,.tech-post-body.markdown-body h3,.tech-post-body.markdown-body h4,.tech-post-body.markdown-body h5,.tech-post-body.markdown-body h6{font-weight:700;line-height:1.35;margin:20px 0 9px}.tech-post-body h1,.tech-post-body.markdown-body h1{font-size:20px;padding-bottom:0;border-bottom:0}.tech-post-body h2,.tech-post-body.markdown-body h2{font-size:18px;padding-bottom:8px;border-bottom:1px solid var(--border)}.tech-post-body h3,.tech-post-body.markdown-body h3{font-size:16.5px}.tech-post-body h4,.tech-post-body.markdown-body h4{font-size:15.5px}.tech-post-body h5,.tech-post-body.markdown-body h5{font-size:15px}.tech-post-body h6,.tech-post-body.markdown-body h6{font-size:14.5px}.tech-post-body p,.tech-post-body.markdown-body p{margin:0 0 13px}.tech-post-body strong,.tech-post-body.markdown-body strong{font-weight:600}.tech-post-body em{font-style:italic}.tech-post-body s,.tech-post-body del{color:var(--text-secondary)}.tech-post-body sub,.tech-post-body sup{font-size:12px}.tech-post-body abbr{border-bottom:1px dotted var(--border-strong);cursor:help}.tech-post-body details,.tech-proj-readme-body details{margin:0 0 10px}.tech-post-body summary,.tech-proj-readme-body summary{cursor:pointer;font-weight:600}.tech-post-body summary::marker,.tech-proj-readme-body summary::marker{color:var(--text-secondary)}.tech-post-body details[open]>summary,.tech-proj-readme-body details[open]>summary{margin-bottom:8px}.tech-post-body details>*,.tech-proj-readme-body details>*{margin-left:0}.tech-post-body details>:last-child,.tech-proj-readme-body details>:last-child{margin-bottom:0}.tech-post-body a{color:var(--accent);text-decoration:none;border-bottom:1px solid color-mix(in srgb,var(--accent) 35%,transparent);transition:border-color .15s,background-color .15s}@media(hover:hover) and (pointer:fine){.tech-post-body a:hover{border-bottom-color:var(--accent);background:color-mix(in srgb,var(--accent) 8%,transparent)}}.tech-post-body img{max-width:100%;border-radius:6px;display:block;margin:8px auto;cursor:zoom-in}.tech-post-body blockquote{margin:0 0 10px;padding:8px 14px;border-left:3px solid var(--accent);border-radius:0 6px 6px 0;background:var(--quote-bg);color:var(--text)}.tech-post-body blockquote>:first-child{margin-top:0}.tech-post-body blockquote>:last-child{margin-bottom:0}.tech-post-body blockquote p{margin:6px 0}.tech-post-body code{font-family:ui-monospace,SFMono-Regular,"SF Mono",Menlo,Consolas,monospace;font-size:13.5px;background:var(--bg-subtle);padding:2px 6px;border-radius:4px}.tech-post-body pre{background:var(--code-bg);border:1px solid var(--border);border-radius:8px;padding:16px;overflow-x:auto;margin:0 0 10px;line-height:1.5;text-align:left}.tech-post-body pre code{background:0;padding:0;font-size:13.5px}.code-wrap{position:relative;margin:0 0 10px}.code-wrap pre{margin:0}.code-copy{position:absolute;top:8px;right:8px;z-index:1;padding:3px 10px;font-size:12px;line-height:1.5;border:1px solid var(--border);border-radius:4px;background:var(--bg);color:var(--text-secondary);cursor:pointer;opacity:0;transition:opacity .2s}@media(hover:hover) and (pointer:fine){.code-wrap:hover .code-copy,.code-copy:focus{opacity:1}}@media(hover:hover) and (pointer:fine){.code-copy:hover{color:var(--accent);border-color:var(--accent)}}@media(hover:none){.code-copy{opacity:1}}.tech-post-body table{width:100%;border-collapse:collapse;margin:0 0 10px;font-size:inherit;display:block;overflow-x:auto}.tech-post-body th,.tech-post-body td{border:1px solid var(--border);padding:6px 10px;text-align:left}.tech-post-body th{background:var(--bg-subtle);font-weight:600}.tech-post-body ul,.tech-post-body ol{padding-left:22px;margin:0 0 10px}.tech-post-body li{margin-bottom:2px}.tech-post-body li>ul,.tech-post-body li>ol{margin-bottom:0}.tech-post-body hr{border:0;border-top:1px solid var(--border);margin:18px 0}.tech-post-body .task-list-item{list-style:none;margin-left:-20px}.tech-post-body input[type="checkbox"]{margin-right:6px}.tech-post-body .ck{font-style:normal;font-size:1.05em;margin-right:.3em}.tech-post-body .ck-todo{color:var(--text-secondary)}.tech-post-body .ck-done{color:var(--success)}.tech-post-body li:has(.ck){list-style:none;margin-left:-1.2em}.tech-post-body .admonition{padding:10px 14px;border-radius:8px;margin:0 0 10px;border-left:4px solid var(--border-strong);background:var(--bg-subtle)}.tech-post-body .admonition-title{font-weight:700;margin:0 0 6px}.tech-post-body .admonition p:last-child{margin-bottom:0}.tech-post-body .admonition.note{border-left-color:var(--accent);background:var(--accent-weak)}.tech-post-body .admonition.note .admonition-title{color:var(--accent)}.tech-post-body .admonition.tip{border-left-color:var(--success);background:rgba(26,127,55,.08)}.tech-post-body .admonition.tip .admonition-title{color:var(--success)}.tech-post-body .admonition.warning{border-left-color:var(--warning);background:rgba(154,103,0,.08)}.tech-post-body .admonition.warning .admonition-title{color:var(--warning)}.tech-post-body .admonition.danger{border-left-color:var(--danger);background:rgba(207,34,46,.08)}.tech-post-body .admonition.danger .admonition-title{color:var(--danger)}.tech-post-body del{color:var(--text-secondary)}.tech-post-body mark{background:rgba(154,103,0,.18);color:inherit;padding:0 4px;border-radius:3px}.tech-post-body kbd{font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;font-size:12px;background:var(--bg-subtle);border:1px solid var(--border-strong);border-bottom-width:2px;border-radius:4px;padding:2px 6px}.tech-post-body dl{margin:0 0 10px}.tech-post-body dt{font-weight:600;margin-top:6px}.tech-post-body dd{margin:0 0 4px 24px;color:var(--text-secondary)}.tech-post-body .footnote{font-size:13px;color:var(--text-secondary)}.tech-post-body .footnote-ref{font-size:12px}.tech-post-body .footnote-backref{text-decoration:none}.media-wrap{position:relative;width:100%;aspect-ratio:16 / 9;margin:0 0 16px;border-radius:8px;overflow:hidden;background:#000}.media-wrap video,.media-wrap iframe{position:absolute;inset:0;width:100%;height:100%;border:0}.hljs{color:var(--text);background:transparent}.hljs-keyword,.hljs-selector-tag,.hljs-subst{color:var(--hl-keyword)}.hljs-string,.hljs-attr,.hljs-template-tag,.hljs-regexp{color:var(--hl-string)}.hljs-title,.hljs-section,.hljs-function .hljs-title{color:var(--hl-title)}.hljs-comment,.hljs-quote{color:var(--hl-comment);font-style:italic}.hljs-number,.hljs-literal,.hljs-symbol,.hljs-bullet{color:var(--hl-number)}.hljs-built_in,.hljs-type,.hljs-class .hljs-title{color:var(--hl-builtin)}.hljs-variable,.hljs-template-variable,.hljs-params{color:var(--hl-variable)}.hljs-tag,.hljs-name{color:var(--hl-tag)}.hljs-attribute{color:var(--hl-attr)}.hljs-meta,.hljs-meta .hljs-keyword{color:var(--hl-meta)}.hljs-addition{color:var(--hl-tag)}.hljs-deletion{color:var(--hl-keyword)}.hljs-emphasis{font-style:italic}.hljs-strong{font-weight:700}.tech-post-pager{margin:26px 0 0;display:grid;grid-template-columns:1fr 1fr;gap:12px}.tech-pager-link{display:flex;flex-direction:column;gap:4px;padding:14px 16px;min-width:0;border:1px solid var(--border);border-radius:8px;text-decoration:none;color:var(--text)}@media(hover:hover) and (pointer:fine){.tech-pager-link:not(.tech-pager-empty):hover{border-color:var(--accent)}}.tech-pager-dir{display:inline-flex;align-items:center;gap:4px;font-size:12px;color:var(--text-secondary)}.tech-pager-title{display:block;font-size:14px;font-weight:600;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.tech-pager-next{text-align:right}.tech-pager-empty{display:flex;align-items:center;justify-content:center;border-style:dashed;color:var(--text-secondary);font-size:12px;opacity:.7}.tech-post-footer{margin:22px 0 0;padding-top:14px;border-top:1px solid var(--border)}.tech-post-tags-bottom{display:flex;flex-wrap:wrap;gap:6px;margin-bottom:12px}.tech-post-actions{display:flex;flex-wrap:wrap;gap:10px;align-items:center}.tech-btn{display:inline-flex;align-items:center;gap:6px;height:40px;padding:0 16px;font-size:14px;font-weight:600;border:1px solid var(--border);border-radius:6px;background:var(--bg);color:var(--text);cursor:pointer;text-decoration:none}@media(hover:hover) and (pointer:fine){.tech-btn:hover{border-color:var(--accent);color:var(--accent)}}.tech-btn-primary{background:var(--accent);border-color:var(--accent);color:#fff}[data-theme="dark"] .tech-btn-primary{color:#0d1117}@media(hover:hover) and (pointer:fine){.tech-btn-primary:hover{filter:brightness(.92);color:#fff}[data-theme="dark"] .tech-btn-primary:hover{filter:brightness(1.12);color:#0d1117}}.tech-license{font-size:13px;color:var(--text-secondary);margin:0 0 0 auto}.tech-toast{position:fixed;left:50%;bottom:28px;z-index:300;transform:translateX(-50%) translateY(6px);max-width:min(86vw,420px);padding:9px 18px;font-size:13px;font-weight:500;line-height:1.5;color:var(--text);background:var(--nav-bg);border:1px solid var(--border-strong);border-radius:8px;backdrop-filter:saturate(180%) blur(14px);-webkit-backdrop-filter:saturate(180%) blur(14px);box-shadow:0 8px 24px rgba(0,0,0,.16);white-space:nowrap;overflow:hidden;text-overflow:ellipsis;opacity:0;visibility:hidden;pointer-events:none;transition:opacity .2s ease,transform .2s ease,visibility .2s}.tech-toast.show{opacity:1;visibility:visible;transform:translateX(-50%) translateY(0)}.tech-related{margin:26px 0 0}.tech-related-title{font-size:18px;font-weight:600;margin:0 0 12px}.tech-featured{position:relative;margin-bottom:24px;border-bottom:1px solid var(--border)}.tech-featured::after{content:"";position:absolute;left:50%;transform:translateX(-50%);bottom:-1px;width:64px;height:3px;border-radius:2px;background:linear-gradient(90deg,var(--accent),var(--hl-title))}.tech-related-grid{display:grid;grid-template-columns:repeat(4,minmax(0,1fr));gap:12px}.tech-related-card{display:flex;flex-direction:column;gap:6px;padding:14px 16px;border:1px solid var(--border);border-radius:8px;text-decoration:none;color:var(--text);transition:border-color .15s,background .15s}@media(hover:hover) and (pointer:fine){.tech-related-card:hover{border-color:var(--accent);background:var(--bg-subtle)}}.tech-related-card-title{font-size:14px;font-weight:600;line-height:1.5;overflow:hidden;text-overflow:ellipsis;display:-webkit-box;-webkit-line-clamp:2;line-clamp:2;-webkit-box-orient:vertical}.tech-related-card-meta{font-size:12px;color:var(--text-secondary)}.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}.tech-share-row{display:flex;gap:10px}.tech-about-empty{color:var(--text-secondary)}[hidden]{display:none !important}.tech-input,.tech-textarea{width:100%;padding:10px 12px;margin-bottom:10px;font-size:16px;color:var(--text);background:var(--bg);border:1px solid var(--border);border-radius:6px;outline:0;font-family:inherit}.tech-input:focus,.tech-textarea:focus{border-color:var(--accent);box-shadow:0 0 0 3px var(--accent-weak)}.tech-textarea{min-height:100px;resize:vertical}.tech-tags-cloud{display:flex;flex-wrap:wrap;gap:10px}.tech-tag-cloud-item{display:inline-flex;align-items:center;gap:8px;padding:8px 14px;font-size:14px;border:1px solid var(--border);border-radius:8px;color:var(--text);text-decoration:none}@media(hover:hover) and (pointer:fine){.tech-tag-cloud-item:hover{border-color:var(--accent);color:var(--accent)}}.tech-tag-cloud-count{font-size:12px;color:var(--text-secondary);background:var(--bg-subtle);padding:1px 8px;border-radius:10px}.tech-about-hero{display:flex;flex-direction:column;align-items:center;padding:32px 24px 24px;margin:0 0 24px;border:1px solid var(--border);border-radius:12px;background:var(--bg)}.tech-about-hero::after{display:none}.tech-about-hero .tech-page-title{font-size:22px;margin:0 0 8px}.tech-avatar-wrap{margin-bottom:12px}.tech-avatar,.tech-avatar-placeholder{box-sizing:border-box;width:118px;height:118px;flex-shrink:0;border-radius:50%;object-fit:cover;padding:2px;border:2px solid transparent;background:linear-gradient(var(--bg),var(--bg)) padding-box,linear-gradient(135deg,var(--ring-a),var(--ring-b)) border-box;box-shadow:0 0 0 3px var(--bg-subtle),0 6px 24px rgba(0,0,0,.10);transition:transform .3s ease,box-shadow .3s ease}.tech-avatar-placeholder{display:flex;align-items:center;justify-content:center;color:var(--text-secondary);font-size:46px}.tech-avatar--broken{display:none}.tech-avatar--fallback{display:none}.tech-avatar--broken+.tech-avatar--fallback{display:flex}@media(hover:hover) and (pointer:fine){.tech-avatar:hover,.tech-avatar-placeholder:hover{transform:scale(1.06) rotate(4deg);box-shadow:0 0 0 3px var(--bg-subtle),0 12px 32px rgba(0,0,0,.18)}}.tech-about-bio{max-width:800px;margin:0 auto;font-size:15px;line-height:1.9;color:var(--text-secondary)}.tech-about-social{display:flex;flex-wrap:wrap;justify-content:center;gap:8px;margin-top:18px}.tech-about-social-btn{display:inline-flex;align-items:center;gap:6px;padding:7px 16px;font-size:13px;border:1px solid var(--border);border-radius:999px;color:var(--text-secondary);text-decoration:none;transition:color .2s,border-color .2s}@media(hover:hover) and (pointer:fine){.tech-about-social-btn:hover{color:var(--accent);border-color:var(--accent)}}.tech-about-stats{display:flex;justify-content:center;width:100%;margin-top:20px;padding-top:16px;border-top:1px solid var(--border)}.tech-stat{display:flex;align-items:baseline;gap:8px;padding:0 24px;line-height:1}.tech-stat+.tech-stat{border-left:1px solid var(--border)}.tech-stat b{font-size:22px;color:var(--text);font-variant-numeric:tabular-nums}.tech-stat span{font-size:12px;color:var(--text-secondary)}.tech-about{max-width:1000px;margin:36px auto 0}.tech-about-section{margin-bottom:24px}.tech-about-section>h2{position:relative;font-size:18px;font-weight:600;margin:0 0 16px;padding-left:14px}.tech-about-section>h2::before{content:"";position:absolute;left:0;top:50%;transform:translateY(-50%);width:4px;height:18px;border-radius:2px;background:linear-gradient(180deg,var(--accent),var(--hl-title))}.tech-skill-list{display:grid;grid-template-columns:repeat(2,1fr);gap:4px 28px}.tech-skill-row{display:flex;flex-direction:column;gap:6px;margin-bottom:14px}.tech-skill-head{display:flex;justify-content:space-between;align-items:baseline;gap:8px}.tech-skill-name{font-size:14px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.tech-skill-level{font-size:12px;color:var(--text-secondary);flex-shrink:0}.tech-skill-bar{height:6px;background:var(--bg-subtle);border-radius:3px;overflow:hidden}.tech-skill-fill{height:100%;border-radius:3px;width:var(--sl,0);background:linear-gradient(90deg,var(--accent),var(--hl-title));transition:width .9s cubic-bezier(.22,.61,.36,1)}.tech-timeline{list-style:none;margin:0;padding:0}.tech-timeline-item{position:relative;display:flex;align-items:baseline;gap:12px;padding:0 0 16px 20px;border-left:2px solid var(--border)}.tech-timeline-item:last-child{border-left-color:transparent;padding-bottom:0}.tech-timeline-item::before{content:"";position:absolute;left:-6px;top:5px;width:10px;height:10px;border-radius:50%;background:var(--accent);border:2px solid var(--bg)}.tech-timeline-date{font-size:13px;color:var(--accent);font-weight:600;flex:0 0 108px}.tech-timeline-content{font-size:14px;margin:0}.tech-lang-stats{display:flex;flex-wrap:wrap;gap:8px;font-size:13px;color:var(--text-secondary);margin-bottom:0;padding-bottom:0}.tech-lang-link{cursor:pointer;color:var(--text-secondary);padding:4px 12px;border-radius:12px;border:1px solid var(--border);background:transparent}@media(hover:hover) and (pointer:fine){.tech-lang-link:hover{color:var(--accent);border-color:var(--accent)}}.tech-lang-link.is-active{color:var(--accent);font-weight:600;background:color-mix(in srgb,var(--accent) 10%,transparent);border-color:var(--accent)}.tech-project-grid{display:grid;grid-template-columns:repeat(2,1fr);gap:20px;padding-top:20px;padding-bottom:20px}@media(min-width:1024px){.tech-project-grid{grid-template-columns:repeat(3,1fr)}}.tech-project-card{display:flex;flex-direction:column;gap:8px;padding:24px;min-width:0;border:1px solid var(--border);border-radius:10px;background:var(--bg);transition:border-color .2s,box-shadow .2s}@media(hover:hover) and (pointer:fine){.tech-project-card:hover{border-color:var(--accent);box-shadow:0 4px 16px rgba(0,0,0,.08)}}.tech-project-card-head{display:flex;align-items:center;gap:8px}.tech-project-name{font-size:17px;font-weight:600;color:var(--text);text-decoration:none;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}@media(hover:hover) and (pointer:fine){.tech-project-name:hover{color:var(--accent)}}.tech-project-featured{font-size:11px;color:var(--warning);border:1px solid var(--warning);border-radius:10px;padding:1px 8px;flex-shrink:0}.tech-project-desc{font-size:14px;color:var(--text-secondary);margin:0;display:-webkit-box;-webkit-line-clamp:3;line-clamp:3;-webkit-box-orient:vertical;overflow:hidden}.tech-project-meta{display:flex;flex-wrap:wrap;gap:6px;font-size:13px;color:var(--text-secondary);margin-top:auto;padding-top:12px;border-top:1px solid var(--border)}.tech-project-card-head .tech-project-stars{margin-left:auto;flex-shrink:0}.tech-project-stars{color:var(--warning)}.tech-project-lang{display:inline-flex;align-items:center;gap:6px;padding:2px 8px;border-radius:10px;background:var(--bg-subtle);font-size:12px}.tech-project-lang-pct{opacity:.65}.tech-project-lang-more{display:inline-flex;align-items:center;padding:2px 8px;border-radius:10px;border:1px dashed var(--border);color:var(--text-secondary);font-size:12px;cursor:help;position:relative}.tech-project-lang-more{cursor:help;position:relative}.tech-project-lang-more .tech-tip{display:none;position:absolute;right:0;bottom:calc(100% + 8px);z-index:5;padding:6px 8px;border-radius:8px;background:var(--bg);border:1px solid var(--border);box-shadow:0 8px 24px rgba(0,0,0,.14);font-size:12px;color:var(--text);pointer-events:none}.tech-project-lang-more .tech-tip-item{display:flex;align-items:center;gap:6px;white-space:nowrap;line-height:1.7}@media(hover:hover) and (pointer:fine){.tech-project-lang-more:hover .tech-tip,.tech-project-lang-more:focus .tech-tip{display:block}}.tech-project-lang-more.is-open .tech-tip{display:block}.tech-lang-dot{width:10px;height:10px;border-radius:50%;display:inline-block;background:var(--lang-color,#8b949e)}html{touch-action:manipulation}.tech-proj{padding:0 0 8px}.tech-main:has(.tech-proj){padding-top:16px}.tech-proj-head{display:flex;align-items:center;justify-content:space-between;gap:16px;flex-wrap:wrap;margin-bottom:16px}.tech-proj-crumb{display:flex;align-items:center;gap:8px;flex-wrap:wrap;margin:0;min-width:0;font-size:20px;font-weight:400;line-height:1.4}.tech-proj-owner{color:var(--accent);text-decoration:none;min-width:0}@media(hover:hover) and (pointer:fine){.tech-proj-owner:hover{text-decoration:underline}}.tech-proj-sep{color:var(--text-secondary)}.tech-proj-repo{color:var(--accent);font-weight:600;text-decoration:none;min-width:0}@media(hover:hover) and (pointer:fine){.tech-proj-repo:hover{text-decoration:underline}}.tech-proj-badge{font-size:11px;font-weight:500;color:var(--warning);border:1px solid var(--warning);border-radius:10px;padding:1px 8px;flex-shrink:0}.tech-proj-actions{display:flex;gap:8px;flex-shrink:0}.tech-proj-btn{display:inline-flex;align-items:center;gap:6px;padding:5px 12px;border-radius:6px;font-size:12px;font-weight:500;line-height:1.4;color:var(--text);background:var(--bg-subtle);border:1px solid var(--border);text-decoration:none;transition:background .15s,border-color .15s,color .15s}@media(hover:hover) and (pointer:fine){.tech-proj-btn:hover{background:var(--accent-weak);border-color:var(--accent);color:var(--accent)}}.tech-proj-btn-icon{display:inline-block;vertical-align:middle}.tech-proj-btn--gh{color:#fff;background:var(--accent);border-color:var(--accent)}@media(hover:hover) and (pointer:fine){.tech-proj-btn--gh:hover{color:#fff;filter:brightness(1.1);background:var(--accent)}}.tech-proj-info{margin-bottom:16px;padding-bottom:16px;border-bottom:1px solid var(--border)}.tech-proj-about-desc{margin:0 0 10px;font-size:14px;color:var(--text-secondary);line-height:1.7}.tech-proj-topics{display:flex;flex-wrap:wrap;gap:6px}.tech-proj-topic{padding:3px 12px;border-radius:12px;background:var(--accent-weak);font-size:12px;font-weight:500;color:var(--accent)}.tech-proj-langs{display:flex;flex-wrap:wrap;gap:8px}.tech-proj-topics+.tech-proj-langs{margin-top:10px}.tech-proj-info .tech-proj-langs:first-child{margin-top:0}.tech-proj-readme{padding:0;min-width:0;border:0;border-radius:0;background:transparent}.tech-proj-readme-head{display:flex;align-items:center;justify-content:space-between;gap:12px;flex-wrap:wrap;padding-bottom:0;margin-bottom:20px;border-bottom:0}.tech-proj-readme-title{display:inline-flex;align-items:center;gap:8px;margin:0;font-size:17px;font-weight:600}.tech-proj-readme-age{font-size:12px;color:var(--text-secondary)}.tech-proj-feedback{font-size:13px;font-weight:500;color:var(--text-secondary);background:var(--bg-subtle);border:1px solid var(--border);border-radius:8px;padding:5px 14px;cursor:pointer;transition:color .18s ease,border-color .18s ease,transform .18s ease;display:inline-flex;align-items:center;gap:5px}@media(hover:hover) and (pointer:fine){.tech-proj-feedback:hover{color:var(--accent);border-color:var(--accent);transform:translateY(-1px)}}.tech-proj-feedback:active{transform:translateY(0)}.tech-proj-feedback:focus-visible{outline:2px solid var(--accent);outline-offset:2px}.tech-proj-feedback-icon{display:inline-block;vertical-align:middle}.tech-proj-readme-body{min-width:0}.tech-proj-readme-body,.tech-proj-readme-body.markdown-body{font-size:15px;line-height:1.65}.tech-proj-readme-body h1,.tech-proj-readme-body.markdown-body h1{font-size:20px;font-weight:700;line-height:1.35;margin:20px 0 9px;padding-bottom:0;border-bottom:0}.tech-proj-readme-body h2,.tech-proj-readme-body.markdown-body h2{font-size:18px;font-weight:700;line-height:1.35;margin:20px 0 9px;padding-bottom:8px;border-bottom:1px solid var(--border)}.tech-proj-readme-body h3,.tech-proj-readme-body.markdown-body h3{font-size:16.5px;font-weight:700;line-height:1.35;margin:18px 0 8px}.tech-proj-readme-body h4,.tech-proj-readme-body.markdown-body h4{font-size:15.5px;font-weight:700;line-height:1.35;margin:16px 0 8px}.tech-proj-readme-body h5,.tech-proj-readme-body.markdown-body h5{font-size:15px;font-weight:700;line-height:1.35;margin:14px 0 8px}.tech-proj-readme-body h6,.tech-proj-readme-body.markdown-body h6{font-size:14.5px;font-weight:700;line-height:1.35;margin:14px 0 8px}.tech-proj-readme-body.markdown-body p{margin:0 0 13px}.tech-proj-readme-body.markdown-body ul,.tech-proj-readme-body.markdown-body ol{margin:0 0 10px;padding-left:22px}.tech-proj-readme-body.markdown-body li{margin-top:0;margin-bottom:2px}.tech-proj-readme-body.markdown-body>h1:first-child,.tech-proj-readme-body>h1:first-child{font-size:15px;font-weight:600;color:var(--text-secondary);margin:0 0 16px;padding:0;border:0}.tech-proj-readme-body :is(h1,h2,h3,h4,h5,h6){scroll-margin-top:72px}.tech-proj-readme-empty{padding:48px 0;text-align:center;font-size:14px;color:var(--text-secondary)}.tech-proj-readme-empty p{margin:0 0 8px}.tech-proj-readme-empty a{color:var(--accent)}.markdown-body .code-wrap .code-copy{position:absolute;top:8px;right:8px;z-index:1;padding:3px 10px;font-size:12px;line-height:1.5;border:1px solid var(--border);border-radius:6px;background:var(--bg);color:var(--text-secondary);cursor:pointer;opacity:0;transition:opacity .15s}@media(hover:hover) and (pointer:fine){.markdown-body .code-wrap:hover .code-copy,.markdown-body .code-wrap .code-copy:focus{opacity:1}}@media(hover:hover) and (pointer:fine){.markdown-body .code-wrap .code-copy:hover{color:var(--accent);border-color:var(--accent)}}@media(hover:none){.markdown-body .code-wrap .code-copy{opacity:1}}@media(max-width:720px){.tech-proj-readme{padding:0}.tech-proj-crumb{font-size:17px}.tech-proj-readme-head{padding-bottom:12px;margin-bottom:14px}.tech-proj-readme-body,.tech-proj-readme-body.markdown-body{font-size:14px;line-height:1.6}.tech-proj-readme-body h1,.tech-proj-readme-body.markdown-body h1{font-size:18px;margin:16px 0 8px}.tech-proj-readme-body h2,.tech-proj-readme-body.markdown-body h2{font-size:16px;margin:16px 0 8px}.tech-proj-readme-body h3,.tech-proj-readme-body.markdown-body h3{font-size:15px}.tech-proj-readme-body h4,.tech-proj-readme-body.markdown-body h4{font-size:14px}.tech-proj-readme-body h5,.tech-proj-readme-body.markdown-body h5{font-size:13.5px}.tech-proj-readme-body h6,.tech-proj-readme-body.markdown-body h6{font-size:13px}.tech-proj-readme-body.markdown-body>h1:first-child,.tech-proj-readme-body>h1:first-child{font-size:14px;margin:0 0 14px}.tech-proj-readme-body.markdown-body p{margin:0 0 12px}}.tech-links-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(260px,1fr));gap:12px}.tech-link-card{display:flex;align-items:center;gap:12px;padding:14px 16px;min-width:0;border:1px solid var(--border);border-radius:8px;text-decoration:none;color:var(--text)}@media(hover:hover) and (pointer:fine){.tech-link-card:hover{border-color:var(--accent)}}.tech-link-avatar{width:44px;height:44px;flex-shrink:0;border-radius:50%;object-fit:cover;display:flex;align-items:center;justify-content:center;background:var(--bg-subtle);color:var(--text-secondary);font-size:18px;font-weight:700}.tech-link-info{flex:1;min-width:0}.tech-link-name{display:block;font-size:15px;font-weight:600;margin:0 0 2px}.tech-link-desc{display:block;font-size:13px;color:var(--text-secondary);margin:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.tech-links-extra{margin-top:28px;padding-top:24px;border-top:1px solid var(--border)}.tech-links-intro p{margin:0 0 12px;font-size:14px;line-height:1.8;color:var(--text-secondary)}.tech-links-intro p:last-child{margin-bottom:0}.tech-links-intro a{color:var(--accent);text-decoration:none}.tech-links-intro a:hover{text-decoration:underline}.tech-links-section{margin-top:28px}.tech-links-section h2{font-size:15px;font-weight:600;margin:0 0 10px;color:var(--text)}.tech-links-section ul{margin:0;padding-left:18px;font-size:14px;line-height:1.8;color:var(--text-secondary)}.tech-links-card{display:flex;align-items:center;gap:14px;border:1px solid var(--border);border-radius:8px;padding:16px}.tech-links-card-avatar{width:56px;height:56px;flex-shrink:0;border-radius:50%;object-fit:cover;background:var(--bg-subtle)}.tech-links-card-main{min-width:0}.tech-links-card-name{display:block;font-size:15px;font-weight:600;color:var(--text)}.tech-links-card-bio{display:block;font-size:13px;color:var(--text-secondary);margin-top:2px}.tech-links-card-url{display:block;margin-top:6px;font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;font-size:12px;color:var(--text-secondary);overflow-wrap:anywhere}.tech-links-copyrow{display:flex;flex-wrap:wrap;gap:8px;margin-top:10px}.tech-copy{appearance:none;margin:0;padding:5px 12px;background:transparent;border:1px solid var(--border);border-radius:6px;font:inherit;font-size:13px;color:var(--text-secondary);cursor:pointer;transition:color .15s ease,border-color .15s ease}.tech-copy:hover{color:var(--accent);border-color:var(--accent)}.tech-copy.copied{color:var(--success);border-color:var(--success)}.tech-status-section{margin-bottom:32px}.tech-status-section h2{font-size:17px;font-weight:600;margin:0 0 6px;display:flex;align-items:center;gap:8px}.svc-list{border-top:1px solid var(--border)}.svc-row{display:flex;align-items:center;gap:12px;padding:12px 0;border-bottom:1px solid var(--border)}.svc-dot{width:10px;height:10px;border-radius:50%;flex-shrink:0}.svc-dot.st-ok{background:var(--success)}.svc-dot.st-warn{background:var(--warning)}.svc-dot.st-down{background:var(--danger)}.svc-dot.st-none{background:var(--text-secondary);opacity:.4}.svc-main{flex:1;min-width:0}.svc-name{font-size:15px;font-weight:600}.expiry-label{font-size:15px}.svc-metrics{display:flex;flex-wrap:wrap;gap:6px 16px;justify-content:flex-end}.svc-metric{font-size:13px;color:var(--text-secondary);white-space:nowrap}.svc-count{font-size:13px;color:var(--text-secondary);font-weight:400}.svc-empty{padding:24px 0;text-align:center;color:var(--text-secondary);font-size:14px}.svc-empty-sub{font-size:13px;opacity:.8}.status-hint{font-size:13px;color:var(--text-secondary);margin-top:12px}.tech-form-row{display:flex;gap:10px}.tech-form-row .tech-input{flex:1}.tech-flash{padding:10px 14px;border-radius:6px;margin-bottom:16px;font-size:14px}.tech-flash-success{background:var(--accent-weak);color:var(--success);border:1px solid var(--success)}.tech-flash-error{background:rgba(207,34,46,.08);color:var(--danger);border:1px solid var(--danger)}.tech-error{text-align:center;padding:80px 20px}.tech-error-code{font-size:72px;font-weight:700;line-height:1;margin-bottom:12px}.tech-error-code span{color:var(--accent)}.tech-error-title{font-size:22px;font-weight:600;margin:0 0 8px}.tech-error-desc{color:var(--text-secondary);font-size:15px;margin:0 0 24px}.tech-error-code-block{max-width:480px;margin:0 auto 24px;text-align:left;background:var(--code-bg);border:1px solid var(--border);border-radius:8px;padding:16px;overflow-x:auto}.tech-error-code-block pre{margin:0;font-size:13px;line-height:1.6}.tech-error-code-block .hl-error{color:var(--danger)}@media(max-width:768px){.tech-nav-links{display:none}.tech-burger{display:flex}.tech-nav-actions{margin-left:auto}.tech-nav-actions a.tech-icon-btn{display:none}.tech-logo{font-size:17px}.tech-drawer-link{font-size:15px}.tech-main{padding:18px 0 32px}.tech-main:has(.tech-page-head--center){padding-top:0}.tech-main:has(.tech-about-hero){padding-top:24px}.tech-main:has(.tech-proj){padding-top:16px}.tech-top,.tech-top.scrolled{bottom:calc(72px + env(safe-area-inset-bottom))}.tech-post-title-lg{font-size:20px}.tech-post-header{margin-bottom:14px;padding-bottom:10px}.tech-page-title{font-size:20px}.tech-page-desc{font-size:14px}.tech-page-head--center{padding:32px 4px 32px;margin-bottom:24px}.tech-about-hero{padding:24px 16px 20px;margin-bottom:20px}.tech-page-head--center .tech-page-title{font-size:26px}.tech-page-head--center .tech-page-desc{font-size:14px}.tech-about-hero .tech-page-title{font-size:20px}.tech-quote{font-size:14px}.tech-stat{padding:0 12px;gap:6px}.tech-stat b{font-size:18px}.tech-stat span{font-size:11px}.tech-about-stats{margin-top:18px}.tech-timeline-item{flex-direction:column;align-items:flex-start;gap:2px}.tech-timeline-date{flex:none}.tech-post-pager{grid-template-columns:1fr}.tech-related-grid{grid-template-columns:repeat(2,minmax(0,1fr))}.tech-pager-next{text-align:left}.tech-form-row{flex-direction:column;gap:0}.tech-skill-list{grid-template-columns:1fr}.tech-license{margin-left:0}}@media(max-width:767px){.tech-post-title{font-size:16px}.tech-post-excerpt{font-size:14px}.tech-post-body,.tech-post-body.markdown-body{font-size:14px;line-height:1.6;letter-spacing:normal}.tech-post-body h1,.tech-post-body.markdown-body h1{font-size:18px;padding-bottom:0;border-bottom:0}.tech-post-body h2,.tech-post-body.markdown-body h2{font-size:16px;padding-bottom:7px}.tech-post-body h3,.tech-post-body.markdown-body h3{font-size:15px}.tech-post-body h4,.tech-post-body.markdown-body h4{font-size:14px}.tech-post-body h5,.tech-post-body.markdown-body h5{font-size:13.5px}.tech-post-body h6,.tech-post-body.markdown-body h6{font-size:13px}.tech-post-body p,.tech-post-body.markdown-body p{margin:0 0 13px}.tech-post-body h1,.tech-post-body.markdown-body h1,.tech-post-body h2,.tech-post-body.markdown-body h2,.tech-post-body h3,.tech-post-body.markdown-body h3,.tech-post-body h4,.tech-post-body.markdown-body h4,.tech-post-body h5,.tech-post-body.markdown-body h5,.tech-post-body h6,.tech-post-body.markdown-body h6{margin:16px 0 8px}}@media(max-width:480px){.tech-shell{padding:0 16px}.tech-post-body pre{padding:12px}.tech-cs{flex:1 1 calc(50% - 4px);max-width:calc(50% - 4px)}.tech-cs:last-child{flex:1 1 100%;max-width:100%}.tech-links-grid{grid-template-columns:1fr}.tech-project-grid{grid-template-columns:1fr}.tech-footer-inner{flex-direction:column;align-items:flex-start;gap:10px}.tech-footer-links{justify-content:flex-start}.tech-footer-beian{display:flex;flex-wrap:wrap;gap:4px 16px}.tech-footer-beian a{margin-right:0}}@media print{.tech-nav,.tech-footer,.tech-top,.tech-drawer-overlay,.tech-drawer{display:none !important}.tech-main{padding:0}.tech-post-body{max-width:none}}.tech-lightbox{position:fixed;inset:0;z-index:400;display:flex;align-items:center;justify-content:center;background:rgba(8,9,13,.92);opacity:0;visibility:hidden;transition:opacity .2s ease,visibility .2s}.tech-lightbox.open{opacity:1;visibility:visible}.tech-lightbox-stage{display:flex;align-items:center;justify-content:center;max-width:92vw;max-height:86vh}.tech-lightbox-media{max-width:92vw;max-height:86vh;border-radius:8px;box-shadow:0 24px 64px rgba(0,0,0,.5);background:#000;object-fit:contain}.tech-lightbox-stage video.tech-lightbox-media{width:auto}.tech-lightbox-close{position:absolute;top:16px;right:16px;z-index:2;width:40px;height:40px;border-radius:50%;border:1px solid rgba(255,255,255,.25);background:rgba(255,255,255,.08);color:#fff;font-size:22px;line-height:1;cursor:pointer;display:flex;align-items:center;justify-content:center}@media(hover:hover) and (pointer:fine){.tech-lightbox-close:hover{background:rgba(255,255,255,.18);border-color:rgba(255,255,255,.45)}}.tech-lightbox-nav{position:absolute;top:50%;transform:translateY(-50%);z-index:2;width:44px;height:44px;border-radius:50%;border:1px solid rgba(255,255,255,.25);background:rgba(255,255,255,.08);color:#fff;font-size:26px;line-height:1;cursor:pointer;display:flex;align-items:center;justify-content:center;padding-bottom:2px}@media(hover:hover) and (pointer:fine){.tech-lightbox-nav:hover{background:rgba(255,255,255,.18);border-color:rgba(255,255,255,.45)}}.tech-lightbox-prev{left:16px}.tech-lightbox-next{right:16px}.tech-lightbox-count{position:absolute;bottom:20px;left:50%;transform:translateX(-50%);color:rgba(255,255,255,.78);font-size:13px;font-variant-numeric:tabular-nums;letter-spacing:.05em;z-index:2}@media(max-width:480px){.tech-lightbox-close{top:10px;right:10px}.tech-lightbox-prev{left:8px}.tech-lightbox-next{right:8px}.tech-lightbox-nav{width:38px;height:38px;font-size:22px}}:where(a[href],button,summary,[tabindex]):focus-visible{outline:2px solid var(--accent);outline-offset:2px;border-radius:6px}.tech-nav-link{transition:color .15s ease}.tech-icon-btn{transition:color .2s ease,background-color .2s ease,transform .12s ease}.tech-icon-btn:active{transform:scale(.9)}.tech-btn{transition:border-color .2s ease,color .2s ease,filter .2s ease,background-color .2s ease,transform .12s ease}.tech-btn:active{transform:translateY(1px)}.tech-btn-primary:active{filter:brightness(.95);color:#fff}[data-theme="dark"] .tech-btn-primary:active{color:#0d1117}.tech-lang-link{cursor:pointer;transition:color .15s ease,transform .15s ease,border-color .15s ease}@media(hover:hover) and (pointer:fine){.tech-lang-link:hover{transform:translateY(-1px)}}.tech-project-card,.tech-link-card,.tech-tag-cloud-item{transition:transform .18s ease,border-color .18s ease,box-shadow .18s ease}@media(hover:hover) and (pointer:fine){.tech-project-card:hover,.tech-link-card:hover{transform:translateY(-3px)}.tech-tag-cloud-item:hover{transform:translateY(-2px)}}.img-gallery{display:grid;grid-template-columns:repeat(2,1fr);gap:8px;margin:0 0 16px}.img-gallery img{width:100%;margin:0;display:block;aspect-ratio:4 / 3;object-fit:cover;border-radius:6px;cursor:zoom-in;transition:filter .18s ease,transform .18s ease}@media(hover:hover) and (pointer:fine){.img-gallery img:hover{filter:brightness(.94)}}@media(min-width:768px){.img-gallery{grid-template-columns:repeat(3,1fr);gap:10px}}.lightbox{position:fixed;inset:0;z-index:9999;display:none;align-items:center;justify-content:center;background:rgba(6,8,12,.92);padding:24px;opacity:0;transition:opacity 200ms ease}.lightbox.open{display:flex;opacity:1}.lightbox-media{max-width:92vw;max-height:88vh;display:flex;align-items:center;justify-content:center}.lightbox-media img,.lightbox-media video{max-width:92vw;max-height:88vh;border-radius:8px;box-shadow:0 20px 60px rgba(0,0,0,.5);object-fit:contain;background:#000}.lightbox-close,.lightbox-nav{position:absolute;border:0;cursor:pointer;display:flex;align-items:center;justify-content:center;background:rgba(255,255,255,.12);color:#fff;transition:background .15s ease}@media(hover:hover) and (pointer:fine){.lightbox-close:hover,.lightbox-nav:hover{background:rgba(255,255,255,.25)}}.lightbox-close{top:16px;right:16px;width:40px;height:40px;border-radius:50%;font-size:22px;line-height:1}.lightbox-nav{top:50%;transform:translateY(-50%);width:46px;height:46px;border-radius:50%;font-size:24px;line-height:1}.lightbox-nav[hidden]{display:none}.lightbox-prev{left:16px}.lightbox-next{right:16px}.lightbox-count{position:absolute;bottom:16px;left:50%;transform:translateX(-50%);color:rgba(255,255,255,.7);font-size:13px}@media(max-width:768px){.lightbox-nav{width:38px;height:38px;font-size:20px}.lightbox-prev{left:8px}.lightbox-next{right:8px}}.hidden{display:none}.markdown-body [align="center"]{text-align:center}.markdown-body [align="right"]{text-align:right}.markdown-body details{margin:1em 0}.markdown-body summary{cursor:pointer;font-weight:600}.markdown-body details[open] summary{margin-bottom:.5em}.tech-form-actions{display:flex;flex-wrap:wrap;gap:12px;align-items:center}.tech-form-actions .tech-btn{width:auto}