@font-face{font-family:Inter;font-style:normal;font-weight:100 900;font-display:swap;src:url(/_astro/inter-latin-wght-normal.Dx4kXJAl.woff2)format("woff2")}@font-face{font-family:IBM Plex Mono;font-style:normal;font-weight:400;font-display:swap;src:url(/_astro/ibm-plex-mono-latin-400-normal.DMJ8VG8y.woff2)format("woff2")}:root{color-scheme:light dark;--bg:light-dark(#fff,#0b0b0d);--ink:light-dark(#18181b,#f4f4f5);--muted:light-dark(#666670,#a0a0aa);--subtle:light-dark(#70707a,#9696a2);--display-muted:light-dark(#85858e,#777782);--line:light-dark(#e9e9ee,#292930);--soft:light-dark(#f7f7f9,#141418);--card-hover:light-dark(#bfbfc8,#4c4c57);--page-pad:clamp(24px, 4.5cqi, 72px);-webkit-font-smoothing:antialiased;font-feature-settings:"ss01" on, "cv11" on;background:var(--bg);color:var(--ink);font:14px/1.6 Inter,-apple-system,BlinkMacSystemFont,Segoe UI,PingFang SC,Microsoft YaHei,sans-serif}:root[data-theme=light]{color-scheme:light}:root[data-theme=dark]{color-scheme:dark}*,:before,:after{box-sizing:border-box}body,h1,h2,h3,p{margin:0}a{color:inherit;text-decoration:none}button{font:inherit;color:inherit;cursor:pointer;background:0 0;border:0}a,button{-webkit-tap-highlight-color:transparent;touch-action:manipulation}svg{stroke-width:1.6px;flex-shrink:0;width:16px;height:16px}.site-shell{flex-direction:column;min-height:100svh;display:flex;container:site/inline-size}main{flex:1;width:100%;min-width:0}.mono{letter-spacing:.045em;font:11px/1.5 IBM Plex Mono,ui-monospace,monospace}.skip-link{z-index:10;background:var(--ink);color:var(--bg);padding:12px 18px;position:absolute;top:12px;left:12px;transform:translateY(-160%)}.skip-link:focus{transform:none}.site-header{height:88px;padding:0 var(--page-pad);border-bottom:1px solid var(--line);align-items:center;gap:48px;display:flex}.brand{letter-spacing:-1.7px;font-size:29px;font-weight:750;line-height:1}.brand>span{color:var(--display-muted)}.site-nav{align-items:center;gap:30px;height:100%;display:flex}.site-nav a{height:100%;color:var(--muted);align-items:center;font-size:13px;transition:color .16s;display:flex;position:relative}.site-nav a:hover,.site-nav a[aria-current=page]{color:var(--ink)}.site-nav a[aria-current=page]:after{content:"";background:var(--ink);height:2px;position:absolute;bottom:-1px;left:0;right:0}.site-utilities{align-items:center;gap:16px;margin-left:auto;display:flex}.theme-toggle,.language-link,.github-link{min-height:36px;color:var(--muted);justify-content:center;align-items:center;padding:0;display:flex}.theme-toggle{width:28px}.language-link{white-space:nowrap;min-width:28px;font-size:11px}.github-link{gap:5px;font-size:11px}.github-link svg{width:12px;height:12px}:is(.theme-toggle,.language-link,.github-link):hover{color:var(--ink)}.nav-divider{background:var(--line);width:1px;height:14px}.text-link{align-items:center;gap:8px;min-height:30px;font-size:12px;display:inline-flex}.text-link svg{width:14px;height:14px;transition:transform .2s}.text-link:hover svg{transform:translate(2px,-2px)}.site-footer{padding:24px var(--page-pad);border-top:1px solid var(--line);color:var(--muted);justify-content:space-between;align-items:center;gap:20px;font-size:11px;display:flex}.footer-right{align-items:center;gap:16px;display:flex}.site-footer a{align-items:center;gap:4px;display:inline-flex}.site-footer a svg{width:12px;height:12px}.footer-dot{color:var(--subtle)}.home{padding:0 var(--page-pad)}.hero{grid-template-columns:minmax(0,1.5fr) minmax(0,1fr);align-items:end;gap:32px;padding:72px 0;display:grid}.hero h1{letter-spacing:-.065em;word-spacing:.05em;font-size:clamp(52px,8.1cqi,84px);font-weight:600;line-height:1.04}.hero h1>span{color:var(--display-muted)}.intro{color:var(--muted);padding:0 0 4px 16px;font-size:13px;line-height:1.9}.intro-name{color:var(--ink);margin-bottom:12px;font-size:16px;font-weight:500}.name-period{margin-left:3px}.intro .text-link{color:var(--ink);margin-top:20px}.section-heading{border-bottom:1px solid var(--line);justify-content:space-between;align-items:center;gap:16px;padding-bottom:22px;display:flex}.section-heading h2{letter-spacing:.02em;font-size:13px;font-weight:500}.project-row{border-bottom:1px solid var(--line);grid-template-columns:26px minmax(0,1.08fr) minmax(0,1.35fr) 20px;align-items:center;gap:16px;padding:25px 0;display:grid}.project-index{color:var(--subtle)}.project-name{min-width:0}.project-name h3{letter-spacing:-.7px;font-size:21px;font-weight:550;line-height:1.3;transition:transform .22s;display:inline-block;position:relative}.project-name h3:after{content:"";transform-origin:0;background:currentColor;height:1px;transition:transform .22s;position:absolute;bottom:-5px;left:0;right:0;transform:scaleX(0)}.project-row:is(:hover,:focus-visible) h3{transform:translate(3px)}.project-row:is(:hover,:focus-visible) h3:after{transform:scaleX(1)}.project-name>span{color:var(--muted);margin-top:6px;font:11px/1.5 IBM Plex Mono,monospace;display:block}.project-row>p{color:var(--muted);font-size:13px;line-height:1.8}.row-arrow{color:var(--muted);justify-self:end;display:flex}.row-arrow svg{transition:transform .22s,color .22s}.project-row:is(:hover,:focus-visible) .row-arrow svg{color:var(--ink);transform:translate(3px,-3px)}.contact{padding:64px var(--page-pad);margin:64px calc(-1 * var(--page-pad)) 0;background:var(--soft);justify-content:space-between;align-items:center;gap:36px;display:flex}.contact-eyebrow{color:var(--subtle);margin-bottom:18px;display:block}.contact h2{letter-spacing:-1px;font-size:clamp(25px,3cqi,40px);font-weight:500;line-height:1.3}.contact p{color:var(--muted);margin-top:16px;font-size:13px;line-height:1.8}.contact-link{letter-spacing:-.8px;border-bottom:1px solid var(--line);white-space:nowrap;align-items:center;gap:24px;padding-block:12px;font-size:clamp(20px,2.4cqi,30px);display:inline-flex}.contact-link svg{width:22px;height:22px;transition:transform .22s}.contact-link:is(:hover,:focus-visible) svg{transform:translate(4px,-4px)}.contact-link:hover{border-color:var(--ink)}.catalog{padding:64px var(--page-pad) 80px}.catalog-header{grid-template-columns:1fr 1fr;align-items:end;gap:40px;margin-bottom:56px;display:grid}.catalog-header .mono{color:var(--subtle)}.catalog-header h1{letter-spacing:-.065em;margin-top:14px;font-size:clamp(48px,6cqi,76px);font-weight:600;line-height:1.1}.catalog-header h1 span{color:var(--display-muted)}.catalog-header>p{color:var(--muted);padding-bottom:3px;font-size:14px;line-height:1.9}.catalog-topline{color:var(--muted);justify-content:space-between;padding-bottom:20px;font-size:11px;display:flex}.project-grid{grid-template-columns:repeat(2,minmax(0,1fr));gap:20px;display:grid}.project-card{border:1px solid var(--line);border-radius:8px;flex-direction:column;min-width:0;padding:26px 28px 0;transition:border-color .2s;display:flex}.project-card:is(:hover,:focus-within){border-color:var(--card-hover)}.card-topline{justify-content:space-between;align-items:center;gap:16px;margin-bottom:22px;display:flex}.card-category{color:var(--subtle)}.card-stars{color:var(--muted);align-items:center;gap:6px;padding:2px 0;font:11px/1.6 IBM Plex Mono,monospace;display:inline-flex}.card-stars svg{width:13px;height:13px}.card-stars:hover{color:var(--ink)}.card-title{letter-spacing:-.9px;font-size:28px;font-weight:550;line-height:1.2}.card-title a{align-items:center;gap:12px;display:inline-flex}.card-title a>span{position:relative}.card-title a>span:after{content:"";transform-origin:0;background:currentColor;height:1px;transition:transform .2s;position:absolute;bottom:-4px;left:0;right:0;transform:scaleX(0)}.card-title a:is(:hover,:focus-visible)>span:after{transform:scaleX(1)}.card-title svg{width:16px;height:16px;color:var(--subtle);transition:transform .2s,color .2s}.card-title a:is(:hover,:focus-visible) svg{color:var(--ink);transform:translate(2px,-2px)}.card-repo{color:var(--subtle);overflow-wrap:anywhere;margin-top:9px;display:block}.card-description{color:var(--muted);max-width:42ch;margin-top:20px;margin-bottom:28px;font-size:14px;line-height:1.85}.card-bottom{margin-top:auto}.card-meta{color:var(--muted);flex-wrap:wrap;align-items:center;gap:10px 12px;padding-bottom:20px;font-size:11px;display:flex}.card-license{border-left:1px solid var(--line);padding-left:12px}.card-updated{color:var(--subtle);flex-wrap:wrap;align-items:center;gap:6px;margin-left:auto;display:inline-flex}.card-updated time{letter-spacing:0;font-size:11px}.card-links{border-top:1px solid var(--line);flex-wrap:wrap;align-items:center;gap:0 18px;min-height:57px;padding:7px 0;display:flex}.card-links a{color:var(--muted);white-space:nowrap;align-items:center;gap:5px;padding-block:10px;font-size:12px;display:inline-flex}.card-links .card-doc-link{color:var(--ink);margin-right:auto}.card-links svg{width:12px;height:12px;transition:transform .2s}.card-links a:is(:hover,:focus-visible){color:var(--ink)}.card-links a:is(:hover,:focus-visible) svg{transform:translate(2px,-2px)}.project-home{padding:0 var(--page-pad) 64px}.project-context{border-bottom:1px solid var(--line);align-items:center;gap:24px;padding-block:22px;display:flex}.back-link{color:var(--muted);align-items:center;gap:8px;font-size:11px;display:inline-flex}.back-link svg{width:12px;height:12px}.project-context>span{border-left:1px solid var(--line);padding-left:24px;font-size:13px;font-weight:550}.project-hero{border-bottom:1px solid var(--line);grid-template-columns:minmax(0,1fr) minmax(180px,.36fr);align-items:center;gap:clamp(40px,7cqi,120px);padding-block:64px 56px;display:grid}.project-hero-copy>.mono{color:var(--subtle)}.project-hero h1{letter-spacing:-.055em;overflow-wrap:anywhere;margin-top:16px;font-size:clamp(42px,5.6cqi,72px);font-weight:600;line-height:1.1}.project-hero-copy>p{max-width:48ch;color:var(--muted);margin-top:24px;font-size:16px;line-height:1.8}.project-actions{align-items:center;gap:24px;margin-top:30px;display:flex}.primary-action{background:var(--ink);color:var(--bg);border-radius:5px;align-items:center;gap:16px;padding:12px 16px;font-size:12px;display:inline-flex}.primary-action svg{width:13px;height:13px;transition:transform .2s}.primary-action:hover svg{transform:translate(2px,-2px)}.project-facts{gap:20px;margin:0;display:grid}.project-facts dt{color:var(--subtle);margin-bottom:6px;font-size:11px}.project-facts dd{overflow-wrap:anywhere;margin:0;font-size:12px}.project-stars{align-items:center;gap:7px;display:inline-flex}.project-stars svg{width:12px;height:12px}.project-body{grid-template-columns:minmax(0,1fr) minmax(180px,.36fr);gap:clamp(40px,7cqi,120px);padding-top:42px;display:grid}.project-focus{max-width:720px}.project-focus>.mono{color:var(--subtle)}.project-focus h2{letter-spacing:-.7px;margin-top:24px;font-size:26px;font-weight:550;line-height:1.3}.project-focus p{color:var(--muted);margin-top:16px;font-size:14px;line-height:1.9}.project-focus ul{margin:24px 0 0;padding:0;list-style:none}.project-focus li{border-bottom:1px solid var(--line);color:var(--muted);padding:14px 0}.project-guide h2{margin-bottom:18px;font-size:12px;font-weight:500}.project-guide a{color:var(--muted);border-bottom:1px solid var(--line);justify-content:space-between;align-items:center;gap:14px;padding:14px 0;font-size:12px;display:flex}.project-guide a:hover{color:var(--ink)}.project-guide svg{width:12px;height:12px}.resume{max-width:940px;padding:44px var(--page-pad);margin-inline:auto}.resume-topline{color:var(--muted);justify-content:space-between;align-items:center;margin-bottom:34px;display:flex}.resume-topline .mono{letter-spacing:.13em}.resume-heading{border-bottom:1px solid var(--ink);grid-template-columns:minmax(0,1fr) auto;grid-template-areas:"identity portrait""links links";align-items:start;gap:20px 24px;padding-bottom:38px;display:grid}.resume-portrait{object-fit:cover;border-radius:8px;grid-area:portrait;width:96px;height:96px;display:block}.resume-identity{grid-area:identity;min-width:0}.resume-heading h1{letter-spacing:-3px;font-size:56px;font-weight:600;line-height:1.15}.resume-heading h1>span{color:var(--display-muted)}.resume-heading p{color:var(--muted);margin-top:13px;font-size:13px}.resume-heading .resume-location{margin-top:8px;font-size:11px}.resume-links{color:var(--muted);flex-direction:column;grid-area:links;align-items:flex-start;gap:8px;padding-bottom:3px;font-size:11px;display:flex}.resume-links a{align-items:center;gap:5px;display:flex}.resume-section{border-bottom:1px solid var(--line);grid-template-columns:125px minmax(0,1fr);gap:30px;padding:30px 0;display:grid}.resume-section>h2{font-size:13px;font-weight:500;line-height:1.8}.resume-section-content{min-width:0}.resume-intro{color:var(--muted);font-size:14px;line-height:1.9}.resume-entry+.resume-entry{margin-top:30px}.resume-entry-heading{flex-wrap:wrap;justify-content:space-between;align-items:center;gap:6px 18px;display:flex}.resume-entry-heading h3{letter-spacing:-.4px;font-size:17px;font-weight:550}.resume-entry-heading h3 a{align-items:center;gap:7px;display:flex}.resume-entry-heading svg{width:12px;height:12px;color:var(--muted)}.resume-period{color:var(--subtle);white-space:nowrap}.resume-role{color:var(--muted);margin-top:5px;font-size:12px}.resume-description{color:var(--muted);margin-top:10px;font-size:14px;line-height:1.9}.resume-entry ul{color:var(--muted);margin:9px 0 0;padding-left:15px;font-size:13px;line-height:1.9}.resume-entry li+li{margin-top:4px}.resume-source{color:var(--subtle);overflow-wrap:anywhere;margin-top:10px;font-size:11px;display:inline-block}.resume-skills{margin:0}.resume-skills>div{grid-template-columns:112px minmax(0,1fr);gap:18px;font-size:13px;line-height:1.8;display:grid}.resume-skills>div+div{margin-top:9px}.resume-skills dt{color:var(--subtle);font-size:11px}.resume-skills dd{color:var(--muted);margin:0}.not-found{padding:80px var(--page-pad)}.not-found>.mono{color:var(--subtle)}.not-found h1{letter-spacing:-.04em;margin-block:30px;font-size:clamp(34px,5cqi,64px);font-weight:600;line-height:1.3}.not-found h1 span{color:var(--display-muted)}.not-found>p{color:var(--muted)}.not-found>div{flex-wrap:wrap;gap:30px;margin-top:28px;display:flex}@container site (width>=960px){.home{grid-template-columns:minmax(0,.8fr) minmax(0,1.2fr);grid-template-areas:"hero projects""sponsors sponsors""contact contact";gap:64px clamp(56px,6cqi,112px);padding-top:64px;display:grid}.hero{grid-area:hero;padding:0;display:block}.hero h1{font-size:clamp(54px,5.7cqi,76px);line-height:1.05}.intro{max-width:34ch;margin-top:34px;padding:0;font-size:14px}.intro .text-link{margin-top:18px}.recent-projects{grid-area:projects;align-self:start}.project-row{grid-template-columns:22px minmax(0,1fr) 20px;gap:8px 14px;padding:24px 0}.project-index{grid-area:1/1;align-self:start;padding-top:4px}.project-name{grid-area:1/2}.project-row>p{grid-area:2/2;font-size:13px}.row-arrow{grid-area:1/3;align-self:start;padding-top:4px}.contact{grid-area:contact;margin-top:0}}@container site (width>=1100px){.resume{max-width:1160px;padding-block:56px}.resume-topline{border-bottom:1px solid var(--line);margin-bottom:40px;padding-bottom:20px}.resume-layout{grid-template-columns:248px minmax(0,1fr);align-items:start;gap:64px;display:grid}.resume-heading{border:0;padding:0;display:block}.resume-portrait{width:112px;height:112px;margin-bottom:24px}.resume-heading h1{letter-spacing:-2.6px;font-size:48px}.resume-heading p{margin-top:16px}.resume-links{margin-top:30px}.resume-body{min-width:0}.resume-section{padding:28px 0;display:block}.resume-section:first-child{padding-top:0}.resume-section>h2{color:var(--subtle);margin-bottom:18px;font-size:12px}}@container site (width>=1280px){.home{row-gap:80px;padding-top:80px}.recent-projects{grid-template-columns:repeat(2,minmax(0,1fr));column-gap:32px;display:grid}.section-heading{grid-column:1/-1}.project-row{align-content:start;min-height:200px;padding-block:44px}.project-name h3{font-size:23px}.project-row>p{max-width:29ch}}@container site (width>=1360px){.project-grid{grid-template-columns:repeat(3,minmax(0,1fr))}}@container site (width<=850px){.site-header{gap:32px}.hero{gap:24px;padding-block:60px}.intro{padding-left:0}.project-row{grid-template-columns:22px minmax(0,1.1fr) minmax(0,1.2fr) 18px;gap:12px}.project-card{padding:23px 22px 0}.project-hero{grid-template-columns:minmax(0,1fr) 180px;gap:30px}}@container site (width<=720px){.github-link,.nav-divider{display:none}.site-utilities{gap:12px}.site-nav{gap:24px}}@container site (width<=680px){.project-context{gap:12px}.project-context>span{padding-left:12px}.project-home{padding-bottom:36px}.project-hero{padding-block:36px 32px;display:block}.project-hero h1{font-size:clamp(38px,8cqi,50px)}.project-hero-copy>p{margin-top:18px;font-size:14px}.project-facts{grid-template-columns:repeat(2,minmax(0,1fr));gap:20px;margin-top:32px}.project-body{padding-top:30px;display:block}.project-guide{margin-top:36px}}@container site (width<=620px){.hero{grid-template-columns:minmax(0,1fr);gap:28px;padding-block:48px}.hero h1{letter-spacing:-.055em;font-size:clamp(48px,12.4cqi,70px)}.intro{padding:0;font-size:13px}.intro-name{margin-bottom:7px;font-size:15px}:root[lang=zh-CN] .intro>p:not(.intro-name) br:last-child{display:none}.intro .text-link{margin-top:14px}.project-row{grid-template-columns:22px minmax(0,1fr) 20px;gap:8px 10px;padding:22px 0}.project-index{grid-area:1/1;align-self:start;padding-top:4px}.project-name{grid-area:1/2}.project-row>p{overflow-wrap:anywhere;grid-area:2/2;font-size:12px}.row-arrow{grid-area:1/3;align-self:start;padding-top:4px}.contact{flex-direction:column;align-items:flex-start;gap:28px;margin-top:40px;padding-block:40px}.contact p{font-size:12px}.contact-link{font-size:23px}.catalog{padding-block:40px}.catalog-header{margin-bottom:32px;display:block}.catalog-header>p{margin-top:24px;font-size:13px}.project-grid{grid-template-columns:minmax(0,1fr);gap:16px}.card-title{font-size:26px}.card-description{margin-bottom:24px;font-size:13px}.card-topline{margin-bottom:18px}.resume{padding-block:28px 34px}.resume-topline{margin-bottom:27px}.resume-heading{gap:20px 16px;padding-bottom:27px}.resume-portrait{width:64px;height:64px}.resume-heading h1{letter-spacing:-2.5px;font-size:44px}.resume-heading p{margin-top:10px;font-size:12px}.resume-links{gap:5px}.resume-section{padding-block:25px;display:block}.resume-section>h2{color:var(--subtle);margin-bottom:15px;font-size:11px}:is(.resume-intro,.resume-description){font-size:13px}.resume-entry-heading{gap:6px 12px}.resume-skills>div{display:block}.site-footer{flex-wrap:wrap;align-items:flex-start;gap:12px;padding-block:21px}.footer-right{gap:8px}.footer-dot,.footer-right>a{display:none}}@container site (width<=520px){.site-header{height:auto;padding:20px var(--page-pad) 0;grid-template-columns:minmax(0,1fr) auto;gap:12px 20px;display:grid}.brand{grid-column:1/-1;justify-self:start;font-size:27px}.site-nav{gap:18px;height:48px}.site-nav a{font-size:12px}.site-utilities{justify-self:end;gap:10px;margin:0}.theme-toggle{width:24px;height:44px}}@media (pointer:coarse){:is(.theme-toggle,.language-link){min-width:36px;min-height:44px}:is(.card-stars,.card-links a,.text-link){min-height:44px}}@media (prefers-reduced-motion:reduce){*,:before,:after{scroll-behavior:auto!important;transition:none!important;animation:none!important}}@media print{@page{size:A4;margin:16mm}:root,:root[data-theme]{color-scheme:light}.site-header,.site-footer,.skip-link,.resume-topline{display:none}.site-shell{min-height:0;display:block;container-type:normal}.resume{max-width:none;padding:0}.resume-layout,.resume-body{display:block}.resume-heading{break-inside:avoid;border-bottom:1pt solid #18181b;grid-template-columns:minmax(0,1fr) 24mm;grid-template-areas:"identity portrait""links portrait";align-items:start;gap:3mm 8mm;padding:0 0 6mm;display:grid}.resume-portrait{border-radius:2mm;width:24mm;height:24mm;margin:0}.resume-heading h1{letter-spacing:-1.5pt;font-size:30pt}.resume-heading p{margin-top:3mm;font-size:10pt}.resume-heading .resume-location{margin-top:2mm;font-size:9pt}.resume-links{flex-flow:wrap;gap:1mm 4mm;margin:0;padding:0;font-size:9pt}.resume-section{border:0;padding:3mm 0;display:block}.resume-section>h2{color:#18181b;break-after:avoid;margin-bottom:2.5mm;font-size:10pt;font-weight:650}.resume-entry{break-inside:avoid}.resume-entry+.resume-entry{margin-top:4mm}.resume-entry-heading h3{letter-spacing:0;font-size:11pt}.resume-period,.resume-role,.resume-source{font-size:9pt}.resume-role{margin-top:1mm}.resume-intro,.resume-description,.resume-entry ul,.resume-skills>div{color:#333;font-size:10pt;line-height:1.4}.resume-description,.resume-entry ul{margin-top:1.5mm}.resume-entry li+li{margin-top:1mm}.resume-source{margin-top:1.5mm}.resume-skills{break-inside:avoid}.resume-projects{break-before:page;padding-top:0}.resume-skills>div{break-inside:avoid;grid-template-columns:30mm minmax(0,1fr);gap:4mm;display:grid}.resume-skills>div+div{margin-top:2mm}.resume-skills dt{font-size:9pt}.resume svg,.resume-heading h1>span{display:none}.resume p,.resume li{orphans:3;widows:3}}
