{"version":3,"file":"FloatingLogos.Bi6b2eY1.mjs","names":["useRef","useState"],"sources":["https:/framerusercontent.com/modules/CIkjTYs7UpMGZoZn9sNb/BlNnLjYOqJVYAvyCLP5c/FloatingLogos.js"],"sourcesContent":["import{jsx as _jsx}from\"react/jsx-runtime\";import{addPropertyControls,ControlType}from\"framer\";import{useEffect,useRef,useState}from\"react\";// Positions: outer ring + inner cluster, normalized 0-1\n// Spaced far enough apart that cards never overlap at wobble amplitude\nconst POSITIONS=[{x:.5,y:.02},{x:.88,y:.15},{x:.97,y:.55},{x:.78,y:.9},{x:.35,y:.95},{x:.05,y:.7},{x:.05,y:.22},{x:.38,y:.35},{x:.65,y:.38},{x:.52,y:.67}];// ── Image downscaling (memory / mobile-crash fix) ─────────────────────\n// Logo image props are uploaded at full resolution (up to 2500×2500) but\n// rendered in small cards. iOS Safari decodes every image to a full bitmap\n// (w×h×4 bytes); many full-res logos can exceed iOS's per-tab memory limit\n// and crash the renderer. Routing each Framer-hosted image through the CDN\n// `scale-down-to` param drops a 23.8MB decode to ~1MB with no visible quality\n// loss at these sizes.\n//\n// TO REVERT: replace `sizedSrc(x)` with the raw value `x` (and delete helper).\nfunction sizedSrc(src,px=512){if(!src)return src;if(!src.includes(\"framerusercontent.com\"))return src;if(/\\.svg(\\?|$)/i.test(src))return src;if(src.includes(\"scale-down-to=\"))return src;return src+(src.includes(\"?\")?\"&\":\"?\")+\"scale-down-to=\"+px;}// Deterministic seed per logo\nfunction seeded(i,offset){const s=Math.sin((i+1)*9301+offset*4927)*49979;return s-Math.floor(s);}export default function FloatingLogos({logo1,logo2,logo3,logo4,logo5,logo6,logo7,logo8,logo9,logo10,cardSize=64,cardRadius=16,cardBg=\"rgb(255, 255, 255)\",borderColor=\"rgb(230, 230, 235)\",shadowOpacity=.08,speed=1}){const allLogos=[logo1,logo2,logo3,logo4,logo5,logo6,logo7,logo8,logo9,logo10];const logos=allLogos.some(Boolean)?allLogos:Array.from({length:10},()=>undefined);const count=logos.length;const containerRef=useRef(null);const rafRef=useRef();const startTime=useRef(performance.now());const[hovered,setHovered]=useState(null);const hoveredRef=useRef(null);// Keep ref in sync with state\nuseEffect(()=>{hoveredRef.current=hovered;},[hovered]);// Stable wobble params — small amplitude (max 6px) so cards never collide\nconst params=useRef(Array.from({length:10},(_,i)=>({ax:3+seeded(i,0)*3,ay:3+seeded(i,1)*3,sx:.15+seeded(i,2)*.2,sy:.15+seeded(i,3)*.2,px:seeded(i,4)*Math.PI*2,py:seeded(i,5)*Math.PI*2}))).current;// Current scale per card for smooth lerp\nconst scalesRef=useRef(new Float32Array(10).fill(1));// Animation: direct DOM writes, no React re-renders\nuseEffect(()=>{const el=containerRef.current;if(!el)return;// Collect card elements once\nconst cards=Array.from(el.children);const animate=()=>{const t=(performance.now()-startTime.current)/1e3*speed;const cw=el.offsetWidth;const ch=el.offsetHeight;const pad=cardSize/2+12;for(let i=0;i<count;i++){const card=cards[i];if(!card)continue;const pos=POSITIONS[i%POSITIONS.length];const baseX=pad+pos.x*(cw-pad*2);const baseY=pad+pos.y*(ch-pad*2);const p=params[i];const x=baseX+Math.sin(t*p.sx+p.px)*p.ax;const y=baseY+Math.cos(t*p.sy+p.py)*p.ay;// Smooth scale lerp\nconst targetScale=hoveredRef.current===i?1.12:1;const currentScale=scalesRef.current[i];const newScale=currentScale+(targetScale-currentScale)*.08;scalesRef.current[i]=newScale;card.style.transform=`translate(${x-cardSize/2}px, ${y-cardSize/2}px) scale(${newScale})`;card.style.zIndex=hoveredRef.current===i?\"10\":\"1\";}rafRef.current=requestAnimationFrame(animate);};rafRef.current=requestAnimationFrame(animate);return()=>{if(rafRef.current)cancelAnimationFrame(rafRef.current);};},[count,cardSize,speed,params]);return /*#__PURE__*/_jsx(\"div\",{ref:containerRef,style:{width:\"100%\",height:\"100%\",position:\"relative\",overflow:\"hidden\"},children:logos.map((src,i)=>/*#__PURE__*/_jsx(\"div\",{onMouseEnter:()=>setHovered(i),onMouseLeave:()=>setHovered(null),style:{position:\"absolute\",left:0,top:0,width:cardSize,height:cardSize,borderRadius:cardRadius,background:cardBg,border:`1px solid ${borderColor}`,boxShadow:`0 2px 12px rgba(0,0,0,${shadowOpacity}), 0 1px 3px rgba(0,0,0,0.04)`,display:\"flex\",alignItems:\"center\",justifyContent:\"center\",cursor:\"pointer\",willChange:\"transform\",overflow:\"hidden\"},children:src?/*#__PURE__*/_jsx(\"img\",{src:sizedSrc(src),alt:\"\",style:{width:\"65%\",height:\"65%\",objectFit:\"contain\",pointerEvents:\"none\"}}):/*#__PURE__*/_jsx(\"div\",{style:{width:\"50%\",height:\"50%\",borderRadius:cardRadius*.4,background:\"rgba(0,0,0,0.06)\"}})},i))});}addPropertyControls(FloatingLogos,{logo1:{type:ControlType.Image,title:\"Logo 1\"},logo2:{type:ControlType.Image,title:\"Logo 2\"},logo3:{type:ControlType.Image,title:\"Logo 3\"},logo4:{type:ControlType.Image,title:\"Logo 4\"},logo5:{type:ControlType.Image,title:\"Logo 5\"},logo6:{type:ControlType.Image,title:\"Logo 6\"},logo7:{type:ControlType.Image,title:\"Logo 7\"},logo8:{type:ControlType.Image,title:\"Logo 8\"},logo9:{type:ControlType.Image,title:\"Logo 9\"},logo10:{type:ControlType.Image,title:\"Logo 10\"},cardSize:{type:ControlType.Number,title:\"Card Size\",defaultValue:64,min:40,max:120,step:4},cardRadius:{type:ControlType.Number,title:\"Card Radius\",defaultValue:16,min:4,max:32,step:2},cardBg:{type:ControlType.Color,title:\"Card BG\",defaultValue:\"rgb(255, 255, 255)\"},borderColor:{type:ControlType.Color,title:\"Border Color\",defaultValue:\"rgb(230, 230, 235)\"},shadowOpacity:{type:ControlType.Number,title:\"Shadow Opacity\",defaultValue:.08,min:0,max:.3,step:.01},speed:{type:ControlType.Number,title:\"Speed\",defaultValue:1,min:.1,max:3,step:.1}});\nexport const __FramerMetadata__ = {\"exports\":{\"default\":{\"type\":\"reactComponent\",\"name\":\"FloatingLogos\",\"slots\":[],\"annotations\":{\"framerContractVersion\":\"1\"}},\"__FramerMetadata__\":{\"type\":\"variable\"}}}\n//# sourceMappingURL=./FloatingLogos.map"],"mappings":"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"}