{"version":3,"file":"ParallaxImage_prod.Clvb4Mfr.mjs","names":["useRef"],"sources":["https:/framerusercontent.com/modules/zxcGfQb3lPhoJOWc1HTU/UJ2Vbt1b9eAYHpiaBd65/ParallaxImage_prod.js"],"sourcesContent":["import{jsx as _jsx,jsxs as _jsxs}from\"react/jsx-runtime\";import{addPropertyControls,ControlType,RenderTarget}from\"framer\";import{useEffect,useRef}from\"react\";import{useReducedMotion}from\"framer-motion\";const DEFAULT_IMAGE={src:\"https://framerusercontent.com/images/oHxPQbqbgpU7CA0wduhfDb4izBY.png\",alt:\"\"};const DEFAULT_RADIUS={top:0,right:0,bottom:0,left:0};function radiusValue(radius){if(typeof radius===\"number\"||typeof radius===\"string\")return radius;return`${radius?.top??0}px ${radius?.right??0}px ${radius?.bottom??0}px ${radius?.left??0}px`;}/** Skip style writes when transform delta is below this many pixels. */const TRANSFORM_EPSILON=.5;/** Extra px of image on every side, absorbing subpixel rounding at max shift. */const COVER_BLEED_PX=1;function clamp(value,min,max){return Math.min(max,Math.max(min,value));}const sharedInstances=new Set;let sharedFrameId=null;let sharedListenersAttached=false;function sharedTick(){sharedFrameId=null;if(document.hidden)return;let needsContinuous=false;for(const instance of sharedInstances){if(!instance.active||!instance.intersecting)continue;instance.update();if(instance.continuous)needsContinuous=true;}if(needsContinuous){sharedFrameId=requestAnimationFrame(sharedTick);}}function requestSharedUpdate(){if(sharedFrameId===null&&!document.hidden&&sharedInstances.size>0){sharedFrameId=requestAnimationFrame(sharedTick);}}function handleSharedVisibility(){if(document.hidden){if(sharedFrameId!==null){cancelAnimationFrame(sharedFrameId);sharedFrameId=null;}}else{requestSharedUpdate();}}function attachSharedListeners(){if(sharedListenersAttached)return;sharedListenersAttached=true;window.addEventListener(\"scroll\",requestSharedUpdate,{passive:true});window.addEventListener(\"resize\",requestSharedUpdate,{passive:true});document.addEventListener(\"visibilitychange\",handleSharedVisibility);}function detachSharedListenersIfEmpty(){if(sharedInstances.size>0)return;if(!sharedListenersAttached)return;sharedListenersAttached=false;window.removeEventListener(\"scroll\",requestSharedUpdate);window.removeEventListener(\"resize\",requestSharedUpdate);document.removeEventListener(\"visibilitychange\",handleSharedVisibility);if(sharedFrameId!==null){cancelAnimationFrame(sharedFrameId);sharedFrameId=null;}}/**\n * @framerSupportedLayoutWidth fixed\n * @framerSupportedLayoutHeight fixed\n * @framerIntrinsicWidth 400\n * @framerIntrinsicHeight 300\n * @framerDisableUnlink\n */export default function ImageParallax(props){const{verticalParallaxAmount=30,horizontalParallaxAmount=0,image=DEFAULT_IMAGE,style,borderRadius=DEFAULT_RADIUS,border,boxShadow}=props;const containerRef=useRef(null);const imageRef=useRef(null);const isCanvas=RenderTarget.current()===RenderTarget.canvas;const reducedMotion=useReducedMotion();useEffect(()=>{if(isCanvas)return;if(reducedMotion){if(imageRef.current){imageRef.current.style.transform=\"translate3d(0, 0, 0)\";imageRef.current.style.willChange=\"auto\";}return;}const container=containerRef.current?.isConnected?containerRef.current:null;const imageElement=imageRef.current;if(!container||!imageElement)return;let lastX=Number.NaN;let lastY=Number.NaN;let lastLeft=Number.NaN;let sleepTimer=null;const wantsContinuous=horizontalParallaxAmount!==0;/** While X≠0 is intersecting but stationary, poll this often so looping parents still wake without a window scroll. */const CONTINUOUS_SLEEP_MS=120;const clearSleepTimer=()=>{if(sleepTimer!==null){window.clearTimeout(sleepTimer);sleepTimer=null;}};const armSleepProbe=()=>{if(sleepTimer!==null)return;if(!instance.active||!instance.intersecting||document.hidden)return;sleepTimer=window.setTimeout(()=>{sleepTimer=null;// Force movement re-check on the next shared tick\nlastLeft=Number.NaN;requestSharedUpdate();},CONTINUOUS_SLEEP_MS);};const instance={active:true,intersecting:true,continuous:false,update:()=>{if(!instance.active||!instance.intersecting||document.hidden){instance.continuous=false;clearSleepTimer();return;}const rect=container.getBoundingClientRect();if(rect.width<=0||rect.height<=0){instance.continuous=false;clearSleepTimer();return;}const verticalProgress=Math.max(0,Math.min(1,(window.innerHeight-rect.top)/(window.innerHeight+rect.height)));// Shift in layout px (offset size ignores ancestor transforms\n// like hover scale), then clamp to the overscan so the image\n// always covers the box: overscan per side = |amount|/2 %.\nconst layoutWidth=container.offsetWidth||rect.width;const layoutHeight=container.offsetHeight||rect.height;const maxY=Math.abs(verticalParallaxAmount)/200*layoutHeight;const y=clamp((verticalProgress-.5)*(verticalParallaxAmount/100)*layoutHeight,-maxY,maxY);let x=0;if(wantsContinuous){// Clamped to ±0.5 so off-screen / looping positions saturate\n// instead of sliding past the overscan.\nconst horizontalProgress=clamp((rect.left+rect.width/2-window.innerWidth/2)/window.innerWidth,-.5,.5);const maxX=Math.abs(horizontalParallaxAmount)/200*layoutWidth;x=clamp(horizontalProgress*(horizontalParallaxAmount/100)*layoutWidth,-maxX,maxX);// Sleep continuous rAF when stationary; probe infrequently\n// so looping parents that later move rect.left still wake.\n// Default X=0 never enters this branch.\nif(Number.isNaN(lastLeft)||Math.abs(rect.left-lastLeft)>=TRANSFORM_EPSILON){instance.continuous=true;lastLeft=rect.left;clearSleepTimer();}else{instance.continuous=false;armSleepProbe();}}else{instance.continuous=false;clearSleepTimer();}if(Number.isNaN(lastX)||Number.isNaN(lastY)||Math.abs(x-lastX)>=TRANSFORM_EPSILON||Math.abs(y-lastY)>=TRANSFORM_EPSILON){lastX=x;lastY=y;imageElement.style.transform=`translate3d(${x}px, ${y}px, 0)`;}}};const setWillChange=on=>{imageElement.style.willChange=on?\"transform\":\"auto\";};const intersectionObserver=new IntersectionObserver(([entry])=>{instance.intersecting=entry?entry.isIntersecting:true;if(instance.intersecting){setWillChange(true);// Wake from sleep when re-entering view\nlastLeft=Number.NaN;clearSleepTimer();requestSharedUpdate();}else{instance.continuous=false;clearSleepTimer();setWillChange(false);}},{rootMargin:\"100px\"});const resizeObserver=new ResizeObserver(()=>{// Size changes can move rect.left without a window scroll\nlastLeft=Number.NaN;// ResizeObserver runs after layout, before paint: re-clamp now so\n// the first frame at the new size never shows a stale shift.\ninstance.update();requestSharedUpdate();});sharedInstances.add(instance);attachSharedListeners();setWillChange(true);intersectionObserver.observe(container);resizeObserver.observe(container);requestSharedUpdate();return()=>{instance.active=false;instance.continuous=false;clearSleepTimer();sharedInstances.delete(instance);detachSharedListenersIfEmpty();intersectionObserver.disconnect();resizeObserver.disconnect();imageElement.style.willChange=\"auto\";};},[verticalParallaxAmount,horizontalParallaxAmount,isCanvas,reducedMotion]);const{src:imageSrc,positionX,positionY,...imageAttributes}=typeof image===\"string\"?{src:image,positionX:undefined,positionY:undefined}:image;const imagePosition=positionX&&positionY?`${positionX} ${positionY}`:\"center\";const radius=radiusValue(borderRadius);return /*#__PURE__*/_jsxs(\"div\",{\"data-build\":\"parallax-image-prod-20261006-01\",ref:containerRef,style:{position:\"relative\",width:\"100%\",height:\"100%\",...style,overflow:\"hidden\",borderRadius:radius,boxShadow:boxShadow||undefined},children:[isCanvas?/*#__PURE__*/_jsx(\"img\",{...imageAttributes,src:imageSrc,alt:imageAttributes.alt??\"\",draggable:false,style:{width:\"100%\",height:\"100%\",display:\"block\",objectFit:\"cover\",objectPosition:imagePosition,borderRadius:radius,userSelect:\"none\",pointerEvents:\"none\"}}):/*#__PURE__*/_jsx(\"img\",{...imageAttributes,ref:imageRef,src:imageSrc,alt:imageAttributes.alt??\"\",draggable:false,style:{position:\"absolute\",top:`calc(-${Math.abs(verticalParallaxAmount)/2}% - ${COVER_BLEED_PX}px)`,left:`calc(-${Math.abs(horizontalParallaxAmount)/2}% - ${COVER_BLEED_PX}px)`,width:`calc(100% + ${Math.abs(horizontalParallaxAmount)}% + ${2*COVER_BLEED_PX}px)`,height:`calc(100% + ${Math.abs(verticalParallaxAmount)}% + ${2*COVER_BLEED_PX}px)`,maxWidth:\"none\",maxHeight:\"none\",objectFit:\"cover\",objectPosition:imagePosition,// No radius on the moving image: the container clips it,\n// so shifted image corners can never expose background.\n// will-change set/cleared via IntersectionObserver\nbackfaceVisibility:\"hidden\",userSelect:\"none\",pointerEvents:\"none\"}}),/*#__PURE__*/_jsx(\"div\",{\"aria-hidden\":\"true\",style:{position:\"absolute\",inset:0,zIndex:1,boxSizing:\"border-box\",borderRadius:radius,pointerEvents:\"none\",...border||{}}})]});}addPropertyControls(ImageParallax,{image:{type:ControlType.ResponsiveImage,title:\"Image\",[\"defaultValue\"]:DEFAULT_IMAGE},verticalParallaxAmount:{type:ControlType.Number,title:\"Parallax Y\",defaultValue:30,step:5,max:100,min:-100,unit:\"%\"},horizontalParallaxAmount:{type:ControlType.Number,title:\"Parallax X\",defaultValue:0,step:5,max:100,min:-100,unit:\"%\"},border:{type:ControlType.Border,title:\"Border\",optional:true},borderRadius:{type:ControlType.BorderRadius,title:\"Radius\",defaultValue:DEFAULT_RADIUS,min:0,max:100,step:1,unit:\"px\"},boxShadow:{type:ControlType.BoxShadow,title:\"Shadow\",description:\"More components at [Framer University](https://frameruni.link/cc).\"}});ImageParallax.displayName=\"Image Parallax\";\nexport const __FramerMetadata__ = {\"exports\":{\"default\":{\"type\":\"reactComponent\",\"name\":\"ImageParallax\",\"slots\":[],\"annotations\":{\"framerContractVersion\":\"1\",\"framerIntrinsicHeight\":\"300\",\"framerSupportedLayoutWidth\":\"fixed\",\"framerIntrinsicWidth\":\"400\",\"framerDisableUnlink\":\"\",\"framerSupportedLayoutHeight\":\"fixed\"}},\"__FramerMetadata__\":{\"type\":\"variable\"}}}\n//# sourceMappingURL=./ParallaxImage_prod.map"],"mappings":"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"}