1(function() { 2 function run() { 3(function(){ 4 // BOX 2: Doc â Memo animation 5 var s1=document.getElementById('htwS1'); 6 var s2=document.getElementById('htwS2'); 7 var fill=document.getElementById('htwFill2'); 8 if(s1&&s2){ 9 function show1(){ 10 s2.style.display='none'; 11 s1.style.display='flex'; 12 if(fill){fill.style.transition='none';fill.style.width='0%';setTimeout(function(){fill.style.transition='width 2.5s ease';fill.style.width='100%';},50);} 13 setTimeout(show2,3500); 14 } 15 function show2(){ 16 s1.style.display='none'; 17 s2.style.display='flex'; 18 setTimeout(show1,5000); 19 } 20 show1(); 21 } 22 23 // BOX 1: Query â agent highlight (defined FIRST) 24 var agentMap={0:'ac-deal-screener',1:'ac-cim-analysis',2:'ac-financial-model',3:'ac-ic-memo'}; 25 function highlightAgent(id){ 26 var card=document.getElementById(id); 27 if(!card)return; 28 card.style.transition='all .3s ease'; 29 card.style.background='#eff6ff'; 30 card.style.borderColor='rgba(59,130,246,.5)'; 31 card.style.transform='translateY(-2px)'; 32 card.style.boxShadow='0 0 0 3px rgba(59,130,246,.2),0 4px 12px rgba(59,130,246,.2)'; 33 setTimeout(function(){ 34 card.style.background='#fff'; 35 card.style.borderColor='rgba(0,0,0,.08)'; 36 card.style.transform=''; 37 card.style.boxShadow=''; 38 },2800); 39 } 40 41 // BOX 1: Typing animation 42 var q=['Find PE targets in healthcare with £50M EBITDA...','Analyse Project Alpha CIM and flag risks...','Build LBO model at 6x entry...','Draft Deal memo for the board...']; 43 var qi=0,ci=0,del=false,el=document.getElementById('htwQuery'); 44 if(el){ 45 (function t(){ 46 var s=q[qi]; 47 if(!del){ 48 el.textContent=s.slice(0,ci+1);ci++; 49 if(ci===1&&agentMap[qi])highlightAgent(agentMap[qi]); 50 if(ci>=s.length){setTimeout(function(){del=true;t();},2200);return;} 51 setTimeout(t,45+Math.random()*25); 52 } else { 53 el.textContent=s.slice(0,ci-1);ci--; 54 if(ci<=0){del=false;qi=(qi+1)%q.length;ci=0;setTimeout(t,400);return;} 55 setTimeout(t,18); 56 } 57 })(); 58 } 59 60 // BOX 1: Random agent processing 61 var allAgents=['ac-deal-screener','ac-financial-model','ac-ic-memo','ac-legal-review','ac-cim-analysis','ac-valuation','ac-risk-assess','ac-credit-analysis','ac-esg-monitor']; 62 function randomProcess(){ 63 var idx=Math.floor(Math.random()*allAgents.length); 64 var card=document.getElementById(allAgents[idx]); 65 if(!card)return; 66 var badge=card.querySelector('span'); 67 if(!badge)return; 68 var origText=badge.textContent,origBg=badge.style.background,origColor=badge.style.color; 69 badge.textContent='Running';badge.style.background='rgba(251,191,36,.18)';badge.style.color='#fbbf24';badge.style.animation='acPulse 1s ease-in-out infinite'; 70 card.style.transition='border-color .3s';card.style.borderColor='rgba(251,191,36,.35)'; 71 setTimeout(function(){badge.textContent=origText;badge.style.background=origBg;badge.style.color=origColor;badge.style.animation='';card.style.borderColor='rgba(0,0,0,.08)';},2500); 72 setTimeout(randomProcess,3000+Math.random()*4000); 73 } 74 setTimeout(randomProcess,2000); 75 76 // BOX 1: Stagger entrance 77 allAgents.forEach(function(id,i){ 78 var card=document.getElementById(id); 79 if(card){card.style.opacity='0';card.style.transform='translateY(8px)';setTimeout(function(){card.style.transition='opacity .4s ease,transform .4s ease';card.style.opacity='1';card.style.transform='translateY(0)';},300+i*80);} 80 }); 81})(); 82 83(function(){ 84 var hub = document.getElementById('ic-hub'); 85 var svg = document.getElementById('ic-svg'); 86 if(!hub || !svg) return; 87 88 var container = hub.parentElement; 89 var W = container.offsetWidth || 363; 90 var H = container.offsetHeight || 270; 91 var hx = W/2, hy = H/2; 92 93 hub.style.left = (hx-36)+'px'; 94 hub.style.top = (hy-36)+'px'; 95 96 var nodes = Array.from(container.querySelectorAll('.ic-node')).filter(function(n){ return n.offsetParent !== null; }); 97 var count = nodes.length; 98 var r = Math.min(W,H)*0.36; 99 var rotAngle = 0; 100 101 // Disable heavy rotation animation on mobile to prevent page hangs 102 var isMobile = window.matchMedia && window.matchMedia('(max-width: 768px)').matches; 103 if(isMobile){ 104 var positions=[]; 105 for(var i=0;i<count;i++){ 106 var a = (i/count)*2*Math.PI - Math.PI/2; 107 positions.push({ x: hx+r*Math.cos(a), y: hy+r*Math.sin(a) }); 108 }
109 nodes.forEach(function(node,i){ 110 var p = positions[i]; 111 node.style.left=(p.x-32)+'px'; 112 node.style.top=(p.y-32)+'px'; 113 node.style.opacity='1'; 114 node.style.transform='scale(1)'; 115 }); 116 return; 117 } 118 119 // Entrance fade 120 nodes.forEach(function(node,i){ 121 node.style.opacity='0'; 122 node.style.transform='scale(0.5)'; 123 setTimeout(function(){ 124 node.style.transition='opacity .4s ease,transform .4s ease'; 125 node.style.opacity='1'; 126 node.style.transform='scale(1)'; 127 }, 300+i*80); 128 node.addEventListener('mouseenter',function(){this.style.transform='scale(1.15)';this.style.boxShadow='0 4px 16px rgba(0,0,0,.15)';}); 129 node.addEventListener('mouseleave',function(){this.style.transform='scale(1)';this.style.boxShadow='';}); 130 }); 131 132 // Get positions at current rotation 133 function getPositions(angle){ 134 return nodes.map(function(_,i){ 135 var a = angle + (i/count)*2*Math.PI; 136 return { x: hx+r*Math.cos(a), y: hy+r*Math.sin(a) }; 137 }); 138 } 139 140 // Draw lines 141 var lines = nodes.map(function(){ 142 var l = document.createElementNS('http://www.w3.org/2000/svg','line'); 143 l.setAttribute('stroke','rgba(0,0,0,.1)'); 144 l.setAttribute('stroke-width','1.5'); 145 l.setAttribute('stroke-dasharray','4 4'); 146 svg.appendChild(l); 147 return l; 148 }); 149 150 // Travelling dots 151 var activeDots = []; 152 function spawnDot(p, node){ 153 var dot = document.createElementNS('http://www.w3.org/2000/svg','circle'); 154 dot.setAttribute('r','3.5'); 155 dot.setAttribute('fill','#000'); 156 svg.appendChild(dot); 157 var start=Date.now(), dur=800+Math.random()*400; 158 activeDots.push({dot:dot,start:start,dur:dur,px:p.x,py:p.y,node:node}); 159 } 160 161 // Main loop: rotate + update lines + animate dots 162 function loop(){ 163 rotAngle += 0.003; // rotation speed 164 var positions = getPositions(rotAngle - Math.PI/2); 165 166 // Update node positions + lines 167 nodes.forEach(function(node,i){ 168 var p = positions[i]; 169 node.style.left=(p.x-32)+'px'; 170 node.style.top=(p.y-32)+'px'; 171 lines[i].setAttribute('x1',hx); lines[i].setAttribute('y1',hy); 172 lines[i].setAttribute('x2',p.x); lines[i].setAttribute('y2',p.y); 173 }); 174 175 // Update travelling dots 176 var now = Date.now(); 177 activeDots = activeDots.filter(function(d){ 178 var t = Math.min((now-d.start)/d.dur,1); 179 var e = t<.5?2*t*t:-1+(4-2*t)*t; 180 d.dot.setAttribute('cx', hx+(d.px-hx)*e); 181 d.dot.setAttribute('cy', hy+(d.py-hy)*e); 182 d.dot.setAttribute('opacity', t<0.1?t*10*0.8:t>0.85?(1-t)/0.15*0.8:0.8); 183 if(t>=1){ 184 svg.removeChild(d.dot); 185 d.node.style.background='#f0fdf4'; 186 d.node.style.borderColor='rgba(34,197,94,.5)'; 187 setTimeout(function(){d.node.style.background='#fff';d.node.style.borderColor='rgba(0,0,0,.08)';},500); 188 return false; 189 } 190 return true; 191 }); 192 193 requestAnimationFrame(loop); 194 } 195 loop(); 196 197 // Spawn dots continuously 198 var dotIdx=0; 199 function nextDot(){ 200 var positions=getPositions(rotAngle-Math.PI/2); 201 spawnDot(positions[dotIdx%count], nodes[dotIdx%count]); 202 dotIdx++; 203 setTimeout(nextDot, 350+Math.random()*500); 204 } 205 setTimeout(nextDot, 800); 206})(); 207 208(function(){ 209 var items = Array.from(document.querySelectorAll('.wf-item')); 210 if(!items.length) return; 211 212 // Stagger entrance slide up + fade 213 items.forEach(function(el,i){ 214 el.style.opacity='0'; 215 el.style.transform='translateY(12px)'; 216 setTimeout(function(){ 217 el.style.transition='opacity .45s ease,transform .45s ease'; 218 el.style.opacity='1'; 219 el.style.transform='translateY(0)'; 220 }, 150 + i*70); 221 }); 222 223 // Active sweep animation 224 var activeIdx = 0; 225 function runSweep(el){ 226 var sweep = el.querySelector('.wf-sweep'); 227 if(!sweep) return; 228 sweep.style.transition='transform .6s ease'; 229 sweep.style.transform='translateX(200%)'; 230 setTimeout(function(){ sweep.style.transition='none'; sweep.style.transform='translateX(-100%)'; },650); 231 } 232 233 function activate(idx){ 234 items.forEach(function(el,i){ 235 var icon = el.querySelector('div'); 236 var title = el.querySelector('.wf-item > div > div'); 237 if(i===idx){ 238 el.style.background='#f0fdf4'; 239 el.style.borderColor='rgba(22,163,74,.3)'; 240 el.style.transform='translateX(4px)'; 241 el.style.boxShadow='0 2px 10px rgba(22,163,74,.1)'; 242 if(icon){ icon.style.background='rgba(22,163,74,.15)'; } 243 runSweep(el); 244 } else { 245 el.style.background='#fff'; 246 el.style.borderColor='rgba(0,0,0,.07)'; 247 el.style.transform='translateX(0)'; 248 el.style.boxShadow=''; 249 if(icon){ icon.style.background = i<5?'rgba(22,163,74,.1)':'rgba(0,0,0,.04)'; } 250 } 251 }); 252 activeIdx = (idx+1)%items.length; 253 setTimeout(function(){ activate(activeIdx); }, 1600); 254 } 255 256 setTimeout(function(){ activate(0); }, 900); 257 258 // Hover
259 items.forEach(function(el){ 260 el.addEventListener('mouseenter',function(){ this.style.borderColor='rgba(0,0,0,.15)'; this.style.boxShadow='0 2px 8px rgba(0,0,0,.07)'; }); 261 el.addEventListener('mouseleave',function(){ this.style.borderColor='rgba(0,0,0,.07)'; this.style.boxShadow=''; }); 262 }); 263})(); 264 265(function(){ 266 var wfp4Colors=['#ef4444','#3b82f6','#10b981','#8b5cf6','#f59e0b','#14b8a6','#f43f5e','#60a5fa']; 267 var wfp4Data=[{name:'Deal Screening',tag:'Banking · PE/VC',time:'2 hrs saved',steps:'8 steps',firms:'340+ firms',desc:'Screen targets against your mandate financials, sector, size and growth filters applied instantly.',path:'M9 5H7a2 2 0 0 0-2 2v12a2 2 0 0 0 2 2h10a2 2 0 0 0 2-2V7a2 2 0 0 0-2-2h-2M9 5a2 2 0 0 0 2 2h2a2 2 0 0 0 2-2'},{name:'CIM Analysis',tag:'PE/VC · M&A',time:'4 hrs saved',steps:'12 steps',firms:'180+ firms',desc:'Deep-read CIMs end-to-end. Revenue quality, risks and red flags surfaced with full citations.',path:'M9 19v-6a2 2 0 0 0-2-2H5a2 2 0 0 0-2 2v6a2 2 0 0 0 2 2h2a2 2 0 0 0 2-2zm0 0V9a2 2 0 0 0 2-2h2a2 2 0 0 0 2 2v10'},{name:'Financial Model',tag:'All firms',time:'6 hrs saved',steps:'15 steps',firms:'290+ firms',desc:'Build LBO and DCF models from raw financials. Assumptions auto-populated from historical data.',path:'M12 8v4l3 3m6-3a9 9 0 1 1-18 0 9 9 0 0 1 18 0z'},{name:'Deal Memo Draft',tag:'PE/VC · Banking',time:'5 hrs saved',steps:'10 steps',firms:'210+ firms',desc:'Draft deal memos with every number traced back to source documents.',path:'M9 12h6m-6 4h6m2 5H7a2 2 0 0 0-2-2V5a2 2 0 0 0 2-2h5.586a1 1 0 0 1 .707.293l5.414 5.414a1 1 0 0 1 .293.707V19a2 2 0 0 0-2 2z'},{name:'Legal Review',tag:'All firms',time:'3 hrs saved',steps:'9 steps',firms:'160+ firms',desc:'Extract key terms, covenants and risks from agreements. Flag unusual clauses automatically.',path:'M9 12l2 2 4-4m5.618-4.016A11.955 11.955 0 0 1 12 2.944a11.955 11.955 0 0 1-8.618 3.04A12.02 12.02 0 0 0 3 9c0 5.591 3.824 10.29 9 11.622 5.176-1.332 9-6.03 9-11.622 0-1.042-.133-2.052-.382-3.016z'},{name:'LP Reporting',tag:'Family Office',time:'3 hrs saved',steps:'7 steps',firms:'120+ firms',desc:'Generate LP reports from portfolio data. Customise per investor and sync to your CRM.',path:'M17 9V7a2 2 0 0 0-2-2H5a2 2 0 0 0-2 2v6a2 2 0 0 0 2 2h2m2 4h10a2 2 0 0 0 2-2v-6a2 2 0 0 0-2-2H9a2 2 0 0 0-2 2v6a2 2 0 0 0 2 2z'},{name:'Portfolio Monitor',tag:'Wealth · PE',time:'1 hr saved',steps:'5 steps',firms:'90+ firms',desc:'Track portfolio company performance against targets. Alert on covenant breaches and key events.',path:'M13 10V3L4 14h7v7l9-11h-7z'},{name:'DD Report',tag:'M&A · PE/VC',time:'8 hrs saved',steps:'18 steps',firms:'150+ firms',desc:'Full due diligence report from data room. Legal, financial and commercial diligence in one workflow.',path:'M8 7V3m8 4V3m-9 8h10M5 21h14a2 2 0 0 0 2-2V7a2 2 0 0 0-2-2H5a2 2 0 0 0-2 2v12a2 2 0 0 0 2 2z'}]; 268 var items = document.querySelectorAll('.wfp4-item'); 269 var preview = document.getElementById('wfp4-preview'); 270 if(!items.length || !preview) return; 271 272 function setActive(idx){ 273 items.forEach(function(el,i){ 274 if(i===idx){ 275 var c=wfp4Colors[idx]||'#16a34a'; 276 el.style.background=c+'18'; 277 el.style.border='1px solid '+c+'44'; 278 } else { 279 el.style.background='transparent'; 280 el.style.border='1px solid transparent'; 281 } 282 }); 283 renderPreview(idx); 284 } 285 286 function renderPreview(idx){ 287 var d=wfp4Data[idx]; 288 preview.style.opacity='0'; 289 preview.style.transform='translateX(6px)'; 290 preview.style.transition='none'; 291 setTimeout(function(){ 292 preview.innerHTML= 293 '<div style="background:#f9f9f9;border-radius:10px;padding:12px;flex-shrink:0">'+ 294 '<div style="display:flex;align-items:center;gap:8px;margin-bottom:10px">'+ 295 '<div style="width:26px;height:26px;border-radius:7px;background:'+(wfp4Colors[idx]||'#16a34a')+'18;display:flex;align-items:center;justify-content:center">'+ 296 '<svg width="13" height="13" viewBox="0 0 24 24" fill="none" stroke="'+(wfp4Colors[idx]||'#16a34a')+'" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round"><path d="'+d.path+'"/></svg>'+ 297 '</div>'+ 298 '<div>'+ 299 '<div style="font-size:12px;font-weight:600;color:#000">'+d.name+'</div>'+ 300 '<div style="font-size:10px;color:rgba(0,0,0,.4)">'+d.tag+'</div>'+ 301 '</div>'+ 302 '</div>'+ 303 '<div style="display:grid;grid-template-columns:repeat(3,1fr);gap:6px">'+ 304 '<div style="background:#fff;border-radius:7px;padding:7px;text-align:center;border:1px solid rgba(0,0,0,.07)"><div style="font-size:12px;font-weight:600;color:#16a34a">'+d.time+'</div><div style="font-size:9px;color:rgba(0,0,0,.4);margin-top:1px">per run</div></div>'+ 305 '<div style="background:#fff;border-radius:7px;padding:7px;text-align:center;border:1px solid rgba(0,0,0,.07)"><div style="font-size:12px;font-weight:600;color:#000">'+d.steps+'</div><div style="font-size:9px;color:rgba(0,0,0,.4);margin-top:1px">automated</div></div>'+ 306 '<div style="background:#fff;border-radius:7px;padding:7px;text-align:center;border:1px solid rgba(0,0,0,.07)"><div style="font-size:12px;font-weight:600;color:#000">'+d.firms+'</div><div style="font-size:9px;color:rgba(0,0,0,.4);margin-top:1px">using this</div></div>'+ 307 '</div>'+ 308 '</div>'+ 309 '<div style="font-size:11px;color:rgba(0,0,0,.55);line-height:1.65;flex:1">'+d.desc+'</div>'+ 310 '<div style="display:flex;align-items:center;justify-content:space-between;padding:9px 12px;background:#f5f5f5;border-radius:8px;flex-shrink:0;cursor:pointer">'+ 311 '<span style="font-size:11px;font-weight:600;color:#000">
311Run workflow</span>'+ 312 '<svg width="13" height="13" viewBox="0 0 24 24" fill="none" stroke="#000" stroke-width="2" stroke-linecap="round"><path d="M5 12h14M12 5l7 7-7 7"/></svg>'+ 313 '</div>'; 314 preview.style.transition='opacity .3s ease,transform .3s ease'; 315 preview.style.opacity='1'; 316 preview.style.transform='translateX(0)'; 317 },80); 318 } 319 320 items.forEach(function(el){ 321 el.addEventListener('click',function(){ setActive(parseInt(this.dataset.idx)); }); 322 }); 323 324 setActive(0); 325 var autoIdx=0; 326 setInterval(function(){ 327 autoIdx=(autoIdx+1)%5; 328 setActive(autoIdx); 329 },2200); 330})(); 331 332(function(){ 333 var kbItems=[ 334 {label:'Deal Terms', color:'#ef4444',icon:'M9 5H7a2 2 0 0 0-2 2v12a2 2 0 0 0 2 2h10a2 2 0 0 0 2-2V7a2 2 0 0 0-2-2h-2M9 5a2 2 0 0 0 2 2h2a2 2 0 0 0 2-2'}, 335 {label:'KYC Policy', color:'#3b82f6',icon:'M9 12l2 2 4-4m5.618-4.016A11.955 11.955 0 0 1 12 2.944a11.955 11.955 0 0 1-8.618 3.04A12.02 12.02 0 0 0 3 9c0 5.591 3.824 10.29 9 11.622 5.176-1.332 9-6.03 9-11.622 0-1.042-.133-2.052-.382-3.016z'}, 336 {label:'Risk Models', color:'#8b5cf6',icon:'M10.29 3.86L1.82 18a2 2 0 0 0 1.71 3h16.94a2 2 0 0 0 1.71-3L13.71 3.86a2 2 0 0 0-3.42 0zM12 9v4'}, 337 {label:'Client Data', color:'#f59e0b',icon:'M17 21v-2a4 4 0 0 0-4-4H5a4 4 0 0 0-4 4v2M9 11a4 4 0 1 0 0-8 4 4 0 0 0 0 8z'}, 338 {label:'Market Data', color:'#10b981',icon:'M9 19v-6a2 2 0 0 0-2-2H5a2 2 0 0 0-2 2v6a2 2 0 0 0 2 2h2a2 2 0 0 0 2-2zm0 0V9a2 2 0 0 0 2-2h2a2 2 0 0 0 2 2v10'}, 339 {label:'Compliance', color:'#14b8a6',icon:'M12 22s8-4 8-10V5l-8-3-8 3v7c0 6 8 10 8 10zM9 12l2 2 4-4'}, 340 ]; 341 var grid=document.getElementById('b5kb'); 342 if(!grid)return; 343 var kbEls=[]; 344 kbItems.forEach(function(k,i){ 345 var el=document.createElement('div'); 346 el.style.cssText='background:'+k.color+'12;border:1px solid '+k.color+'25;border-radius:9px;padding:10px 8px;display:flex;flex-direction:column;align-items:center;gap:5px;opacity:0;transform:translateY(8px);transition:opacity .35s ease,transform .35s ease,background .2s,box-shadow .2s;cursor:default'; 347 el.innerHTML='<div style="width:28px;height:28px;border-radius:8px;background:'+k.color+'20;display:flex;align-items:center;justify-content:center"><svg width="13" height="13" viewBox="0 0 24 24" fill="none" stroke="'+k.color+'" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round"><path d="'+k.icon+'"/></svg></div><div style="font-size:9px;font-weight:600;color:'+k.color+';text-align:center;line-height:1.2">'+k.label+'</div>'; 348 el.addEventListener('mouseenter',function(){this.style.background=k.color+'22';this.style.boxShadow='0 3px 10px '+k.color+'25';}); 349 el.addEventListener('mouseleave',function(){this.style.background=k.color+'12';this.style.boxShadow='';}); 350 grid.appendChild(el);kbEls.push(el); 351 setTimeout(function(){el.style.opacity='1';el.style.transform='translateY(0)';},300+i*100); 352 }); 353 354 // Training bar 355 var tb=document.getElementById('b5tb'),pct=0,dir=1; 356 setInterval(function(){pct+=dir*1.4;if(pct>=100)dir=-1;if(pct<=0)dir=1;tb.style.width=Math.max(0,Math.min(100,pct))+'%';},30); 357 358 // Arrow dots 359 function animDot(id,delay){ 360 var d=document.getElementById(id);if(!d)return; 361 function go(){d.style.transition='none';d.style.left='-7px';setTimeout(function(){d.style.transition='left .65s linear';d.style.left='30px';setTimeout(go,950+Math.random()*300);},60);} 362 setTimeout(go,delay); 363 } 364 animDot('b5ad1',400);animDot('b5ad2',900); 365 366 // Training pulse 367 var tr=document.getElementById('b5train'); 368 setInterval(function(){if(tr){tr.style.boxShadow='0 0 0 3px rgba(0,0,0,.1)';setTimeout(function(){tr.style.boxShadow='';},600);}},2000); 369 370 // Agent glow 371 var ag=document.getElementById('b5agent'); 372 setInterval(function(){if(ag){ag.style.borderColor='#8b5cf6';ag.style.boxShadow='0 0 0 3px rgba(139,92,246,.15)';setTimeout(function(){ag.style.borderColor='rgba(0,0,0,.08)';ag.style.boxShadow='';},700);}},2800); 373 374 // KB pulse 375 function pulseKb(){var i=Math.floor(Math.random()*kbEls.length);var c=kbItems[i].color;kbEls[i].style.background=c+'28';kbEls[i].style.boxShadow='0 3px 12px '+c+'30';setTimeout(function(){kbEls[i].style.background=c+'12';kbEls[i].style.boxShadow='';},800);setTimeout(pulseKb,1200+Math.random()*1000);} 376 setTimeout(pulseKb,1500); 377})(); 378 379(function(){ 380 function easeOut(t){return 1-Math.pow(1-t,3);} 381 382 var barDefs=[ 383 {id:'b-DD-Report', vid:'bv-DD-Report', hrs:14,pct:100}, 384 {id:'b-Financial-Model',vid:'bv-Financial-Model', hrs:10,pct:71}, 385 {id:'b-CIM-Analysis', vid:'bv-CIM-Analysis', hrs:12,pct:86}, 386 {id:'b-IC-Memo-Draft', vid:'bv-IC-Memo-Draft', hrs:8, pct:57}, 387 {id:'b-Legal-Review', vid:'bv-Legal-Review', hrs:6, pct:43}, 388 ]; 389 390 function shine(bar){ 391 var s=bar.querySelector('.b6shine'); 392 if(!s)return; 393 s.style.transition='transform .5s ease'; 394 s.style.transform='translateX(200%)'; 395 setTimeout(function(){s.style.transition='none';s.style.transform='translateX(-100%)';},600); 396 } 397 398 function animateBars(delay){
399 barDefs.forEach(function(bd,i){ 400 var bar=document.getElementById(bd.id); 401 var val=document.getElementById(bd.vid); 402 if(!bar||!val)return; 403 bar.style.width='0%'; val.textContent='0 hrs'; 404 setTimeout(function(){ 405 var start=Date.now(),dur=800+i*100; 406 var iv=setInterval(function(){ 407 var t=Math.min((Date.now()-start)/dur,1),e=easeOut(t); 408 bar.style.width=(e*bd.pct)+'%'; 409 val.textContent=Math.round(e*bd.hrs)+' hrs'; 410 if(t>=1){clearInterval(iv);shine(bar);} 411 },16); 412 },delay+i*120); 413 }); 414 } 415 416 function countUp(id,cardId,target,suffix,dur,delay){ 417 var el=document.getElementById(id),card=document.getElementById(cardId); 418 if(!el)return; 419 setTimeout(function(){ 420 if(card){card.style.background='rgba(0,0,0,.06)';card.style.transform='scale(1.04)';} 421 var start=Date.now(); 422 var iv=setInterval(function(){ 423 var t=Math.min((Date.now()-start)/dur,1),e=easeOut(t); 424 el.textContent=Math.round(e*target)+suffix; 425 if(t>=1){clearInterval(iv);setTimeout(function(){if(card){card.style.background='#f9f9f9';card.style.transform='scale(1)';}},400);} 426 },16); 427 },delay); 428 } 429 430 function animateCost(delay){ 431 var el=document.getElementById('b6cost');if(!el)return; 432 setTimeout(function(){ 433 var target=480000,start=Date.now(),dur=1200; 434 var iv=setInterval(function(){ 435 var t=Math.min((Date.now()-start)/dur,1),e=easeOut(t); 436 el.textContent='$'+Math.round(e*target/1000)+'K'; 437 if(t>=1)clearInterval(iv); 438 },16); 439 },delay); 440 } 441 442 function runAll(){ 443 animateBars(0); 444 countUp('b6s1','b6sc1',50,'',1000,200); 445 countUp('b6s2','b6sc2',21,'x',800,400); 446 countUp('b6s3','b6sc3',73,'%',1100,600); 447 animateCost(300); 448 } 449 450 runAll(); 451 452 // Random bar shine 453 setInterval(function(){ 454 var i=Math.floor(Math.random()*barDefs.length); 455 var bar=document.getElementById(barDefs[i].id); 456 if(bar)shine(bar); 457 },2500); 458 459 // Stat card pulse rotation 460 var si=0; 461 setInterval(function(){ 462 var cards=['b6sc1','b6sc2','b6sc3']; 463 var el=document.getElementById(cards[si]); 464 if(el){el.style.background='rgba(0,0,0,.06)';el.style.transform='translateY(-2px)';setTimeout(function(){el.style.background='#f9f9f9';el.style.transform='translateY(0)';},600);} 465 si=(si+1)%3; 466 },1800); 467 468 // Full re-run every 8s 469 setInterval(runAll,8000); 470})(); 471 } 472 function tryRun(n) { 473 if (document.querySelector('.prod-hero')) { 474 requestAnimationFrame(function(){ requestAnimationFrame(function(){ run(); }); }); 475 } else if (n > 0) { setTimeout(function(){ tryRun(n-1); }, 50); } 476 } 477 tryRun(60); 478})();
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.