1"use strict";(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[101],{90101:function(e,t,n){n.r(t),n.d(t,{default:function(){return o}});var r=n(57437),a=n(2265);function o(){let e=(0,a.useRef)(null),[t,n]=(0,a.useState)(!1),[o,i]=(0,a.useState)(!1);return((0,a.useEffect)(()=>{if("function"!=typeof window.matchMedia){i(!0);return}let e=window.matchMedia("(min-width: 768px)"),t=()=>i(e.matches);return t(),e.addEventListener("change",t),()=>e.removeEventListener("change",t)},[]),(0,a.useEffect)(()=>{var t,r;if(!o)return;let a=e.current;if(!a)return;let i=a.getContext("webgl",{antialias:!1,alpha:!1,depth:!1,stencil:!1,powerPreference:"low-power"})||a.getContext("experimental-webgl");if(!i)return;let l=(e,t)=>{let n=i.createShader(e);return(i.shaderSource(n,t),i.compileShader(n),i.getShaderParameter(n,i.COMPILE_STATUS))?n:(console.error("[BrandImageLens] shader:",i.getShaderInfoLog(n)),i.deleteShader(n),null)},u=l(i.VERTEX_SHADER,"\nattribute vec2 aPos;\nvoid main() { gl_Position = vec4(aPos, 0.0, 1.0); }\n"),m=l(i.FRAGMENT_SHADER,'\nprecision highp float;\n\nuniform sampler2D uTex;\nuniform vec2 uRes; // ìºë²ì¤ í½ì
í¬ê¸°\nuniform vec2 uTexSize; // ì본 ì´ë¯¸ì§ í¬ê¸°\nuniform float uTime; // ì´\nuniform vec2 uMouse; // 0..1 uv, JS 쪽ìì ë¶ëë½ê² ë°ë¼ì¨ ê°\nuniform float uHover; // 커ìê° í¨ë ìì ìë ì ë 0..1\nuniform float uAmbient; // ë기 ì¤ íë¤ë¦¼ ì¬ì© ì¬ë¶ (0 ëë 1)\n\n// ë ì¦ ë°ê²½(ì¸ë¡ ê¸¸ì´ ê¸°ì¤)ê³¼ íëì¨. ì¬ê¸°ë¥¼ í¤ì°ë©´ ê¸ì¸ "ë보기"ì²ë¼\n// ë
¸ê³¨ì ì¼ë¡ ë³´ì¸ë¤. ììì±ê¸° ì§ì ì ëê° ì ë¹íë¤.\nconst float LENS_R = 0.34;\nconst float LENS_K = 0.30;\n\nvoid main() {\n vec2 uv = gl_FragCoord.xy / uRes;\n\n float canvasA = uRes.x / max(uRes.y, 1.0);\n float texA = uTexSize.x / max(uTexSize.y, 1.0);\n\n // object-fit: cover 를 ì
°ì´ëìì ì¬ííë¤. ë°ì ê¹ë¦° <Image> ì íë ìì´\n // ì´ê¸ëë©´ ì íí ë ê·¸ë¦¼ì´ í기 ë문ì ê³ì°ì ì íí ë§ì¶°ì¼ íë¤.\n vec2 t = uv;\n if (canvasA > texA) {\n t.y = (uv.y - 0.5) * (texA / canvasA) + 0.5;\n } else {\n t.x = (uv.x - 0.5) * (canvasA / texA) + 0.5;\n }\n\n float tm = uTime;\n\n // ââ ë린 ì¨ì¬ê¸° ââ\n // ë
¸ì´ì¦ê¹ì§ ê° íìê° ìë¤. ì£¼ê¸°ê° ë¤ë¥¸ ì¬ì¸ ëª ê°ë¥¼ ê²¹ì¹ë©´ ëíì´ê°\n // ëì ëì§ ìì¼ë©´ì í¨ì¬ ì¸ë¤.\n //\n // ì§íì´ ë¬¸ì ë¤. ìë³¸ì´ ê²½ê³ ìë ê·¸ë¼ëì¸í¸ë¼ ëª í½ì
ìì§ì¬ìë ì ì§\n // íë©´ê³¼ 구ë³
1ì´ ì ëë¤. ì ë©ì´ë¦¬ê° ì´ë¹ 6~8px ë¡ í르ë ì ëë ë¼ì¼\n // "ê°ë§í ìì§ ìë¤"ê° ì½íë¤ â ìë ìì¹ê° ëëµ ê·¸ ì§ì ì´ë¤.\n //\n // drift: íë©´ ì ì²´ê° íµì§¸ë¡ íë¥ (주기 32ì´/38ì´, ì§í 3.5%/2.8%)\n vec2 drift = vec2(0.035 * sin(tm * 0.196), 0.028 * cos(tm * 0.164));\n // flex: ì리ë§ë¤ ë°ë¦¬ë ìì´ ë¬ë¼ ë©ì´ë¦¬ê° ëì´ëê³ ëë¦°ë¤ (주기 ~21ì´)\n vec2 flex = vec2(\n 0.014 * sin(uv.y * 2.6 + tm * 0.30) + 0.009 * sin(uv.x * 1.9 - tm * 0.24),\n 0.014 * cos(uv.x * 2.3 - tm * 0.26) + 0.009 * sin(uv.y * 2.9 + tm * 0.21)\n );\n\n // ê°ì¥ìë¦¬ë¡ ê°ìë¡ ë°ë¦¼ì 0ì¼ë¡ ì¤ì¸ë¤. ì ê·¸ë¬ë©´ í
ì¤ì² ë°ê¹¥ì ì§ì´ì\n // ë í½ì
ì´ ëì´ë ë ê° í
ë리ì ì긴ë¤(NPOT ì´ë¼ CLAMP ë°ì 못 ì´ë¤).\n vec2 fade2 = smoothstep(vec2(0.0), vec2(0.15), uv) * smoothstep(vec2(1.0), vec2(0.85), uv);\n float fade = fade2.x * fade2.y;\n\n // 6% ì ë ë¹ê²¨ ëë©´ ë°ë¦´ ì¬ì ê° ì긴ë¤. í릿í ê·¸ë¼ëì¸í¸ë¼ ì´ ì ë\n // íëë ëì ëì§ ìëë¤.\n float breath = 1.06 + 0.022 * sin(tm * 0.19);\n t = (t - 0.5) / breath + 0.5 + (drift + flex) * fade * uAmbient;\n\n // ââ êµ´ì ë ì¦ ââ\n // 커ì를 í¥í´ ì¢í를 ë¹ê²¨ ì¤ë©´ ê·¸ ìë¦¬ê° íëë¼ ë³´ì¸ë¤. ê°ì¥ì리ììë\n // ë¹ê¹ì´ 0 ì´ ëëë¡ íë¡íì¼ì ì ê³±í´ ê²½ê³ì ì´ ìê¸°ì§ ìê² íë¤.\n vec2 md = vec2((uv.x - uMouse.x) * canvasA, uv.y - uMouse.y);\n float d = length(md);\n float r = clamp(d / LENS_R, 0.0, 1.0);\n float bulge = (1.0 - r * r);\n bulge *= bulge;\n\n vec2 off = md * (-LENS_K * bulge * uHover);\n\n // ë ì¦ í
ë리ì ìì êµ´ì ë . ì 리 ê°ì¥ì리ì²ë¼ ë°ê¹¥ì¼ë¡ ì주 ì¡°ê¸ ë¯¼ë¤.\n float rim = smoothstep(0.70, 0.96, r) * (1.0 - r) * 3.5;\n off += (md / max(d, 1e-4)) * rim * 0.010 * uHover;\n\n t += vec2(off.x / canvasA, off.y);\n\n gl_FragColor = texture2D(uTex, clamp(t, 0.0, 1.0));\n}\n');if(!u||!m)return;let c=i.createProgram();if(i.attachShader(c,u),i.attachShader(c,m),i.linkProgram(c),!i.getProgramParameter(c,i.LINK_STATUS)){console.error("[BrandImageLens] link:",i.getProgramInfoLog(c));return}i.useProgram(c);let f=i.createBuffer();i.bindBuffer(i.ARRAY_BUFFER,f),i.bufferData(i.ARRAY_BUFFER,new Float32Array([-1,-1,3,-1,-1,3]),i.STATIC_DRAW);let d=i.getAttribLocation(c,"aPos");i.enableVertexAttribArray(d),i.vertexAttribPointer(d,2,i.FLOAT,!1,0,0);let s=i.getUniformLocation(c,"uRes"),v=i.getUniformLocation(c,"uTexSize"),h=i.getUniformLocation(c,"uTime"),E=i.getUniformLocation(c,"uMouse"),g=i.getUniformLocation(c,"uHover"),x=i.getUniformLocation(c,"uAmbient"),T="function"==typeof window.matchMedia&&window.matchMedia("(prefers-reduced-motion: reduce)").matches,A=i.createTexture();i.bindTexture(i.TEXTURE_2D,A),i.texParameteri(i.TEXTURE_2D,i.TEXTURE_WRAP_S,i.CLAMP_TO_EDGE),i.texParameteri(i.TEXTURE_2D,i.TEXTURE_WRAP_T,i.CLAMP_TO_EDGE),i.texParameteri(i.TEXTURE_2D,i.TEXTURE_MIN_FILTER,i.LINEAR),i.texParameteri(i.TEXTURE_2D,i.TEXTURE_MAG_FILTER,i.LINEAR);let R={x:.5,y:.5,hover:0},L={x:.5,y:.5,hover:0},p=e=>{let t=a.getBoundingClientRect();if(0===t.width||0===t.height)return;R.x=(e.clientX-t.left)/t.width,R.y=1-(e.clientY-t.top)/t.height;let n=e.clientX>=t.left-90&&e.clientX<=t.right+90&&e.clientY>=t.top-90&&e.clientY<=t.bottom+90;R.hover=n?1:0},_=()=>{R.hover=0};window.addEventListener("pointermove",p,{passive:!0}),a.addEventListener("pointerleave",_);let w=0,b=0,S=()=>{let e=a.getBoundingClientRect(),t=Math.min(window.devicePixelRatio||1,1.5),n=Math.max(1,Math.round(e.width*t)),r=Math.max(1,Math.round(e.height*t));(n!==w||r!==b)&&(w=n,b=r,a.width=n,a.height=r,i.viewport(0,0,n,r))};S();let y=new ResizeObserver(S);y.observe(a);let P=0,M=!0,U=!1,I=performance.now(),D=I,F=e=>{i.bindTexture(i.TEXTURE_2D,A),i.pixelStorei(i.UNPACK_FLIP_Y_WEBGL,1),i.texImage2D(i.TEXTURE_2D,0,i.RGBA,i.RGBA,i.UNSIGNED_BYTE,e),i.uniform2f(v,e.naturalWidth,e.naturalHeight),U=!0,n(!0)},N=null!==(r=null===(t=a.parentElement)||void 0===t?void 0:t.querySelector("img"))&&void 0!==r?r:null,X=null,C=null;
1N instanceof HTMLImageElement?N.complete&&N.naturalWidth>0?F(N):(C=()=>F(N),N.addEventListener("load",C,{once:!0})):((X=new window.Image).decoding="async",X.onload=()=>X&&F(X),X.src="/images/brand-gradient.png");let B=e=>{if(!M||(P=requestAnimationFrame(B),!U))return;let t=Math.min((e-D)/1e3,.1);D=e;let n=1-Math.exp(-(9*t));L.x+=(R.x-L.x)*n,L.y+=(R.y-L.y)*n,L.hover+=(R.hover-L.hover)*(1-Math.exp(-(4*t))),i.uniform2f(s,w,b),i.uniform1f(h,(e-I)/1e3),i.uniform2f(E,L.x,L.y),i.uniform1f(g,L.hover),i.uniform1f(x,T?0:1),i.drawArrays(i.TRIANGLES,0,3)};P=requestAnimationFrame(B);let G=()=>{document.hidden?(M=!1,cancelAnimationFrame(P)):M||(M=!0,D=performance.now(),P=requestAnimationFrame(B))};document.addEventListener("visibilitychange",G);let H=e=>{e.preventDefault(),M=!1,cancelAnimationFrame(P),n(!1)};return a.addEventListener("webglcontextlost",H),()=>{M=!1,cancelAnimationFrame(P),X&&(X.onload=null),N instanceof HTMLImageElement&&C&&N.removeEventListener("load",C),y.disconnect(),window.removeEventListener("pointermove",p),a.removeEventListener("pointerleave",_),a.removeEventListener("webglcontextlost",H),document.removeEventListener("visibilitychange",G),i.deleteTexture(A),i.deleteBuffer(f),i.deleteProgram(c),i.deleteShader(u),i.deleteShader(m)}},[o]),o)?(0,r.jsx)("canvas",{ref:e,"aria-hidden":"true",className:"absolute inset-0 w-full h-full block",style:{opacity:t?1:0,transition:"opacity 400ms ease-out"}}):null}}}]);
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.