@font-face{font-family:Inter Variable;font-style:normal;font-display:swap;font-weight:100 900;src:url(/_astro/inter-cyrillic-ext-wght-normal.BOeWTOD4.woff2) format("woff2-variations");unicode-range:U+0460-052F,U+1C80-1C8A,U+20B4,U+2DE0-2DFF,U+A640-A69F,U+FE2E-FE2F}@font-face{font-family:Inter Variable;font-style:normal;font-display:swap;font-weight:100 900;src:url(/_astro/inter-cyrillic-wght-normal.DqGufNeO.woff2) format("woff2-variations");unicode-range:U+0301,U+0400-045F,U+0490-0491,U+04B0-04B1,U+2116}@font-face{font-family:Inter Variable;font-style:normal;font-display:swap;font-weight:100 900;src:url(/_astro/inter-greek-ext-wght-normal.DlzME5K_.woff2) format("woff2-variations");unicode-range:U+1F00-1FFF}@font-face{font-family:Inter Variable;font-style:normal;font-display:swap;font-weight:100 900;src:url(/_astro/inter-greek-wght-normal.CkhJZR-_.woff2) format("woff2-variations");unicode-range:U+0370-0377,U+037A-037F,U+0384-038A,U+038C,U+038E-03A1,U+03A3-03FF}@font-face{font-family:Inter Variable;font-style:normal;font-display:swap;font-weight:100 900;src:url(/_astro/inter-vietnamese-wght-normal.CBcvBZtf.woff2) format("woff2-variations");unicode-range:U+0102-0103,U+0110-0111,U+0128-0129,U+0168-0169,U+01A0-01A1,U+01AF-01B0,U+0300-0301,U+0303-0304,U+0308-0309,U+0323,U+0329,U+1EA0-1EF9,U+20AB}@font-face{font-family:Inter Variable;font-style:normal;font-display:swap;font-weight:100 900;src:url(/_astro/inter-latin-ext-wght-normal.DO1Apj_S.woff2) format("woff2-variations");unicode-range:U+0100-02BA,U+02BD-02C5,U+02C7-02CC,U+02CE-02D7,U+02DD-02FF,U+0304,U+0308,U+0329,U+1D00-1DBF,U+1E00-1E9F,U+1EF2-1EFF,U+2020,U+20A0-20AB,U+20AD-20C0,U+2113,U+2C60-2C7F,U+A720-A7FF}@font-face{font-family:Inter Variable;font-style:normal;font-display:swap;font-weight:100 900;src:url(/_astro/inter-latin-wght-normal.Dx4kXJAl.woff2) format("woff2-variations");unicode-range:U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+0304,U+0308,U+0329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}:root{--color-text: #37352f;--color-text-secondary: #73726e;--color-text-tertiary: #9b9a97;--color-bg: #fdfdfc;--color-bg-secondary: #f7f6f3;--color-bg-hover: #e9e8e5;--color-border: rgba(55, 53, 47, .09);--color-border-strong: rgba(55, 53, 47, .16);--color-link: #37352f;--color-selection: var(--color-bg-hover)}@media(prefers-color-scheme:dark){:root{--color-text: rgba(255, 255, 255, .81);--color-text-secondary: rgba(255, 255, 255, .54);--color-text-tertiary: rgba(255, 255, 255, .38);--color-bg: #191919;--color-bg-secondary: #202020;--color-bg-hover: #2f2f2f;--color-border: rgba(255, 255, 255, .094);--color-border-strong: rgba(255, 255, 255, .16);--color-link: rgba(255, 255, 255, .81);--color-selection: rgba(255, 255, 255, .12)}}:root{--font-sans: "Inter Variable", -apple-system, BlinkMacSystemFont, "Segoe UI", "PingFang SC", "Microsoft YaHei", sans-serif;--font-mono: ui-monospace, SFMono-Regular, "SF Mono", Menlo, Consolas, "Liberation Mono", monospace;--space-xs: 4px;--space-sm: 8px;--space-md: 12px;--space-lg: 16px;--space-xl: 24px;--space-2xl: 32px;--space-3xl: 48px;--space-section: 48px;--radius-sm: 3px;--radius-md: 4px;--radius-lg: 6px;--text-body: 1rem;--text-secondary: .9375rem;--weight-regular: 400;--weight-medium: 500;--max-width: 768px}::selection{background-color:var(--color-selection);color:inherit}*,*:before,*:after{box-sizing:border-box;margin:0;padding:0}html{font-size:16px;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}body{font-family:var(--font-sans);font-size:var(--text-body);font-weight:var(--weight-regular);line-height:1.5;color:var(--color-text);background-color:var(--color-bg)}:lang(zh) p,:lang(zh) .project-list li{line-height:1.65}main{max-width:var(--max-width);margin:0 auto;padding:80px var(--space-xl) var(--space-section)}article{display:flex;flex-direction:column}article>*+*{margin-top:var(--space-section)}.section{display:flex;flex-direction:column}.section h2{margin-bottom:var(--space-lg)}h1{font-size:var(--text-body);font-weight:var(--weight-medium);line-height:1.5;color:var(--color-text);text-wrap:balance}h2{font-size:var(--text-body);font-weight:var(--weight-regular);line-height:1.5;color:var(--color-text-secondary);text-wrap:balance}p{font-size:var(--text-body);line-height:1.5;color:var(--color-text);text-wrap:pretty}@media(prefers-color-scheme:dark){p{line-height:1.55}}a{color:var(--color-link);text-decoration:underline;text-decoration-thickness:1px;text-decoration-color:var(--color-border-strong);text-underline-offset:3px;transition:color .1s ease,text-decoration-color .1s ease}a:hover{color:var(--color-link);text-decoration-color:currentColor}.hero{display:flex;flex-direction:column;gap:6px}.hero-profile{display:flex;align-items:center;gap:6px}.hero-profile img{display:block;width:var(--text-body);height:var(--text-body);flex:0 0 var(--text-body);border-radius:0;object-fit:cover}.hero-intro{display:flex;flex-direction:column;gap:var(--space-lg);margin-top:var(--space-xl)}ul{list-style:none}.projects-list{display:flex;flex-direction:column}@media(hover:hover){.contact-list:has(a:hover,button:hover)>li>:not(:hover){opacity:.35}}@media(max-width:640px){main{padding:40px var(--space-lg) var(--space-2xl)}article>*+*{margin-top:var(--space-3xl)}}.language-switcher[data-astro-cid-a2mxz4y6]{align-self:flex-start;display:inline-flex;align-items:center;gap:4px;font-size:var(--text-secondary);line-height:1.4;color:var(--color-text-secondary);text-decoration:none}.language-switcher[data-astro-cid-a2mxz4y6]:hover{color:var(--color-text)}.language-switcher[data-astro-cid-a2mxz4y6]:focus-visible{outline:2px solid var(--color-text);outline-offset:3px;border-radius:2px}.language-switcher-arrow[data-astro-cid-a2mxz4y6]{transition:transform .16s cubic-bezier(.16,1,.3,1)}.language-switcher[data-astro-cid-a2mxz4y6]:hover .language-switcher-arrow[data-astro-cid-a2mxz4y6]{transform:translate(2px)}.project-mark[data-astro-cid-23nvkkbm]{display:inline-flex;align-items:center;justify-content:center;flex:0 0 auto;color:var(--color-text)}img[data-astro-cid-23nvkkbm]{display:block;object-fit:contain}.project-groups[data-astro-cid-d4mtjuvi]{padding-block:var(--space-lg)}.project-group[data-astro-cid-d4mtjuvi]{display:grid;grid-template-columns:108px minmax(0,1fr);font-size:var(--text-secondary);line-height:1.2;border-top:1px solid var(--color-border)}.project-group[data-astro-cid-d4mtjuvi] h3[data-astro-cid-d4mtjuvi]{padding-top:12px;color:var(--color-text-secondary);font-size:inherit;font-weight:var(--weight-regular);line-height:inherit}.project-group[data-astro-cid-d4mtjuvi] li[data-astro-cid-d4mtjuvi]+li[data-astro-cid-d4mtjuvi]{border-top:1px solid var(--color-border)}.project-link[data-astro-cid-d4mtjuvi]{display:flex;align-items:baseline;justify-content:space-between;gap:12px;padding:12px 0;line-height:1.2;color:var(--color-text);text-decoration:none}.project-name[data-astro-cid-d4mtjuvi]{display:inline-flex;align-items:center;gap:6px;min-width:0}.mark[data-astro-cid-d4mtjuvi]{display:inline-flex;flex:0 0 15px;color:var(--color-text-secondary)}.tags[data-astro-cid-d4mtjuvi]{display:flex;flex-wrap:wrap;justify-content:flex-end;column-gap:10px;color:var(--color-text-secondary);text-align:right}.project-name[data-astro-cid-d4mtjuvi],.tags[data-astro-cid-d4mtjuvi]{transition:opacity .18s ease}@media(hover:hover){.project-groups[data-astro-cid-d4mtjuvi]:has(.project-link:hover) .project-link[data-astro-cid-d4mtjuvi]:not(:hover) .project-name[data-astro-cid-d4mtjuvi],.project-groups[data-astro-cid-d4mtjuvi]:has(.project-link:hover) .project-link[data-astro-cid-d4mtjuvi]:not(:hover) .tags[data-astro-cid-d4mtjuvi]{opacity:.3}}@media(prefers-reduced-motion:reduce){.project-name[data-astro-cid-d4mtjuvi],.tags[data-astro-cid-d4mtjuvi]{transition:none}}.project-link[data-astro-cid-d4mtjuvi]:focus-visible{outline:2px solid var(--color-text);outline-offset:3px}@media(max-width:480px){.project-group[data-astro-cid-d4mtjuvi]{grid-template-columns:84px minmax(0,1fr)}.project-link[data-astro-cid-d4mtjuvi]{align-items:flex-start;flex-direction:column;gap:4px}.project-name[data-astro-cid-d4mtjuvi]{overflow-wrap:anywhere}.tags[data-astro-cid-d4mtjuvi]{align-self:flex-end}}.contact-list[data-astro-cid-xmivup5a]{display:flex;flex-wrap:wrap;align-items:center;gap:2px 0;margin:64px -11px 0;list-style:none}.contact-link[data-astro-cid-xmivup5a]{display:inline-flex;align-items:center;gap:7px;padding:5px 11px;border:0;background:none;font:inherit;font-size:var(--text-body);font-weight:var(--weight-regular);line-height:1.4;color:var(--color-text);text-decoration:none;cursor:pointer;transition:opacity .2s cubic-bezier(.16,1,.3,1)}.contact-icon[data-astro-cid-xmivup5a]{display:inline-grid;place-items:center;flex:0 0 auto;color:var(--color-text-secondary);transition:color .2s cubic-bezier(.16,1,.3,1)}.contact-icon[data-astro-cid-xmivup5a]>span[data-astro-cid-xmivup5a]{display:flex;grid-area:1 / 1;transition:opacity .18s ease}.contact-icon[data-astro-cid-xmivup5a]>.mark-done[data-astro-cid-xmivup5a]{opacity:0}.contact-link[data-astro-cid-xmivup5a]:hover .contact-icon[data-astro-cid-xmivup5a]{color:var(--color-text)}.contact-link[data-astro-cid-xmivup5a]:focus-visible{outline:2px solid var(--color-text);outline-offset:3px;border-radius:2px}.copy-contact[data-astro-cid-xmivup5a]{position:relative}.copy-contact[data-astro-cid-xmivup5a]:after{position:absolute;bottom:calc(100% + 4px);left:50%;content:attr(data-feedback);color:var(--color-text-secondary);font-size:.875rem;white-space:nowrap;opacity:0;transform:translate(-50%);pointer-events:none;transition:opacity .18s ease}.copy-contact[data-astro-cid-xmivup5a][data-state]:after{opacity:1}.copy-contact[data-astro-cid-xmivup5a][data-state=copied]>.contact-icon[data-astro-cid-xmivup5a]>.mark-platform[data-astro-cid-xmivup5a]{opacity:0}.copy-contact[data-astro-cid-xmivup5a][data-state=copied]>.contact-icon[data-astro-cid-xmivup5a]>.mark-done[data-astro-cid-xmivup5a]{opacity:1}@media(prefers-reduced-motion:reduce){.copy-contact[data-astro-cid-xmivup5a]:after{transition:none}}@media(pointer:coarse){.contact-link[data-astro-cid-xmivup5a]{min-height:40px}}.copy-status[data-astro-cid-xmivup5a]{position:absolute;width:1px;height:1px;overflow:hidden;clip-path:inset(50%);white-space:nowrap}
