@charset "UTF-8";﻿ @view-transition{navigation:auto}::view-transition{background:var(--bg,#fbfcfd)}::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:#fbfcfd;--nav-bg:rgba(251,252,253,.82);--bg-subtle:#f0f3f7;--bg-code:#f2f5f9;--border:#e1e6ed;--border-strong:#c6ced9;--text:#161b24;--text-secondary:#5a6575;--accent:#2f7ad1;--accent-soft:#5b9ad6;--accent-weak:#e6f0fb;--quote-bg:#f2f5f9;--success:#2b6e52;--warning:#8a6314;--danger:#a83545;--shadow:0 1px 2px rgba(16,27,43,.06);--overlay:rgba(16,27,43,.45);--code-bg:#f2f5f9;--hl-keyword:#a03a52;--hl-string:#2f6b57;--hl-title:#6a4fa3;--hl-comment:#63718a;--hl-number:#a35c1a;--hl-builtin:#7d5a1a;--hl-variable:#35566f;--hl-tag:#9c3f56;--hl-attr:#2f7ad1;--hl-symbol:#6a4fa3;--hl-meta:#45566b;--ring-a:rgba(47,122,209,.26);--ring-b:rgba(106,79,163,.26);--glass-bg:rgba(251,252,253,.86);--glass-bg-form:rgba(251,252,253,.86);--glass-bg-mobile:rgba(251,252,253,.92);--hover-bg:#eef2f7;--hover-ring:rgba(28,91,143,.18)}[data-theme="dark"]{color-scheme:dark;--bg:#1a1d23;--nav-bg:rgba(26,29,35,.84);--bg-subtle:#22262e;--bg-code:#1e2229;--border:rgba(255,255,255,.09);--border-strong:rgba(255,255,255,.15);--text:#e7e9ef;--text-secondary:#a4aab7;--accent:#6b9cf5;--accent-soft:#8ab2f7;--accent-weak:rgba(107,156,245,.15);--ring-a:#5b8def;--ring-b:#a78bfa;--glass-bg:rgba(34,38,46,.84);--glass-bg-form:rgba(34,38,46,.84);--glass-bg-mobile:rgba(34,38,46,.92);--quote-bg:#22262e;--success:#34d399;--warning:#fbbf24;--danger:#f87171;--shadow:0 1px 2px rgba(0,0,0,.25),0 4px 16px rgba(0,0,0,.18);--overlay:rgba(4,6,12,.62);--code-bg:#1e2229;--hl-keyword:#a78bfa;--hl-string:#6fcf97;--hl-title:#5b8def;--hl-comment:#7b8494;--hl-number:#e0a44f;--hl-builtin:#d9c07a;--hl-variable:#d5dae4;--hl-tag:#f87171;--hl-attr:#7aa5f5;--hl-symbol:#a78bfa;--hl-meta:#d9c07a;--hover-bg:#23272f;--hover-ring:rgba(255,255,255,.13)}html[data-theme="light"]{--mb-fg:#161b24;--mb-fg-muted:#5a6575;--mb-link:#2f7ad1;--mb-border:#e1e6ed;--mb-border-muted:#eceff4;--mb-code-bg:#f2f5f9;--mb-inline-code:rgba(28,91,143,.09);--mb-hr:#eceff4;--mb-mark:#f7ecd2;--mb-th-bg:#f2f5f9}html[data-theme="dark"]{--mb-fg:#e8eaf0;--mb-fg-muted:#a0a6b5;--mb-link:#5b8def;--mb-border:rgba(255,255,255,.07);--mb-border-muted:rgba(255,255,255,.045);--mb-code-bg:#1e2229;--mb-inline-code:rgba(91,141,239,.14);--mb-hr:rgba(255,255,255,.06);--mb-mark:rgba(251,191,36,.22);--mb-th-bg:#22262e}*{box-sizing:border-box}html{-webkit-text-size-adjust:100%;scroll-behavior:smooth;scrollbar-gutter:stable;background:var(--bg);-webkit-tap-highlight-color:transparent}body{margin:0;min-height:100vh;position:relative;isolation:isolate;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:transparent;-webkit-font-smoothing:antialiased;transition:color .2s}a{color:var(--accent);text-decoration:none}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)}.icon-sun,.icon-moon{display:none}html[data-theme-mode="light"] .icon-sun,html[data-theme-mode="dark"] .icon-moon{display:block}html[data-theme-mode="light"] .icon-auto,html[data-theme-mode="dark"] .icon-auto{display: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 0s linear .25s;display:flex;flex-direction:column;padding-bottom:env(safe-area-inset-bottom)}.tech-drawer.open{transform:none;visibility:visible;transition:transform .25s ease,visibility 0s}.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;align-items:center;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%;display:flex;flex-wrap:wrap;align-items:center;gap:4px 16px}.tech-footer-beian a{color:var(--text-secondary);text-decoration:none}@media(hover:hover) and (pointer:fine){.tech-footer-beian a:hover{color:var(--accent)}}.tech-footer-member{display:inline-flex;align-items:center;max-width:100%;opacity:.55;transition:opacity .18s ease;-webkit-tap-highlight-color:transparent}@media(hover:hover) and (pointer:fine){.tech-footer-member:hover{opacity:.85}}.tech-footer-member-logo{display:block;width:auto;height:20px}.tech-footer-member-logo--dark{display:none}[data-theme="dark"] .tech-footer-member-logo--light{display:none}[data-theme="dark"] .tech-footer-member-logo--dark{display:block}.tech-main:has(.tech-about-fb)+.tech-footer .tech-footer-member{display:none}.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,width .2s ease,height .2s ease,right .2s ease,bottom .2s ease,border-radius .2s ease}.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--with-action{display:flex;align-items:center;justify-content:space-between;gap:16px;flex-wrap:wrap}.tech-page-head-main{min-width:0}.tech-page-head--with-action .tech-btn{flex:none}.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-strong);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}[data-theme="dark"] .tech-search-btn{color:var(--bg)}@media(hover:hover) and (pointer:fine){.tech-search-btn:hover{filter:brightness(1.1)}}@media(hover:hover) and (pointer:fine){[data-theme="dark"] .tech-search-btn:hover{filter:brightness(.92)}}.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,box-shadow .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(--hover-bg);box-shadow:inset 0 0 0 1px var(--hover-ring)}.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-tag--more{color:var(--text-secondary);background:transparent;cursor:default}.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-strong);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:color-mix(in srgb,var(--accent) 40%,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(--hover-bg)}}.tech-cs-item.is-selected{color:var(--accent);font-weight:600;background:var(--accent-weak)}.tech-cs-item:focus-visible{background:var(--bg-subtle)}.tech-cs-item.is-selected:focus-visible{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-strong);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}[data-theme="dark"] .tech-page-btn.active{color:var(--bg)}.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:min(calc(50% + 520px),calc(100vw - 200px));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-strong);border-radius:8px;-webkit-backdrop-filter:saturate(180%) blur(16px);backdrop-filter:saturate(180%) blur(16px)}.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-wrap:anywhere}@media(min-width:1400px){.tech-toc-body a{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.markdown-body pre,.tech-proj-readme-body.markdown-body pre{-webkit-backdrop-filter:saturate(180%) blur(14px);backdrop-filter:saturate(180%) blur(14px);border-color:var(--border-strong)}.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-strong);border-radius:6px;background:color-mix(in srgb,var(--bg) 86%,transparent);-webkit-backdrop-filter:blur(8px);backdrop-filter:blur(8px);color:var(--text-secondary);cursor:pointer;opacity:0;transition:opacity .2s,color .15s,border-color .15s}.code-copy::after{content:'';position:absolute;inset:-8px}@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:color-mix(in srgb,var(--success) 8%,transparent)}.tech-post-body .admonition.tip .admonition-title{color:var(--success)}.tech-post-body .admonition.warning{border-left-color:var(--warning);background:color-mix(in srgb,var(--warning) 8%,transparent)}.tech-post-body .admonition.warning .admonition-title{color:var(--warning)}.tech-post-body .admonition.danger{border-left-color:var(--danger);background:color-mix(in srgb,var(--danger) 8%,transparent)}.tech-post-body .admonition.danger .admonition-title{color:var(--danger)}.tech-post-body del{color:var(--text-secondary)}.tech-post-body mark{background:color-mix(in srgb,var(--warning) 18%,transparent);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}:is(.tech-post-body,.tech-proj-readme-body).markdown-body .hljs{color:var(--text);background:transparent}:is(.tech-post-body,.tech-proj-readme-body).markdown-body .hljs-keyword,:is(.tech-post-body,.tech-proj-readme-body).markdown-body .hljs-selector-tag,:is(.tech-post-body,.tech-proj-readme-body).markdown-body .hljs-subst{color:var(--hl-keyword)}:is(.tech-post-body,.tech-proj-readme-body).markdown-body .hljs-string,:is(.tech-post-body,.tech-proj-readme-body).markdown-body .hljs-attr,:is(.tech-post-body,.tech-proj-readme-body).markdown-body .hljs-template-tag,:is(.tech-post-body,.tech-proj-readme-body).markdown-body .hljs-regexp{color:var(--hl-string)}:is(.tech-post-body,.tech-proj-readme-body).markdown-body .hljs-title,:is(.tech-post-body,.tech-proj-readme-body).markdown-body .hljs-section,:is(.tech-post-body,.tech-proj-readme-body).markdown-body .hljs-function .hljs-title{color:var(--hl-title)}:is(.tech-post-body,.tech-proj-readme-body).markdown-body .hljs-comment,:is(.tech-post-body,.tech-proj-readme-body).markdown-body .hljs-quote,:is(.tech-post-body,.tech-proj-readme-body).markdown-body .hljs-code,:is(.tech-post-body,.tech-proj-readme-body).markdown-body .hljs-formula{color:var(--hl-comment);font-style:italic}:is(.tech-post-body,.tech-proj-readme-body).markdown-body .hljs-section{color:var(--hl-title);font-weight:700}:is(.tech-post-body,.tech-proj-readme-body).markdown-body .hljs-number,:is(.tech-post-body,.tech-proj-readme-body).markdown-body .hljs-literal,:is(.tech-post-body,.tech-proj-readme-body).markdown-body .hljs-symbol,:is(.tech-post-body,.tech-proj-readme-body).markdown-body .hljs-bullet{color:var(--hl-number)}:is(.tech-post-body,.tech-proj-readme-body).markdown-body .hljs-built_in,:is(.tech-post-body,.tech-proj-readme-body).markdown-body .hljs-type,:is(.tech-post-body,.tech-proj-readme-body).markdown-body .hljs-class .hljs-title{color:var(--hl-builtin)}:is(.tech-post-body,.tech-proj-readme-body).markdown-body .hljs-variable,:is(.tech-post-body,.tech-proj-readme-body).markdown-body .hljs-template-variable,:is(.tech-post-body,.tech-proj-readme-body).markdown-body .hljs-params{color:var(--hl-variable)}:is(.tech-post-body,.tech-proj-readme-body).markdown-body .hljs-tag,:is(.tech-post-body,.tech-proj-readme-body).markdown-body .hljs-name{color:var(--hl-tag)}:is(.tech-post-body,.tech-proj-readme-body).markdown-body .hljs-attribute{color:var(--hl-attr)}:is(.tech-post-body,.tech-proj-readme-body).markdown-body .hljs-meta,:is(.tech-post-body,.tech-proj-readme-body).markdown-body .hljs-meta .hljs-keyword{color:var(--hl-meta)}:is(.tech-post-body,.tech-proj-readme-body).markdown-body .hljs-property,:is(.tech-post-body,.tech-proj-readme-body).markdown-body .hljs-operator,:is(.tech-post-body,.tech-proj-readme-body).markdown-body .hljs-selector-attr,:is(.tech-post-body,.tech-proj-readme-body).markdown-body .hljs-selector-class,:is(.tech-post-body,.tech-proj-readme-body).markdown-body .hljs-selector-id{color:var(--hl-attr)}:is(.tech-post-body,.tech-proj-readme-body).markdown-body .hljs-doctag,:is(.tech-post-body,.tech-proj-readme-body).markdown-body .hljs-variable.language_{color:var(--hl-keyword)}:is(.tech-post-body,.tech-proj-readme-body).markdown-body .hljs-title.class_,:is(.tech-post-body,.tech-proj-readme-body).markdown-body .hljs-title.class_.inherited__,:is(.tech-post-body,.tech-proj-readme-body).markdown-body .hljs-title.function_{color:var(--hl-title)}:is(.tech-post-body,.tech-proj-readme-body).markdown-body .hljs-selector-pseudo{color:var(--hl-tag)}:is(.tech-post-body,.tech-proj-readme-body).markdown-body .hljs-addition{color:var(--hl-tag)}:is(.tech-post-body,.tech-proj-readme-body).markdown-body .hljs-deletion{color:var(--hl-keyword)}:is(.tech-post-body,.tech-proj-readme-body).markdown-body .hljs-emphasis{font-style:italic}:is(.tech-post-body,.tech-proj-readme-body).markdown-body .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);background:var(--hover-bg)}}.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{background:var(--hover-bg);border-color:var(--accent);color:var(--accent);transform:translateY(-1px)}}.tech-btn-primary{background:var(--accent-weak);border-color:color-mix(in srgb,var(--accent) 52%,transparent);color:var(--accent)}[data-theme="dark"] .tech-btn-primary{color:var(--accent)}@media(hover:hover) and (pointer:fine){.tech-btn-primary:hover{background:var(--accent);border-color:var(--accent);color:#fff;transform:translateY(-1px)}[data-theme="dark"] .tech-btn-primary:hover{color:var(--bg)}}.tech-license{font-size:13px;color:var(--text-secondary);margin:0 0 0 auto}.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(--hover-bg)}}.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}.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:20px 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-about-fb{text-align:center;padding:10px 0 4px}.tech-about-fb-text{margin:0 0 16px;font-size:14px;line-height:1.8;color:var(--text-secondary)}.tech-about-fb-text a{color:var(--accent);text-decoration:none}.tech-about-fb-wormhole{display:inline-flex;align-items:center;opacity:.88;transition:opacity .18s ease;-webkit-tap-highlight-color:transparent}@media(hover:hover) and (pointer:fine){.tech-about-fb-wormhole:hover{opacity:1}}.tech-about-fb-wormhole img{display:block;width:auto;height:36px}.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);background:var(--hover-bg);box-shadow:var(--shadow)}}.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)}[data-theme="dark"] .tech-proj-btn--gh{color:var(--bg)}@media(hover:hover) and (pointer:fine){.tech-proj-btn--gh:hover{color:#fff;filter:brightness(1.1);background:var(--accent)}}@media(hover:hover) and (pointer:fine){[data-theme="dark"] .tech-proj-btn--gh:hover{color:var(--bg);filter:brightness(.92);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)}@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);background:var(--hover-bg)}}.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-rules{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:0 40px}.tech-links-rules .tech-links-section{min-width:0}.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-section li{overflow-wrap:anywhere}.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{display:flex;flex-direction:column;gap:16px}.tech-status-section{border:1px solid var(--border);border-radius:12px;padding:18px 20px 6px}.tech-status-section h2{font-size:15px;font-weight:600;margin:0 0 12px;display:flex;align-items:center;gap:10px}.svc-count{font-size:12px;font-weight:500;color:var(--text-secondary);background:var(--bg-subtle);border-radius:999px;padding:2px 9px}.svc-list{border:0}.svc-row{display:grid;grid-template-columns:8px minmax(0,1fr) auto;align-items:center;gap:12px;padding:13px 0;border-top:1px solid var(--border)}.svc-row:first-child{border-top:0}.svc-dot{width:8px;height:8px;border-radius:50%;flex-shrink:0}.svc-dot.st-ok{background:var(--success);box-shadow:0 0 0 3px color-mix(in srgb,var(--success) 16%,transparent)}.svc-dot.st-warn{background:var(--warning);box-shadow:0 0 0 3px color-mix(in srgb,var(--warning) 16%,transparent)}.svc-dot.st-down{background:var(--danger);box-shadow:0 0 0 3px color-mix(in srgb,var(--danger) 16%,transparent)}.svc-dot.st-expired{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:500}.expiry-label{font-size:15px}.svc-metrics{display:flex;flex-wrap:wrap;gap:8px;justify-content:flex-end}.svc-metric{font-size:12.5px;color:var(--text-secondary);white-space:nowrap;background:var(--bg-subtle);border-radius:6px;padding:3px 9px;font-variant-numeric:tabular-nums}.svc-row.st-ok [data-expiry-field="badge"]{color:var(--success);background:color-mix(in srgb,var(--success) 12%,transparent)}.svc-row.st-warn [data-expiry-field="badge"]{color:var(--warning);background:color-mix(in srgb,var(--warning) 14%,transparent)}.svc-row.st-expired [data-expiry-field="badge"]{color:var(--danger);background:color-mix(in srgb,var(--danger) 12%,transparent)}.svc-empty{padding:26px 0;text-align:center;color:var(--text-secondary);font-size:14px}.svc-empty-sub{font-size:13px;opacity:.8;margin-top:4px}.status-hint{font-size:12.5px;color:var(--text-secondary);margin:0}@media(max-width:640px){.tech-status-section{padding:16px 16px 4px}.svc-row{grid-template-columns:8px minmax(0,1fr);row-gap:9px}.svc-metrics{grid-column:2;justify-content:flex-start}}.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-about-fb-text{font-size:13.5px}.tech-about-fb-wormhole img{height:30px}.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 a{margin-right:0}.tech-footer-member-logo{height:18px}}@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}.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:var(--bg)}.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)}}.tech-quote-refresh,.tech-proj-btn{position:relative}.tech-quote-refresh::after{content:'';position:absolute;inset:-6px -8px}.tech-proj-btn::after{content:'';position:absolute;inset:-8px -4px}.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}.tech-toc,.tech-post-body.markdown-body pre,.tech-proj-readme-body.markdown-body pre{background:var(--bg)}@supports(backdrop-filter:blur(1px)){.tech-toc,.tech-post-body.markdown-body pre,.tech-proj-readme-body.markdown-body pre{background:var(--glass-bg)}}@supports(-webkit-backdrop-filter:blur(1px)){.tech-toc,.tech-post-body.markdown-body pre,.tech-proj-readme-body.markdown-body pre{background:var(--glass-bg)}}@media(max-width:767px){.tech-toc{background:var(--glass-bg-mobile);-webkit-backdrop-filter:saturate(150%) blur(10px);backdrop-filter:saturate(150%) blur(10px)}.tech-post-body.markdown-body pre,.tech-proj-readme-body.markdown-body pre{background:var(--glass-bg-mobile);-webkit-backdrop-filter:saturate(150%) blur(8px);backdrop-filter:saturate(150%) blur(8px)}}.circle-stats{display:grid;grid-template-columns:repeat(4,minmax(0,1fr));gap:12px;margin:20px 0 24px}.circle-stats>div{display:flex;flex-direction:column;gap:2px;padding:14px 16px;border:1px solid var(--border);border-radius:10px;background:var(--bg-subtle)}.circle-stats b{font-size:22px;line-height:1.2;font-variant-numeric:tabular-nums;color:var(--text)}.circle-stats span{font-size:12.5px;color:var(--text-secondary)}.circle-stats>div{transition:background-color .18s ease,border-color .18s ease,transform .18s ease,box-shadow .18s ease}@media(hover:hover) and (pointer:fine){.circle-stats>div:hover{background:var(--hover-bg);border-color:var(--hover-ring);transform:translateY(-2px);box-shadow:0 6px 18px rgba(0,0,0,.12)}}.circle-list{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:12px}.circle-item{display:flex;flex-direction:column;min-width:0;padding:16px 18px;border:1px solid var(--border);border-radius:12px;background:transparent;transition:background-color .18s,border-color .18s}.circle-item:hover{background:var(--hover-bg);border-color:var(--hover-ring)}.circle-title{display:block;overflow-wrap:anywhere;font-size:16px;font-weight:600;line-height:1.5;color:var(--text);text-decoration:none}.circle-title:hover{color:var(--accent)}.circle-summary{margin:6px 0 0;overflow-wrap:anywhere;font-size:13.5px;line-height:1.7;color:var(--text-secondary);display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden}.circle-meta{margin-top:auto;padding-top:10px;display:flex;align-items:center;justify-content:space-between;gap:12px;margin-top:10px;font-size:12.5px;color:var(--text-secondary)}.circle-site{display:inline-flex;align-items:center;gap:6px;min-width:0;color:var(--text-secondary);text-decoration:none}.circle-site span{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.circle-site:hover{color:var(--accent)}.circle-avatar{width:18px;height:18px;border-radius:50%;object-fit:cover;flex:none}.circle-time{white-space:nowrap;flex:none}.circle-pager{display:flex;align-items:center;flex-wrap:wrap;justify-content:center;gap:10px;margin:28px 0 8px;font-size:13px}.circle-pager a,.circle-pager span{display:inline-flex;align-items:center;justify-content:center;min-height:32px;padding:0 12px;border:1px solid var(--border-strong);border-radius:8px;color:var(--text-secondary);text-decoration:none}.circle-pager a:hover{border-color:var(--accent);color:var(--accent)}.circle-pager .is-current{border-color:transparent;background:var(--bg-subtle);color:var(--text)}.circle-pager .is-disabled{opacity:.4}.circle-pager .is-gap{border:0;background:0;color:var(--text-secondary)}@media(max-width:860px){.circle-list{grid-template-columns:1fr}}@media(max-width:640px){.circle-stats{grid-template-columns:repeat(2,minmax(0,1fr));gap:8px}.circle-stats b{font-size:19px}.circle-title{font-size:15px}.circle-item{min-width:0;padding:15px 16px}}.tech-status-lead{margin:0 0 12px;text-align:left;font-size:13px;color:var(--text-secondary)}.tech-about-section .tech-status-section{margin-bottom:0}.tech-about-section .tech-status-section+.tech-status-section{margin-top:16px}.tech-about-section#status{position:relative}#status .status-hint{display:none;position:absolute;top:0;right:0;margin:0;padding:4px 10px;font-size:11.5px;line-height:1.6;color:var(--accent);background:var(--accent-weak);border-radius:999px;white-space:nowrap}#status .status-hint.is-visible{display:inline-block;animation:status-hint-in .2s ease}@keyframes status-hint-in{from{opacity:0;transform:translateY(-4px)}to{opacity:1;transform:none}}.tech-timeline{display:flex;flex-direction:column;gap:8px}.tech-timeline-item{position:static;display:flex;align-items:baseline;gap:14px;padding:12px 14px;border:1px solid var(--border);border-left:0;border-radius:10px;background:var(--bg-subtle)}.tech-timeline-item::before{display:none}.tech-timeline-item:last-child{border-left-color:var(--border);padding-bottom:12px}.tech-timeline-item:first-child{border-color:var(--accent-soft)}.tech-timeline-date{flex:0 0 104px;padding:2px 8px;white-space:nowrap;border-radius:6px;background:var(--accent-weak);color:var(--accent);font-size:12px;font-weight:600;text-align:center;font-variant-numeric:tabular-nums}.tech-timeline-content{margin:0;font-size:13.5px;line-height:1.65}@media(max-width:640px){#status .status-hint{position:static;margin:6px 0 0}.tech-timeline-item{flex-direction:column;align-items:flex-start;gap:6px}.tech-timeline-date{flex:none}}.tech-about-section{margin-bottom:16px;padding:20px 22px;border:1px solid var(--border);border-radius:14px;background:transparent}.tech-about-section>h2{margin-bottom:14px}.tech-timeline{gap:0}.tech-timeline-item{border:0;border-top:1px solid var(--border);border-radius:0;background:transparent;padding:12px 0}.tech-timeline-item:first-child{border-top:0;padding-top:2px}.tech-timeline-item:last-child{padding-bottom:0}.tech-timeline-item:first-child{border-color:var(--border)}.tech-about-section .tech-status-section{border:0;border-radius:0;padding:0;margin-bottom:0}.tech-about-section .tech-status-section+.tech-status-section{border-top:1px solid var(--border);margin-top:14px;padding-top:16px}@media(max-width:640px){.tech-about-section{padding:16px}.tech-skill-list{grid-template-columns:1fr;gap:0}}.tech-about-hero{flex-direction:row;align-items:flex-start;gap:24px;padding:24px 28px;text-align:left}.tech-about-hero .tech-avatar-wrap{margin-bottom:0;flex:none}.tech-about-hero .tech-avatar,.tech-about-hero .tech-avatar-placeholder{width:96px;height:96px}.tech-about-hero-main{flex:1;min-width:0}.tech-about-hero .tech-page-title{font-size:20px;margin:0 0 6px}.tech-about-hero .tech-about-bio{margin:0;max-width:none;font-size:14px;line-height:1.7}.tech-about-hero .tech-about-social{justify-content:flex-start;margin-top:12px}.tech-about-hero .tech-about-stats{justify-content:flex-start;margin-top:14px;padding-top:12px}@media(max-width:640px){.tech-about-hero{flex-direction:column;align-items:center;text-align:center;padding:20px 16px;gap:10px}.tech-about-hero .tech-about-social,.tech-about-hero .tech-about-stats{justify-content:center}.tech-about-hero .tech-avatar,.tech-about-hero .tech-avatar-placeholder{width:84px;height:84px}}.tech-link-rss{display:inline-block;margin-left:6px;padding:0 5px;font-size:10px;font-weight:600;line-height:16px;border-radius:4px;background:var(--accent-weak);color:var(--accent);vertical-align:1px}.tech-about-hero{align-items:center}.tech-about-hero-meta{display:flex;flex-wrap:wrap;align-items:center;gap:10px 18px;margin-top:12px}.tech-about-hero .tech-about-social{margin-top:0}.tech-about-hero .tech-about-stats{width:auto;margin-top:0;padding-top:0;border-top:0;justify-content:flex-start;gap:16px}.tech-about-section .tech-status{gap:0}.tech-about-section .tech-status-section+.tech-status-section{margin-top:16px;padding-top:14px}@media(max-width:640px){.tech-about-hero-meta{justify-content:center}.tech-about-hero .tech-about-stats{justify-content:center}}.tech-post-list--double{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:14px}.tech-post-list--double .tech-post-item{display:flex;flex-direction:column;margin:0;padding:18px 18px 16px;border:1px solid var(--border);border-radius:12px}.tech-post-list--double .tech-post-item:last-child{border-bottom:1px solid var(--border)}.tech-post-list--double .tech-post-title{font-size:16px}.tech-post-list--double .tech-post-tags{margin-top:auto;padding-top:10px}.tech-post-list--double .tech-post-arrow{display:none}@media(max-width:860px){.tech-post-list--double{grid-template-columns:1fr}}@media(max-width:640px){.tech-links-rules{grid-template-columns:1fr;gap:0}.tech-page-head--with-action{align-items:flex-start}}.tech-miles{display:flex;flex-direction:column;gap:26px}.tech-miles-head{display:flex;align-items:baseline;gap:10px;padding-bottom:10px;border-bottom:1px solid var(--border)}.tech-miles-head h2{position:relative;margin:0;padding-left:12px;font-size:21px;font-weight:700;letter-spacing:.02em}.tech-miles-head h2::before{content:"";position:absolute;left:0;top:50%;transform:translateY(-50%);width:3px;height:17px;border-radius:2px;background:linear-gradient(180deg,var(--accent),var(--hl-title))}.tech-miles-head span{font-size:12px;color:var(--text-secondary)}.tech-miles-list{list-style:none;margin:0;padding:0}.tech-miles-item{position:relative;display:flex;align-items:flex-start;gap:14px;margin:0 -10px;padding:11px 12px;border:1px solid transparent;border-bottom-color:var(--border);border-radius:8px}.tech-miles-item:last-child{border-bottom-color:transparent}.tech-miles-date{flex:0 0 46px;padding-top:1px;font-size:12.5px;color:var(--text-secondary);font-variant-numeric:tabular-nums}.tech-miles-body{flex:1;min-width:0}.tech-miles-title{margin:0;font-size:15.5px;font-weight:600;line-height:1.55}.tech-miles-title a{color:var(--text);text-decoration:none;transition:color .15s}.tech-miles-meta{display:flex;flex-wrap:wrap;align-items:center;gap:4px 12px;margin-top:3px;font-size:12px;color:var(--text-secondary)}.tech-miles-tag{color:var(--text-secondary);text-decoration:none}.tech-miles-tag:hover{color:var(--accent)}.tech-miles-arrow{flex:none;padding-top:2px;color:var(--accent);opacity:0;transform:translateX(-4px);transition:opacity .18s ease,transform .18s ease}.tech-miles-item:hover .tech-miles-title a{color:var(--accent)}.tech-miles-item:hover .tech-miles-arrow{opacity:1;transform:none}@media(max-width:640px){.tech-miles-head h2{font-size:19px}.tech-miles-item{gap:10px;margin:0;padding:11px 0}.tech-miles-date{flex-basis:42px}.tech-miles-title{font-size:15px}}.tech-post-item,.tech-link-card,.circle-item,.circle-stats>div,.tech-project-card,.tech-miles-item{transition:background-color .18s ease,border-color .18s ease,box-shadow .18s ease,transform .18s ease}@media(hover:hover) and (pointer:fine){.tech-post-item:hover,.tech-link-card:hover,.circle-item:hover,.circle-stats>div:hover,.tech-project-card:hover,.tech-miles-item:hover{background:var(--hover-bg);border-color:var(--hover-ring);box-shadow:0 6px 18px rgba(0,0,0,.12);transform:translateY(-2px)}}.tech-reader-stats,.tech-interaction-stats{margin-top:20px}.tech-reader-list{display:flex;flex-direction:column;gap:10px;margin:0;padding:0;list-style:none}.tech-reader-item{display:flex;align-items:flex-start;gap:14px;padding:14px 16px;border:1px solid var(--border);border-radius:12px;background:transparent}.tech-reader-rank{flex:none;width:28px;height:28px;margin-top:4px;display:flex;align-items:center;justify-content:center;border-radius:50%;background:var(--bg-subtle);color:var(--text-secondary);font-size:12px;font-weight:700;font-variant-numeric:tabular-nums}.tech-reader-rank--1{color:#4a3400;background:linear-gradient(135deg,#f8df8a,#e8b63f)}.tech-reader-rank--2{color:#3a4149;background:linear-gradient(135deg,#e6ebf1,#bcc7d3)}.tech-reader-rank--3{color:#4a2c14;background:linear-gradient(135deg,#edc19b,#cd9260)}.tech-reader-avatar{flex:none;width:42px;height:42px;border-radius:50%;object-fit:cover;background:var(--bg-subtle)}.tech-reader-main{flex:1;min-width:0}.tech-reader-head{display:flex;flex-wrap:wrap;align-items:baseline;gap:6px 10px}.tech-reader-name{font-size:15px;font-weight:600;color:var(--text);text-decoration:none}a.tech-reader-name:hover{color:var(--accent)}.tech-reader-count{padding:0 7px;border-radius:999px;background:var(--accent-weak);color:var(--accent);font-size:11.5px;line-height:18px}.tech-reader-quote{margin:5px 0 0;font-size:13.5px;line-height:1.7;color:var(--text-secondary);display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden}.tech-reader-foot{display:flex;flex-wrap:wrap;align-items:center;gap:4px 12px;margin-top:6px;font-size:12px;color:var(--text-secondary)}.tech-reader-source a{color:var(--text-secondary);text-decoration:none}.tech-reader-source a:hover{color:var(--accent)}.tech-interactions{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:12px}.tech-interaction-card{display:flex;flex-direction:column;min-width:0;padding:16px 18px;border:1px solid var(--border);border-radius:12px;background:transparent}.tech-interaction-head{display:flex;align-items:center;gap:10px}.tech-interaction-avatar{flex:none;width:38px;height:38px;border-radius:50%;object-fit:cover;background:var(--bg-subtle)}.tech-interaction-who{min-width:0}.tech-interaction-name{display:block;font-size:14.5px;font-weight:600;color:var(--text);text-decoration:none;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}a.tech-interaction-name:hover{color:var(--accent)}.tech-interaction-time{display:block;margin-top:1px;font-size:12px;color:var(--text-secondary)}.tech-interaction-text{margin:10px 0 0;font-size:13.5px;line-height:1.75;color:var(--text-secondary);overflow-wrap:anywhere;white-space:pre-wrap;display:-webkit-box;-webkit-line-clamp:5;-webkit-box-orient:vertical;overflow:hidden}.tech-interaction-foot{margin-top:auto;padding-top:12px;border-top:1px solid var(--border);font-size:12px;color:var(--text-secondary)}.tech-interaction-foot a{color:var(--text-secondary);text-decoration:none}.tech-interaction-foot a:hover{color:var(--accent)}.tech-reader-item,.tech-interaction-card{transition:background-color .18s ease,border-color .18s ease,box-shadow .18s ease,transform .18s ease}@media(hover:hover) and (pointer:fine){.tech-reader-item:hover,.tech-interaction-card:hover{background:var(--hover-bg);border-color:var(--hover-ring);box-shadow:0 6px 18px rgba(0,0,0,.12);transform:translateY(-2px)}}.tech-apply-notes{margin-top:28px;padding:20px 22px;border:1px solid var(--border);border-radius:12px}.tech-apply-notes h2{margin:0 0 10px;font-size:15px;font-weight:600}.tech-apply-notes ul{margin:0;padding-left:18px;font-size:13.5px;line-height:1.85;color:var(--text-secondary)}.tech-apply-notes li{overflow-wrap:anywhere}.tech-apply-notes a{color:var(--accent);text-decoration:none}.tech-apply-notes a:hover{text-decoration:underline}@media(max-width:860px){.tech-interactions{grid-template-columns:1fr}}@media(max-width:640px){.tech-reader-stats,.tech-interaction-stats{grid-template-columns:repeat(3,minmax(0,1fr));gap:8px}.tech-reader-stats>div,.tech-interaction-stats>div{padding:12px}.tech-reader-item{gap:10px;padding:13px 0;border-color:transparent;border-bottom-color:var(--border);border-radius:0}.tech-reader-item:last-child{border-bottom-color:transparent}.tech-reader-avatar{width:38px;height:38px}.tech-reader-quote{-webkit-line-clamp:3}.tech-apply-notes{padding:16px}}