@font-face{font-family:JetBrains Mono;font-style:normal;font-display:swap;font-weight:400;src:url(/assets/jetbrains-mono-latin-400-normal-V6pRDFza.woff2) format("woff2"),url(/assets/jetbrains-mono-latin-400-normal-6-qcROiO.woff) format("woff")}@font-face{font-family:JetBrains Mono;font-style:normal;font-display:swap;font-weight:500;src:url(/assets/jetbrains-mono-latin-500-normal-BWZEU5yA.woff2) format("woff2"),url(/assets/jetbrains-mono-latin-500-normal-CJOVTJB7.woff) format("woff")}@font-face{font-family:JetBrains Mono;font-style:normal;font-display:swap;font-weight:600;src:url(/assets/jetbrains-mono-latin-600-normal-C8RAYTDA.woff2) format("woff2"),url(/assets/jetbrains-mono-latin-600-normal-BfsvjouI.woff) format("woff")}@font-face{font-family:JetBrains Mono;font-style:normal;font-display:swap;font-weight:700;src:url(/assets/jetbrains-mono-latin-700-normal-BYuf6tUa.woff2) format("woff2"),url(/assets/jetbrains-mono-latin-700-normal-D3wTyLJW.woff) format("woff")}:root{color-scheme:dark;--bg: #0e1116;--bg-soft: #12161d;--panel: #161b24;--panel-2: #1b212d;--line: #232a36;--line-strong: #323b4b;--ink: #e3e8f0;--ink-2: #a7b0c0;--ink-3: #6b7486;--accent: #6ea8fe;--accent-deep: #4a7fe0;--accent-soft: rgba(110, 168, 254, .12);--ok: #3fb950;--warn: #e3b341;--danger: #f85149;--code-bg: #0a0d12;--shadow: 0 14px 40px -20px rgba(0, 0, 0, .55);--mono: "JetBrains Mono", ui-monospace, "Cascadia Code", Consolas, monospace;--sans: -apple-system, BlinkMacSystemFont, "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei", "Noto Sans SC", sans-serif;--wrap: 46rem;--wrap-wide: 62rem;--lh: 1.85}[data-theme=light]{color-scheme:light;--bg: #f6f7f9;--bg-soft: #eef0f4;--panel: #ffffff;--panel-2: #f4f6f9;--line: #e3e6ec;--line-strong: #cfd5de;--ink: #16171b;--ink-2: #4e5866;--ink-3: #989fae;--accent: #2f54eb;--accent-deep: #1d3ec8;--accent-soft: rgba(47, 84, 235, .1);--ok: #1a7f4b;--warn: #9a6b00;--danger: #c23830;--code-bg: #0f1218;--shadow: 0 12px 32px -20px rgba(20, 22, 35, .35)}*{box-sizing:border-box}html{scroll-behavior:smooth;scroll-padding-top:4.4rem}body{margin:0;background:var(--bg);color:var(--ink);font-family:var(--sans);font-size:16px;line-height:var(--lh);overflow-x:clip;-webkit-font-smoothing:antialiased;transition:background .25s ease,color .25s ease}::selection{background:var(--accent-soft);color:var(--accent)}img,svg{display:block;max-width:100%}a{color:inherit}button{font-family:inherit}.mono{font-family:var(--mono)}:focus-visible{outline:2px solid var(--accent);outline-offset:2px;border-radius:4px}.wrap{width:100%;max-width:var(--wrap);margin-inline:auto;padding-inline:1.35rem}.wrap-wide{width:100%;max-width:var(--wrap-wide);margin-inline:auto;padding-inline:1.35rem}.btn{display:inline-flex;align-items:center;gap:.45rem;font-family:var(--mono);font-size:.84rem;padding:.6rem 1rem;border-radius:8px;border:1px solid var(--line-strong);background:var(--panel);color:var(--ink);cursor:pointer;transition:border-color .16s,background .16s,color .16s,transform .1s}.btn:hover{border-color:var(--accent);color:var(--accent)}.btn:active{transform:translateY(1px)}.btn--primary{background:var(--accent);border-color:var(--accent);color:#0b0e13}[data-theme=light] .btn--primary{color:#fff}.btn--primary:hover{background:var(--accent-deep);border-color:var(--accent-deep);color:#fff}.btn--ghost{border-color:transparent;color:var(--ink-2)}.btn--ghost:hover{background:var(--accent-soft);color:var(--accent);border-color:transparent}.btn--sm{padding:.4rem .72rem;font-size:.76rem}.btn:disabled{opacity:.5;cursor:not-allowed}.input{width:100%;font-family:var(--sans);font-size:.95rem;padding:.62rem .85rem;border:1px solid var(--line-strong);border-radius:8px;background:var(--panel);color:var(--ink);transition:border-color .16s,box-shadow .16s}.input:focus{outline:none;border-color:var(--accent);box-shadow:0 0 0 3px var(--accent-soft)}textarea.input{resize:vertical;font-family:var(--mono);font-size:.86rem;line-height:1.7}.field{display:flex;flex-direction:column;gap:.35rem;margin-bottom:1rem}.field label{font-family:var(--mono);font-size:.72rem;text-transform:uppercase;letter-spacing:.06em;color:var(--ink-3)}.site-header{position:sticky;top:0;z-index:40;background:color-mix(in srgb,var(--bg) 82%,transparent);backdrop-filter:blur(12px);-webkit-backdrop-filter:blur(12px);border-bottom:1px solid var(--line)}.site-header .wrap-wide{display:flex;align-items:center;justify-content:space-between;gap:.9rem;padding-block:.75rem}.brand{display:inline-flex;align-items:baseline;gap:.5rem;font-family:var(--mono);font-weight:700;font-size:1rem;text-decoration:none;color:var(--ink);letter-spacing:-.01em}.brand .at{color:var(--accent)}.brand .cursor{display:inline-block;width:.5em;height:1.05em;background:var(--accent);vertical-align:text-bottom;animation:blink 1.1s steps(2,start) infinite}.site-nav{display:flex;gap:.2rem;align-items:center}.site-nav a{font-family:var(--mono);font-size:.84rem;color:var(--ink-2);text-decoration:none;padding:.4rem .72rem;border-radius:7px;transition:color .15s,background .15s}.site-nav a:hover{color:var(--accent);background:var(--accent-soft)}.site-nav a.on{color:var(--accent);background:var(--accent-soft);font-weight:600}.header-end{display:flex;align-items:center;gap:.55rem}.theme-btn{width:2.1rem;height:2.1rem;display:grid;place-items:center;border:1px solid var(--line-strong);border-radius:7px;background:var(--panel);color:var(--ink-2);cursor:pointer;font-size:.95rem;transition:border-color .15s,color .15s}.theme-btn:hover{border-color:var(--accent);color:var(--accent)}@keyframes blink{to{visibility:hidden}}.hero{padding:2.6rem 0 1.2rem}.shell{background:var(--code-bg);border:1px solid var(--line-strong);border-radius:12px;box-shadow:var(--shadow);overflow:hidden}.shell-bar{display:flex;align-items:center;gap:.45rem;padding:.6rem 1rem;background:var(--panel-2);border-bottom:1px solid var(--line)}.shell-dot{width:.62rem;height:.62rem;border-radius:50%}.shell-dot.r{background:#ff5f57}.shell-dot.y{background:#febc2e}.shell-dot.g{background:#28c840}.shell-title{margin-left:.6rem;font-family:var(--mono);font-size:.72rem;color:var(--ink-3)}.shell-body{padding:1.15rem 1.3rem 1.35rem;font-family:var(--mono);font-size:.9rem;line-height:1.95;color:var(--ink)}.shell-line{margin:0;color:var(--ink-3)}.shell-line .p{color:var(--ok)}.shell-line .w{color:var(--warn)}.shell-headline{margin:.4rem 0 0;font-size:1.02rem;color:var(--ink)}.shell-headline .hl{color:var(--accent)}.shell-headline .cur{display:inline-block;width:.55em;height:1.05em;background:var(--accent);vertical-align:text-bottom;animation:blink 1.1s steps(2,start) infinite}.shell-stats{margin-top:.95rem;font-size:.8rem;color:var(--ink-3)}.shell-stats b{color:var(--ink);font-weight:600}.shell-stats .sep{margin-inline:.9rem;color:var(--line-strong)}.hero-sub{margin:1rem 0 0;color:var(--ink-2);font-size:.96rem;max-width:44ch}.hero-sub .hl{color:var(--accent);font-weight:700}.page{padding-block:1.6rem 3.2rem;min-height:60vh}.page-head{margin-bottom:1.6rem}.page-head .kicker{font-family:var(--mono);font-size:.78rem;color:var(--accent);text-transform:uppercase;letter-spacing:.1em}.page-head h1{margin:.25rem 0 0;font-size:clamp(1.6rem,4vw,2.2rem);letter-spacing:.01em}.page-head p{margin:.5rem 0 0;color:var(--ink-2)}.layout-grid{display:grid;grid-template-columns:1fr 14rem;gap:2rem;align-items:start}@media(max-width:860px){.layout-grid{grid-template-columns:1fr}}.side-card{background:var(--panel);border:1px solid var(--line);border-radius:10px;padding:1rem 1.1rem;margin-bottom:1rem}.side-card h3{margin:0 0 .6rem;font-family:var(--mono);font-size:.76rem;text-transform:uppercase;letter-spacing:.08em;color:var(--ink-3)}.side-link{display:block;width:100%;text-align:left;font-family:var(--mono);font-size:.82rem;color:var(--ink-2);text-decoration:none;background:none;border:0;cursor:pointer;padding:.3rem 0;transition:color .15s}.side-link:hover{color:var(--accent)}.filter-row{display:flex;align-items:center;justify-content:space-between;gap:.8rem;margin-bottom:1.3rem;flex-wrap:wrap}.search-box{position:relative;flex:1 1 14rem;max-width:21rem}.search-box:before{content:"$";position:absolute;left:.8rem;top:50%;translate:0 -50%;font-family:var(--mono);color:var(--accent);font-size:.9rem}.search-box input{width:100%;font-family:var(--mono);font-size:.84rem;padding:.58rem .85rem .58rem 1.9rem}.chip-row{display:flex;flex-wrap:wrap;gap:.4rem}.chip{font-family:var(--mono);font-size:.76rem;padding:.34rem .75rem;border-radius:999px;border:1px solid var(--line-strong);background:var(--panel);color:var(--ink-2);cursor:pointer;transition:all .15s}.chip:hover{border-color:var(--accent);color:var(--accent)}.chip.on{background:var(--accent);border-color:var(--accent);color:#0b0e13;font-weight:600}[data-theme=light] .chip.on{color:#fff}.chip .n{opacity:.55;margin-left:.25rem}.log{list-style:none;margin:0;padding:0}.log-item{border-bottom:1px solid var(--line)}.log-link{display:grid;grid-template-columns:1.3rem minmax(6.5rem,auto) 1fr auto;gap:.9rem;align-items:baseline;padding:1.05rem .7rem;text-decoration:none;border-radius:8px;transition:background .16s,padding-left .16s,color .16s}.log-link:hover{background:var(--panel);padding-left:1.15rem}.log-arrow{font-family:var(--mono);color:var(--line-strong)}.log-item:hover .log-arrow{color:var(--accent)}.log-date{font-family:var(--mono);font-size:.78rem;color:var(--ink-3);white-space:nowrap}.log-tag{font-family:var(--mono);font-size:.7rem;color:var(--accent);background:var(--accent-soft);border:1px solid color-mix(in srgb,var(--accent) 28%,transparent);padding:.12rem .5rem;border-radius:999px;white-space:nowrap;justify-self:start}.log-title{font-weight:700;font-size:1.02rem;color:var(--ink)}.log-summary{grid-column:3;grid-row:2;color:var(--ink-2);font-size:.86rem;display:-webkit-box;-webkit-line-clamp:1;-webkit-box-orient:vertical;overflow:hidden}@media(max-width:620px){.log-link{grid-template-columns:1.1rem 1fr auto;gap:.6rem}.log-tag{display:none}.log-summary{grid-column:2}}.md{line-height:1.95;font-size:1rem}.md h3,.md h4,.md h5,.md h6{margin:1.9em 0 .6em;line-height:1.4}.md h3{font-size:1.32rem}.md h4{font-size:1.12rem}.md .md-p{margin:.9em 0}.md strong{color:var(--ink)}.md a{color:var(--accent);text-decoration:none;border-bottom:1px solid color-mix(in srgb,var(--accent) 50%,transparent)}.md a:hover{border-bottom-color:var(--accent)}.md .md-list{margin:.9em 0;padding-left:1.3em}.md .md-list li{margin:.35em 0}.md .md-list li::marker{color:var(--accent)}.md .md-quote{margin:1.2em 0;padding:.4em 1.1em;border-left:3px solid var(--accent);background:var(--accent-soft);border-radius:0 6px 6px 0;color:var(--ink-2)}.md code{font-family:var(--mono);font-size:.86em;background:var(--panel-2);border:1px solid var(--line);padding:.12em .42em;border-radius:5px}.md .md-code{margin:1.2em 0;background:var(--code-bg);border:1px solid var(--line-strong);border-radius:10px;overflow:hidden}.md .md-code-bar{display:block;padding:.42rem .9rem;font-family:var(--mono);font-size:.7rem;text-transform:uppercase;letter-spacing:.08em;color:var(--ink-3);background:var(--panel-2);border-bottom:1px solid var(--line)}.md .md-code code{display:block;padding:.9rem 1rem;background:none;border:0;font-size:.85rem;line-height:1.75;color:#d7deea;overflow-x:auto;white-space:pre}.md .md-hr{border:0;height:1px;margin:2.2em auto;max-width:8rem;background:var(--line-strong)}.md img{border-radius:10px;box-shadow:var(--shadow)}.post-meta{display:flex;flex-wrap:wrap;gap:.4rem 1rem;margin:1rem 0 0;font-family:var(--mono);font-size:.8rem;color:var(--ink-3)}.back-link{display:inline-flex;align-items:center;gap:.35rem;font-family:var(--mono);font-size:.82rem;color:var(--ink-2);text-decoration:none;margin-bottom:1.4rem;transition:color .15s}.back-link:hover{color:var(--accent)}.proj-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(15rem,1fr));gap:1.1rem}.proj-card{display:flex;flex-direction:column;gap:.55rem;background:var(--panel);border:1px solid var(--line);border-radius:12px;padding:1.15rem 1.2rem;text-decoration:none;transition:border-color .16s,transform .16s,box-shadow .16s}.proj-card:hover{border-color:var(--accent);transform:translateY(-3px);box-shadow:var(--shadow)}.proj-card .proj-name{font-weight:800;font-size:1.08rem;display:flex;align-items:center;justify-content:space-between;gap:.5rem}.proj-card .proj-role{font-family:var(--mono);font-size:.74rem;color:var(--accent)}.proj-card .proj-desc{color:var(--ink-2);font-size:.9rem}.proj-card .proj-stack{display:flex;flex-wrap:wrap;gap:.35rem;margin-top:auto;padding-top:.4rem}.proj-card .stack-chip{font-family:var(--mono);font-size:.68rem;color:var(--ink-2);background:var(--panel-2);border:1px solid var(--line);padding:.14rem .5rem;border-radius:999px}.proj-star{font-family:var(--mono);font-size:.78rem;color:var(--warn)}.about-grid{display:grid;grid-template-columns:1fr 1fr;gap:2rem;align-items:start}@media(max-width:720px){.about-grid{grid-template-columns:1fr}}.card-block{background:var(--panel);border:1px solid var(--line);border-radius:12px;padding:1.3rem 1.4rem}.card-block h3{margin:0 0 .8rem;font-size:1.05rem}.about-links{display:flex;flex-wrap:wrap;gap:.5rem;margin-top:.6rem}.about-links a{font-family:var(--mono);font-size:.82rem;color:var(--accent);text-decoration:none;border:1px solid color-mix(in srgb,var(--accent) 35%,transparent);padding:.3rem .7rem;border-radius:999px;transition:background .15s}.about-links a:hover{background:var(--accent-soft)}.skill-tags{display:flex;flex-wrap:wrap;gap:.4rem}.skill-tags span{font-family:var(--mono);font-size:.76rem;background:var(--panel-2);border:1px solid var(--line);padding:.24rem .65rem;border-radius:999px;color:var(--ink-2)}.admin-toolbar{display:flex;align-items:center;justify-content:space-between;gap:.8rem;margin-bottom:1.3rem;flex-wrap:wrap}.admin-form{background:var(--panel);border:1px solid var(--line);border-radius:12px;padding:1.3rem 1.4rem}.admin-meta-row{display:grid;grid-template-columns:1fr 1fr;gap:1rem}@media(max-width:640px){.admin-meta-row{grid-template-columns:1fr}}.admin-actions{display:flex;gap:.6rem;margin-top:1rem;flex-wrap:wrap}.preview-box{border:1px dashed var(--line-strong);border-radius:10px;padding:1.1rem 1.2rem;margin-top:1.2rem}.export-box{margin-top:1rem}.export-box textarea{min-height:9rem}.status-line{font-family:var(--mono);font-size:.8rem;color:var(--ink-2);margin:.9rem 0 0}.status-line .ok{color:var(--ok)}.status-line .err{color:var(--danger)}.state-box{border:1px dashed var(--line-strong);border-radius:10px;padding:2.6rem 1.2rem;text-align:center;color:var(--ink-3);font-family:var(--mono);font-size:.86rem}.spinner{display:inline-block;width:.95rem;height:.95rem;border:2px solid var(--line-strong);border-top-color:var(--accent);border-radius:50%;animation:spin .8s linear infinite;vertical-align:-2px;margin-right:.5rem}@keyframes spin{to{transform:rotate(360deg)}}.toast-hub{position:fixed;right:1.1rem;bottom:1.2rem;z-index:90;display:flex;flex-direction:column;gap:.5rem;pointer-events:none}.toast{pointer-events:auto;display:flex;gap:.55rem;align-items:flex-start;max-width:21rem;background:var(--panel);border:1px solid var(--line-strong);border-left:3px solid var(--accent);border-radius:10px;box-shadow:var(--shadow);padding:.7rem .95rem;font-size:.86rem;color:var(--ink);animation:toast-in .22s ease}.toast--ok{border-left-color:var(--ok)}.toast--err{border-left-color:var(--danger)}.toast .t-mark{font-family:var(--mono);font-weight:700;color:var(--accent)}.toast--ok .t-mark{color:var(--ok)}.toast--err .t-mark{color:var(--danger)}@keyframes toast-in{0%{opacity:0;transform:translateY(8px)}}.site-footer{border-top:1px solid var(--line);padding:1.8rem 0 2.2rem;color:var(--ink-3);text-align:center}.site-footer .mono-foot{font-family:var(--mono);font-size:.78rem}.site-footer p{margin:.3rem 0;font-size:.85rem}@media(max-width:720px){html{scroll-padding-top:3.6rem}.hero{padding-top:1.8rem}.shell-body{padding:1rem 1.05rem 1.15rem;font-size:.84rem}.site-nav a{padding:.34rem .55rem;font-size:.78rem}.filter-row{align-items:stretch;flex-direction:column}.search-box{max-width:none}.toast-hub{left:1rem;right:1rem}.toast{max-width:none}}@media(prefers-reduced-motion:reduce){html{scroll-behavior:auto}*,*:before,*:after{animation-duration:1ms!important;animation-iteration-count:1!important;transition-duration:1ms!important}}::-webkit-scrollbar{width:10px;height:10px}::-webkit-scrollbar-thumb{background:var(--line-strong);border-radius:999px}::-webkit-scrollbar-track{background:transparent}
