1(function(){if(typeof gsap==="undefined"){console.error("GSAP Animation Controller: GSAP not loaded");return}if(typeof ScrollTrigger==="undefined"){console.error("GSAP Animation Controller: ScrollTrigger not loaded");return}if(typeof window.GSAPAnimationDefinitions==="undefined"){console.error("GSAP Animation Controller: Animation Definitions not loaded");return}gsap.registerPlugin(ScrollTrigger,CustomEase,CustomBounce,Flip,TextPlugin,MotionPathPlugin,ScrollToPlugin,EasePack);console.log("GSAP Plugins registered:", 2gsap.plugins);var animationInstances=new WeakMap;function isValidElement(element){return element&&element.nodeType===1}function buildAnimationKey(type,direction){if(!direction||direction==="none"||direction==="")return type;return type+"-"+direction}function clamp(value,min,max){return Math.min(Math.max(value,min),max)}function createShutterAnimation(element,animDef,customDuration,options){options=options||{};var autoCleanup=options.autoCleanup!==false;var direction=animDef.direction||"left";var numChunks= 3animDef.chunks||12;var duration=customDuration||animDef.duration||1.6;var staggerTime=duration/(numChunks*1.5);var chunkAnimDuration=duration/3;var container=document.createElement("div");container.className="gsap-shutter-overlay";container.style.cssText="position:absolute;top:0;left:0;width:100%;height:100%;pointer-events:none;overflow:hidden;z-index:10;";var originalPosition=element.style.position;if(!originalPosition||originalPosition==="static")element.style.position="relative";var computedStyle= 4window.getComputedStyle(element);var bgColor=computedStyle.backgroundColor;if(bgColor==="rgba(0, 0, 0, 0)"||bgColor==="transparent"){var parent=element.parentElement;if(parent){var parentBg=window.getComputedStyle(parent).backgroundColor;bgColor=parentBg==="rgba(0, 0, 0, 0)"||parentBg==="transparent"?"#ffffff":parentBg}else bgColor="#ffffff"}var chunks=[];var isHorizontal=direction==="left"||direction==="right";for(var i=0;i<numChunks;i++){var chunk=document.createElement("div");chunk.className="gsap-shutter-chunk"; 5if(isHorizontal){var chunkWidth=100/numChunks;chunk.style.cssText="position:absolute;top:0;height:100%;background:"+bgColor+";";chunk.style.width=chunkWidth+.5+"%";chunk.style.left=i*chunkWidth+"%"}else{var chunkHeight=100/numChunks;chunk.style.cssText="position:absolute;left:0;width:100%;background:"+bgColor+";";chunk.style.height=chunkHeight+.5+"%";chunk.style.top=i*chunkHeight+"%"}container.appendChild(chunk);chunks.push(chunk)}element.appendChild(container);var animProps={};var transformOrigin; 6switch(direction){case "left":animProps.scaleX=0;transformOrigin="left center";break;case "right":animProps.scaleX=0;transformOrigin="right center";chunks.reverse();break;case "top":animProps.scaleY=0;transformOrigin="center top";break;case "bottom":animProps.scaleY=0;transformOrigin="center bottom";chunks.reverse();break}var timelineOptions={paused:true};if(autoCleanup)timelineOptions.onComplete=function(){if(container.parentNode)container.parentNode.removeChild(container);console.log("GSAP Shutter: Animation complete, overlay removed")}; 7var tl=gsap.timeline(timelineOptions);tl.to(chunks,{...animProps,transformOrigin:transformOrigin,duration:chunkAnimDuration,stagger:staggerTime,ease:"power2.inOut"});console.log("GSAP Shutter: Created staggered animation with",numChunks,"chunks, direction:",direction);console.log(" Stagger:",staggerTime.toFixed(3)+"s, Chunk duration:",chunkAnimDuration.toFixed(3)+"s");console.log(" Auto-cleanup:",autoCleanup);tl.shutterContainer=container;tl.shutterCleanup=function(){if(container.parentNode)container.parentNode.removeChild(container)}; 8return tl}function createFlipAnimation(element,animDef,customDuration){var axis=animDef.axis||"Y";var dir=animDef.direction||1;var duration=customDuration||animDef.duration||1.2;var halfDuration=duration/2;var tl=gsap.timeline();var rotateKey="rotate"+axis;var initialState={opacity:.3,scale:1};initialState[rotateKey]=-180*dir;gsap.set(element,initialState);element.style.transformStyle="preserve-3d";element.style.backfaceVisibility="visible";var phase1To={opacity:.7,scale:1.05,duration:halfDuration, 9ease:"power1.in",transformPerspective:1200,transformStyle:"preserve-3d"};phase1To[rotateKey]=-90*dir;tl.to(element,phase1To);var phase2To={opacity:1,scale:1,duration:halfDuration,ease:"power1.out",transformPerspective:1200,transformStyle:"preserve-3d"};phase2To[rotateKey]=0;tl.to(element,phase2To);console.log("GSAP Flip: Created 2-phase flip animation, axis:",axis,", direction:",dir);return tl}var GSAPAnimationController={applyAnimation:function(element,config){if(!isValidElement(element)){console.error("GSAPAnimationController: Invalid element provided"); 10return null}if(!config||!config.type){console.error("GSAPAnimationController: Invalid config - type required");return null}if(config.type==="none"){console.log("GSAPAnimationController: Animation type is none, skipping");return null}var animKey=buildAnimationKey(config.type,config.direction);var animDef=window.GSAPAnimationDefinitions.get(animKey);if(!animDef&&config.direction){console.warn("GSAPAnimationController: Animation not found:",animKey,"- trying base animation");
10animDef=window.GSAPAnimationDefinitions.get(config.type)}if(!animDef){console.error("GSAPAnimationController: Animation definition not found:", 11config.type);return null}this.removeAnimation(element);var classesToRemove=[];element.classList.forEach(function(cls){if(cls.startsWith("fee-animation-"))classesToRemove.push(cls)});if(classesToRemove.length>0){classesToRemove.forEach(function(cls){element.classList.remove(cls)});console.log(" Removed CSS animation classes:",classesToRemove.join(", "))}element.style.animation="none";element.style.animationName="none";var duration=config.duration!==undefined?clamp(config.duration,.1,10):animDef.duration; 12var delay=config.delay!==undefined?clamp(config.delay,0,5):0;console.log("\ud83d\udccd Setting up animation for:",element.id||element.className);console.log(" Animation:",animKey,"| Duration:",duration+"s","| Delay:",delay+"s");if(animDef.handler==="shutters"){console.log(" Mode: Shutter (chunk-by-chunk reveal)");var shutterTimeline;if(config.loop===true){shutterTimeline=createShutterAnimation(element,animDef,duration);if(delay>0)shutterTimeline.delay(delay);shutterTimeline.repeat(-1);shutterTimeline.yoyo(true); 13shutterTimeline.play();animationInstances.set(element,{animation:shutterTimeline,scrollTrigger:null,config:config,key:animKey});console.log("\ud83c\udfac Shutter animation (loop) ready:",animKey)}else if(config.scroll===true){shutterTimeline=createShutterAnimation(element,animDef,duration,{autoCleanup:false});if(delay>0)shutterTimeline.delay(delay);var rect=element.getBoundingClientRect();var viewportHeight=window.innerHeight;var isAboveFold=rect.top<viewportHeight*.8;var scrollTriggerConfig;if(isAboveFold){console.log(" Above-fold element detected, using scroll-based trigger"); 14scrollTriggerConfig={trigger:document.documentElement,start:"top top",end:"+=300",scrub:1.5,animation:shutterTimeline}}else{console.log(" Below-fold element, using element-based trigger");scrollTriggerConfig={trigger:element,start:"top 80%",end:"top 30%",scrub:1.5,animation:shutterTimeline}}var scrollTriggerInstance=ScrollTrigger.create(scrollTriggerConfig);animationInstances.set(element,{animation:shutterTimeline,scrollTrigger:scrollTriggerInstance,config:config,key:animKey,shutterContainer:shutterTimeline.shutterContainer}); 15console.log("\ud83c\udfac Shutter animation (scroll scrub) ready:",animKey,isAboveFold?"(above-fold)":"(below-fold)")}else{shutterTimeline=createShutterAnimation(element,animDef,duration);if(delay>0)shutterTimeline.delay(delay);var scrollTriggerInstance=ScrollTrigger.create({trigger:element,start:"top 80%",toggleActions:"play none none reverse",once:true,onEnter:function(){console.log("\ud83c\udfac ScrollTrigger onEnter - PLAYING shutter animation for",element.id);shutterTimeline.play()}});animationInstances.set(element, 16{animation:shutterTimeline,scrollTrigger:scrollTriggerInstance,config:config,key:animKey});console.log("\ud83c\udfac Shutter animation ready:",animKey)}return shutterTimeline}if(animDef.handler==="flip"){console.log(" Mode: Flip (2-phase 180\u00b0 rotation)");var flipTimeline=createFlipAnimation(element,animDef,duration);if(delay>0)flipTimeline.delay(delay);if(config.loop===true){flipTimeline.repeat(-1);flipTimeline.yoyo(true);flipTimeline.play();console.log("\ud83c\udfac Flip animation (loop) ready:", 17animKey)}else if(config.scroll===true){var scrollTriggerInstance=ScrollTrigger.create({trigger:element,start:"top 80%",end:"top 30%",scrub:1.5,animation:flipTimeline});animationInstances.set(element,{animation:flipTimeline,scrollTrigger:scrollTriggerInstance,config:config,key:animKey});console.log("\ud83c\udfac Flip animation (scroll scrub) ready:",animKey)}else{var scrollTriggerInstance=ScrollTrigger.create({trigger:element,start:"top 80%",toggleActions:"play none none reverse",once:true,onEnter:function(){console.log("\ud83c\udfac ScrollTrigger onEnter - PLAYING flip animation for", 18element.id);flipTimeline.play()}});animationInstances.set(element,{animation:flipTimeline,scrollTrigger:scrollTriggerInstance,config:config,key:animKey});console.log("\ud83c\udfac Flip animation ready:",animKey)}return flipTimeline}var toState={};var fromKeys=Object.keys(animDef.from);fromKeys.forEach(function(key){switch(key){case "opacity":toState.o
18pacity=1;break;case "x":toState.x=0;break;case "y":toState.y=0;break;case "z":toState.z=0;break;case "xPercent":toState.xPercent=0;break;case "yPercent":toState.yPercent= 190;break;case "scale":toState.scale=1;break;case "scaleX":toState.scaleX=1;break;case "scaleY":toState.scaleY=1;break;case "rotation":toState.rotation=0;break;case "rotationX":toState.rotationX=0;break;case "rotationY":toState.rotationY=0;break;case "rotateX":toState.rotateX=0;break;case "rotateY":toState.rotateY=0;break;case "rotateZ":toState.rotateZ=0;break;case "filter":toState.filter="blur(0px)";break;case "clipPath":var fromClipPath=animDef.from.clipPath;if(fromClipPath&&fromClipPath.indexOf("inset")=== 200)toState.clipPath="inset(0% 0% 0% 0%)";else if(fromClipPath&&fromClipPath.indexOf("polygon")===0)toState.clipPath="polygon(0% 0%, 100% 0%, 100% 100%, 0% 100%)";else toState.clipPath="inset(0% 0% 0% 0%)";break;case "transformOrigin":toState.transformOrigin=animDef.from.transformOrigin;break;case "backfaceVisibility":toState.backfaceVisibility=animDef.from.backfaceVisibility;break;default:toState[key]=0}});console.log(" FROM:",JSON.stringify(animDef.from));console.log(" TO:",JSON.stringify(toState)); 21var animation;var scrollTriggerInstance;var fromState={...animDef.from};if(config.loop===true){console.log(" Mode: Loop (continuous)");animation=gsap.fromTo(element,fromState,{...toState,duration:duration,delay:delay,ease:animDef.ease,transformPerspective:animDef.transformPerspective||undefined,repeat:-1,yoyo:true})}else if(config.scroll===true){console.log(" Mode: Scroll Scrub");animation=gsap.fromTo(element,fromState,{...toState,duration:duration,ease:"none",transformPerspective:animDef.transformPerspective|| 22undefined,scrollTrigger:{trigger:element,start:"top 80%",scrub:1.5,toggleActions:"play none none reverse"}});scrollTriggerInstance=animation.scrollTrigger}else{console.log(" Mode: Standard (viewport trigger)");gsap.set(element,fromState);animation=gsap.to(element,{...toState,duration:duration,delay:delay,ease:animDef.ease,transformPerspective:animDef.transformPerspective||undefined,paused:true,onComplete:function(){console.log("\u2705 Animation complete:",animKey,"for",element.id)}});scrollTriggerInstance= 23ScrollTrigger.create({trigger:element,start:"top 80%",toggleActions:"play none none reverse",once:true,onEnter:function(){console.log("\ud83c\udfac ScrollTrigger onEnter - PLAYING:",animKey,"for",element.id);console.log(" Element is now INSIDE viewport");animation.play()}})}animationInstances.set(element,{animation:animation,scrollTrigger:scrollTriggerInstance,config:config,key:animKey});console.log("\ud83c\udfac Animation ready:",animKey,"- will play when element enters viewport");return animation}, 24removeAnimation:function(element){if(!isValidElement(element))return;var instance=animationInstances.get(element);if(instance){if(instance.animation){if(instance.animation.shutterCleanup){instance.animation.shutterCleanup();console.log("GSAPAnimationController: Cleaned up shutter overlay")}instance.animation.kill()}if(instance.shutterContainer&&instance.shutterContainer.parentNode){instance.shutterContainer.parentNode.removeChild(instance.shutterContainer);console.log("GSAPAnimationController: Removed shutter container from DOM")}if(instance.scrollTrigger)instance.scrollTrigger.kill(); 25animationInstances.delete(element);gsap.set(element,{clearProps:"all"});console.log("GSAPAnimationController: Removed animation from element:",element.id)}},previewAnimation:function(element,config){if(!isValidElement(element)){console.error("GSAPAnimationController: Invalid element for preview");return null}if(!config||!config.type){console.error("GSAPAnimationController: Invalid config for preview");return null}var animKey=buildAnimationKey(config.type,config.direction);var animDef=window.GSAPAnimationDefinitions.get(animKey); 26if(!animDef&&config.direction)animDef=window.GSAPAnimationDefinitions.get(config.type);if(!animDef){console.error("GSAPAnimationController: Animation not found for preview:",config.type);return null}gsap.killTweensOf(element);gsap.set(element,{clearProps:"all"});var originalTransition=element.style.transition;var originalAnimation=element.style.animation;element.style.transition="none";element.style.animation="none";
26var duration=config.duration!==undefined?clamp(config.duration,.1,10):animDef.duration; 27var delay=config.delay!==undefined?clamp(config.delay,0,5):0;if(animDef.handler==="shutters"){console.log("GSAPAnimationController: Previewing shutter animation:",animKey);var shutterTimeline=createShutterAnimation(element,animDef,duration);if(delay>0)shutterTimeline.delay(delay);shutterTimeline.play();return shutterTimeline}if(animDef.handler==="flip"){console.log("GSAPAnimationController: Previewing flip animation:",animKey);var flipTimeline=createFlipAnimation(element,animDef,duration);if(delay> 280)flipTimeline.delay(delay);flipTimeline.play();return flipTimeline}var toState={};var fromKeys=Object.keys(animDef.from);fromKeys.forEach(function(key){switch(key){case "opacity":toState.opacity=1;break;case "x":toState.x=0;break;case "y":toState.y=0;break;case "z":toState.z=0;break;case "xPercent":toState.xPercent=0;break;case "yPercent":toState.yPercent=0;break;case "scale":toState.scale=1;break;case "scaleX":toState.scaleX=1;break;case "scaleY":toState.scaleY=1;break;case "rotation":toState.rotation= 290;break;case "rotationX":toState.rotationX=0;break;case "rotationY":toState.rotationY=0;break;case "rotateX":toState.rotateX=0;break;case "rotateY":toState.rotateY=0;break;case "rotateZ":toState.rotateZ=0;break;case "filter":toState.filter="blur(0px)";break;case "clipPath":var fromClipPath=animDef.from.clipPath;if(fromClipPath&&fromClipPath.indexOf("inset")===0)toState.clipPath="inset(0% 0% 0% 0%)";else if(fromClipPath&&fromClipPath.indexOf("polygon")===0)toState.clipPath="pol
29ygon(0% 0%, 100% 0%, 100% 100%, 0% 100%)"; 30else toState.clipPath="inset(0% 0% 0% 0%)";break;case "transformOrigin":toState.transformOrigin=animDef.from.transformOrigin;break;case "backfaceVisibility":toState.backfaceVisibility=animDef.from.backfaceVisibility;break;default:toState[key]=0}});var fromState={...animDef.from};var toConfig={...toState,duration:duration,delay:delay,ease:animDef.ease,transformPerspective:animDef.transformPerspective||undefined,repeat:config.loop?-1:0,yoyo:config.loop?true:false,onComplete:function(){if(!config.loop){gsap.set(element, 31{opacity:1,x:0,y:0,scale:1,rotation:0});setTimeout(function(){element.style.transition=originalTransition||""},50)}}};var animation=gsap.fromTo(element,fromState,toConfig);console.log("GSAPAnimationController: Previewing animation:",animKey,"FROM:",fromState,"TO:",toState);return animation},getAnimation:function(element){if(!isValidElement(element))return null;return animationInstances.get(element)||null},hasAnimation:function(element){if(!isValidElement(element))return false;return animationInstances.has(element)}, 32refreshScrollTriggers:function(){ScrollTrigger.refresh();console.log("GSAPAnimationController: ScrollTrigger refresh complete")},killAll:function(){gsap.killTweensOf("*");ScrollTrigger.getAll().forEach(function(st){st.kill()});console.log("GSAPAnimationController: Killed all animations and
32ScrollTriggers")},getStats:function(){var allTriggers=ScrollTrigger.getAll();return{totalDefinitions:window.GSAPAnimationDefinitions.getCount(),activeScrollTriggers:allTriggers.length,gsapVersion:gsap.version}}}; 33window.GSAPAnimationController=GSAPAnimationController;console.log("GSAP Animation Controller v3.0 initialized");console.log("Stats:",GSAPAnimationController.getStats())})();
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.