{"version":3,"file":"NumberCounter.DWoWs3qn.mjs","names":["useState","useRef","useMemo"],"sources":["https:/framerusercontent.com/modules/pADKJhbBmTuZ98Q12uQp/M1C3JWYPNbWFyD73soec/NumberCounter.js"],"sourcesContent":["// Number Counter component that animates from start to end value with customizable options\nimport{jsx as _jsx}from\"react/jsx-runtime\";import{useState,useEffect,useRef,useMemo,startTransition}from\"react\";import{addPropertyControls,ControlType,useIsStaticRenderer}from\"framer\";import{useInView}from\"framer-motion\";const easingMap={linear:[0,0,1,1],easeIn:[.4,0,1,1],easeOut:[0,0,.2,1],easeInOut:[.4,0,.2,1],bounce:[.68,-.55,.265,1.55]};/**\n * @framerSupportedLayoutWidth auto\n * @framerSupportedLayoutHeight auto\n */export default function Counter(props){const{startValue=0,endValue=100,duration=2,delay=0,decimals=0,easing=\"easeOut\",font,textAlign=\"left\",color=\"#000000\",autoStart=true,loop=false,resetOnReEntry=false,prefix=\"\",suffix=\"\",separator=\",\"}=props;const[currentValue,setCurrentValue]=useState(startValue);const[hasStarted,setHasStarted]=useState(false);const animationRef=useRef();const startTimeRef=useRef();const containerRef=useRef(null);const isStatic=useIsStaticRenderer();const isInView=useInView(containerRef,{once:!resetOnReEntry,margin:\"0px 0px -10% 0px\"});const formatNumber=useMemo(()=>{return value=>{const fixed=value.toFixed(decimals);if(separator&&Math.abs(value)>=1e3){const parts=fixed.split(\".\");parts[0]=parts[0].replace(/\\B(?=(\\d{3})+(?!\\d))/g,separator);return parts.join(\".\");}return fixed;};},[decimals,separator]);const easeValue=useMemo(()=>{return t=>{const[x1,y1,x2,y2]=easingMap[easing];if(easing===\"linear\")return t;if(easing===\"bounce\"){if(t<1/2.75){return 7.5625*t*t;}else if(t<2/2.75){return 7.5625*(t-=1.5/2.75)*t+.75;}else if(t<2.5/2.75){return 7.5625*(t-=2.25/2.75)*t+.9375;}else{return 7.5625*(t-=2.625/2.75)*t+.984375;}}// Cubic bezier approximation\nreturn 3*(1-t)*(1-t)*t*y1+3*(1-t)*t*t*y2+t*t*t;};},[easing]);const animate=useMemo(()=>{return timestamp=>{if(!startTimeRef.current){startTimeRef.current=timestamp+delay*1e3;}const elapsed=timestamp-startTimeRef.current;const progress=Math.min(elapsed/(duration*1e3),1);if(progress>=0){const easedProgress=easeValue(progress);const newValue=startValue+(endValue-startValue)*easedProgress;startTransition(()=>{setCurrentValue(newValue);});if(progress<1){animationRef.current=requestAnimationFrame(animate);}else if(loop){// Reset for loop\nstartTimeRef.current=undefined;startTransition(()=>{setCurrentValue(startValue);});setTimeout(()=>{animationRef.current=requestAnimationFrame(animate);},100);}}else{animationRef.current=requestAnimationFrame(animate);}};},[startValue,endValue,duration,delay,easing,loop,easeValue]);const startAnimation=useMemo(()=>{return()=>{if(animationRef.current){cancelAnimationFrame(animationRef.current);}startTimeRef.current=undefined;startTransition(()=>{setCurrentValue(startValue);setHasStarted(true);});animationRef.current=requestAnimationFrame(animate);};},[animate,startValue]);// Handle auto-start and in-view animation\nuseEffect(()=>{if(isStatic){setCurrentValue(endValue);return;}if(autoStart&&isInView&&(!hasStarted||resetOnReEntry)){startAnimation();}else if(!autoStart&&isInView&&(!hasStarted||resetOnReEntry)){startAnimation();}return()=>{if(animationRef.current){cancelAnimationFrame(animationRef.current);}};},[autoStart,isInView,hasStarted,resetOnReEntry,startAnimation,isStatic,endValue]);// Reset when not in view and resetOnReEntry is true\nuseEffect(()=>{if(!isInView&&resetOnReEntry&&hasStarted){if(animationRef.current){cancelAnimationFrame(animationRef.current);}startTransition(()=>{setCurrentValue(startValue);setHasStarted(false);});startTimeRef.current=undefined;}},[isInView,resetOnReEntry,hasStarted,startValue]);const displayValue=formatNumber(currentValue);const fullText=`${prefix}${displayValue}${suffix}`;return /*#__PURE__*/_jsx(\"div\",{ref:containerRef,style:{position:\"relative\",width:\"max-content\",minWidth:\"max-content\",...props.style},children:/*#__PURE__*/_jsx(\"span\",{style:{display:\"block\",textAlign,color,width:\"max-content\",...font},children:fullText})});}addPropertyControls(Counter,{startValue:{type:ControlType.Number,title:\"Start Value\",defaultValue:0,step:1},endValue:{type:ControlType.Number,title:\"End Value\",defaultValue:149,step:1},duration:{type:ControlType.Number,title:\"Duration\",defaultValue:2,min:.1,max:10,step:.1,unit:\"s\"},delay:{type:ControlType.Number,title:\"Delay\",defaultValue:0,min:0,max:5,step:.1,unit:\"s\"},decimals:{type:ControlType.Number,title:\"Decimals\",defaultValue:0,min:0,max:4,step:1,displayStepper:true},easing:{type:ControlType.Enum,title:\"Easing\",options:[\"linear\",\"easeIn\",\"easeOut\",\"easeInOut\",\"bounce\"],optionTitles:[\"Linear\",\"Ease In\",\"Ease Out\",\"Ease In Out\",\"Bounce\"],defaultValue:\"easeOut\"},font:{type:ControlType.Font,title:\"Font\",defaultValue:{fontSize:\"32px\",variant:\"Bold\",letterSpacing:\"-0.03em\",lineHeight:\"1em\"},controls:\"extended\",defaultFontType:\"sans-serif\"},textAlign:{type:ControlType.Enum,title:\"Text Align\",options:[\"left\",\"center\",\"right\"],optionTitles:[\"Left\",\"Center\",\"Right\"],defaultValue:\"left\",displaySegmentedControl:true},color:{type:ControlType.Color,title:\"Color\",defaultValue:\"#000000\"},autoStart:{type:ControlType.Boolean,title:\"Auto Start\",defaultValue:true,enabledTitle:\"On\",disabledTitle:\"Off\"},loop:{type:ControlType.Boolean,title:\"Loop\",defaultValue:false,enabledTitle:\"On\",disabledTitle:\"Off\"},resetOnReEntry:{type:ControlType.Boolean,title:\"Reset on Re-entry\",defaultValue:false,enabledTitle:\"On\",disabledTitle:\"Off\"},prefix:{type:ControlType.String,title:\"Prefix\",defaultValue:\"\",placeholder:\"$\"},suffix:{type:ControlType.String,title:\"Suffix\",defaultValue:\"%\",placeholder:\"%\"},separator:{type:ControlType.String,title:\"Thousands Separator\",defaultValue:\",\",placeholder:\",\"}});\nexport const __FramerMetadata__ = {\"exports\":{\"default\":{\"type\":\"reactComponent\",\"name\":\"Counter\",\"slots\":[],\"annotations\":{\"framerSupportedLayoutHeight\":\"auto\",\"framerSupportedLayoutWidth\":\"auto\",\"framerContractVersion\":\"1\"}},\"__FramerMetadata__\":{\"type\":\"variable\"}}}\n//# sourceMappingURL=./NumberCounter.map"],"mappings":"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"}