:root{--ai-boot-speed:1;--ai-cyan:#69dcff;--ai-blue:#4ea4ff;--ai-purple:#be6fff;--ai-gold:#ffc762;--ai-ready:#69efc0;--ai-ease:cubic-bezier(.2,.78,.2,1)}

/* The pending class is added in <head>, preventing a flash of the assembled interface. */
.ai-boot-pending body{overflow:hidden}
.ai-boot-pending .sidebar,.ai-boot-pending .eyebrow,.ai-boot-pending .hero-copy,.ai-boot-pending .profile-teaser,.ai-boot-pending .right-rail,.ai-boot-pending .composer-area,.ai-boot-pending .graph-tools,.ai-boot-pending .mobile-resource-bar{opacity:0}
.ai-boot-pending .core,.ai-boot-pending .graph-node{opacity:0}
.ai-boot-pending #careerGraph,.ai-boot-pending #stars,.ai-boot-pending #threeCanvas,.ai-boot-pending .planet{opacity:0}

.ai-boot-overlay{position:fixed;inset:0;z-index:60;pointer-events:none;overflow:hidden;background:radial-gradient(circle at 55% 48%,rgba(25,107,151,.13),transparent 28%),linear-gradient(#03080d66,#03080d18);opacity:1;transition:opacity .55s ease}
.ai-boot-overlay::before{content:"";position:absolute;inset:-45%;background:linear-gradient(112deg,transparent 42%,rgba(89,218,255,.09) 49%,rgba(180,126,255,.07) 52%,transparent 59%);transform:translateX(-45%);animation:aiSpotlight 1.35s 1.05s ease-out both}
.ai-boot-grid{position:absolute;inset:0;background-image:linear-gradient(rgba(92,190,235,.035) 1px,transparent 1px),linear-gradient(90deg,rgba(92,190,235,.025) 1px,transparent 1px);background-size:54px 54px;mask-image:radial-gradient(circle at 54% 49%,#000,transparent 72%);opacity:0;animation:aiGridWake .9s .1s ease-out forwards}
.ai-boot-copy{position:absolute;left:var(--ai-boot-core-x,50%);top:var(--ai-boot-core-bottom,calc(50% + 72px));transform:translate(-50%,12px);display:grid;gap:7px;width:min(360px,calc(100vw - 44px));text-align:center;color:#7fa7bb;font-size:8px;letter-spacing:.22em;text-transform:uppercase}
.ai-boot-copy span{opacity:0;animation:aiBootLine .42s var(--delay) ease-out forwards}.ai-boot-copy span:last-child{color:#a9f9df}
.ai-boot-progress{position:absolute;left:var(--ai-boot-core-x,50%);top:calc(var(--ai-boot-core-bottom,calc(50% + 72px)) + 88px);width:min(320px,65vw);height:1px;transform:translateX(-50%);overflow:hidden;background:#4aa9d31e}.ai-boot-progress::after{content:"";display:block;width:100%;height:100%;background:linear-gradient(90deg,transparent,var(--ai-cyan),var(--ai-purple));transform:translateX(-100%);animation:aiProgress 3.65s .12s var(--ai-ease) forwards}

.ai-booting #stars{animation:aiParticlesWake 1.8s .1s ease-out forwards}.ai-booting #threeCanvas{animation:aiParticlesWake 2s .35s ease-out forwards}.ai-booting .planet{animation:aiPlanetIn 1.2s .65s var(--ai-ease) both}
.ai-booting .sidebar{animation:aiEnterLeft .75s .25s var(--ai-ease) both}.ai-booting .sidebar::after{content:"";position:absolute;inset:-30% 0 auto;height:26%;pointer-events:none;background:linear-gradient(transparent,rgba(90,219,255,.13),transparent);animation:aiConsoleScan 1.4s .7s ease-out both}
.ai-booting .sidebar .nav-item{animation:aiNavItem .42s var(--nav-delay,.6s) var(--ai-ease) both}.ai-booting .sidebar .nav-item:nth-child(1){--nav-delay:.55s}.ai-booting .sidebar .nav-item:nth-child(2){--nav-delay:.63s}.ai-booting .sidebar .nav-item:nth-child(3){--nav-delay:.71s}.ai-booting .sidebar .nav-item:nth-child(4){--nav-delay:.79s}.ai-booting .sidebar .nav-item:nth-child(5){--nav-delay:.87s}.ai-booting .sidebar .nav-item:nth-child(6){--nav-delay:.95s}.ai-booting .sidebar .nav-item:nth-child(7){--nav-delay:1.03s}.ai-booting .sidebar .nav-item:nth-child(8){--nav-delay:1.11s}.ai-booting .sidebar .nav-item:nth-child(9){--nav-delay:1.19s}
.ai-booting .ask-twin,.ai-booting .control-row,.ai-booting .voice-orb,.ai-booting .sidebar-bottom{animation:aiControlIn .48s var(--control-delay,1.18s) var(--ai-ease) both}.ai-booting .control-row{--control-delay:1.28s}.ai-booting .voice-orb{--control-delay:1.38s}.ai-booting .sidebar-bottom{--control-delay:1.48s}
.ai-booting .sidebar-bottom .cert-badges img{animation:aiBadgeIn .42s calc(1.55s + var(--badge-index,0)*.055s) var(--ai-ease) both}
.ai-booting .eyebrow{animation:aiEnterTop .65s .48s var(--ai-ease) both}.ai-booting .hero-copy{animation:aiIdentityIn .8s .68s var(--ai-ease) both}.ai-booting .hero-copy h1>span{animation:aiTitleLight 1.15s .72s ease-out both}.ai-booting .hero-copy p,.ai-booting .identity{animation:aiTextReveal .65s 1.03s var(--ai-ease) both}
.ai-booting .profile-teaser{animation:aiProfileIn .72s 1.12s var(--ai-ease) both}.ai-booting .profile-teaser>*{animation:aiTextReveal .48s calc(1.18s + var(--profile-i,0)*.08s) var(--ai-ease) both}.ai-booting .profile-teaser>*:nth-child(2){--profile-i:1}.ai-booting .profile-teaser>*:nth-child(3){--profile-i:2}.ai-booting .profile-teaser>*:nth-child(4){--profile-i:3}.ai-booting .profile-teaser>*:nth-child(5){--profile-i:4}.ai-booting .profile-teaser>*:nth-child(6){--profile-i:5}
.ai-booting .right-rail{opacity:1}.ai-booting .right-rail>*{animation:aiEnterRight .58s calc(1.17s + var(--rail-i,0)*.095s) var(--ai-ease) both}.ai-booting .right-rail>*:nth-child(2){--rail-i:1}.ai-booting .right-rail>*:nth-child(3){--rail-i:2}.ai-booting .right-rail>*:nth-child(4){--rail-i:3}.ai-booting .right-rail>*:nth-child(5){--rail-i:4}.ai-booting .right-rail>*:nth-child(6){--rail-i:5}.ai-booting .right-rail>*:nth-child(7){--rail-i:6}.ai-booting .right-rail>*:nth-child(8){--rail-i:7}
.ai-booting .core{animation:aiCoreOnline 1.15s 1.62s var(--ai-ease) both}.ai-booting .core::after{animation:spin 8s linear infinite,aiRingIgnite .85s 1.82s ease-out both}.ai-booting .core-ripple{animation:aiStartupRipple 1.25s 2.02s ease-out both!important}
.ai-booting #careerGraph{animation:aiGraphDraw 1.55s 2.05s ease-out both}
.ai-booting .graph-node{animation:aiNodeOnline .68s var(--node-delay,2.35s) var(--ai-ease) both}.ai-booting .graph-node.experience{--node-delay:2.28s;--node-x:-34px;--node-y:28px}.ai-booting .graph-node.skills{--node-delay:2.43s;--node-x:34px;--node-y:30px}.ai-booting .graph-node.projects{--node-delay:2.58s;--node-x:-42px;--node-y:0px}.ai-booting .graph-node.achievements{--node-delay:2.73s;--node-x:42px;--node-y:0px}.ai-booting .graph-node.knowledge{--node-delay:2.88s;--node-x:0px;--node-y:38px}.ai-booting .graph-node.evidence{--node-delay:3.03s;--node-x:35px;--node-y:30px}.ai-booting .graph-node.connections{--node-delay:3.18s;--node-x:-35px;--node-y:30px}
.ai-booting .composer-area{animation:aiComposerRise .72s 3.34s var(--ai-ease) both}.ai-booting .composer{animation:aiComposerCharge 1.05s 3.55s ease-out both}.ai-booting .suggestions button{animation:aiChipIn .4s calc(3.78s + var(--chip-i,0)*.075s) var(--ai-ease) both}.ai-booting .suggestions button:nth-child(2){--chip-i:1}.ai-booting .suggestions button:nth-child(3){--chip-i:2}.ai-booting .suggestions button:nth-child(4){--chip-i:3}.ai-booting .suggestions button:nth-child(5){--chip-i:4}
.ai-booting .graph-tools{pointer-events:none;animation:aiToolsOnline .48s 3.72s var(--ai-ease) both}
.ai-interface-ready .graph-node{animation:aiNodeBreathe calc(7s + var(--float-i,0)*.5s) ease-in-out infinite alternate}.ai-interface-ready .graph-node:nth-of-type(2){--float-i:1}.ai-interface-ready .graph-node:nth-of-type(3){--float-i:2}.ai-interface-ready .graph-node:nth-of-type(4){--float-i:3}.ai-interface-ready .graph-node:nth-of-type(5){--float-i:4}.ai-interface-ready .graph-node:nth-of-type(6){--float-i:5}.ai-interface-ready .graph-node:nth-of-type(7){--float-i:6}.ai-interface-ready #stars{transform:translate(var(--ai-parallax-x,0),var(--ai-parallax-y,0)) scale(1.01);transition:transform .3s ease-out}
.ai-boot-complete .ai-boot-overlay{opacity:0}.ai-boot-complete body{overflow-x:hidden}

.ai-agent-status{position:fixed;left:50%;bottom:118px;z-index:25;transform:translate(-50%,8px);padding:5px 12px;border:1px solid #6edcff45;border-radius:999px;background:#061722db;color:#9ddff2;font-size:7px;letter-spacing:.18em;opacity:0;pointer-events:none;transition:opacity .2s,transform .2s}.ai-agent-status.is-visible{opacity:1;transform:translate(-50%,0)}

@keyframes aiSpotlight{to{transform:translateX(45%)}}
@keyframes aiGridWake{to{opacity:1}}
@keyframes aiBootLine{from{opacity:0;transform:translateY(6px);filter:blur(4px)}to{opacity:1;transform:none;filter:none}}
@keyframes aiProgress{to{transform:none}}
@keyframes aiParticlesWake{from{opacity:0;filter:brightness(.3)}to{opacity:.85;filter:none}}
@keyframes aiPlanetIn{from{opacity:0;transform:translate(34px,-18px) rotate(-24deg);filter:blur(7px)}to{opacity:.85;transform:rotate(-24deg);filter:none}}
@keyframes aiEnterLeft{from{opacity:0;transform:translateX(-80px);filter:blur(7px)}to{opacity:1;transform:none;filter:none}}
@keyframes aiConsoleScan{to{transform:translateY(520%);opacity:0}}
@keyframes aiNavItem{from{opacity:0;transform:translateX(-18px)}to{opacity:1;transform:none}}
@keyframes aiControlIn{from{opacity:0;transform:translateY(10px)}to{opacity:1;transform:none}}
@keyframes aiBadgeIn{from{opacity:0;transform:scale(.82) rotate(-5deg)}to{opacity:1;transform:none}}
@keyframes aiEnterTop{from{opacity:0;transform:translateY(-18px);filter:blur(4px)}to{opacity:1;transform:none;filter:none}}
@keyframes aiIdentityIn{from{opacity:0;transform:translateY(-13px);filter:blur(5px)}to{opacity:1;transform:none;filter:none}}
@keyframes aiTitleLight{from{filter:brightness(.35) saturate(.3)}to{filter:brightness(1) saturate(1)}}
@keyframes aiTextReveal{from{opacity:0;transform:translateY(9px);filter:blur(3px)}to{opacity:1;transform:none;filter:none}}
@keyframes aiProfileIn{from{opacity:0;transform:translateX(-22px)}to{opacity:1;transform:none}}
@keyframes aiEnterRight{from{opacity:0;transform:translateX(76px);filter:blur(5px)}to{opacity:1;transform:none;filter:none}}
@keyframes aiCoreOnline{0%{opacity:0;transform:translate(-50%,-50%) scale(.64);filter:brightness(.25) blur(6px)}65%{opacity:1;transform:translate(-50%,-50%) scale(1.045);filter:brightness(1.35)}100%{opacity:1;transform:translate(-50%,-50%) scale(1);filter:none}}
@keyframes aiRingIgnite{from{opacity:0;filter:brightness(2.2) blur(2px)}to{opacity:1;filter:none}}
@keyframes aiStartupRipple{from{opacity:.8;transform:scale(.7)}to{opacity:0;transform:scale(1.7)}}
@keyframes aiGraphDraw{from{opacity:0;clip-path:circle(0 at 54% 49%);filter:brightness(2)}to{opacity:1;clip-path:circle(85% at 54% 49%);filter:none}}
@keyframes aiNodeOnline{0%{opacity:0;transform:translate(calc(-50% + var(--node-x)),calc(-50% + var(--node-y))) scale(.55);filter:blur(5px) brightness(1.8)}70%{opacity:1;transform:translate(-50%,-50%) scale(1.07);filter:none}100%{opacity:1;transform:translate(-50%,-50%) scale(1)}}
@keyframes aiComposerRise{from{opacity:0;transform:translateY(65px) scale(.975);filter:blur(5px)}to{opacity:1;transform:none;filter:none}}
@keyframes aiComposerRiseMobile{from{opacity:0;transform:translateY(6px) scale(.99);filter:blur(3px)}to{opacity:1;transform:none;filter:none}}
@keyframes aiComposerCharge{0%{box-shadow:0 0 0 #0000}55%{box-shadow:0 0 9px #69dcff,0 0 38px #407cff77,inset 0 0 16px #69dcff55}100%{}}
@keyframes aiChipIn{from{opacity:0;transform:translateY(10px)}to{opacity:1;transform:none}}
@keyframes aiToolsOnline{from{opacity:0;filter:blur(4px) brightness(1.8)}to{opacity:1;filter:none}}
@keyframes aiNodeBreathe{from{transform:translate(-50%,calc(-50% - 2px))}to{transform:translate(-50%,calc(-50% + 2px))}}


@media(max-width:720px){.ai-boot-copy{font-size:7px}
/* These mobile-specific delays (up to ~2.2s) were written assuming the full ~2.7s first-visit
 * boot timeline. They were still selected by plain .ai-booting, so they ALSO applied during a
 * repeat visit's much shorter ~1.15s quick-boot (.ai-boot-quick, see above) - meaning on mobile
 * these elements never got the fast .ai-boot-quick timing at all; they sat hidden waiting for a
 * delay that outlasted the whole boot sequence, then snapped to fully visible with zero
 * animation the instant .ai-booting was removed. Scoped to .ai-boot-full only, so a repeat
 * visit correctly falls back to its own already-tuned .ai-boot-quick timings instead. */
.ai-boot-full .sidebar{animation:aiComposerRise .38s 1.65s var(--ai-ease) both}.ai-boot-full .hero-copy{animation-delay:.28s}.ai-boot-full .core{animation-delay:.72s;animation-duration:.78s}.ai-boot-full #careerGraph{animation-delay:.86s;animation-duration:.75s}.ai-boot-full .graph-node{animation-delay:calc(1s + var(--float-i,0)*.08s);animation-duration:.48s}.ai-boot-full .right-rail>*{animation-delay:calc(1.45s + var(--rail-i,0)*.045s);animation-duration:.38s}.ai-boot-full .composer-area{animation-name:aiComposerRiseMobile;animation-delay:1.72s;animation-duration:.48s}.ai-boot-full .suggestions button{animation-delay:calc(1.95s + var(--chip-i,0)*.045s)}.ai-boot-full .graph-tools{animation-delay:2.08s;animation-duration:.4s}.ai-agent-status{bottom:142px}
.ai-boot-full .mobile-resource-bar{animation:aiComposerRiseMobile .42s 2.22s var(--ai-ease) both}
/* Below 720px the card sits back in normal document flow, well below the fold (see
 * style.css, which is also where its default opacity:0/translateY hidden state lives now -
 * the same render-blocking stylesheet that draws its border/background, so there is no
 * window where the box paints before it's hidden while this second stylesheet is still
 * loading). The boot-timeline version above finishes off-screen before a visitor has
 * scrolled anywhere near it, so it was never actually seen animating in. Disabling it here
 * and revealing on scroll instead (interactions.js adds .in-view via IntersectionObserver)
 * guarantees it always plays, exactly once, right when it actually comes into view - the
 * same moment a visitor would see it, on every load. */
.ai-booting .profile-teaser{animation:none}
.profile-teaser.in-view{opacity:1;transform:none;transition:opacity .6s var(--ai-ease),transform .6s var(--ai-ease)}
}
@media(prefers-reduced-motion:reduce){.ai-boot-overlay{display:none!important}.ai-boot-pending body{overflow-x:hidden;overflow-y:auto}.ai-boot-pending .sidebar,.ai-boot-pending .eyebrow,.ai-boot-pending .hero-copy,.ai-boot-pending .profile-teaser,.ai-boot-pending .right-rail,.ai-boot-pending .composer-area,.ai-boot-pending .graph-tools,.ai-boot-pending .mobile-resource-bar,.ai-boot-pending .core,.ai-boot-pending .graph-node,.ai-boot-pending #careerGraph,.ai-boot-pending #stars,.ai-boot-pending #threeCanvas,.ai-boot-pending .planet{opacity:1!important;animation:none!important;filter:none!important}.ai-interface-ready .graph-node{animation:none!important}.profile-teaser{opacity:1!important;transform:none!important;transition:none!important}}
.motion-paused .ai-boot-overlay{display:none!important}.motion-paused .ai-agent-status{display:none!important}.motion-paused .graph-node{animation:none!important}.motion-paused .profile-teaser{opacity:1!important;transform:none!important;transition:none!important}
