{"version":3,"file":"BulgeDistortion.C9e4SGLA.mjs","names":["useRef","useCallback","useState"],"sources":["https:/framerusercontent.com/modules/1Cdi05tn3OoREQ9e0YtJ/nz62rFZUf9E5dyxbN1q5/BulgeDistortion.js"],"sourcesContent":["// Bulge distortion effect using WebGL shader - interactive image distortion on mouse movement\nimport{jsx as _jsx}from\"react/jsx-runtime\";import{useEffect,useRef,useState,startTransition,useCallback}from\"react\";import{addPropertyControls,ControlType,RenderTarget,useIsStaticRenderer}from\"framer\";// Utility: Detect touch device\nfunction isTouch(){if(typeof window===\"undefined\")return false;if(\"standalone\"in navigator){return true// iOS devices\n;}const hasCoarse=window.matchMedia(\"(pointer: coarse)\").matches;if(hasCoarse){return true;}const hasPointer=window.matchMedia(\"(pointer: fine)\").matches;if(hasPointer){return false// prioritize mouse control\n;}// Otherwise, fall-back to older style mechanisms.\nreturn\"ontouchstart\"in window||navigator.maxTouchPoints>0;}// Shader sources as constants\nconst VERTEX_SHADER=`\n\tattribute vec2 position;\n\tattribute vec2 uv;\n\tvarying vec2 vUv;\n\tvoid main() {\n\t\tvUv = uv;\n\t\tgl_Position = vec4(position, 0.0, 1.0);\n\t}\n`;const FRAGMENT_SHADER=`\n\tprecision highp float;\n\tuniform float uTime;\n\tuniform sampler2D uTexture;\n\tuniform vec2 uTextureResolution;\n\tuniform vec2 uResolution;\n\tuniform vec2 uMouse;\n\tuniform vec2 uMouseIntro;\n\tuniform float uRadius;\n\tuniform float uStrength;\n\tuniform float uBulge;\n\tuniform float uIntro;\n\tuniform vec2 uCoverOffset;\n\tuniform vec2 uCoverRepeat;\n\tvarying vec2 vUv;\n\n\tvec2 bulge(vec2 uv, vec2 center) {\n\t\tuv -= center;\n\t\tfloat dist = length(uv) / uRadius;\n\t\tfloat distPow = pow(dist, 4.0);\n\t\tfloat strengthAmount = uStrength / (1.0 + distPow);\n\t\t// Clamp strength to prevent zooming when > 1\n\t\tstrengthAmount = min(strengthAmount, 1.0);\n\t\tuv *= (1.0 - uBulge) + uBulge * strengthAmount;\n\t\tuv += center;\n\t\treturn uv;\n\t}\n\n\tvoid main() {\n\t\t// Apply cover UV transformation\n\t\tvec2 coverUv = vUv * uCoverRepeat + uCoverOffset;\n\t\t\n\t\tvec2 mixMouse = mix(uMouseIntro, uMouse, uIntro);\n\t\tvec2 bulgeUV = bulge(coverUv, mixMouse);\n\t\t\n\t\tvec4 tex = texture2D(uTexture, bulgeUV);\n\t\tgl_FragColor = vec4(tex.rgb, 1.0);\n\t}\n`;// Utility: Compile shader\nfunction compileShader(gl,source,type){const shader=gl.createShader(type);if(!shader)return null;gl.shaderSource(shader,source);gl.compileShader(shader);if(!gl.getShaderParameter(shader,gl.COMPILE_STATUS)){console.error(\"Shader compile error:\",gl.getShaderInfoLog(shader));gl.deleteShader(shader);return null;}return shader;}// Utility: Create WebGL program\nfunction createProgram(gl){const vertexShader=compileShader(gl,VERTEX_SHADER,gl.VERTEX_SHADER);const fragmentShader=compileShader(gl,FRAGMENT_SHADER,gl.FRAGMENT_SHADER);if(!vertexShader||!fragmentShader)return null;const program=gl.createProgram();if(!program)return null;gl.attachShader(program,vertexShader);gl.attachShader(program,fragmentShader);gl.linkProgram(program);if(!gl.getProgramParameter(program,gl.LINK_STATUS)){console.error(\"Program link error:\",gl.getProgramInfoLog(program));gl.deleteProgram(program);return null;}gl.useProgram(program);return program;}// Utility: Setup geometry\nfunction setupGeometry(gl,program){const positions=new Float32Array([-1,-1,1,-1,-1,1,1,1]);const uvs=new Float32Array([0,1,1,1,0,0,1,0]);const positionBuffer=gl.createBuffer();gl.bindBuffer(gl.ARRAY_BUFFER,positionBuffer);gl.bufferData(gl.ARRAY_BUFFER,positions,gl.STATIC_DRAW);const positionLocation=gl.getAttribLocation(program,\"position\");gl.enableVertexAttribArray(positionLocation);gl.vertexAttribPointer(positionLocation,2,gl.FLOAT,false,0,0);const uvBuffer=gl.createBuffer();gl.bindBuffer(gl.ARRAY_BUFFER,uvBuffer);gl.bufferData(gl.ARRAY_BUFFER,uvs,gl.STATIC_DRAW);const uvLocation=gl.getAttribLocation(program,\"uv\");gl.enableVertexAttribArray(uvLocation);gl.vertexAttribPointer(uvLocation,2,gl.FLOAT,false,0,0);}// Utility: Load texture\nfunction loadTexture(gl,src,onLoad){const img=new Image;img.crossOrigin=\"anonymous\";img.onload=()=>{const texture=gl.createTexture();if(!texture)return;gl.bindTexture(gl.TEXTURE_2D,texture);gl.texImage2D(gl.TEXTURE_2D,0,gl.RGBA,gl.RGBA,gl.UNSIGNED_BYTE,img);gl.texParameteri(gl.TEXTURE_2D,gl.TEXTURE_WRAP_S,gl.CLAMP_TO_EDGE);gl.texParameteri(gl.TEXTURE_2D,gl.TEXTURE_WRAP_T,gl.CLAMP_TO_EDGE);gl.texParameteri(gl.TEXTURE_2D,gl.TEXTURE_MIN_FILTER,gl.LINEAR);gl.texParameteri(gl.TEXTURE_2D,gl.TEXTURE_MAG_FILTER,gl.LINEAR);onLoad(texture,img.width,img.height);};img.src=src;}// Utility: Easing functions\nfunction easeLinear(t){return t;}function easeInOutCubic(t){return t*t*(3-2*t);}function easeOut(t){return 1-Math.pow(1-t,3);}function easeIn(t){return t*t*t;}function getEasingFunction(type){switch(type){case\"linear\":return easeLinear;case\"easeOut\":return easeOut;case\"easeIn\":return easeIn;case\"easeInOut\":default:return easeInOutCubic;}}// Hook: WebGL setup\nfunction useWebGLSetup(canvasRef,imageSrc){const glRef=useRef(null);const programRef=useRef(null);const textureRef=useRef(null);const textureResolutionRef=useRef({width:1,height:1});useEffect(()=>{if(RenderTarget.current()===RenderTarget.thumbnail)return;const canvas=canvasRef.current;if(!canvas)return;const gl=canvas.getContext(\"webgl\",{premultipliedAlpha:false,alpha:true});if(!gl)return;glRef.current=gl;// Enable blending for transparency\ngl.enable(gl.BLEND);gl.blendFunc(gl.SRC_ALPHA,gl.ONE_MINUS_SRC_ALPHA);const program=createProgram(gl);if(!program)return;programRef.current=program;setupGeometry(gl,program);loadTexture(gl,imageSrc,(texture,width,height)=>{textureRef.current=texture;textureResolutionRef.current.width=width;textureResolutionRef.current.height=height;});return()=>{if(gl&&textureRef.current){gl.deleteTexture(textureRef.current);}if(gl&&program){gl.deleteProgram(program);}};},[imageSrc]);return{glRef,programRef,textureRef,textureResolutionRef};}// Hook: Canvas resize\nfunction useCanvasResize(canvasRef,glRef){useEffect(()=>{if(RenderTarget.current()===RenderTarget.thumbnail)return;const canvas=canvasRef.current;if(!canvas)return;const handleResize=()=>{const dpr=Math.min(window.devicePixelRatio||1,2);canvas.width=canvas.offsetWidth*dpr;canvas.height=canvas.offsetHeight*dpr;const gl=glRef.current;if(gl){gl.viewport(0,0,canvas.width,canvas.height);}};handleResize();window.addEventListener(\"resize\",handleResize);return()=>window.removeEventListener(\"resize\",handleResize);},[]);}// Hook: Mouse tracking\nfunction useMouseTracking(canvasRef){const mouseRef=useRef({x:.5,y:.5});const targetMouseRef=useRef({x:.5,y:.5});const isHoveringRef=useRef(false);const hoverStartTimeRef=useRef(null);const leaveStartTimeRef=useRef(null);const hoverIntroRef=useRef(0);const hoverBulgeRef=useRef(0);const prevHoverIntroRef=useRef(0);const prevHoverBulgeRef=useRef(0);const resetHoverState=useCallback(()=>{isHoveringRef.current=false;hoverStartTimeRef.current=null;leaveStartTimeRef.current=null;hoverIntroRef.current=0;hoverBulgeRef.current=0;prevHoverIntroRef.current=0;prevHoverBulgeRef.current=0;targetMouseRef.current={x:.5,y:.5};mouseRef.current={x:.5,y:.5};},[]);useEffect(()=>{if(RenderTarget.current()===RenderTarget.thumbnail)return;const canvas=canvasRef.current;if(!canvas)return;const handleMouseMove=e=>{const rect=canvas.getBoundingClientRect();targetMouseRef.current={x:(e.clientX-rect.left)/rect.width,y:1-(e.clientY-rect.top)/rect.height};};const handleMouseEnter=()=>{isHoveringRef.current=true;hoverStartTimeRef.current=Date.now();leaveStartTimeRef.current=null;// Store current values as starting point for smooth transition\nprevHoverIntroRef.current=hoverIntroRef.current;prevHoverBulgeRef.current=hoverBulgeRef.current;};const handleMouseLeave=()=>{isHoveringRef.current=false;leaveStartTimeRef.current=Date.now();hoverStartTimeRef.current=null;// Store current values as starting point for smooth transition\nprevHoverIntroRef.current=hoverIntroRef.current;prevHoverBulgeRef.current=hoverBulgeRef.current;};canvas.addEventListener(\"mousemove\",handleMouseMove);canvas.addEventListener(\"mouseenter\",handleMouseEnter);canvas.addEventListener(\"mouseleave\",handleMouseLeave);return()=>{canvas.removeEventListener(\"mousemove\",handleMouseMove);canvas.removeEventListener(\"mouseenter\",handleMouseEnter);canvas.removeEventListener(\"mouseleave\",handleMouseLeave);};},[]);return{mouseRef,targetMouseRef,isHoveringRef,hoverStartTimeRef,leaveStartTimeRef,hoverIntroRef,hoverBulgeRef,prevHoverIntroRef,prevHoverBulgeRef,resetHoverState};}// Hook: Intersection observer\nfunction useIntersectionObserver(canvasRef){const[isInView,setIsInView]=useState(false);const hasRevealedRef=useRef(false);useEffect(()=>{if(RenderTarget.current()===RenderTarget.thumbnail)return;if(typeof window===\"undefined\")return;const canvas=canvasRef.current;if(!canvas)return;const observer=new IntersectionObserver(entries=>{entries.forEach(entry=>{startTransition(()=>{setIsInView(entry.isIntersecting);});});},{threshold:0});observer.observe(canvas);return()=>observer.disconnect();},[]);return{isInView,hasRevealedRef};}// Utility: Calculate cover UV (based on OGL's getCoverUV)\nfunction getCoverUV(canvasWidth,canvasHeight,imageWidth,imageHeight){const aspectOfScene=canvasWidth/canvasHeight;const aspectOfImage=imageWidth/imageHeight;let repeatX=1;let repeatY=1;if(aspectOfScene/aspectOfImage>1){repeatX=1;repeatY=aspectOfImage/aspectOfScene;}else{repeatX=aspectOfScene/aspectOfImage;repeatY=1;}const offsetX=(1-repeatX)/2;const offsetY=(1-repeatY)/2;return{offset:{x:offsetX,y:offsetY},repeat:{x:repeatX,y:repeatY}};}/**\n * Bulge Distortion\n * @framerDisableUnlink\n *\n * @framerIntrinsicWidth 800\n * @framerIntrinsicHeight 600\n *\n * @framerSupportedLayoutWidth fixed\n * @framerSupportedLayoutHeight fixed\n */export default function BulgeDistortion(props){const{image={src:\"https://framerusercontent.com/images/GfGkADagM4KEibNcIiRUWlfrR0.jpg\",alt:\"Gradient image\"},distortion={radius:.3,strength:.5,bulge:1},animation={introDuration:5e3,bulgeDuration:1800,mouseSmoothing:.1,enableReveal:true,revealStartX:.5,revealStartY:0,revealEasing:\"easeInOut\",revealBulgeStart:1,revealBulgeEnd:0,replayAnimation:false,enableHover:true}}=props;const isStatic=useIsStaticRenderer();const canvasRef=useRef(null);const animationFrameRef=useRef();const startTimeRef=useRef(Date.now());const{glRef,programRef,textureRef,textureResolutionRef}=useWebGLSetup(canvasRef,image.src);useCanvasResize(canvasRef,glRef);const{mouseRef,targetMouseRef,isHoveringRef,hoverStartTimeRef,leaveStartTimeRef,hoverIntroRef,hoverBulgeRef,prevHoverIntroRef,prevHoverBulgeRef,resetHoverState}=useMouseTracking(canvasRef);const{isInView,hasRevealedRef}=useIntersectionObserver(canvasRef);// Track animation start time - reset when entering viewport\nconst startIntroRef=useRef(Date.now());const revealCompleteRef=useRef(false);const prevReplayRef=useRef(animation.replayAnimation);const hasPlayedOnceRef=useRef(false);const prevEnableRevealRef=useRef(animation.enableReveal);const animationDirectionRef=useRef(\"forward\");// Reset animation only on first viewport entry when idle\nuseEffect(()=>{if(isInView&&!hasRevealedRef.current&&!animation.replayAnimation){startIntroRef.current=Date.now();revealCompleteRef.current=false;animationDirectionRef.current=animation.enableReveal?\"forward\":\"reverse\";resetHoverState();hasRevealedRef.current=true;hasPlayedOnceRef.current=true;}},[isInView,resetHoverState,animation.replayAnimation,animation.enableReveal]);// Trigger animation once when replayAnimation is toggled from false to true\nuseEffect(()=>{if(animation.replayAnimation&&!prevReplayRef.current&&animation.enableReveal){startIntroRef.current=Date.now();revealCompleteRef.current=false;animationDirectionRef.current=\"forward\";resetHoverState();hasPlayedOnceRef.current=true;}prevReplayRef.current=animation.replayAnimation;},[animation.replayAnimation,animation.enableReveal,resetHoverState]);// Handle enableReveal changes - animate in both directions\nuseEffect(()=>{if(animation.enableReveal!==prevEnableRevealRef.current){startIntroRef.current=Date.now();revealCompleteRef.current=false;animationDirectionRef.current=animation.enableReveal?\"forward\":\"reverse\";resetHoverState();hasPlayedOnceRef.current=true;}prevEnableRevealRef.current=animation.enableReveal;},[animation.enableReveal,resetHoverState]);// Render loop\nuseEffect(()=>{if(RenderTarget.current()===RenderTarget.thumbnail)return;if(!isInView)return;const gl=glRef.current;const program=programRef.current;if(!gl||!program)return;const easingFunction=getEasingFunction(animation.revealEasing);let revealBulge=animation.enableReveal?animation.revealBulgeStart:animation.revealBulgeEnd;let revealIntro=animation.enableReveal?0:1;const render=()=>{// Smooth mouse movement (matching reference: 0.1 interpolation)\nmouseRef.current.x+=(targetMouseRef.current.x-mouseRef.current.x)*.1;mouseRef.current.y+=(targetMouseRef.current.y-mouseRef.current.y)*.1;// Calculate reveal animation progress\nconst elapsed=Date.now()-startIntroRef.current;if(!revealCompleteRef.current){// Intro progress (controls mouse position interpolation)\nconst introProgress=Math.min(elapsed/animation.introDuration,1);const easedIntroProgress=easingFunction(introProgress);// Bulge progress (controls distortion amount)\nconst bulgeProgress=Math.min(elapsed/animation.bulgeDuration,1);const easedBulgeProgress=easingFunction(bulgeProgress);if(animationDirectionRef.current===\"forward\"){// Animate from start to end\nrevealIntro=easedIntroProgress;revealBulge=animation.revealBulgeStart+(animation.revealBulgeEnd-animation.revealBulgeStart)*easedBulgeProgress;}else{// Animate from end to start (reverse)\nrevealIntro=1-easedIntroProgress;revealBulge=animation.revealBulgeEnd+(animation.revealBulgeStart-animation.revealBulgeEnd)*easedBulgeProgress;}// Mark reveal as complete when both animations finish\nif(introProgress>=1&&bulgeProgress>=1){revealCompleteRef.current=true;}}else{// Animation complete - use final values based on enableReveal\nrevealIntro=animation.enableReveal?1:0;revealBulge=animation.enableReveal?animation.revealBulgeEnd:animation.revealBulgeStart;}// Handle hover interactions (only after reveal is complete or when not animating)\nconst canHover=animation.enableHover&&revealCompleteRef.current;if(canHover&&isHoveringRef.current&&hoverStartTimeRef.current!==null){// On hover: animate uIntro to 1 over 5 seconds, uBulge to 1 over 1 second\nconst hoverElapsed=Date.now()-hoverStartTimeRef.current;// Intro: 5 second animation with expo.out easing, starting from previous value\nconst introProgress=Math.min(hoverElapsed/5e3,1);const easedIntroProgress=1-Math.pow(1-introProgress,3)// expo.out approximation\n;hoverIntroRef.current=prevHoverIntroRef.current+(1-prevHoverIntroRef.current)*easedIntroProgress;// Bulge: 1 second animation with expo.out easing, starting from previous value\nconst bulgeProgress=Math.min(hoverElapsed/1e3,1);const easedBulgeProgress=1-Math.pow(1-bulgeProgress,3)// expo.out approximation\n;hoverBulgeRef.current=prevHoverBulgeRef.current+(1-prevHoverBulgeRef.current)*easedBulgeProgress;}else if(!isHoveringRef.current&&leaveStartTimeRef.current!==null){// On leave: animate uBulge back to 0 over 1 second, starting from previous value\nconst leaveElapsed=Date.now()-leaveStartTimeRef.current;const bulgeProgress=Math.min(leaveElapsed/1e3,1);const easedBulgeProgress=1-Math.pow(1-bulgeProgress,3)// expo.out approximation\n;hoverBulgeRef.current=prevHoverBulgeRef.current*(1-easedBulgeProgress);// Keep intro at current value (don't animate it on leave)\n}// Combine reveal and hover states\nconst finalIntro=Math.max(revealIntro,hoverIntroRef.current);const finalBulge=Math.max(revealBulge,hoverBulgeRef.current);const time=(Date.now()-startTimeRef.current)/1e3;gl.clearColor(0,0,0,0);gl.clear(gl.COLOR_BUFFER_BIT);const canvas=canvasRef.current;if(!canvas)return;// Set uniforms\ngl.uniform1f(gl.getUniformLocation(program,\"uTime\"),time);gl.uniform2f(gl.getUniformLocation(program,\"uMouse\"),mouseRef.current.x,mouseRef.current.y);gl.uniform2f(gl.getUniformLocation(program,\"uMouseIntro\"),animation.revealStartX,animation.revealStartY);gl.uniform2f(gl.getUniformLocation(program,\"uTextureResolution\"),textureResolutionRef.current.width,textureResolutionRef.current.height);gl.uniform2f(gl.getUniformLocation(program,\"uResolution\"),canvas.width,canvas.height);gl.uniform1f(gl.getUniformLocation(program,\"uRadius\"),distortion.radius);gl.uniform1f(gl.getUniformLocation(program,\"uStrength\"),distortion.strength);gl.uniform1f(gl.getUniformLocation(program,\"uBulge\"),finalBulge);gl.uniform1i(gl.getUniformLocation(program,\"uTexture\"),0);gl.uniform1f(gl.getUniformLocation(program,\"uIntro\"),finalIntro);// Calculate and set cover UV\nconst coverUV=getCoverUV(canvas.width,canvas.height,textureResolutionRef.current.width,textureResolutionRef.current.height);gl.uniform2f(gl.getUniformLocation(program,\"uCoverOffset\"),coverUV.offset.x,coverUV.offset.y);gl.uniform2f(gl.getUniformLocation(program,\"uCoverRepeat\"),coverUV.repeat.x,coverUV.repeat.y);gl.activeTexture(gl.TEXTURE0);gl.bindTexture(gl.TEXTURE_2D,textureRef.current);gl.drawArrays(gl.TRIANGLE_STRIP,0,4);animationFrameRef.current=requestAnimationFrame(render);};render();return()=>{if(animationFrameRef.current){cancelAnimationFrame(animationFrameRef.current);}};},[distortion.radius,distortion.strength,distortion.bulge,animation.introDuration,animation.bulgeDuration,animation.mouseSmoothing,animation.enableReveal,animation.revealStartX,animation.revealStartY,animation.revealEasing,animation.revealBulgeStart,animation.revealBulgeEnd,isInView,resetHoverState]);// Show static image preview for Canvas/Export\nif(isStatic){return /*#__PURE__*/_jsx(\"img\",{src:image.src,alt:image.alt||\"Bulge distortion effect\",style:{width:\"100%\",height:\"100%\",objectFit:\"cover\",display:\"block\"}});}return /*#__PURE__*/_jsx(\"canvas\",{ref:canvasRef,style:{width:\"100%\",height:\"100%\",display:\"block\",background:\"transparent\"},\"aria-label\":image.alt||\"Bulge distortion effect\"});}addPropertyControls(BulgeDistortion,{image:{type:ControlType.ResponsiveImage,title:\"Image\"},distortion:{type:ControlType.Object,title:\"Distortion\",controls:{radius:{type:ControlType.Number,title:\"Radius\",defaultValue:.3,min:.1,max:1,step:.01},strength:{type:ControlType.Number,title:\"Strength\",defaultValue:.5,min:0,max:2,step:.01},bulge:{type:ControlType.Number,title:\"Bulge\",defaultValue:1,min:0,max:1,step:.01}}},animation:{type:ControlType.Object,title:\"Animation\",controls:{introDuration:{type:ControlType.Number,title:\"Intro Duration\",defaultValue:5e3,min:0,max:1e4,step:100,unit:\"ms\"},bulgeDuration:{type:ControlType.Number,title:\"Bulge Duration\",defaultValue:1800,min:0,max:5e3,step:100,unit:\"ms\"},mouseSmoothing:{type:ControlType.Number,title:\"Mouse Smoothing\",defaultValue:.1,min:.01,max:1,step:.01},enableHover:{type:ControlType.Boolean,title:\"Enable Hover\",defaultValue:true,enabledTitle:\"On\",disabledTitle:\"Off\"},enableReveal:{type:ControlType.Boolean,title:\"Enable Reveal\",defaultValue:true,enabledTitle:\"On\",disabledTitle:\"Off\"},revealStartX:{type:ControlType.Number,title:\"Reveal Start X\",defaultValue:.5,min:-1,max:1,step:.01,hidden:({animation})=>!animation.enableReveal},revealStartY:{type:ControlType.Number,title:\"Reveal Start Y\",defaultValue:0,min:-1,max:1,step:.01,hidden:({animation})=>!animation.enableReveal},revealEasing:{type:ControlType.Enum,title:\"Reveal Easing\",options:[\"linear\",\"easeInOut\",\"easeOut\",\"easeIn\"],optionTitles:[\"Linear\",\"Ease In Out\",\"Ease Out\",\"Ease In\"],defaultValue:\"easeInOut\",hidden:({animation})=>!animation.enableReveal},revealBulgeStart:{type:ControlType.Number,title:\"Bulge Start\",defaultValue:1,min:0,max:1,step:.01,hidden:({animation})=>!animation.enableReveal},revealBulgeEnd:{type:ControlType.Number,title:\"Bulge End\",defaultValue:0,min:0,max:1,step:.01,hidden:({animation})=>!animation.enableReveal},replayAnimation:{type:ControlType.Boolean,title:\"Replay Animation\",defaultValue:false,enabledTitle:\"Replay\",disabledTitle:\"Idle\",hidden:({animation})=>!animation.enableReveal}}}});\nexport const __FramerMetadata__ = {\"exports\":{\"default\":{\"type\":\"reactComponent\",\"name\":\"BulgeDistortion\",\"slots\":[],\"annotations\":{\"framerDisableUnlink\":\"*\",\"framerContractVersion\":\"1\",\"framerSupportedLayoutWidth\":\"fixed\",\"framerIntrinsicWidth\":\"800\",\"framerIntrinsicHeight\":\"600\",\"framerSupportedLayoutHeight\":\"fixed\"}},\"__FramerMetadata__\":{\"type\":\"variable\"}}}\n//# sourceMappingURL=./BulgeDistortion.map"],"mappings":"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"}