*,:before,:after{--tw-border-spacing-x: 0;--tw-border-spacing-y: 0;--tw-translate-x: 0;--tw-translate-y: 0;--tw-rotate: 0;--tw-skew-x: 0;--tw-skew-y: 0;--tw-scale-x: 1;--tw-scale-y: 1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness: proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width: 0px;--tw-ring-offset-color: #fff;--tw-ring-color: rgb(59 130 246 / .5);--tw-ring-offset-shadow: 0 0 #0000;--tw-ring-shadow: 0 0 #0000;--tw-shadow: 0 0 #0000;--tw-shadow-colored: 0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: ;--tw-contain-size: ;--tw-contain-layout: ;--tw-contain-paint: ;--tw-contain-style: }::backdrop{--tw-border-spacing-x: 0;--tw-border-spacing-y: 0;--tw-translate-x: 0;--tw-translate-y: 0;--tw-rotate: 0;--tw-skew-x: 0;--tw-skew-y: 0;--tw-scale-x: 1;--tw-scale-y: 1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness: proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width: 0px;--tw-ring-offset-color: #fff;--tw-ring-color: rgb(59 130 246 / .5);--tw-ring-offset-shadow: 0 0 #0000;--tw-ring-shadow: 0 0 #0000;--tw-shadow: 0 0 #0000;--tw-shadow-colored: 0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: ;--tw-contain-size: ;--tw-contain-layout: ;--tw-contain-paint: ;--tw-contain-style: }.portfolio-header{position:fixed;z-index:40;display:flex;height:76px;align-items:center;justify-content:space-between;inset:0 0 auto;padding-inline:30px 16px}@media (max-width: 759px){.portfolio-header{height:75px;padding-inline:26px 20px}}@media (max-width: 480px){.portfolio-header{padding-inline:22px 17px}}.wordmark{font-size:16px;font-weight:700;letter-spacing:-.45px}@media (max-width: 759px){.wordmark{font-size:12px}}.header-actions{display:flex;align-items:center;gap:.75rem}@media (max-width: 759px){.header-actions{gap:9px}}@media (max-width: 480px){.header-actions{gap:.75rem}}.header-location{display:none}.header-github{display:inline-flex;height:2.75rem;align-items:center;gap:.5rem;border-radius:7px;border-width:2px;border-style:solid;--tw-border-opacity: 1;border-color:rgb(90 94 104 / var(--tw-border-opacity, 1));padding-left:.75rem;padding-right:.75rem;font-size:14px;font-weight:700}@media (max-width: 759px){.header-github{height:38px;width:38px;justify-content:center;padding:0}}.menu-toggle{display:flex;align-items:center;gap:13px;background-color:transparent;font-size:14px;border:0;padding:10px 0 10px 3px}@media (max-width: 759px){.menu-toggle{gap:0px;font-size:0;padding:6px 0}}.menu-lines{height:.5rem;width:22px}@media (max-width: 759px){.menu-lines{width:1.25rem}}.section-shell{margin-left:auto;margin-right:auto;width:min(1216px,calc(100% - 64px))}@media (max-width: 759px){.section-shell{width:calc(100% - 64px)}}@media (max-width: 480px){.section-shell{width:calc(100% - 64px)}}.portfolio-footer{position:relative;z-index:2;padding-bottom:25px}.footer-main{display:flex;align-items:center;justify-content:space-between;gap:1.25rem;border-top:1px solid var(--border);padding:27px 0}@media (max-width: 759px){.footer-main{flex-wrap:wrap;gap:15px}}.brand-dot{display:none}.business-details{font-size:12px;color:var(--muted);border-top:1px solid var(--border)}@media (max-width: 759px){.business-details{font-size:10px}}.quick-contact{position:fixed;bottom:1.25rem;right:1.25rem;z-index:35}@media (max-width: 759px){.quick-contact{right:.75rem;bottom:.75rem}}.zalo-contact{display:inline-flex;min-height:3rem;align-items:center;justify-content:center;gap:.5rem;border-radius:999px;border-width:1px;border-style:solid;--tw-border-opacity: 1;border-color:rgb(0 104 255 / var(--tw-border-opacity, 1));--tw-bg-opacity: 1;background-color:rgb(0 104 255 / var(--tw-bg-opacity, 1));font-size:14px;font-weight:600;--tw-text-opacity: 1;color:rgb(255 255 255 / var(--tw-text-opacity, 1));padding:12px 18px}.navigation-dialog{width:min(830px,calc(100% - 30px))}.dialog-top{display:flex;align-items:center;justify-content:space-between;gap:1.25rem;font-size:13px;color:var(--muted)}.dialog-close{border-radius:5px;border-width:1px;border-style:solid;border-color:var(--border);background-color:transparent;font-size:13px;color:var(--text);padding:7px 12px}.nav-footer{margin-top:25px;font-size:11px;color:var(--muted)}@media (max-width: 759px){.nav-footer{font-size:9px}}.contact-section{padding-top:85px;padding-bottom:150px}@media (max-width: 759px){.contact-section{padding-top:75px;padding-bottom:50px}}.section-heading{margin-bottom:3rem;text-align:center}.contact-layout{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));align-items:center;gap:2.5rem}@media (max-width: 1150px){.contact-layout{gap:1.25rem}}@media (max-width: 759px){.contact-layout{grid-template-columns:repeat(1,minmax(0,1fr));gap:0px}}.contact-card{position:relative;z-index:3;border-radius:13px;border-width:1px;border-style:solid;border-color:var(--border);background-color:var(--bg);padding:1.5rem}@media (max-width: 1150px){.contact-card{padding:22px}}@media (max-width: 759px){.contact-card{padding:1.25rem}}@media (max-width: 480px){.contact-card{padding:17px}}.contact-form{margin:0}.contact-fields{margin:0;display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:12px 10px;padding:0;border:0}@media (max-width: 480px){.contact-fields{grid-template-columns:repeat(1,minmax(0,1fr))}}.form-field{min-width:0px}.contact-message{margin-top:.625rem;min-height:15px;font-size:13px;color:var(--muted)}.contact-links{margin-top:17px;display:flex;flex-wrap:wrap;gap:1.25rem;font-size:12px;color:var(--muted)}@media (max-width: 480px){.contact-links{gap:17px;font-size:11px}}.text-button{background-color:transparent;padding:0;color:inherit;border:0;font-size:inherit}.contact-result{width:min(500px,calc(100% - 30px));text-align:center}.experience-section{padding:70px 0 100px}@media (max-width: 759px){.experience-section{padding-top:70px;padding-bottom:55px}}.experience-list{position:relative;margin-left:auto;margin-right:auto;width:min(832px,100%)}.experience-row{position:relative;margin-top:1.75rem;border-radius:7px;border-width:1px;border-style:solid;border-color:var(--border);background-color:var(--surface);padding:1.5rem}@media (max-width: 759px){.experience-row{margin-top:1.25rem;padding:22px 18px}}.experience-period{position:absolute;top:23px;right:1.5rem;font-size:12px;color:var(--text)}@media (max-width: 759px){.experience-period{position:static;margin-bottom:.875rem;font-size:11px}}.status-dot{margin-right:.375rem;display:inline-block;height:7px;width:7px;border-radius:50%;--tw-bg-opacity: 1;background-color:rgb(23 188 139 / var(--tw-bg-opacity, 1))}.experience-title{padding-right:185px}@media (max-width: 759px){.experience-title{padding:0}}.company{margin-top:.5rem;font-size:16px;color:var(--muted)}@media (max-width: 759px){.company{font-size:14px}}.tags{margin-top:1rem;display:flex;flex-wrap:wrap;align-items:center;gap:7px}@media (max-width: 759px){.tags{gap:5px}}.work-note{margin-top:.875rem;font-size:11px;color:var(--muted)}@media (max-width: 759px){.work-note{font-size:10px}}.hero{position:relative;display:grid;height:100svh;min-height:840px;grid-template-columns:repeat(2,minmax(0,1fr));align-items:center}@media (max-width: 759px){.hero{display:block;height:max(844px,100svh);min-height:0px;padding-top:130px}}.hero-copy{position:relative;z-index:2;min-width:0px}.eyebrow{margin-bottom:11px;font-size:20px;--tw-text-opacity: 1;color:rgb(161 161 171 / var(--tw-text-opacity, 1))}@media (max-width: 759px){.eyebrow{margin-bottom:.375rem;font-size:16px}}.hero-role{margin-top:26px;font-size:20px;--tw-text-opacity: 1;color:rgb(161 161 171 / var(--tw-text-opacity, 1))}@media (max-width: 759px){.hero-role{margin-top:9px;font-size:16px}}.hero-links{margin-top:2rem;width:286px;max-width:100%}@media (max-width: 759px){.hero-links{margin-top:2rem;width:286px}}.hero-socials{margin-top:.75rem;display:flex;width:286px;max-width:100%;align-items:stretch;gap:9px}@media (max-width: 759px){.hero-socials{width:286px}}.hire-button{white-space:nowrap;font-size:14px;font-weight:600;padding:0 16px}.social-icon{width:58px;padding:5px;flex:1}.projects-section{padding-top:90px;padding-bottom:115px}@media (max-width: 759px){.projects-section{padding-top:75px;padding-bottom:65px}}.project-toolbar{position:relative;z-index:4;display:flex;align-items:center;justify-content:center;gap:1.25rem}.project-filters{display:flex;flex-wrap:wrap;justify-content:center;gap:7px}@media (max-width: 759px){.project-filters{gap:.375rem}}.project-count{font-size:11px;color:var(--muted)}@media (max-width: 759px){.project-count{display:none}}.project-grid{margin-top:300px;display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:16px 20px}@media (max-width: 759px){.project-grid{margin-top:200px;grid-template-columns:repeat(2,minmax(0,1fr));gap:13px}}@media (max-width: 480px){.project-grid{margin-top:210px;grid-template-columns:repeat(1,minmax(0,1fr));gap:17px}}.project-card{position:relative;min-width:0px}.project-open{position:relative;isolation:isolate;display:block;aspect-ratio:1.48;width:100%;overflow:hidden;border-radius:9px;border-width:1px;border-style:solid;border-color:var(--border);background-color:var(--surface);padding:0;text-align:left;--tw-text-opacity: 1;color:rgb(248 249 251 / var(--tw-text-opacity, 1))}@media (max-width: 759px){.project-open{aspect-ratio:1.2}}@media (max-width: 480px){.project-open{aspect-ratio:1.45}}.project-info{position:absolute;bottom:1rem;left:1rem;right:.875rem;z-index:2}@media (max-width: 759px){.project-info{left:.625rem;right:.5rem;bottom:11px}}@media (max-width: 480px){.project-info{bottom:13px;left:13px}}.project-meta{display:flex;align-items:center;justify-content:space-between;gap:.625rem}.project-category{margin-top:.25rem;display:inline-block;max-width:100%;border-radius:14px;--tw-bg-opacity: 1;background-color:rgb(245 247 253 / var(--tw-bg-opacity, 1));font-size:12px;line-height:1.25;--tw-text-opacity: 1;color:rgb(16 24 39 / var(--tw-text-opacity, 1));padding:0 9px}@media (max-width: 759px){.project-category{padding-left:.375rem;padding-right:.375rem;font-size:10px}}@media (max-width: 480px){.project-category{font-size:12px}}.project-dialog{width:min(820px,calc(100% - 30px))}.project-description{margin-top:17px;font-size:15px;line-height:1.8;color:var(--muted)}@media (max-width: 759px){.project-description{font-size:14px}}.project-role{margin-top:15px;font-size:13px}.project-source{margin-top:.75rem;font-size:12px;color:var(--muted)}.stack-item{display:inline-flex;align-items:center;gap:7px;border-radius:22px;border-width:1px;border-style:solid;border-color:transparent;font-size:12px;color:var(--muted);background:color-mix(in srgb,var(--surface) 85%,transparent);padding:6px 11px}@media (max-width: 759px){.stack-item{gap:.25rem;font-size:10px;padding:5px 8px}}.stack-section{min-height:1500px;padding-top:5rem;padding-bottom:90px}@media (max-width: 759px){.stack-section{min-height:1150px;padding-top:95px;padding-bottom:70px}}.stack-stage{pointer-events:none;position:relative;height:930px}@media (max-width: 759px){.stack-stage{height:640px}}.stack-selection{min-height:30px;text-align:center;font-size:14px;color:var(--muted)}@media (max-width: 759px){.stack-selection{min-height:45px;font-size:12px}}.stack-grid{display:flex;width:min(900px,100%);flex-wrap:wrap;justify-content:center;gap:9px;margin:20px auto 0}@media (max-width: 759px){.stack-grid{gap:.375rem}}.business-grid{margin-top:25px;display:grid;grid-template-columns:1fr 1fr;gap:30px}@media (max-width: 759px){.business-grid{grid-template-columns:repeat(1,minmax(0,1fr));gap:1.25rem}}.business-socials{margin-top:18px;display:flex;flex-wrap:wrap;gap:15px}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border-width:0}.visible{visibility:visible}.hidden{display:none}.transform{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.resize{resize:both}.outline{outline-style:solid}.ring{--tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(3px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow, 0 0 #0000)}.filter{filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}@font-face{font-family:Unbounded;src:url(/assets/fonts/Unbounded-Latin.woff2) format("woff2");font-style:normal;font-weight:200 900;font-display:swap}@font-face{font-family:Unbounded;src:url(/assets/fonts/Unbounded-Vietnamese.woff2) format("woff2");font-style:normal;font-weight:200 900;font-display:swap;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:Space Grotesk;src:url(/assets/fonts/SpaceGrotesk-latin.woff2) format("woff2");font-style:normal;font-weight:300 700;font-display:swap}@font-face{font-family:Space Grotesk;src:url(/assets/fonts/SpaceGrotesk-vietnamese.woff2) format("woff2");font-style:normal;font-weight:300 700;font-display:swap;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}:root{color-scheme:dark;--bg: #030509;--surface: #050c1a;--text: #f5f6fa;--muted: #99a3b5;--border: #253044;--input: #262628;--display: Unbounded, Arial, sans-serif;--body: "Space Grotesk", Arial, sans-serif}:root[data-theme=light]{color-scheme:light;--bg: #f6f5f1;--surface: #f9fafc;--text: #151923;--muted: #626c7e;--border: #c9cdd6;--input: #e6e7eb}*{box-sizing:border-box}html{scroll-behavior:smooth;scroll-padding-top:95px}body{margin:0;color:var(--text);background:var(--bg);font:500 16px/1.55 var(--body);-webkit-font-smoothing:antialiased}body:before{content:"";position:fixed;top:0;right:0;bottom:0;left:0;z-index:-2;background:linear-gradient(135deg,#000,#111522 51%,#000);pointer-events:none}:root[data-theme=light] body:before{background:linear-gradient(135deg,#faf9f4,#e8ecf4,#faf9f4)}body.modal-open{overflow:hidden}.page-loader{display:none;position:fixed;top:0;right:0;bottom:0;left:0;z-index:10000;background:#080b12;color:#f5f6fa;place-items:center;padding:28px;transition:opacity .28s ease}.portfolio-loading,.portfolio-loading body{overflow:hidden}.portfolio-loading body>:not(.page-loader):not(script){visibility:hidden!important}.portfolio-loading .page-loader,.page-loader.is-leaving{display:grid}.page-loader.is-leaving{opacity:0;pointer-events:none}.page-loader[hidden]{display:none}.loader-content{text-align:center;max-width:500px}.loader-keys{display:grid;grid-template-columns:repeat(3,38px);gap:10px;justify-content:center;margin:0 auto 40px;transform:perspective(400px) rotateX(25deg) rotate(-12deg)}.loader-keys i{height:34px;border-radius:8px;background:#e5ae19;box-shadow:0 6px #a16c0c;animation:loader-key 1.6s ease-in-out infinite}.loader-keys i:nth-child(2){background:#08a7cc;box-shadow:0 6px #056380;animation-delay:.12s}.loader-keys i:nth-child(3){background:#54caac;box-shadow:0 6px #297760;animation-delay:.24s}.loader-keys i:nth-child(4){background:#8254d2;box-shadow:0 6px #49277f;animation-delay:.36s}.loader-keys i:nth-child(5){background:#d94e7b;box-shadow:0 6px #862646;animation-delay:.48s}.loader-keys i:nth-child(6){background:#2c72c2;box-shadow:0 6px #173e72;animation-delay:.6s}.loader-eyebrow{font:500 9px/1.7 var(--body);letter-spacing:2.1px;color:#8994a8;margin:0 0 15px}.loader-title{font:500 clamp(19px,3vw,27px) / 1.5 var(--display);margin:0 0 14px}#loadingMessage{font:400 13px/1.8 var(--body);color:#9da8bb;margin:0 auto 28px;max-width:390px}.loader-track{display:block;width:130px;height:2px;background:#202838;margin:auto;overflow:hidden}.loader-track i{display:block;width:45%;height:100%;background:#c7d4eb;animation:loader-track 1.5s ease-in-out infinite}#loadingContinue{margin-top:26px;border:1px solid #3a465c;border-radius:6px;padding:10px 15px;background:#111827;color:#f5f6fa;font-size:12px}.key-icon-unavailable{font-size:10px;line-height:1.2}@keyframes loader-key{0%,70%,to{transform:translateY(0)}30%{transform:translateY(5px);box-shadow:0 1px #1118}}@keyframes loader-track{0%{transform:translate(-110%)}to{transform:translate(330%)}}@media (prefers-reduced-motion: reduce){.loader-keys i,.loader-track i{animation:none}.page-loader{transition:none}}a{color:inherit;text-decoration:none}button,input,textarea{font:inherit}button{color:inherit;cursor:pointer}button,a{-webkit-tap-highlight-color:transparent}button:disabled{cursor:wait;opacity:.6}button:focus-visible,a:focus-visible,summary:focus-visible{outline:2px solid #8dc7ff;outline-offset:4px}input:focus-visible,textarea:focus-visible{outline:2px solid #8dc7ff;outline-offset:2px}img{display:block;max-width:100%}h1,h2,h3,p{margin:0}h1,h2,h3{line-height:1.1;font-family:var(--display);font-weight:700}svg{width:24px;height:24px;flex-shrink:0}[hidden]{display:none!important}.icon-definitions{position:absolute;height:0px;width:0px;overflow:hidden}.skip-link{position:fixed;top:-60px;left:1.25rem;z-index:100;background-color:var(--text);color:var(--bg);padding:10px 18px}.skip-link:focus{top:.625rem}.sr-only{position:absolute;margin:-1px;height:1px;width:1px;overflow:hidden;white-space:nowrap;clip-path:inset(50%)}#starfield{position:fixed;top:0;right:0;bottom:0;left:0;width:100%;height:100%;z-index:-1;pointer-events:none}#keyboardWebGL{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1;pointer-events:none}#keyboardWebGL canvas{display:block;width:100%;height:100%}.over-3d-key{cursor:pointer}.scroll-progress{position:fixed;z-index:45;height:.125rem;width:100%;--tw-bg-opacity: 1;background-color:rgb(220 228 239 / var(--tw-bg-opacity, 1));inset:0 auto auto 0;opacity:.45;transform:scaleX(0);transform-origin:left}.portfolio-header.scrolled{background:color-mix(in srgb,var(--bg) 72%,transparent);-webkit-backdrop-filter:blur(16px);backdrop-filter:blur(16px)}.icon-button,.header-square{display:grid;height:2.75rem;width:46px;border-radius:7px;border-width:2px;border-style:solid;--tw-border-opacity: 1;border-color:rgb(90 94 104 / var(--tw-border-opacity, 1));background-color:transparent;place-items:center}#themeToggle{width:32px;border:0;margin-right:3px}#themeToggle svg{width:20px;height:20px}.header-github svg{height:19px;width:19px}.menu-lines{border-block:1px solid currentColor}.hero-copy{transform:translateY(-22px)}h1{font-size:clamp(64px,8.9vw,128px);letter-spacing:-5px;line-height:1;font-weight:700}h1>span{display:block;white-space:nowrap}.hero-role strong{font-weight:500}.button{display:inline-flex;align-items:center;justify-content:center;gap:11px;border-radius:6px;border-width:1px;border-style:solid;border-color:var(--border);background-color:transparent;font-size:14px;font-weight:500;line-height:1.4;padding:11px 20px;transition:background .2s,transform .2s}.button:hover{transform:translateY(-2px)}.button-primary{background-color:var(--text);color:var(--surface)}.hero-links .button{height:2.5rem;width:100%}.hero-links svg{height:22px;width:22px}.hire-button,.social-icon{display:grid;height:2.5rem;border-radius:5px;border-width:1px;border-style:solid;border-color:var(--border);background-color:var(--surface);place-items:center}.social-icon:hover,.hire-button:hover{--tw-border-opacity: 1;border-color:rgb(134 148 171 / var(--tw-border-opacity, 1))}.social-icon svg{height:1.5rem;width:1.5rem}.scroll-cue{position:absolute;left:50%;bottom:40px;transform:translate(-50%);width:24px;height:49px;border:2px solid #e4e6ec;border-radius:18px;z-index:3}.scroll-cue span{position:absolute;top:11px;left:5px;width:10px;height:13px;border-radius:8px;background:#b8b9bf;animation:scroll-mouse 1.8s infinite}.keyboard-scene{min-width:0;height:510px;perspective:1100px;position:relative;z-index:3;display:grid;place-items:center}.keyboard{position:absolute;left:50%;top:50%;width:570px;padding:24px;background:#252628;border:5px solid #303135;border-radius:28px;box-shadow:0 13px #161719,0 28px #020304;transform:translate(-50%,-50%) rotateX(33deg) rotate(-16deg);transform-style:preserve-3d}.key-grid{display:grid;grid-template-columns:repeat(6,minmax(0,1fr));gap:16px 10px;padding:9px;background:#101114;border-radius:15px}.keycap{min-width:0;height:68px;padding:10px;border-radius:14px;border:1px solid #ffffff36;background:var(--key-color);box-shadow:0 12px color-mix(in srgb,var(--key-color),#000 40%);transform-style:preserve-3d;position:relative;transition:transform .15s}.keycap img{width:37px;height:37px;margin:auto}.keycap small{position:absolute;right:7px;bottom:3px;font-size:8px;text-transform:uppercase}.keycap.pressed{transform:translateY(9px)}.skill-readout{position:absolute;top:calc(100% - 14px);left:10%;right:0;color:var(--muted);font-size:13px;text-align:center}.skill-readout strong,.skill-readout small{display:block;font-weight:400}.skill-index{display:none}.webgl-ready .keyboard-scene{pointer-events:none;perspective:none}.webgl-ready #keyboard{position:fixed;top:0;right:0;bottom:0;left:0;width:100%;height:100%;padding:0;border:0;transform:none!important;box-shadow:none;background:none;pointer-events:none}.webgl-ready .key-grid{display:contents}.webgl-ready .keycap{position:fixed;opacity:0;padding:0;transform:none;pointer-events:auto;border:0;box-shadow:none}.webgl-ready .keycap>*{display:none}.webgl-ready .keycap:focus-visible{opacity:1;background:#ffffff26;outline:2px solid #dbeaff;border-radius:8px}.webgl-ready .skill-readout{opacity:0}.hero:has(.keycap:focus-visible) .skill-readout{opacity:1}section:not(.hero){position:relative;z-index:2}.section-heading h2{font-size:72px;line-height:1;letter-spacing:-3px}.section-heading p{margin-top:13px;font-size:16px;font-weight:400;color:var(--muted)}.stack-stage-label{position:absolute;top:180px;left:35px;transform:rotate(-37deg);transform-origin:left center;color:#c7c9d2}.stack-stage-label strong{display:block;font:700 38px/1.25 var(--display);text-shadow:0 2px #a6a8b1,0 4px #797c85,0 6px #555760,0 8px #40424b;letter-spacing:-1px}.stack-stage-label span{font-size:24px;display:block;margin-top:18px}.stack-item img{height:18px;width:18px;-o-object-fit:contain;object-fit:contain}.stack-item.active{--tw-border-opacity: 1;border-color:rgb(139 155 174 / var(--tw-border-opacity, 1));color:var(--text)}.experience-list:before{position:absolute;top:0;bottom:1.25rem;left:50%;width:1px;background-color:var(--border);content:""}.experience-title h3{font-size:20px;line-height:1.15;letter-spacing:-.65px}.experience-content ul{padding-left:0;font-size:16px;line-height:1.7;color:var(--muted);list-style-position:inside;margin:17px 0 20px}.experience-content li{margin-top:.375rem;margin-bottom:.375rem}.tags span{border-radius:20px;font-size:12px;color:var(--muted);background:color-mix(in srgb,var(--muted) 9%,transparent);padding:4px 10px}.project-filters button{border-radius:20px;border-width:1px;border-style:solid;border-color:var(--border);font-size:12px;color:var(--muted);background:color-mix(in srgb,var(--bg) 80%,transparent);padding:5px 12px}.project-filters button[aria-pressed=true]{border-color:var(--muted);color:var(--text)}.project-visual{position:absolute;display:grid;overflow:hidden;--tw-bg-opacity: 1;background-color:rgb(23 35 59 / var(--tw-bg-opacity, 1));top:0;right:0;bottom:0;left:0;place-items:center}.project-visual:after{pointer-events:none;position:absolute;z-index:1;background:linear-gradient(0deg,#020816 0%,#02081626 35%,transparent 70%);top:0;right:0;bottom:0;left:0;content:""}.project-visual img{height:77%;width:83%;border-radius:6px;-o-object-fit:contain;object-fit:contain;transform:translateY(-8px);transition:transform .6s}.project-open:hover .project-visual img{transform:translateY(-13px) scale(1.05)}.project-index,.project-hover{display:none}.project-meta h3{letter-spacing:-.5px;font:700 20px/1.15 var(--body)}.project-meta>span{font-size:18px;opacity:0;transition:opacity .2s}.project-open:hover .project-meta>span{opacity:1}.project-info .tags{display:none}.project-visual.wedding{background:linear-gradient(135deg,#8fc7cd,#e4ded2,#9fb5b4)}.project-visual.library{background:linear-gradient(120deg,#452d8c,#a0c5f2,#473076)}.project-visual.upmesh{background:linear-gradient(130deg,#9e51e1,#3799e8,#673eb8)}.project-visual.upmesh img{height:80%;width:59%}.project-visual.nutizen{background:linear-gradient(130deg,#c3e7bb,#f1f0be,#60b77b)}.project-visual.nutizen img{width:59%;mix-blend-mode:multiply}.project-visual.skinfood{background:linear-gradient(135deg,#f8e7a0,#b7751f)}.project-visual.skinfood img{width:55%;mix-blend-mode:multiply}.project-visual.college{background:linear-gradient(135deg,#8ec5eb,#e6edfe,#2652a0)}.project-visual.college img{height:65%;width:30%}.project-visual.longthanhphat{background:linear-gradient(130deg,#c2adeb,#a6d3ee,#6b56ad)}.project-visual.longthanhphat img{height:80%;width:89%;box-shadow:0 15px 20px #15173544}.library-art{text-align:center;color:#f3ebff;transform:translateY(-18px)}.library-art>span{font:700 65px/1 var(--display)}.library-art>small{display:block;font:12px monospace;margin-top:12px}.library-blocks{display:flex;justify-content:center;gap:6px;margin-top:20px}.library-blocks i{width:35px;height:25px;border:1px solid #dac9ff;background:#584183;border-radius:4px;box-shadow:0 4px #231740;transform:rotate(-7deg)}.invitation-art{position:relative;width:74%;height:79%;display:grid;place-items:center;transform:translateY(-7px)}.invitation-envelope{position:absolute;width:72%;height:73%;background:#94ae9a;border:1px solid #718f79;transform:rotate(-15deg) translate(-20%);box-shadow:0 15px 22px #233e4044}.invitation-card{background:#faf7eb;color:#3e5c45;position:relative;width:65%;height:100%;padding:15px;display:flex;align-items:center;justify-content:center;flex-direction:column;text-align:center;transform:rotate(7deg) translate(12%);box-shadow:0 20px 25px #36403344}.invitation-card>small{font-size:4px;letter-spacing:1px}.invitation-flower{font-size:25px;line-height:1;margin-top:9px}.invitation-card strong{font:400 25px/1.1 Georgia,serif;margin:8px 0}.invitation-card>span:last-of-type{font-size:4px;letter-spacing:.5px}.invitation-card>i{font-size:14px;font-style:normal;margin-top:8px}.contact-section .section-heading{margin-bottom:70px}.contact-section h2{line-height:.9}.contact-card h3{font-size:36px;letter-spacing:-1.8px}.contact-card>p{font-size:14px;line-height:1.5;color:var(--muted);margin:10px 0 27px}.contact-card>p a{font-weight:700;overflow-wrap:anywhere}.contact-keyboard-space{min-width:0;height:620px}.form-field.full{grid-column:1 / -1}.form-field label{margin-bottom:.375rem;display:block;font-size:14px;line-height:1.3}.form-field input,.form-field textarea{display:block;width:100%;border-radius:6px;border-width:1px;border-style:solid;border-color:#ffffff12;background-color:var(--input);font-size:14px;line-height:1.45;color:var(--text);padding:10px 11px}.form-field input{height:42px}.form-field input::-moz-placeholder,.form-field textarea::-moz-placeholder{--tw-text-opacity: 1;color:rgb(155 155 160 / var(--tw-text-opacity, 1))}.form-field input::placeholder,.form-field textarea::placeholder{--tw-text-opacity: 1;color:rgb(155 155 160 / var(--tw-text-opacity, 1))}.form-field textarea{min-height:115px;resize:vertical}.contact-submit{margin-top:17px;width:100%;border-radius:6px;border-width:1px;border-style:solid;border-color:var(--border);--tw-bg-opacity: 1;background-color:rgb(25 26 30 / var(--tw-bg-opacity, 1));padding:.75rem;font-size:14px;--tw-text-opacity: 1;color:rgb(244 245 248 / var(--tw-text-opacity, 1))}#turnstileWrapper{margin-top:12px;min-width:0}#turnstileWrapper:empty{display:none}#turnstileWrapper iframe{max-width:100%}.footer-main p,.footer-main>a:last-child{font-size:12px;color:var(--muted)}.business-grid h3{margin-bottom:13px;font:600 17px var(--body)}.business-grid a{margin-bottom:.5rem;display:block;overflow-wrap:anywhere}.business-grid iframe{height:200px;width:100%;border-radius:7px;border-width:1px;border-style:solid;border-color:var(--border)}.zalo-contact{box-shadow:0 6px 20px #0068ff30}.zalo-contact img{height:1.75rem;width:1.75rem;flex-shrink:0;border-radius:7px}.zalo-contact:hover{--tw-border-opacity: 1;border-color:rgb(0 85 212 / var(--tw-border-opacity, 1));--tw-bg-opacity: 1;background-color:rgb(0 85 212 / var(--tw-bg-opacity, 1))}dialog{color:var(--text);background:var(--surface);border:1px solid var(--border);padding:28px;border-radius:12px;max-height:90svh;overscroll-behavior:contain}dialog::backdrop{background:#02050bd6;-webkit-backdrop-filter:blur(12px);backdrop-filter:blur(12px)}dialog[open]{animation:dialog-in .25s ease}.navigation-dialog nav{margin-top:1.25rem;display:grid}.navigation-dialog nav a{display:flex;align-items:center;gap:1.25rem;letter-spacing:-2px;border-bottom:1px solid var(--border);padding:15px 0;font:700 45px/1.3 var(--display)}.navigation-dialog nav a small{color:var(--muted);font:12px var(--body)}.navigation-dialog nav a>span{margin-left:auto;font:36px var(--body)}.project-dialog .project-visual{position:relative;margin-top:22px;height:300px;border-radius:8px}.project-dialog h2{margin-top:25px;font-size:34px;letter-spacing:-1.5px}.project-dialog .button{margin-top:1.5rem}.contact-result h2{font-size:25px;margin:20px 0}.contact-result p{margin-top:.625rem;font-size:14px}.contact-result .button{transform:none}.toast{position:fixed;bottom:25px;left:50%;max-width:calc(100% - 90px);transform:translate(-50%,20px);opacity:0;pointer-events:none;background:var(--surface);border:1px solid var(--border);color:var(--text);z-index:100;padding:12px 20px;border-radius:8px;font-size:13px;transition:opacity .2s,transform .2s}.toast.visible{opacity:1;transform:translate(-50%)}.noscript-note{position:relative;z-index:2;background-color:var(--surface);padding:25px}.hero-enter{animation:hero-in .85s both}.hero-enter:nth-child(2){animation-delay:.1s}.hero-enter:nth-child(3){animation-delay:.2s}.hero-enter:nth-child(4){animation-delay:.3s}.hero-enter:nth-child(5){animation-delay:.35s}.motion-enabled .reveal{opacity:0;transform:translateY(22px);transition:opacity .6s,transform .6s}.motion-enabled .reveal.visible{opacity:1;transform:translateY(0)}@keyframes hero-in{0%{opacity:0;translate:0 20px}to{opacity:1;translate:0 0}}@keyframes scroll-mouse{50%{transform:translateY(8px);opacity:.5}}@keyframes dialog-in{0%{opacity:0;transform:translateY(12px)}to{opacity:1;transform:translateY(0)}}@media (max-width: 1150px){h1{font-size:8.6vw;letter-spacing:-4px}.keyboard{width:450px;transform:translate(-50%,-50%) scale(.88) rotateX(33deg) rotate(-16deg)}.keycap{height:55px;padding:9px}.keycap img{width:30px;height:30px}.section-heading h2{font-size:62px}.contact-card h3{font-size:30px}.project-meta h3{font-size:18px}.stack-stage-label{left:0}.stack-stage-label strong{font-size:32px}.stack-stage-label span{font-size:20px}}@media (max-width: 759px){.header-square{height:38px;width:38px}.header-square svg{height:22px;width:22px}.header-square[href="#experience"],.header-github span{display:none}#themeToggle{width:22px;margin-right:0}.hero-copy{transform:none}h1{font-size:clamp(42px,17.5vw,88px);letter-spacing:-3px;line-height:1}.hero-links .button{height:2.5rem}.keyboard-scene{height:285px;margin-top:35px}.keyboard{width:430px;transform:translate(-50%,-50%) scale(.65) rotateX(35deg) rotate(-28deg)}.skill-readout{top:auto;bottom:-5px;font-size:11px;left:0}.scroll-cue{bottom:24px}.section-heading h2{font-size:clamp(32px,8.5vw,56px);letter-spacing:-1.6px}.section-heading p{font-size:14px}.stack-stage-label{top:140px;left:10px;transform:rotate(-33deg)}.stack-stage-label strong{font-size:24px;text-shadow:0 2px #777a84,0 4px #424650}.stack-stage-label span{font-size:14px;margin-top:9px}.stack-item img{height:15px;width:15px}.experience-title h3{font-size:16px;letter-spacing:-.5px}.experience-content ul{font-size:14px;line-height:1.65}.tags span{font-size:10px;padding:3px 8px}.project-meta h3{font-size:15px}.project-filters button{font-size:11px;padding:4px 9px}.library-art>span{font-size:45px}.library-art>small{font-size:9px}.library-blocks{gap:4px;margin-top:13px}.library-blocks i{width:24px;height:17px}.invitation-card{padding:6px}.invitation-card>small{font-size:3px;letter-spacing:0}.invitation-card strong{font-size:18px}.invitation-flower{font-size:20px}.invitation-card>span:last-of-type{font-size:3px}.contact-section .section-heading{margin-bottom:2.5rem}.contact-card h3{font-size:25px;letter-spacing:-1px}.contact-card>p{font-size:13px}.form-field label{font-size:12px}.form-field input,.form-field textarea{padding-left:.5rem;padding-right:.5rem;font-size:12px}.contact-keyboard-space{height:340px}.footer-main .wordmark{width:100%;font-size:15px}.footer-main p{font-size:11px;flex:1}.footer-main>a:last-child{font-size:11px}.navigation-dialog nav a{gap:15px;font-size:28px;letter-spacing:-1px}.navigation-dialog nav a>span{font-size:26px}.project-dialog h2{font-size:27px}.project-dialog .project-visual{height:220px}.project-role,.project-source{font-size:12px}.toast{font-size:11px}}@media (max-width: 480px){.header-square{display:none}h1{font-size:clamp(40px,17.5vw,82px)}.keyboard{width:400px;transform:translate(-50%,-50%) scale(.6) rotateX(35deg) rotate(-28deg)}.project-meta h3{font-size:20px}.library-art>span{font-size:62px}.library-art>small{font-size:11px}.invitation-card strong{font-size:25px}.invitation-card>small{font-size:4px}.contact-card h3{font-size:23px}dialog{padding:20px}.navigation-dialog nav a{font-size:23px}.dialog-top,.dialog-close{font-size:11px}}@media (prefers-reduced-motion: reduce){html{scroll-behavior:auto}*,*:before,*:after{animation:none!important;transition:none!important}.motion-enabled .reveal{opacity:1;transform:none}.hero-enter{opacity:1}}@media print{#starfield,#keyboardWebGL,.keyboard-scene,.portfolio-header,.quick-contact,.stack-stage,.project-toolbar,.contact-keyboard-space,.business-details{display:none!important}body{background:#fff;color:#111}body:before{display:none}.hero{height:auto;min-height:0;display:block;padding-block:30px}.hero-copy{transform:none}h1{font-size:55px}.motion-enabled .reveal{opacity:1;transform:none}.stack-section{min-height:0;padding:20px 0}.project-grid{margin-top:30px}.project-card,.experience-row{-moz-column-break-inside:avoid;break-inside:avoid}.section-heading h2{font-size:35px}.contact-layout{display:block}}.contact-message[data-state=error]{border-radius:6px;border-width:1px;border-style:solid;--tw-border-opacity: 1;border-color:rgb(163 80 69 / var(--tw-border-opacity, 1));background-color:#52241f55;--tw-text-opacity: 1;color:rgb(255 192 184 / var(--tw-text-opacity, 1));padding:10px 12px}.contact-message[data-state=success]{border-radius:6px;border-width:1px;border-style:solid;--tw-border-opacity: 1;border-color:rgb(53 124 94 / var(--tw-border-opacity, 1));background-color:#174c3755;--tw-text-opacity: 1;color:rgb(178 242 211 / var(--tw-text-opacity, 1));padding:10px 12px}.contact-result[data-status=error] h2{--tw-text-opacity: 1;color:rgb(255 192 184 / var(--tw-text-opacity, 1))}:root[data-theme=light] .contact-message[data-state=error]{color:#862d24;background:#fff0ed}:root[data-theme=light] .contact-message[data-state=success]{color:#175a3c;background:#e9faf1}:root[data-theme=light] .contact-result[data-status=error] h2{color:#862d24}
