{"version":3,"file":"StatCounter.DPwek73l.mjs","names":["useRef","useState","useLayoutEffect","useEffect"],"sources":["https:/framerusercontent.com/modules/C8sQdG9XGdHnvCA6XKjP/gvBXerTL4C73qiglJV1j/StatCounter.js"],"sourcesContent":["import{jsx as _jsx,jsxs as _jsxs}from\"react/jsx-runtime\";import{addPropertyControls,ControlType,useIsStaticRenderer}from\"framer\";import{useEffect,useLayoutEffect,useRef,useState}from\"react\";/** useLayoutEffect on the client, useEffect on the server (no SSR warning). */const useIsoLayoutEffect=typeof window!==\"undefined\"?useLayoutEffect:useEffect;const JOST=\"Jost, sans-serif\";/** Property-control numbers can arrive as strings; fall back when unusable. */function num(value,fallback){const n=typeof value===\"number\"?value:Number.parseFloat(String(value));return Number.isFinite(n)?n:fallback;}function fmt(n,thousands){const v=Math.round(n);if(!thousands)return String(v);return String(v).replace(/\\B(?=(\\d{3})+(?!\\d))/g,\".\");}/**\n * Count-up stat for the V002 stats box (\"Há 13 anos\", \"+2.000\", ...).\n * Counts from zero when it enters the viewport, easing out; renders the\n * final value statically on the canvas and under prefers-reduced-motion.\n * Jost Medium, tabular numbers so the box never jitters.\n *\n * @framerSupportedLayoutWidth any-prefer-fixed\n * @framerSupportedLayoutHeight auto\n */export default function StatCounter(props){const{prefix=\"\",suffix=\"\",thousands=true,align=\"center\",color=\"#222222\"}=props;const value=num(props.value,0);const duration=num(props.duration,1.8);const fontSizePx=num(props.fontSizePx,36);/** A word suffix (\"anos\", \"years\") is as wide as three digits, which is\n     *  what decides how small a three-across stat row has to get. Setting it\n     *  below 1 keeps the number big and reads better besides. */const suffixScale=num(props.suffixScale,1);const isStatic=useIsStaticRenderer();const ref=useRef(null);/** Server HTML carries the real value, so search engines and AI agents\n     *  read \"Há 13 anos\", not \"Há 0 anos\". The client resets to zero before\n     *  the first paint and counts up as before. */const[display,setDisplay]=useState(value);const[done,setDone]=useState(false);/** A stat frozen at zero reads as a broken number, so the count-up gets a\n     *  deadline: if the observer or the frame loop never ran, show the value. */const startedRef=useRef(false);useIsoLayoutEffect(()=>{if(isStatic)return;const reduce=typeof window.matchMedia===\"function\"&&window.matchMedia(\"(prefers-reduced-motion: reduce)\").matches;if(!reduce)setDisplay(0);},[isStatic]);useEffect(()=>{if(isStatic||typeof window===\"undefined\")return;const reduce=typeof window.matchMedia===\"function\"&&window.matchMedia(\"(prefers-reduced-motion: reduce)\").matches;if(reduce){setDisplay(value);setDone(true);return;}const el=ref.current;if(!el||done)return;let raf=0;const observer=new IntersectionObserver(entries=>{if(!entries.some(e=>e.isIntersecting))return;observer.disconnect();startedRef.current=true;let start=0;const loop=ts=>{if(!start)start=ts;const t=Math.min(1,(ts-start)/(duration*1e3));const eased=1-Math.pow(1-t,3);setDisplay(value*eased);if(t<1)raf=requestAnimationFrame(loop);else setDone(true);};raf=requestAnimationFrame(loop);},{threshold:.6});observer.observe(el);const deadline=window.setTimeout(()=>{if(startedRef.current)return;observer.disconnect();setDisplay(value);setDone(true);},3200);return()=>{observer.disconnect();cancelAnimationFrame(raf);window.clearTimeout(deadline);};},[isStatic,value,duration,done]);const shown=isStatic?value:display;return /*#__PURE__*/_jsxs(\"div\",{ref:ref,style:{fontFamily:JOST,fontWeight:500,fontSize:fontSizePx,lineHeight:1,color,textAlign:align,fontVariantNumeric:\"tabular-nums\",whiteSpace:\"nowrap\",...props.style},children:[prefix,fmt(shown,thousands),suffix?/*#__PURE__*/_jsx(\"span\",{style:{fontSize:fontSizePx*suffixScale},children:suffix}):null]});}addPropertyControls(StatCounter,{prefix:{type:ControlType.String,title:\"Prefix\",defaultValue:\"\"},value:{type:ControlType.Number,title:\"Value\",defaultValue:500,min:0,max:1e5,step:1},suffix:{type:ControlType.String,title:\"Suffix\",defaultValue:\"\"},thousands:{type:ControlType.Boolean,title:\"Thousands (.)\",defaultValue:true},duration:{type:ControlType.Number,title:\"Duration\",defaultValue:1.8,min:.3,max:6,step:.1,unit:\"s\"},fontSizePx:{type:ControlType.Number,title:\"Size\",defaultValue:36,min:10,max:120,step:.5,unit:\"px\"},suffixScale:{type:ControlType.Number,title:\"Suffix Scale\",defaultValue:1,min:.3,max:1,step:.05,description:\"Tamanho do sufixo em rela\\xe7\\xe3o ao n\\xfamero\"},color:{type:ControlType.Color,title:\"Color\",defaultValue:\"#222222\"},align:{type:ControlType.Enum,title:\"Align\",options:[\"left\",\"center\",\"right\"],defaultValue:\"center\"}});\nexport const __FramerMetadata__ = {\"exports\":{\"default\":{\"type\":\"reactComponent\",\"name\":\"StatCounter\",\"slots\":[],\"annotations\":{\"framerSupportedLayoutHeight\":\"auto\",\"framerContractVersion\":\"1\",\"framerSupportedLayoutWidth\":\"any-prefer-fixed\"}},\"__FramerMetadata__\":{\"type\":\"variable\"}}}\n//# sourceMappingURL=./StatCounter.map"],"mappings":"4NAAyc,SAAS,EAAI,EAAM,EAAS,CAAC,IAAM,EAAE,OAAO,GAAQ,SAAS,EAAM,OAAO,WAAW,OAAO,CAAK,CAAC,EAAE,OAAO,OAAO,SAAS,CAAC,EAAE,EAAE,CAAS,CAAC,SAAS,EAAI,EAAE,EAAU,CAAC,IAAM,EAAE,KAAK,MAAM,CAAC,EAAiC,OAA3B,EAAkC,OAAO,CAAC,CAAC,CAAC,QAAQ,wBAAwB,GAAG,EAA9D,OAAO,CAAC,CAAwD,CAQrtB,SAAwB,EAAY,EAAM,CAAC,GAAK,CAAC,SAAO,GAAG,SAAO,GAAG,YAAU,GAAK,QAAM,SAAS,QAAM,WAAW,EAAY,EAAM,EAAI,EAAM,MAAM,CAAC,EAAQ,EAAS,EAAI,EAAM,SAAS,GAAG,EAAQ,EAAW,EAAI,EAAM,WAAW,EAAE,EAEpK,EAAY,EAAI,EAAM,YAAY,CAAC,EAAQ,EAAS,EAAoB,EAAQ,EAAIA,EAAO,IAAI,EAE9G,CAAC,EAAQ,GAAYC,EAAS,CAAK,EAAO,CAAC,EAAK,GAASA,EAAS,EAAK,EACxC,EAAWD,EAAO,EAAK,EAAE,MAAuB,CAAI,GAA6B,OAAO,EAAO,YAAa,YAAY,EAAO,WAAW,kCAAkC,CAAC,CAAC,SAAmB,EAAW,CAAC,CAAE,EAAE,CAAC,CAAQ,CAAC,EAAE,MAAc,CAAC,GAAG,GAAiB,IAAS,OAAY,OAAyH,GAArG,OAAO,EAAO,YAAa,YAAY,EAAO,WAAW,kCAAkC,CAAC,CAAC,QAAkB,CAAC,EAAW,CAAK,EAAE,EAAQ,EAAI,EAAE,MAAO,CAAC,IAAM,EAAG,EAAI,QAAQ,GAAG,CAAC,GAAI,EAAK,OAAO,IAAI,EAAI,EAAQ,EAAS,IAAI,qBAAqB,GAAS,CAAC,GAAG,CAAC,EAAQ,KAAK,GAAG,EAAE,cAAc,EAAE,OAAO,EAAS,WAAW,EAAE,EAAW,QAAQ,GAAK,IAAI,EAAM,EAAQ,EAAK,GAAI,CAAC,AAAU,IAAM,EAAG,IAAM,EAAE,KAAK,IAAI,GAAG,EAAG,IAAQ,EAAS,IAAI,EAAQ,EAAM,GAAW,EAAE,IAAE,EAAG,EAAW,EAAM,CAAK,EAAK,EAAE,EAAE,EAAI,sBAAsB,CAAI,EAAO,EAAQ,EAAI,CAAE,EAAE,EAAI,sBAAsB,CAAI,CAAE,EAAE,CAAC,UAAU,EAAE,CAAC,EAAE,EAAS,QAAQ,CAAE,EAAE,IAAM,EAAS,EAAO,eAAe,CAAI,EAAW,UAAe,EAAS,WAAW,EAAE,EAAW,CAAK,EAAE,EAAQ,EAAI,EAAE,EAAE,IAAI,EAAE,UAAU,CAAC,EAAS,WAAW,EAAE,qBAAqB,CAAG,EAAE,EAAO,aAAa,CAAQ,CAAE,CAAE,EAAE,CAAC,EAAS,EAAM,EAAS,CAAI,CAAC,EAAE,IAAM,EAAM,EAAS,EAAM,EAAQ,OAAoB,EAAM,MAAM,CAAK,MAAI,MAAM,CAAC,WAAW,EAAK,WAAW,IAAI,SAAS,EAAW,WAAW,EAAE,QAAM,UAAU,EAAM,mBAAmB,eAAe,WAAW,SAAS,GAAG,EAAM,KAAK,EAAE,SAAS,CAAC,EAAO,EAAI,EAAM,CAAS,EAAE,EAAoB,EAAK,OAAO,CAAC,MAAM,CAAC,SAAS,EAAW,CAAW,EAAE,SAAS,CAAM,CAAC,EAAE,IAAI,CAAC,CAAC,CAAE,yBAb5iD,IAAwE,IAA6D,EAAsF,EAA0B,IAAS,OAA4BG,EAAhBD,EAAgC,EAAK,mBAa8vC,EAAoB,EAAY,CAAC,OAAO,CAAC,KAAK,EAAY,OAAO,MAAM,SAAS,aAAa,EAAE,EAAE,MAAM,CAAC,KAAK,EAAY,OAAO,MAAM,QAAQ,aAAa,IAAI,IAAI,EAAE,IAAI,IAAI,KAAK,CAAC,EAAE,OAAO,CAAC,KAAK,EAAY,OAAO,MAAM,SAAS,aAAa,EAAE,EAAE,UAAU,CAAC,KAAK,EAAY,QAAQ,MAAM,gBAAgB,aAAa,EAAI,EAAE,SAAS,CAAC,KAAK,EAAY,OAAO,MAAM,WAAW,aAAa,IAAI,IAAI,GAAG,IAAI,EAAE,KAAK,GAAG,KAAK,GAAG,EAAE,WAAW,CAAC,KAAK,EAAY,OAAO,MAAM,OAAO,aAAa,GAAG,IAAI,GAAG,IAAI,IAAI,KAAK,GAAG,KAAK,IAAI,EAAE,YAAY,CAAC,KAAK,EAAY,OAAO,MAAM,eAAe,aAAa,EAAE,IAAI,GAAG,IAAI,EAAE,KAAK,IAAI,YAAY,wCAAiD,EAAE,MAAM,CAAC,KAAK,EAAY,MAAM,MAAM,QAAQ,aAAa,SAAS,EAAE,MAAM,CAAC,KAAK,EAAY,KAAK,MAAM,QAAQ,QAAQ,CAAC,OAAO,SAAS,OAAO,EAAE,aAAa,QAAQ,CAAC,CAAC"}