{"version":3,"file":"NumberCounter.CglLP_2e.mjs","names":["useRef","useState","useCallback","useMemo"],"sources":["https:/framerusercontent.com/modules/6KrK0peXdVxD0gCMmMEt/gWGH4Ysa6XFl1H7iWBjY/NumberCounter.js"],"sourcesContent":["// Number Counter component with animated counting, customizable duration, delay, decimals, easing, font, alignment, color, suffix, auto-start, looping, reset on re-entry, and content-based sizing\nimport{jsxs as _jsxs}from\"react/jsx-runtime\";import{useEffect,useRef,useState,useCallback,useMemo}from\"react\";import{addPropertyControls,ControlType,useInView,useIsStaticRenderer,RenderTarget}from\"framer\";const easings={linear:t=>t,easeIn:t=>t*t,easeOut:t=>t*(2-t),easeInOut:t=>t<.5?2*t*t:-1+(4-2*t)*t};function formatNumber(value,decimals){return value.toLocaleString(undefined,{minimumFractionDigits:decimals,maximumFractionDigits:decimals});}/**\n * Number Counter\n *\n * @framerIntrinsicWidth 180\n * @framerIntrinsicHeight 60\n *\n * @framerSupportedLayoutWidth auto\n * @framerSupportedLayoutHeight auto\n */export default function NumberCounter(props){const{start=0,end=100,duration=1.5,delay=0,decimals=0,easing=\"easeOut\",font,color,align,autoStart,loop,resetOnReentry,suffix,style}=props;const isStatic=useIsStaticRenderer();const ref=useRef(null);const inView=useInView(ref,{once:!loop&&!resetOnReentry});const[displayValue,setDisplayValue]=useState(start);const[isCounting,setIsCounting]=useState(false);const[iteration,setIteration]=useState(0);const timeoutRef=useRef(null);const rafRef=useRef(null);const runCount=useCallback(()=>{if(isStatic||RenderTarget.current()===RenderTarget.thumbnail){setDisplayValue(end);return;}let startTime=null;let frameId=null;function animate(ts){if(!startTime)startTime=ts;const elapsed=(ts-startTime)/1e3;let t=Math.min(1,Math.max(0,elapsed/duration));const ease=easings[easing]||easings.easeOut;const value=start+(end-start)*ease(t);setDisplayValue(t<1?value:end);if(t<1){frameId=requestAnimationFrame(animate);rafRef.current=frameId;}else if(loop){timeoutRef.current=setTimeout(()=>{setDisplayValue(start);setIteration(i=>i+1);},300);}}if(delay>0){timeoutRef.current=setTimeout(()=>{setDisplayValue(start);frameId=requestAnimationFrame(animate);rafRef.current=frameId;},delay*1e3);}else{setDisplayValue(start);frameId=requestAnimationFrame(animate);rafRef.current=frameId;}},[start,end,duration,delay,easing,loop,isStatic]);// Start animation on inView\nuseEffect(()=>{if(!autoStart)return;if(inView){setIsCounting(true);}else if(resetOnReentry){setIsCounting(false);setDisplayValue(start);}},[inView,autoStart,resetOnReentry,start]);// Run animation when isCounting or iteration changes\nuseEffect(()=>{if(!isCounting)return;runCount();return()=>{if(rafRef.current)cancelAnimationFrame(rafRef.current);if(timeoutRef.current)clearTimeout(timeoutRef.current);};},[isCounting,iteration,runCount]);// Manual trigger\nconst handleClick=()=>{if(!autoStart){setIsCounting(true);}};// Sizing\nconst containerStyle=useMemo(()=>({...style,display:\"inline-block\",width:style&&style.width===\"100%\"?\"100%\":\"max-content\",height:style&&style.height===\"100%\"?\"100%\":\"max-content\",textAlign:align,color,...font,cursor:autoStart?\"default\":\"pointer\",userSelect:\"none\"}),[style,align,color,font,autoStart]);return /*#__PURE__*/_jsxs(\"span\",{ref:ref,style:containerStyle,\"aria-live\":\"polite\",tabIndex:0,onClick:handleClick,children:[formatNumber(displayValue,decimals),suffix]});}addPropertyControls(NumberCounter,{start:{type:ControlType.Number,title:\"Start\",defaultValue:0},end:{type:ControlType.Number,title:\"End\",defaultValue:100},duration:{type:ControlType.Number,title:\"Duration\",defaultValue:1.5,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:6,step:1,displayStepper:true},easing:{type:ControlType.Enum,title:\"Easing\",options:[\"linear\",\"easeIn\",\"easeOut\",\"easeInOut\"],optionTitles:[\"Linear\",\"Ease In\",\"Ease Out\",\"Ease In Out\"],defaultValue:\"easeOut\",displaySegmentedControl:true},font:{type:ControlType.Font,title:\"Font\",controls:\"extended\",defaultFontType:\"sans-serif\",defaultValue:{fontSize:\"40px\",variant:\"Bold\",letterSpacing:\"-0.04em\",lineHeight:\"1em\"}},color:{type:ControlType.Color,title:\"Color\",defaultValue:\"#000000\"},align:{type:ControlType.Enum,title:\"Align\",options:[\"left\",\"center\",\"right\"],optionTitles:[\"Left\",\"Center\",\"Right\"],defaultValue:\"center\",displaySegmentedControl:true},suffix:{type:ControlType.String,title:\"Suffix\",defaultValue:\"\",placeholder:\"%\"},autoStart:{type:ControlType.Boolean,title:\"Auto Start\",defaultValue:true,enabledTitle:\"Auto\",disabledTitle:\"Manual\"},loop:{type:ControlType.Boolean,title:\"Loop\",defaultValue:false,enabledTitle:\"Loop\",disabledTitle:\"Once\"},resetOnReentry:{type:ControlType.Boolean,title:\"Reset on Re-entry\",defaultValue:false,enabledTitle:\"Reset\",disabledTitle:\"No Reset\"}});\nexport const __FramerMetadata__ = {\"exports\":{\"default\":{\"type\":\"reactComponent\",\"name\":\"NumberCounter\",\"slots\":[],\"annotations\":{\"framerSupportedLayoutWidth\":\"auto\",\"framerIntrinsicWidth\":\"180\",\"framerSupportedLayoutHeight\":\"auto\",\"framerContractVersion\":\"1\",\"framerIntrinsicHeight\":\"60\"}},\"__FramerMetadata__\":{\"type\":\"variable\"}}}\n//# sourceMappingURL=./NumberCounter.map"],"mappings":"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"}