{"version":3,"file":"CountUpNumber.CbAwvQ9d.mjs","names":["useRef","useState","useMemo","useCallback","__esmMin","window","pe","te","init_ssg_sandbox_shims","init_npm_react_18_3_1","_e","de","ne","c","ce","addPropertyControls","init_framer_B1b760uK","ControlType","CountUpNumber","props","rootRef","rafIdRef","hasStartedRef","observerRef","displayValue","setDisplayValue","start","isComplete","setIsComplete","safeDecimals","decimals","finalValue","end","startValue","formatter","useGrouping","setFinalText","runAnimation","animationDurationMs","duration","startTime","delta","easeOutCubic","t","tick","elapsed","now","progress","eased","rawValue","nextValue","entries","entry","text","showSuffixDuringCount","suffix","textStyle","init_CountUpNumber","init_jsx_runtime"],"sources":["https:/framerusercontent.com/modules/4MrvpSYxaV7DZdnbjjVC/u882usCC6aSFRIUCqYEX/CountUpNumber.js"],"sourcesContent":["import{jsx as _jsx}from\"react/jsx-runtime\";import{startTransition,useCallback,useEffect,useMemo,useRef,useState}from\"react\";// @ts-ignore - Framer runtime provides this module in project environment.\nimport{addPropertyControls,ControlType}from\"framer\";// User request: Create a new Framer code component named CountUpNumber for a stat number. It must visibly render in preview without relying on overriding a RichText layer. Behavior: count from a configurable start number to a configurable end number when the component first enters the viewport, then show an optional suffix. Default start 0, end 1000, suffix '+', duration 1.6 seconds. Use IntersectionObserver once, requestAnimationFrame ease-out cubic, reduced motion immediately final value, SSR/static safe. Expose property controls for start, end, suffix, duration, font family, font size, font weight, line height, letter spacing, color, text align. Defaults should match this site stat: Space Grotesk, 37px, weight 400, line-height 1.24em, letter-spacing -0.015625em, white-ish text can be set by instance; no background, no padding, width should fit content and height auto. The component should render a semantic heading-like text visually, but not impose layout. Keep it simple and robust.\n/**\n * @framerSupportedLayoutWidth auto\n * @framerSupportedLayoutHeight auto\n */export default function CountUpNumber(props){const{start=0,end=1e3,suffix=\"+\",showSuffixDuringCount=false,duration=1.6,decimals=0,useGrouping=true,color=\"#FFFFFF\",textStyle={fontSize:37,variant:\"Regular\",lineHeight:\"1.24em\",letterSpacing:\"-0.015625em\",textAlign:\"left\"}}=props;const rootRef=useRef(null);const rafIdRef=useRef(null);const hasStartedRef=useRef(false);const observerRef=useRef(null);const[displayValue,setDisplayValue]=useState(start);const[isComplete,setIsComplete]=useState(false);const safeDecimals=useMemo(()=>Math.min(3,Math.max(0,Math.round(decimals))),[decimals]);const finalValue=useMemo(()=>safeDecimals===0?Math.round(end):end,[end,safeDecimals]);const startValue=useMemo(()=>safeDecimals===0?Math.round(start):start,[safeDecimals,start]);const formatter=useMemo(()=>new Intl.NumberFormat(\"en-US\",{minimumFractionDigits:safeDecimals,maximumFractionDigits:safeDecimals,useGrouping}),[safeDecimals,useGrouping]);const setFinalText=useCallback(()=>{startTransition(()=>{setDisplayValue(finalValue);setIsComplete(true);});},[finalValue]);const runAnimation=useCallback(()=>{if(hasStartedRef.current)return;hasStartedRef.current=true;if(typeof window===\"undefined\"){setFinalText();return;}const prefersReducedMotion=typeof window.matchMedia===\"function\"&&window.matchMedia(\"(prefers-reduced-motion: reduce)\").matches;if(prefersReducedMotion){setFinalText();return;}startTransition(()=>{setDisplayValue(startValue);setIsComplete(false);});const animationDurationMs=Math.max(.05,duration)*1e3;const startTime=window.performance.now();const delta=finalValue-startValue;const easeOutCubic=t=>1-Math.pow(1-t,3);const tick=now=>{const elapsed=now-startTime;const progress=Math.min(elapsed/animationDurationMs,1);const eased=easeOutCubic(progress);const rawValue=startValue+delta*eased;const nextValue=safeDecimals===0?Math.round(rawValue):rawValue;startTransition(()=>{setDisplayValue(nextValue);setIsComplete(false);});if(progress<1){rafIdRef.current=window.requestAnimationFrame(tick);}else{setFinalText();rafIdRef.current=null;}};rafIdRef.current=window.requestAnimationFrame(tick);},[duration,finalValue,safeDecimals,setFinalText,startValue]);useEffect(()=>{if(typeof window===\"undefined\")return;if(!rootRef.current)return;if(typeof IntersectionObserver===\"undefined\"){runAnimation();return;}observerRef.current=new IntersectionObserver(entries=>{const isVisible=entries.some(entry=>entry.isIntersecting);if(!isVisible)return;runAnimation();observerRef.current?.disconnect();observerRef.current=null;},{threshold:.2});observerRef.current.observe(rootRef.current);return()=>{observerRef.current?.disconnect();observerRef.current=null;};},[runAnimation]);useEffect(()=>{return()=>{if(typeof window!==\"undefined\"&&rafIdRef.current!==null){window.cancelAnimationFrame(rafIdRef.current);}observerRef.current?.disconnect();observerRef.current=null;};},[]);const text=useMemo(()=>{const formattedValue=formatter.format(displayValue);const shouldShowSuffix=showSuffixDuringCount||isComplete;return`${formattedValue}${shouldShowSuffix?suffix:\"\"}`;},[displayValue,formatter,isComplete,showSuffixDuringCount,suffix]);return /*#__PURE__*/_jsx(\"h2\",{ref:rootRef,style:{position:\"relative\",margin:0,padding:0,background:\"transparent\",width:\"max-content\",height:\"auto\",color,fontFamily:textStyle.fontFamily||\"Space Grotesk\",fontSize:textStyle.fontSize,fontWeight:textStyle.fontWeight,lineHeight:textStyle.lineHeight,letterSpacing:textStyle.letterSpacing,textAlign:textStyle.textAlign,fontStyle:textStyle.fontStyle,whiteSpace:\"nowrap\"},children:text});}addPropertyControls(CountUpNumber,{start:{type:ControlType.Number,title:\"Start\",defaultValue:0,step:1},end:{type:ControlType.Number,title:\"End\",defaultValue:1e3,step:1},suffix:{type:ControlType.String,title:\"Suffix\",defaultValue:\"+\"},showSuffixDuringCount:{type:ControlType.Boolean,title:\"Show Suffix\",defaultValue:false,enabledTitle:\"On\",disabledTitle:\"Off\"},duration:{type:ControlType.Number,title:\"Duration\",defaultValue:1.6,min:.1,max:10,step:.1},decimals:{type:ControlType.Number,title:\"Decimals\",defaultValue:0,min:0,max:3,step:1},useGrouping:{type:ControlType.Boolean,title:\"Grouping\",defaultValue:true,enabledTitle:\"On\",disabledTitle:\"Off\"},color:{type:ControlType.Color,title:\"Color\",defaultValue:\"#FFFFFF\"},textStyle:{type:ControlType.Font,title:\"Text\",controls:\"extended\",defaultFontType:\"sans-serif\",defaultValue:{fontSize:\"37px\",variant:\"Regular\",lineHeight:\"1.24em\",letterSpacing:\"-0.015625em\",textAlign:\"left\"}}});\nexport const __FramerMetadata__ = {\"exports\":{\"default\":{\"type\":\"reactComponent\",\"name\":\"CountUpNumber\",\"slots\":[],\"annotations\":{\"framerContractVersion\":\"1\",\"framerSupportedLayoutHeight\":\"auto\",\"framerSupportedLayoutWidth\":\"auto\"}},\"__FramerMetadata__\":{\"type\":\"variable\"}}}\n//# sourceMappingURL=./CountUpNumber.map"],"mappings":"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"}