1(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[9077],{69077:(e,n,t)=>{"use strict";t.r(n),t.d(n,{default:()=>d});var o=t(68987),i=t(2315);t(72234);var l=t(51148);let a=["top","middle","bottom"],r=[6],u=[5],v={x:2,y:-.7,rotate:-1};function d(e){let{linesGradient:n,enabledWaves:t=a,lineCount:d=r,lineDistance:s=u,topWavePosition:f,middleWavePosition:m,bottomWavePosition:c=v,animationSpeed:p=1,interactive:b=!0,bendRadius:g=5,bendStrength:x=-.5,mouseDamping:C=.05,parallax:h=!0,parallaxStrength:w=.2,mixBlendMode:L="screen"}=e,y=(0,i.useRef)(null),P=(0,i.useRef)(new l.I9Y(-1e3,-1e3)),U=(0,i.useRef)(new l.I9Y(-1e3,-1e3)),E=(0,i.useRef)(0),R=(0,i.useRef)(0),I=(0,i.useRef)(new l.I9Y(0,0)),W=(0,i.useRef)(new l.I9Y(0,0)),G=e=>{var n;return"number"==typeof d?d:t.includes(e)?null!=(n=d[t.indexOf(e)])?n:6:0},B=e=>{var n;return"number"==typeof s?s:t.includes(e)&&null!=(n=s[t.indexOf(e)])?n:.1},_=t.includes("top")?G("top"):0,M=t.includes("middle")?G("middle"):0,S=t.includes("bottom")?G("bottom"):0,D=t.includes("top")?.01*B("top"):.01,O=t.includes("middle")?.01*B("middle"):.01,T=t.includes("bottom")?.01*B("bottom"):.01;return(0,i.useEffect)(()=>{var e,o,i,a,r,u,v,d,s;let L=y.current;if(!L)return;let G=!0,B=new l.Z58,z=new l.qUd(-1,1,1,-1,0,1);z.position.z=1;let q=new l.JeP({antialias:!0,alpha:!1});q.setPixelRatio(Math.min(window.devicePixelRatio||1,2)),q.domElement.style.width="100%",q.domElement.style.height="100%",L.appendChild(q.domElement);let k={iTime:{value:0},iResolution:{value:new l.Pq0(1,1,1)},animationSpeed:{value:p},enableTop:{value:t.includes("top")},enableMiddle:{value:t.includes("middle")},enableBottom:{value:t.includes("bottom")},topLineCount:{value:_},middleLineCount:{value:M},bottomLineCount:{value:S},topLineDistance:{value:D},middleLineDistance:{value:O},bottomLineDistance:{value:T},topWavePosition:{value:new l.Pq0(null!=(e=null==f?void 0:f.x)?e:10,null!=(o=null==f?void 0:f.y)?o:.5,null!=(i=null==f?void 0:f.rotate)?i:-.4)},middleWavePosition:{value:new l.Pq0(null!=(a=null==m?void 0:m.x)?a:5,null!=(r=null==m?void 0:m.y)?r:0,null!=(u=null==m?void 0:m.rotate)?u:.2)},bottomWavePosition:{value:new l.Pq0(null!=(v=null==c?void 0:c.x)?v:2,null!=(d=null==c?void 0:c.y)?d:-.7,null!=(s=null==c?void 0:c.rotate)?s:.4)},iMouse:{value:new l.I9Y(-1e3,-1e3)},interactive:{value:b},bendRadius:{value:g},bendStrength:{value:x},bendInfluence:{value:0},parallax:{value:h},parallaxStrength:{value:w},parallaxOffset:{value:new l.I9Y(0,0)},lineGradient:{value:Array.from({length:8},()=>new l.Pq0(1,1,1))},lineGradientCount:{value:0}};if(n&&n.length>0){let e=n.slice(0,8);k.lineGradientCount.value=e.length,e.forEach((e,n)=>{let t,o,i,a,r=((t=e.trim()).startsWith("#")&&(t=t.slice(1)),o=255,i=255,a=255,3===t.length?(o=parseInt(t[0]+t[0],16),i=parseInt(t[1]+t[1],16),a=parseInt(t[2]+t[2],16)):6===t.length&&(o=parseInt(t.slice(0,2),16),i=parseInt(t.slice(2,4),16),a=parseInt(t.slice(4,6),16)),new l.Pq0(o/255,i/255,a/255));k.lineGradient.value[n].set(r.x,r.y,r.z)})}let Y=new l.BKk({uniforms:k,vertexShader:"\nprecision highp float;\n\nvoid main() {\n gl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);\n}\n",fragmentShader:"\nprecision highp float;\n\nuniform float iTime;\nuniform vec3 iResolution;\nuniform float animationSpeed;\n\nuniform bool enableTop;\nuniform bool enableMiddle;\nuniform bool enableBottom;\n\nuniform int topLineCount;\nuniform int middleLineCount;\nuniform int bottomLineCount;\n\nuniform float topLineDistance;\nuniform float middleLineDistance;\nuniform float bottomLineDistance;\n\nuniform vec3 topWavePosition;\nuniform vec3 middleWavePosition;\nuniform vec3 bottomWavePosition;\n\nuniform vec2 iMouse;\nuniform bool interactive;\nuniform float bendRadius;\nuniform float bendStrength;\nuniform float bendInfluence;\n\nuniform bool parallax;\nuniform float parallaxStrength;\nuniform vec2 parallaxOffset;\n\nuniform vec3 lineGradient[8];\nuniform int lineGradientCount;\n\nconst vec3 BLACK = vec3(0.0);\nconst vec3 PINK = vec3(233.0, 71.0, 245.0) / 255.0;\nconst vec3 BLUE = vec3(47.0, 75.0, 162.0) / 255.0;\n\nmat2 rotate(float r) {\n return mat2(cos(r), sin(r), -sin(r), cos(r));\n}\n\nvec3 background_color(vec2 uv) {\n vec3 col = vec3(0.0);\n\n float y = sin(uv.x - 0.2) * 0.3 - 0.1;\n float m = uv.y - y;\n\n col += mix(BLUE, BLACK, smoothstep(0.0, 1.0, abs(m)));\n col += mix(PINK, BLACK, smoothstep(0.0, 1.0, abs(m - 0.8)));\n return col * 0.5;\n}\n\nvec3 getLineColor(float t, vec3 baseColor) {\n if (lineGradientCount <= 0) {\n return baseColor;\n }\n\n vec3 gradientColor;\n \n if (lineGradientCount == 1) {\n gradientColor = lineGradient[0];\n } else {\n float clampedT = clamp(t, 0.0, 0.9999);\n float scaled = clampedT * float(lineGradientCount - 1);\n int idx = int(floor(scaled));\n float f = fract(scaled);\n int idx2 = min(idx + 1, lineGradientCount - 1);\n\n vec3 c1 = lineGradient[idx];\n vec3 c2 = lineGradient[idx2];\n \n gradientColor = mix(c1, c2, f);\n }\n \n return gradientColor * 0.5;\n}\n\n float wave(vec2 uv, float offset, vec2 screenUv, vec2 mouseUv, bool shouldBend) {\n float time = iTime * animationSpeed;\n\n float x_offset = offset;\n float x_movement = time * 0.1;\n float amp = sin(offset + time * 0.2) * 0.3;\n float y = sin(uv.x + x_offset + x_movement) * amp;\n\n if (shouldBend) {\n vec2 d = screenUv - mouseUv;\n float influence = exp(-dot(d, d) * bendRadius); // radial falloff around cursor\n float bendOffset = (mouseUv.y - screenUv.y) * influence * bendStrength * bendInfluence;\n y += bendOffset;\n }\n\n float m = uv.y - y;\n return 0.0175 / max(abs(m) + 0.01, 1e-3) + 0.01;\n}\n\nvoid mainImage(out vec4 fragColor, in vec2 fragCoord) {\n vec2 baseUv = (2.0 * fragCoord - iResolution.xy) / iResolution.y;
1\n baseUv.y *= -1.0;\n \n if (parallax) {\n baseUv += parallaxOffset;\n }\n\n vec3 col = vec3(0.0);\n\n vec3 b = lineGradientCount > 0 ? vec3(0.0) : background_color(baseUv);\n\n vec2 mouseUv = vec2(0.0);\n if (interactive) {\n mouseUv = (2.0 * iMouse - iResolution.xy) / iResolution.y;\n mouseUv.y *= -1.0;\n }\n \n if (enableBottom) {\n for (int i = 0; i < bottomLineCount; ++i) {\n float fi = float(i);\n float t = fi / max(float(bottomLineCount - 1), 1.0);\n vec3 lineCol = getLineColor(t, b);\n \n float angle = bottomWavePosition.z * log(length(baseUv) + 1.0);\n vec2 ruv = baseUv * rotate(angle);\n col += lineCol * wave(\n ruv + vec2(bottomLineDistance * fi + bottomWavePosition.x, bottomWavePosition.y),\n 1.5 + 0.2 * fi,\n baseUv,\n mouseUv,\n interactive\n ) * 0.2;\n }\n }\n\n if (enableMiddle) {\n for (int i = 0; i < middleLineCount; ++i) {\n float fi = float(i);\n float t = fi / max(float(middleLineCount - 1), 1.0);\n vec3 lineCol = getLineColor(t, b);\n \n float angle = middleWavePosition.z * log(length(baseUv) + 1.0);\n vec2 ruv = baseUv * rotate(angle);\n col += lineCol * wave(\n ruv + vec2(middleLineDistance * fi + middleWavePosition.x, middleWavePosition.y),\n 2.0 + 0.15 * fi,\n baseUv,\n mouseUv,\n interactive\n );\n }\n }\n\n if (enableTop) {\n for (int i = 0; i < topLineCount; ++i) {\n float fi = float(i);\n float t = fi / max(float(topLineCount - 1), 1.0);\n vec3 lineCol = getLineColor(t, b);\n \n float angle = topWavePosition.z * log(length(baseUv) + 1.0);\n vec2 ruv = baseUv * rotate(angle);\n ruv.x *= -1.0;\n col += lineCol * wave(\n ruv + vec2(topLineDistance * fi + topWavePosition.x, topWavePosition.y),\n 1.0 + 0.2 * fi,\n baseUv,\n mouseUv,\n interactive\n ) * 0.1;\n }\n }\n\n fragColor = vec4(col, 1.0);\n}\n\nvoid main() {\n vec4 color = vec4(0.0);\n mainImage(color, gl_FragCoord.xy);\n gl_FragColor = color;\n}\n"}),A=new l.bdM(2,2),K=new l.eaF(A,Y);B.add(K);let F=new l.zD7,N=()=>{if(!G)return;let e=L.clientWidth||1,n=L.clientHeight||1;q.setSize(e,n,!1);let t=q.domElement.width,o=q.domElement.height;k.iResolution.value.set(t,o,1)};N();let j="undefined"!=typeof ResizeObserver?new ResizeObserver(()=>{G&&N()}):null;j&&j.observe(L);let H=e=>{let n=q.domElement.getBoundingClientRect(),t=e.clientX-n.left,o=e.clientY-n.top,i=q.getPixelRatio();if(P.current.set(t*i,(n.height-o)*i),E.current=1,h){let e=n.width/2,i=n.height/2,l=(t-e)/n.width,a=-(o-i)/n.height;I.current.set(l*w,a*w)}},J=()=>{E.current=0};b&&(q.domElement.addEventListener("pointermove",H),q.domElement.addEventListener("pointerleave",J));let V=0,X=C<=0?1:C,Z=()=>{G&&(k.iTime.value=F.getElapsedTime(),b&&(U.current.lerp(P.current,X),k.iMouse.value.copy(U.current),R.current+=(E.current-R.current)*X,k.bendInfluence.value=R.current),h&&(W.current.lerp(I.current,X),k.parallaxOffset.value.copy(W.current)),q.render(B,z),V=requestAnimationFrame(Z))};return Z(),()=>{G=!1,cancelAnimationFrame(V),j&&j.disconnect(),b&&(q.domElement.removeEventListener("pointermove",H),q.domElement.removeEventListener("pointerleave",J)),A.dispose(),Y.dispose(),q.dispose(),q.forceContextLoss(),q.domElement.parentElement&&q.domElement.parentElement.removeChild(q.domElement)}},[n,t,d,s,_,M,S,D,O,T,f,m,c,p,b,g,x,C,h,w]),(0,o.jsx)("div",{ref:y,className:"relative w-full h-full overflow-hidden floating-lines-container",style:{mixBlendMode:L}})}},72234:()=>{}}]);
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.