{"version":3,"file":"CountUp.CSmvIvXf.mjs","names":["useRef"],"sources":["https:/framerusercontent.com/modules/EUUj4vLgQWvUB4WjCuI4/ohUSRtdga0OdEuIMb6s5/CountUp.js"],"sourcesContent":["import{jsx as _jsx}from\"react/jsx-runtime\";import{useEffect,useRef}from\"react\";import{addPropertyControls,ControlType,RenderTarget}from\"framer\";/**\n * CountUp\n * Drop it as a 1px child directly AFTER a stat text layer. It reads that\n * layer's final text (e.g. \"20,000+\"), keeps its exact type style, and counts\n * it up once when it comes into view.\n *\n * Safe by construction: the real number is NEVER removed from the page until\n * the animation is actually running. If nothing ever triggers, the visitor\n * simply sees the real number. Zero can only appear during a live count.\n *\n * @framerSupportedLayoutWidth fixed\n * @framerSupportedLayoutHeight fixed\n */export default function CountUp(props){const{duration,delay,style}=props;const ref=useRef(null);useEffect(()=>{const el=ref.current;if(!el)return;if(RenderTarget.current()===RenderTarget.canvas)return;const wrapper=el.parentElement;const statLayer=wrapper?.previousElementSibling;if(!statLayer)return;const deepest=root=>{let node=root;while(node.children.length===1)node=node.children[0];return node;};// The real value is stored on the layer once, so remounts are safe.\nlet original=statLayer.getAttribute(\"data-countup-original\")||\"\";if(!original){original=(deepest(statLayer).textContent||\"\").trim();statLayer.setAttribute(\"data-countup-original\",original);}if(statLayer.getAttribute(\"data-countup-done\")===\"1\")return;const reduce=window.matchMedia?.(\"(prefers-reduced-motion: reduce)\").matches;const match=original.match(/^([^\\d]*)([\\d,\\.]+)(.*)$/);if(reduce||!match)return;const prefix=match[1];const numText=match[2];const suffix=match[3];const hasComma=numText.includes(\",\");const decimals=(numText.split(\".\")[1]||\"\").length;const target=parseFloat(numText.replace(/,/g,\"\"));if(isNaN(target)||target===0)return;const fmt=v=>{const fixed=v.toFixed(decimals);if(!hasComma)return fixed;const[i,d]=fixed.split(\".\");return i.replace(/\\B(?=(\\d{3})+(?!\\d))/g,\",\")+(d?\".\"+d:\"\");};let started=false;let done=false;const finish=()=>{deepest(statLayer).textContent=original;statLayer.setAttribute(\"data-countup-done\",\"1\");done=true;};const start=()=>{if(started||done)return;started=true;cleanupTriggers();const node=deepest(statLayer);node.style.fontVariantNumeric=\"tabular-nums\";const t0=performance.now()+delay;const ease=t=>1-Math.pow(1-t,3);const tick=now=>{if(done)return;const t=Math.max(0,Math.min(1,(now-t0)/duration));deepest(statLayer).textContent=prefix+fmt(target*ease(t))+suffix;if(t<1)requestAnimationFrame(tick);else finish();};requestAnimationFrame(tick);// Whatever happens to the frame loop, the real number is written.\nsetTimeout(()=>{if(!done)finish();},delay+duration+150);};const inView=()=>{const r=statLayer.getBoundingClientRect();const vh=window.innerHeight||document.documentElement.clientHeight;return r.top<vh*.95&&r.bottom>0&&r.width>0;};const check=()=>{if(!started&&inView())start();};let io=null;if(\"IntersectionObserver\"in window){io=new IntersectionObserver(entries=>{if(entries.some(e=>e.isIntersecting))start();},{threshold:.01});io.observe(statLayer);}const events=[[window,\"scroll\"],[window,\"resize\"],[window,\"touchstart\"],[window,\"touchmove\"],[window,\"pointerdown\"],[window,\"wheel\"],[document,\"visibilitychange\"]];events.forEach(([t,e])=>t.addEventListener(e,check,{passive:true}));const poll=setInterval(check,300);requestAnimationFrame(()=>requestAnimationFrame(check));const t1=setTimeout(check,300);const t2=setTimeout(check,1200);function cleanupTriggers(){io?.disconnect();events.forEach(([t,e])=>t.removeEventListener(e,check));clearInterval(poll);clearTimeout(t1);clearTimeout(t2);}return()=>{cleanupTriggers();if(!done)deepest(statLayer).textContent=original;done=true;};},[]);return /*#__PURE__*/_jsx(\"div\",{ref:ref,style:{...style,width:0,height:0,overflow:\"visible\",pointerEvents:\"none\"}});}CountUp.defaultProps={duration:1200,delay:0,failsafe:4};addPropertyControls(CountUp,{duration:{type:ControlType.Number,title:\"Duration ms\",min:300,max:3e3,step:50},delay:{type:ControlType.Number,title:\"Delay ms\",min:0,max:1e3,step:20}});\nexport const __FramerMetadata__ = {\"exports\":{\"default\":{\"type\":\"reactComponent\",\"name\":\"CountUp\",\"slots\":[],\"annotations\":{\"framerSupportedLayoutHeight\":\"fixed\",\"framerSupportedLayoutWidth\":\"fixed\",\"framerContractVersion\":\"1\"}},\"__FramerMetadata__\":{\"type\":\"variable\"}}}\n//# sourceMappingURL=./CountUp.map"],"mappings":"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"}