{"version":3,"file":"LogoRotator.CPdQ6vOM.mjs","names":["useRef","useState","useCallback"],"sources":["https:/framerusercontent.com/modules/moorVFtgSTteVnoOkuSP/4U2m7aVFqTdjy6enS6Fm/LogoRotator.js"],"sourcesContent":["// 3D Logo Rotator - 4 images rotating in a 360° tilted orbit with drag and scroll interaction.\n// Fully responsive: scales to fit its own CONTAINER (mobile / tablet / desktop) via ResizeObserver.\nimport{jsx as _jsx}from\"react/jsx-runtime\";import{useEffect,useRef,useState,useCallback,startTransition}from\"react\";import{addPropertyControls,ControlType}from\"framer\";// Pure placement math, shared by first paint (JSX) and the per-frame loop.\nfunction getItemPlacement(i,angleDeg,g){const itemAngle=(angleDeg+360/g.count*i)%360;const rad=itemAngle*Math.PI/180;const x=Math.sin(rad)*g.radiusX;const z=Math.cos(rad)*g.radiusZ;// Guard against a zero-radius orbit (Mobile Image Size dragged up to meet\n// Mobile Orbit Spread) — without this the divide returns NaN and images blank.\nconst depthNorm=g.radiusZ>0?(z+g.radiusZ)/(2*g.radiusZ):.5;const s=.35+depthNorm*.65;const y=-Math.cos(rad)*g.radiusY;return{transform:`translate(-50%, -50%) translateX(${x}px) translateY(${y}px) scale(${s})`,zIndex:Math.round(depthNorm*100)};}/**\n * Image Rotator 360°\n *\n * A 3D carousel that displays up to 4 images rotating in a tilted orbital path.\n * Interactive drag controls, optional scroll-based rotation, and smooth momentum physics.\n *\n * Responsiveness:\n * - Measures its OWN container (not window width), so it works correctly inside any\n *   parent and across Framer's Desktop / Tablet / Phone breakpoints.\n * - On wide containers the whole orbit is scaled to fit and never clips.\n * - On narrow containers (below \"Mobile Below\") the orbit is TIGHTENED around the\n *   images instead of shrinking them.\n *\n * Motion:\n * - \"Auto-Rotate\" toggle turns the automatic spin on/off (off by default).\n * - \"Scroll-Rotate\" eases the orbit toward a scroll-driven target (smooth, no pulsing).\n * - Drag always works regardless of the toggles.\n * - \"Rotation Speed\" is seconds per full loop. Higher = slower.\n * - Per-frame motion is written straight to the DOM (no React re-render each frame)\n *   and is time-normalized, so it's smooth and consistent on 60Hz and 120Hz+.\n *\n * @framerIntrinsicWidth 800\n * @framerIntrinsicHeight 600\n *\n * @framerSupportedLayoutWidth any-prefer-fixed\n * @framerSupportedLayoutHeight any-prefer-fixed\n */export default function ImageRotator360(props){const{logo1={src:\"https://framerusercontent.com/images/GfGkADagM4KEibNcIiRUWlfrR0.jpg\",alt:\"LAVO Digital smart lock product image\"},logo2={src:\"https://framerusercontent.com/images/aNsAT3jCvt4zglbWCUoFe33Q.jpg\",alt:\"LAVO Digital smart lock product image\"},logo3={src:\"https://framerusercontent.com/images/BYnxEV1zjYb9bhWh1IwBZ1ZoS60.jpg\",alt:\"LAVO Digital smart lock product image\"},logo4={src:\"https://framerusercontent.com/images/2uTNEj5aTl2K3NJaEFWMbnrA.jpg\",alt:\"LAVO Digital smart lock product image\"},mediaType1=\"image\",mediaType2=\"image\",mediaType3=\"image\",mediaType4=\"image\",video1=\"https://framerusercontent.com/assets/MLWPbW1dUQawJLhhun3dBwpgJak.mp4\",video2=\"https://framerusercontent.com/assets/MLWPbW1dUQawJLhhun3dBwpgJak.mp4\",video3=\"https://framerusercontent.com/assets/MLWPbW1dUQawJLhhun3dBwpgJak.mp4\",video4=\"https://framerusercontent.com/assets/MLWPbW1dUQawJLhhun3dBwpgJak.mp4\",autoRotate=false,scrollRotate=false,scrollSensitivity=.15,speed=30,imageWidth=300,aspectRatio=1,imageRadius=10,mobileBreakpoint=810,mobileImageFill=.82,mobileOrbitSpread=1}=props;const logos=[logo1,logo2,logo3,logo4].filter(l=>!!l?.src);const mediaTypes=[mediaType1,mediaType2,mediaType3,mediaType4];const videos=[video1,video2,video3,video4];const angleRef=useRef(0);const rafRef=useRef(0);const sectionRef=useRef(null);const isDragging=useRef(false);const lastMouseX=useRef(0);const lastTouchX=useRef(0);const autoSpeed=useRef(1);const dragVelocity=useRef(0);// Scroll-rotate: we ease an \"applied\" value toward an accumulated \"target\"\n// instead of decaying an impulse. That is what keeps scrolling smooth.\nconst scrollTargetRef=useRef(0);const scrollAppliedRef=useRef(0);const isNearViewportRef=useRef(true);// Per-frame animation targets — driven imperatively (no React re-render per frame).\nconst itemRefs=useRef([]);const geomRef=useRef({radiusX:0,radiusY:0,radiusZ:0,count:1});const lastZRef=useRef([]);// Measure the component's OWN container (not window width). This is what makes the\n// component correctly responsive inside Framer breakpoints and in any parent layout.\nconst[containerSize,setContainerSize]=useState({width:800,height:600});useEffect(()=>{const el=sectionRef.current;if(!el||typeof ResizeObserver===\"undefined\")return;const ro=new ResizeObserver(entries=>{const entry=entries[0];if(!entry)return;const{width,height}=entry.contentRect;if(width>0&&height>0){startTransition(()=>setContainerSize({width,height}));}});ro.observe(el);return()=>ro.disconnect();},[]);// ---- Geometry -----------------------------------------------------------\nconst count=logos.length||1;const baseGap=20;const baseRadiusY=40;const PADDING=.92// leave a little breathing room around the edges\n;const availW=containerSize.width*PADDING;const availH=containerSize.height*PADDING;const isNarrow=containerSize.width<mobileBreakpoint;// Design-size geometry (scale = 1)\nlet designImageWidth=imageWidth;let baseRadiusX;if(isNarrow&&mobileImageFill>0){// Mobile: size the image from the container first, then wrap the orbit\n// around it, instead of shrinking the whole orbit to fit a phone.\ndesignImageWidth=availW*mobileImageFill;const spread=availW*mobileOrbitSpread;baseRadiusX=Math.max((spread-designImageWidth)/2,0);}else{baseRadiusX=Math.max(count*(imageWidth+baseGap)/(2*Math.PI),200);}const baseImageHeight=designImageWidth/aspectRatio;// Worst-case orbit footprint at scale = 1 (safe over-estimate so nothing clips)\nconst footprintW=baseRadiusX*2+designImageWidth;const footprintH=baseRadiusY*2+baseImageHeight;// Fit the whole orbit inside the container on BOTH axes, and never upscale past 1.\nconst fitScale=Math.min(1,availW/footprintW,availH/footprintH);const scale=Number.isFinite(fitScale)&&fitScale>0?fitScale:1;// Final (responsive) geometry\nconst radiusX=baseRadiusX*scale;const radiusZ=radiusX*.85;const radiusY=baseRadiusY*scale;const finalImageWidth=designImageWidth*scale;const finalImageHeight=finalImageWidth/aspectRatio;// Hand the latest geometry to the animation loop (which runs off refs, so it\n// picks up resize / prop changes without restarting).\ngeomRef.current={radiusX,radiusY,radiusZ,count};// ---- Interaction --------------------------------------------------------\nconst handleMouseDown=useCallback(e=>{isDragging.current=true;lastMouseX.current=e.clientX;autoSpeed.current=0;dragVelocity.current=0;},[]);const handleMouseMove=useCallback(e=>{if(!isDragging.current)return;const dx=e.clientX-lastMouseX.current;lastMouseX.current=e.clientX;const sensitivity=.3;angleRef.current=(angleRef.current+dx*sensitivity)%360;dragVelocity.current=dx*sensitivity;},[]);const handleMouseUp=useCallback(()=>{isDragging.current=false;autoSpeed.current=1;},[]);const handleMouseLeave=useCallback(()=>{if(isDragging.current){isDragging.current=false;autoSpeed.current=1;}},[]);const handleTouchStart=useCallback(e=>{isDragging.current=true;lastTouchX.current=e.touches[0].clientX;autoSpeed.current=0;dragVelocity.current=0;},[]);const handleTouchMove=useCallback(e=>{if(!isDragging.current)return;const dx=e.touches[0].clientX-lastTouchX.current;lastTouchX.current=e.touches[0].clientX;const sensitivity=.3;angleRef.current=(angleRef.current+dx*sensitivity)%360;dragVelocity.current=dx*sensitivity;},[]);const handleTouchEnd=useCallback(()=>{isDragging.current=false;autoSpeed.current=1;},[]);// Track whether the component is near the viewport WITHOUT touching layout on\n// every scroll event (getBoundingClientRect in a scroll handler forces reflow\n// and makes the page scroll itself stutter). IntersectionObserver is off-thread.\nuseEffect(()=>{if(!scrollRotate)return;const el=sectionRef.current;if(!el||typeof IntersectionObserver===\"undefined\")return;const io=new IntersectionObserver(([entry])=>{isNearViewportRef.current=entry.isIntersecting;},// expand the root by half a viewport top & bottom = \"near\" the viewport\n{rootMargin:\"50% 0px 50% 0px\",threshold:0});io.observe(el);return()=>io.disconnect();},[scrollRotate]);// Page scroll listener (only active when scrollRotate is on). Cheap: it just\n// reads scrollY and nudges the accumulated target — no layout work.\nuseEffect(()=>{if(typeof window===\"undefined\")return;if(!scrollRotate)return;let lastScrollY=window.scrollY;const onScroll=()=>{const currentScrollY=window.scrollY;if(!isNearViewportRef.current){lastScrollY=currentScrollY// keep baseline so re-entry doesn't jump\n;return;}const delta=currentScrollY-lastScrollY;lastScrollY=currentScrollY;scrollTargetRef.current+=delta*scrollSensitivity;};window.addEventListener(\"scroll\",onScroll,{passive:true});return()=>window.removeEventListener(\"scroll\",onScroll);},[scrollRotate,scrollSensitivity]);// ---- Animation loop -----------------------------------------------------\n// Updates the angle and writes transforms DIRECTLY to the DOM. React is not\n// re-rendered per frame, which is what removes the stutter.\nuseEffect(()=>{if(logos.length===0)return;const degreesPerSecond=360/speed;let lastTime=null;const animate=time=>{if(lastTime===null)lastTime=time;// Clamp delta so a backgrounded tab doesn't cause a big jump on return\nconst delta=Math.min((time-lastTime)/1e3,.05);lastTime=time;// Frames elapsed, normalized to 60fps. Multiplying velocities and\n// raising decays/eases to this power = identical motion at any refresh rate.\nconst step=delta*60;// Scroll-driven rotation: ease the applied amount toward the accumulated\n// target and feed the eased DELTA into the angle. Because we ease toward\n// a moving target (rather than decaying an impulse), continuous scrolling\n// is continuous rotation and it settles smoothly — no sawtooth, no kick.\nconst scrollEase=1-Math.pow(1-.14,step);const prevApplied=scrollAppliedRef.current;scrollAppliedRef.current+=(scrollTargetRef.current-scrollAppliedRef.current)*scrollEase;const scrollDelta=scrollAppliedRef.current-prevApplied;if(scrollDelta!==0){angleRef.current=(angleRef.current+scrollDelta)%360;}// Renormalize once settled so the accumulators never grow unbounded.\nif(Math.abs(scrollTargetRef.current-scrollAppliedRef.current)<.001){scrollTargetRef.current=0;scrollAppliedRef.current=0;}if(!isDragging.current){if(Math.abs(dragVelocity.current)>.1){// Coast on drag momentum (time-normalized)\nangleRef.current=(angleRef.current+dragVelocity.current*step)%360;dragVelocity.current*=Math.pow(.92,step);}else{dragVelocity.current=0;// Automatic rotation (only when enabled)\nif(autoRotate){angleRef.current=(angleRef.current+degreesPerSecond*delta*autoSpeed.current)%360;}}}// Write straight to the DOM — no React reconciliation this frame.\nconst g=geomRef.current;const angle=angleRef.current;const refs=itemRefs.current;for(let i=0;i<g.count;i++){const node=refs[i];if(!node)continue;const placement=getItemPlacement(i,angle,g);node.style.transform=placement.transform;if(lastZRef.current[i]!==placement.zIndex){node.style.zIndex=String(placement.zIndex);lastZRef.current[i]=placement.zIndex;}}rafRef.current=requestAnimationFrame(animate);};rafRef.current=requestAnimationFrame(animate);return()=>cancelAnimationFrame(rafRef.current);},[logos.length,speed,autoRotate]);if(logos.length===0){return /*#__PURE__*/_jsx(\"div\",{style:{display:\"flex\",alignItems:\"center\",justifyContent:\"center\",width:\"100%\",height:\"100%\",fontFamily:\"Inter, sans-serif\",fontSize:\"16px\",color:\"#808083\"},children:\"Add images in the settings panel\"});}return /*#__PURE__*/_jsx(\"div\",{ref:sectionRef,style:{display:\"flex\",alignItems:\"center\",justifyContent:\"center\",width:\"100%\",height:\"100%\",position:\"relative\",overflow:\"hidden\",cursor:isDragging.current?\"grabbing\":\"grab\",userSelect:\"none\",touchAction:\"pan-y\"},onMouseDown:handleMouseDown,onMouseMove:handleMouseMove,onMouseUp:handleMouseUp,onMouseLeave:handleMouseLeave,onTouchStart:handleTouchStart,onTouchMove:handleTouchMove,onTouchEnd:handleTouchEnd,children:/*#__PURE__*/_jsx(\"div\",{style:{position:\"relative\",width:`${radiusX*2+finalImageWidth}px`,height:`${radiusY*2+finalImageHeight}px`},children:logos.map((logo,i)=>{// First paint uses the live angle; the rAF loop takes over after.\nconst placement=getItemPlacement(i,angleRef.current,{radiusX,radiusY,radiusZ,count});return /*#__PURE__*/_jsx(\"div\",{ref:el=>{itemRefs.current[i]=el;},style:{position:\"absolute\",top:\"50%\",left:\"50%\",display:\"flex\",alignItems:\"center\",justifyContent:\"center\",willChange:\"transform\",transform:placement.transform,zIndex:placement.zIndex},children:mediaTypes[i]===\"video\"?/*#__PURE__*/_jsx(\"video\",{src:videos[i],autoPlay:true,loop:true,muted:true,playsInline:true,style:{width:`${finalImageWidth}px`,height:`${finalImageHeight}px`,objectFit:\"cover\",display:\"block\",borderRadius:`${imageRadius}px`,pointerEvents:\"none\"}}):/*#__PURE__*/_jsx(\"img\",{src:logo.src,alt:logo.alt||\"LAVO Digital smart lock product image\",style:{width:`${finalImageWidth}px`,height:`${finalImageHeight}px`,objectFit:\"cover\",display:\"block\",borderRadius:`${imageRadius}px`,pointerEvents:\"none\"}})},i);})})});}addPropertyControls(ImageRotator360,{mediaType1:{type:ControlType.Enum,title:\"Media Type 1\",options:[\"image\",\"video\"],optionTitles:[\"Image\",\"Video\"],defaultValue:\"image\",displaySegmentedControl:true},logo1:{type:ControlType.ResponsiveImage,title:\"Image 1\",description:\"First image in the rotation\",hidden:({mediaType1})=>mediaType1===\"video\"},video1:{type:ControlType.File,title:\"Video 1\",allowedFileTypes:[\"mp4\",\"webm\",\"mov\"],hidden:({mediaType1})=>mediaType1===\"image\"},mediaType2:{type:ControlType.Enum,title:\"Media Type 2\",options:[\"image\",\"video\"],optionTitles:[\"Image\",\"Video\"],defaultValue:\"image\",displaySegmentedControl:true},logo2:{type:ControlType.ResponsiveImage,title:\"Image 2\",description:\"Second image in the rotation\",hidden:({mediaType2})=>mediaType2===\"video\"},video2:{type:ControlType.File,title:\"Video 2\",allowedFileTypes:[\"mp4\",\"webm\",\"mov\"],hidden:({mediaType2})=>mediaType2===\"image\"},mediaType3:{type:ControlType.Enum,title:\"Media Type 3\",options:[\"image\",\"video\"],optionTitles:[\"Image\",\"Video\"],defaultValue:\"image\",displaySegmentedControl:true},logo3:{type:ControlType.ResponsiveImage,title:\"Image 3\",description:\"Third image in the rotation\",hidden:({mediaType3})=>mediaType3===\"video\"},video3:{type:ControlType.File,title:\"Video 3\",allowedFileTypes:[\"mp4\",\"webm\",\"mov\"],hidden:({mediaType3})=>mediaType3===\"image\"},mediaType4:{type:ControlType.Enum,title:\"Media Type 4\",options:[\"image\",\"video\"],optionTitles:[\"Image\",\"Video\"],defaultValue:\"image\",displaySegmentedControl:true},logo4:{type:ControlType.ResponsiveImage,title:\"Image 4\",description:\"Fourth image in the rotation\",hidden:({mediaType4})=>mediaType4===\"video\"},video4:{type:ControlType.File,title:\"Video 4\",allowedFileTypes:[\"mp4\",\"webm\",\"mov\"],hidden:({mediaType4})=>mediaType4===\"image\"},autoRotate:{type:ControlType.Boolean,title:\"Auto-Rotate\",description:\"Spin automatically. Drag still works when off.\",defaultValue:false,enabledTitle:\"On\",disabledTitle:\"Off\"},scrollRotate:{type:ControlType.Boolean,title:\"Scroll-Rotate\",description:\"Let page scrolling nudge the orbit.\",defaultValue:false,enabledTitle:\"On\",disabledTitle:\"Off\"},scrollSensitivity:{type:ControlType.Number,title:\"Scroll Amount\",description:\"Degrees of rotation per pixel scrolled. Higher = spins more per scroll.\",defaultValue:.15,min:.02,max:.6,step:.02,hidden:({scrollRotate})=>!scrollRotate},speed:{type:ControlType.Number,title:\"Rotation Speed\",description:\"Seconds for one full loop. Higher = slower.\",defaultValue:10,min:4,max:120,step:1,unit:\"s\",hidden:({autoRotate})=>!autoRotate},imageWidth:{type:ControlType.Number,title:\"Image Width\",description:\"Width of each image in pixels (at full/desktop size)\",defaultValue:300,min:50,max:600,step:10,unit:\"px\"},aspectRatio:{type:ControlType.Enum,title:\"Aspect Ratio\",description:\"Image aspect ratio (width:height)\",options:[1,1.33,1.5,1.78,.75,.67],optionTitles:[\"1:1 (Square)\",\"4:3\",\"3:2\",\"16:9\",\"3:4 (Portrait)\",\"2:3 (Portrait)\"],defaultValue:1},imageRadius:{type:ControlType.Number,title:\"Border Radius\",description:\"Corner radius of the images\",defaultValue:10,min:0,max:100,step:1,unit:\"px\"},mobileBreakpoint:{type:ControlType.Number,title:\"Mobile Below\",description:\"Container width under which the mobile sizing below kicks in.\",defaultValue:810,min:0,max:1200,step:10,unit:\"px\"},mobileImageFill:{type:ControlType.Number,title:\"Mobile Image Size\",description:\"Image width as a share of the container on mobile. Raise this to make the images bigger. 0 = use Image Width instead.\",defaultValue:.82,min:0,max:1,step:.02},mobileOrbitSpread:{type:ControlType.Number,title:\"Mobile Orbit Spread\",description:\"How wide the orbit spreads on mobile, as a share of the container. Lower = images stack closer behind each other.\",defaultValue:1,min:.3,max:1,step:.05,hidden:({mobileImageFill})=>!mobileImageFill}});\nexport const __FramerMetadata__ = {\"exports\":{\"default\":{\"type\":\"reactComponent\",\"name\":\"ImageRotator360\",\"slots\":[],\"annotations\":{\"framerSupportedLayoutHeight\":\"any-prefer-fixed\",\"framerContractVersion\":\"1\",\"framerSupportedLayoutWidth\":\"any-prefer-fixed\",\"framerIntrinsicWidth\":\"800\",\"framerIntrinsicHeight\":\"600\"}},\"__FramerMetadata__\":{\"type\":\"variable\"}}}\n//# sourceMappingURL=./LogoRotator.map"],"mappings":"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"}