:root{--bg:#02060b;--panel:#06111b;--line:rgba(255,200,60,.28);--line2:rgba(255,200,60,.5);--txt:#f4f7ff;--muted:#aab2c0;--dim:#697380;--cyan:#41dcff;--violet:#70A030;--green:#70A030;--amber:#ffb921;--orange:#70A030;--mono:'Share Tech Mono',monospace;--display:'Rajdhani',system-ui,sans-serif}*{box-sizing:border-box}html{scroll-behavior:smooth}body{margin:0;background:radial-gradient(circle at 70% 20%,#0b1422 0,#02060b 45%,#010307 100%);color:var(--txt);font-family:var(--display);overflow-x:hidden}#webgl{position:fixed;inset:0;z-index:0;pointer-events:none}.noise,.scanlines{position:fixed;inset:0;pointer-events:none;z-index:6}.noise{opacity:.08;background-image:url('data:image/svg+xml,%3Csvg viewBox=%220 0 200 200%22 xmlns=%22http://www.w3.org/2000/svg%22%3E%3Cfilter id=%22n%22%3E%3CfeTurbulence type=%22fractalNoise%22 baseFrequency=%22.9%22 numOctaves=%222%22 stitchTiles=%22stitch%22/%3E%3C/filter%3E%3Crect width=%22100%25%22 height=%22100%25%22 filter=%22url(%23n)%22/%3E%3C/svg%3E')}.scanlines{opacity:.16;background:linear-gradient(rgba(255,255,255,.04) 1px,transparent 1px);background-size:100% 4px}.cursor{position:fixed;width:22px;height:22px;border:1px solid var(--cyan);border-radius:50%;z-index:99;pointer-events:none;transform:translate(-50%,-50%);box-shadow:0 0 20px var(--cyan);transition:width .2s,height .2s}.interface{position:relative;z-index:3;width:calc(100% - 72px);margin:16px auto 44px;border:1px solid rgba(137,232,255,.16);box-shadow:0 0 0 1px rgba(255,255,255,.04) inset,0 40px 120px rgba(0,0,0,.65);background:linear-gradient(180deg,rgba(3,8,14,.86),rgba(2,6,11,.92));min-height:100vh}.interface:before{content:"";position:absolute;inset:0;background-image:linear-gradient(to right,rgba(137,232,255,.09) 1px,transparent 1px),linear-gradient(to bottom,rgba(137,232,255,.07) 1px,transparent 1px);background-size:20vw 180px;mask-image:linear-gradient(#000,transparent 86%);pointer-events:none}.browser-bar{height:34px;border-bottom:1px solid rgba(137,232,255,.15);display:flex;align-items:center;justify-content:space-between;padding:0 20px;font:13px var(--mono);color:#8d98a6;background:rgba(0,0,0,.32)}.browser-bar i{display:inline-block;width:11px;height:11px;margin-left:18px;border:1px solid #7c8795}.topnav{position:sticky;top:0;z-index:10;margin:0 56px;height:96px;display:grid;grid-template-columns:330px 1fr 190px;align-items:center;background:rgba(3,8,14,.88);backdrop-filter:blur(16px)}.panel-line{border-bottom:1px solid var(--line)}.brand{text-decoration:none;color:#fff;display:grid;grid-template-columns:44px 1fr;column-gap:16px;align-items:center}.focus-mark{width:38px;height:38px;display:block;position:relative}.focus-mark:before,.focus-mark:after{content:"";position:absolute;width:13px;height:13px;border-color:#fff}.focus-mark:before{left:0;top:0;border-left:3px solid;border-top:3px solid}.focus-mark:after{right:0;bottom:0;border-right:3px solid;border-bottom:3px solid}.brand strong{font:700 29px/1 var(--mono);letter-spacing:.03em}.brand em{grid-column:2;font:14px var(--mono);color:#7f8998;letter-spacing:.22em;font-style:normal}.brand small{display:inline-block;width:8px;height:8px;border-radius:50%;background:var(--green);box-shadow:0 0 15px var(--green)}nav{display:grid;grid-template-columns:repeat(7,1fr);height:100%}nav a{position:relative;text-decoration:none;color:#c0c7d2;font:13px var(--mono);text-transform:uppercase;display:flex;flex-direction:column;justify-content:center;gap:14px;padding-left:18px}nav a small{color:#9099a7}nav a.active,nav a:hover{color:#70A030}nav a.active:after{content:"";position:absolute;left:0;right:20px;bottom:0;height:3px;background:linear-gradient(90deg,var(--violet),var(--cyan))}.download{justify-self:end;border:1px solid var(--violet);color:#fff;text-decoration:none;padding:18px 22px;font:700 15px var(--mono);text-transform:uppercase;clip-path:polygon(0 0,100% 0,100% 72%,92% 100%,0 100%);box-shadow:0 0 30px rgba(112, 160, 48,.12) inset}.section-grid{position:relative;display:grid;grid-template-columns:1.05fr .45fr 1fr;min-height:560px;padding:54px 72px 28px}.eyebrow{font:700 20px var(--mono);color:#70A030;text-transform:uppercase;margin-bottom:26px}.hero h1{margin:0;font:700 clamp(40px,4.4vw,78px)/.94 var(--mono);letter-spacing:-.06em;text-transform:uppercase;text-shadow:0 0 20px rgba(255,255,255,.12)}.hero h1 span{display:block}.lead{max-width:620px;margin:28px 0 0;color:#b7c0cc;font:18px/1.5 var(--mono)}.actions{display:flex;gap:28px;margin:34px 0}.btn{display:inline-flex;align-items:center;justify-content:space-between;gap:36px;min-width:230px;text-decoration:none;text-transform:uppercase;font:700 17px var(--mono);padding:20px 24px;border:1px solid var(--line2);color:#fff;clip-path:polygon(0 0,94% 0,100% 28%,100% 100%,0 100%);transition:.25s}.btn.primary{border-color:var(--violet);box-shadow:inset 0 0 0 1px rgba(65,220,255,.34),0 0 28px rgba(112, 160, 48,.12)}.btn:hover{transform:translateY(-3px);box-shadow:0 0 32px rgba(65,220,255,.22)}.tech-stack{display:flex;flex-wrap:wrap;gap:12px;align-items:center;margin-top:42px}.tech-stack strong{width:100%;font:13px var(--mono);color:#77828f;text-transform:uppercase}.tech-stack span,.chips li{border:1px solid rgba(137,232,255,.18);background:rgba(3,11,18,.55);padding:13px 18px;color:#aeb6c4;font:16px var(--mono)}.hero-center{position:relative;min-height:460px}.robot-stage{position:absolute;left:36%;top:44%;width:430px;height:430px;transform:translate(-50%,-50%);perspective:1100px}.robot{position:absolute;left:50%;top:48%;width:400px;height:520px;transform:translate(-50%,-50%);transform-style:preserve-3d;transition:transform .08s linear}.head-back{position:absolute;left:135px;top:33px;width:232px;height:172px;border-radius:42px;background:linear-gradient(135deg,#1b1b20,#09090d);box-shadow:32px 10px 28px rgba(0,0,0,.48)}.head{position:absolute;left:78px;top:48px;width:250px;height:205px;border-radius:50px;padding:15px;background:linear-gradient(130deg,#57f5ee 0%,#895cff 30%,#6a45df 45%,#ff6043 66%,#ffcd3f 88%);box-shadow:0 0 52px rgba(65,220,255,.35),0 34px 60px rgba(0,0,0,.55)}.screen{width:100%;height:100%;border-radius:36px;background:#08090d;border:14px solid #3b3a42;display:grid;place-items:center;box-shadow:inset 0 0 35px #000}.eyes{display:flex;gap:58px;transition:transform .08s linear}.eyes i{display:block;width:28px;height:54px;border-radius:9px;background:#fff;box-shadow:0 0 22px rgba(255,255,255,.8)}.ear{position:absolute;left:330px;top:116px;width:64px;height:92px;border-radius:50%;background:linear-gradient(135deg,#5a565d,#111);border:1px solid rgba(255,255,255,.12)}.wire{position:absolute;left:386px;top:177px;width:14px;height:76px;border-radius:10px;background:#0d0f15}.neck{position:absolute;left:173px;top:245px;width:72px;height:50px;border-radius:14px;background:linear-gradient(#b7a894,#6d6258)}.body{position:absolute;left:103px;top:280px;width:230px;height:185px;border-radius:60px 60px 35px 35px;background:linear-gradient(135deg,#cfc2b4,#5d5754);box-shadow:0 24px 54px rgba(0,0,0,.52)}.lights{position:absolute;left:95px;top:28px;display:flex;gap:8px}.lights i{width:11px;height:11px;border-radius:50%}.lights i:nth-child(1){background:#66ffec;box-shadow:0 0 13px #66ffec}.lights i:nth-child(2){background:#70A030;box-shadow:0 0 13px #70A030}.lights i:nth-child(3){background:#ff975b;box-shadow:0 0 13px #ff975b}.slot{position:absolute;top:85px;width:19px;height:60px;border-radius:30px;border:5px solid #22252b}.slot.a{left:62px}.slot.b{right:62px}.arm{position:absolute;top:318px;width:58px;height:142px;border-radius:26px;background:linear-gradient(#aaa198,#303038);transform-origin:top center}.arm.left{left:48px;transform:rotate(13deg)}.arm.right{right:38px;transform:rotate(-13deg)}.hand{position:absolute;top:446px;width:42px;height:42px;border-radius:16px;background:#7b746f}.hand.left{left:54px}.hand.right{right:42px}.leg{position:absolute;top:452px;width:45px;height:66px;border-radius:16px;background:linear-gradient(#77706b,#33333a)}.leg.l{left:151px}.leg.r{left:236px}.foot{position:absolute;top:508px;width:70px;height:33px;border-radius:12px;background:#5d5757}.foot.l{left:125px}.foot.r{left:229px}.platform{position:absolute;left:50%;bottom:22px;width:470px;height:120px;transform:translateX(-50%);border-radius:50%;background:radial-gradient(ellipse,rgba(112, 160, 48,.28),transparent 58%)}.platform i{position:absolute;inset:20px;border:2px solid rgba(112, 160, 48,.75);border-radius:50%;box-shadow:0 0 24px rgba(112, 160, 48,.7)}.platform i:nth-child(2){inset:36px;border-color:rgba(65,220,255,.45)}.platform i:nth-child(3){inset:4px;border-color:rgba(137,232,255,.16)}.platform em{position:absolute;left:50%;top:36px;width:280px;height:40px;background:#15161d;transform:translateX(-50%);clip-path:polygon(8% 0,92% 0,100% 100%,0 100%)}.target-rings{position:absolute;left:7%;top:38%;width:150px;height:150px;border-radius:50%;border:1px solid rgba(137,232,255,.22)}.target-rings i{position:absolute;inset:18px;border-radius:50%;border:1px solid rgba(112, 160, 48,.7);animation:spin 8s linear infinite}.target-rings i:nth-child(2){inset:38px;border-color:rgba(65,220,255,.45);animation-duration:5s}.target-rings i:nth-child(3){inset:62px;background:rgba(112, 160, 48,.25);border:0}.target-rings i:nth-child(4){inset:72px;background:#70A030;box-shadow:0 0 18px #70A030}.hud-lines span{position:absolute;width:50px;height:50px;border-color:rgba(137,232,255,.55)}.hud-lines span:nth-child(1){left:24%;top:13%;border-left:2px solid;border-top:2px solid}.hud-lines span:nth-child(2){right:22%;top:18%;border-right:2px solid;border-top:2px solid}.hud-lines span:nth-child(3){left:18%;bottom:26%;border-left:2px solid;border-bottom:2px solid}.hud-lines span:nth-child(4){right:30%;bottom:12%;border-right:2px solid;border-bottom:2px solid}.robot-caption{position:absolute;right:16%;bottom:74px;width:270px;color:#c5ccd5;font:14px var(--mono)}.hero-panels{padding-top:160px}.card{border-left:1px solid var(--line2);background:rgba(3,10,17,.5);padding:23px 28px;margin-bottom:52px;box-shadow:inset 0 0 0 1px rgba(255,255,255,.03)}.status b{font:13px var(--mono);color:#818a98}.status strong{display:block;margin:20px 0 5px;font:18px var(--mono)}.status em{font:17px var(--mono);font-style:normal;color:var(--green)}.steps{list-style:none;color:#8d97a6;font:17px/2.2 var(--mono);text-transform:uppercase}.scroll-down{margin-top:80px;text-align:right;color:#98a2ad;font:14px var(--mono);text-transform:uppercase}.scroll-down i{display:block;font:64px var(--mono);color:#fff}.metrics{position:relative;margin:0 84px 34px;padding:38px;display:grid;grid-template-columns:repeat(4,1fr);gap:30px;border:1px solid var(--line2);clip-path:polygon(0 0,98% 0,100% 12%,100% 88%,98% 100%,0 100%)}
.metrics pre{grid-column:1/-1}.metrics div{border-right:1px solid var(--line2);padding-left:26px}.metrics b{font:14px var(--mono);color:#70A030}.metrics strong{display:block;margin:16px 0 4px;font:64px var(--mono);letter-spacing:-.08em;color:#70A030}.metrics div:nth-child(2) strong{color:#45aaff}.metrics div:nth-child(3) strong{color:#70A030}.metrics div:nth-child(4) strong{color:#ffb921}.metrics span{font:18px var(--mono);color:#c2c9d3}.metrics pre{margin:0;border:1px solid var(--line);padding:20px;color:var(--green);font:16px/1.55 var(--mono);background:rgba(0,0,0,.32);height:248px;overflow:hidden;box-sizing:border-box;white-space:pre}.content-section{position:relative;margin:34px 48px;padding:48px 36px;border-top:1px solid rgba(137,232,255,.2)}.section-title{display:flex;gap:30px;align-items:flex-start;margin-bottom:32px;text-transform:uppercase}.section-title span{font:700 30px var(--mono);color:#70A030}.section-title h2,.contact h2{margin:0;font:700 clamp(42px,5vw,86px)/.9 var(--mono);letter-spacing:-.05em;text-transform:uppercase}.intro{max-width:960px;color:#b8c0cb;font:23px/1.55 var(--mono)}.cards{display:grid;gap:32px}.cards.three{grid-template-columns:repeat(3,1fr)}.cards.four{grid-template-columns:repeat(4,1fr)}.cards article,.timeline article,.split>div,.contact{position:relative;border:1px solid var(--line);background:linear-gradient(135deg,rgba(65,220,255,.06),rgba(112, 160, 48,.035));padding:32px;clip-path:polygon(0 0,96% 0,100% 10%,100% 100%,0 100%);transition:transform .18s,box-shadow .18s}.cards article:hover,.timeline article:hover{box-shadow:0 0 50px rgba(65,220,255,.12);transform:translateY(-4px)}.cards article:before,.timeline article:before,.split>div:before,.contact:before{content:"";position:absolute;left:-1px;top:-1px;width:58px;height:58px;border-left:2px solid var(--cyan);border-top:2px solid var(--cyan)}.cards i{display:inline-grid;place-items:center;width:54px;height:54px;border:1px solid var(--violet);color:var(--green);font-style:normal;margin-bottom:20px}.cards b{display:block;font:700 23px var(--mono);text-transform:uppercase}.cards p,.timeline p,.education li{color:#aeb7c3;font:17px/1.6 var(--mono)}.cards em{display:block;margin-top:26px;width:var(--w);height:6px;background:linear-gradient(90deg,var(--cyan),var(--violet));box-shadow:0 0 22px rgba(65,220,255,.55)}.timeline{display:grid;gap:18px}.timeline article{display:grid;grid-template-columns:230px 1fr;gap:30px}.timeline time{font:700 15px var(--mono);color:var(--cyan);text-transform:uppercase}.timeline h3{margin:0 0 12px;font:700 26px var(--mono);text-transform:uppercase}.split{display:grid;grid-template-columns:1fr 1fr;gap:34px}.chips,.education{margin:0;padding:0;list-style:none}.chips{display:flex;gap:12px;flex-wrap:wrap}.education li{padding:15px 0;border-bottom:1px solid var(--line)}.contact{text-align:center;margin-bottom:80px}.contact span{font:700 16px var(--mono);color:#70A030}.contact p{color:#b8c0cb;font:20px var(--mono)}.contact .btn{margin-top:22px}.side-rail{position:fixed;z-index:7;top:210px;bottom:40px;width:38px;display:flex;align-items:center;flex-direction:column;gap:20px;color:#8b96a4;font:13px var(--mono)}.side-rail.left{left:18px}.side-rail.right{right:18px}.side-rail span{writing-mode:vertical-rl;text-transform:uppercase}.side-rail i{flex:1;width:1px;background:linear-gradient(transparent,var(--line2),transparent)}.side-rail b{width:6px;height:6px;background:#bfc8d3}.side-rail a{color:#c7ced8;text-decoration:none;border:1px solid var(--line);width:24px;height:24px;display:grid;place-items:center}.reveal{opacity:0;transform:translateY(30px);transition:.8s ease}.reveal.in-view{opacity:1;transform:none}@keyframes spin{to{transform:rotate(360deg)}}@media(max-width:1280px){.topnav{grid-template-columns:290px 1fr}.topnav nav{display:none}.download{display:none}.section-grid{grid-template-columns:1.1fr 1fr;min-height:520px}.hero-panels{display:none}.hero-center{min-height:480px}.metrics{grid-template-columns:repeat(4,1fr)}.cards.four{grid-template-columns:1fr 1fr}}@media(max-width:760px){.interface{width:100%;margin:0;border:0}.topnav{margin:0 18px}.section-grid,.content-section{padding:42px 20px;margin-left:0;margin-right:0}.hero h1{font-size:48px}.lead,.intro{font-size:17px}.robot-stage{transform:translate(-50%,-50%) scale(.78)}.metrics{margin:0 20px;grid-template-columns:1fr}.metrics div{border-right:0;border-bottom:1px solid var(--line);padding:0 0 20px}.cards.three,.cards.four,.split,.timeline article{grid-template-columns:1fr}.side-rail,.cursor,.target-rings,.robot-caption{display:none}.brand strong{font-size:20px}.hero-center{min-height:520px}}

/* --- Mobile upgrade v3: responsive QA command interface --- */
.mobile-toggle{display:none;appearance:none;border:1px solid var(--line2);background:rgba(3,11,18,.72);width:46px;height:42px;align-items:center;justify-content:center;gap:5px;flex-direction:column;clip-path:polygon(0 0,90% 0,100% 25%,100% 100%,0 100%);z-index:25}
.mobile-toggle span{display:block;width:20px;height:2px;background:var(--txt);box-shadow:0 0 10px var(--cyan);transition:.25s}
body.menu-open{overflow:hidden}.mobile-toggle[aria-expanded="true"] span:nth-child(1){transform:translateY(7px) rotate(45deg)}.mobile-toggle[aria-expanded="true"] span:nth-child(2){opacity:0}.mobile-toggle[aria-expanded="true"] span:nth-child(3){transform:translateY(-7px) rotate(-45deg)}
@media (max-width:1180px){.interface{width:calc(100% - 28px);margin:14px auto 32px}.topnav{margin:0 28px;grid-template-columns:250px 1fr 160px;height:82px}.brand strong{font-size:22px}.brand em{font-size:11px}nav a{font-size:11px;padding-left:10px}.download{font-size:12px;padding:14px 16px}.section-grid{padding:64px 42px 28px;grid-template-columns:1fr .95fr}.hero-panels{display:none}.robot-stage{transform:translate(-50%,-50%) scale(.9)}.lead{font-size:20px}.metrics{margin:0 70px 28px}.content-section{margin:0 42px 30px;padding:58px 28px}.side-rail{display:none}}
@media (max-width:900px){.browser-bar{display:none}.scanlines{opacity:.08}.noise{opacity:.05}.cursor{display:none}.interface{width:100%;margin:0;border-left:0;border-right:0;background:linear-gradient(180deg,rgba(3,8,14,.96),rgba(2,6,11,.98))}.interface:before{background-size:42vw 120px;opacity:.7}.topnav{position:sticky;top:0;margin:0;padding:0 16px;height:72px;display:grid;grid-template-columns:48px 1fr auto;gap:12px;border-bottom:1px solid var(--line);background:rgba(2,6,11,.94)}.mobile-toggle{display:flex}.brand{grid-template-columns:32px 1fr;column-gap:10px}.focus-mark{width:30px;height:30px}.focus-mark:before,.focus-mark:after{width:10px;height:10px}.brand strong{font-size:18px}.brand em{font-size:10px;letter-spacing:.14em}.download{justify-self:end;font-size:0;min-width:44px;height:42px;padding:0;display:grid;place-items:center}.download:before{content:'⇩';font-size:20px}nav{position:fixed;z-index:20;left:12px;right:12px;top:82px;height:auto;display:grid;grid-template-columns:1fr;background:rgba(2,9,16,.98);border:1px solid var(--line2);box-shadow:0 30px 100px rgba(0,0,0,.7),0 0 60px rgba(65,220,255,.08) inset;clip-path:polygon(0 0,96% 0,100% 8%,100% 100%,4% 100%,0 92%);padding:16px;transform:translateY(-14px) scale(.96);opacity:0;pointer-events:none;transition:.22s}body.menu-open nav{transform:translateY(0) scale(1);opacity:1;pointer-events:auto}nav a{font-size:15px;gap:6px;padding:15px 14px;border-bottom:1px solid rgba(137,232,255,.12);flex-direction:row;justify-content:flex-start}nav a small{width:36px}.section-grid{display:flex;flex-direction:column;padding:36px 18px 20px;min-height:auto}.hero-copy{order:1;min-width:0;width:100%}.hero h1{overflow-wrap:break-word;hyphens:auto}.hero-center{order:2;min-height:470px;margin-top:18px}.hero-panels{order:3;display:grid;grid-template-columns:1fr;gap:14px;padding-top:8px}.eyebrow{font-size:15px;margin-bottom:18px}.hero h1{font-size:clamp(42px,12vw,74px);line-height:.95;letter-spacing:-.075em}.lead{font-size:17px;line-height:1.5;margin-top:24px}.actions{display:grid;grid-template-columns:1fr;gap:14px;margin:26px 0}.btn{width:100%;min-width:0;padding:17px 18px;font-size:14px}.tech-stack{gap:8px;margin-top:26px}.tech-stack span,.chips li{font-size:13px;padding:10px 12px}.robot-stage{width:100%;height:460px;top:50%;transform:translate(-50%,-50%) scale(.72)}.robot-caption,.target-rings,.hud-lines{display:none}.platform{bottom:42px;width:430px}.metrics{margin:0 36px 22px;grid-template-columns:1fr 1fr;gap:0;padding:22px}.metrics div{padding:15px 12px;border-right:0;border-bottom:1px solid var(--line)}.metrics strong{font-size:42px}#terminal{grid-column:1/-1;margin-top:12px;height:200px;font-size:12px}.content-section{margin:0 18px 22px;padding:36px 18px}.section-title{grid-template-columns:46px 1fr}.section-title h2{font-size:34px}.intro{font-size:17px}.cards.three,.cards.four,.split{grid-template-columns:1fr;gap:16px}.timeline article{grid-template-columns:1fr;gap:12px;padding:20px 0}.timeline time{font-size:14px}.timeline h3{font-size:22px}.contact h2{font-size:44px}}
@media (max-width:520px){#webgl{opacity:.45}.topnav{padding:0 12px;grid-template-columns:44px 1fr 42px}.brand strong{font-size:16px}.brand em{font-size:9px}.focus-mark{display:none}.brand{display:block}.hero h1{font-size:42px}.lead{font-size:15.5px}.hero-center{min-height:390px}.robot-stage{height:390px;transform:translate(-50%,-50%) scale(.58)}.platform{bottom:24px}.hero-panels .scroll-down{display:none}.metrics{grid-template-columns:1fr;padding:18px}.metrics div{text-align:left}.metrics strong{font-size:38px}.content-section{padding:30px 16px}.section-title h2{font-size:30px}.cards article{padding:20px}.chips{gap:8px}.contact h2{font-size:34px}.contact p{font-size:16px}.browser-bar,.side-rail{display:none!important}}
@media (prefers-reduced-motion:reduce){*,*::before,*::after{animation-duration:.01ms!important;animation-iteration-count:1!important;scroll-behavior:auto!important;transition:none!important}.scanlines,.noise{display:none}}

/* Real Three.js robot model replaces the previous CSS robot. */
html.real-robot-enabled .robot { display: none !important; }
html.real-robot-enabled .platform { opacity: .45; filter: blur(.2px); }
html.real-robot-enabled #webgl { opacity: 1; }
@media (max-width: 520px) { html.real-robot-enabled #webgl { opacity: .9; } }


/* Visibility boost: render the real 3D robot clearly above the dark interface overlay. */
html.real-robot-enabled #webgl{z-index:4;opacity:1!important;filter:drop-shadow(0 0 28px rgba(65,220,255,.22));}
html.real-robot-enabled .interface{background:linear-gradient(180deg,rgba(3,8,14,.58),rgba(2,6,11,.68));}
html.real-robot-enabled .topnav,html.real-robot-enabled .hero-copy,html.real-robot-enabled .hero-panels,html.real-robot-enabled .metrics,html.real-robot-enabled .content-section,html.real-robot-enabled .browser-bar{position:relative;z-index:6;}
html.real-robot-enabled .hero-center{z-index:5;pointer-events:none;}
html.real-robot-enabled .noise,html.real-robot-enabled .scanlines{opacity:.06;}
html.real-robot-enabled .robot-stage{opacity:.01;}
@media(max-width:900px){html.real-robot-enabled .interface{background:linear-gradient(180deg,rgba(3,8,14,.72),rgba(2,6,11,.78));}html.real-robot-enabled #webgl{z-index:4;opacity:1!important;}}
@media(max-width:520px){html.real-robot-enabled #webgl{opacity:1!important;}html.real-robot-enabled .hero-copy{background:linear-gradient(180deg,rgba(2,6,11,.62),rgba(2,6,11,.15));border:1px solid rgba(137,232,255,.08);padding:18px;}}


/* --- Playful LinkedIn banner implementation --- */
.banner-lab{overflow:hidden}
.banner-playground{position:relative;display:block;max-width:340px;margin:0 auto;border:1px solid rgba(112, 160, 48,.42);background:radial-gradient(circle at 20% 20%,rgba(112, 160, 48,.18),transparent 34%),linear-gradient(135deg,rgba(4,9,15,.88),rgba(2,6,11,.62));padding:13px;clip-path:polygon(0 0,97% 0,100% 9%,100% 100%,3% 100%,0 91%);transition:box-shadow .18s ease}
.banner-playground:hover{box-shadow:0 0 70px rgba(112, 160, 48,.18),inset 0 0 70px rgba(65,220,255,.06)}
.banner-glow{position:absolute;inset:auto 8% -28% 8%;height:38%;background:radial-gradient(ellipse,rgba(112, 160, 48,.32),transparent 68%);filter:blur(18px);pointer-events:none;animation:pulseGlow 2.6s ease-in-out infinite}
.banner-window{position:relative;overflow:hidden;border:1px solid rgba(137,232,255,.24);background:#05080c;clip-path:polygon(0 0,100% 0,100% 88%,94% 100%,0 100%)}
.banner-window:before{display:none}
.banner-window img{width:100%;height:auto;display:block;filter:saturate(1.08) contrast(1.06);transition:filter .35s ease}
.banner-playground:hover .banner-window img{filter:saturate(1.18) contrast(1.12)}
.banner-hotspot{position:absolute;z-index:3;border:1px solid rgba(112, 160, 48,.85);background:rgba(2,6,11,.72);color:#fff;font:700 13px var(--mono);text-transform:uppercase;letter-spacing:.04em;padding:10px 14px;backdrop-filter:blur(8px);box-shadow:0 0 22px rgba(112, 160, 48,.18);cursor:pointer;transition:.22s;clip-path:polygon(0 0,92% 0,100% 30%,100% 100%,0 100%)}
.banner-hotspot:hover{transform:translateY(-5px) scale(1.04);background:rgba(112, 160, 48,.2);box-shadow:0 0 34px rgba(112, 160, 48,.35)}
.banner-hotspot.one{left:7%;bottom:30%}.banner-hotspot.two{left:7%;bottom:18%}.banner-hotspot.three{right:7%;bottom:11%;border-color:#83ff32;box-shadow:0 0 28px rgba(131,255,50,.22)}
@keyframes bannerSweep{0%,45%{transform:translateX(-120%)}65%,100%{transform:translateX(120%)}}
@keyframes pulseGlow{0%,100%{opacity:.55;transform:scaleX(.9)}50%{opacity:1;transform:scaleX(1.05)}}
.banner-spark{position:fixed;z-index:8;width:6px;height:6px;border-radius:50%;background:var(--orange);pointer-events:none;box-shadow:0 0 18px var(--orange);animation:sparkPop .65s ease-out forwards}@keyframes sparkPop{to{opacity:0;transform:translate(var(--sx),var(--sy)) scale(.2)}}
@media(max-width:900px){.banner-playground{padding:14px;max-width:100%}.banner-hotspot{font-size:10px;padding:8px 10px}.banner-hotspot.one{bottom:33%}.banner-hotspot.two{bottom:20%}.banner-hotspot.three{right:5%;bottom:8%}}
@media(max-width:520px){.banner-hotspot{display:none}}

/* === Professional light theme — neutral surfaces, restrained accent typography ===
   Surfaces:  bg #f5f5f7  •  surface #ffffff  •  hairline rgba(0,0,0,.08)
   Type:      primary #1d1d1f  •  secondary #6e6e73
   Accents (purposeful, not decorative):
     ORANGE  #70A030  → brand voice  (eyebrow, all section numbers, hover, contact)
     BLUE    #0071e3  → interactive  (active nav, links)
     GREEN   #70A030  → positive status only  (online, available)
     PURPLE  #af52de  → identity marker  (one per data-viz set)
     RED     #ff3b30  → reserved for errors (unused on this page)
   Multi-accent rotation appears only where items are a data-viz category
   (4 metrics, 4 skills, 4 steps, 3 about cards) — never on lists or chips. */

body{background:#f5f5f7;color:#1d1d1f;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}
#webgl{opacity:.14}
.scanlines{opacity:0}
.noise{opacity:.02}

.interface{background:#f5f5f7;width:100%;margin:0;border:none;box-shadow:none;backdrop-filter:none;-webkit-backdrop-filter:none}
.interface:before{background-image:linear-gradient(to right,rgba(0,0,0,.025) 1px,transparent 1px),linear-gradient(to bottom,rgba(0,0,0,.02) 1px,transparent 1px);opacity:.5}

.browser-bar{display:none}

.topnav{background:transparent;backdrop-filter:none;-webkit-backdrop-filter:none;border-bottom:none}
.brand,.brand strong{color:#1d1d1f}
.brand em{color:#6e6e73}
.focus-mark:before,.focus-mark:after{border-color:#1d1d1f}
.brand small{background:#70A030;box-shadow:0 0 12px rgba(112, 160, 48,.5)}

nav{position:relative;perspective:600px}
nav a{color:#1d1d1f;font-weight:500;transform-origin:center;transform-style:preserve-3d;will-change:transform;transition:transform .28s cubic-bezier(.22,.85,.3,1),color .25s}
nav a small{color:#86868b}
nav a.active,nav a:hover{color:#0071e3}
nav a.active:after,nav a:after{display:none}

/* Floating hover indicator — slides to whichever link is hovered */
.nav-indicator{position:absolute;left:0;bottom:0;height:3px;width:0;opacity:0;background:linear-gradient(90deg,#70A030,#0071e3);border-radius:2px;pointer-events:none;transition:left .35s cubic-bezier(.22,.85,.3,1),width .35s cubic-bezier(.22,.85,.3,1),opacity .25s ease;box-shadow:0 1px 8px rgba(0,113,227,.35)}

/* === Yellow pill hamburger menu === */
.topnav{grid-template-columns:1fr auto !important;grid-template-rows:1fr !important;align-items:center;gap:14px}
.topnav .brand{grid-column:1;grid-row:1;justify-self:start;align-self:center;position:relative;display:flex !important;align-items:center;justify-content:center;column-gap:0;padding:0 22px;height:48px;box-sizing:border-box}
.topnav .brand strong,.topnav .brand em{grid-column:auto !important}
.topnav .brand .focus-mark{position:absolute !important;inset:0;width:auto !important;height:auto !important;display:block;pointer-events:none}
.topnav .brand .focus-mark::before,.topnav .brand .focus-mark::after{width:18px !important;height:18px !important;border-color:#70A030 !important;border-width:3px !important}
.topnav .mobile-toggle{position:relative;top:auto;bottom:auto;right:auto;left:auto;grid-column:2;grid-row:1;justify-self:end;align-self:center;padding:0;width:48px;height:48px;box-sizing:border-box}
.topnav .mobile-toggle::before,.topnav .mobile-toggle::after{display:none}
.download{display:none !important}

/* Hamburger — bigger, properly centered touch target */
.mobile-toggle{display:flex !important;position:relative;background:transparent !important;border:none !important;clip-path:none;width:48px;height:48px;cursor:pointer;z-index:60;padding:0;flex-direction:column;align-items:center;justify-content:center;gap:7px;box-shadow:none;box-sizing:content-box}
.mobile-toggle span{background:#70A030 !important;box-shadow:none;width:30px;height:3px;border-radius:2px;transition:transform .3s cubic-bezier(.22,.85,.3,1),opacity .2s,background .2s}
.mobile-toggle[aria-expanded="true"]{width:48px;height:48px;background:#70A030 !important;border-radius:50%;box-shadow:0 6px 18px rgba(0,0,0,.2);padding:0}
.mobile-toggle[aria-expanded="true"]::before,.mobile-toggle[aria-expanded="true"]::after{display:none}
.mobile-toggle[aria-expanded="true"] span{background:#1d1d1f !important;width:22px;height:2.5px}
.mobile-toggle[aria-expanded="true"] span:nth-child(1){transform:translateY(6.5px) rotate(45deg)}
.mobile-toggle[aria-expanded="true"] span:nth-child(3){transform:translateY(-6.5px) rotate(-45deg)}

/* Menu container — frosted glass panel (slides in from the right) */
.topnav nav{position:fixed;top:74px;right:18px;left:auto;width:min(240px,76vw);max-height:calc(100vh - 90px);display:grid !important;grid-template-columns:1fr;gap:0;z-index:55;background:rgba(255,255,255,.72) !important;border:1px solid rgba(0,0,0,.08) !important;border-radius:16px !important;box-shadow:0 16px 44px rgba(0,0,0,.14),inset 0 1px 0 rgba(255,255,255,.6) !important;backdrop-filter:blur(20px) saturate(180%) !important;-webkit-backdrop-filter:blur(20px) saturate(180%) !important;padding:4px 0 !important;clip-path:none !important;overflow:hidden;transform:translateX(120%) scale(.96);transform-origin:top right;opacity:0;pointer-events:none;transition:transform .35s cubic-bezier(.22,.85,.3,1),opacity .25s ease}
body.menu-open .topnav nav{transform:translateX(0) scale(1);opacity:1;pointer-events:auto}

/* Each menu item — clean text row with chevron arrow */
.topnav nav a{background:transparent !important;color:#1d1d1f !important;font:600 16px var(--display) !important;padding:14px 18px !important;border-radius:0 !important;text-align:left !important;display:flex !important;justify-content:space-between !important;align-items:center !important;gap:12px;width:auto !important;text-transform:none !important;letter-spacing:-.005em !important;transform:none !important;perspective:none;border:none !important;border-bottom:1px solid rgba(0,0,0,.06) !important;box-shadow:none !important;transition:color .25s,background .25s,padding-left .3s cubic-bezier(.22,.85,.3,1) !important;white-space:nowrap;overflow:hidden}
.topnav nav a small{display:none !important}
.topnav nav a:last-of-type{border-bottom:none !important}
.topnav nav a::after{content:"→";font:700 13px var(--mono);color:rgba(29,29,31,.3);transition:transform .3s cubic-bezier(.22,.85,.3,1),color .25s;flex-shrink:0}
.topnav nav a:hover,.topnav nav a.active{color:#70A030 !important;background:rgba(112, 160, 48,.05) !important;padding-left:22px !important;transform:none !important;box-shadow:none !important}
.topnav nav a:hover::after,.topnav nav a.active::after{color:#70A030;transform:translateX(4px)}

/* Stagger the pills sliding in */
body.menu-open .topnav nav a{animation:pillIn .4s cubic-bezier(.22,.85,.3,1) backwards}
body.menu-open .topnav nav a:nth-child(1){animation-delay:.05s}
body.menu-open .topnav nav a:nth-child(2){animation-delay:.10s}
body.menu-open .topnav nav a:nth-child(3){animation-delay:.15s}
body.menu-open .topnav nav a:nth-child(4){animation-delay:.20s}
body.menu-open .topnav nav a:nth-child(5){animation-delay:.25s}
body.menu-open .topnav nav a:nth-child(6){animation-delay:.30s}
body.menu-open .topnav nav a:nth-child(7){animation-delay:.35s}
@keyframes pillIn{from{opacity:0;transform:translateX(40px)}to{opacity:1;transform:translateX(0)}}


/* Floating sliding indicator pill is irrelevant in this layout */
.nav-indicator{display:none !important}

/* === Experience cards — collapsible with 3D tilt + cursor spotlight === */
.experience-stack{display:grid;gap:18px;margin-top:34px;perspective:1400px}

.exp-card{
  position:relative;background:#ffffff;border:1px solid rgba(0,0,0,.08);
  border-radius:20px;overflow:hidden;cursor:pointer;
  box-shadow:0 4px 14px rgba(0,0,0,.05);
  opacity:0;
  transition:opacity .55s ease var(--enter-delay,0ms)
}
.exp-card.exp-in-view{opacity:1}

.exp-header{position:relative;z-index:2;display:grid;grid-template-columns:1fr auto auto;align-items:center;gap:20px;padding:24px 28px;user-select:none}
.exp-meta time{display:block;color:#70A030;font:600 13px/1 var(--mono);letter-spacing:.14em;margin-bottom:8px}
.exp-meta h3{margin:0;font:600 22px var(--display);color:#1d1d1f;letter-spacing:-.01em;text-transform:none}
.exp-meta .exp-company{display:block;margin-top:4px;font:500 14px var(--display);color:#6e6e73;letter-spacing:.02em}

.exp-toggle{width:44px;height:44px;border-radius:50%;background:#70A030;border:none;cursor:pointer;position:relative;flex-shrink:0;padding:0;transition:transform .4s cubic-bezier(.22,.85,.3,1),box-shadow .3s}
.exp-toggle:hover{box-shadow:0 6px 16px rgba(112, 160, 48,.6)}
.exp-toggle::before,.exp-toggle::after{content:"";position:absolute;top:50%;left:50%;background:#1d1d1f;width:16px;height:2.5px;border-radius:2px;transition:transform .35s cubic-bezier(.22,.85,.3,1)}
.exp-toggle::before{transform:translate(-50%,-50%)}
.exp-toggle::after{transform:translate(-50%,-50%) rotate(90deg)}
.exp-card[data-expanded="true"] .exp-toggle{transform:rotate(135deg)}

/* Smooth height transition via grid-template-rows trick */
.exp-body{position:relative;z-index:2;display:grid;grid-template-rows:0fr;transition:grid-template-rows .55s cubic-bezier(.22,.85,.3,1);padding:0 28px}
.exp-body-clip{overflow:hidden;min-height:0}
.exp-card[data-expanded="true"] .exp-body{grid-template-rows:1fr;padding-bottom:28px}

.exp-body-inner{display:grid;gap:20px;padding-top:18px;border-top:1px solid rgba(0,0,0,.06);margin-top:8px}
.exp-section strong{display:block;color:#70A030;font:700 12px var(--mono);letter-spacing:.16em;text-transform:uppercase;margin-bottom:6px}
.exp-section p{margin:0;color:#424245;font:400 16px/1.55 var(--display)}
.exp-section ul{list-style:none;padding:0;margin:0;display:grid;gap:6px}
.exp-section li{color:#424245;font:400 16px/1.55 var(--display);padding-left:22px;position:relative}
.exp-section li::before{content:"";position:absolute;left:0;top:.65em;width:10px;height:10px;background:#70A030;border-radius:50%;box-shadow:0 0 0 3px rgba(112, 160, 48,.18)}

@media(max-width:600px){
  .exp-header{padding:18px 18px;gap:14px}
  .exp-meta h3{font-size:18px}
  .exp-toggle{width:38px;height:38px}
  .exp-body{padding:0 18px}
  .exp-card[data-expanded="true"] .exp-body{padding-bottom:22px}
  .exp-section p,.exp-section li{font-size:15px}
}

/* === Tech-stack — clean stacked icons with mono caption ===
   • Big monochrome icon (30px)
   • Tiny mono-caps name beneath (auto from data-tip)
   • Yellow underline animates in on hover
   No tile, no border, no clutter — just the silhouette + label. */
.exp-stack{position:relative;display:flex;align-items:flex-start;gap:18px;flex-wrap:nowrap;padding:2px 0}
.exp-stack .logo-item{position:relative;display:inline-flex;flex-direction:column;align-items:center;gap:5px;padding:4px 2px 6px;cursor:default;flex-shrink:0;background:transparent;border:none;border-radius:0;font:inherit;color:#1d1d1f;letter-spacing:normal;text-transform:none;line-height:1;transition:transform .26s cubic-bezier(.22,.85,.3,1)}

/* Image items: dark monochrome icon */
.exp-stack .logo-item img{width:30px;height:30px;display:block;object-fit:contain}

/* Text-only items (TOSCA / SOAPUI / BDD): styled mono pill that sits in the icon spot */
.exp-stack .logo-item .logo-label{display:grid;place-items:center;min-width:30px;height:30px;padding:0 9px;font:800 10.5px var(--mono);letter-spacing:.04em;color:#1d1d1f;border:1.5px solid #1d1d1f;border-radius:5px;text-transform:uppercase}

/* Caption beneath image items only (text items already show their name in the pill) */
.exp-stack .logo-item:has(img)::after{content:attr(data-tip);font:700 9px var(--mono);letter-spacing:.14em;color:#6e6e73;text-transform:uppercase;white-space:nowrap;transition:color .25s}

/* Yellow underline that grows in on hover */
.exp-stack .logo-item::before{content:"";position:absolute;bottom:-2px;left:50%;transform:translateX(-50%);width:0;height:2px;background:#70A030;border-radius:1px;pointer-events:none;transition:width .3s cubic-bezier(.22,.85,.3,1)}
.exp-stack .logo-item:hover{transform:translateY(-3px)}
.exp-stack .logo-item:hover::before{width:30px}
.exp-stack .logo-item:hover:has(img)::after{color:#1d1d1f}

@media(max-width:760px){
  .exp-header{grid-template-columns:1fr auto;gap:14px}
  .exp-stack{display:none}
}

.download{color:#fff;background:#1d1d1f;border-color:#1d1d1f;border-radius:24px;clip-path:none;box-shadow:0 4px 12px rgba(0,0,0,.15);transition:.2s}
.download:hover{background:#2d2d2f;transform:translateY(-1px);box-shadow:0 6px 18px rgba(0,0,0,.18)}

.panel-line{border-bottom-color:rgba(0,0,0,.08)}

/* Hero */
.eyebrow{color:#70A030;font:600 13px/1 var(--display);letter-spacing:.18em}
.hero h1{color:#1d1d1f;text-shadow:none;font-family:var(--display);letter-spacing:-.04em;font-weight:700}
.lead{color:#1d1d1f;font:500 18px/1.55 var(--display);text-shadow:none}

.btn{color:#1d1d1f;background:#ffffff;border:1px solid rgba(0,0,0,.12);border-radius:24px;clip-path:none;font:600 15px var(--display);letter-spacing:.02em;text-transform:none;box-shadow:0 2px 8px rgba(0,0,0,.04);transition:.2s}
.btn.primary{color:#fff;background:#1d1d1f;border-color:#1d1d1f;box-shadow:0 4px 14px rgba(0,0,0,.18)}
.btn:hover{box-shadow:0 8px 22px rgba(0,0,0,.12);transform:translateY(-2px)}

.tech-stack strong{color:#86868b;font:500 12px var(--display);letter-spacing:.18em}
.tech-stack span,.chips li{background:#ffffff;color:#1d1d1f;border:1px solid rgba(0,0,0,.08);border-radius:14px;font:500 14px var(--display);padding:10px 16px;transition:.18s}
.tech-stack span:hover,.chips li:hover{border-color:#70A030;color:#70A030}

/* Hero side cards */
.card{background:#ffffff;border:1px solid rgba(0,0,0,.08);border-left:2px solid #1d1d1f;border-radius:14px;box-shadow:0 4px 14px rgba(0,0,0,.04);padding:22px 24px}
.status b{color:#86868b}
.status strong{color:#1d1d1f}
.status em{color:#70A030}
.steps{color:#1d1d1f}
/* Process flow: blue analyse → purple automate → orange validate → green deliver */
.steps li:nth-child(1){color:#0071e3}
.steps li:nth-child(2){color:#af52de}
.steps li:nth-child(3){color:#70A030}
.steps li:nth-child(4){color:#70A030}
.steps li{font-weight:600}
.scroll-down{color:#6e6e73}
.scroll-down i{color:#1d1d1f}
.robot-caption{color:#6e6e73}

/* Metrics */
.metrics{border:1px solid rgba(0,0,0,.06);background:#ffffff;border-radius:14px;clip-path:none;box-shadow:0 4px 14px rgba(0,0,0,.04);padding:18px 22px;gap:0;border-bottom:1px solid rgba(0,0,0,.06)}
.metrics div{border-right:1px solid rgba(0,0,0,.08);padding:2px 20px;display:flex;flex-direction:column;align-items:flex-start;justify-content:flex-start}
.metrics div:first-of-type{padding-left:0}
.metrics div:nth-of-type(4){border-right:0;padding-right:0}
.metrics b{color:#86868b;font:600 9.5px/1 var(--mono);letter-spacing:.16em;text-transform:uppercase;margin:0}
.metrics strong{font-family:var(--display);font-weight:700;letter-spacing:-.025em;font-size:28px;line-height:1;margin:8px 0 4px;color:#1d1d1f}
.metrics div:nth-child(1) strong{color:#70A030}
.metrics div:nth-child(2) strong{color:#0071e3}
.metrics div:nth-child(3) strong{color:#70A030}
.metrics div:nth-child(4) strong{color:#af52de}
.metrics span{color:#86868b;font:600 9.5px/1.2 var(--mono);letter-spacing:.14em;text-transform:uppercase}
.metrics pre{margin-top:16px;background:#1d1d1f;border:0;color:#70A030;border-radius:10px;height:120px;min-height:0;font:11.5px/1.55 var(--mono);padding:14px 16px;letter-spacing:.01em;position:relative;overflow:hidden}
.metrics pre::before{content:"● ● ●";position:absolute;top:8px;right:12px;font:10px/1 var(--mono);letter-spacing:.4em;color:rgba(255,255,255,.18)}

/* Sections */
.content-section{border-top:1px solid rgba(0,0,0,.08);margin:6px 48px;padding:28px 36px}
.section-title h2,.contact h2{color:#1d1d1f;font-family:var(--display);letter-spacing:-.04em;font-weight:700;text-transform:none}
/* All section numbers use brand orange for consistency */
.section-title span{color:#70A030;font:600 22px var(--mono)}
.intro{color:#6e6e73;font:400 19px/1.5 var(--display)}

/* Cards / timeline / split / contact panels — same white surface */
.cards article,.timeline article,.split>div,.contact{background:#ffffff;border:1px solid rgba(0,0,0,.08);border-radius:20px;clip-path:none;box-shadow:0 4px 14px rgba(0,0,0,.04);transition:.2s}
.cards article:before,.timeline article:before,.split>div:before,.contact:before{display:none}
.cards article:hover,.timeline article:hover{box-shadow:0 14px 36px rgba(0,0,0,.08);transform:translateY(-3px)}

/* About cards — three distinct strengths each get a category color */
.cards i{background:transparent;border:1px solid rgba(0,0,0,.1);border-radius:12px;color:#1d1d1f}
.cards.three article:nth-child(1) i{color:#70A030;border-color:rgba(112, 160, 48,.3)}
.cards.three article:nth-child(2) i{color:#0071e3;border-color:rgba(0,113,227,.3)}
.cards.three article:nth-child(3) i{color:#af52de;border-color:rgba(175,82,222,.3)}

.cards b{color:#1d1d1f;font:600 20px var(--display);letter-spacing:-.01em;text-transform:none}
/* Skills matrix titles rotate accent */
.cards.four article:nth-child(1) b{color:#70A030}
.cards.four article:nth-child(2) b{color:#0071e3}
.cards.four article:nth-child(3) b{color:#70A030}
.cards.four article:nth-child(4) b{color:#af52de}

.cards p,.timeline p,.education li{color:#6e6e73;font:400 16px/1.5 var(--display)}
.cards em{background:#1d1d1f;box-shadow:none;border-radius:999px;height:4px}
.cards.four article:nth-child(1) em{background:#70A030}
.cards.four article:nth-child(2) em{background:#0071e3}
.cards.four article:nth-child(3) em{background:#70A030}
.cards.four article:nth-child(4) em{background:#af52de}

.timeline h3{color:#1d1d1f;font:600 22px var(--display);letter-spacing:-.01em;text-transform:none}
/* Timeline dates use one consistent brand color */
.timeline time{color:#70A030;font:600 14px var(--mono);letter-spacing:.06em}

.education li{border-bottom:1px solid rgba(0,0,0,.08);color:#1d1d1f}

/* === Static chips — color-only hover, no movement === */
.chips li{cursor:default;transition:color .25s ease,border-color .25s ease,background .25s ease}
.chips li:hover{color:#70A030;border-color:#70A030;background:#fff}

/* === Sticker-bento certifications grid (Wallen-style) === */
#certs.split{grid-template-columns:1.6fr 1fr;gap:42px;align-items:start}
.cert-bento{position:relative;display:grid;grid-template-columns:repeat(4,1fr);grid-auto-rows:minmax(96px,auto);gap:10px;padding:14px 12px 18px;min-width:0;max-width:100%}
.cert-tile{position:relative;background:var(--c,#fff);color:var(--ink,#1d1d1f);border:2.5px solid #1d1d1f;border-radius:14px;padding:12px 14px;display:flex;flex-direction:column;justify-content:space-between;gap:6px;box-shadow:4px 4px 0 #1d1d1f;overflow:hidden;transition:transform .22s cubic-bezier(.22,.85,.3,1),box-shadow .22s;text-decoration:none;min-width:0}
.cert-tile:hover{transform:translate(-2px,-2px) rotate(-.5deg);box-shadow:6px 6px 0 #1d1d1f}
.cert-tile--feature{grid-column:span 2;grid-row:span 2;padding:18px 20px}
.cert-tile--feature:hover{transform:translate(-2px,-2px) rotate(-.4deg)}
.cert-tile--wide{grid-column:span 2;flex-direction:row;align-items:center;gap:12px}
.cert-tile--mini{align-items:center;justify-content:center;text-align:center;gap:2px}
.cert-tile--mini:hover{transform:translate(-2px,-2px) rotate(1.5deg)}

.cert-name{margin:0;font:800 14px/1.1 var(--display);letter-spacing:-.005em;text-transform:uppercase;overflow:hidden;text-overflow:ellipsis}
.cert-tile--feature .cert-name{font-size:24px;line-height:1;margin-top:4px;white-space:normal}
.cert-tile--wide .cert-name{font-size:13px;white-space:normal;line-height:1.15}
.cert-tile--mini .cert-name{font-size:20px;letter-spacing:.02em}
.cert-issuer{font:700 9.5px var(--mono);text-transform:uppercase;letter-spacing:.14em;opacity:.85;display:block}
.cert-program{font:600 12px/1.3 var(--display);opacity:.92;display:block;margin-top:2px}
.cert-tile--feature .cert-issuer{font-size:10.5px;opacity:.95}
.cert-info{display:flex;flex-direction:column;gap:2px;flex:1;min-width:0}
.cert-icon{width:64px;height:64px;object-fit:contain;align-self:center;margin:auto;filter:drop-shadow(2px 2px 0 rgba(0,0,0,.25))}
.cert-icon-sm{width:36px;height:36px;object-fit:contain;border-radius:8px;background:#fff;border:2px solid #1d1d1f;padding:3px;flex-shrink:0;box-shadow:2px 2px 0 #1d1d1f}
.cert-badge{align-self:flex-start;background:#1d1d1f;color:#70A030;padding:4px 9px;border-radius:999px;font:800 9px var(--mono);letter-spacing:.14em;border:2px solid #1d1d1f}

/* Floating stickers — kept inside the block bounds */
.cert-sticker{position:absolute;z-index:5;pointer-events:none;font:900 11px var(--display);text-transform:uppercase;letter-spacing:.04em;border:2.5px solid #1d1d1f;background:#fff;padding:6px 12px;border-radius:12px;box-shadow:3px 3px 0 #1d1d1f;white-space:nowrap}
.cert-sticker--top{top:2px;right:6px;background:#70A030;color:#1d1d1f;transform:rotate(6deg)}
.cert-sticker--bottom{bottom:4px;left:6px;background:#70A030;color:#fff;transform:rotate(-5deg)}

@media(max-width:1024px){
  #certs.split{grid-template-columns:1fr;gap:32px}
}
@media(max-width:760px){
  .cert-bento{grid-template-columns:repeat(2,1fr)}
  .cert-tile--feature{grid-column:span 2;grid-row:span 2}
  .cert-tile--wide{grid-column:span 2;flex-direction:row}
}

/* Education list — animated underline draw + arrow on hover */
.education li{position:relative;transition:color .25s}
.education li::before{content:"";position:absolute;left:0;bottom:-1px;width:100%;height:2px;background:#70A030;transform:scaleX(0);transform-origin:left center;transition:transform .45s cubic-bezier(.22,.85,.3,1)}
.education li::after{content:"→";position:absolute;left:0;top:50%;transform:translate(-14px,-50%);opacity:0;color:#70A030;font:700 16px var(--mono);transition:transform .3s cubic-bezier(.22,.85,.3,1),opacity .25s;pointer-events:none}
.education li:hover{color:#70A030}
.education li:hover::before{transform:scaleX(1)}
.education li:hover::after{transform:translate(0,-50%);opacity:1}

.contact{text-align:center}
.contact span{color:#70A030;font:600 14px var(--mono);letter-spacing:.18em}
.contact p{color:#6e6e73;font:400 18px var(--display)}

/* Banner */
.banner-playground{background:transparent !important;border:none !important;border-radius:0 !important;clip-path:none;box-shadow:none !important;max-width:100%;width:100%;padding:0 !important;cursor:default;overflow:visible;margin:0}
.banner-playground:hover{box-shadow:none !important;transform:none !important}
.banner-playground .banner-window{display:flex;justify-content:center;align-items:center;background:transparent !important;border:none !important;border-radius:0 !important;padding:0 !important;overflow:visible !important;clip-path:none}
.banner-playground .banner-window img,
.banner-playground .banner-window video{max-width:min(100%,580px);width:100%;max-height:none;height:auto;display:block;object-fit:contain;transition:none;transform:none;border-radius:14px;margin:0 auto;background:#05080c}
.banner-playground:hover .banner-window img{transform:none}
.banner-hotspot{background:#ffffff;color:#1d1d1f;border:1px solid rgba(0,0,0,.12);border-radius:999px;clip-path:none;font:600 12px var(--display);letter-spacing:.04em;text-transform:none;box-shadow:0 2px 8px rgba(0,0,0,.08)}
.banner-hotspot.three{color:#70A030;border-color:rgba(112, 160, 48,.4);box-shadow:0 0 14px rgba(112, 160, 48,.18)}
.banner-glow{background:radial-gradient(ellipse,rgba(0,0,0,.06),transparent 68%)}

/* Side rails — yellow accent treatment */
.side-rail{color:#6e6e73}
.side-rail b{background:#70A030}
.side-rail a{color:#1d1d1f;border:1px solid #70A030;border-radius:50%;background:#70A030}
.side-rail i{background:linear-gradient(transparent,rgba(0,0,0,.14),transparent)}

.cursor{border-color:#1d1d1f;box-shadow:0 0 16px rgba(0,0,0,.18)}

/* Mobile menu drawer */
body.menu-open nav{background:#ffffff;border-color:rgba(0,0,0,.1);box-shadow:0 30px 80px rgba(0,0,0,.15)}
@media(max-width:900px){nav a{border-bottom-color:rgba(0,0,0,.06)}}

/* Viewport detection on the hero heading
   Exposes:  --vp-ratio (intersection 0–1)  •  --vp-progress (scroll 0–1)
   Toggles:  .h1-in-view */
.hero h1{--vp-ratio:1;--vp-progress:.5;transition:opacity .35s ease}
.hero h1:not(.h1-in-view){opacity:.15}
.hero h1 > span{display:block;transform:translateY(calc((var(--vp-progress) - .5) * 26px));transition:transform .12s linear}

/* Hero now has only 2 columns (panels were removed) — collapse the grid so the
   robot sits centered in the right half instead of in a narrow middle column. */
.section-grid{grid-template-columns:1.05fr 1fr}

/* Section titles — bigger + scroll-tied letter rotation
   Uses --vp-progress (set on each <section> by the global scroll tracker) and
   --ld per letter (set by JS, alternating sign × intensity). When the section
   is centered (vp-progress = .5) the letters sit flat; as the section scrolls
   in/out, each letter rotates by (vp-progress - .5) * ld degrees. */
.section-title span{font:600 22px var(--mono)}
.section-title h2,.contact h2{font-size:clamp(32px,4vw,56px)}
/* Narrower columns (Certs sits in a 1.6fr split) need a smaller title to fit "Certifications" on one line */
#certs .section-title h2{font-size:clamp(26px,3vw,42px);white-space:nowrap;letter-spacing:-.025em}
#education .section-title h2{font-size:clamp(26px,3vw,42px);white-space:nowrap;letter-spacing:-.025em}

/* Education uses a narrower 2-column bento (sits in the 1fr split column) */
.edu-bento{grid-template-columns:repeat(2,1fr)}
.edu-bento .cert-tile--feature{grid-column:span 2;grid-row:span 2}
.edu-bento .cert-tile--wide{grid-column:span 2}

/* === Contact section — typewriter terminal CTA === */
/* Section is a plain content-section container; the .contact inner div is the white card so it aligns with the cert/edu cards above */
#contact{padding:28px 36px;background:transparent;border:0;box-shadow:none;border-radius:0}
#contact .contact{margin:0;padding:32px}
#contact h2{font-size:clamp(36px,4.5vw,60px);margin:6px 0 14px;letter-spacing:-.025em;line-height:1}
.contact-eye{font:700 12px var(--mono);color:#70A030;letter-spacing:.2em;text-transform:uppercase;display:block}

/* Terminal CTA — fake macOS terminal that types out the contact command */
.contact-terminal{display:inline-block;width:520px;max-width:100%;background:#1d1d1f;border-radius:12px;text-decoration:none;text-align:left;overflow:hidden;margin:6px 0 8px;box-shadow:0 16px 38px rgba(0,0,0,.18),0 0 0 1px rgba(0,0,0,.04);transition:transform .28s cubic-bezier(.22,.85,.3,1),box-shadow .28s;cursor:pointer}
.contact-terminal:hover{transform:translateY(-3px);box-shadow:0 22px 48px rgba(0,0,0,.26)}
.contact-terminal-head{display:flex;align-items:center;gap:6px;padding:9px 14px;background:#26262d;border-bottom:1px solid rgba(255,255,255,.06)}
.ct-dot{width:11px;height:11px;border-radius:50%;background:#ff5f56}
.ct-dot:nth-child(2){background:#ffbd2e}
.ct-dot:nth-child(3){background:#27c93f}
.ct-title{margin-left:10px;font:600 11px var(--mono);color:rgba(255,255,255,.4);letter-spacing:.08em}
.contact-terminal-body{padding:18px 20px;font:16px/1.4 var(--mono);color:#70A030;min-height:60px;display:flex;align-items:center;gap:10px;flex-wrap:nowrap}
.ct-prompt{color:#70A030;font-weight:700;flex-shrink:0}
.ct-cmd{color:#70A030;white-space:pre}
.ct-caret{display:inline-block;width:9px;height:18px;background:#70A030;margin-left:2px;animation:caretBlink 1s steps(2) infinite;flex-shrink:0;vertical-align:middle}
@keyframes caretBlink{0%,49%{opacity:1}50%,100%{opacity:0}}

@media(max-width:760px){
  .contact-terminal-body{font-size:13px;padding:14px 16px}
  .ct-caret{height:15px;width:7px}
}
/* Outline → fill: first letter starts as a yellow stroke outline.
   As the section scrolls through the viewport, an orange fill rises from the
   bottom of the letter, driven by --vp-progress. At 0 = just outline; at 1 = fully filled. */
.rotate-letters .rl{position:relative;display:inline-block;font:inherit;line-height:inherit;vertical-align:baseline;color:transparent;-webkit-text-stroke:2px #70A030;text-stroke:2px #70A030}
.rotate-letters .rl::before{content:attr(data-char);position:absolute;left:0;top:0;width:100%;height:100%;color:#70A030;-webkit-text-stroke:0;text-stroke:0;clip-path:inset(calc((1 - var(--vp-progress, 0)) * 100%) 0 0 0);-webkit-clip-path:inset(calc((1 - var(--vp-progress, 0)) * 100%) 0 0 0);transition:clip-path .25s cubic-bezier(.22,.85,.3,1),-webkit-clip-path .25s cubic-bezier(.22,.85,.3,1);pointer-events:none}

/* Reading progress bar — fixed at top, fills based on global --scroll-progress */
body::before{content:"";position:fixed;top:0;left:0;height:3px;width:calc(var(--scroll-progress, 0) * 100%);background:linear-gradient(90deg,#70A030,#0071e3,#70A030);z-index:100;pointer-events:none;box-shadow:0 1px 6px rgba(0,113,227,.35)}

/* === About cards — animated icons centered, with cheeky status tags === */
.cards.three .about-card{display:flex !important;flex-direction:column;align-items:center;text-align:center;padding:22px 20px 20px;gap:0;background:#ffffff;border:1px solid rgba(0,0,0,.08);border-radius:16px;clip-path:none;box-shadow:0 4px 14px rgba(0,0,0,.04);transition:transform .35s cubic-bezier(.22,.85,.3,1),box-shadow .35s,border-color .35s}
.cards.three .about-card:hover{transform:translateY(-6px);box-shadow:0 18px 40px rgba(0,0,0,.1);border-color:rgba(112, 160, 48,.4)}

.cards.three .about-icon{width:56px;height:56px;display:grid;place-items:center;margin:0 0 12px;border:none;background:transparent}
.cards.three .about-icon svg{width:56px;height:56px;display:block;overflow:visible}
.cards.three .about-icon.icon-target{color:#70A030}
.cards.three .about-icon.icon-code{color:#0071e3}
.cards.three .about-icon.icon-shield{color:#70A030}

/* TARGET — concentric rings spin opposite directions, center dot pulses */
.icon-target .ring-outer{transform-origin:40px 40px;animation:spinCw 18s linear infinite}
.icon-target .ring-mid{transform-origin:40px 40px;animation:spinCcw 9s linear infinite}
.icon-target .dot-center{transform-origin:40px 40px;animation:pulseDot 1.6s ease-in-out infinite}

/* CODE — the </> floats up/down softly, the caret blinks */
.icon-code{animation:codeBob 3.4s ease-in-out infinite}
.icon-code .caret-blink{animation:caretBlinkSvg 1s step-end infinite}

/* SHIELD WITH CHECK — checkmark gently glows on idle; draws in fast on hover */
.icon-shield .shield-check{stroke-dasharray:48;stroke-dashoffset:0;animation:shieldGlow 3s ease-in-out infinite}
.cards.three .about-card:hover .icon-shield .shield-check{animation:shieldCheckDraw .7s cubic-bezier(.22,.85,.3,1)}
.cards.three .about-card:hover .icon-shield .shield-outline{animation:shieldPulse 1.2s ease-in-out infinite}
@keyframes shieldCheckDraw{0%{stroke-dashoffset:48}100%{stroke-dashoffset:0}}
@keyframes shieldGlow{0%,100%{opacity:.85}50%{opacity:1}}
@keyframes shieldPulse{0%,100%{transform:scale(1)}50%{transform:scale(1.04)}}

/* Cheeky status tag (RECON MODE / DEPLOYING… / ALL CLEAR) */
.about-tag{display:inline-block;font:700 9px var(--mono);letter-spacing:.16em;color:#86868b;background:rgba(0,0,0,.04);padding:4px 10px;border-radius:999px;margin-bottom:8px;text-transform:uppercase}
.cards.three .about-card:hover .about-tag{color:#1d1d1f;background:#70A030;transition:color .25s,background .25s}

/* Title + description (centered, override base .cards layout) */
.cards.three .about-card b{display:block;width:100%;text-align:center;margin-top:2px;font:700 16px var(--display);color:#1d1d1f;letter-spacing:-.005em;text-transform:none}
.cards.three .about-card p{margin-top:6px;text-align:center;color:#6e6e73;font:400 13px/1.5 var(--display);max-width:32ch}

/* Wiggle the icon on card hover for personality */
.cards.three .about-card:hover .about-icon.icon-target{animation:iconWiggle .5s cubic-bezier(.36,1.4,.5,1)}
.cards.three .about-card:hover .about-icon.icon-code{animation:iconWiggle .5s cubic-bezier(.36,1.4,.5,1)}

/* === About cards — cursor-tracking 3D tilt + multi-layer parallax === */
.cards.three{perspective:1200px;perspective-origin:50% 50%}
.cards.three .about-card{--rx:0deg;--ry:0deg;--lift:0px;position:relative;overflow:hidden;isolation:isolate;transform-style:preserve-3d;transform:translateZ(var(--lift)) rotateX(var(--rx)) rotateY(var(--ry));transition:transform .35s cubic-bezier(.22,.85,.3,1),box-shadow .35s;will-change:transform}
.cards.three .about-card:hover{--lift:14px;box-shadow:0 30px 56px rgba(0,0,0,.18)}

/* Video clip background — recedes on hover (parallax back layer) */
.about-clip{position:absolute;inset:0;width:100%;height:100%;object-fit:cover;opacity:0;z-index:0;transition:opacity .55s ease,transform .65s cubic-bezier(.22,.85,.3,1);filter:saturate(1.1) contrast(1.05);pointer-events:none;transform:translateZ(-10px) scale(1)}
.cards.three .about-card:hover .about-clip{opacity:1;transform:translateZ(-18px) scale(1.08)}

/* White-fade overlay so text stays readable over the video */
.cards.three .about-card::after{content:"";position:absolute;inset:0;z-index:1;background:linear-gradient(180deg,rgba(255,255,255,0) 0%,rgba(255,255,255,.6) 38%,rgba(255,255,255,.95) 78%,#fff 100%);opacity:0;transition:opacity .55s ease;pointer-events:none;transform:translateZ(-2px)}
.cards.three .about-card:hover::after{opacity:1}

.about-content{position:relative;z-index:2;display:flex;flex-direction:column;align-items:center;transform-style:preserve-3d}

/* Each layer pops forward on hover at a different translateZ for parallax depth */
.about-icon,.about-tag,.cards.three .about-card b,.cards.three .about-card p{transition:transform .45s cubic-bezier(.22,.85,.3,1),color .25s}
.cards.three .about-card:hover .about-icon{transform:translateZ(48px)}
.cards.three .about-card:hover .about-tag{transform:translateZ(28px)}
.cards.three .about-card:hover b{transform:translateZ(34px)}
.cards.three .about-card:hover p{transform:translateZ(16px)}

/* Stats strip — combined Y slide + Z pop, deepest layer */
.about-stats{display:flex;gap:8px;margin-top:10px;opacity:0;transform:translate3d(0,8px,0);transition:opacity .4s ease .15s,transform .45s cubic-bezier(.22,.85,.3,1) .15s}
.cards.three .about-card:hover .about-stats{opacity:1;transform:translate3d(0,0,62px)}
.about-stat{display:flex;flex-direction:column;align-items:center;gap:0;padding:5px 10px;background:#1d1d1f;border-radius:9px;border:1.5px solid #1d1d1f}
.about-stat strong{font:800 14px var(--display);color:#70A030;line-height:1;letter-spacing:-.01em}
.about-stat em{font:700 8px var(--mono);color:rgba(255,255,255,.7);letter-spacing:.12em;text-transform:uppercase;font-style:normal;margin-top:2px}

@keyframes spinCw{to{transform:rotate(360deg)}}
@keyframes spinCcw{to{transform:rotate(-360deg)}}
@keyframes pulseDot{0%,100%{transform:scale(1);opacity:1}50%{transform:scale(1.7);opacity:.55}}
@keyframes codeBob{0%,100%{transform:translateY(0)}50%{transform:translateY(-4px)}}
@keyframes caretBlinkSvg{50%{opacity:0}}
@keyframes scaleSway{0%,100%{transform:rotate(-5deg)}50%{transform:rotate(5deg)}}

/* Description / secondary text → white */
.cards.three .about-card p,
.cards p,
.timeline p,
.education li,
.intro,
.contact p,
.robot-caption{color:#ffffff !important}
@keyframes iconWiggle{0%,100%{transform:rotate(0)}25%{transform:rotate(-6deg)}75%{transform:rotate(6deg)}}

/* About-card titles — letter-split reveal (3D flip-up) */
.split-text{display:inline-block;perspective:600px;white-space:pre}
.split-text .letter{display:inline-block;opacity:0;transform:rotateX(-90deg) translateY(18px);transform-origin:center bottom;transition:opacity .5s ease,transform .65s cubic-bezier(.34,1.4,.4,1);will-change:transform,opacity}
.split-text.split-in .letter{opacity:1;transform:rotateX(0deg) translateY(0)}

/* Tech-stack chips — smooth magnetic 3D tilt return */
.tech-stack span{transform-origin:center;transition:transform .25s cubic-bezier(.22,.85,.3,1),border-color .25s,color .25s,background .25s;will-change:transform}

/* === Skills matrix — single unified dashboard panel (light theme) === */
.skill-dash{margin:28px 0 0;display:flex;flex-direction:column;padding:0;height:400px}
.dash-card{background:#ffffff;border:1px solid rgba(0,0,0,.08);border-radius:18px;color:#1d1d1f;position:relative;overflow:hidden;box-shadow:0 4px 14px rgba(0,0,0,.04)}

/* Shared header at the top of the single panel */
.dash-head{display:flex;justify-content:space-between;align-items:flex-start;gap:12px;padding:18px 22px;border-bottom:1px solid rgba(0,0,0,.08)}
.dash-head-title{display:block;font:700 16px var(--display);color:#1d1d1f;letter-spacing:-.005em}
.dash-head-sub{display:block;font:500 11px var(--mono);color:#86868b;letter-spacing:.08em;text-transform:uppercase;margin-top:3px}
.dash-head-meta{display:flex;gap:8px;align-items:center}
.dash-card-meta{font:600 11px var(--mono);color:#86868b;letter-spacing:.06em;background:rgba(0,0,0,.05);padding:5px 10px;border-radius:999px}
.dash-card-meta--up{color:#1d1d1f;background:#70A030}

/* Body grid: all-skills list (left) | featured (right) */
.dash-body{display:grid;grid-template-columns:1.7fr 1fr;flex:1}
.dash-tools{order:1;padding:14px 18px;display:flex;flex-direction:column;min-height:0;border-right:1px solid rgba(0,0,0,.08)}
.dash-featured{order:2;display:grid;grid-template-rows:1fr;overflow:hidden;position:relative}
.dash-featured-art{display:none}
.dash-tools-head{display:flex;justify-content:space-between;align-items:baseline;gap:12px;margin-bottom:12px}
.dash-tools-title{font:700 13px var(--display);color:#1d1d1f}
.dash-tools-sub{font:500 10px var(--mono);color:#86868b;letter-spacing:.1em;text-transform:uppercase}
.dash-featured-art{position:relative;overflow:hidden}
.dash-featured-clip{width:100%;height:100%;object-fit:cover;display:block;filter:saturate(1.1) contrast(1.05)}
.dash-featured-overlay{position:absolute;inset:0;background:linear-gradient(180deg,rgba(20,20,28,0) 0%,rgba(20,20,28,.4) 60%,rgba(20,20,28,.95) 100%)}
.dash-featured-info{padding:14px 18px;margin-top:0;position:relative;z-index:2;display:flex;flex-direction:column;min-height:0;overflow:hidden}
.dash-tagline{font:600 10px var(--mono);color:#70A030;letter-spacing:.18em;text-transform:uppercase}
.dash-featured-info h3{margin:4px 0 4px;font:700 18px var(--display);color:#1d1d1f;letter-spacing:-.01em}
.dash-featured-info p{margin:0 0 10px;color:#424245 !important;font:400 12px/1.45 var(--display);overflow:hidden;display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical}
.dash-progress{position:relative;height:6px;background:rgba(0,0,0,.08);border-radius:999px;overflow:hidden;margin-bottom:10px}
.dash-progress-fill{position:absolute;left:0;top:0;height:100%;width:var(--w,0%);background:linear-gradient(90deg,#70A030,#70A030);border-radius:999px;box-shadow:0 0 10px rgba(112, 160, 48,.4)}
.dash-progress-label{position:absolute;right:8px;top:-22px;font:700 11px var(--mono);color:#70A030;letter-spacing:.06em}
.dash-meta-pills{display:flex;flex-wrap:wrap;gap:5px;margin-bottom:10px}
.meta-pill{font:600 10px var(--mono);color:#424245;background:rgba(0,0,0,.05);padding:3px 9px;border-radius:999px;letter-spacing:.04em}
.dash-cta{display:inline-flex;align-items:center;gap:6px;padding:8px 14px;background:#70A030;color:#1d1d1f;font:700 11px var(--display);letter-spacing:.04em;border-radius:999px;text-decoration:none;transition:transform .25s cubic-bezier(.22,.85,.3,1),box-shadow .25s;border:none;cursor:pointer;align-self:flex-start}
.dash-cta:hover{transform:translateY(-2px);box-shadow:0 8px 18px rgba(112, 160, 48,.5)}
.dash-cta span{transition:transform .25s}
.dash-cta:hover span{transform:translateX(3px)}

/* Combined stats sub-section — wave on the left, radar on the right */
.dash-stats{display:grid;grid-template-columns:1.4fr 1fr;gap:20px;align-items:stretch}
.dash-stats-wave{display:flex;flex-direction:column;justify-content:space-between}
.dash-stats-radar{position:relative;display:flex;flex-direction:column;align-items:center;justify-content:center;border-left:1px solid rgba(255,255,255,.06);padding-left:20px}
.dash-stats-radar-label{font:600 10px var(--mono);color:rgba(255,255,255,.45);letter-spacing:.14em;text-transform:uppercase;margin-top:6px}

/* Activity wave (sub-component) */
.dash-wave{min-height:120px;display:flex;align-items:center}
.dash-wave-svg{width:100%;height:auto;display:block}
.dash-wave-peak-label{font:700 10px var(--mono);fill:#70A030;letter-spacing:.06em}
.dash-wave-stats{display:flex;gap:14px;margin-top:14px;padding-top:12px;border-top:1px solid rgba(255,255,255,.06)}
.dash-wave-stats div{display:flex;flex-direction:column}
.dash-wave-stats strong{font:700 17px var(--display);color:#fff;letter-spacing:-.01em}
.dash-wave-stats span{font:500 9.5px var(--mono);color:rgba(255,255,255,.5);letter-spacing:.08em;text-transform:uppercase;margin-top:2px}

/* Main Skills radar (sub-component) */
.dash-radar-wrap{position:relative;display:grid;place-items:center;width:100%}
.dash-radar-svg{width:100%;max-width:260px;height:auto;display:block;overflow:visible}
.dash-radar-grid{fill:none;stroke:rgba(255,255,255,.08);stroke-width:1}
.dash-radar-grid--outer{stroke:rgba(255,255,255,.18)}
.dash-radar-data{fill:rgba(112, 160, 48,.22);stroke:#70A030;stroke-width:2;stroke-linejoin:round;filter:drop-shadow(0 0 6px rgba(112, 160, 48,.3))}
.dash-radar-point{fill:#70A030;stroke:#14141c;stroke-width:2;cursor:pointer;transition:r .2s}
.dash-radar-point:hover{r:6}
.dash-radar-label{font:700 9px var(--mono);fill:rgba(255,255,255,.7);letter-spacing:.06em;text-transform:uppercase}
.dash-radar-score{position:absolute;display:flex;flex-direction:column;align-items:center;pointer-events:none;background:#1c1c26;border-radius:50%;width:78px;height:78px;justify-content:center;border:2px solid #70A030;box-shadow:0 0 18px rgba(112, 160, 48,.35),0 4px 14px rgba(0,0,0,.4)}
.dash-radar-score strong{font:800 28px var(--display);color:#fff;line-height:1}
.dash-radar-score span{font:500 9px var(--mono);color:rgba(255,255,255,.55);letter-spacing:.1em;margin-top:2px}

/* All-skills clickable list — 2 columns of compact rows */
.dash-tools-list{list-style:none;padding:0 4px 0 0;margin:0;display:grid;grid-template-columns:1fr 1fr;gap:6px;flex:1;overflow-y:auto;align-content:start}
.dash-tools-list::-webkit-scrollbar{width:5px}
.dash-tools-list::-webkit-scrollbar-thumb{background:rgba(0,0,0,.12);border-radius:3px}
.dash-tool-row{position:relative;display:grid;grid-template-columns:16px 24px 1fr auto;align-items:center;gap:8px;padding:5px 8px;background:rgba(0,0,0,.03);border-radius:8px;cursor:pointer;transition:background .25s,transform .25s cubic-bezier(.22,.85,.3,1),box-shadow .25s;user-select:none;min-width:0}
.dash-tool-row:hover{background:rgba(0,0,0,.06);transform:translateX(3px)}
.dash-tool-row.active{background:rgba(112, 160, 48,.3);box-shadow:inset 3px 0 0 #70A030}
.dash-tool-row.active .dash-tool-name{color:#1d1d1f}
.dash-tool-rank{font:800 9px var(--mono);color:#86868b;letter-spacing:.04em;text-align:center}
.dash-tool-avatar{display:grid;place-items:center;width:24px;height:24px;border-radius:7px;background:var(--brand);overflow:hidden;font:800 11px var(--mono);color:#fff;flex-shrink:0}
.dash-tool-avatar img{width:60%;height:60%;display:block}
.dash-tool-name{font:700 11px var(--display);color:#1d1d1f;letter-spacing:.01em;transition:color .25s;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;min-width:0}
.dash-tool-meta{font:600 9px var(--mono);color:#86868b;letter-spacing:.04em;white-space:nowrap}

/* Used-at section in the Featured spotlight — logo tiles */
.dash-used-at{display:flex;align-items:center;gap:10px;margin:0 0 12px;flex-wrap:wrap}
.dash-used-at-label{font:600 9px var(--mono);color:#86868b;letter-spacing:.14em;text-transform:uppercase}
.dash-used-at-pills{display:flex;flex-wrap:wrap;gap:6px}
.co-pill{position:relative;display:grid;place-items:center;width:42px;height:42px;background:#70A030;border-radius:10px;padding:6px;box-shadow:0 2px 8px rgba(0,0,0,.3),inset 0 1px 0 rgba(255,255,255,.45);cursor:help;transition:transform .25s cubic-bezier(.22,.85,.3,1),box-shadow .25s;overflow:hidden}
.co-pill:hover{transform:translateY(-2px) scale(1.06);box-shadow:0 8px 18px rgba(0,0,0,.45),0 0 0 2px rgba(112, 160, 48,.55)}
.co-pill img{position:relative;z-index:2;width:100%;height:100%;object-fit:contain;display:block;mix-blend-mode:multiply}
.co-pill-fb{position:absolute;inset:0;display:grid;place-items:center;z-index:1;font:800 11px var(--mono);color:#1d1d1f;letter-spacing:.04em}

/* Featured badge — logo of currently selected skill, overlays the video */
.dash-featured-badge{position:absolute;top:14px;right:14px;width:46px;height:46px;display:grid;place-items:center;background:var(--brand,#70A030);border-radius:12px;box-shadow:0 6px 14px rgba(0,0,0,.4),inset 0 1px 0 rgba(255,255,255,.2);z-index:3}
.dash-featured-badge img{width:60%;height:60%;display:block}
.dash-featured-badge span{font:800 18px var(--mono);color:#fff}

@media(max-width:900px){
  .dash-body{grid-template-columns:1fr}
  .dash-featured{order:1;grid-template-rows:160px auto;border-bottom:1px solid rgba(0,0,0,.08)}
  .dash-tools{order:2;border-right:0}
  .dash-stats{grid-template-columns:1fr;gap:16px}
  .dash-stats-radar{border-left:0;border-top:1px solid rgba(0,0,0,.08);padding-left:0;padding-top:16px}
}
@media(max-width:600px){
  .skill-dash{height:auto;min-height:0;margin:18px 0 0}
  .dash-head{flex-direction:column;align-items:flex-start;gap:8px;padding:14px 16px}
  .dash-head-meta{align-self:stretch;justify-content:space-between}
  .dash-head-title{font-size:15px}
  .dash-head-sub{font-size:10px;letter-spacing:.06em}
  .dash-card-meta{font-size:10px;padding:4px 9px}
  .dash-featured{grid-template-rows:auto}
  .dash-featured-info{padding:14px 16px}
  .dash-featured-info h3{font-size:17px}
  .dash-featured-info p{font-size:13px;-webkit-line-clamp:3}
  .dash-used-at{margin-bottom:10px;gap:8px}
  .co-pill{width:38px;height:38px;border-radius:9px;padding:5px}
  .dash-cta{padding:9px 14px;font-size:11px}
  .dash-tools{padding:12px 14px 16px}
  .dash-tools-head{margin-bottom:10px}
  .dash-tools-title{font-size:13px}
  .dash-tools-sub{font-size:9.5px}
  .dash-tools-list{grid-template-columns:1fr;gap:5px;overflow-y:visible;max-height:none}
  .dash-tool-row{grid-template-columns:18px 24px 1fr auto;padding:7px 9px}
  .dash-tool-name{font-size:12px}
  .dash-tool-meta{font-size:10px}
  .dash-featured-badge{width:40px;height:40px;border-radius:10px;top:10px;right:10px}
}
.skill-tile:hover{transform:translateY(-6px) scale(1.06);box-shadow:0 22px 44px rgba(0,0,0,.28),0 0 0 1px rgba(255,255,255,.18);z-index:5}

/* Background video — covers the tile, plays muted+looped. If the file is
   missing the <video> error handler hides it and the brand color shows. */
.skill-clip{position:absolute;inset:0;width:100%;height:100%;object-fit:cover;display:block;opacity:.55;transition:opacity .35s,filter .35s;filter:saturate(1.1) contrast(1.05)}
.skill-clip--missing{display:none}
.skill-tile:hover .skill-clip{opacity:.85}

/* Layered overlay — gradient tint + diagonal shimmer for the "video preview" feel */
.skill-overlay{position:absolute;inset:0;background:linear-gradient(135deg,rgba(255,255,255,.18) 0%,transparent 55%),linear-gradient(180deg,rgba(0,0,0,0) 50%,rgba(0,0,0,.55) 100%);pointer-events:none}
.skill-tile::after{content:"";position:absolute;inset:0;background:linear-gradient(110deg,transparent 35%,rgba(255,255,255,.12) 50%,transparent 65%);background-size:240% 100%;background-position:-100% 0;animation:tileShimmer 4.5s linear infinite;pointer-events:none}

/* Logo + name layer — always on top of the video & overlay */
.skill-info{position:absolute;inset:0;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:8px;padding:12px;text-align:center;z-index:2}
.skill-logo{width:42%;max-width:44px;height:auto;display:block;filter:drop-shadow(0 2px 5px rgba(0,0,0,.45));transition:transform .4s cubic-bezier(.22,.85,.3,1)}
.skill-tile:hover .skill-logo{transform:scale(1.12) rotate(-4deg)}
.skill-letter{display:grid;place-items:center;width:42%;max-width:44px;aspect-ratio:1;font:800 22px var(--mono);color:#fff;background:rgba(255,255,255,.16);border:2px solid rgba(255,255,255,.55);border-radius:50%}
.skill-name{font:700 11.5px var(--display);letter-spacing:.04em;color:#ffffff;text-shadow:0 1px 4px rgba(0,0,0,.55)}

@keyframes tileShimmer{0%{background-position:-100% 0}100%{background-position:200% 0}}

@media(max-width:600px){
  .skill-tile{flex:0 0 110px;width:110px}
  .skill-row{animation-duration:30s}
  .skill-row--reverse{animation-duration:36s}
  .skill-name{font-size:10.5px}
  .skill-logo,.skill-letter{max-width:36px}
}

/* Skills matrix underline bars — collapsed by default, fill when in view */
.cards.four em{width:0;transition:width 1.2s cubic-bezier(.22,.85,.3,1)}
.cards.four article.bar-fill em{width:var(--w)}

/* Refined easing on interactive transitions — replaces default ease curves */
.btn,.download,.cards article,.timeline article,.split>div,.contact,.tech-stack span,.chips li,.banner-hotspot,.banner-playground,.education li,nav a,.brand,.side-rail a{transition-timing-function:cubic-bezier(.22,.85,.3,1);transition-duration:.36s}

/* Staggered word reveal on scroll — applied to body content text */
.stagger-text .word{display:inline-block;opacity:0;transform:translateY(14px);transition:opacity .55s ease,transform .6s cubic-bezier(.22,.85,.3,1);will-change:opacity,transform}
.stagger-text.words-in .word{opacity:1;transform:translateY(0)}


/* === Simplified about-card hover: icon-only animation === */
.cards.three .about-card{transform:none !important;will-change:auto}
.cards.three .about-card:hover{transform:none !important;--rx:0deg !important;--ry:0deg !important;--lift:0px !important;box-shadow:0 14px 30px rgba(0,0,0,.08);border-color:rgba(112, 160, 48,.5)}
.cards.three .about-card .about-clip,.cards.three .about-card:hover .about-clip{opacity:0 !important;transform:none !important}
.cards.three .about-card::after,.cards.three .about-card:hover::after{display:none !important}
.cards.three .about-card .about-content{transform:none !important}
.cards.three .about-card .about-icon svg *{transition:transform .35s cubic-bezier(.22,.85,.3,1),opacity .25s}
@keyframes iconRingSpin{from{transform:rotate(0deg)}to{transform:rotate(360deg)}}
@keyframes iconRingSpinR{from{transform:rotate(0deg)}to{transform:rotate(-360deg)}}
@keyframes iconDotPulse{0%,100%{transform:scale(1)}50%{transform:scale(1.5)}}
@keyframes iconBracketL{0%,100%{transform:translateX(0)}50%{transform:translateX(-3px)}}
@keyframes iconBracketR{0%,100%{transform:translateX(0)}50%{transform:translateX(3px)}}
@keyframes iconSlashGrow{0%,100%{stroke-dashoffset:0}50%{stroke-dashoffset:6}}
.cards.three .about-card:hover .icon-target .ring-outer{animation:iconRingSpin 5s linear infinite;transform-origin:40px 40px;transform-box:fill-box}
.cards.three .about-card:hover .icon-target .ring-mid{animation:iconRingSpinR 3.5s linear infinite;transform-origin:40px 40px;transform-box:fill-box}
.cards.three .about-card:hover .icon-target .dot-center{animation:iconDotPulse 1.2s ease-in-out infinite;transform-origin:40px 40px;transform-box:fill-box}
.cards.three .about-card:hover .icon-code .bracket-l{animation:iconBracketL .8s ease-in-out infinite}
.cards.three .about-card:hover .icon-code .bracket-r{animation:iconBracketR .8s ease-in-out infinite}
.cards.three .about-card:hover .icon-code .slash{stroke-dasharray:48;animation:iconSlashGrow 1.6s ease-in-out infinite}

/* QA mascot — replaces the 3D robot. Lives inside .robot-stage; transform is
   driven from JS so it bobs, sways, and tilts with the cursor. */
.mascot{position:absolute;left:50%;top:50%;width:min(45vw, 850px);max-width:none;height:auto;
  transform:translate(-50%,-50%);transform-origin:50% 70%;
  pointer-events:none;will-change:transform;
  /* Layered neutral shadow — Apple product-shot feel: tight contact + soft ambient */
  filter:
    drop-shadow(0 4px 8px rgba(0,0,0,.18))
    drop-shadow(0 22px 36px rgba(0,0,0,.16))
    drop-shadow(0 38px 70px rgba(0,0,0,.12))}
@media(max-width:1180px){.mascot{width:min(55vw, 720px)}}
@media(max-width:900px){.mascot{width:min(95vw, 700px)}}
@media(max-width:760px){.mascot{width:100vw}}
@media(prefers-reduced-motion:reduce){.mascot{transform:translate(-50%,-50%)!important}}

/* Refined platform — soft elliptical contact shadow only, no glowing rings */
.platform{background:radial-gradient(ellipse,rgba(0,0,0,.22),transparent 62%)!important;
  width:360px!important;height:70px!important;bottom:14px!important}
.platform i,.platform em{display:none!important}

/* === Tech presentation upgrade for the three about-cards === */
/* Per-card accent — used by stats, scanner, and hover states */
.cards.three .about-card:nth-child(1){--card-accent:#70A030}
.cards.three .about-card:nth-child(2){--card-accent:#0071e3}
.cards.three .about-card:nth-child(3){--card-accent:#70A030}

/* Index counter + extra room for the top/bottom ornaments */
.cards.three{counter-reset:card}
.cards.three .about-card{counter-increment:card;padding:42px 24px 32px}

/* Top header — monospace status label per card */
.cards.three .about-card::before{
  position:absolute;top:14px;left:0;right:0;
  text-align:center;
  font:700 9.5px var(--mono);color:#a1a1a6;letter-spacing:.18em;
  z-index:3;pointer-events:none}
.cards.three .about-card:nth-child(1)::before{content:"01 — RISK MONITORED"}
.cards.three .about-card:nth-child(2)::before{content:"02 — PIPELINE LIVE"}
.cards.three .about-card:nth-child(3)::before{content:"03 — RELEASES STABLE"}

/* Bottom animated scanner strip — defeats the earlier display:none override */
.cards.three .about-card::after{
  display:block !important;content:"";opacity:.85 !important;
  position:absolute;inset:auto auto 0 -50%;
  width:50%;height:2px;
  background:linear-gradient(90deg,transparent,var(--card-accent),transparent) !important;
  animation:cardScan 3.6s linear infinite;
  z-index:3;border-radius:0;transform:none;transition:none}
@keyframes cardScan{0%{left:-50%}100%{left:100%}}

/* Description — restore visibility (defeats line 500's white !important) */
.cards.three .about-card p{color:#6e6e73 !important;font-size:14px;line-height:1.55;max-width:34ch;margin-top:8px}

/* Stats — always visible, refined pill design with per-card accent on hover */
.about-stats{opacity:1 !important;transform:none !important;margin-top:14px;gap:10px}
.about-stat{padding:6px 12px !important;background:#fafafa !important;
  border:1px solid rgba(0,0,0,.08) !important;border-radius:10px !important;
  flex-direction:row !important;gap:8px !important;align-items:baseline}
.about-stat strong{font:800 14px var(--display);color:#1d1d1f !important;letter-spacing:-.01em}
.about-stat em{font:700 8.5px var(--mono);color:#86868b !important;letter-spacing:.14em;text-transform:uppercase;font-style:normal}
.cards.three .about-card:hover .about-stat{border-color:var(--card-accent) !important;background:#ffffff !important}
.cards.three .about-card:hover .about-stat strong{color:var(--card-accent) !important}

/* Topnav scrolls away with the page (no longer sticky) */
.topnav{position:relative !important;top:auto !important}

/* Section intro paragraph — defeat the white-on-white !important rule */
.intro{color:#1d1d1f !important}

/* Hero lead — auto-balance the two lines so they're roughly equal length */
.hero .lead{
  text-wrap:balance;
  max-width:560px!important;
  line-height:1.5!important}

/* === Mobile menu — refined === */
/* 1. Hamburger keeps its three lines when the menu is open (no X morph) */
.mobile-toggle[aria-expanded="true"]{
  background:transparent !important;
  border-radius:0 !important;
  box-shadow:none !important;
  width:48px !important;height:48px !important;padding:0 !important}
.mobile-toggle[aria-expanded="true"] span,
.mobile-toggle[aria-expanded="true"] span:nth-child(1),
.mobile-toggle[aria-expanded="true"] span:nth-child(2),
.mobile-toggle[aria-expanded="true"] span:nth-child(3){
  background:#70A030 !important;
  width:30px !important;height:3px !important;
  transform:none !important;opacity:1 !important;border-radius:2px}

/* 2. Pill-style menu — rebuilt as a polished glass dropdown that emerges
      from the hamburger corner. Pill highlights replace harsh dividers;
      scrollbar is always visible and properly gutter-stable. */
/* Page-level: keep the body scrollbar permanent so its appearance/disappearance
   never shifts fixed-positioned UI (the menu) horizontally. */
html{overflow-y:scroll;-webkit-text-size-adjust:100%;text-size-adjust:100%}

/* === iPhone / Android mobile polish =====================================
   Tap highlight + selection cleanup, safe-area-inset support for notched
   devices, overscroll containment, and viewport-aware spacing. */

/* Kill the default blue/gray tap-highlight flash on iOS/Android — replaced
   by our own :active/touch press states (set per-component). */
*{-webkit-tap-highlight-color:transparent}

/* Sane selection color */
::selection{background:rgba(112, 160, 48,.25);color:inherit}

/* Prevent rubber-band overscroll on the page (still allowed inside menus etc.) */
body{overscroll-behavior-y:none;-webkit-tap-highlight-color:transparent}

/* Respect device safe areas (iPhone notch / Dynamic Island / home indicator) */
@supports (padding: env(safe-area-inset-top)){
  .topnav{padding-top:env(safe-area-inset-top,0)!important;padding-left:max(16px,env(safe-area-inset-left,0));padding-right:max(16px,env(safe-area-inset-right,0))}
  .side-rail.left{left:max(18px,env(safe-area-inset-left,0))}
  .side-rail.right{right:max(18px,env(safe-area-inset-right,0))}
  #scrollProgress{top:env(safe-area-inset-top,0)}
  /* Pull the mobile menu away from the right edge when there's an inset */
  @media(max-width:900px){
    .topnav nav{right:max(14px,env(safe-area-inset-right,0))!important}
  }
}

/* iOS Safari address-bar awareness — use small viewport units where the
   address bar matters (so we never get cropped content on initial load). */
@media(max-width:900px){
  .interface{min-height:100svh}
  #introOverlay{height:100svh}
}

/* Touch-only devices: drop GPU-heavy backdrop-filter — it tanks frame rate
   on older Android phones and adds little visual benefit on small screens. */
@media(max-width:760px),(hover:none){
  .topnav{backdrop-filter:none!important;-webkit-backdrop-filter:none!important}
  .topnav nav{backdrop-filter:blur(12px) saturate(140%)!important;-webkit-backdrop-filter:blur(12px) saturate(140%)!important}
}

/* Tighter hero spacing on small phones so the mascot doesn't push everything
   below the fold (was already tight; this is the final squeeze). */
@media(max-width:520px){
  .section-grid{padding:24px 16px 16px!important}
  .hero h1{font-size:clamp(36px,10.5vw,52px)!important;line-height:.95!important}
  .lead{font-size:15px!important;margin-top:18px!important}
  .actions{margin:20px 0!important}
  .btn{padding:14px 16px!important;font-size:13.5px!important}
  .tech-stack{margin-top:18px!important;gap:6px!important}
  .tech-stack span{padding:7px 11px!important;font-size:12px!important}
  .eyebrow{font-size:13px!important;margin-bottom:14px!important}
  .hero-center{min-height:340px!important}
  /* Section/content gutters tighter */
  .content-section{margin:0 12px 18px!important;padding:24px 14px!important}
  .metrics{margin:0 12px 16px!important;padding:14px!important}
}

/* iPhone SE / very small phones (≤375px) — last-mile fits */
@media(max-width:380px){
  .interface{margin:0!important}
  .hero h1{font-size:clamp(32px,10vw,46px)!important}
  .metrics strong{font-size:30px!important}
  .section-title h2{font-size:26px!important}
  .contact h2{font-size:30px!important}
}

/* Mobile-only: hide the decorative side rails completely on phones to give
   content full width (was display:none at 760+; reinforce for clarity) */
@media(max-width:900px){
  .side-rail{display:none!important}
}

/* === QA Snapshot Rings — circular progress rings (Apple Watch style) === */
.qa-rings{
  background:#ffffff!important;
  border:1px solid rgba(0,0,0,.08)!important;
  border-radius:18px!important;
  clip-path:none!important;
  box-shadow:0 4px 14px rgba(0,0,0,.04)!important;
  padding:0!important;display:block!important;
  grid-template-columns:none!important;overflow:hidden;
  margin:0 84px 34px!important}
.qar-head{
  display:flex;align-items:center;justify-content:space-between;gap:16px;
  padding:14px 22px;
  background:linear-gradient(180deg,#fafafa,#f5f5f7);
  border-bottom:1px solid rgba(0,0,0,.07);
  font:700 11.5px var(--mono);letter-spacing:.14em;color:#1d1d1f;
  flex-wrap:wrap}
.qar-title{display:inline-flex;align-items:center;gap:8px}
.qar-play{width:0;height:0;border:6px solid transparent;border-left-color:#1d1d1f;display:inline-block}
.qar-status{display:inline-flex;align-items:center;gap:8px;color:#70A030;letter-spacing:.18em}
.qar-status-dot{width:8px;height:8px;border-radius:50%;background:#70A030;
  box-shadow:0 0 0 0 rgba(112, 160, 48,.6);animation:qarPulse 1.8s ease-in-out infinite}
@keyframes qarPulse{0%,100%{box-shadow:0 0 0 0 rgba(112, 160, 48,.5)}50%{box-shadow:0 0 0 6px rgba(112, 160, 48,0)}}
.qar-build{color:#86868b;font-weight:500;letter-spacing:.08em}
.qar-build em{color:#1d1d1f;font-style:normal;font-weight:700}

/* Ring grid */
.qar-grid{
  display:grid;grid-template-columns:repeat(4,1fr);
  gap:0;padding:28px 22px 22px}
.qar-ring{
  display:flex;flex-direction:column;align-items:center;
  text-align:center;padding:0 12px;gap:10px;
  border-right:1px solid rgba(0,0,0,.06)}
.qar-ring:last-child{border-right:0}

.qar-svg-wrap{position:relative;width:100%;max-width:170px;aspect-ratio:1}
.qar-ring svg{width:100%;height:100%;display:block;overflow:visible}
.qar-ring-bg{fill:none;stroke:rgba(0,0,0,.06);stroke-width:7}
.qar-ring-fg{
  fill:none;stroke:var(--c);stroke-width:7;stroke-linecap:round;
  stroke-dasharray:326.7;stroke-dashoffset:326.7;
  filter:drop-shadow(0 0 6px color-mix(in srgb, var(--c) 60%, transparent));
  transition:none}

.qar-center{
  position:absolute;top:50%;left:50%;
  transform:translate(-50%,-50%);
  display:flex;align-items:baseline;justify-content:center;gap:1px;
  pointer-events:none}
.qar-center strong{
  font:700 38px var(--display);color:var(--c);
  letter-spacing:-.02em;line-height:1;font-style:normal}
.qar-suffix{
  font:700 18px var(--display);color:var(--c);
  letter-spacing:-.02em;line-height:1}

.qar-unit{font:700 10px var(--mono);color:#1d1d1f;letter-spacing:.16em;text-transform:uppercase}
.qar-label{font:500 9.5px var(--mono);color:#86868b;letter-spacing:.18em;text-transform:uppercase;margin-top:-2px}

/* Footer status strip */
.qar-foot{
  display:flex;align-items:center;justify-content:space-between;gap:16px;
  padding:12px 22px;background:#fafafa;border-top:1px solid rgba(0,0,0,.06);
  font:600 10px var(--mono);color:#86868b;letter-spacing:.14em;
  flex-wrap:wrap}

/* Hover micro — ring lifts + brightens */
.qar-ring{transition:transform .35s cubic-bezier(.22,.85,.3,1)}
.qar-ring:hover{transform:translateY(-4px)}
.qar-ring:hover .qar-ring-fg{filter:drop-shadow(0 0 12px var(--c))}

/* Responsive — 2x2 on tablets, 1-column stack on phones */
@media(max-width:1180px){
  .qa-rings{margin:0 70px 30px!important}
}
@media(max-width:900px){
  .qa-rings{margin:0 36px 22px!important}
  .qar-head{padding:12px 16px;gap:8px;font-size:10px}
  .qar-build{display:none}
  .qar-grid{grid-template-columns:repeat(2,1fr);padding:20px 14px 16px;gap:18px 0}
  .qar-ring{border-right:1px solid rgba(0,0,0,.06)}
  .qar-ring:nth-child(2n){border-right:0}
  .qar-svg-wrap{max-width:140px}
  .qar-center strong{font-size:32px}
  .qar-foot{padding:10px 16px;font-size:9.5px}
}
@media(max-width:520px){
  .qar-grid{grid-template-columns:repeat(2,1fr);padding:14px 10px}
  .qar-svg-wrap{max-width:120px}
  .qar-center strong{font-size:26px}
  .qar-suffix{font-size:14px}
}

/* === QA Pipeline Dashboard — replaces the legacy metrics + terminal === */
.qa-dashboard{
  background:#ffffff!important;
  border:1px solid rgba(0,0,0,.08)!important;
  border-radius:18px!important;
  clip-path:none!important;
  box-shadow:0 4px 14px rgba(0,0,0,.04)!important;
  padding:0!important;
  display:block!important;
  grid-template-columns:none!important;
  overflow:hidden}

/* Top status bar */
.qad-head{
  display:flex;align-items:center;justify-content:space-between;gap:16px;
  padding:14px 22px;
  background:linear-gradient(180deg,#fafafa,#f5f5f7);
  border-bottom:1px solid rgba(0,0,0,.07);
  font:700 11.5px var(--mono);letter-spacing:.14em;color:#1d1d1f;
  flex-wrap:wrap}
.qad-title{display:inline-flex;align-items:center;gap:8px;color:#1d1d1f}
.qad-play{width:0;height:0;border:6px solid transparent;border-left-color:#1d1d1f;display:inline-block}
.qad-status{display:inline-flex;align-items:center;gap:8px;color:#70A030;font-weight:700;letter-spacing:.18em}
.qad-dot{width:8px;height:8px;border-radius:50%;background:#70A030;box-shadow:0 0 0 0 rgba(112, 160, 48,.6);animation:qadPulse 1.8s ease-in-out infinite}
@keyframes qadPulse{
  0%,100%{box-shadow:0 0 0 0 rgba(112, 160, 48,.5)}
  50%{box-shadow:0 0 0 6px rgba(112, 160, 48,0)}}
.qad-build{color:#86868b;font-weight:500;letter-spacing:.08em}
.qad-build em{color:#1d1d1f;font-style:normal;font-weight:700}

/* KPI row — 4 columns */
.qad-kpis{
  display:grid;grid-template-columns:repeat(4,1fr);
  border-bottom:1px solid rgba(0,0,0,.07)}
.qad-kpi{
  padding:18px 22px;
  border-right:1px solid rgba(0,0,0,.07);
  display:flex;flex-direction:column;align-items:flex-start;gap:4px;
  position:relative;
  transition:background .25s ease}
.qad-kpi:last-child{border-right:0}
.qad-kpi:hover{background:rgba(0,0,0,.02)}
.qad-kpi-label{font:700 9.5px var(--mono);color:#86868b;letter-spacing:.18em;text-transform:uppercase}
.qad-kpi strong{
  font:700 32px var(--display);color:var(--c,#1d1d1f);
  letter-spacing:-.02em;line-height:1;margin:6px 0 2px;font-style:normal}
.qad-kpi-unit{font:600 10px var(--mono);color:#1d1d1f;letter-spacing:.16em;text-transform:uppercase}
.qad-kpi-meta{font:500 10px var(--mono);color:#86868b;letter-spacing:.06em;margin-top:6px}
.qad-bar{margin-top:8px;width:100%;height:5px;background:rgba(0,0,0,.07);border-radius:999px;overflow:hidden}
.qad-bar>span{display:block;height:100%;background:var(--c,#70A030);border-radius:999px;
  box-shadow:0 0 8px var(--c,#70A030)}

/* Body — pipeline + recent runs side by side */
.qad-body{
  display:grid;grid-template-columns:1.15fr 1fr;gap:0}
.qad-pipeline{
  padding:18px 22px;border-right:1px solid rgba(0,0,0,.07);
  display:flex;flex-direction:column;gap:14px}
.qad-section-title{font:700 9.5px var(--mono);color:#86868b;letter-spacing:.18em;text-transform:uppercase}
.qad-pipe-track{display:flex;align-items:center;gap:8px;flex-wrap:wrap}
.qad-stage{display:inline-flex;align-items:center;gap:7px;
  font:700 10.5px var(--mono);color:#1d1d1f;letter-spacing:.12em;text-transform:uppercase}
.qad-stage i{width:11px;height:11px;border-radius:50%;background:rgba(0,0,0,.12);box-shadow:inset 0 0 0 2px #fff}
.qad-stage-done i{background:#70A030;box-shadow:inset 0 0 0 2px #fff,0 0 8px rgba(112, 160, 48,.4)}
.qad-stage-active i{background:#ff7a3d;box-shadow:inset 0 0 0 2px #fff,0 0 0 0 rgba(255, 122, 61,.5);animation:qadPulseOrange 1.4s ease-in-out infinite}
@keyframes qadPulseOrange{
  0%,100%{box-shadow:inset 0 0 0 2px #fff,0 0 0 0 rgba(255, 122, 61,.55)}
  50%{box-shadow:inset 0 0 0 2px #fff,0 0 0 7px rgba(255, 122, 61,0)}}
.qad-pipe-link{flex:1;min-width:10px;height:2px;background:linear-gradient(90deg,#70A030,#70A030 60%,rgba(0,0,0,.08));border-radius:1px}
.qad-pipe-foot{font:500 11px var(--mono);color:#6e6e73;letter-spacing:.04em;margin-top:auto}

/* Recent runs list */
.qad-runs{padding:18px 22px;display:flex;flex-direction:column;gap:10px}
.qad-runs-head{display:flex;align-items:baseline;justify-content:space-between;gap:8px}
.qad-runs-sub{font:600 10px var(--mono);color:#70A030;letter-spacing:.06em}
.qad-runs-list{list-style:none;padding:0;margin:0;display:flex;flex-direction:column;gap:6px}
.qad-runs-list li{
  display:grid;grid-template-columns:14px 1fr auto auto;gap:10px;align-items:center;
  padding:7px 10px;background:rgba(112, 160, 48,.04);border-radius:8px;
  border:1px solid rgba(112, 160, 48,.10);
  transition:transform .2s ease,background .2s ease}
.qad-runs-list li:hover{background:rgba(112, 160, 48,.08);transform:translateX(3px)}
.qad-run-ok{width:14px;height:14px;border-radius:50%;background:#70A030;
  display:grid;place-items:center;color:#fff;position:relative}
.qad-run-ok::after{content:"";width:5px;height:8px;border-right:2px solid #fff;border-bottom:2px solid #fff;transform:rotate(45deg) translate(-1px,-1px)}
.qad-runs-list b{font:600 11.5px var(--mono);color:#1d1d1f;letter-spacing:0}
.qad-runs-list span{font:700 10px var(--mono);color:#70A030;letter-spacing:.06em}
.qad-runs-list time{font:500 10px var(--mono);color:#86868b;letter-spacing:.04em}

/* Responsive — collapse to single column layouts on phones */
@media(max-width:900px){
  .qad-head{padding:12px 16px;gap:8px;font-size:10px}
  .qad-build{display:none}
  .qad-kpis{grid-template-columns:repeat(2,1fr)}
  .qad-kpi{padding:14px 16px;border-right:1px solid rgba(0,0,0,.07)}
  .qad-kpi:nth-child(2n){border-right:0}
  .qad-kpi:nth-child(1),.qad-kpi:nth-child(2){border-bottom:1px solid rgba(0,0,0,.07)}
  .qad-kpi strong{font-size:26px}
  .qad-body{grid-template-columns:1fr}
  .qad-pipeline{border-right:0;border-bottom:1px solid rgba(0,0,0,.07);padding:14px 16px}
  .qad-runs{padding:14px 16px}
  .qad-pipe-track{gap:6px}
  .qad-stage{font-size:9.5px;letter-spacing:.08em}
  .qad-stage span{display:none}
  .qad-stage i{width:13px;height:13px}
}
@media(max-width:520px){
  .qad-kpis{grid-template-columns:1fr 1fr}
  .qad-kpi{padding:12px 14px}
  .qad-kpi strong{font-size:24px}
  .qad-runs-list b{font-size:10.5px}
  .qad-runs-list span,.qad-runs-list time{font-size:9px}
}

/* === Brand logo (replaces the PORTFOLIO text) === */
.brand{
  grid-template-columns:auto!important;
  column-gap:0!important;
  display:flex!important;align-items:center;
  padding:4px 0}
.brand .focus-mark,
.brand strong,
.brand em{display:none!important}
.brand-logo{
  height:176px;width:auto;display:block;
  transition:transform .35s cubic-bezier(.22,.85,.3,1)}
.brand:hover .brand-logo{transform:scale(1.04)}
@media(max-width:1180px){.brand-logo{height:152px}}
@media(max-width:900px){.brand-logo{height:120px}}
@media(max-width:520px){.brand-logo{height:100px}}

/* Let the topnav and brand grow to fit the bigger logo */
.topnav{height:auto!important;min-height:96px}
@media(max-width:1180px){.topnav{min-height:82px}}
@media(max-width:900px){.topnav{min-height:72px}}
.topnav .brand{height:auto!important;padding:0!important}

/* Menu items — all spring green (matches the logo) */
.topnav nav a{color:#70A030!important;font-weight:700!important}
.topnav nav a::after{color:#70A030!important;opacity:.7}
.topnav nav a:hover,
.topnav nav a.active{
  color:#70A030!important;
  background:rgba(112, 160, 48,.10)!important;
  padding-left:22px!important;
  box-shadow:inset 3px 0 0 #70A030!important}
.topnav nav a:hover::after,
.topnav nav a.active::after{
  color:#70A030!important;opacity:1;transform:translateX(4px)}

/* Hero — tighter overall footprint so it fits in one viewport with marquee */
.section-grid{padding-top:24px!important;padding-bottom:16px!important;min-height:auto!important}
@media(max-width:1180px){.section-grid{padding-top:28px!important;min-height:auto!important}}
@media(max-width:900px){.section-grid{padding-top:14px!important}}
@media(max-width:520px){.section-grid{padding-top:10px!important;padding-bottom:8px!important}}
.hero-center{min-height:380px!important}
@media(max-width:1180px){.hero-center{min-height:340px!important}}
@media(max-width:900px){.hero-center{min-height:380px!important}}
.eyebrow{margin-bottom:18px!important}
.hero h1{font-size:clamp(36px,3.6vw,64px)!important;line-height:.96!important}
.lead{margin-top:18px!important;font-size:16px!important}
.actions{margin:22px 0 0!important}
@media(max-width:520px){.eyebrow{margin-bottom:12px!important}}

/* === Final mobile polish === */
/* No 300ms tap delay; lets the browser commit gestures faster */
a,button,.btn,.download,.exp-toggle,.mobile-toggle,
.contact-terminal,.banner-playground,.magnetic,.cert-tile,
.tech-stack span,.dash-tools-list li,.about-card{
  touch-action:manipulation}

/* All images fluid by default — defends against any unset img causing overflow */
img{max-width:100%;height:auto}

/* Mascot — at very small phones still as big as possible without horizontal
   scroll. Speech bubble + magnifier remain visible. */
@media(max-width:520px){
  .mascot{width:140vw!important}
}
@media(max-width:380px){
  .mascot{width:155vw!important}
}

/* Banner playground stays fluid on phones */
@media(max-width:760px){
  .banner-playground{max-width:100%!important;margin:0 auto}
  .banner-window img{width:100%!important;height:auto!important;max-width:100%!important}
}

/* Touch-friendly press feedback for cert tiles + about-cards (hover-less) */
@media(hover:none){
  .cert-tile:active{transform:translate(1px,1px)!important;box-shadow:2px 2px 0 #1d1d1f!important}
  .about-card:active{transform:translateY(-2px) scale(.99)!important;transition:transform .12s}
  .tech-stack span:active{border-color:#70A030!important;color:#70A030!important}
}

/* Ensure form controls / interactive text is at least 16px on iOS to prevent
   automatic zoom-on-focus (which is jarring). */
@media(max-width:760px){
  input,select,textarea{font-size:16px!important}
}

/* === Skills Dashboard mobile refinements === */
@media(max-width:900px){
  /* Remove the wasted 160px grid row (the art element is display:none) */
  .dash-featured{grid-template-rows:auto!important}
  /* Cleaner tools panel padding so the list breathes */
  .dash-tools{padding:18px 18px 20px!important}
  /* Featured info breathes */
  .dash-featured-info{padding:20px 18px!important}
  /* Used-at pills wrap nicely */
  .dash-used-at{flex-wrap:wrap;gap:8px}
}

@media(max-width:600px){
  /* 44+px tap targets on skill rows; bigger labels for readability */
  .dash-tool-row{
    padding:12px 12px!important;
    gap:10px!important;
    min-height:46px;
    grid-template-columns:18px 26px 1fr auto!important}
  .dash-tool-rank{font-size:10px!important}
  .dash-tool-name{font-size:13.5px!important}
  .dash-tool-meta{font-size:10.5px!important}
  .dash-tool-avatar{width:26px!important;height:26px!important;border-radius:8px!important}
  /* CTA fills the panel width on phones for an unmissable tap target */
  .dash-cta{align-self:stretch!important;justify-content:center!important;padding:12px 14px!important;font-size:12px!important}
  /* Used-at pills slightly larger for touch */
  .co-pill{width:40px!important;height:40px!important}
  /* Featured panel typography */
  .dash-featured-info h3{font-size:18px!important}
  .dash-featured-info p{font-size:13px!important;-webkit-line-clamp:3!important}
  .dash-tagline{font-size:9.5px!important;letter-spacing:.18em!important}
  /* Spotlight progress label sits above the bar — give it room */
  .dash-progress-label{font-size:10.5px!important;top:-20px!important}
  /* Tighten meta pills for narrow widths */
  .meta-pill{font-size:9.5px!important;padding:3px 8px!important}
}

@media(max-width:380px){
  .dash-tool-row{padding:10px 10px!important;grid-template-columns:16px 22px 1fr auto!important}
  .dash-tool-name{font-size:12.5px!important}
  .co-pill{width:36px!important;height:36px!important}
}

/* Disable sticky hover transforms on touch devices — they leave artifacts */
@media(hover:none){
  .dash-tool-row:hover{background:rgba(0,0,0,.03)!important;transform:none!important}
  .dash-tool-row:active{background:rgba(112, 160, 48,.18)!important;transform:translateX(2px)!important}
  .co-pill:hover{transform:none!important;box-shadow:0 2px 8px rgba(0,0,0,.3),inset 0 1px 0 rgba(255,255,255,.45)!important}
  .dash-cta:hover{transform:none!important;box-shadow:none!important}
}

/* Metrics — fix first-item left alignment on stacked mobile layout.
   The desktop ":first-of-type{padding-left:0}" flushes it against the left
   divider in the 4-column row; on mobile all items need the same left pad. */
@media(max-width:900px){
  .metrics div:first-of-type{padding-left:20px!important}
}

/* === Lenis smooth scroll — recommended chrome resets === */
html.lenis,html.lenis body{height:auto}
.lenis.lenis-smooth{scroll-behavior:auto!important}
.lenis.lenis-smooth [data-lenis-prevent]{overscroll-behavior:contain}
.lenis.lenis-stopped{overflow:hidden}
.lenis.lenis-smooth iframe{pointer-events:none}

/* === Reveals are now driven by GSAP ScrollTrigger; let it own opacity/transform === */
.reveal{transition:none}

/* === Compact menu — CSS handles open/close, GSAP handles pill + hovers === */
@media(max-width:900px){
  .topnav nav{
    /* Tight dimensions — small popover */
    width:min(200px, calc(100vw - 32px))!important;
    max-height:min(320px, calc(100dvh - 90px))!important;
    padding:4px!important}

  /* Items — tighter rows, slightly smaller font */
  nav#mainNav a{
    padding:7px 11px!important;
    height:32px!important;
    max-height:32px!important;
    min-height:0!important;
    font:700 16px/1.15 var(--display)!important;
    gap:8px!important;
    border-radius:8px!important;
    /* Strip per-item background (the moving pill handles highlight now) */
    background:transparent!important;
    box-shadow:none!important;
    position:relative;
    z-index:1;
    /* GSAP drives x; reset CSS transitions on x */
    transition:color .25s ease!important}
  nav#mainNav a small{
    width:18px!important;
    min-width:18px!important;
    font:700 9.5px var(--mono)!important}

  /* Hover/active color — pill provides the bg, just shift text color */
  .topnav nav a.active{color:#70A030!important;box-shadow:none!important}
  .topnav nav a:hover{background:transparent!important;color:#70A030!important;padding-left:11px!important}
  body.menu-open .topnav nav a{animation:none!important}
}

/* The moving pill — sits behind the link text and animates between items */
.nav-pill{
  position:absolute;
  top:0;left:0;
  width:0;height:0;
  background:linear-gradient(90deg, rgba(112, 160, 48,.14), rgba(112, 160, 48,.10));
  border-radius:8px;
  z-index:0;
  pointer-events:none;
  box-shadow:inset 3px 0 0 #70A030, 0 1px 6px rgba(0,0,0,.04);
  will-change:transform,width,height,opacity}

/* === Cert tile descriptions — short tagline per cert === */
.cert-meta{
  margin:8px 0 0;
  font:500 11.5px/1.4 var(--display);
  color:var(--ink, #1d1d1f);
  opacity:.78;
  letter-spacing:.005em}
.cert-tile--feature .cert-meta{
  font-size:12.5px;
  margin-top:10px;
  max-width:38ch}
.cert-tile--mini .cert-spec{
  display:block;
  margin-top:auto;
  font:600 9px var(--mono);
  color:var(--ink, #1d1d1f);
  opacity:.75;
  letter-spacing:.08em;
  text-transform:uppercase}

/* On small screens, slightly tighter description */
@media(max-width:760px){
  .cert-meta{font-size:11px;margin-top:6px}
  .cert-tile--feature .cert-meta{font-size:12px}
}
@media(max-width:520px){
  .cert-meta{font-size:10.5px}
}

/* === Cinematic intro overlay (page load) === */
#introOverlay{
  position:fixed;inset:0;z-index:1000;
  background:#0d0d10;color:#f5f5f7;
  display:flex;flex-direction:column;align-items:center;justify-content:center;
  gap:18px;pointer-events:none;
  will-change:transform,opacity}
#introOverlay .intro-logo{
  display:block;
  width:min(56vw,520px);
  height:auto;
  filter:drop-shadow(0 14px 38px rgba(122,255,118,.18)) drop-shadow(0 4px 10px rgba(0,0,0,.5));
  opacity:0;
  transform:scale(.92);
  will-change:transform,opacity;
  margin-bottom:8px}
#introOverlay .intro-mark{
  font:700 clamp(28px,5vw,52px) var(--mono);
  letter-spacing:.18em;
  opacity:0;
  white-space:nowrap}
#introOverlay .intro-sub{
  font:600 11px var(--mono);
  color:rgba(255,255,255,.4);
  letter-spacing:.32em;
  opacity:0}
#introOverlay.gone{display:none}

/* Mobile — keep the logo big but contained */
@media(max-width:900px){
  #introOverlay .intro-logo{width:min(78vw,420px)}
}
@media(max-width:520px){
  #introOverlay .intro-logo{width:min(86vw,360px)}
  #introOverlay{gap:14px}
}

/* Lock scroll while intro plays */
body.intro-active{overflow:hidden!important}

/* === Top scroll progress bar === */
#scrollProgress{
  position:fixed;top:0;left:0;
  height:2px;width:0;
  background:linear-gradient(90deg,#70A030,#70A030);
  z-index:60;pointer-events:none;
  transition:width .12s ease-out;
  box-shadow:0 0 12px rgba(112, 160, 48,.4)}

/* === Sticky roman-numeral section label === */
#sectionLabel{
  position:fixed;left:24px;top:50%;
  transform:translateY(-50%);
  font:700 clamp(44px,5vw,72px) var(--mono);
  color:#1d1d1f;
  opacity:0;letter-spacing:.04em;
  pointer-events:none;z-index:50;
  mix-blend-mode:multiply;
  transition:opacity .42s ease}
#sectionLabel.visible{opacity:.14}
@media(max-width:900px){
  #sectionLabel{left:10px;font-size:38px}
  #sectionLabel.visible{opacity:.10}
}
@media(max-width:520px){
  #sectionLabel{display:none}
}

/* === Professional polish — keyframes, button hovers, word-reveal helper === */

/* (1) Ambient micro-floats — subtle infinite motion on accent elements */
@keyframes prof-float-y{0%,100%{transform:translateY(0)}50%{transform:translateY(-4px)}}
@keyframes prof-float-rot{0%,100%{transform:rotate(0deg)}50%{transform:rotate(1.4deg)}}
@keyframes prof-glow-pulse{
  0%,100%{box-shadow:0 0 0 0 rgba(112, 160, 48,0)}
  50%{box-shadow:0 0 0 8px rgba(112, 160, 48,.10)}}
@keyframes prof-shimmer{
  0%{background-position:-150% 0}
  100%{background-position:250% 0}}

/* Apply to small accent elements (low intensity so it reads as alive, not noisy) */
.eyebrow{animation:prof-float-y 5.5s ease-in-out infinite}
.section-title>span{animation:prof-float-y 6.5s ease-in-out infinite;display:inline-block}
.cert-sticker{animation:prof-float-rot 5s ease-in-out infinite}
.cert-badge{animation:prof-glow-pulse 3.2s ease-in-out infinite}

/* (4) Refined hover effects — scale + glow + lift on key CTAs */
.btn.primary{transition:transform .35s cubic-bezier(.22,.85,.3,1),box-shadow .35s ease!important}
.btn.primary:hover{
  transform:translateY(-3px) scale(1.03)!important;
  box-shadow:0 14px 32px rgba(0,0,0,.22),0 0 0 4px rgba(112, 160, 48,.10)!important}
.download{transition:transform .3s cubic-bezier(.22,.85,.3,1),box-shadow .3s ease,background .25s ease!important}
.download:hover{
  transform:translateY(-2px) scale(1.04)!important;
  box-shadow:0 10px 26px rgba(0,0,0,.24),0 0 0 4px rgba(112, 160, 48,.12)!important}
.dash-cta{transition:transform .3s cubic-bezier(.22,.85,.3,1),box-shadow .3s ease!important}
.dash-cta:hover{
  transform:translateY(-2px) scale(1.06)!important;
  box-shadow:0 10px 24px rgba(112, 160, 48,.55),0 0 0 3px rgba(112, 160, 48,.18)!important}
.contact-terminal{transition:transform .35s cubic-bezier(.22,.85,.3,1),box-shadow .35s ease!important}
.contact-terminal:hover{
  transform:translateY(-4px) scale(1.012)!important;
  box-shadow:0 24px 56px rgba(0,0,0,.30),0 0 0 2px rgba(112, 160, 48,.18)!important}
.cards.three .about-card{transition:transform .35s cubic-bezier(.22,.85,.3,1),box-shadow .35s ease,border-color .35s ease!important}
.cards.three .about-card:hover{transform:translateY(-6px) scale(1.012)!important}

/* (5) Word-reveal helper — wraps each word so it can slide up from a mask */
.word-wrap{display:inline-block;overflow:hidden;vertical-align:bottom;padding-bottom:.04em}
.word-inner{display:inline-block;will-change:transform}

/* (3) Subtle parallax-style backdrop drift — uses --scroll-progress var the JS sets */
.interface::after{
  content:"";position:absolute;inset:0;pointer-events:none;z-index:0;
  background:radial-gradient(
    ellipse at calc(50% + var(--scroll-progress, 0) * 60px) calc(20% + var(--scroll-progress, 0) * 200px),
    rgba(112, 160, 48,.05) 0%,
    transparent 55%);
  transition:none}

/* Honor reduced motion — kill the looping animations */
@media(prefers-reduced-motion:reduce){
  .eyebrow,.section-title>span,.cert-sticker,.cert-badge{animation:none!important}
  .btn.primary:hover,.download:hover,.dash-cta:hover,.contact-terminal:hover{transform:none!important}
}

/* === Contact terminal — fix email cut-off on mobile === */
@media(max-width:600px){
  .contact-terminal{width:100%!important}
  .contact-terminal-body{
    font-size:13px!important;
    padding:14px 14px!important;
    flex-wrap:wrap!important;
    align-items:flex-start!important;
    line-height:1.5!important}
  .ct-cmd{
    white-space:normal!important;
    overflow-wrap:anywhere!important;
    word-break:break-all!important;
    flex:1 1 100%}
  .ct-prompt{align-self:flex-start;line-height:1.4}
  .ct-caret{display:none!important} /* Caret position becomes unreliable when text wraps */
}
@media(max-width:380px){
  .contact-terminal-body{font-size:12px!important;padding:12px 12px!important}
  .contact-terminal-head{padding:8px 12px!important}
  .ct-title{font-size:10px!important}
}

/* === Tech keyword marquee (between metrics + about) === */
.tech-marquee{
  overflow:hidden;
  margin:14px 84px 28px;
  border:1px solid rgba(0,0,0,.06);
  border-radius:14px;
  background:#ffffff;
  padding:14px 0;
  box-shadow:0 4px 14px rgba(0,0,0,.04);
  pointer-events:none;
  -webkit-mask-image:linear-gradient(90deg,transparent 0,#000 6%,#000 94%,transparent 100%);
  mask-image:linear-gradient(90deg,transparent 0,#000 6%,#000 94%,transparent 100%)}
.tech-marquee-track{
  display:flex;
  gap:32px;
  width:max-content;
  white-space:nowrap;
  align-items:center}
.tech-marquee-track span{
  font:700 13px var(--mono);
  color:#1d1d1f;
  letter-spacing:.18em}
.tech-marquee-track .dot{
  color:#70A030;
  font-size:14px}
@media(max-width:1180px){.tech-marquee{margin:14px 70px 24px}}
@media(max-width:900px){
  .tech-marquee{margin:14px 36px 22px;padding:11px 0}
  .tech-marquee-track{gap:26px}
  .tech-marquee-track span{font-size:11.5px}
}
@media(max-width:520px){
  .tech-marquee{margin:14px 18px 22px;padding:10px 0}
  .tech-marquee-track{gap:22px}
  .tech-marquee-track span{font-size:11px}
}


@media(max-width:900px){
  .topnav nav{
    /* Position — shifted further inward so the page scrollbar has clear room */
    position:fixed !important;
    top:64px !important;
    right:28px !important;
    left:auto !important;

    /* Sizing — compact */
    width:min(240px, calc(100vw - 56px)) !important;
    max-height:min(420px, calc(100dvh - 100px)) !important;
    padding:5px !important;
    /* Force flex column layout (defeats inherited grid + auto-stretch) */
    grid-template-columns:none !important;
    grid-template-rows:none !important;
    grid-auto-rows:auto !important;
    align-content:flex-start !important;
    align-items:stretch !important;
    justify-content:flex-start !important;

    /* Surface — glassy with subtle depth */
    background:rgba(255,255,255,.86) !important;
    backdrop-filter:blur(24px) saturate(180%) !important;
    -webkit-backdrop-filter:blur(24px) saturate(180%) !important;
    border:1px solid rgba(0,0,0,.07) !important;
    border-radius:16px !important;
    box-shadow:
      0 18px 44px rgba(0,0,0,.14),
      0 1px 2px rgba(0,0,0,.04),
      inset 0 1px 0 rgba(255,255,255,.7) !important;
    clip-path:none !important;

    /* Layout — flat list, no grid columns */
    display:flex !important;
    flex-direction:column !important;
    gap:2px !important;

    /* Permanent scrollbar — gutter-stable so layout doesn't shift */
    overflow-y:scroll !important;
    -webkit-overflow-scrolling:touch;
    scrollbar-gutter:stable;
    scrollbar-width:thin !important;
    scrollbar-color:rgba(0,0,0,.28) transparent !important;

    /* Animation — emerge from hamburger corner */
    transform-origin:top right !important;
    transform:scale(.4) !important;
    opacity:0 !important;
    transition:transform .32s cubic-bezier(.22,.85,.3,1), opacity .22s ease !important;
    will-change:transform,opacity}
  body.menu-open .topnav nav{
    transform:scale(1) !important;
    opacity:1 !important}

  /* Permanent visible scrollbar — WebKit/Blink/iOS */
  .topnav nav::-webkit-scrollbar{
    width:6px !important;
    -webkit-appearance:none;
    display:block !important}
  .topnav nav::-webkit-scrollbar-track{
    background:rgba(0,0,0,.04);
    border-radius:3px;
    margin:6px 0}
  .topnav nav::-webkit-scrollbar-thumb{
    background:rgba(0,0,0,.28);
    border-radius:3px;
    min-height:36px}
  .topnav nav::-webkit-scrollbar-thumb:hover{background:rgba(0,0,0,.46)}

  /* Items — pill-style with rounded highlight on hover/active */
  .topnav nav a{
    display:flex !important;
    align-items:center !important;
    gap:10px !important;
    padding:9px 12px !important;
    font:700 17px/1.2 var(--display) !important;
    flex:0 0 auto !important;
    min-height:0 !important;
    height:auto !important;
    letter-spacing:-.005em !important;
    color:#1d1d1f !important;
    background:transparent !important;
    border:0 !important;
    border-radius:10px !important;
    text-decoration:none !important;
    text-align:left !important;
    text-transform:none !important;
    box-shadow:none !important;
    width:auto !important;
    white-space:nowrap;
    overflow:hidden;
    text-overflow:ellipsis;
    transition:background .2s ease, color .2s ease, padding-left .25s cubic-bezier(.22,.85,.3,1) !important}
  .topnav nav a::after{display:none !important}

  /* Index chip — subtle mono prefix */
  .topnav nav a small{
    display:inline-flex !important;
    align-items:center;justify-content:flex-start;
    width:auto !important;min-width:22px;flex-shrink:0;
    font:700 10.5px var(--mono) !important;
    color:#a1a1a6 !important;letter-spacing:.08em}

  /* Hover */
  .topnav nav a:hover{
    background:rgba(0,0,0,.04) !important;
    color:#1d1d1f !important;
    padding-left:18px !important}
  .topnav nav a:hover small{color:#86868b !important}

  /* Active — soft orange wash + side bar */
  .topnav nav a.active{
    background:linear-gradient(90deg, rgba(112, 160, 48,.12), rgba(112, 160, 48,.02)) !important;
    color:#70A030 !important;
    box-shadow:inset 3px 0 0 #70A030 !important;
    padding-left:14px !important}
  .topnav nav a.active small{color:#70A030 !important}

  /* Touch — press feedback for mobile */
  @media(hover:none){
    .topnav nav a:hover{background:transparent !important;padding-left:14px !important}
    .topnav nav a:active{background:rgba(0,0,0,.06) !important}
  }

  /* Highest-specificity lock — beats any cached/cascade rule and any prior CSS.
     Forces compact row height (28px) with small readable text. */
  nav#mainNav a{
    padding:5px 10px !important;
    font:700 14px/1.1 var(--display) !important;
    min-height:0 !important;
    max-height:28px !important;
    height:28px !important;
    box-sizing:border-box !important;
    gap:6px !important;
    border-radius:6px !important}
  nav#mainNav a small{
    font:700 9px var(--mono) !important;
    min-width:16px !important;
    width:16px !important}
}


/* 3. Tap-feedback for touch: subtle press state */
@media(hover:none){
  .topnav nav a:active{background:rgba(0,0,0,.05) !important}
  .mobile-toggle:active span{opacity:.7}
}

/* ============================================
   PORTFOLIO MAP — paper pinboard with sticky
   notes, push pins, hand-drawn arrows, doodles
   ============================================ */
.portfolio-map{
  position:relative;
  margin:0 84px 28px;
  padding:20px 22px 24px;
  background:
    radial-gradient(circle at 18% 12%, rgba(0,0,0,.04), transparent 28%),
    radial-gradient(circle at 82% 88%, rgba(0,0,0,.05), transparent 30%),
    linear-gradient(180deg, #f5f0e6 0%, #efe8d8 100%);
  border:1px solid rgba(0,0,0,.08);
  border-radius:16px;
  box-shadow:0 4px 14px rgba(0,0,0,.05),inset 0 0 80px rgba(0,0,0,.04);
  overflow:hidden;
  isolation:isolate;
}
/* Paper grain — subtle SVG noise overlay */
.portfolio-map::before{
  content:"";position:absolute;inset:0;pointer-events:none;
  background-image:url("data:image/svg+xml,%3Csvg viewBox='0 0 200 200' xmlns='http://www.w3.org/2000/svg'%3E%3Cfilter id='n'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='.9' numOctaves='2' stitchTiles='stitch'/%3E%3C/filter%3E%3Crect width='100%25' height='100%25' filter='url(%23n)' opacity='.55'/%3E%3C/svg%3E");
  opacity:.18;mix-blend-mode:multiply;z-index:0;
}
/* Faint graph-paper grid */
.portfolio-map::after{
  content:"";position:absolute;inset:0;pointer-events:none;z-index:0;
  background-image:
    linear-gradient(to right, rgba(70,55,30,.06) 1px, transparent 1px),
    linear-gradient(to bottom, rgba(70,55,30,.06) 1px, transparent 1px);
  background-size:32px 32px;
  mask-image:radial-gradient(ellipse at center,#000 60%, transparent 95%);
}

.pmap-head{position:relative;z-index:2;text-align:center;margin-bottom:8px}
.pmap-tag{display:inline-block;font:700 9.5px var(--mono);color:#7a7160;letter-spacing:.22em;margin-bottom:4px}
.pmap-head h2{
  margin:0;font-family:'Permanent Marker',cursive;
  font-size:clamp(18px,2.1vw,28px);color:#2a2a2e;
  letter-spacing:.005em;line-height:1.1;text-transform:none;
  transform:rotate(-1deg);
}
.pmap-sub{
  margin:2px 0 0;font-family:'Caveat',cursive;font-weight:500;
  font-size:clamp(13px,1.1vw,16px);color:#6a6356;
  transform:rotate(.6deg);
}

/* Canvas — the workspace where notes & wordmark sit */
.pmap-canvas{
  position:relative;z-index:2;
  min-height:320px;
  margin-top:8px;
}

/* Decorative scotch-tape strips on the page */
.pmap-tape{
  position:absolute;width:80px;height:18px;
  background:linear-gradient(180deg, rgba(255,243,180,.78), rgba(255,235,140,.6));
  box-shadow:0 1px 2px rgba(0,0,0,.08);
  z-index:3;border:1px solid rgba(0,0,0,.04);
}
.pmap-tape--1{top:-8px;left:14%;transform:rotate(-9deg)}
.pmap-tape--2{bottom:-8px;right:11%;transform:rotate(7deg)}

/* Wordmark — center "AMIET / QA STUDIO" with marker font */
.pmap-wordmark{
  position:absolute;
  left:50%;top:50%;transform:translate(-50%,-50%);
  z-index:2;text-align:center;
  display:flex;flex-direction:column;align-items:center;gap:4px;
  pointer-events:none;
}
.pmap-word-line{
  font-family:'Permanent Marker',cursive;
  color:#1d1d1f;letter-spacing:-.01em;line-height:.9;
  text-shadow:3px 3px 0 rgba(255,122,61,.18),5px 5px 0 rgba(0,0,0,.06);
}
.pmap-word-line.one{
  font-size:clamp(40px,5.6vw,78px);
  transform:rotate(-1.5deg);
  background:linear-gradient(180deg,#1d1d1f 0%,#1d1d1f 62%,#ff7a3d 62%,#ff7a3d 100%);
  -webkit-background-clip:text;background-clip:text;-webkit-text-fill-color:transparent;
}
.pmap-word-line.two{
  font-size:clamp(18px,2.2vw,32px);color:#5a5346;
  transform:rotate(1.2deg) translateX(5px);
  letter-spacing:.04em;
}
.pmap-word-stamp{
  display:inline-block;margin-top:6px;padding:2px 8px;
  font:700 8px var(--mono);letter-spacing:.22em;color:#a04040;
  border:1.4px solid #a04040;border-radius:3px;
  transform:rotate(-5deg);
  background:rgba(255,255,255,.4);
  text-transform:uppercase;
}

/* Hand-drawn arrow lines */
.pmap-arrows{
  position:absolute;inset:0;width:100%;height:100%;
  z-index:1;pointer-events:none;
}
.pmap-arrows path{
  fill:none;stroke:#7a6a52;stroke-width:2.4;
  stroke-dasharray:6 5;stroke-linecap:round;
  filter:drop-shadow(0 1px 0 rgba(255,255,255,.4));
}
.pmap-arrowheads path{fill:#7a6a52;stroke:none}

/* Sticky notes */
.pmap-note{
  position:absolute;
  width:158px;padding:18px 12px 12px;
  background:var(--c,#FFE16A);color:#1d1d1f;
  transform:rotate(var(--rot,0deg));
  box-shadow:
    0 1px 0 rgba(255,255,255,.5) inset,
    0 6px 14px rgba(0,0,0,.18),
    0 2px 4px rgba(0,0,0,.1);
  z-index:3;
  transition:transform .35s cubic-bezier(.22,.85,.3,1);
}
.pmap-note:hover{transform:rotate(0deg) translateY(-3px) scale(1.02);z-index:5}
.pmap-note h3{
  margin:0 0 3px;
  font-family:'Permanent Marker',cursive;
  font-weight:400;font-size:14.5px;line-height:1.05;
  color:#1d1d1f;text-transform:none;letter-spacing:.005em;
}
.pmap-note p{
  margin:0;
  font-family:'Caveat',cursive;font-weight:500;
  font-size:13.5px;line-height:1.22;color:#36322a;
}
.pmap-note--tl{top:4px;left:14px}
.pmap-note--tr{top:10px;right:16px}
.pmap-note--bl{bottom:16px;left:22px}
.pmap-note--br{bottom:10px;right:22px}

/* Push pin — domed CSS circle with highlight & shadow */
.pmap-pin{
  position:absolute;left:50%;top:-6px;transform:translateX(-50%);
  width:13px;height:13px;border-radius:50%;
  background:radial-gradient(circle at 32% 28%,
    color-mix(in srgb, var(--pin) 100%, white 50%) 0%,
    var(--pin) 38%,
    color-mix(in srgb, var(--pin) 70%, black 30%) 92%);
  box-shadow:
    0 2px 5px rgba(0,0,0,.45),
    inset 0 -2px 3px rgba(0,0,0,.25),
    inset 0 2px 2px rgba(255,255,255,.55);
  z-index:6;
}

/* Doodle handwritten captions */
.pmap-doodle{
  position:absolute;z-index:4;
  font-family:'Caveat',cursive;font-weight:500;
  font-size:clamp(12px,1vw,15px);color:#7a6a52;
  pointer-events:none;
}
.pmap-doodle--auto{left:26%;top:30%;transform:rotate(-5deg)}
.pmap-doodle--about{right:25%;top:32%;transform:rotate(4deg)}

/* Responsive — tablet: tighten layout */
@media(max-width:1180px){
  .portfolio-map{margin:0 70px 24px;padding:16px 16px 20px}
  .pmap-canvas{min-height:280px}
  .pmap-note{width:140px;padding:15px 10px 10px}
  .pmap-note h3{font-size:13.5px}
  .pmap-note p{font-size:12.5px}
  .pmap-note--tl{left:8px}
  .pmap-note--tr{right:10px}
  .pmap-note--bl{left:14px;bottom:14px}
  .pmap-note--br{right:14px;bottom:8px}
  .pmap-doodle--auto{left:23%;top:32%}
  .pmap-doodle--about{right:22%;top:34%}
}

/* Mobile — stack notes vertically, simpler layout */
@media(max-width:900px){
  .portfolio-map{margin:0 36px 18px;padding:16px 12px 18px}
  .pmap-canvas{min-height:auto;display:flex;flex-direction:column;align-items:center;gap:10px;padding-top:6px}
  .pmap-wordmark{position:relative;left:auto;top:auto;transform:none;order:1}
  .pmap-word-line.two{transform:rotate(1deg) translateX(0)}
  .pmap-arrows,.pmap-doodle{display:none}
  .pmap-note{position:relative !important;top:auto !important;left:auto !important;right:auto !important;bottom:auto !important;width:min(90%,300px)}
  .pmap-note--tl{order:2}
  .pmap-note--tr{order:3}
  .pmap-note--bl{order:4}
  .pmap-note--br{order:5}
  .pmap-tape{display:none}
  .pmap-head h2{font-size:26px}
}
@media(max-width:520px){
  .portfolio-map{margin:0 14px 14px;padding:14px 10px 16px}
  .pmap-word-line.one{font-size:42px}
  .pmap-word-line.two{font-size:18px}
}

/* ============================================================
   MOBILE SAFETY & POLISH — must come last to win specificity
   ============================================================ */

/* Root + body: always allow vertical scrolling, never horizontal overflow.
   `overscroll-behavior:none` stops browser pull-to-refresh hijack on iOS
   when the page is at the top of an inner scroll container. */
html{
  -webkit-text-size-adjust:100%;     /* iOS landscape font-size punch */
  text-size-adjust:100%;
  overflow-x:hidden;
}
body{
  overflow-x:hidden;
  overflow-y:auto;
  min-height:100dvh;                  /* dynamic viewport — handles iOS chrome */
  -webkit-overflow-scrolling:touch;   /* old iOS momentum */
  overscroll-behavior-x:none;
}

/* Touch devices: clearer scroll intent + bigger tap targets */
@media(hover:none),(pointer:coarse){
  body{touch-action:pan-y;}            /* prevent horizontal pan/zoom hijack */
  a, button, .btn, .pmap-note, .download, .mobile-toggle{
    min-height:44px;                   /* Apple HIG minimum */
    touch-action:manipulation;          /* remove 300ms tap delay */
  }
  /* Disable hover-driven transforms that get "stuck" on touch */
  .cards article:hover,
  .timeline article:hover,
  .pmap-note:hover,
  .btn:hover{transform:none!important;}
}

/* Use dynamic viewport everywhere viewport-height is critical.
   `100dvh` falls back to `100svh` on older Safari and `100vh` on legacy. */
@supports (height:100dvh){
  .interface{min-height:100dvh}
  #introOverlay{height:100dvh}
}

/* iOS Safari address-bar safe-area on the topnav */
@supports (top:env(safe-area-inset-top)){
  .topnav{padding-top:max(0px,env(safe-area-inset-top))}
}

/* Phones: kill all sticky/parallax that can cause scroll snags on iOS */
@media(max-width:760px){
  /* Native scroll only — no `position: sticky` shenanigans */
  .topnav{position:sticky!important;top:0;z-index:50}
  /* Block any element from causing horizontal overflow */
  .interface,.section-grid,.content-section,
  .hero, .qa-rings, .qa-dashboard,
  .portfolio-map, .banner-lab{
    max-width:100vw;overflow-x:clip;
  }
  /* Mascot must never extend wider than viewport on a phone */
  .mascot{max-width:100vw!important}
  /* Mascot stage stays centered on phones (override the 36%/44% shift used on desktop) */
  .robot-stage{left:50%!important;top:50%!important;
    transform:translate(-50%,-50%) scale(.75)!important}
  /* Inline-style overrides for the section labels that float fixed */
  #sectionLabel{display:none!important}
}

/* Skip overlay should never permanently swallow touches.
   If anything goes wrong and `.gone` isn't applied, force-hide once
   any user-initiated scroll happens. Last-ditch safety net. */
#introOverlay.gone{
  display:none!important;pointer-events:none!important;
  visibility:hidden!important;
}

/* When the body still claims to be intro-active but the user has scrolled,
   release the scroll lock as a backup. (Some browsers fire `scroll` before
   our JS unlocks — we honor user intent immediately.) */
body.intro-active{overflow:hidden!important}
body.intro-active.scrolled{overflow:auto!important}

/* Menu-open should also gracefully release on outside touch — handled in JS,
   but ensure the scroll lock never stacks (defensive). */
body.menu-open{overflow:hidden;touch-action:none}

/* Hero section: on very small phones, give breathing room and stack cleanly */
@media(max-width:520px){
  .hero{padding-bottom:14px!important}
  .hero-center{min-height:300px!important;margin-top:8px!important}
  .robot-stage{transform:translate(-50%,-50%) scale(.62)!important}
  /* Cap intro logo height so it doesn't dominate small screens */
  #introOverlay .intro-logo{width:min(80vw,300px)!important}
  #introOverlay .intro-mark{font-size:clamp(22px,5.5vw,36px)!important}
  /* Force the Lenis-injected wrapper height to behave on iOS */
  .lenis,.lenis-smooth{height:auto!important}
}

/* Prevent the cursor follower from intercepting taps on touch devices */
@media(hover:none){
  .cursor{display:none!important}
}

/* Mobile menu — when open, ensure it's reachable with thumb (right-anchored) */
@media(max-width:520px){
  body.menu-open .topnav nav{
    right:12px!important;
    width:min(220px,72vw)!important;
    top:calc(env(safe-area-inset-top,0) + 70px)!important;
  }
}

/* Buttons & link blocks: clear visited / active feedback for touch */
@media(hover:none){
  .btn:active{opacity:.85;transform:scale(.98)}
  .download:active{opacity:.85}
  nav a:active{background:rgba(0,0,0,.06)}
  .pmap-note:active{transform:scale(.985)}
}

/* ============================================================
   IS-TOUCH CLASS — set by inline script in <head> before any
   other CSS/JS runs. Used to guarantee scroll on touch devices,
   independent of any media-query timing or JS errors.
   ============================================================ */
html.is-touch,
html.is-touch body{
  overflow:visible!important;
  overflow-x:clip!important;
  height:auto!important;
  min-height:0!important;
  max-height:none!important;
  position:static!important;
  touch-action:auto!important;
  -webkit-overflow-scrolling:touch!important;
}
html.is-touch body.intro-active,
html.is-touch body.menu-open,
html.is-touch body.intro-active.scrolled{
  overflow:visible!important;
  position:static!important;
  touch-action:auto!important;
  height:auto!important;
}
html.is-touch #introOverlay{
  display:none!important;
  visibility:hidden!important;
  pointer-events:none!important;
}
html.is-touch .cursor{display:none!important}

/* ============================================================
   MOBILE SCROLL — minimal, defensive, native-first.
   The fewer rules we impose, the better iOS Safari behaves.
   We DO NOT set overflow-x:hidden on body (known iOS scroll-break
   bug). We DO NOT constrain touch-action. We just keep body
   in the normal document flow with overflow visible, and let
   the browser do its job. Horizontal overflow control moves to
   `html` and individual sections, not the body.
   ============================================================ */
@media(hover:none),(pointer:coarse),(max-width:760px){
  /* html owns horizontal-overflow control (safe on iOS) */
  html{
    overflow-x:clip;
    overflow-y:auto;
    height:auto;
    -webkit-text-size-adjust:100%;
  }
  /* Body: normal flow, no overflow tweaks, no fixed/sticky positioning,
     no touch-action override (default `auto` is what iOS expects). */
  body{
    overflow:visible!important;
    height:auto!important;
    min-height:100dvh;
    position:static!important;
    touch-action:auto!important;
  }
  /* Any class that previously locked scroll is neutralised on mobile.
     The cinematic intro and the mobile menu must NEVER lock the body. */
  body.intro-active,
  body.menu-open,
  body.intro-active.scrolled{
    overflow:visible!important;
    height:auto!important;
    position:static!important;
    touch-action:auto!important;
  }
  /* Intro overlay: removed from the page entirely on mobile */
  #introOverlay{
    display:none!important;
    visibility:hidden!important;
    pointer-events:none!important;
  }
  /* Decorative full-viewport layers stay strictly non-interactive */
  #webgl, .noise, .scanlines, .cursor{
    pointer-events:none!important;
    touch-action:none!important;
  }
  /* The main interface column: clip horizontal overflow at the section
     boundary so we don't need overflow-x:hidden on body */
  .interface{overflow-x:clip}
}

