{"version":3,"file":"index-ByZSpmE0.js","sources":["../../Assets/Scripts/components/numericAnimation/index.ts"],"sourcesContent":["const regex = /\\d+/g;\nconst countUpDuration = 1000;\n\nconst animateValue = (\n obj: HTMLElement,\n start: number,\n end: number,\n duration: number,\n) => {\n let startTimestamp: number | null = null;\n\n const step = (timestamp: number) => {\n if (!startTimestamp) {\n startTimestamp = timestamp;\n }\n\n const progress = Math.min((timestamp - startTimestamp) / duration, 1);\n\n obj.innerHTML = Math.floor(progress * (end - start) + start).toString();\n\n if (progress < 1) {\n window.requestAnimationFrame(step);\n }\n };\n\n window.requestAnimationFrame(step);\n};\n\nconst numericAnimation = () => {\n const SELECTOR = \".js-numeric-animation\";\n\n if (IntersectionObserver === undefined) {\n return;\n }\n\n const checkEntry = (entry: IntersectionObserverEntry) => {\n const $entry = entry.target as HTMLHtmlElement;\n\n if (!entry.isIntersecting || !$entry.dataset.nums) {\n return;\n }\n\n const nums = JSON.parse($entry.dataset.nums.toString()) as number[];\n\n for (let i = 0; i < nums.length; i++) {\n const $wrapper = $entry.querySelector(\n `.js-num-wrapper-${i}`,\n ) as HTMLElement;\n\n animateValue($wrapper, 0, nums[i], countUpDuration);\n }\n\n observer.unobserve($entry);\n };\n\n const callback = (entries: IntersectionObserverEntry[]) => {\n entries.forEach(checkEntry);\n };\n\n const observer = new IntersectionObserver(callback, {\n rootMargin: \"0px\",\n threshold: 0,\n });\n\n document.querySelectorAll(SELECTOR).forEach(($el: Element) => {\n // Zero any numbers and add them to a data attribute so they can be counted up later\n const elementText = $el.innerHTML as string;\n const matches: string[] = [];\n let count = 0;\n let matchExecArray: RegExpExecArray | null;\n\n while ((matchExecArray = regex.exec(elementText))) {\n matches.push(matchExecArray[0]);\n $el.innerHTML = $el.innerHTML.replace(\n matchExecArray[0],\n `0`,\n );\n count++;\n }\n\n $el.setAttribute(\"data-nums\", JSON.stringify(matches));\n\n // Observe to figure out when to count them back up\n observer.observe($el as HTMLElement);\n });\n};\n\nexport default numericAnimation;\n"],"names":["regex","animateValue","obj","start","end","duration","startTimestamp","step","timestamp","progress","numericAnimation","SELECTOR","checkEntry","entry","$entry","nums","i","$wrapper","observer","callback","entries","$el","elementText","matches","count","matchExecArray"],"mappings":"AAAA,MAAMA,EAAQ,OAGd,MAAMC,EAAe,CACnBC,EACAC,EACAC,EACAC,IACG,CACH,IAAIC,EAAgC,KAE9B,MAAAC,EAAQC,GAAsB,CAC7BF,IACcA,EAAAE,GAGnB,MAAMC,EAAW,KAAK,KAAKD,EAAYF,GAAkBD,EAAU,CAAC,EAEhEH,EAAA,UAAY,KAAK,MAAMO,GAAYL,EAAMD,GAASA,CAAK,EAAE,SAAS,EAElEM,EAAW,GACb,OAAO,sBAAsBF,CAAI,CAErC,EAEA,OAAO,sBAAsBA,CAAI,CACnC,EAEMG,EAAmB,IAAM,CAC7B,MAAMC,EAAW,wBAEjB,GAAI,uBAAyB,OAC3B,OAGI,MAAAC,EAAcC,GAAqC,CACvD,MAAMC,EAASD,EAAM,OAErB,GAAI,CAACA,EAAM,gBAAkB,CAACC,EAAO,QAAQ,KAC3C,OAGF,MAAMC,EAAO,KAAK,MAAMD,EAAO,QAAQ,KAAK,UAAU,EAEtD,QAASE,EAAI,EAAGA,EAAID,EAAK,OAAQC,IAAK,CACpC,MAAMC,EAAWH,EAAO,cACtB,mBAAmBE,CAAC,EACtB,EAEAf,EAAagB,EAAU,EAAGF,EAAKC,CAAC,EAAG,GAAe,CAAA,CAGpDE,EAAS,UAAUJ,CAAM,CAC3B,EAEMK,EAAYC,GAAyC,CACzDA,EAAQ,QAAQR,CAAU,CAC5B,EAEMM,EAAW,IAAI,qBAAqBC,EAAU,CAClD,WAAY,MACZ,UAAW,CAAA,CACZ,EAED,SAAS,iBAAiBR,CAAQ,EAAE,QAASU,GAAiB,CAE5D,MAAMC,EAAcD,EAAI,UAClBE,EAAoB,CAAC,EAC3B,IAAIC,EAAQ,EACRC,EAEJ,KAAQA,EAAiBzB,EAAM,KAAKsB,CAAW,GACrCC,EAAA,KAAKE,EAAe,CAAC,CAAC,EAC1BJ,EAAA,UAAYA,EAAI,UAAU,QAC5BI,EAAe,CAAC,EAChB,+BAA+BD,CAAK,YACtC,EACAA,IAGFH,EAAI,aAAa,YAAa,KAAK,UAAUE,CAAO,CAAC,EAGrDL,EAAS,QAAQG,CAAkB,CAAA,CACpC,CACH"}