/* Portfolio — giao diện tài liệu kỹ thuật: một họ chữ (IBM Plex Sans), lưới hai cột, ít khung, màu tiết chế */
*{margin:0;padding:0;box-sizing:border-box}
:root{
  --bg:#f4f5f7;--paper:#fff;--ink:#161c26;--mut:#566072;--mut-2:#6b7484;
  --line:#e0e3e9;--line-2:#cdd2db;
  --blue:#0a6a75;--blue-d:#07525b;--blue-soft:#dcefef;--blue-softer:#eef5f6;
  --navy:#161c26;--ok:#1e9e57;
  --btn-bg:#161c26;--btn-fg:#fff;
  --sans:'IBM Plex Sans','Segoe UI',system-ui,-apple-system,sans-serif;--mono:var(--sans);--serif:var(--sans);
  --r-s:6px;--r-m:8px;--r-l:12px;
}
html{scroll-behavior:smooth}
body{font-family:var(--sans);color:var(--ink);background:var(--bg);-webkit-font-smoothing:antialiased;line-height:1.65;overflow-x:hidden;font-size:16px;font-variant-numeric:tabular-nums}
::selection{background:var(--blue);color:#fff}
img{max-width:100%;display:block}a{color:inherit;text-decoration:none}button{font-family:inherit;cursor:pointer}
:focus-visible{outline:2px solid var(--blue);outline-offset:3px;border-radius:4px}
.bg-fx{display:none}
.wrap{max-width:1200px;margin:0 auto;padding:0 32px}
.page{position:relative}
.psec{padding:72px 0;scroll-margin-top:72px}
.hero-sec{padding:56px 0 40px}

/* topbar */
.topbar{position:sticky;top:0;z-index:60;background:color-mix(in srgb,var(--bg) 92%,transparent);backdrop-filter:blur(12px);-webkit-backdrop-filter:blur(12px);border-bottom:1px solid var(--line)}
.topbar-inner{max-width:1200px;margin:0 auto;padding:0 32px;height:64px;display:flex;align-items:center;gap:28px}
.brand{display:flex;align-items:center;gap:10px;flex-shrink:0}
.brand-mark{width:30px;height:30px;border-radius:var(--r-s);background:var(--btn-bg);color:var(--btn-fg);display:grid;place-items:center;font-weight:700;font-size:15px}
.mainnav{display:flex;gap:2px;margin-left:12px}
.mainnav a{font-size:14.5px;font-weight:500;color:var(--mut);padding:8px 12px;border-radius:var(--r-s);transition:color .15s}
.mainnav a:hover{color:var(--ink)}
.mainnav a.active{color:var(--ink);font-weight:600;box-shadow:inset 0 -2px 0 var(--blue);border-radius:0}
.topbar-right{margin-left:auto;display:flex;align-items:center;gap:10px}
.lang-switch{display:flex;border:1px solid var(--line-2);border-radius:var(--r-m);padding:2px}
.lang-switch button{border:0;background:none;font-size:12.5px;font-weight:600;color:var(--mut);padding:5px 10px;border-radius:var(--r-s)}
.lang-switch button.active{background:var(--btn-bg);color:var(--btn-fg)}
.btn-cv{display:inline-flex;align-items:center;gap:8px;background:var(--btn-bg);color:var(--btn-fg);font-size:14px;font-weight:600;padding:9px 16px;border-radius:var(--r-m);transition:background .15s}
.btn-cv:hover{background:var(--blue)}
.theme-btn{width:36px;height:36px;border-radius:var(--r-m);border:1px solid var(--line-2);background:none;color:var(--ink);display:grid;place-items:center;flex-shrink:0}
.theme-btn:hover{border-color:var(--ink)}
.theme-btn svg{width:17px;height:17px}.theme-btn .ic-sun{display:none}
[data-theme="dark"] .theme-btn .ic-sun{display:block}[data-theme="dark"] .theme-btn .ic-moon{display:none}
.menu-btn{display:none;flex-direction:column;gap:5px;padding:10px;background:none;border:0}
.menu-btn span{width:22px;height:2px;background:var(--ink)}
.mobile-nav{display:none;flex-direction:column;padding:6px 24px 14px;background:var(--bg);border-bottom:1px solid var(--line)}
.mobile-nav.open{display:flex}
.mobile-nav a{padding:12px 0;font-weight:500;border-bottom:1px solid var(--line);font-size:15px}.mobile-nav a:last-child{border:0}

/* buttons & links */
.btn-primary,.btn-ghost-w{display:inline-flex;align-items:center;gap:10px;font-weight:600;font-size:15px;padding:13px 22px;border-radius:var(--r-m);transition:background .15s,border-color .15s,color .15s}
.btn-primary{background:var(--btn-bg);color:var(--btn-fg);border:1px solid var(--btn-bg)}
.btn-primary:hover{background:var(--blue);border-color:var(--blue);color:#fff}
.btn-ghost-w{background:none;color:var(--ink);border:1px solid var(--line-2)}
.btn-ghost-w:hover{border-color:var(--ink)}
.ar{width:16px;height:16px;flex-shrink:0;transition:transform .15s}
.btn-primary:hover .ar,.link-arrow:hover .ar{transform:translateX(3px)}
.link-arrow{display:inline-flex;align-items:center;gap:8px;font-weight:600;color:var(--blue);font-size:14.5px}

/* section heading */
.eyebrow{display:block;font-size:14px;font-weight:600;color:var(--blue);margin-bottom:10px}
.sec-head{max-width:640px}
.sec-title{font-size:clamp(26px,2.6vw,34px);font-weight:600;letter-spacing:-.025em;line-height:1.2}
.sec-sub{font-size:18px;color:var(--mut);margin-top:10px}
.sec-sub .hl-b{font-style:normal;font-weight:600;color:var(--ink)}
.sec-desc{color:var(--mut);font-size:15.5px;margin-top:14px;max-width:62ch}
.hand{font-style:normal;font-weight:500}
.rv{opacity:1}

/* sections: tiêu đề cột trái, nội dung cột phải */
.content-card{display:grid;grid-template-columns:260px minmax(0,1fr);column-gap:64px;border-top:1px solid var(--line-2);padding-top:36px}
.content-card .sec-head{grid-column:1;grid-row:1/span 6;position:sticky;top:96px;align-self:start;margin:0}
.content-card>*:not(.sec-head):not(.two-col){grid-column:2}
.two-col,.two-col>div:first-child{display:contents}
.two-col>div:empty{display:none}
.edu-school,.edu-timeline,.edu-quote{grid-column:2}

/* hero */
.hero-grid{display:grid;grid-template-columns:minmax(0,1.25fr) minmax(0,.75fr);gap:64px;align-items:center}
.hero-grid .eyebrow{display:inline-flex;align-items:center;gap:10px;color:var(--mut);font-weight:500;margin-bottom:28px}
.hero-grid .eyebrow::before{content:"";width:8px;height:8px;border-radius:50%;background:var(--ok);box-shadow:0 0 0 4px color-mix(in srgb,var(--ok) 22%,transparent)}
.hero-title{font-size:clamp(48px,7.4vw,104px);font-weight:600;letter-spacing:-.05em;line-height:.98;margin-bottom:28px;animation:rise .7s cubic-bezier(.2,.7,.2,1) both}
.hero-role{font-size:clamp(19px,1.9vw,24px);font-weight:500;line-height:1.45;letter-spacing:-.01em;max-width:34ch;margin-bottom:18px;animation:rise .7s .08s cubic-bezier(.2,.7,.2,1) both}
.hero-role em{font-style:normal;color:inherit;border:0}
.hero-intro{color:var(--mut);font-size:16.5px;max-width:56ch;margin-bottom:30px;animation:rise .7s .14s both}
.hero-cta{display:flex;gap:12px;flex-wrap:wrap;animation:rise .7s .2s both}
@keyframes rise{from{opacity:0;transform:translateY(14px)}to{opacity:1;transform:none}}
.hero-visual{display:flex;flex-direction:column;gap:18px;animation:rise .8s .1s both}
.portrait-card{width:100%;max-width:400px;margin-left:auto}
.portrait-card>img{width:100%;aspect-ratio:4/4.7;object-fit:cover;object-position:center 20%;border-radius:var(--r-l);background:var(--blue-softer)}
.pc-name{padding:14px 0 4px;display:flex;flex-direction:column}
.pc-name span{font-weight:600;font-size:18px;letter-spacing:-.01em}
.pc-name small{font-size:13px;color:var(--mut)}
.pc-avail{display:flex;align-items:center;gap:12px;margin-top:10px;padding:12px 0 0;border-top:1px solid var(--line);font-size:14px}
.pc-avail .up{width:8px;height:8px;border-radius:50%;background:var(--ok);box-shadow:0 0 0 4px color-mix(in srgb,var(--ok) 22%,transparent);flex-shrink:0;margin-left:4px}
.pc-avail b{display:block;font-size:14px}.pc-avail span{color:var(--mut);font-size:13px}.pc-avail .go{margin-left:auto;color:var(--mut-2)}
.hero-pills{display:grid;grid-template-columns:1fr 1fr;gap:0;max-width:400px;margin-left:auto;width:100%;border-top:1px solid var(--line)}
.hpill{display:flex;align-items:center;gap:10px;padding:12px 0;border-bottom:1px solid var(--line)}
.hpill:nth-child(odd){padding-right:12px}
.hpill .ic{width:30px;height:30px;flex-shrink:0;border-radius:var(--r-s);background:var(--blue-soft);color:var(--blue);display:grid;place-items:center}
.hpill .ic svg{width:16px;height:16px}
.hpill b{display:block;font-size:13.5px;line-height:1.3}.hpill span{font-size:12px;color:var(--mut);line-height:1.35;display:block}
.hero-quote{display:none}

/* số liệu: bảng chỉ số cỡ lớn */
.metrics{margin-top:64px;border-top:1px solid var(--ink);border-bottom:1px solid var(--line-2)}
.metrics-head{display:none}
.metrics-grid{display:grid;grid-template-columns:repeat(4,1fr)}
.metric{padding:26px 28px 28px 0;margin-left:0}
.metric+.metric{border-left:1px solid var(--line-2);padding-left:28px}
.metric b{display:block;font-size:clamp(36px,4.4vw,60px);font-weight:600;letter-spacing:-.04em;line-height:1}
.metric span{display:block;font-size:15px;font-weight:600;margin-top:12px}
.metric small{display:block;font-size:13px;color:var(--mut);margin-top:2px}
.hero-cards{display:grid;grid-template-columns:repeat(4,1fr);gap:0;margin-top:0;border-bottom:1px solid var(--line-2)}
.fcard{padding:26px 28px 28px 0;display:flex;flex-direction:column}
.fcard+.fcard{border-left:1px solid var(--line-2);padding-left:28px}
.fcard .fdeco{display:none}
.frow{display:flex;align-items:center;justify-content:space-between;margin-bottom:16px}
.fic{color:var(--blue)}.fic svg{width:24px;height:24px}
.fnum{display:none}
.fcard h3{font-size:17px;font-weight:600;letter-spacing:-.01em;margin-bottom:6px}
.fcard p{font-size:14px;color:var(--mut);flex:1}.flink{margin-top:14px}

/* about / facts */
.fact-grid{display:grid;grid-template-columns:1fr 1fr;gap:0 40px;margin-top:28px}
.fact{display:grid;grid-template-columns:28px 1fr;column-gap:12px;padding:14px 0;border-top:1px solid var(--line);align-items:baseline}
.fact .fi{color:var(--blue);grid-row:1/span 2;align-self:center}.fact .fi svg{width:18px;height:18px}
.fact b{font-size:13px;font-weight:500;color:var(--mut)}.fact span:last-child{font-size:15.5px;font-weight:600}
.about-text p{font-size:17px;line-height:1.7;max-width:66ch}.about-text p+p{margin-top:16px}.about-text+.fact-grid{margin-top:36px}

/* education */
.edu-school{display:flex;gap:16px;align-items:center;margin-bottom:8px}
.edu-school img,.edu-school .sk-ic{width:56px;height:56px;object-fit:contain;flex-shrink:0}
.edu-school h3{font-size:19px;font-weight:600}.edu-school .s1{color:var(--blue);font-weight:600;font-size:14.5px;margin-top:3px}.edu-school .s2{color:var(--mut);font-size:13.5px}
.edu-timeline{margin-top:20px;display:flex;flex-direction:column}
.edu-item{display:grid;grid-template-columns:160px 1fr;gap:18px;padding:18px 0;border-top:1px solid var(--line)}
.ed-date{font-size:13.5px;font-weight:600;color:var(--blue)}
.edu-item h4{font-size:16.5px;font-weight:600;margin-bottom:3px}.edu-item p{font-size:14.5px;color:var(--mut)}
.edu-quote{margin-top:24px;padding:4px 0 4px 20px;border-left:2px solid var(--blue)}
.edu-quote p{font-size:17px;font-weight:500;line-height:1.6}.edu-quote cite{display:block;margin-top:8px;font-style:normal;font-size:13px;color:var(--mut)}

/* experience */
.exp-layout{display:grid;grid-template-columns:minmax(0,1fr) 320px;gap:56px;align-items:start;border-top:1px solid var(--line-2);padding-top:36px}
.exp-hero{display:grid;grid-template-columns:1fr 260px;gap:40px;align-items:end;margin-bottom:44px}
.exp-portrait .portrait-card{display:none}
.exp-pquote{padding-left:16px;border-left:2px solid var(--blue);font-size:15px;font-weight:500}
.timeline{display:flex;flex-direction:column}
.tl-item{display:grid;grid-template-columns:170px 1fr;position:relative;padding-bottom:36px}
.tl-item:last-child{padding-bottom:0}
.tl-item::before{content:"";position:absolute;left:170px;top:8px;bottom:-8px;width:1px;background:var(--line-2)}
.tl-item:last-child::before{display:none}
.tl-dot{position:absolute;left:165px;top:6px;width:11px;height:11px;border-radius:50%;background:var(--blue);box-shadow:0 0 0 4px var(--bg);z-index:1}
.tl-date{padding-right:30px;text-align:right}.tl-date b{display:block;font-size:14px;font-weight:600}.tl-date span{font-size:13px;color:var(--mut)}
.job-card{margin-left:34px;background:var(--paper);border:1px solid var(--line);border-radius:var(--r-l);padding:28px}
.job-top{display:flex;gap:16px;align-items:flex-start;margin-bottom:16px}
.job-logo{width:48px;height:48px;flex-shrink:0;border-radius:var(--r-m);display:grid;place-items:center;font-weight:700;font-size:17px;background:var(--navy);color:#fff}
.job-logo.red{background:#b3261e}
.job-card h3{font-size:20px;font-weight:600;letter-spacing:-.015em}.job-card .co{font-size:15px;font-weight:600;color:var(--blue);margin-top:2px}
.job-meta{display:flex;gap:16px;margin-top:6px;flex-wrap:wrap}
.job-meta>span{display:inline-flex;align-items:center;gap:6px;font-size:13px;color:var(--mut);white-space:nowrap}.job-meta svg{width:14px;height:14px}
.job-desc{color:var(--mut);font-size:15px;margin-bottom:14px;max-width:66ch}
.job-chips,.job-techs{display:flex;flex-wrap:wrap;gap:6px;margin-bottom:6px}
.chip{display:inline-flex;align-items:center;gap:6px;font-size:12.5px;font-weight:500;color:var(--mut);background:var(--blue-softer);border:1px solid var(--line);border-radius:var(--r-s);padding:3px 10px}
.chip svg{width:13px;height:13px;color:var(--blue)}
.job-body{display:flex;flex-direction:column;gap:18px}
.job-media{margin:0}.job-media img{width:100%;aspect-ratio:21/9;object-fit:cover;border-radius:var(--r-m)}
.job-media figcaption{font-size:12.5px;color:var(--mut-2);margin-top:6px}
.job-stats{display:grid;grid-template-columns:repeat(3,1fr);border-top:1px solid var(--line);margin-top:20px;padding-top:18px;gap:16px}
.jstat{display:flex;gap:10px;align-items:center}.jstat .ji{color:var(--blue)}.jstat .ji svg{width:18px;height:18px}
.jstat b{display:block;font-size:20px;font-weight:600;letter-spacing:-.02em}.jstat span{font-size:12.5px;color:var(--mut)}
.job-foot{margin-top:20px;padding-top:18px;border-top:1px solid var(--line)}
.exp-side{display:flex;flex-direction:column;gap:28px;position:sticky;top:96px}
.side-card h3{font-size:15px;font-weight:600;display:flex;align-items:center;gap:8px;margin-bottom:4px}
.side-card h3 .sic{color:var(--blue);display:grid}.side-card h3 .sic svg{width:17px;height:17px}
.viewall{margin-left:auto;font-size:13px;font-weight:600;color:var(--blue)}
.ssub{font-size:13.5px;color:var(--mut);margin-bottom:10px}
.core-row{display:flex;align-items:center;gap:12px;padding:12px 0;border-top:1px solid var(--line)}
.core-row .ic{color:var(--blue);display:grid}.core-row .ic svg{width:18px;height:18px}
.core-row b{display:block;font-size:14.5px}.core-row span{font-size:12.5px;color:var(--mut)}.core-row .n{display:none}
.goal-text{font-size:14.5px;color:var(--mut)}
.quote-card{padding:20px 22px;border-radius:var(--r-l);background:var(--navy);color:#dfe5ee}
.quote-card .qmark{display:none}.quote-card .hand{font-size:16px;line-height:1.6;color:#fff}.quote-card .qby{display:block;margin-top:10px;font-size:12.5px;color:#9aa6b8}

/* skills: danh sách dạng bảng */
.skills-grid{display:grid;grid-template-columns:1fr 1fr;gap:0 40px;margin-top:28px}
.skill-card{padding:16px 0;border-top:1px solid var(--line)}
.sk-top{display:flex;gap:12px;align-items:center;margin-bottom:4px}
.sk-ic{width:28px;height:28px;color:var(--blue);display:grid;place-items:center;flex-shrink:0}.sk-ic svg{width:20px;height:20px}
.skill-card h4{font-size:15.5px;font-weight:600;line-height:1.35}.sk-cat{font-size:12.5px;color:var(--mut)}
.skill-card p{font-size:13.5px;color:var(--mut);margin:4px 0 0 40px}
.sk-bar{height:4px;background:var(--line);border-radius:2px;margin:10px 0 0 40px;overflow:hidden}.sk-bar i{display:block;height:100%;background:var(--blue)}

/* projects */
.proj-hero{display:grid;grid-template-columns:minmax(0,1fr) 360px;gap:56px;align-items:center;margin-bottom:36px;border-top:1px solid var(--line-2);padding-top:36px}
.proj-side{border-radius:var(--r-l);overflow:hidden;border:1px solid var(--line);background:var(--paper)}
.proj-side>img{width:100%;aspect-ratio:16/9;object-fit:cover}
.ps-quote{padding:16px 20px 0;font-size:14.5px;color:var(--mut)}
.proj-stats{display:grid;grid-template-columns:repeat(3,1fr);padding:16px 20px 20px;gap:12px}
.pstat .pi{display:none}.pstat b{display:block;font-size:22px;font-weight:600;letter-spacing:-.02em}.pstat .pt{display:block;font-size:12.5px;font-weight:600}.pstat .ps{display:block;font-size:12px;color:var(--mut)}
.proj-tools{display:flex;align-items:center;gap:14px;flex-wrap:wrap;margin-bottom:24px}
.filter-pills{display:flex;gap:6px;flex-wrap:wrap}
.fpill{display:inline-flex;align-items:center;gap:7px;font-size:13.5px;font-weight:500;color:var(--mut);background:none;border:1px solid var(--line-2);border-radius:var(--r-m);padding:7px 13px}
.fpill svg{width:14px;height:14px}.fpill:hover{color:var(--ink);border-color:var(--ink)}
.fpill.active{background:var(--btn-bg);border-color:var(--btn-bg);color:var(--btn-fg)}
.proj-search{margin-left:auto;display:flex;gap:8px;align-items:center}
.search-box{display:flex;align-items:center;gap:8px;border:1px solid var(--line-2);border-radius:var(--r-m);padding:7px 12px;min-width:220px;background:var(--paper)}
.search-box svg{width:15px;height:15px;color:var(--mut-2)}.search-box input{border:0;background:none;outline:0;font:inherit;font-size:13.5px;width:100%;color:var(--ink)}
.sort-sel{font:inherit;font-size:13.5px;color:var(--ink);background:var(--paper);border:1px solid var(--line-2);border-radius:var(--r-m);padding:7px 10px}
.proj-grid{display:grid;grid-template-columns:repeat(3,1fr);gap:20px}
.pcard{background:var(--paper);border:1px solid var(--line);border-radius:var(--r-l);padding:14px 14px 10px;cursor:pointer;position:relative;display:flex;flex-direction:column;transition:border-color .15s}
.pcard:hover{border-color:var(--ink)}
.pimg{position:relative;margin-bottom:16px;border-radius:var(--r-m);overflow:hidden;background:var(--blue-softer)}
.pimg img{width:100%;aspect-ratio:16/10;object-fit:cover}
.pnum{position:absolute;top:10px;left:10px;z-index:2;font-size:12px;font-weight:600;background:var(--paper);border-radius:var(--r-s);padding:2px 8px}
.pimg-tag{display:none}
.pcat{margin-bottom:8px}.pcat .chip{background:none;border:0;padding:0;color:var(--blue);font-weight:600;font-size:13px}
.pcard h3{font-size:18px;font-weight:600;letter-spacing:-.015em;margin-bottom:8px;line-height:1.35}
.pdesc{font-size:14px;color:var(--mut);margin-bottom:14px;flex:1}
.ptags{display:flex;flex-wrap:wrap;gap:6px;margin-bottom:14px}
.pfoot{border-top:1px solid var(--line);padding:12px 0 2px}.pfic{display:none}
.pcard-empty{grid-column:1/-1;text-align:center;color:var(--mut);padding:56px;border:1px dashed var(--line-2);border-radius:var(--r-l)}
.proj-cta{margin-top:40px;background:var(--navy);border-radius:var(--r-l);padding:36px 40px;color:#fff;display:flex;align-items:center;gap:24px}
.proj-cta .ci{color:#fff;display:grid}.proj-cta .ci svg{width:28px;height:28px}
.proj-cta b{display:block;font-size:21px;font-weight:600;letter-spacing:-.02em}.proj-cta p{color:#a6b2c4;font-size:15px;margin-top:4px;max-width:52ch}
.proj-cta .btn-primary{margin-left:auto;flex-shrink:0;background:#fff;border-color:#fff;color:var(--navy)}
.proj-cta .btn-primary:hover{background:var(--blue-soft);border-color:var(--blue-soft);color:var(--navy)}

/* modal */
.pmodal{position:fixed;inset:0;z-index:100;display:none;align-items:flex-start;justify-content:center;padding:32px 16px;overflow-y:auto}
.pmodal.open{display:flex}
.pmodal-backdrop{position:fixed;inset:0;background:rgba(12,18,28,.6);backdrop-filter:blur(3px)}
.pmodal-dialog{position:relative;background:var(--paper);border-radius:var(--r-l);max-width:1020px;width:100%;box-shadow:0 30px 80px -20px rgba(0,0,0,.4);overflow:hidden}
.pmodal-topbar{display:flex;align-items:center;gap:14px;padding:14px 24px;border-bottom:1px solid var(--line)}
.pmodal-badge{display:inline-flex;align-items:center;gap:8px;font-size:13px;font-weight:500;color:var(--mut)}
.pmodal-badge b{color:var(--ink);font-weight:600}.pmodal-badge i{font-style:normal;color:var(--line-2)}
.pmodal-gear{display:none}
.pmodal-nav{margin-left:auto;display:flex;gap:8px}
.pm-navbtn{display:inline-flex;align-items:center;gap:8px;font-size:13px;font-weight:500;color:var(--mut);background:none;border:1px solid var(--line-2);border-radius:var(--r-m);padding:7px 12px}
.pm-navbtn:hover,.pmodal-close:hover{color:var(--ink);border-color:var(--ink)}
.pmodal-close{width:34px;height:34px;border-radius:var(--r-m);border:1px solid var(--line-2);background:none;font-size:14px;color:var(--mut);display:grid;place-items:center}
.pmodal-body{padding:36px 40px;max-height:calc(100vh - 170px);overflow-y:auto}
.pm-title{font-size:30px;font-weight:600;letter-spacing:-.025em;margin-bottom:12px;line-height:1.2}
.pm-chips{display:flex;gap:6px;flex-wrap:wrap;margin-bottom:26px}
.pm-grid{display:grid;grid-template-columns:1fr 1fr;gap:40px}
.pm-sec{margin-bottom:26px}
.pm-sec h4{display:flex;align-items:center;gap:8px;font-size:15px;font-weight:600;margin-bottom:10px}
.pm-sec h4 .sic{color:var(--blue);display:grid}.pm-sec h4 .sic svg{width:17px;height:17px}
.pm-sec p{color:var(--mut);font-size:15px}.pm-tools{display:flex;flex-wrap:wrap;gap:6px}
.pm-result{background:var(--blue-softer);border-radius:var(--r-m);padding:20px}
.pm-result .hand{display:block;font-size:16px;border-top:1px solid var(--line-2);padding-top:14px;margin-top:4px}
.pm-heroimg{position:relative;border-radius:var(--r-m);overflow:hidden;margin-bottom:24px}.pm-heroimg>img{width:100%;aspect-ratio:16/10;object-fit:cover}
.pm-float{position:absolute;display:flex;align-items:center;gap:8px;background:var(--paper);border-radius:var(--r-m);padding:6px 12px;font-size:12.5px}
.pm-float.f1{left:12px;top:12px}.pm-float.f2{right:12px;top:40%}.pm-float.f3{left:12px;bottom:12px}
.pm-float .fi{color:var(--blue);display:grid}.pm-float .fi svg{width:14px;height:14px}.pm-float b{display:block;font-size:12.5px}.pm-float span{font-size:11px;color:var(--mut)}
.pm-step{display:flex;gap:14px;padding:13px 0;border-top:1px solid var(--line)}.pm-step:first-child{border:0;padding-top:0}
.pm-step .n{font-size:13px;font-weight:600;color:var(--blue);min-width:24px}.pm-step p{font-size:14.5px;color:var(--ink)}

/* activities */
.act-grid{display:grid;grid-template-columns:repeat(3,1fr);gap:0 32px;margin-top:28px}
.act-card{padding:18px 0 0;border-top:1px solid var(--line)}
.act-card .ai{color:var(--blue);display:block;margin-bottom:12px}.act-card .ai svg{width:22px;height:22px}
.act-card h4{font-size:16.5px;font-weight:600}.aper{font-size:13px;color:var(--blue);font-weight:500}
.act-card p{font-size:14px;color:var(--mut);margin-top:8px}

/* contact */
.contact-sec{padding-bottom:88px}
.contact-card{border-top:1px solid var(--ink);padding-top:36px;display:grid;grid-template-columns:minmax(0,1fr) minmax(0,1fr);gap:40px 64px}
.contact-card .sec-head{max-width:none}.contact-card .sec-title{font-size:clamp(32px,4vw,52px);letter-spacing:-.035em;line-height:1.08}
.contact-card .sec-desc{margin-left:0!important}
.contact-rows{display:flex;flex-direction:column;margin:0}
.contact-item{display:flex;align-items:center;gap:14px;font-size:16px;font-weight:500;padding:16px 0;border-top:1px solid var(--line)}
.contact-item:last-child{border-bottom:1px solid var(--line)}
a.contact-item:hover{color:var(--blue)}
.contact-item .ci{color:var(--blue);display:grid}.contact-item .ci svg{width:19px;height:19px}
.socials{display:flex;gap:8px;grid-column:2}
.socials a{width:38px;height:38px;border-radius:var(--r-m);border:1px solid var(--line-2);display:grid;place-items:center;font-weight:600;color:var(--mut);font-size:14px}
.socials a:hover{border-color:var(--ink);color:var(--ink)}
/* form liên hệ */
.contact-form{grid-column:1/-1;max-width:640px;text-align:left}
.cf-row{display:grid;grid-template-columns:1fr 1fr;gap:16px}
.contact-form label{display:block;font-size:13.5px;font-weight:600;color:var(--ink);margin-bottom:14px}
.contact-form label>span{display:block;margin-bottom:7px}
.contact-form input[type="text"],.contact-form input[type="email"],.contact-form textarea{width:100%;padding:12px 14px;border:1px solid var(--line-2);border-radius:var(--r-m);background:var(--paper);color:var(--ink);font:inherit;font-size:15px}
.contact-form textarea{resize:vertical;min-height:120px}
.contact-form input:focus,.contact-form textarea:focus{outline:none;border-color:var(--blue);box-shadow:0 0 0 3px var(--blue-softer)}
.cf-hp{position:absolute!important;left:-9999px!important;opacity:0!important;height:0!important;width:0!important}
.cf-foot{display:flex;align-items:center;gap:16px;flex-wrap:wrap;margin-top:4px}
.cf-msg{font-size:14px;color:var(--mut)}
.cf-msg.ok{color:var(--ok)}
.cf-msg.err{color:#c24141}
.btn-primary:disabled{opacity:.6;cursor:default;transform:none}
@media(max-width:640px){.cf-row{grid-template-columns:1fr}}

.footer{border-top:1px solid var(--line);color:var(--mut);padding:26px 0;font-size:13.5px}
.footer .wrap{display:flex;flex-wrap:wrap;align-items:center;gap:10px}.footer b{color:var(--ink);font-weight:600}
.f-copy{margin-right:auto}
.f-sys{display:inline-flex;align-items:center;gap:8px;white-space:nowrap}
.f-sys i{width:7px;height:7px;border-radius:50%;background:var(--ok);animation:led 2.4s ease-in-out infinite}
.f-sys:empty{display:none}
.f-stats{width:100%;display:flex;flex-wrap:wrap;align-items:center;gap:8px 0;border-top:1px solid var(--line-2);margin-top:6px;padding-top:14px}
.f-stats:empty{display:none}
.f-stats .visits{display:inline-flex;gap:20px;flex-wrap:wrap}
.f-stats .visits b{color:var(--ink);font-weight:600}
.f-stats .visits-online{display:inline-flex;align-items:center;gap:7px;margin-left:20px;padding-left:20px;border-left:1px solid var(--line-2)}
.f-stats .visits-src{margin-left:20px;padding-left:20px;border-left:1px solid var(--line-2)}
.f-stats .visits-src b{color:var(--ink);font-weight:600}
.to-top{position:fixed;right:24px;bottom:24px;width:42px;height:42px;border-radius:var(--r-m);border:1px solid var(--line-2);background:var(--paper);color:var(--ink);display:grid;place-items:center;opacity:0;pointer-events:none;transition:opacity .2s;z-index:50}
.to-top.show{opacity:1;pointer-events:auto}.to-top:hover{border-color:var(--ink)}

@media(max-width:1100px){
  .hero-grid{grid-template-columns:1fr;gap:40px;align-items:start}.portrait-card,.hero-pills{margin-left:0}
  .hero-cards{grid-template-columns:repeat(2,1fr)}.fcard:nth-child(3){border-left:0;padding-left:0}.fcard:nth-child(n+3){border-top:1px solid var(--line-2)}
  .exp-layout{grid-template-columns:1fr}.exp-side{position:static;display:grid;grid-template-columns:1fr 1fr;gap:28px}.quote-card{grid-column:1/-1}
  .proj-grid{grid-template-columns:repeat(2,1fr)}.proj-hero{grid-template-columns:1fr}
}
@media(max-width:1024px){.mainnav{display:none}.menu-btn{display:flex}}
@media(max-width:900px){
  .mainnav{display:none}.menu-btn{display:flex}
  .content-card{display:block}.content-card .sec-head{position:static;margin-bottom:24px}
  .exp-hero{grid-template-columns:1fr}.pm-grid,.contact-card{grid-template-columns:1fr}.socials{grid-column:1}
  .proj-cta{flex-direction:column;align-items:flex-start}.proj-cta .btn-primary{margin-left:0}
  .pmodal-nav{display:flex}.pm-navbtn span{display:none}.proj-search{margin-left:0;width:100%}.search-box{flex:1}
}
@media(max-width:640px){
  .psec{padding:52px 0}.wrap,.topbar-inner{padding:0 20px}.topbar-inner{gap:12px}.topbar .btn-cv{display:none}
  .metrics-grid{grid-template-columns:1fr 1fr}.metric:nth-child(3){border-left:0;padding-left:0}.metric:nth-child(n+3){border-top:1px solid var(--line-2)}
  .hero-cards,.proj-grid,.skills-grid,.act-grid,.fact-grid,.exp-side{grid-template-columns:1fr}
  .fcard+.fcard{border-left:0;padding-left:0;border-top:1px solid var(--line-2)}
  .tl-item{grid-template-columns:1fr;padding-left:26px}.tl-item::before{left:5px}.tl-dot{left:0}
  .tl-date{text-align:left;padding:0 0 12px}.job-card{margin-left:0;padding:22px}.job-stats{grid-template-columns:1fr 1fr}
  .edu-item{grid-template-columns:1fr;gap:4px}.pmodal{padding:12px 8px}.pmodal-body{padding:24px 20px}.pm-title{font-size:24px}
  .proj-cta{padding:28px 24px}
}
@media(prefers-reduced-motion:reduce){html{scroll-behavior:auto}*{animation:none!important;transition:none!important}}

/* tối */
[data-theme="dark"]{color-scheme:dark;
  --bg:#0e1218;--paper:#151b24;--ink:#eef1f6;--mut:#a1abbb;--mut-2:#7d8899;--line:#232b38;--line-2:#34404f;
  --blue:#5cc4cc;--blue-d:#8adce2;--blue-soft:#17323a;--blue-softer:#13212a;--navy:#1a2230;--btn-bg:#eef1f6;--btn-fg:#10151d}
[data-theme="dark"] .btn-cv:hover,[data-theme="dark"] .btn-primary:hover{color:#10151d}
[data-theme="dark"] .proj-cta,[data-theme="dark"] .quote-card{border:1px solid var(--line-2)}
[data-theme="dark"] .proj-cta .btn-primary{color:#10151d}
[data-theme="dark"] .pmodal-backdrop{background:rgba(3,6,12,.72)}
[data-theme="dark"] .portrait-card>img{filter:saturate(.95)}

/* ===== Hiệu ứng công nghệ (fx.js) ===== */
.hero-sec{position:relative;overflow:hidden}
.fx-net{position:absolute;inset:0;width:100%;height:100%;z-index:0;pointer-events:none;
  -webkit-mask-image:linear-gradient(#000 60%,transparent);mask-image:linear-gradient(#000 60%,transparent)}
.hero-sec .wrap{position:relative;z-index:1}
.scroll-bar{position:fixed;top:0;left:0;right:0;height:2px;background:var(--blue);transform:scaleX(0);transform-origin:0 50%;z-index:90;pointer-events:none}
/* reveal khi cuộn */
.fx-on .rv:not(.in){opacity:0;transform:translateY(18px)}
.fx-on .rv{transition:opacity .6s ease,transform .6s cubic-bezier(.2,.7,.2,1)}
.fx-on .rv:nth-child(2){transition-delay:.06s}.fx-on .rv:nth-child(3){transition-delay:.12s}.fx-on .rv:nth-child(4){transition-delay:.18s}
/* đèn rê chuột */
.pcard,.fcard,.job-card,.side-card,.proj-side{position:relative;--mx:50%;--my:50%}
.pcard::after,.job-card::after,.proj-side::after{content:"";position:absolute;inset:0;border-radius:inherit;pointer-events:none;opacity:0;transition:opacity .25s;
  background:radial-gradient(320px circle at var(--mx) var(--my),color-mix(in srgb,var(--blue) 16%,transparent),transparent 70%)}
.pcard:hover::after,.job-card:hover::after,.proj-side:hover::after{opacity:1}
.pcard:hover{border-color:var(--blue);box-shadow:0 0 0 1px var(--blue),0 18px 40px -24px color-mix(in srgb,var(--blue) 60%,transparent)}
.pcard .pimg img{transition:transform .5s cubic-bezier(.2,.7,.2,1)}.pcard:hover .pimg img{transform:scale(1.04)}
/* khung HUD + vạch quét trên ảnh chân dung */
.hero-visual .portrait-card::before,.hero-visual .portrait-card::after{content:"";position:absolute;left:0;right:0;top:0;aspect-ratio:4/4.7;border-radius:var(--r-l);pointer-events:none}
.hero-visual .portrait-card::before{inset:12px 12px auto 12px;width:auto;aspect-ratio:auto;height:calc((100% - 0px)*0);
  height:0;padding-bottom:calc(117.5% - 24px);
  background:linear-gradient(#fff,#fff) 0 0/22px 2px,linear-gradient(#fff,#fff) 0 0/2px 22px,linear-gradient(#fff,#fff) 100% 0/22px 2px,linear-gradient(#fff,#fff) 100% 0/2px 22px,
  linear-gradient(#fff,#fff) 0 100%/22px 2px,linear-gradient(#fff,#fff) 0 100%/2px 22px,linear-gradient(#fff,#fff) 100% 100%/22px 2px,linear-gradient(#fff,#fff) 100% 100%/2px 22px;background-repeat:no-repeat;border-radius:6px;opacity:.9}
.hero-visual .portrait-card::after{overflow:hidden;
  background:linear-gradient(180deg,transparent,color-mix(in srgb,var(--blue) 18%,transparent) 50%,transparent) 0 -40%/100% 30% no-repeat;
  animation:scan 4.5s ease-in-out infinite}
@keyframes scan{0%{background-position:0 -40%}60%,100%{background-position:0 140%}}
/* LED nhấp nháy */
.hero-grid .eyebrow::before,.pc-avail .up{animation:led 2.4s ease-in-out infinite}
@keyframes led{50%{box-shadow:0 0 0 7px color-mix(in srgb,var(--ok) 0%,transparent)}}
/* tiêu đề hero: vạch con trỏ */
.hero-title::after{content:"";display:inline-block;width:.07em;height:.78em;margin-left:.08em;background:var(--blue);vertical-align:baseline;animation:blink 1.1s steps(1) infinite}
@keyframes blink{50%{opacity:0}}
.tl-dot{animation:pulse 2.6s ease-out infinite}
@keyframes pulse{0%{box-shadow:0 0 0 4px var(--bg),0 0 0 4px color-mix(in srgb,var(--blue) 50%,transparent)}100%{box-shadow:0 0 0 4px var(--bg),0 0 0 14px transparent}}

/* ===== Lớp 2: toàn trang ===== */
.bg-fx{display:block;position:fixed;inset:0;z-index:-1;pointer-events:none;
  background-image:linear-gradient(color-mix(in srgb,var(--blue) 9%,transparent) 1px,transparent 1px),linear-gradient(90deg,color-mix(in srgb,var(--blue) 9%,transparent) 1px,transparent 1px);
  background-size:48px 48px;
  -webkit-mask-image:radial-gradient(320px circle at var(--gx,50%) var(--gy,20%),#000,transparent);mask-image:radial-gradient(320px circle at var(--gx,50%) var(--gy,20%),#000,transparent)}
.hero-visual .portrait-card{transition:transform .25s ease-out;will-change:transform}
.btn-primary,.btn-ghost-w,.btn-cv{position:relative;overflow:hidden;transition:transform .2s ease-out,background .15s,border-color .15s,color .15s}
.btn-primary::before,.btn-cv::before{content:"";position:absolute;top:0;bottom:0;left:-60%;width:40%;background:linear-gradient(100deg,transparent,rgba(255,255,255,.35),transparent);transform:skewX(-20deg);transition:left .6s}
.btn-primary:hover::before,.btn-cv:hover::before{left:130%}
.ticker{overflow:hidden;border-block:1px solid var(--line);background:var(--paper);padding:14px 0;margin-top:8px;
  -webkit-mask-image:linear-gradient(90deg,transparent,#000 8%,#000 92%,transparent);mask-image:linear-gradient(90deg,transparent,#000 8%,#000 92%,transparent)}
.ticker-track{display:flex;gap:44px;width:max-content;animation:marq 48s linear infinite}
.ticker:hover .ticker-track{animation-play-state:paused}
.ticker span{font-size:14px;font-weight:500;color:var(--mut);white-space:nowrap;display:inline-flex;align-items:center;gap:44px}
.ticker span::after{content:"";width:5px;height:5px;border-radius:50%;background:var(--blue);opacity:.6}
@keyframes marq{to{transform:translateX(-50%)}}
@supports (animation-timeline:view()){
  .tl-item::before{transform-origin:top;animation:draw linear both;animation-timeline:view();animation-range:entry 10% cover 60%}
  @keyframes draw{from{transform:scaleY(0)}to{transform:scaleY(1)}}
}
.skill-card h4,.act-card h4{transition:color .15s}.skill-card:hover h4,.act-card:hover h4{color:var(--blue)}
.skill-card .sk-ic,.act-card .ai{transition:transform .25s}.skill-card:hover .sk-ic,.act-card:hover .ai{transform:translateY(-2px) scale(1.12)}
.fcard{transition:background .2s}.fcard:hover{background:linear-gradient(180deg,transparent,var(--blue-softer))}
.fcard::after{content:"";position:absolute;left:0;right:0;top:-1px;height:2px;background:var(--blue);transform:scaleX(0);transform-origin:0 50%;transition:transform .4s}
.fcard:hover::after{transform:scaleX(1)}
@media(max-width:900px){.f-stats{gap:8px 20px}.f-stats .visits-online,.f-stats .visits-src{margin-left:0;padding-left:0;border-left:0}}

/* ===== Tinh chỉnh index ===== */
.contact-card .sec-head{grid-row:1/span 3;position:sticky;top:96px;align-self:start}
.contact-form{grid-column:2;max-width:none;margin-top:12px}
.contact-form input[type="text"],.contact-form input[type="email"],.contact-form textarea{font:inherit;font-size:15px;font-weight:400;color:var(--ink);line-height:1.5}
.contact-form ::placeholder{color:var(--mut-2);font-weight:400;opacity:1}
.visits-online .od{width:8px;height:8px;border-radius:50%;background:var(--ok);box-shadow:0 0 0 3px color-mix(in srgb,var(--ok) 25%,transparent);animation:led 2.4s ease-in-out infinite}
@media(max-width:900px){.contact-card .sec-head{grid-row:auto;position:static}.contact-form{grid-column:1}}
@media(pointer:coarse){.lang-switch button{min-height:36px;min-width:42px}.link-arrow,.viewall{min-height:44px;display:inline-flex;align-items:center}.fpill{min-height:40px}.theme-btn{width:40px;height:40px}}
