{"version":3,"file":"SwarmingParticles.RITUJ4eC.mjs","names":["useRef","useCallback","useState","useMemo","useRef","useState"],"sources":["https:/framerusercontent.com/modules/lRDHiNWNVWmE0lqtoVHP/I6H5ZhUPA8PwvfVPIGXQ/Video.js","https:/framerusercontent.com/modules/IdkarnXRwkOSbT38lZXa/eMDY0gmY44ap666E4Su2/SwarmingParticles.js"],"sourcesContent":["// ⚠️⚠️⚠️⚠️⚠️\n// Edit these files in https://github.com/framer/FramerCodeComponents\n// ⚠️⚠️⚠️⚠️⚠️\nimport{jsx as _jsx}from\"react/jsx-runtime\";import{addPropertyControls,ControlType,useIsInCurrentNavigationTarget,RenderTarget}from\"framer\";import{isMotionValue,useInView}from\"framer-motion\";import{borderRadiusControl,defaultEvents,useIsBrowserSafari,useIsOnCanvas,useOnEnter,useOnExit,useRadius,useRenderTarget}from\"https://framerusercontent.com/modules/G4IfyjvwmaeSBpdb4TWu/OIjZRBmWDcIE2B6qgG1j/index.js\";// https://framer.com/m/framer/default-utils.js@^0.45.0\nimport{memo,useCallback,useEffect,useMemo,useRef,useState}from\"react\";var ObjectFitType;(function(ObjectFitType){ObjectFitType[\"Fill\"]=\"fill\";ObjectFitType[\"Contain\"]=\"contain\";ObjectFitType[\"Cover\"]=\"cover\";ObjectFitType[\"None\"]=\"none\";ObjectFitType[\"ScaleDown\"]=\"scale-down\";})(ObjectFitType||(ObjectFitType={}));var SrcType;(function(SrcType){SrcType[\"Video\"]=\"Upload\";SrcType[\"Url\"]=\"URL\";})(SrcType||(SrcType={}));const defaultVideo=\"https://framerusercontent.com/assets/MLWPbW1dUQawJLhhun3dBwpgJak.mp4\";// Reduce renders\nfunction getProps(props){const{width,height,topLeft,topRight,bottomRight,bottomLeft,id,children,...rest}=props;return rest;}/**\n * VIDEO\n *\n * @framerIntrinsicWidth 200\n * @framerIntrinsicHeight 112\n *\n * @framerSupportedLayoutWidth fixed\n * @framerSupportedLayoutHeight any-prefer-fixed\n *\n * @framerComponentPresetProps borderRadius, backgroundColor\n */export function Video(props){const newProps=getProps(props);return /*#__PURE__*/_jsx(VideoMemo,{...newProps});}function usePlaybackControls(videoRef){const isInCurrentNavigationTarget=useIsInCurrentNavigationTarget();const requestingPlay=useRef(false);const isPlayingRef=useRef(false);const setProgress=useCallback(rawProgress=>{if(!videoRef.current)return;const newProgress=(rawProgress===1?.999:rawProgress)*videoRef.current.duration;const isAlreadySet=Math.abs(videoRef.current.currentTime-newProgress)<.1;if(videoRef.current.duration>0&&!isAlreadySet){videoRef.current.currentTime=newProgress;}},[]);const play=useCallback(()=>{const video=videoRef.current;if(!video)return;video.preload=\"auto\"// makes sure browsers don't throttle: https://html.spec.whatwg.org/multipage/media.html#:~:text=When%20the%20media%20resource%20is%20playing%2C%20hints%20to%20the%20user%20agent%20that%20bandwidth%20is%20to%20be%20considered%20scarce%2C%20e.g.%20suggesting%20throttling%20the%20download%20so%20that%20the%20media%20data%20is%20obtained%20at%20the%20slowest%20possible%20rate%20that%20still%20maintains%20consistent%20playback.\n;const isPlaying=video.currentTime>0&&video.onplaying&&!video.paused&&!video.ended&&video.readyState>=video.HAVE_CURRENT_DATA;if(!isPlaying&&video&&!requestingPlay.current&&isInCurrentNavigationTarget){requestingPlay.current=true;isPlayingRef.current=true;video.play().catch(e=>{})// It's likely fine, swallow error\n.finally(()=>requestingPlay.current=false);}},[]);const pause=useCallback(()=>{if(!videoRef.current||requestingPlay.current)return;videoRef.current.pause();isPlayingRef.current=false;},[]);return{play,pause,setProgress,isPlaying:isPlayingRef};}function useAutoplayBehavior({playingProp,muted,loop,playsinline,controls}){const[initialPlayingProp]=useState(playingProp);const[hasPlayingPropChanged,setHasPlayingPropChanged]=useState(false);if(playingProp!==initialPlayingProp&&!hasPlayingPropChanged){setHasPlayingPropChanged(true);}const behavesAsGif=// passing `playing === true` on mount indicates that the video should\n// autoplay, like a GIF\ninitialPlayingProp&&muted&&loop&&playsinline&&!controls&&// Some users of the <Video> component use it by wrapping it with\n// another smart component and adding their own controls on top. (The\n// controls use transitions to control the video: e.g., when clicking\n// the play button, the smart component will transition to a state with\n// <Video playing={true} />.) In this case, we don't want the video to\n// behave as a gif, as it will be weird if the video suddenly started\n// acting as such (and auto-pausing when leaving the viewport) as soon\n// as the site visitor mutes it and clicks “Play”.\n!hasPlayingPropChanged;let autoplay;if(behavesAsGif)autoplay=\"on-viewport\";else if(initialPlayingProp)autoplay=\"on-mount\";else autoplay=\"no-autoplay\";return autoplay;}const VideoMemo=/*#__PURE__*/memo(function VideoInner(props){const{// default props\nsrcType=\"URL\",srcUrl,srcFile=\"\",posterEnabled=false,controls=false,playing=true,loop=true,muted=true,playsinline=true,restartOnEnter=false,objectFit=\"cover\",backgroundColor=\"rgba(0,0,0,0)\",radius=0,volume=25,startTime:startTimeProp=0,poster,playing:playingProp,progress,onSeeked,onPause,onPlay,onEnd,onClick,onMouseEnter,onMouseLeave,onMouseDown,onMouseUp}=props;const videoRef=useRef();const isSafari=useIsBrowserSafari();const wasPausedOnLeave=useRef(null);const wasEndedOnLeave=useRef(null);const isOnCanvas=useIsOnCanvas();const renderTarget=useRenderTarget();const isStaticRenderer=isOnCanvas||renderTarget===RenderTarget.export;const borderRadius=useRadius(props);// Hard-coding `autoplayBehavior` and `isInViewport` when on canvas as a\n// tiny perf optimization. isStaticRenderer won’t change through the lifecycle of\n// the component, so using these hooks conditionally should be safe\nconst autoplayBehavior=isStaticRenderer?\"no-autoplay\":useAutoplayBehavior({playingProp,muted,loop,playsinline,controls});const isInViewport=isStaticRenderer?true:useInView(videoRef);const isCloseToViewport=isStaticRenderer?false:useInView(videoRef,{margin:\"10%\",once:true});// Video elements behave oddly at 100% duration\nconst startTime=startTimeProp===100?99.9:startTimeProp;const{play,pause,setProgress,isPlaying}=usePlaybackControls(videoRef);// Pause/play via props\nuseEffect(()=>{if(isStaticRenderer)return;if(autoplayBehavior===\"on-viewport\")return;if(playingProp)play();else pause();},[autoplayBehavior,playingProp]);// Pause/play via viewport\nuseEffect(()=>{if(isStaticRenderer)return;// this also explicitly retries playing for videos that play on-mount, which could fail if they're not muted for example\nif(isInViewport&&playingProp&&autoplayBehavior!==\"no-autoplay\")play();if(autoplayBehavior!==\"on-viewport\")return;pause();},[autoplayBehavior,isInViewport,playingProp]);useEffect(()=>{if(!isOnCanvas||poster||posterEnabled||startTime||!videoRef.current)return;// forces a poster to show up when the video is in an iframe; this is needed when `poster` changes\nvideoRef.current.currentTime=.01;},[posterEnabled,poster,startTime]);/**\n     * The Video component has some effects that sync the video element with props\n     * like `startTime`, `progress`, etc. React calls these effects whenever these\n     * props change. However, it also calls them on the first mount, and this is\n     * troublesome – if we’re doing SSR, and the user changed the video state before\n     * the video was hydrated, the initial `useEffect` call will reset the video\n     * state. To avoid this, we use this flag.\n     */const isMountedAndReadyForProgressChanges=useRef(false);// Allow scrubbling via progress prop\n// 1) Handle cases when the progress prop itself changes\nuseEffect(()=>{if(!isMountedAndReadyForProgressChanges.current){isMountedAndReadyForProgressChanges.current=true;return;}const rawProgressValue=isMotionValue(progress)?progress.get():(progress??0)*.01;setProgress(// When the progress value exists (e.g. <Video startTime={10}\n// progress={50} />), we respect the `progress` value over\n// `startTime`, even if `startTime` changes. That’s because\n// `startTime` == start == changing it shouldn’t affect the current\n// progress\n(rawProgressValue??0)||// Then why fall back to `startTime` when `progress` doesn’t exist,\n// you might ask? Now, that’s for\n// - canvas UX: we want the video progress to change when the user\n//   is scrobbling the “Start Time” in component settings.\n// - backwards compatibility: maybe some users *are* scrobbling\n//   using `startTime` instead of `progress`? We don’t know, and it\n//   always supported it, so let’s not break it\n(startTime??0)/100);},[startTime,srcFile,srcUrl,progress]);// 2) Handle cases when the motion value inside the progress prop changes\nuseEffect(()=>{if(!isMotionValue(progress))return;return progress.on(\"change\",value=>setProgress(value));},[progress]);// (Prototyping) Checking if we need to play on navigation enter\nuseOnEnter(()=>{if(wasPausedOnLeave.current===null)return;if(videoRef.current){// if (restartOnEnter) setProgress(0)\nif(!wasEndedOnLeave&&loop||!wasPausedOnLeave.current)play();}});// (Prototyping) Pausing & saving playing state on navigation exit\nuseOnExit(()=>{if(videoRef.current){wasEndedOnLeave.current=videoRef.current.ended;wasPausedOnLeave.current=videoRef.current.paused;pause();}});const src=useMemo(()=>{let fragment=\"\";// if (\n//     startTime > 0 &&\n//     videoRef.current &&\n//     !isNaN(videoRef.current.duration) &&\n//     !isStaticRenderer\n// ) {\n//     console.log(startTime, videoRef.current.duration)\n//     fragment = `#t=${startTime * videoRef.current.duration}`\n// }\nif(srcType===\"URL\")return srcUrl+fragment;if(srcType===\"Upload\")return srcFile+fragment;},[srcType,srcFile,srcUrl,startTime]);// Autoplay via JS to work in Safari\nuseEffect(()=>{if(isSafari&&videoRef.current&&autoplayBehavior===\"on-mount\"){setTimeout(()=>play(),50);}},[]);// Volume Control\nuseEffect(()=>{if(videoRef.current&&!muted)videoRef.current.volume=(volume??0)/100;},[volume]);// When video is ready, set start-time, then autoplay if needed\nconst handleReady=()=>{const video=videoRef.current;if(!video)return;if(video.currentTime<.3&&startTime>0)setProgress((startTime??0)*.01);if(// when the component updates (e.g. only srcFile/url changes), and the video was already playing, keep playing\nisPlaying.current||autoplayBehavior===\"on-mount\"||playingProp&&autoplayBehavior===\"on-viewport\"&&isInViewport)play();};return /*#__PURE__*/_jsx(\"video\",{onClick,onMouseEnter,onMouseLeave,onMouseDown,onMouseUp,src:src,loop:loop,ref:videoRef,onSeeked:e=>onSeeked?.(e),onPause:e=>onPause?.(e),onPlay:e=>onPlay?.(e),onEnded:e=>onEnd?.(e),autoPlay:isPlaying.current||autoplayBehavior===\"on-mount\"||playingProp&&autoplayBehavior===\"on-viewport\"&&isInViewport,preload:isPlaying.current?\"auto\":isStaticRenderer&&!poster?\"metadata\":autoplayBehavior!==\"on-mount\"&&!isCloseToViewport?\"none\":// `autoplay` overrides this too\n\"metadata\",poster:posterEnabled&&!srcFile&&srcUrl===defaultVideo?\"https://framerusercontent.com/images/5ILRvlYXf72kHSVHqpa3snGzjU.jpg\":posterEnabled&&poster?poster:undefined,onLoadedData:handleReady,controls:controls,muted:isStaticRenderer?true:muted,playsInline:playsinline,style:{cursor:!!onClick?\"pointer\":\"auto\",width:\"100%\",height:\"100%\",borderRadius,display:\"block\",objectFit:objectFit,backgroundColor:backgroundColor,objectPosition:\"50% 50%\"}});});Video.displayName=\"Video\";function capitalizeFirstLetter(value){return value.charAt(0).toUpperCase()+value.slice(1);}export function titleCase(value){const groups=value.match(/[A-Z]{2,}|[A-Z][a-z]+|[a-z]+|[A-Z]|\\d+/gu)||[];return groups.map(capitalizeFirstLetter).join(\" \");}const objectFitOptions=[\"cover\",\"fill\",\"contain\",\"scale-down\",\"none\"];addPropertyControls(Video,{srcType:{type:ControlType.Enum,displaySegmentedControl:true,title:\"Source\",options:[\"URL\",\"Upload\"]},srcUrl:{type:ControlType.String,title:\"URL\",defaultValue:\"https://framerusercontent.com/assets/MLWPbW1dUQawJLhhun3dBwpgJak.mp4\",hidden(props){return props.srcType===\"Upload\";}},srcFile:{type:ControlType.File,title:\"File\",allowedFileTypes:[\"mp4\",\"webm\"],hidden(props){return props.srcType===\"URL\";}},...borderRadiusControl,loop:{type:ControlType.Boolean,title:\"Loop\",enabledTitle:\"Yes\",disabledTitle:\"No\"},posterEnabled:{type:ControlType.Boolean,title:\"Poster\",enabledTitle:\"Yes\",disabledTitle:\"No\",hiddenWhenUnset:true,defaultValue:true},poster:{type:ControlType.Image,title:\"Image\",hidden:({posterEnabled})=>!posterEnabled,description:\"We recommend adding a poster. [Learn more](https://www.framer.com/help/articles/how-are-videos-optimized-in-framer/).\"},controls:{type:ControlType.Boolean,title:\"Controls\",enabledTitle:\"Show\",disabledTitle:\"Hide\",defaultValue:false,hiddenWhenUnset:true},muted:{type:ControlType.Boolean,title:\"Muted\",enabledTitle:\"Yes\",disabledTitle:\"No\",hiddenWhenUnset:true},objectFit:{type:ControlType.Enum,title:\"Fit\",options:objectFitOptions,optionTitles:objectFitOptions.map(titleCase),hiddenWhenUnset:true},playing:{type:ControlType.Boolean,title:\"Playing\",enabledTitle:\"Yes\",disabledTitle:\"No\",hiddenWhenUnset:true},backgroundColor:{type:ControlType.Color,title:\"Background\",defaultValue:\"rgba(0,0,0,0)\"},startTime:{title:\"Start Time\",type:ControlType.Number,min:0,max:100,step:.1,unit:\"%\",hiddenWhenUnset:true},// restartOnEnter: {\n//     type: ControlType.Boolean,\n//     title: \"On ReEnter\",\n//     enabledTitle: \"Restart\",\n//     disabledTitle: \"Resume\",\n// },\nvolume:{type:ControlType.Number,max:100,min:0,unit:\"%\",hidden:({muted})=>muted,defaultValue:25,hiddenWhenUnset:true},onEnd:{type:ControlType.EventHandler},onSeeked:{type:ControlType.EventHandler},onPause:{type:ControlType.EventHandler},onPlay:{type:ControlType.EventHandler},...defaultEvents});\nexport const __FramerMetadata__ = {\"exports\":{\"VideoProps\":{\"type\":\"tsType\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"titleCase\":{\"type\":\"function\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"Video\":{\"type\":\"reactComponent\",\"name\":\"Video\",\"slots\":[],\"annotations\":{\"framerComponentPresetProps\":\"borderRadius, backgroundColor\",\"framerContractVersion\":\"1\",\"framerIntrinsicWidth\":\"200\",\"framerSupportedLayoutHeight\":\"any-prefer-fixed\",\"framerSupportedLayoutWidth\":\"fixed\",\"framerIntrinsicHeight\":\"112\"}},\"__FramerMetadata__\":{\"type\":\"variable\"}}}\n//# sourceMappingURL=./Video.map","/**\n * © 2026 Steven Berg — SMUDGELESS. All rights reserved.\n *\n * This source code and the \"Swarming Particles\" code component are the\n * intellectual property of Steven Berg. Distributed exclusively via the\n * Framer Marketplace under Framer's applicable marketplace license terms.\n * Redistribution, resale, sublicensing, or reuse of this source code outside\n * of an active, valid license is prohibited without prior written permission\n * from the author.\n *\n * Visit SMUDGELESS.io for more information.\n *\n * This notice is informational only and does not affect the execution of\n * the component below.\n */import{jsx as _jsx,jsxs as _jsxs}from\"react/jsx-runtime\";import{addPropertyControls,ControlType,useIsStaticRenderer}from\"framer\";import{startTransition,useEffect,useRef,useState}from\"react\";/**\n * Swarming Particles — interactive particle text (marketplace build)\n * The headline is drawn to a hidden canvas and its pixels are sampled\n * into particles (ResizeObserver re-samples on resize). On load the word assembles from scattered dots; the\n * cursor repels particles inside its radius and a spring pulls each one\n * home with damping. Particles far from home tint to the flying color,\n * settled ones rest in the base color. Auto-pauses offscreen and when\n * settled; renders the static word on the Framer canvas/export and for\n * reduced-motion visitors. Mouse AND touch both drive the repel field;\n * particle-count updates run inside startTransition so a density or\n * font change never blocks paint.\n *\n * @framerSupportedLayoutWidth any\n * @framerSupportedLayoutHeight any\n * @framerIntrinsicWidth 800\n * @framerIntrinsicHeight 420\n */export default function SwarmingParticles(props){const{text,font,restColor,flyColor,flyDistance,particleSize,fineDetail,density,repelRadius,repelForce,spring,damping,assemble,background,autoWhen,source,imageSrc,imageFit,imageRadius,imageColors,debug,touchBehavior,pathRatio,pathPhase,autoSpeed,autoAmplitude,maxParticles,showHint,hintText,link,newTab,style}=props;const hostRef=useRef(null);const canvasRef=useRef(null);const isStatic=useIsStaticRenderer();const dbgRef=useRef(null);const[,setCount]=useState(0);const[isTouch,setIsTouch]=useState(false);const[hintOn,setHintOn]=useState(true);// capability, not screen width — a small window on a laptop still has a cursor\nuseEffect(()=>{if(typeof window===\"undefined\")return;setIsTouch(window.matchMedia(\"(hover: none)\").matches);const t=setTimeout(()=>setHintOn(false),5e3);return()=>clearTimeout(t);},[]);useEffect(()=>{const host=hostRef.current;const canvas=canvasRef.current;if(!host||!canvas)return;const ctx=canvas.getContext(\"2d\");const reduced=typeof window!==\"undefined\"&&window.matchMedia(\"(prefers-reduced-motion: reduce)\").matches;const still=isStatic||reduced;const family=font?.fontFamily||\"Inter, sans-serif\";const weight=font?.fontWeight||600;const fstyle=font?.fontStyle||\"normal\";const explicitSize=parseFloat(font?.fontSize)||0;let parts=[],W=0,H=0,pSize=particleSize;let imgEl=null;// Framer's CDN sends CORS headers; without crossOrigin the canvas\n// taints and getImageData throws\nconst loadImage=()=>new Promise(res=>{if(source!==\"image\"||!imageSrc)return res(null);if(imgEl&&imgEl.src===imageSrc)return res(imgEl);const im=new Image;im.crossOrigin=\"anonymous\";im.onload=()=>{imgEl=im;res(im);};im.onerror=()=>res(null);im.src=imageSrc;});const roundRectPath=(c,x,y,w,h,r)=>{const rr=Math.max(0,Math.min(r,w/2,h/2));if(c.roundRect){c.beginPath();c.roundRect(x,y,w,h,rr);return;}c.beginPath();c.moveTo(x+rr,y);c.arcTo(x+w,y,x+w,y+h,rr);c.arcTo(x+w,y+h,x,y+h,rr);c.arcTo(x,y+h,x,y,rr);c.arcTo(x,y,x+w,y,rr);c.closePath();};// 1..8 keeps the original mapping (8 -> 3px); 9..12 goes sub-3px for the\n// ultra-fluid look, where the swarm reads as a continuous fluid sheet\nconst gapFor=dd=>dd<=8?Math.max(3,9-dd):Math.max(1,3-(dd-8)*.5);const build=()=>{const r=host.getBoundingClientRect();W=Math.max(2,Math.round(r.width));H=Math.max(2,Math.round(r.height));// Render at device resolution. The backing store used to be sized\n// in CSS px, so on a 2–3× phone the browser upscaled the whole\n// canvas with smoothing — that soft halo WAS the mobile blur.\n// CSS size stays 100% and the transform keeps every drawing\n// coordinate in CSS px, so no physics or positions change.\nconst dpr=Math.min(2,window.devicePixelRatio||1);canvas.width=Math.round(W*dpr);canvas.height=Math.round(H*dpr);ctx.setTransform(dpr,0,0,dpr,0,0);const size=explicitSize||Math.min(W*1.6/Math.max(1,text.length),H*.5);// Small type = fewer sample points per stroke = mush. Scale the\n// sampling gap (and the dot) with the rendered size so a stem\n// keeps roughly the same particle count at every breakpoint.\nconst detailK=fineDetail&&source!==\"image\"?Math.max(.35,Math.min(1,size/96)):1;pSize=particleSize*(detailK<1?Math.max(.5,detailK):1);const off=document.createElement(\"canvas\");off.width=W;off.height=H;const oc=off.getContext(\"2d\",{willReadFrequently:true});if(source===\"image\"){if(!imgEl)return;// still loading — loadImage re-runs build\nconst iw=imgEl.naturalWidth,ih=imgEl.naturalHeight;const k=imageFit===\"cover\"?Math.max(W/iw,H/ih):Math.min(W/iw,H/ih);const dw=iw*k,dh=ih*k;const dx=(W-dw)/2,dy=(H-dh)/2;oc.save();roundRectPath(oc,dx,dy,dw,dh,imageRadius);oc.clip();oc.drawImage(imgEl,dx,dy,dw,dh);oc.restore();}else{oc.font=fstyle+\" \"+weight+\" \"+size+\"px \"+family;oc.textAlign=\"center\";oc.textBaseline=\"middle\";oc.fillStyle=\"#fff\";oc.fillText(text,W/2,H/2);}let img;try{img=oc.getImageData(0,0,W,H).data;}catch(e){return;// cross-origin image without CORS headers\n}// sample at a given spacing; widen it until we're under the frame\n// budget, so spacing stays EVEN (random culling looks blotchy)\nconst sample=g=>{const out=[];for(let fy=0;fy<H;fy+=g)for(let fx=0;fx<W;fx+=g){const x=fx|0,y=fy|0;const o=(y*W+x)*4;if(img[o+3]>128)out.push(x,y,o);}return out;};let g=Math.max(.75,gapFor(density)*detailK);let flat=sample(g);while(flat.length/3>maxParticles&&g<14){g*=1.3;flat=sample(g);}const perPixel=source===\"image\"&&imageColors;parts=[];for(let i=0;i<flat.length;i+=3){const x=flat[i],y=flat[i+1],o=flat[i+2];parts.push({hx:x,hy:y,x:still||!assemble?x:Math.random()*W,y:still||!assemble?y:Math.random()*H,vx:0,vy:0,c:perPixel?\"rgb(\"+img[o]+\",\"+img[o+1]+\",\"+img[o+2]+\")\":null});}// particle count is non-urgent state — never block paint\nstartTransition(()=>setCount(parts.length));if(still){drawFrame();return;}wake();};const drawFrame=()=>{ctx.clearRect(0,0,W,H);let moving=false;for(const p of parts){const away=Math.hypot(p.x-p.hx,p.y-p.hy);if(away>.4||Math.abs(p.vx)>.05||Math.abs(p.vy)>.05)moving=true;ctx.fillStyle=away>flyDistance?flyColor:p.c||restColor;ctx.beginPath();ctx.arc(p.x,p.y,pSize,0,7);ctx.fill();}return moving;};let mx=-99999,my=-99999;let raf=null,running=false,visible=true;// ---- touch driver: Lissajous x=sin(nx·t+kπ/8), y=sin(ny·t) ----\nconst RATIOS={\"1:1\":[1,1],\"2:1\":[2,1],\"3:1\":[3,1],\"3:2\":[3,2],\"4:3\":[4,3],\"5:3\":[5,3],\"5:4\":[5,4]};const[nx,ny]=RATIOS[pathRatio]||RATIOS[\"3:2\"];const phi=pathPhase*Math.PI/8;const lissajous=t=>[W/2+W/2*autoAmplitude*Math.sin(nx*t+phi),H/2+H/2*autoAmplitude*Math.sin(ny*t)];// Detection must be broad: iOS/Android report `hover: none`, but some\n// Android browsers and in-app webviews only report `pointer: coarse`,\n// and Framer's own mobile preview on a laptop reports NEITHER (it is\n// still a cursor device) — which is why \"touch only\" can look dead.\nconst coarse=typeof window!==\"undefined\"&&(window.matchMedia(\"(hover: none)\").matches||window.matchMedia(\"(pointer: coarse)\").matches||(navigator.maxTouchPoints||0)>0);const touchOnly=autoWhen===\"always\"?true:autoWhen===\"off\"?false:coarse;let lastTouch=-Infinity;let dbgFrame=0;const hn=typeof window!==\"undefined\"&&window.matchMedia(\"(hover: none)\").matches?\"Y\":\"N\";const pc=typeof window!==\"undefined\"&&window.matchMedia(\"(pointer: coarse)\").matches?\"Y\":\"N\";const tp=typeof navigator!==\"undefined\"?navigator.maxTouchPoints||0:0;// a real finger takes over; autopilot resumes 1.5s after it lifts.\n// autoPossible is the *mode* test; autoOn adds the cooldown — the loop\n// must stay alive during that cooldown or autopilot never comes back.\nconst autoPossible=touchOnly&&!still&&(touchBehavior===\"autopilot\"||touchBehavior===\"scroll\");const autoOn=()=>autoPossible&&performance.now()-lastTouch>1500;const tick=()=>{if(!visible){running=false;return;}if(autoOn()){let t;if(touchBehavior===\"scroll\"){const r=host.getBoundingClientRect();const vh=window.innerHeight||1;const p=1-(r.top+r.height/2)/vh;t=Math.max(0,Math.min(1,p))*Math.PI*2;}else{t=performance.now()/1e3*(Math.PI*2/Math.max(.5,autoSpeed));}const pt=lissajous(t);mx=pt[0];my=pt[1];}if(dbgRef.current){dbgFrame++;if(dbgFrame%12===0)dbgRef.current.textContent=\"hover:none \"+hn+\" \\xb7 pointer:coarse \"+pc+\" \\xb7 touchPts \"+tp+\" \\xb7 reduced \"+(reduced?\"Y\":\"N\")+\" \\xb7 mode \"+touchBehavior+\"/\"+autoWhen+\" \\xb7 AUTO \"+(autoOn()?\"ON\":autoPossible?\"cooldown\":\"OFF\")+\" \\xb7 \"+Math.round(mx)+\",\"+Math.round(my)+\" \\xb7 \"+parts.length+\"p\";}const S=spring*.01;const D=damping*.01;for(const p of parts){let ax=(p.hx-p.x)*S;let ay=(p.hy-p.y)*S;const dx=p.x-mx,dy=p.y-my;const dist=Math.hypot(dx,dy);if(dist<repelRadius&&dist>.01){const f=(1-dist/repelRadius)*repelForce;ax+=dx/dist*f;ay+=dy/dist*f;}p.vx=(p.vx+ax)*D;p.vy=(p.vy+ay)*D;p.x+=p.vx;p.y+=p.vy;}const moving=drawFrame();const hovering=mx>-9999;// autoPossible (not autoOn): during the post-touch cooldown the\n// frame can be settled and unhovered, and exiting here used to\n// kill the loop for good — autopilot never resumed\nif(!moving&&!hovering&&!autoPossible&&!debug){running=false;return;}raf=requestAnimationFrame(tick);};const wake=()=>{if(!running&&visible&&!still){running=true;raf=requestAnimationFrame(tick);}};const onMove=e=>{const r=host.getBoundingClientRect();lastTouch=performance.now();mx=e.clientX-r.left;my=e.clientY-r.top;wake();};const onLeave=()=>{mx=-99999;my=-99999;};const onCancel=()=>{lastTouch=performance.now();wake();};// wait for the chosen webfont (or the image) before sampling pixels\nif(source===\"image\"){loadImage().then(build);}else{const fontSpec=fstyle+\" \"+weight+\" 32px \"+family;if(document.fonts?.load){document.fonts.load(fontSpec,text).then(build).catch(build);}else build();}const ro=new ResizeObserver(build);ro.observe(host);const io=new IntersectionObserver(es=>{es.forEach(e=>{visible=e.isIntersecting;if(visible)wake();});},{threshold:.05});io.observe(host);if(!still){host.addEventListener(\"pointermove\",onMove);host.addEventListener(\"pointerleave\",onLeave);host.addEventListener(\"pointercancel\",onCancel);}return()=>{if(raf!=null)cancelAnimationFrame(raf);ro.disconnect();io.disconnect();host.removeEventListener(\"pointermove\",onMove);host.removeEventListener(\"pointerleave\",onLeave);host.removeEventListener(\"pointercancel\",onCancel);};},[text,font?.fontFamily,font?.fontWeight,font?.fontStyle,font?.fontSize,restColor,flyColor,flyDistance,particleSize,fineDetail,density,repelRadius,repelForce,spring,damping,assemble,isStatic,touchBehavior,pathRatio,pathPhase,autoSpeed,autoAmplitude,maxParticles,source,imageSrc,imageFit,imageRadius,imageColors,autoWhen,debug]);const openLink=link?()=>window.open(link,newTab?\"_blank\":\"_self\",newTab?\"noopener,noreferrer\":undefined):undefined;return /*#__PURE__*/_jsxs(\"div\",{ref:hostRef,onClick:openLink,onPointerDown:()=>setHintOn(false),style:{width:\"100%\",height:\"100%\",position:\"relative\",overflow:\"hidden\",cursor:link?\"pointer\":undefined,background,touchAction:\"none\",...style},children:[/*#__PURE__*/_jsx(\"canvas\",{ref:canvasRef,style:{position:\"absolute\",inset:0,width:\"100%\",height:\"100%\",display:\"block\"}}),isTouch&&showHint&&hintOn&&hintText?/*#__PURE__*/_jsx(\"div\",{style:{position:\"absolute\",left:\"50%\",bottom:14,transform:\"translateX(-50%)\",padding:\"7px 14px\",borderRadius:999,background:\"rgba(0,0,0,0.45)\",backdropFilter:\"blur(6px)\",color:\"#fff\",fontSize:12,fontWeight:600,letterSpacing:\"0.04em\",whiteSpace:\"nowrap\",pointerEvents:\"none\"},children:hintText}):null,debug?/*#__PURE__*/_jsx(\"div\",{ref:dbgRef,style:{position:\"absolute\",left:6,top:6,right:6,padding:\"6px 8px\",borderRadius:6,background:\"rgba(0,0,0,0.72)\",color:\"#6EF08A\",font:\"600 10px/1.45 ui-monospace, Menlo, monospace\",pointerEvents:\"none\",zIndex:2},children:\"waiting for first frame…\"}):null]});}SwarmingParticles.defaultProps={newTab:true,text:\"SMUDGELESS\",restColor:\"#F4F0E9\",flyColor:\"#D9532B\",flyDistance:6,particleSize:1.5,fineDetail:true,density:8,repelRadius:45,repelForce:9,spring:2,damping:70,assemble:true,background:\"#17130E\",autoWhen:\"touch\",debug:false,source:\"text\",imageFit:\"contain\",imageRadius:0,imageColors:true,touchBehavior:\"autopilot\",pathRatio:\"3:2\",pathPhase:2,autoSpeed:9,autoAmplitude:.55,maxParticles:26e3,showHint:false,hintText:\"Drag to disturb\"};addPropertyControls(SwarmingParticles,{source:{type:ControlType.Enum,title:\"Particles from\",section:\"Content\",options:[\"text\",\"image\"],optionTitles:[\"Text\",\"Image\"],displaySegmentedControl:true,description:\"Image mode samples an image's pixels instead of a letterform — logos, portraits, marks\"},text:{type:ControlType.String,title:\"Text\",section:\"Content\",hidden:p=>p.source===\"image\",description:\"The headline rendered as particles. Keep it short — every glyph multiplies the particle count.\"},font:{type:ControlType.Font,title:\"Font\",section:\"Content\",controls:\"extended\",defaultFontType:\"sans-serif\",defaultValue:{fontSize:96,fontWeight:600},description:\"Leave size empty to auto-fit the frame\",hidden:p=>p.source===\"image\"},imageSrc:{type:ControlType.Image,title:\"Source image\",section:\"Content\",hidden:p=>p.source!==\"image\",description:\"Artwork sampled into particles. High-contrast shapes on a plain background read best — fine detail disappears at particle scale.\"},imageFit:{type:ControlType.Enum,title:\"Image fit\",section:\"Content\",options:[\"contain\",\"cover\"],optionTitles:[\"Contain\",\"Cover\"],displaySegmentedControl:true,hidden:p=>p.source!==\"image\",description:\"Contain shows the whole image; Cover fills the frame and crops the overflow.\"},imageRadius:{type:ControlType.Number,title:\"Image corner radius\",section:\"Content\",min:0,max:400,step:1,unit:\"px\",description:\"Rounds the sampled area — set high for a circular crop\",hidden:p=>p.source!==\"image\"},imageColors:{type:ControlType.Boolean,title:\"Use image colors\",section:\"Content\",enabledTitle:\"Sampled\",disabledTitle:\"Resting\",description:\"Sampled: every particle carries its own pixel color. Resting: the whole image renders in Resting color\",hidden:p=>p.source!==\"image\"},restColor:{type:ControlType.Color,title:\"Resting color\",section:\"Particles\",description:\"Particles settled in the letterform\"},flyColor:{type:ControlType.Color,title:\"Flying color\",section:\"Particles\",description:\"Particles knocked away from home\"},flyDistance:{type:ControlType.Number,title:\"Fly threshold\",section:\"Particles\",min:1,max:40,step:1,unit:\"px\",description:\"Distance from home before a particle counts as flying\"},density:{type:ControlType.Number,title:\"Particle density\",section:\"Particles\",min:1,max:12,step:1,description:\"1–8 is the standard range (8 = 3px spacing). 9–12 goes sub-3px for a near-fluid sheet — pair with a smaller particle size (0.6–1) and watch the Max particles budget.\"},particleSize:{type:ControlType.Number,title:\"Particle size\",section:\"Particles\",min:.5,max:5,step:.1,unit:\"px\",description:\"Diameter of each dot. Larger dots need lower density or the letterforms fill in solid.\"},fineDetail:{type:ControlType.Boolean,title:\"Fine detail\",section:\"Particles\",description:\"Tightens the sampling gap (and the dot) as the type gets smaller, so strokes keep the same particle count on tablet and phone. Leave on unless you want visibly chunkier dots at small sizes.\",hidden:p=>p.source===\"image\"},maxParticles:{type:ControlType.Number,title:\"Max particles\",section:\"Particles\",min:4e3,max:9e4,step:1e3,description:\"Frame budget. If density would exceed it, spacing widens evenly rather than culling at random\"},repelRadius:{type:ControlType.Number,title:\"Repel radius\",section:\"Physics\",min:20,max:300,step:5,unit:\"px\",description:\"How close the cursor must be before particles scatter.\"},repelForce:{type:ControlType.Number,title:\"Repel force\",section:\"Physics\",min:1,max:30,step:.5,description:\"How hard they are pushed away. High settings throw them well past the radius.\"},spring:{type:ControlType.Number,title:\"Spring strength\",section:\"Physics\",min:.2,max:10,step:.1,description:\"Pull back toward the letterform\"},damping:{type:ControlType.Number,title:\"Damping\",section:\"Physics\",unit:\"%\",min:70,max:99,step:1,description:\"Higher glides longer; lower settles faster\"},assemble:{type:ControlType.Boolean,title:\"Assemble on load\",section:\"Physics\",description:\"Particles fly in from scatter to form the word\"},background:{type:ControlType.Color,title:\"Background color\",section:\"Frame\",description:\"Frame fill behind the particles. Leave it transparent to sit on your own section.\"},link:{type:ControlType.Link,title:\"Link\",section:\"Link\",description:\"Clicking opens this URL\"},newTab:{type:ControlType.Boolean,title:\"Open in new tab\",section:\"Link\",hidden:p=>!p.link,description:\"Opens the link in a new browser tab.\"},touchBehavior:{type:ControlType.Enum,title:\"On touch\",section:\"Touch\",options:[\"autopilot\",\"scroll\",\"gesture\",\"static\"],optionTitles:[\"Autopilot\",\"Scroll\",\"Gesture only\",\"Static\"],description:\"Touch devices have no hover. Autopilot walks an invisible attractor along a Lissajous path; Scroll ties that path to scroll progress; Gesture only waits for a finger drag; Static leaves the word at rest. Desktop is unaffected.\"},autoWhen:{type:ControlType.Enum,title:\"Autopilot on\",section:\"Touch\",options:[\"touch\",\"always\",\"off\"],optionTitles:[\"Touch only\",\"Always\",\"Off\"],description:\"Touch only auto-detects (hover:none / pointer:coarse / touch points). Always runs it on every device — use this if a device isn't detected, or to preview it on desktop. A real cursor or finger always takes over.\",hidden:p=>p.touchBehavior!==\"autopilot\"&&p.touchBehavior!==\"scroll\"},pathRatio:{type:ControlType.Enum,title:\"Path shape\",section:\"Touch\",options:[\"1:1\",\"2:1\",\"3:1\",\"3:2\",\"4:3\",\"5:3\",\"5:4\"],optionTitles:[\"Circle (1:1)\",\"Figure eight (2:1)\",\"Trefoil (3:1)\",\"Pretzel (3:2)\",\"Looped (4:3)\",\"Woven (5:3)\",\"Dense weave (5:4)\"],description:\"nx:ny — higher ratios weave a denser path across the frame\",hidden:p=>p.touchBehavior!==\"autopilot\"&&p.touchBehavior!==\"scroll\"},pathPhase:{type:ControlType.Number,title:\"Path phase\",section:\"Touch\",min:0,max:7,step:1,description:\"k in kπ/8 — rotates and re-weaves the same ratio\",hidden:p=>p.touchBehavior!==\"autopilot\"&&p.touchBehavior!==\"scroll\"},autoSpeed:{type:ControlType.Number,title:\"Path cycle\",section:\"Touch\",min:2,max:40,step:.5,unit:\"s\",hidden:p=>p.touchBehavior!==\"autopilot\",description:\"Seconds for the driver to complete one full circuit of the figure.\"},autoAmplitude:{type:ControlType.Number,title:\"Path spread\",section:\"Touch\",min:.1,max:1,step:.05,description:\"Fraction of the frame the path sweeps\",hidden:p=>p.touchBehavior!==\"autopilot\"&&p.touchBehavior!==\"scroll\"},showHint:{type:ControlType.Boolean,title:\"Show touch hint\",section:\"Touch\",description:\"Small pill shown on touch devices, fades after 5s\"},hintText:{type:ControlType.String,title:\"Hint text\",section:\"Touch\",hidden:p=>!p.showHint,description:\"Wording of the one-time prompt shown on touch devices.\"},debug:{type:ControlType.Boolean,title:\"Debug overlay\",section:\"Touch\",description:\"Overlays what the component detects (hover, pointer type, touch points, reduced-motion, autopilot state and attractor position). Turn off before publishing.\"}});\nexport const __FramerMetadata__ = {\"exports\":{\"default\":{\"type\":\"reactComponent\",\"name\":\"SwarmingParticles\",\"slots\":[],\"annotations\":{\"framerSupportedLayoutWidth\":\"any\",\"framerSupportedLayoutHeight\":\"any\",\"framerIntrinsicWidth\":\"800\",\"framerIntrinsicHeight\":\"420\",\"framerContractVersion\":\"1\"}},\"__FramerMetadata__\":{\"type\":\"variable\"}}}\n//# sourceMappingURL=./SwarmingParticles.map"],"mappings":"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"}