{"version":3,"file":"FluidGradient.C1uC9_y5.mjs","names":["useRef","useState","useCallback"],"sources":["https:/framerusercontent.com/modules/DQooYUDYw18LeUXH1wbw/Wxqf2WIw8zJ3zkHkhQvq/FluidGradient.js"],"sourcesContent":["import{jsx as _jsx}from\"react/jsx-runtime\";import{addPropertyControls,ControlType,RenderTarget}from\"framer\";import{useEffect,useRef,useCallback,useState}from\"react\";// ============================================================================\n// TOKENS\n// ============================================================================\nconst TOKENS={// Desktop DPR cap — 1.5 is plenty sharp, 2x+ wastes GPU for no visual gain\nmaxPixelRatio:1.5,intersectionThreshold:.01,intersectionRootMargin:\"100px\",// How long to wait before attempting WebGL context restore after loss (ms)\ncontextRestoreDelay:2e3,// Max restore attempts before giving up and staying on CSS fallback\nmaxRestoreAttempts:3};// ============================================================================\n// MOBILE DETECTION\n// ============================================================================\nfunction isMobile(){if(typeof window===\"undefined\")return false;return/iPhone|iPad|iPod|Android/i.test(navigator.userAgent);}// ============================================================================\n// SHADERS\n// ============================================================================\nconst vertexShaderSource=`\n  attribute vec2 position;\n  void main() {\n    gl_Position = vec4(position, 0.0, 1.0);\n  }\n`;const fragmentShaderSourceHighp=`\n  precision highp float;\n  uniform vec2 resolution;\n  uniform float time;\n  uniform vec3 color1;\n  uniform vec3 color2;\n  uniform vec3 color3;\n  uniform float speed;\n  uniform float loopDuration;\n\n  vec4 permute(vec4 x){return mod(((x*34.0)+1.0)*x, 289.0);}\n  vec4 taylorInvSqrt(vec4 r){return 1.79284291400159 - 0.85373472095314 * r;}\n\n  float snoise(vec3 v){\n    const vec2  C = vec2(1.0/6.0, 1.0/3.0);\n    const vec4  D = vec4(0.0, 0.5, 1.0, 2.0);\n    vec3 i  = floor(v + dot(v, C.yyy));\n    vec3 x0 = v - i + dot(i, C.xxx);\n    vec3 g = step(x0.yzx, x0.xyz);\n    vec3 l = 1.0 - g;\n    vec3 i1 = min(g.xyz, l.zxy);\n    vec3 i2 = max(g.xyz, l.zxy);\n    vec3 x1 = x0 - i1 + C.xxx;\n    vec3 x2 = x0 - i2 + C.yyy;\n    vec3 x3 = x0 - D.yyy;\n    i = mod(i, 289.0);\n    vec4 p = permute(permute(permute(\n              i.z + vec4(0.0, i1.z, i2.z, 1.0))\n            + i.y + vec4(0.0, i1.y, i2.y, 1.0))\n            + i.x + vec4(0.0, i1.x, i2.x, 1.0));\n    float n_ = 1.0/7.0;\n    vec3 ns = n_ * D.wyz - D.xzx;\n    vec4 j = p - 49.0 * floor(p * ns.z * ns.z);\n    vec4 x_ = floor(j * ns.z);\n    vec4 y_ = floor(j - 7.0 * x_);\n    vec4 x = x_ * ns.x + ns.y;\n    vec4 y = y_ * ns.x + ns.y;\n    vec4 h = 1.0 - abs(x) - abs(y);\n    vec4 b0 = vec4(x.xy, y.xy);\n    vec4 b1 = vec4(x.zw, y.zw);\n    vec4 s0 = floor(b0)*2.0 + 1.0;\n    vec4 s1 = floor(b1)*2.0 + 1.0;\n    vec4 sh = -step(h, vec4(0.0));\n    vec4 a0 = b0.xzyw + s0.xzyw*sh.xxyy;\n    vec4 a1 = b1.xzyw + s1.xzyw*sh.zzww;\n    vec3 p0 = vec3(a0.xy, h.x);\n    vec3 p1 = vec3(a0.zw, h.y);\n    vec3 p2 = vec3(a1.xy, h.z);\n    vec3 p3 = vec3(a1.zw, h.w);\n    vec4 norm = taylorInvSqrt(vec4(dot(p0,p0), dot(p1,p1), dot(p2,p2), dot(p3,p3)));\n    p0 *= norm.x; p1 *= norm.y; p2 *= norm.z; p3 *= norm.w;\n    vec4 m = max(0.6 - vec4(dot(x0,x0), dot(x1,x1), dot(x2,x2), dot(x3,x3)), 0.0);\n    m = m * m;\n    return 42.0 * dot(m*m, vec4(dot(p0,x0), dot(p1,x1), dot(p2,x2), dot(p3,x3)));\n  }\n\n  void main() {\n    vec2 uv = gl_FragCoord.xy / resolution.xy;\n    float aspect = resolution.x / resolution.y;\n    uv.x *= aspect;\n    float angle = time * 2.0 * 3.14159265 / loopDuration;\n    float s2 = speed * speed;\n    vec2 loopOffset = vec2(cos(angle), sin(angle)) * s2 * 1.5;\n    float n1 = snoise(vec3(uv * 1.2 + loopOffset, sin(angle) * 0.5 * s2));\n    float n2 = snoise(vec3(uv * 1.8 - loopOffset * 0.7, cos(angle) * 0.5 * s2 + 10.0));\n    float n3 = snoise(vec3(uv * 0.5 + loopOffset * 1.5, sin(angle + 1.0) * 0.3 * s2 - 5.0));\n    float mix1 = smoothstep(-0.4, 0.4, n1);\n    float mix2 = smoothstep(-0.4, 0.4, n2);\n    float mix3 = smoothstep(-0.4, 0.4, n3);\n    vec3 finalColor = mix(color1, color2, mix1);\n    finalColor = mix(finalColor, color3, mix2 * 0.6);\n    finalColor = mix(finalColor, color1, mix3 * 0.4);\n    gl_FragColor = vec4(finalColor, 1.0);\n  }\n`;// ============================================================================\n// COLOR PARSING\n// ============================================================================\nfunction parseColor(input){if(!input)return[1,1,1];if(input.startsWith(\"#\")){const hex=input.slice(1);const full=hex.length===3?hex.split(\"\").map(c=>c+c).join(\"\"):hex;const r=parseInt(full.slice(0,2),16)/255;const g=parseInt(full.slice(2,4),16)/255;const b=parseInt(full.slice(4,6),16)/255;return[r,g,b];}const match=input.match(/(\\d+(?:\\.\\d+)?)/g);if(match&&match.length>=3){return[parseFloat(match[0])/255,parseFloat(match[1])/255,parseFloat(match[2])/255];}return[1,1,1];}// Build a CSS gradient that closely approximates the WebGL fluid gradient's\n// mid-loop appearance. Layered radial gradients mimic the noise blob distribution.\nfunction buildFallbackGradient(c1,c2,c3){return[`radial-gradient(ellipse 80% 60% at 15% 85%, ${c1} 0%, transparent 65%)`,`radial-gradient(ellipse 60% 50% at 85% 75%, ${c1} 0%, transparent 60%)`,`radial-gradient(ellipse 90% 40% at 50% 100%, ${c3} 0%, transparent 70%)`,`radial-gradient(ellipse 70% 60% at 30% 60%, ${c3}99 0%, transparent 55%)`,`radial-gradient(ellipse 100% 80% at 50% 80%, ${c3}55 0%, transparent 80%)`,c2].join(\", \");}/**\n * @framerDisableUnlink\n * @framerIntrinsicWidth 600\n * @framerIntrinsicHeight 400\n * @framerSupportedLayoutWidth any\n * @framerSupportedLayoutHeight any\n */export default function FluidGradient(props){const{color1,color2,color3,speed,loopDuration,pauseOffscreen,style}=props;const isCanvas=RenderTarget.current()===RenderTarget.canvas;const canvasRef=useRef(null);const containerRef=useRef(null);const glRef=useRef(null);const programRef=useRef(null);const rafRef=useRef(null);const timeRef=useRef(0);const lastTimeRef=useRef(0);const isVisibleRef=useRef(true);const restoreAttemptsRef=useRef(0);const restoreTimerRef=useRef(null);// showFallback: true = CSS gradient visible, canvas hidden\n// Starts true so there's no flash of white during WebGL init\nconst[showFallback,setShowFallback]=useState(true);const propsRef=useRef({color1,color2,color3,speed,loopDuration});useEffect(()=>{propsRef.current={color1,color2,color3,speed,loopDuration};},[color1,color2,color3,speed,loopDuration]);// -------------------------------------------------------------------------\n// Core WebGL init — extracted so it can be called both on mount and on\n// context restore. Returns a cleanup function.\n// -------------------------------------------------------------------------\nconst initWebGL=useCallback(()=>{const canvas=canvasRef.current;const container=containerRef.current;if(!canvas||!container)return null;const mobile=isMobile();// On mobile, skip WebGL entirely — CSS fallback is already showing and\n// looks identical. This avoids Safari's context budget limit on phones.\nif(mobile)return null;const dprCap=TOKENS.maxPixelRatio;const fragmentSource=fragmentShaderSourceHighp;const gl=(()=>{try{return canvas.getContext(\"webgl\",{preserveDrawingBuffer:false,antialias:false,premultipliedAlpha:true,// low-power hint reduces Safari's tendency to kill the context\npowerPreference:\"low-power\",// failIfMajorPerformanceCaveat: don't get a software-rendered context\nfailIfMajorPerformanceCaveat:false});}catch(err){// Safari throws (not just returns null) when contexts are exhausted\nreturn null;}})();if(!gl||gl.isContextLost()){// Can't get a context — stay on CSS fallback. No render loop, no errors.\nreturn null;}glRef.current=gl;const compile=(type,source)=>{const shader=gl.createShader(type);if(!shader)return null;gl.shaderSource(shader,source);gl.compileShader(shader);if(!gl.getShaderParameter(shader,gl.COMPILE_STATUS)){console.error(\"FluidGradient shader error:\",gl.getShaderInfoLog(shader));gl.deleteShader(shader);return null;}return shader;};const vs=compile(gl.VERTEX_SHADER,vertexShaderSource);const fs=compile(gl.FRAGMENT_SHADER,fragmentSource);if(!vs||!fs)return null;const program=gl.createProgram();if(!program)return null;gl.attachShader(program,vs);gl.attachShader(program,fs);gl.linkProgram(program);if(!gl.getProgramParameter(program,gl.LINK_STATUS))return null;programRef.current=program;const buffer=gl.createBuffer();gl.bindBuffer(gl.ARRAY_BUFFER,buffer);gl.bufferData(gl.ARRAY_BUFFER,new Float32Array([-1,-1,1,-1,-1,1,-1,1,1,-1,1,1]),gl.STATIC_DRAW);const positionLoc=gl.getAttribLocation(program,\"position\");gl.enableVertexAttribArray(positionLoc);gl.vertexAttribPointer(positionLoc,2,gl.FLOAT,false,0,0);const resize=()=>{const rect=container.getBoundingClientRect();const dpr=Math.min(window.devicePixelRatio||1,dprCap);const w=Math.max(1,Math.floor(rect.width*dpr));const h=Math.max(1,Math.floor(rect.height*dpr));if(canvas.width!==w||canvas.height!==h){canvas.width=w;canvas.height=h;gl.viewport(0,0,w,h);}};resize();const ro=new ResizeObserver(resize);ro.observe(container);// WebGL is ready — hide the CSS fallback\nsetShowFallback(false);restoreAttemptsRef.current=0;return()=>{ro.disconnect();// Don't call loseContext here — we only do that on explicit unmount\ngl.deleteProgram(program);gl.deleteShader(vs);gl.deleteShader(fs);gl.deleteBuffer(buffer);glRef.current=null;programRef.current=null;};},[]);// -------------------------------------------------------------------------\n// Render loop\n// -------------------------------------------------------------------------\nconst renderFrame=useCallback(t=>{const gl=glRef.current;const program=programRef.current;const canvas=canvasRef.current;// If context is lost, gl calls silently fail — skip drawing entirely\nif(!gl||!program||!canvas||gl.isContextLost()){rafRef.current=requestAnimationFrame(renderFrame);return;}const{color1:c1,color2:c2,color3:c3,speed:sp,loopDuration:ld}=propsRef.current;if(isVisibleRef.current){const delta=lastTimeRef.current?(t-lastTimeRef.current)/1e3:0;const safeDelta=Math.min(delta,.1);timeRef.current=(timeRef.current+safeDelta)%ld;}lastTimeRef.current=t;if(!isVisibleRef.current){rafRef.current=requestAnimationFrame(renderFrame);return;}gl.useProgram(program);gl.uniform2f(gl.getUniformLocation(program,\"resolution\"),canvas.width,canvas.height);gl.uniform1f(gl.getUniformLocation(program,\"time\"),timeRef.current);gl.uniform1f(gl.getUniformLocation(program,\"loopDuration\"),ld);gl.uniform1f(gl.getUniformLocation(program,\"speed\"),sp);gl.uniform3fv(gl.getUniformLocation(program,\"color1\"),parseColor(c1));gl.uniform3fv(gl.getUniformLocation(program,\"color2\"),parseColor(c2));gl.uniform3fv(gl.getUniformLocation(program,\"color3\"),parseColor(c3));gl.drawArrays(gl.TRIANGLES,0,6);rafRef.current=requestAnimationFrame(renderFrame);},[]);// -------------------------------------------------------------------------\n// Mount: init WebGL + start render loop + attach context loss handlers\n// -------------------------------------------------------------------------\nuseEffect(()=>{const canvas=canvasRef.current;if(!canvas)return;let cleanupGL=initWebGL();// Only start the render loop if WebGL actually came up.\n// Otherwise we stay on the CSS fallback silently — no error spam.\nif(cleanupGL){rafRef.current=requestAnimationFrame(renderFrame);}// ---- Context lost handler ----\n// Fired by the browser when it reclaims the GPU context.\n// We must call preventDefault() to signal we want to restore later.\nconst handleContextLost=e=>{e.preventDefault()// required to allow restore\n;setShowFallback(true)// immediately show CSS gradient — no white flash\n;// Cancel the render loop so we stop hammering a dead context\nif(rafRef.current){cancelAnimationFrame(rafRef.current);rafRef.current=null;}glRef.current=null;programRef.current=null;// Schedule a restore attempt if we haven't hit the limit\nif(restoreAttemptsRef.current<TOKENS.maxRestoreAttempts){restoreAttemptsRef.current++;restoreTimerRef.current=setTimeout(()=>{const ext=canvas.getContext(\"webgl\");if(ext){// Trigger the contextrestored path\nconst loseExt=ext.getExtension(\"WEBGL_lose_context\");if(loseExt)loseExt.restoreContext();}},TOKENS.contextRestoreDelay);}// If max attempts reached, we stay on CSS fallback — still looks fine\n};// ---- Context restored handler ----\n// Fired after a successful restore. Reinit everything from scratch.\nconst handleContextRestored=()=>{if(cleanupGL)cleanupGL();cleanupGL=initWebGL();if(cleanupGL){// Resume render loop\nrafRef.current=requestAnimationFrame(renderFrame);}};canvas.addEventListener(\"webglcontextlost\",handleContextLost);canvas.addEventListener(\"webglcontextrestored\",handleContextRestored);return()=>{if(rafRef.current)cancelAnimationFrame(rafRef.current);if(restoreTimerRef.current)clearTimeout(restoreTimerRef.current);canvas.removeEventListener(\"webglcontextlost\",handleContextLost);canvas.removeEventListener(\"webglcontextrestored\",handleContextRestored);if(cleanupGL)cleanupGL();// Explicitly release context on unmount to free the slot for other instances\nconst gl=glRef.current;if(gl){const loseCtx=gl.getExtension(\"WEBGL_lose_context\");if(loseCtx)loseCtx.loseContext();}};},[initWebGL,renderFrame]);// -------------------------------------------------------------------------\n// Visibility / offscreen pause\n// -------------------------------------------------------------------------\nuseEffect(()=>{if(!pauseOffscreen){isVisibleRef.current=true;return;}const container=containerRef.current;if(!container)return;if(isCanvas){isVisibleRef.current=true;return;}const observer=new IntersectionObserver(entries=>{isVisibleRef.current=entries[0]?.isIntersecting??true;},{threshold:TOKENS.intersectionThreshold,rootMargin:TOKENS.intersectionRootMargin});observer.observe(container);return()=>observer.disconnect();},[pauseOffscreen,isCanvas]);const fallbackBg=buildFallbackGradient(color1,color2,color3);return /*#__PURE__*/_jsx(\"div\",{ref:containerRef,style:{position:\"relative\",width:\"100%\",height:\"100%\",overflow:\"hidden\",// CSS fallback always present underneath — zero cost, instant\nbackground:fallbackBg,...style},children:/*#__PURE__*/_jsx(\"canvas\",{ref:canvasRef,style:{display:\"block\",width:\"100%\",height:\"100%\",// Canvas sits on top of the CSS fallback.\n// When context is lost, canvas goes transparent → fallback shows through.\nopacity:showFallback?0:1,transition:\"opacity 0.4s ease\"}})});}FluidGradient.defaultProps={color1:\"#FF6321\",color2:\"#D9D4C7\",color3:\"#FF9E64\",speed:.5,loopDuration:5,pauseOffscreen:true};addPropertyControls(FluidGradient,{color1:{type:ControlType.Color,title:\"Color 1\",defaultValue:\"#FF6321\"},color2:{type:ControlType.Color,title:\"Color 2\",defaultValue:\"#D9D4C7\"},color3:{type:ControlType.Color,title:\"Color 3\",defaultValue:\"#FF9E64\"},speed:{type:ControlType.Number,title:\"Speed\",defaultValue:.5,min:0,max:1,step:.01},loopDuration:{type:ControlType.Number,title:\"Loop\",defaultValue:5,min:1,max:30,step:.5,unit:\"s\",displayStepper:true},pauseOffscreen:{type:ControlType.Boolean,title:\"Pause Offscreen\",defaultValue:true,enabledTitle:\"Yes\",disabledTitle:\"No\",description:\"Pauses animation when scrolled out of view. Recommended for performance.\"}});\nexport const __FramerMetadata__ = {\"exports\":{\"default\":{\"type\":\"reactComponent\",\"name\":\"FluidGradient\",\"slots\":[],\"annotations\":{\"framerContractVersion\":\"1\",\"framerSupportedLayoutWidth\":\"any\",\"framerDisableUnlink\":\"* @framerIntrinsicWidth 600\",\"framerIntrinsicHeight\":\"400\",\"framerSupportedLayoutHeight\":\"any\"}},\"__FramerMetadata__\":{\"type\":\"variable\"}}}\n//# sourceMappingURL=./FluidGradient.map"],"mappings":"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"}