@font-face{font-family:Bricolage Grotesque Variable;font-style:normal;font-display:swap;font-weight:200 800;src:url(/_astro/bricolage-grotesque-vietnamese-wght-normal.BUzh504Q.woff2)format("woff2-variations");unicode-range:U+102-103,U+110-111,U+128-129,U+168-169,U+1A0-1A1,U+1AF-1B0,U+300-301,U+303-304,U+308-309,U+323,U+329,U+1EA0-1EF9,U+20AB}@font-face{font-family:Bricolage Grotesque Variable;font-style:normal;font-display:swap;font-weight:200 800;src:url(/_astro/bricolage-grotesque-latin-ext-wght-normal.CcLUaPy7.woff2)format("woff2-variations");unicode-range:U+100-2BA,U+2BD-2C5,U+2C7-2CC,U+2CE-2D7,U+2DD-2FF,U+304,U+308,U+329,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:Bricolage Grotesque Variable;font-style:normal;font-display:swap;font-weight:200 800;src:url(/_astro/bricolage-grotesque-latin-wght-normal.DLoelf7F.woff2)format("woff2-variations");unicode-range:U+??,U+131,U+152-153,U+2BB-2BC,U+2C6,U+2DA,U+2DC,U+304,U+308,U+329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}@font-face{font-family:Geist Variable;font-style:normal;font-display:swap;font-weight:100 900;src:url(/_astro/geist-cyrillic-ext-wght-normal.DjL33-gN.woff2)format("woff2-variations");unicode-range:U+460-52F,U+1C80-1C8A,U+20B4,U+2DE0-2DFF,U+A640-A69F,U+FE2E-FE2F}@font-face{font-family:Geist Variable;font-style:normal;font-display:swap;font-weight:100 900;src:url(/_astro/geist-cyrillic-wght-normal.BEAKL7Jp.woff2)format("woff2-variations");unicode-range:U+301,U+400-45F,U+490-491,U+4B0-4B1,U+2116}@font-face{font-family:Geist Variable;font-style:normal;font-display:swap;font-weight:100 900;src:url(/_astro/geist-vietnamese-wght-normal.6IgcOCM7.woff2)format("woff2-variations");unicode-range:U+102-103,U+110-111,U+128-129,U+168-169,U+1A0-1A1,U+1AF-1B0,U+300-301,U+303-304,U+308-309,U+323,U+329,U+1EA0-1EF9,U+20AB}@font-face{font-family:Geist Variable;font-style:normal;font-display:swap;font-weight:100 900;src:url(/_astro/geist-latin-ext-wght-normal.DC-KSUi6.woff2)format("woff2-variations");unicode-range:U+100-2BA,U+2BD-2C5,U+2C7-2CC,U+2CE-2D7,U+2DD-2FF,U+304,U+308,U+329,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:Geist Variable;font-style:normal;font-display:swap;font-weight:100 900;src:url(/_astro/geist-latin-wght-normal.BgDaEnEv.woff2)format("woff2-variations");unicode-range:U+??,U+131,U+152-153,U+2BB-2BC,U+2C6,U+2DA,U+2DC,U+304,U+308,U+329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}.astro-route-announcer{clip:rect(0 0 0 0);clip-path:inset(50%);white-space:nowrap;width:1px;height:1px;position:absolute;top:0;left:0;overflow:hidden}.site-footer[data-astro-cid-jo6i4kqk]{border-top:1px solid var(--color-border);z-index:var(--z-content);width:100%;margin-top:auto;position:relative}.footer-inner[data-astro-cid-jo6i4kqk]{padding-block:1.5rem 3rem}.footer-row[data-astro-cid-jo6i4kqk]{justify-content:space-between;align-items:center;gap:var(--gap-wrap);flex-wrap:wrap;display:flex}.footer-row[data-astro-cid-jo6i4kqk] p[data-astro-cid-jo6i4kqk]{color:var(--color-muted-foreground);font-size:var(--text-sm);margin:0}.footer-links[data-astro-cid-jo6i4kqk]{gap:var(--gap-wrap);flex-wrap:wrap;display:flex}.footer-link[data-astro-cid-jo6i4kqk]{color:var(--color-muted-foreground);font-size:var(--text-sm);transition:color var(--transition-base);font-weight:500;text-decoration:none}.footer-link[data-astro-cid-jo6i4kqk]:hover{color:var(--color-text)}.ext-arrow[data-astro-cid-jo6i4kqk]{transition:transform var(--transition-lift);display:inline-block}a[data-astro-cid-jo6i4kqk]:hover .ext-arrow[data-astro-cid-jo6i4kqk]{transform:translate(2px,-2px)}@media print{.site-footer[data-astro-cid-jo6i4kqk]{border-color:#ccc}}@font-face{font-family:IBM Plex Mono;src:url(/fonts/IBMPlexMono-Regular.woff2)format("woff2");font-weight:400;font-style:normal;font-display:swap}:root{font-synthesis:none;--font-sans:"Geist Variable", ui-sans-serif, system-ui, sans-serif;--font-display:"Bricolage Grotesque Variable", ui-sans-serif, system-ui, sans-serif;--font-mono:"IBM Plex Mono", ui-monospace, "Cascadia Code", "Source Code Pro", Menlo, Consolas, "DejaVu Sans Mono", monospace;--color-bg:oklch(20.8% 0 0);--color-card:oklch(24.5% 0 0);--color-text:oklch(92% 0 0);--color-ink:oklch(26% 0 0);--color-pink:oklch(83.9% .069 3);--color-background:var(--color-bg);--color-foreground:var(--color-text);--color-muted-foreground:oklch(66% 0 0);--color-border:oklch(100% 0 0/.1);--color-surface:oklch(100% 0 0/.06);--color-surface-strong:oklch(100% 0 0/.08);--color-text-muted:oklch(92% 0 0/.8);--glow-primary:oklch(from var(--color-pink) l c h / .6);--glow-pink:oklch(from var(--color-pink) l c h / .4);--ring:oklch(100% 0 0/.08);--ring-hover:oklch(100% 0 0/.15);--step--1:clamp(.875rem, .8519rem + .1127vw, .9375rem);--step-0:clamp(1rem, .9538rem + .2255vw, 1.125rem);--step-1:clamp(1.125rem, 1.0418rem + .4059vw, 1.35rem);--step-2:clamp(1.2656rem, 1.1346rem + .6392vw, 1.62rem);--step-3:clamp(1.4238rem, 1.2309rem + .941vw, 1.944rem);--text-xs:clamp(.8125rem, .7894rem + .1127vw, .875rem);--text-sm:var(--step--1);--text-base:var(--step-0);--text-lg:var(--step-1);--text-xl:var(--step-2);--text-2xl:var(--step-3);--text-hero:clamp(2.5rem, 2.5rem + 2vw, 3.75rem);--text-page:clamp(1.75rem, 1.2877rem + 2.255vw, 3rem);--heading-1:var(--text-page);--hero-size:var(--text-hero);--leading-text:calc(.65rem + 1em);--leading-heading:calc(.35rem + 1em);--leading-none:1;--space-3xs:clamp(.25rem, .2269rem + .1127vw, .3125rem);--space-2xs:clamp(.5rem, .4769rem + .1127vw, .5625rem);--space-xs:clamp(.75rem, .7038rem + .2255vw, .875rem);--space-s:clamp(1rem, .9538rem + .2255vw, 1.125rem);--space-m:clamp(1.5rem, 1.4307rem + .3382vw, 1.6875rem);--space-l:clamp(2rem, 1.9076rem + .451vw, 2.25rem);--space-xl:clamp(3rem, 2.8613rem + .6764vw, 3.375rem);--space-2xl:clamp(4rem, 3.8151rem + .9019vw, 4.5rem);--page-inline:clamp(1.25rem, 5vw, 2.5rem);--page-block-start:clamp(4rem, 3.2rem + 3vw, 6.25rem);--page-block-end:var(--space-2xl);--title-subtitle-gap:var(--space-2xs);--section-gap:var(--space-m);--content-gap:var(--space-l);--measure:40rem;--container:64rem;--border-width:1px;--radius-card:1rem;--radius-pill:999px;--gap-icon:.4rem;--gap-wrap:.5rem 1.5rem;--letter-spacing-tight:-.01em;--letter-spacing-heading:-.015em;--letter-spacing-display:-.02em;--transition-base:.15s ease;--transition-lift:.2s ease;--duration-breathe:22s;--z-content:1;--z-skip-link:50;color-scheme:dark}html{box-sizing:border-box;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;scrollbar-color:var(--color-muted-foreground) var(--color-bg);text-rendering:optimizelegibility}*,:before,:after{box-sizing:inherit}body,h1,h2,h3,h4,h5,h6,p,figure,blockquote,dl,dd{margin:0}body{font-family:var(--font-sans);background-color:var(--color-bg);color:var(--color-text);line-height:var(--leading-text);font-size:var(--text-base)}h1,h2,h3,h4,h5,h6{text-wrap:balance;line-height:var(--leading-heading);text-align:left;font-weight:500}p{text-wrap:pretty;text-align:left}p,h1,h2,h3,h4,h5,h6{overflow-wrap:break-word}a{color:inherit;text-decoration:none}button,a{touch-action:manipulation}::selection{color:inherit;background:oklch(100% 0 0/.22)}h1,h2,h3,h4,h5,h6{font-family:var(--font-display);letter-spacing:var(--letter-spacing-tight);font-weight:600}@keyframes rise{0%{opacity:0;transform:translateY(10px)}to{opacity:1;transform:translateY(0)}}.rise{animation:.56s cubic-bezier(.22,.61,.36,1) backwards rise;animation-delay:var(--d,0s)}.eyebrow{color:var(--color-muted-foreground);font-family:var(--font-mono);font-size:var(--text-xs);letter-spacing:.08em;font-weight:500;line-height:var(--leading-none)}.period{color:var(--color-pink);display:inline-block;position:relative}.period:after{content:".";color:var(--color-pink);text-shadow:0 0 18px var(--glow-primary), 0 0 36px var(--glow-pink);pointer-events:none;animation:glow-breathe var(--duration-breathe) ease-in-out infinite alternate;position:absolute;inset:0}@keyframes glow-breathe{0%{opacity:.75}to{opacity:1}}.arrow{transition:transform var(--transition-lift);display:inline-block}.hero-title{font-size:var(--text-hero)}.page-description{color:var(--color-muted-foreground);max-width:34rem}.section-header{align-items:baseline;gap:var(--space-2xs) var(--space-s);margin-bottom:var(--space-xs);flex-wrap:wrap;justify-content:space-between;display:flex}.section-title{letter-spacing:var(--letter-spacing-tight);font-size:clamp(1.4rem,3vw,1.75rem);font-weight:600}.section-link{color:var(--color-muted-foreground);font-size:var(--text-sm);align-items:center;gap:var(--gap-icon);transition:color var(--transition-base);font-weight:500;display:inline-flex}.section-link:hover{color:var(--color-text)}.section-link:hover .arrow{transform:translate(3px)}.content-list{gap:var(--space-s);margin:0;padding:0;list-style:none;display:grid}.skill-card{gap:var(--space-2xs);background:var(--color-card);border:1px solid var(--ring);border-radius:var(--radius-card);transition:transform var(--transition-lift), border-color var(--transition-lift);flex-direction:column;padding:clamp(1.1rem,2.5vw,1.5rem);display:flex}@media (hover:hover) and (pointer:fine){.skill-card:hover{border-color:var(--ring-hover);transform:translateY(-2px)}.skill-card:hover .arrow{transform:translate(3px)}}.skill-card-title{color:var(--color-text);font-family:var(--font-display);letter-spacing:var(--letter-spacing-tight);font-size:1.2rem;font-weight:650;line-height:calc(.45rem + 1em)}.skill-card-description{color:var(--color-muted-foreground);font-size:var(--text-sm);line-height:1.6}.skill-card-foot{align-items:center;gap:var(--gap-icon);margin-top:var(--space-3xs);color:var(--color-muted-foreground);font-size:var(--text-sm);font-weight:500;display:inline-flex}.code-block-shell{background:var(--color-surface);border:1px solid var(--ring);border-radius:var(--radius-card);align-items:center;gap:var(--space-2xs);padding:var(--space-xs) var(--space-s);display:flex}.command-code{color:var(--color-text);font-family:var(--font-mono);font-size:var(--text-sm);white-space:nowrap;flex:1;overflow-x:auto}.copy-button{color:var(--color-muted-foreground);cursor:pointer;align-items:center;gap:var(--gap-icon);min-width:2.75rem;min-height:2.75rem;padding:var(--space-3xs);transition:color var(--transition-base);background:0 0;border:0;border-radius:.5rem;flex-shrink:0;justify-content:center;display:inline-flex}.copy-button:hover{color:var(--color-text)}.copy-label{font-family:var(--font-mono);font-size:var(--text-xs);letter-spacing:.02em;font-weight:500}.copy-status{color:var(--color-muted-foreground);font-size:var(--text-xs);white-space:nowrap}.hidden{display:none}.text-link{color:var(--color-text);text-underline-offset:3px;transition:text-decoration-color var(--transition-base);font-weight:500;text-decoration-line:underline;text-decoration-color:oklch(100% 0 0/.35);text-decoration-thickness:1px}.text-link:hover{text-decoration-color:oklch(100% 0 0/.9)}.back-link{color:var(--color-muted-foreground);align-items:center;gap:var(--gap-icon);transition:color var(--transition-base);font-weight:500;display:inline-flex}.back-link:hover{color:var(--color-text)}.back-link:hover .arrow{transform:translate(-3px)}.prose{color:var(--color-text);font-size:var(--text-base);line-height:var(--leading-text);max-width:70ch}.prose :where(p,ul,ol,blockquote,pre):not(:where(.not-prose,.not-prose *)){margin-block:var(--space-s)}.prose :where(h1,h2,h3,h4,h5,h6):not(:where(.not-prose,.not-prose *)){margin-top:var(--space-xl);margin-bottom:var(--space-s);font-weight:500}.prose :where(h2):not(:where(.not-prose,.not-prose *)){font-size:var(--text-2xl)}.prose :where(h3):not(:where(.not-prose,.not-prose *)){margin-top:var(--space-l);font-size:var(--text-xl)}.prose :where(h4):not(:where(.not-prose,.not-prose *)){margin-top:var(--space-l);margin-bottom:var(--space-2xs);font-size:var(--text-lg)}.prose :where(h5,h6):not(:where(.not-prose,.not-prose *)){margin-top:var(--space-m);margin-bottom:var(--space-2xs);font-weight:500}.prose :where(p,li):not(:where(.not-prose,.not-prose *)){color:var(--color-muted-foreground)}.prose :where(a):not(:where(.not-prose,.not-prose *)){color:var(--color-text);text-underline-offset:3px;transition:text-decoration-color var(--transition-base);overflow-wrap:break-word;font-weight:500;text-decoration-line:underline;text-decoration-color:oklch(100% 0 0/.35);text-decoration-thickness:1px}.prose :where(a:hover):not(:where(.not-prose,.not-prose *)){text-decoration-color:oklch(100% 0 0/.9)}.prose :where(strong):not(:where(.not-prose,.not-prose *)){color:var(--color-text);font-weight:500}.prose :where(ul):not(:where(.not-prose,.not-prose *)){margin-left:var(--space-s);list-style-type:disc}.prose :where(ol):not(:where(.not-prose,.not-prose *)){margin-left:var(--space-s);list-style-type:decimal}.prose :where(ul>li,ol>li):not(:where(.not-prose,.not-prose *)){margin-top:var(--space-2xs);padding-left:var(--space-2xs)}.prose :where(ul ul,ol ol,ul ol,ol ul):not(:where(.not-prose,.not-prose *)){margin-top:var(--space-2xs);margin-bottom:var(--space-2xs)}.prose :where(blockquote):not(:where(.not-prose,.not-prose *)){padding-left:var(--space-s);border-left:3px solid var(--color-border);font-style:normal}.prose :where(blockquote>*):not(:where(.not-prose,.not-prose *)){color:inherit}.prose :where(hr):not(:where(.not-prose,.not-prose *)){border:0;border-top:var(--border-width) solid var(--color-border);margin-block:var(--space-m)}.prose :where(code):not(:where(.not-prose,.not-prose *)){background:var(--color-surface);color:var(--color-text);font-family:var(--font-mono);font-size:var(--text-sm);overflow-wrap:break-word;padding:.15em .35em;font-weight:500}.prose :where(pre):not(:where(.not-prose,.not-prose *)){background:var(--color-surface);max-height:min(68vh,1000px);padding:var(--space-s);overflow:auto}.prose :where(pre code):not(:where(.not-prose,.not-prose *)){background:0 0;padding:0}.prose :where(table):not(:where(.not-prose,.not-prose *)){margin:var(--space-s) auto;max-width:fit-content;font-size:var(--text-sm);display:block;overflow-x:auto}.prose :where(thead):not(:where(.not-prose,.not-prose *)){border-bottom:var(--border-width) solid var(--color-border)}.prose :where(th):not(:where(.not-prose,.not-prose *)){padding:var(--space-2xs) var(--space-s);text-align:left;color:var(--color-text);font-weight:500}.prose :where(tr):not(:where(.not-prose,.not-prose *)){border-top:var(--border-width) solid var(--color-border)}.prose :where(tr:first-child):not(:where(.not-prose,.not-prose *)){border-top:none}.prose :where(td):not(:where(.not-prose,.not-prose *)){padding:var(--space-2xs) var(--space-s);text-align:left;vertical-align:top;color:var(--color-muted-foreground);overflow-wrap:break-word}.prose :where(:first-child):not(:where(.not-prose,.not-prose *)){margin-top:0}@media (forced-colors:active){:focus-visible{outline-offset:2px;outline:2px solid highlight}.code-block-shell,.prose pre,.skill-card{border:1px solid buttonborder}}@media print{:root{color-scheme:light}body{color:#000;background:#fff}.code-block-shell,.prose pre{border-color:#ccc}}@media (prefers-reduced-motion:reduce){*,:before,:after{transition-duration:.01ms;animation-duration:.01ms;animation-iteration-count:1}.rise,.period:after{animation:none}}.site-topbar[data-astro-cid-tq46r5sz],.site-footer[data-astro-cid-tq46r5sz]{z-index:var(--z-content);width:100%;position:relative}.topbar-inner[data-astro-cid-tq46r5sz]{max-width:var(--container);padding-inline:var(--page-inline);margin-inline:auto}.site-topbar[data-astro-cid-tq46r5sz]{align-items:center;padding-block:1.5rem .25rem;display:flex}.site-topbar[data-astro-cid-tq46r5sz] .topbar-inner[data-astro-cid-tq46r5sz]{flex-wrap:wrap;justify-content:space-between;align-items:center;gap:.75rem 1.75rem;width:100%;display:flex}.brand[data-astro-cid-tq46r5sz]{font-family:var(--font-display);font-weight:700;font-size:var(--text-base);letter-spacing:var(--letter-spacing-tight);color:var(--color-muted-foreground);transition:color var(--transition-base);text-decoration:none}.brand[data-astro-cid-tq46r5sz]:hover{color:var(--color-text)}.topnav[data-astro-cid-tq46r5sz]{gap:var(--gap-wrap);flex-wrap:wrap;display:flex}.topnav[data-astro-cid-tq46r5sz] a[data-astro-cid-tq46r5sz]{color:var(--color-muted-foreground);font-size:var(--text-sm);transition:color var(--transition-base)}.topnav[data-astro-cid-tq46r5sz] a[data-astro-cid-tq46r5sz]:hover{color:var(--color-text)}.ext-arrow[data-astro-cid-tq46r5sz]{transition:transform var(--transition-lift);display:inline-block}a[data-astro-cid-tq46r5sz]:hover .ext-arrow[data-astro-cid-tq46r5sz]{transform:translate(2px,-2px)}.skip-link[data-astro-cid-tq46r5sz]{clip:rect(0, 0, 0, 0);white-space:nowrap;border-width:0;width:1px;height:1px;margin:-1px;padding:0;position:absolute;overflow:hidden}.skip-link[data-astro-cid-tq46r5sz]:focus{top:var(--space-s);left:var(--space-s);z-index:var(--z-skip-link);width:auto;height:auto;padding:var(--space-xs) var(--space-s);clip:auto;white-space:normal;color:var(--color-ink);background-color:oklch(100% 0 0);margin:0;font-weight:500;position:fixed;overflow:visible}main[data-astro-cid-tq46r5sz]{z-index:var(--z-content);flex-direction:column;flex-grow:1;width:100%;display:flex;position:relative}
