PageSourceSearch

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

js hashai.co.uk collected 2026-09-29 11:51:50 UTC 4,241 bytes, 16 lines download raw bytes

1function next_interactive_lines_v4(){function createNoise2D(seed){var sd=seed|0;var DIRS=new Float64Array(32);for(var k=0;k<16;k++){var a=k*0.39269908169872414;DIRS[k*2]=Math.cos(a);DIRS[k*2+1]=Math.sin(a)}
2function ihash(ax,ay){var h=Math.imul(ax,0x165667B1)+Math.imul(ay,0x27D4EB2D)+Math.imul(sd,0x4C1906DD);h=Math.imul(h^(h>>>13),0x4C1906DD);return(h^(h>>>16))>>>0}
3function dot(ix,iy,fx,fy){var idx=(ihash(ix,iy)&15)<<1;return DIRS[idx]*fx+DIRS[idx+1]*fy}
4function ease(t){return t*t*t*(t*(t*6-15)+10)}
5return function noise2d(px,py){var gx=Math.floor(px),gy=Math.floor(py);var fx=px-gx,fy=py-gy;var u=ease(fx),v=ease(fy);var n00=dot(gx,gy,fx,fy);var n10=dot(gx+1,gy,fx-1,fy);var n01=dot(gx,gy+1,fx,fy-1);var n11=dot(gx+1,gy+1,fx-1,fy-1);var ix0=n00+(n10-n00)*u;var ix1=n01+(n11-n01)*u;return ix0+(ix1-ix0)*v}}
6document.querySelectorAll('.nb-interactive-lines-v4').forEach(function(el){if(el.dataset.nbIlv4Ready==='1')return;el.dataset.nbIlv4Ready='1';var canvas=el.querySelector(".nb-interactive-lines-v4__canvas");if(!canvas)return;var ctx=canvas.getContext("2d");if(!ctx)return;var noiseFn=createNoise2D(Math.floor(Math.random()*65536));var grid=[];var cfg={color:getComputedStyle(el).getPropertyValue('--line-color').trim()||'#333333',spdX:parseFloat(el.getAttribute("data-wave-speed-x"))||0.0125,spdY:parseFloat(el.getAttribute("data-wave-speed-y"))||0.005,ampX:parseFloat(el.getAttribute("data-wave-amp-x"))||32,ampY:parseFloat(el.getAttribute("data-wave-amp-y"))||16,gapX:parseFloat(el.getAttribute("data-x-gap"))||10,gapY:parseFloat(el.getAttribute("data-y-gap"))||32,fric:parseFloat(el.getAttribute("data-friction"))||0.925,tens:parseFloat(el.getAttribute("data-tension"))||0.005,maxMove:parseFloat(el.getAttribute("data-max-cursor-move"))||100};var cur={x:-10,y:0,lx:0,ly:0,sx:0,sy:0,v:0,vs:0,ang:0,ready:!1};function layout(){var w=el.clientWidth;var h=el.clientHeight;if(w===0||h===0)return;canvas.width=w;canvas.height=h;createGrid()}
7function createGrid(){grid=[];var w=canvas.width,h=canvas.height;var nc=Math.ceil((w+190)/cfg.gapX);var nr=Math.ceil((h+36)/cfg.gapY);var x0=(w-cfg.gapX*nc)/2;var y0=(h-cfg.gapY*nr)/2;for(var c=0;c<=nc;c++){var col=[];for(var r=0;r<=nr;r++){col.push({bx:x0+cfg.gapX*c,by:y0+cfg.gapY*r,wx:0,wy:0,cx:0,cy:0,cvx:0,cvy:0})}
8grid.push(col)}}
9function onPointer(px,py){cur.x=px;cur.y=py;if(!cur.ready){cur.sx=px;cur.sy=py;cur.lx=px;cur.ly=py;cur.ready=!0}}
10function physics(t){for(var c=0;c<grid.length;c++){for(var r=0;r<grid[c].length;r++){var pt=grid[c][r];var sample=noiseFn((pt.bx+t*cfg.spdX)*0.00215,(pt.by+t*cfg.spdY)*0.0014)*11.5;pt.wx=Math.cos(sample)*cfg.ampX;pt.wy=Math.sin(sample)*cfg.ampY;var dx=pt.bx-cur.sx,dy=pt.by-cur.sy;var d=Math.hypot(dx,dy),lim=Math.max(168,cur.vs);if(d<lim){var s=1-d/lim;var f=Math.cos(d*0.0012)*s;pt.cvx+=Math.cos(cur.ang)*f*lim*cur.vs*0.0007;pt.cvy+=Math.sin(cur.ang)*f*lim*cur.vs*0.0007}
11pt.cvx+=-pt.cx*cfg.tens;pt.cvy+=-pt.cy*cfg.tens;pt.cvx*=cfg.fric;pt.cvy*=cfg.fric;pt.cx+=pt.cvx*1.85;pt.cy+=pt.cvy*1.85;pt.cx=Math.min(cfg.maxMove,Math.max(-cfg.maxMove,pt.cx));pt.cy=Math.min(cfg.maxMove,Math.max(-cfg.maxMove,pt.cy))}}}
12function paint(){ctx.clearRect(0,0,canvas.width,canvas.height);ctx.beginPath();ctx.strokeStyle=cfg.color;for(var c=0;c<grid.length;c++){var col=grid[c];var h=col[0];ctx.moveTo(Math.round((h.bx+h.wx)*10)/10,Math.round((h.by+h.wy)*10)/10);for(var r=0;r<col.length;r++){var p=col[r];ctx.lineTo(Math.round((p.bx+p.wx+p.cx)*10)/10,Math.round((p.by+p.wy+p.cy)*10)/10)}}
13ctx.stroke()}
14function frame(t){cur.sx+=(cur.x-cur.sx)*0.12;cur.sy+=(cur.y-cur.sy)*0.12;var dx=cur.x-cur.lx,dy=cur.y-cur.ly;var d=Math.hypot(dx,dy);cur.v=d;cur.vs+=(d-cur.vs)*0.12;cur.vs=Math.min(95,cur.vs);cur.lx=cur.x;cur.ly=cur.y;cur.ang=Math.atan2(dy,dx);physics(t);paint();requestAnimationFrame(frame)}
15el.addEventListener("mousemove",function(e){var r=canvas.getBoundingClientRect();onPointer(e.clientX-r.left,e.clientY-r.top)});el.addEventListener("touchmove",function(e){var tc=e.touches[0];var r=canvas.getBoundingClientRect();onPointer(tc.clientX-r.left,tc.clientY-r.top)},{passive:!1});window.addEventListener('resize',layout);layout();frame(0)})}
16document.addEventListener("DOMContentLoaded",function(t){bricksIsFrontend&&next_interactive_lines_v4()})

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.