:root{--paper:#f7f4ec;--paper-deep:#f0ebdf;--ink:#2b2a26;--ink-faded:#85806f;--line:#d9d2c0;--seal:#b03a2e;--font-display:"LXGW WenKai", "Kaiti SC", "STKaiti", "KaiTi", "Noto Serif SC", serif;--font-body:-apple-system, "PingFang SC", "Microsoft YaHei", "Noto Sans SC", sans-serif;--font-mono:ui-monospace, "SF Mono", Menlo, Consolas, monospace;--measure:46rem;--measure-wide:62rem}*{box-sizing:border-box;margin:0;padding:0}html{scroll-behavior:smooth}@media (prefers-reduced-motion:reduce){html{scroll-behavior:auto}*,:before,:after{transition:none!important;animation:none!important}}body{background:var(--paper);color:var(--ink);font-family:var(--font-body);-webkit-font-smoothing:antialiased;font-size:16px;line-height:1.75}a{color:inherit}a:focus-visible,button:focus-visible{outline:2px solid var(--seal);outline-offset:3px}.wrap{max-width:var(--measure-wide);margin-inline:auto;padding-inline:24px}.fade-up{animation:.7s ease-out both fadeUp}.fade-up.d1{animation-delay:80ms}.fade-up.d2{animation-delay:.18s}.fade-up.d3{animation-delay:.3s}@keyframes fadeUp{0%{opacity:0;transform:translateY(14px)}to{opacity:1;transform:none}}.nav{border-bottom:1px solid var(--line);flex-wrap:wrap;justify-content:space-between;align-items:center;gap:16px;padding-block:20px;display:flex}.brand{align-items:baseline;gap:12px;text-decoration:none;display:flex}.brand-name{font-family:var(--font-display);letter-spacing:.02em;font-size:1.35rem}.brand-sub{color:var(--ink-faded);letter-spacing:.12em;font-size:.78rem}.nav-links{gap:26px;font-size:.9rem;display:flex}.nav-links a{color:var(--ink-faded);padding-bottom:2px;text-decoration:none}.nav-links a:hover{color:var(--ink)}.nav-links a.active{color:var(--ink);border-bottom:2px solid var(--seal)}.seal-stamp{border:2.5px solid var(--seal);width:3.2em;height:3.2em;color:var(--seal);font-family:var(--font-display);text-align:center;-webkit-user-select:none;user-select:none;border-radius:3px 6px 4px 5px;justify-content:center;align-items:center;font-size:.95rem;line-height:1.15;display:inline-flex;transform:rotate(2.5deg)}.hero{grid-template-columns:1fr auto;align-items:center;gap:56px;padding-block:84px 68px;display:grid}.hero-eyebrow{letter-spacing:.28em;color:var(--ink-faded);margin-bottom:20px;font-size:.82rem}.hero h1{font-family:var(--font-display);letter-spacing:.01em;font-size:clamp(2.1rem,5vw,3.1rem);font-weight:500;line-height:1.35}.hero .stroke{white-space:nowrap;position:relative}.hero .stroke svg{width:104%;height:.32em;position:absolute;bottom:-.12em;left:-2%;overflow:visible}.hero .stroke path{fill:none;stroke:var(--seal);stroke-width:5px;stroke-linecap:round;stroke-dasharray:320;stroke-dashoffset:320px;animation:.9s ease-out .5s forwards draw}@keyframes draw{to{stroke-dashoffset:0}}@media (prefers-reduced-motion:reduce){.hero .stroke path{stroke-dashoffset:0}}.hero .lede{max-width:32em;margin-top:24px;font-size:1.02rem}.hero .lede em{color:var(--seal);font-style:normal}.hero .lede a{color:var(--ink)}.hero-actions{flex-wrap:wrap;align-items:center;gap:20px;margin-top:34px;display:flex}.motto{align-items:flex-start;gap:18px;display:flex}.motto-text{writing-mode:vertical-rl;font-family:var(--font-display);letter-spacing:.35em;color:var(--ink-faded);border-right:1px solid var(--line);height:11.5em;padding-right:14px;font-size:1.25rem}.motto .seal-stamp{align-self:flex-end;margin-top:auto}.btn-primary{font-family:var(--font-display);color:var(--paper);background:var(--ink);border:2px solid var(--ink);border-radius:255px 18px 225px/18px 225px 18px 255px;padding:12px 32px;font-size:1.05rem;text-decoration:none;transition:background .15s,color .15s;display:inline-block}.btn-primary:hover{background:var(--seal);border-color:var(--seal)}.btn-ghost{color:var(--ink-faded);border-bottom:1px solid var(--line);padding-bottom:2px;font-size:.9rem;text-decoration:none}.btn-ghost:hover{color:var(--ink);border-color:var(--ink)}.section{border-top:1px solid var(--line);padding-block:72px}.section-head{align-items:baseline;gap:18px;margin-bottom:40px;display:flex}.section-head h2{font-family:var(--font-display);font-size:1.7rem;font-weight:500}.section-head .rule{background:var(--line);flex:1;height:1px}.section-head .tag{letter-spacing:.2em;color:var(--ink-faded);white-space:nowrap;font-size:.8rem}.page-head{padding-block:56px 0}.page-head h1{font-family:var(--font-display);font-size:2.1rem;font-weight:500}.page-head p{color:var(--ink-faded);max-width:36em;margin-top:10px}.project-list{grid-template-columns:repeat(2,1fr);gap:32px;display:grid}.project-card{border:1.5px solid var(--ink);background:var(--paper-deep);border-radius:4px 10px 6px 12px;flex-direction:column;gap:12px;padding:26px 28px 24px;display:flex;box-shadow:5px 6px #2b2a261f}.project-card h3{font-family:var(--font-display);flex-wrap:wrap;align-items:baseline;gap:12px;font-size:1.3rem;font-weight:500;display:flex}.project-status{font-family:var(--font-body);color:var(--seal);border:1px solid var(--seal);vertical-align:2px;white-space:nowrap;border-radius:3px;padding:1px 6px;font-size:.7rem}.project-tagline{color:var(--ink);font-size:.95rem}.project-desc{color:var(--ink-faded);font-size:.9rem}.project-stack{flex-wrap:wrap;gap:10px;margin-top:auto;padding-top:6px;display:flex}.project-stack span{font-family:var(--font-mono);color:var(--ink-faded);background:var(--paper);border:1px solid var(--line);border-radius:3px;padding:1px 8px;font-size:.75rem}.project-links{gap:18px;display:flex}.project-links a{color:var(--ink);border-bottom:1.5px solid var(--seal);padding-bottom:1px;font-size:.88rem;text-decoration:none}.project-links a:hover{color:var(--seal)}.post-list{list-style:none}.post-list li{border-bottom:1px dashed var(--line);padding-block:26px}.post-list li:first-child{padding-top:8px}.post-item-date{font-family:var(--font-mono);color:var(--ink-faded);font-size:.8rem}.post-item-title{font-family:var(--font-display);margin-top:4px;font-size:1.35rem;font-weight:500;text-decoration:none;display:inline-block}.post-item-title:hover{color:var(--seal)}.post-item-summary{color:var(--ink-faded);max-width:var(--measure);margin-top:6px;font-size:.92rem}.post-tags{gap:10px;margin-left:12px;display:inline-flex}.post-tags span{color:var(--ink-faded);font-size:.75rem}.post-tags span:before{content:"#";color:var(--seal);margin-right:1px}.post-page{max-width:var(--measure);margin-inline:auto}.post-back{color:var(--ink-faded);border-bottom:1px solid var(--line);margin-top:40px;padding-bottom:1px;font-size:.88rem;text-decoration:none;display:inline-block}.post-back:hover{color:var(--ink);border-color:var(--ink)}.post-title{font-family:var(--font-display);margin-top:28px;font-size:clamp(1.7rem,4vw,2.3rem);font-weight:500;line-height:1.4}.post-meta{border-bottom:1px solid var(--line);color:var(--ink-faded);margin-top:12px;padding-bottom:28px;font-size:.85rem}.prose{padding-block:32px 72px}.prose>*+*{margin-top:1.1em}.prose h2,.prose h3,.prose h4{font-family:var(--font-display);margin-top:2em;font-weight:500;line-height:1.45}.prose h2{border-bottom:1px dashed var(--line);padding-bottom:8px;font-size:1.45rem}.prose h3{font-size:1.2rem}.prose a{color:var(--ink);border-bottom:1.5px solid var(--seal);padding-bottom:1px;text-decoration:none}.prose a:hover{color:var(--seal)}.prose a.anchor{color:var(--line);font-family:var(--font-mono);border-bottom:none;margin-left:8px;font-size:.85em}.prose h2:hover .anchor,.prose h3:hover .anchor,.prose h4:hover .anchor{color:var(--seal)}.prose blockquote{border-left:2px solid var(--seal);color:var(--ink-faded);padding-left:18px}.prose ul,.prose ol{padding-left:1.4em}.prose li+li{margin-top:.35em}.prose img{border:1px solid var(--line);border-radius:4px;max-width:100%}.prose hr{border:none;border-top:1px dashed var(--line);margin-block:2em}.prose code{font-family:var(--font-mono);font-size:.86em}.prose :not(pre)>code{background:var(--paper-deep);border:1px solid var(--line);border-radius:3px;padding:1px 6px}.prose pre{border:1px solid var(--line);border-radius:4px 8px 5px 9px;padding:18px 20px;font-size:.86rem;line-height:1.6;overflow-x:auto}.prose table{border-collapse:collapse;display:block;overflow-x:auto}.prose th,.prose td{border:1px solid var(--line);text-align:left;padding:8px 14px}.prose th{font-family:var(--font-display);background:var(--paper-deep);font-weight:500}.about{max-width:var(--measure);margin-inline:auto;padding-block:16px 72px}.about-intro{align-items:flex-start;gap:28px;margin-top:32px;display:flex}.about-intro p{max-width:36em}.about-intro p+p{margin-top:1em}.contact-list{border-top:1px solid var(--line);margin-top:40px;list-style:none}.contact-list li{border-bottom:1px dashed var(--line);gap:20px;padding-block:14px;font-size:.95rem;display:flex}.contact-list .label{font-family:var(--font-display);width:5.5em;color:var(--ink-faded);flex-shrink:0}.contact-list a{border-bottom:1.5px solid var(--seal);padding-bottom:1px;text-decoration:none}.contact-list a:hover{color:var(--seal)}.state-note{color:var(--ink-faded);padding-block:48px;font-size:.92rem}.state-note a{color:var(--ink)}.footer{border-top:1px solid var(--line);color:var(--ink-faded);flex-wrap:wrap;justify-content:space-between;align-items:center;gap:16px;padding-block:32px 44px;font-size:.82rem;display:flex}.footer a{color:var(--ink-faded)}.footer a:hover{color:var(--ink)}.nav-login{text-decoration:none;color:var(--seal)!important}.nav-user{align-items:center;gap:8px;display:inline-flex}.nav-write{text-decoration:none;color:var(--seal)!important}.nav-avatar{border:1px solid var(--line);object-fit:cover;border-radius:50%;width:22px;height:22px}.nav-avatar.fallback{background:var(--paper-deep);color:var(--ink);justify-content:center;align-items:center;font-size:.7rem;display:inline-flex}.nav-name{color:var(--ink);text-overflow:ellipsis;white-space:nowrap;max-width:8em;overflow:hidden}.nav-logout{font:inherit;color:var(--ink-faded);cursor:pointer;background:0 0;border:none;border-bottom:1px solid #0000;padding:0;font-size:.82rem}.nav-logout:hover{color:var(--ink);border-color:var(--ink)}.login-page{max-width:var(--measure);padding-bottom:80px}.login-buttons{flex-direction:column;gap:18px;max-width:22em;margin-top:36px;display:flex}.login-btn{font-family:var(--font-display);color:var(--ink);border:1.5px solid var(--ink);background:var(--paper-deep);border-radius:255px 18px 225px/18px 225px 18px 255px;align-items:center;gap:14px;padding:13px 24px;font-size:1.05rem;text-decoration:none;transition:transform .12s,box-shadow .12s;display:flex;box-shadow:4px 5px #2b2a261f}.login-btn:hover{transform:translate(1px,1px);box-shadow:2px 3px #2b2a261f}.login-btn.disabled{opacity:.45;box-shadow:none;cursor:not-allowed}.login-mark{border:1.5px solid var(--seal);width:1.7em;height:1.7em;color:var(--seal);border-radius:3px 6px 4px 5px;justify-content:center;align-items:center;font-size:.9em;display:inline-flex;transform:rotate(-2deg)}.login-note{color:var(--ink-faded);max-width:30em;margin-top:28px;font-size:.82rem}.like-row{border-top:1px dashed var(--line);padding-block:8px 40px;align-items:center;gap:16px;margin-top:-24px;padding-top:32px;display:flex}.like-stamp{width:3.4em;height:3.4em;font-family:var(--font-display);color:var(--ink-faded);border:2.5px solid var(--ink-faded);cursor:pointer;background:0 0;border-radius:3px 6px 4px 5px;font-size:1.05rem;transition:color .15s,border-color .15s,transform .15s;transform:rotate(-2deg)}.like-stamp:hover{color:var(--seal);border-color:var(--seal)}.like-stamp.liked{color:var(--seal);border-color:var(--seal);background:#b03a2e12;transform:rotate(2.5deg)scale(1.05)}.like-count{color:var(--ink-faded);font-size:.9rem}.comments{padding-bottom:72px}.comment-list{margin-bottom:36px;list-style:none}.comment-list li{border-bottom:1px dashed var(--line);gap:14px;padding-block:18px;display:flex}.comment-avatar{border:1px solid var(--line);object-fit:cover;border-radius:50%;flex-shrink:0;width:36px;height:36px}.comment-avatar.fallback{font-family:var(--font-display);background:var(--paper-deep);color:var(--seal);justify-content:center;align-items:center;display:inline-flex}.comment-main{flex:1;min-width:0}.comment-head{align-items:baseline;gap:12px;display:flex}.comment-name{font-family:var(--font-display);font-size:.98rem}.comment-time{font-family:var(--font-mono);color:var(--ink-faded);font-size:.75rem}.comment-del{font:inherit;color:var(--ink-faded);cursor:pointer;background:0 0;border:none;margin-left:auto;font-size:.78rem}.comment-del:hover{color:var(--seal)}.comment-body{white-space:pre-wrap;overflow-wrap:break-word;margin-top:4px;font-size:.95rem}.comment-form textarea,.write-editor{width:100%;font:inherit;color:var(--ink);background:var(--paper-deep);border:1.5px solid var(--ink);resize:vertical;border-radius:4px 10px 6px 12px;padding:14px 16px}.comment-form textarea:focus,.write-editor:focus,.write-meta input:focus{outline:2px solid var(--seal);outline-offset:2px}.comment-form-foot{justify-content:space-between;align-items:center;gap:16px;margin-top:12px;display:flex}.comment-as{color:var(--ink-faded);font-size:.82rem}.comment-login-note{color:var(--ink-faded);font-size:.92rem}.comment-login-note a{color:var(--ink)}.btn-small{padding:8px 26px;font-size:.95rem}.btn-primary:disabled{opacity:.5;cursor:not-allowed}.form-error{color:var(--seal);margin-block:10px;font-size:.88rem}.post-edit{color:var(--seal);margin-left:14px;font-size:.82rem}.write-page{max-width:88rem;padding-block:40px 80px}.write-head{flex-wrap:wrap;justify-content:space-between;align-items:baseline;gap:20px;display:flex}.write-head h1{font-family:var(--font-display);font-size:1.8rem;font-weight:500}.write-actions{align-items:center;gap:18px;display:flex}.write-actions .btn-ghost{font:inherit;cursor:pointer;background:0 0;border-top:none;border-left:none;border-right:none;font-size:.9rem}.write-status{color:var(--ink-faded);font-size:.82rem}.preview-toggle{color:var(--ink-faded);cursor:pointer;align-items:center;gap:6px;font-size:.85rem;display:inline-flex}.btn-danger{font:inherit;color:var(--ink-faded);cursor:pointer;background:0 0;border:none;font-size:.85rem}.btn-danger:hover{color:var(--seal)}.write-meta{margin-top:28px}.write-title{width:100%;font-family:var(--font-display);color:var(--ink);border:none;border-bottom:1.5px solid var(--line);background:0 0;padding-block:8px;font-size:1.7rem}.write-title:focus{border-bottom-color:var(--seal);outline:none}.write-fields{grid-template-columns:1fr 1fr 2fr;gap:16px;margin-top:14px;display:grid}.write-fields label{color:var(--ink-faded);letter-spacing:.08em;flex-direction:column;gap:4px;font-size:.78rem;display:flex}.write-fields input{font:inherit;color:var(--ink);background:var(--paper-deep);border:1px solid var(--line);border-radius:4px;padding:7px 10px;font-size:.9rem}.write-toolbar{border:1px solid var(--line);background:var(--paper-deep);border-bottom:none;border-radius:6px 6px 0 0;flex-wrap:wrap;align-items:center;gap:6px;margin-top:20px;padding:8px 10px;display:flex}.write-toolbar button,.toolbar-upload{font-family:var(--font-mono);color:var(--ink);background:var(--paper);border:1px solid var(--line);cursor:pointer;border-radius:4px;padding:4px 10px;font-size:.82rem}.write-toolbar button:hover,.toolbar-upload:hover{border-color:var(--seal);color:var(--seal)}.toolbar-upload{align-items:center;gap:4px;display:inline-flex}.toolbar-upload input{display:none}.write-panes{border:1.5px solid var(--ink);border-radius:0 0 8px 10px;grid-template-columns:1fr 1fr;gap:0;min-height:480px;display:grid;overflow:hidden}.write-panes.single{grid-template-columns:1fr}.write-editor{background:var(--paper);font-family:var(--font-mono);resize:none;border:none;border-radius:0;min-height:480px;font-size:.9rem;line-height:1.7}.write-editor:focus{outline:none}.write-preview{border-left:1px dashed var(--line);background:var(--paper);max-height:75vh;padding:4px 28px;overflow-y:auto}.write-preview .prose{padding-block:16px 40px}.write-head-left{align-items:baseline;gap:20px;display:flex}.write-head-left .post-back{margin-top:0}.write-status.dirty{color:var(--seal)}.char-count{font-family:var(--font-mono);color:var(--ink-faded);margin-left:auto;font-size:.75rem}.recover-note{border:1px dashed var(--seal);color:var(--ink);border-radius:4px 8px 5px 9px;flex-wrap:wrap;align-items:center;gap:12px;margin-top:16px;padding:12px 16px;font-size:.9rem;display:flex}.recover-note button{font:inherit;color:var(--seal);cursor:pointer;border:none;border-bottom:1px solid var(--seal);background:0 0;padding:0 0 1px;font-size:.85rem}.manage-page{max-width:var(--measure-wide);padding-block:40px 80px}.manage-group{margin-top:40px}.manage-group .section-head{margin-bottom:8px}.manage-date{font-family:var(--font-mono);color:var(--ink-faded);white-space:nowrap;font-size:.75rem}.manage-ops{align-items:baseline;gap:14px;margin-left:auto;display:inline-flex}.manage-ops a{color:var(--seal);font-size:.85rem}.manage-ops button{font:inherit;color:var(--ink-faded);cursor:pointer;background:0 0;border:none;font-size:.85rem}.manage-ops button:hover{color:var(--seal)}.manage-list{list-style:none}.manage-list li{border-bottom:1px dashed var(--line);align-items:baseline;gap:14px;padding-block:12px;font-size:.95rem;display:flex}.manage-status{border:1px solid var(--line);color:var(--ink-faded);white-space:nowrap;border-radius:3px;padding:1px 6px;font-size:.7rem}.manage-status.pub{color:var(--seal);border-color:var(--seal)}.manage-status.draft{color:var(--ink);border-color:var(--ink)}.manage-title{font-family:var(--font-display)}.manage-note{color:var(--ink-faded);margin-left:auto;font-size:.78rem}@media (width<=760px){.hero{grid-template-columns:1fr;gap:40px;padding-block:52px 44px}.motto{display:none}.project-list{grid-template-columns:1fr}.section{padding-block:52px}.nav-links{flex-wrap:wrap;gap:16px}.nav-name{display:none}.write-fields,.write-panes{grid-template-columns:1fr}.write-preview{border-left:none;border-top:1px dashed var(--line)}}
