/*! tailwindcss v4.3.3 | MIT License | https://tailwindcss.com */
@layer properties{@supports (((-webkit-hyphens:none)) and (not (margin-trim:inline))) or ((-moz-orient:inline) and (not (color:rgb(from red r g b)))){*,:before,:after,::backdrop{--tw-rotate-x:initial;--tw-rotate-y:initial;--tw-rotate-z:initial;--tw-skew-x:initial;--tw-skew-y:initial}}}@layer theme{:root,:host{--font-sans:-apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", "Noto Sans", Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";--font-mono:ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace;--default-font-family:var(--font-sans);--default-mono-font-family:var(--font-mono);--font-reading:"Mona Sans Variable", ui-sans-serif, system-ui, sans-serif;--font-ui:var(--font-reading);--font-code:"Cascadia Code", ui-monospace, monospace}}@layer base{*,:after,:before,::backdrop{box-sizing:border-box;border:0 solid;margin:0;padding:0}::file-selector-button{box-sizing:border-box;border:0 solid;margin:0;padding:0}html,:host{-webkit-text-size-adjust:100%;tab-size:4;line-height:1.5;font-family:var(--default-font-family,-apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", "Noto Sans", Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji");font-feature-settings:var(--default-font-feature-settings,normal);font-variation-settings:var(--default-font-variation-settings,normal);-webkit-tap-highlight-color:transparent}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;-webkit-text-decoration:inherit;-webkit-text-decoration:inherit;-webkit-text-decoration:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,samp,pre{font-family:var(--default-mono-font-family,ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace);font-feature-settings:var(--default-mono-font-feature-settings,normal);font-variation-settings:var(--default-mono-font-variation-settings,normal);font-size:1em}small{font-size:80%}sub,sup{vertical-align:baseline;font-size:75%;line-height:0;position:relative}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}:-moz-focusring:where(:not(iframe)){outline:auto}progress{vertical-align:baseline}summary{display:list-item}ol,ul,menu{list-style:none}img,svg,video,canvas,audio,iframe,embed,object{vertical-align:middle;display:block}img,video{max-width:100%;height:auto}button,input,select,optgroup,textarea{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}::file-selector-button{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}:where(select:is([multiple],[size])) optgroup{font-weight:bolder}:where(select:is([multiple],[size])) optgroup option{padding-inline-start:20px}::file-selector-button{margin-inline-end:4px}::placeholder{opacity:1}@supports (not ((-webkit-appearance:-apple-pay-button))) or (contain-intrinsic-size:1px){::placeholder{color:currentColor}@supports (color:color-mix(in lab, red, red)){::placeholder{color:color-mix(in oklab, currentcolor 50%, transparent)}}}textarea{resize:vertical}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-date-and-time-value{min-height:1lh;text-align:inherit}::-webkit-datetime-edit{display:inline-flex}::-webkit-datetime-edit-fields-wrapper{padding:0}::-webkit-datetime-edit{padding-block:0}::-webkit-datetime-edit-year-field{padding-block:0}::-webkit-datetime-edit-month-field{padding-block:0}::-webkit-datetime-edit-day-field{padding-block:0}::-webkit-datetime-edit-hour-field{padding-block:0}::-webkit-datetime-edit-minute-field{padding-block:0}::-webkit-datetime-edit-second-field{padding-block:0}::-webkit-datetime-edit-millisecond-field{padding-block:0}::-webkit-datetime-edit-meridiem-field{padding-block:0}::-webkit-calendar-picker-indicator{line-height:1}:-moz-ui-invalid{box-shadow:none}button,input:where([type=button],[type=reset],[type=submit]){appearance:button}::file-selector-button{appearance:button}::-webkit-inner-spin-button{height:auto}::-webkit-outer-spin-button{height:auto}[hidden]:where(:not([hidden=until-found])){display:none!important}}@layer components;@layer utilities{.contents{display:contents}.hidden{display:none}.transform{transform:var(--tw-rotate-x,) var(--tw-rotate-y,) var(--tw-rotate-z,) var(--tw-skew-x,) var(--tw-skew-y,)}}@font-face{font-family:Mona Sans Variable;font-style:normal;font-display:swap;font-weight:200 900;font-stretch:75% 125%;src:url(/_astro/mona-sans-vietnamese-standard-normal.Rd0aZl9c.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:Mona Sans Variable;font-style:normal;font-display:swap;font-weight:200 900;font-stretch:75% 125%;src:url(/_astro/mona-sans-latin-ext-standard-normal.CQ1tG6In.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:Mona Sans Variable;font-style:normal;font-display:swap;font-weight:200 900;font-stretch:75% 125%;src:url(/_astro/mona-sans-latin-standard-normal.BMVx8nn_.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}:root{color-scheme:light;--bg:light-dark(#fff,#1f1f1f);--text-copy:light-dark(#3b3b3b,#ccc);--text-heading:light-dark(#1f1f1f,#fff);--text-secondary:light-dark(#1f1f1f,#d7d7d7);--text-nav:light-dark(#616161,#9d9d9d);--link:light-dark(#005fb8,#4daafc);--link-hover:light-dark(#0258a8,#85b6ff);--card:light-dark(#f4f4f4,#262626);--card-border:light-dark(#e5e5e5,#3a3a3a);--tag:light-dark(#ebebeb,#333);--code-bg:light-dark(#f8f8f8,#2b2b2b);--code-inline:light-dark(#3b3b3b,#d0d0d0);--code-inline-bg:light-dark(#0000001f,#3c3c3c);--focus:light-dark(#005fb8,#0078d4);--selection:light-dark(#add6ff,#264f78);--line:light-dark(#e5e5e5,#505050)}:root.dark{color-scheme:dark}@media (prefers-color-scheme:dark){:root:not(.light){color-scheme:dark}}html{background:var(--bg)}body{background:var(--bg);color:var(--text-copy);font-family:var(--font-reading);margin:0;font-size:1rem;font-weight:400;line-height:1.5}::selection{background:var(--selection)}:focus-visible{outline:2px solid var(--focus);outline-offset:3px}[hidden]{display:none!important}.site-shell{--page-pad:clamp(1.25rem, 3.4vw, 3.25rem);min-height:100svh;padding:max(var(--page-pad), env(safe-area-inset-top)) max(var(--page-pad), env(safe-area-inset-right)) max(var(--page-pad), env(safe-area-inset-bottom)) max(var(--page-pad), env(safe-area-inset-left));container-type:inline-size}.content-frame{--content-width:62ch;width:min(100%, var(--content-width));overflow-wrap:break-word;margin-inline:auto;position:relative}.content-paragraph,.article-body p{text-wrap:pretty;margin:0 0 1.45rem;font-size:1rem}.article-body>h2:first-child{margin-top:0}.article-body img{border-radius:.45rem;width:100%;height:auto;margin:0 0 1.45rem;display:block}.article-body p:has(>img:only-child){margin:0}.site-title,.content-title,.content-frame h2{color:var(--text-heading);letter-spacing:0;text-wrap:balance;font-weight:600}.site-title{margin:0 0 .95em;font-size:2rem;line-height:1.25}.bio-section [data-bio-panel]>.content-paragraph:last-child{margin-bottom:0}.socials{margin:2rem 0 0}.social-list{flex-wrap:wrap;align-items:center;gap:.9rem 1.85rem;margin:0;padding:0;list-style:none;display:flex}.social-list li{margin:0;padding:0;display:flex}.content-frame a.social-link,.content-frame a.social-link:hover{color:var(--text-copy);align-items:center;gap:.5rem;text-decoration:none;display:inline-flex}.content-frame a.social-link:hover{color:var(--text-secondary)}.social-link svg{flex:none;width:1.35em;height:1.35em;display:block}.social-label{text-decoration-line:underline;text-decoration-color:currentColor}@supports (color:color-mix(in lab, red, red)){.social-label{-webkit-text-decoration-color:color-mix(in srgb, currentColor 30%, transparent);-webkit-text-decoration-color:color-mix(in srgb, currentColor 30%, transparent);text-decoration-color:color-mix(in srgb, currentColor 30%, transparent)}}.social-label{-webkit-text-decoration-skip-ink:auto;text-decoration-skip-ink:auto;text-underline-offset:.18em}.content-frame a.site-title-link,.content-frame a.site-title-link:hover{color:inherit;text-decoration:none}.content-frame a.site-title-link{transition:opacity .2s}.content-frame a.site-title-link:hover{opacity:.72}.site-title-at{margin-right:.015em;font-size:1.1em;line-height:0;display:inline-block;position:relative;top:.015em}.content-title{margin:0 0 .55em;font-size:2rem;line-height:1.25}.content-frame h2{margin:1.8em 0 .75em;font-size:1.5rem;line-height:1.25}.content-frame a{color:var(--link);text-decoration-line:underline;-webkit-text-decoration-color:var(--link);-webkit-text-decoration-color:var(--link);text-decoration-color:var(--link)}@supports (color:color-mix(in lab, red, red)){.content-frame a{-webkit-text-decoration-color:color-mix(in srgb, var(--link) 30%, transparent);-webkit-text-decoration-color:color-mix(in srgb, var(--link) 30%, transparent);text-decoration-color:color-mix(in srgb, var(--link) 30%, transparent)}}.content-frame a{-webkit-text-decoration-skip-ink:auto;text-decoration-skip-ink:auto;text-underline-offset:.18em;transition:color .3s ease-in-out,text-decoration-color .3s ease-in-out}.content-frame a:hover{color:var(--link-hover);-webkit-text-decoration-color:var(--link-hover);-webkit-text-decoration-color:var(--link-hover);text-decoration-color:var(--link-hover)}@supports (color:color-mix(in lab, red, red)){.content-frame a:hover{-webkit-text-decoration-color:color-mix(in srgb, var(--link-hover) 30%, transparent);-webkit-text-decoration-color:color-mix(in srgb, var(--link-hover) 30%, transparent);text-decoration-color:color-mix(in srgb, var(--link-hover) 30%, transparent)}}.article-meta{color:var(--text-nav);font-family:var(--font-ui);letter-spacing:-.005em;margin:0 0 2.4rem;font-size:.875rem}.article-meta a{color:inherit;align-items:center;gap:.65rem;text-decoration:none;display:inline-flex}.article-byline{align-items:baseline;gap:.4rem;display:inline-flex}.article-meta a:hover{color:var(--text-secondary)}.article-avatar{object-fit:cover;border-radius:50%;flex:none;width:20px;height:20px}.bio-section{margin-bottom:3.25rem}.bio-toggle{border-bottom:1px solid var(--line);color:var(--text-nav);font-family:var(--font-ui);letter-spacing:.01em;justify-content:space-between;align-items:baseline;margin-bottom:1.35rem;padding-bottom:.55rem;font-size:.875rem;line-height:1.4;display:flex}.bio-toggle-options{gap:1rem;margin-left:auto;display:flex}.bio-toggle button{color:inherit;font:inherit;cursor:pointer;background:0 0;border:0;justify-content:center;align-items:center;padding:.2rem 0;transition:color .16s;display:inline-flex;position:relative}.bio-toggle button:hover,.bio-toggle button[aria-pressed=true]{color:var(--text-copy)}.bio-toggle button span{letter-spacing:0;position:relative}.bio-toggle button[aria-pressed=true] span:after{content:"";background:var(--text-copy);height:1px;position:absolute;bottom:-.82rem;left:0;right:0}.writing-index,.writing-index>section+section{margin-top:3.5rem}.projects-heading-row{justify-content:space-between;align-items:baseline;gap:1rem;margin-bottom:1.125rem;display:flex}.projects-heading-row h2{margin:0}#blogs-heading{margin:0 0 1.125rem}.content-frame a.projects-view-all,.content-frame a.projects-view-all:hover{color:var(--text-nav);white-space:nowrap;font-size:.875rem;text-decoration:none}.content-frame a.projects-view-all:hover{color:var(--text-copy)}.projects-list{grid-template-columns:repeat(2,minmax(0,1fr));gap:.85rem;margin:0;padding:0;list-style:none;display:grid}.project-card{border:1px solid var(--card-border);background:var(--card);border-radius:.75rem;align-items:flex-start;gap:.85rem;min-width:0;margin:0;padding:1rem;display:flex}.project-card-icon{border:1px solid var(--card-border);background:var(--bg);border-radius:.55rem;flex:none;place-items:center;width:2.5rem;height:2.5rem;display:grid}@supports (color:color-mix(in lab, red, red)){.project-card-icon{background:color-mix(in srgb, var(--bg) 55%, var(--card))}}.project-card-icon{color:var(--text-secondary)}.project-card-icon svg{width:1.15rem;height:1.15rem}.project-card-copy{flex-direction:column;flex:1;min-width:0;display:flex}.project-card-heading{justify-content:space-between;align-items:flex-start;gap:.65rem;display:flex}.project-card-links{flex:none;align-items:center;gap:.15rem;margin-top:-.2rem;display:flex}.content-frame a.project-card-action,.content-frame a.project-card-action:hover{width:1.85rem;height:1.85rem;color:var(--text-nav);place-items:center;text-decoration:none;transition:color .16s;display:grid}.content-frame a.project-card-action:hover{color:var(--text-copy)}.project-card-action svg{width:1rem;height:1rem}.content-frame a.project-card-title,.content-frame a.project-card-title:hover{color:var(--text-heading);margin:0;font-weight:600;line-height:1.3;text-decoration:none}.content-frame a.project-card-title:hover{color:var(--link)}.project-card-desc{color:var(--text-nav);text-wrap:pretty;margin:.3rem 0 0;font-size:.875rem;line-height:1.45}.project-card-tags{flex-wrap:wrap;gap:.4rem;margin:.75rem 0 0;padding:0;list-style:none;display:flex}.project-card-tags li{background:var(--tag);color:var(--text-nav);border-radius:999px;margin:0;padding:.2rem .55rem;font-size:.75rem;line-height:1.3}.blogs-list{margin-top:0}.blog-row{border-bottom:1px solid var(--line);color:var(--text-copy);grid-template-columns:minmax(0,1fr) auto;align-items:baseline;gap:1.25rem;padding:.72em 0;text-decoration:none;display:grid}.blog-row:first-child{border-top:1px solid var(--line)}.content-frame a.blog-row,.content-frame a.blog-row:hover{color:var(--text-copy);text-decoration:none}.blog-row time{color:var(--text-nav);font-family:var(--font-ui);white-space:nowrap;font-size:.875rem}@media (hover:hover) and (pointer:fine){.content-frame a.blog-row{transition:opacity .3s ease-in-out,color .3s ease-in-out}.blogs-list:has(.blog-row:hover) .blog-row:not(:hover){opacity:.72}.content-frame a.blog-row:hover{color:var(--text-copy)}@supports (color:color-mix(in lab, red, red)){.content-frame a.blog-row:hover{color:color-mix(in srgb, var(--text-copy) 78%, white)}}.project-card{transition:border-color .2s,background-color .2s}.project-card:hover{border-color:var(--text-nav)}@supports (color:color-mix(in lab, red, red)){.project-card:hover{border-color:color-mix(in srgb, var(--text-nav) 55%, var(--card-border))}}.project-card:hover{background:var(--card)}@supports (color:color-mix(in lab, red, red)){.project-card:hover{background:color-mix(in srgb, var(--card) 88%, var(--text-heading))}}}.content-frame ul:not(.projects-list):not(.project-card-tags):not(.social-list){margin:0 0 1.45rem;padding-left:1.25rem;list-style:outside}.content-frame ul:not(.projects-list):not(.project-card-tags):not(.social-list) li{text-wrap:pretty;margin:0 0 .35rem;padding:0}.content-frame li>p:last-child{margin-bottom:0}.content-frame pre{overscroll-behavior-x:contain;background:var(--code-bg);font-family:var(--font-code);border-radius:.45rem;margin:0 0 1.333rem;padding:1rem 2rem 1rem 1rem;font-weight:400;line-height:1.5;position:relative;overflow-x:auto}.content-frame pre code{color:var(--text-copy);background:0 0;padding:0;font-family:inherit;font-size:.875rem;font-weight:400;line-height:1.5;display:block}html:not(.dark) .content-frame .astro-code span{color:var(--shiki-light);font-style:var(--shiki-light-font-style);font-weight:var(--shiki-light-font-weight);-webkit-text-decoration:var(--shiki-light-text-decoration);-webkit-text-decoration:var(--shiki-light-text-decoration);text-decoration:var(--shiki-light-text-decoration)}html.dark .content-frame .astro-code span{color:var(--shiki-dark);font-style:var(--shiki-dark-font-style);font-weight:var(--shiki-dark-font-weight);-webkit-text-decoration:var(--shiki-dark-text-decoration);-webkit-text-decoration:var(--shiki-dark-text-decoration);text-decoration:var(--shiki-dark-text-decoration)}@media (prefers-color-scheme:dark){html:not(.light) .content-frame .astro-code span{color:var(--shiki-dark);font-style:var(--shiki-dark-font-style);font-weight:var(--shiki-dark-font-weight);-webkit-text-decoration:var(--shiki-dark-text-decoration);-webkit-text-decoration:var(--shiki-dark-text-decoration);text-decoration:var(--shiki-dark-text-decoration)}}.content-frame code:not(pre code){background:var(--code-inline-bg);color:var(--code-inline);font-family:var(--font-code);padding:.2em .4em;font-size:.875em}.home-layout,.home-copy{min-width:0}.home-visual{display:none;container-type:size}.home-art{width:max(100cqw,54.8387cqh);height:max(100cqh,182.353cqw);position:absolute;bottom:0;left:50%;transform:translate(-50%)}.home-city{width:100%;height:auto;display:block;position:absolute;bottom:0;left:0}.home-sky{pointer-events:none;width:100%;height:100%;display:block;position:absolute;inset:0}.home-sky-lights{opacity:.58}.home-star-twinkle{transform-box:fill-box;transform-origin:50%;animation-name:home-twinkle;animation-timing-function:ease-in-out;animation-iteration-count:infinite;animation-play-state:paused}.home-visual:hover .home-star-twinkle{animation-play-state:running}@keyframes home-twinkle{0%,to{opacity:1;transform:scale(1)}50%{opacity:1;transform:scale(1.8)}}@media (prefers-reduced-motion:reduce){.home-star-twinkle{animation:none}}@media (width>=1100px){.content-frame.is-article{margin-top:48px}}@media (width>=1100px),(width>=1000px) and (aspect-ratio>=1){.home-layout{width:min(100cqi,1500px);margin-inline:calc((var(--content-width) - min(100cqi, 1500px)) / 2);grid-template-columns:minmax(0,1.75fr) minmax(380px,1fr);align-items:start;gap:clamp(2rem,3.6vw,3.75rem);display:grid}.home-copy{width:min(100%, var(--content-width))}.home-visual{top:var(--page-pad);height:calc(100svh - (2 * var(--page-pad)));background:#00263b;border-radius:10px;min-height:min(72svh,760px);display:block;position:sticky;overflow:hidden}}@media (width<=639px){.site-shell{--page-pad:1.25rem;padding:max(2.5rem, env(safe-area-inset-top)) max(1.25rem, env(safe-area-inset-right)) max(1.25rem, env(safe-area-inset-bottom)) max(1.25rem, env(safe-area-inset-left))}.projects-list{grid-template-columns:1fr}.blog-row{grid-template-columns:1fr;gap:.15rem}.content-frame pre{padding:.85rem .9rem}}@media (width<=639px),(pointer:coarse){.content-frame a.project-card-action{width:44px;height:44px}.blog-row{min-height:44px}.bio-toggle{align-items:center;min-height:44px;padding-bottom:0}.bio-toggle button{min-width:44px;min-height:44px;padding:.5rem .35rem}.bio-toggle button[aria-pressed=true] span:after{bottom:calc(.5lh - 22px)}.social-list{gap:.15rem 1.25rem}.content-frame a.social-link{min-height:44px;padding-inline:.15rem}.article-meta a{min-height:44px}}@property --tw-rotate-x{syntax:"*";inherits:false}@property --tw-rotate-y{syntax:"*";inherits:false}@property --tw-rotate-z{syntax:"*";inherits:false}@property --tw-skew-x{syntax:"*";inherits:false}@property --tw-skew-y{syntax:"*";inherits:false}
