PageSourceSearch

https://hashai.co.uk/wp-content/plugins/nextbricks/elements/js/next_counter_v2.min.js?ver=2.2.7

js hashai.co.uk collected 2026-09-29 11:51:04 UTC 6,592 bytes, 17 lines download raw bytes

1var activeCountersv2=[];function next_counter_v2(){gsap.registerPlugin(ScrollTrigger);activeCountersv2.forEach((counter)=>{if(counter.destroy){counter.destroy()}});activeCountersv2=[];class AnimatedCounter{constructor(config){const{selector,trigger,event,eventSelector,thousandsSeparator=",",decimalSeparator=".",startNumber="0",endNumber="0",start="top bottom",delay=0,digits}=config;this.container=selector;this.container.classList.remove("next-counter-v2--fade");this.targetValue=endNumber;this.config=config;this.options={thousandsSeparator,decimalSeparator,startNumber,digits:digits||this.calculateAutoDigits(startNumber,endNumber)};var containerAnimation=isInsideHorizontalScrollElement(this.container);ScrollTrigger.create({trigger:trigger,containerAnimation:containerAnimation?window[containerAnimation]:undefined,start:start,onEnter:()=>this.init(delay),once:!0});if((event=="click"||event=="mouseover")&&document.querySelector(eventSelector)){document.querySelectorAll(eventSelector).forEach((element)=>{element.addEventListener(event,()=>{this.reset()})})}}
2calculateAutoDigits(startNum,targetNum){const[targetIntPart,targetDecPart]=String(targetNum).split(".");const[startIntPart,startDecPart]=String(startNum).split(".");const maxIntegerLength=Math.max(targetIntPart.length,startIntPart?startIntPart.length:0);const maxDecimalLength=Math.max(targetDecPart?targetDecPart.length:0,startDecPart?startDecPart.length:0);return maxIntegerLength+(maxDecimalLength>0?maxDecimalLength+0:0)}
3createCharacter(value,isSymbol=!1,type="default"){const char=document.createElement("div");char.className="next-counter-v2__character";if(isSymbol){char.classList.add("next-counter-v2__character--symbol")}else if(type==="float"){char.classList.add("next-counter-v2__character--float")}else if(type==="decimal"){char.classList.add("next-counter-v2__character--decimal")}
4if(isSymbol){char.textContent=value;return char}
5const track=document.createElement("div");track.className="next-counter-v2__track";track.style.setProperty("--v",value);const digits=[9,0,1,2,3,4,5,6,7,8,9,0];digits.forEach((digit)=>{const span=document.createElement("span");span.textContent=digit;track.appendChild(span)});char.appendChild(track);return char}
6init(delay){let[targetIntPart,targetDecimalPart]=this.targetValue.toString().split(".");let[startIntPart,startDecimalPart]=this.options.startNumber.toString().split(".");const maxDecimals=Math.max(targetDecimalPart?targetDecimalPart.length:0,startDecimalPart?startDecimalPart.length:0);if(maxDecimals>0){startDecimalPart=(startDecimalPart||"0").padEnd(maxDecimals,"0");targetDecimalPart=(targetDecimalPart||"0").padEnd(maxDecimals,"0")}
7let adjustedStartInt=startIntPart.replace(/[^\d]/g,"");if(this.options.digits){const targetLength=this.options.digits-(maxDecimals>0?maxDecimals+1:0);adjustedStartInt=adjustedStartInt.padStart(targetLength,"0")}else{adjustedStartInt=adjustedStartInt.padStart(targetIntPart.length,"0")}
8const startNumber=maxDecimals>0?`${adjustedStartInt}${startDecimalPart}`:adjustedStartInt;const formattedNumber=maxDecimals>0?this.formatNumber(`${targetIntPart}.${targetDecimalPart}`):this.formatNumber(targetIntPart);formattedNumber.split("").forEach((char,index)=>{const isSymbol=isNaN(parseInt(char,10));let type="default";if(!isSymbol){const decimalPosition=formattedNumber.indexOf(this.options.decimalSeparator);if(decimalPosition!==-1){type=index<decimalPosition?"float":"decimal"}else{type="float"}}
9const element=this.createCharacter(char,isSymbol,type);this.container.appendChild(element)});const tracks=this.container.querySelectorAll(".next-counter-v2__track");const totalDigits=tracks.length;const startDigits=startNumber.padStart(totalDigits,"0").split("");tracks.forEach((track,index)=>{const startDigit=startDigits[index];if(!isNaN(parseInt(startDigit,10))){track.style.transform=`translateY(${(parseInt(startDigit, 10) + 1) * -1.5}em)`}});setTimeout(()=>{const digits=formattedNumber.split("");let trackIndex=0;digits.forEach((char)=>{if(!isNaN(parseInt(char,10))){const track=tracks[trackIndex];track.style.transform=`translateY(${(parseInt(char, 10) + 1) * -1.5}em)`;trackIndex++}})},delay*1000)}
10formatNumber(number){const[integerPart,decimalPart]=number.toString().split(".");let formattedInteger=integerPart;if(this.options.digits){const[,startDecPart]=String(this.options.startNumber).split(this.options.decimalSeparator);const[,targetDecPart]=this.targetValue.toString().split(".");const maxDecimals=Math.max(targetDecPart?targetDecPart.length:0,startDecPart?startDecPart.length:0);const targetLength=this.options.digits-(maxDecimals>0?maxDecimals+1:0);formattedInteger=formattedInteger.padStart(targetLength,"0")}
11formattedInteger=formattedInteger.replace(/\B(?=(\d{3})+(?!\d))/g,this.options.thousandsSeparator);let formattedDecimal=decimalPart||"";if(formattedDecimal){const[,startDecPart]=String(this.options.startNumber).split(this.options.decimalSeparator);const maxDecimals=Math.max(formattedDecimal.length,startDecPart?startDecPart.length:0);formattedDecimal=formattedDecimal.padEnd(maxDecimals,"0")}
12return formattedDecimal?`${formattedInteger}${this.options.decimalSeparator}${formattedDecimal}`:formattedInteger}
13reset(){this.container.innerHTML="";this.init(this.config.delay)}
14destroy(){this.container.innerHTML="";ScrollTrigger.getAll().filter((st)=>st.vars.trigger===this.container).forEach((st)=>st.kill());if(this.config.event&&this.config.eventSelector){document.querySelectorAll(this.config.eventSelector).forEach((element)=>{element.removeEventListener(this.config.event,this.reset)})}}}
15document.querySelectorAll(".next-counter-v2").forEach((counter)=>{let trigger=counter.dataset.trigger=="this"?counter:counter.dataset.trigger;const newCounter=new AnimatedCounter({selector:counter,trigger:trigger,event:counter.dataset.event,eventSelector:counter.dataset.eventSelector,thous
15andsSeparator:counter.dataset.thousandsSeparator,decimalSeparator:counter.dataset.decimalSeparator,startNumber:counter.dataset.startNumber,endNumber:counter.dataset.endNumber,start:counter.dataset.start,delay:counter.dataset.delay,});activeCountersv2.push(newCounter)})}
16function isInsideHorizontalScrollElement(element){let containerName=null;document.querySelectorAll(".next-horizontal-scroll").forEach((horizontalScroll,index)=>{if(horizontalScroll.contains(element)){containerName=`NextHorizontalScroll${index}`}});return containerName}
17document.addEventListener("DOMContentLoaded",function(t){if(!document.querySelector(".nb-site-loader")){document.fonts.ready.then(function(){bricksIsFrontend&&next_counter_v2()})}})

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.