{"version":3,"file":"LiquidMetal.FUnh8BeT.mjs","names":["useRef","useState","useCallback","u","gl"],"sources":["https:/framerusercontent.com/modules/FsukVhRzCWqc4SfmgmL9/NbxdDP6uG73LOOi54hYX/LiquidMetal.js"],"sourcesContent":["/*\n * Copyright (c) 2025 Fred Moon (x.com/fw3d). All rights reserved.\n *\n * This code is the exclusive property of Fred Moon. Any unauthorized use,\n * reproduction, modification, distribution, or incorporation into other\n * software, in whole or in part, is strictly prohibited without the express\n * written permission of the author.\n *\n * This code is provided \"AS IS\" without warranty of any kind, either\n * expressed or implied, including but not limited to the implied warranties\n * of merchantability and fitness for a particular purpose.\n *\n * For licensing inquiries, please contact Fred Moon at x.com/fw3d\n *\n * This copyright notice and permission notice shall be included in all\n * copies or substantial portions of this software.\n *\n * Note: This code uses @paper-design/shaders-react (MIT License)\n * which is subject to its own license and excluded from this copyright claim.\n */import{jsx as _jsx,jsxs as _jsxs}from\"react/jsx-runtime\";import{useEffect,useRef,useState,useCallback}from\"react\";import{addPropertyControls,ControlType}from\"framer\";// Fragment shader source with mobile precision fixes\nconst liquidFragSource=/* glsl */`#version 300 es\n#ifdef GL_ES\nprecision highp float;\n#else\nprecision mediump float;\n#endif\n\nin vec2 vUv;\nout vec4 fragColor;\n\nuniform sampler2D u_image_texture;\nuniform float u_time;\nuniform float u_ratio;\nuniform float u_img_ratio;\nuniform float u_patternScale;\nuniform float u_refraction;\nuniform float u_edge;\nuniform float u_patternBlur;\nuniform float u_liquid;\n\n#define TWO_PI 6.28318530718\n#define PI 3.14159265358979323846\n\nvec3 mod289(vec3 x) { return x - floor(x * (1. / 289.)) * 289.; }\nvec2 mod289(vec2 x) { return x - floor(x * (1. / 289.)) * 289.; }\nvec3 permute(vec3 x) { return mod289(((x*34.)+1.)*x); }\nfloat snoise(vec2 v) {\n    const vec4 C = vec4(0.211324865405187, 0.366025403784439, -0.577350269189626, 0.024390243902439);\n    vec2 i = floor(v + dot(v, C.yy));\n    vec2 x0 = v - i + dot(i, C.xx);\n    vec2 i1;\n    i1 = (x0.x > x0.y) ? vec2(1., 0.) : vec2(0., 1.);\n    vec4 x12 = x0.xyxy + C.xxzz;\n    x12.xy -= i1;\n    i = mod289(i);\n    vec3 p = permute(permute(i.y + vec3(0., i1.y, 1.)) + i.x + vec3(0., i1.x, 1.));\n    vec3 m = max(0.5 - vec3(dot(x0, x0), dot(x12.xy, x12.xy), dot(x12.zw, x12.zw)), 0.);\n    m = m*m;\n    m = m*m;\n    vec3 x = 2. * fract(p * C.www) - 1.;\n    vec3 h = abs(x) - 0.5;\n    vec3 ox = floor(x + 0.5);\n    vec3 a0 = x - ox;\n    m *= 1.79284291400159 - 0.85373472095314 * (a0*a0 + h*h);\n    vec3 g;\n    g.x = a0.x * x0.x + h.x * x0.y;\n    g.yz = a0.yz * x12.xz + h.yz * x12.yw;\n    return 130. * dot(m, g);\n}\n\nvec2 get_img_uv() {\n    vec2 img_uv = vUv;\n    img_uv -= .5;\n    if (u_ratio > u_img_ratio) {\n        img_uv.x = img_uv.x * u_ratio / u_img_ratio;\n    } else {\n        img_uv.y = img_uv.y * u_img_ratio / u_ratio;\n    }\n    float scale_factor = 1.;\n    img_uv *= scale_factor;\n    img_uv += .5;\n    img_uv.y = 1. - img_uv.y;\n    return img_uv;\n}\n\nvec2 rotate(vec2 uv, float th) {\n    return mat2(cos(th), sin(th), -sin(th), cos(th)) * uv;\n}\n\nfloat get_color_channel(float c1, float c2, float stripe_p, vec3 w, float extra_blur, float b) {\n    float ch = c2;\n    float border = 0.;\n    float blur = u_patternBlur + extra_blur;\n\n    ch = mix(ch, c1, smoothstep(.0, blur, stripe_p));\n\n    border = w[0];\n    ch = mix(ch, c2, smoothstep(border - blur, border + blur, stripe_p));\n\n    b = smoothstep(.2, .8, b);\n    border = w[0] + .4 * (1. - b) * w[1];\n    ch = mix(ch, c1, smoothstep(border - blur, border + blur, stripe_p));\n\n    border = w[0] + .5 * (1. - b) * w[1];\n    ch = mix(ch, c2, smoothstep(border - blur, border + blur, stripe_p));\n\n    border = w[0] + w[1];\n    ch = mix(ch, c1, smoothstep(border - blur, border + blur, stripe_p));\n\n    float gradient_t = (stripe_p - w[0] - w[1]) / w[2];\n    float gradient = mix(c1, c2, smoothstep(0., 1., gradient_t));\n    ch = mix(ch, gradient, smoothstep(border - blur, border + blur, stripe_p));\n\n    return ch;\n}\n\nfloat get_img_frame_alpha(vec2 uv, float img_frame_width) {\n    float img_frame_alpha = smoothstep(0., img_frame_width, uv.x) * smoothstep(1., 1. - img_frame_width, uv.x);\n    img_frame_alpha *= smoothstep(0., img_frame_width, uv.y) * smoothstep(1., 1. - img_frame_width, uv.y);\n    return img_frame_alpha;\n}\n\nvoid main() {\n    vec2 uv = vUv;\n    uv.y = 1. - uv.y;\n    uv.x *= u_ratio;\n\n    float diagonal = uv.x - uv.y;\n    \n    // Mobile fix: normalize time to prevent precision issues\n    float t = .001 * mod(u_time, 10000.0);\n    \n    vec2 img_uv = get_img_uv();\n    vec4 img = texture(u_image_texture, img_uv);\n\n    vec3 color = vec3(0.);\n    float opacity = 1.;\n\n    vec3 color1 = vec3(.98, 0.98, 1.);\n    vec3 color2 = vec3(.1, .1, .1 + .1 * smoothstep(.7, 1.3, uv.x + uv.y));\n\n    float edge = img.r;\n\n    vec2 grad_uv = uv;\n    grad_uv -= .5;\n\n    float dist = length(grad_uv + vec2(0., .2 * diagonal));\n    grad_uv = rotate(grad_uv, (.25 - .2 * diagonal) * PI);\n\n    float bulge = pow(1.8 * dist, 1.2);\n    bulge = 1. - bulge;\n    bulge *= pow(uv.y, .3);\n\n    float cycle_width = u_patternScale;\n    float thin_strip_1_ratio = .12 / cycle_width * (1. - .4 * bulge);\n    float thin_strip_2_ratio = .07 / cycle_width * (1. + .4 * bulge);\n    float wide_strip_ratio = (1. - thin_strip_1_ratio - thin_strip_2_ratio);\n\n    float thin_strip_1_width = cycle_width * thin_strip_1_ratio;\n    float thin_strip_2_width = cycle_width * thin_strip_2_ratio;\n\n    opacity = 1. - smoothstep(.9 - .5 * u_edge, 1. - .5 * u_edge, edge);\n    opacity *= get_img_frame_alpha(img_uv, 0.01);\n\n    float noise = snoise(uv - t);\n    edge += (1. - edge) * u_liquid * noise;\n\n    float refr = 0.;\n    refr += (1. - bulge);\n    refr = clamp(refr, 0., 1.);\n\n    float dir = grad_uv.x;\n    dir += diagonal;\n    dir -= 2. * noise * diagonal * (smoothstep(0., 1., edge) * smoothstep(1., 0., edge));\n\n    bulge *= clamp(pow(uv.y, .1), .3, 1.);\n    dir *= (.1 + (1.1 - edge) * bulge);\n    dir *= smoothstep(1., .7, edge);\n    dir += .18 * (smoothstep(.1, .2, uv.y) * smoothstep(.4, .2, uv.y));\n    dir += .03 * (smoothstep(.1, .2, 1. - uv.y) * smoothstep(.4, .2, 1. - uv.y));\n    dir *= (.5 + .5 * pow(uv.y, 2.));\n    dir *= cycle_width;\n    dir -= t;\n\n    float refr_r = refr;\n    refr_r += .03 * bulge * noise;\n    float refr_b = 1.3 * refr;\n\n    refr_r += 5. * (smoothstep(-.1, .2, uv.y) * smoothstep(.5, .1, uv.y)) * (smoothstep(.4, .6, bulge) * smoothstep(1., .4, bulge));\n    refr_r -= diagonal;\n\n    refr_b += (smoothstep(0., .4, uv.y) * smoothstep(.8, .1, uv.y)) * (smoothstep(.4, .6, bulge) * smoothstep(.8, .4, bulge));\n    refr_b -= .2 * edge;\n\n    refr_r *= u_refraction;\n    refr_b *= u_refraction;\n\n    vec3 w = vec3(thin_strip_1_width, thin_strip_2_width, wide_strip_ratio);\n    w[1] -= .02 * smoothstep(.0, 1., edge + bulge);\n    float stripe_r = mod(dir + refr_r, 1.);\n    float r = get_color_channel(color1.r, color2.r, stripe_r, w, 0.02 + .03 * u_refraction * bulge, bulge);\n    float stripe_g = mod(dir, 1.);\n    float g = get_color_channel(color1.g, color2.g, stripe_g, w, 0.01 / (1. - diagonal), bulge);\n    float stripe_b = mod(dir - refr_b, 1.);\n    float b = get_color_channel(color1.b, color2.b, stripe_b, w, .01, bulge);\n\n    color = vec3(r, g, b);\n    color *= opacity;\n\n    fragColor = vec4(color, opacity);\n}\n`;// Vertex shader\nconst vertexShaderSource=`#version 300 es\nprecision mediump float;\n\nin vec2 a_position;\nout vec2 vUv;\n\nvoid main() {\n    vUv = .5 * (a_position + 1.);\n    gl_Position = vec4(a_position, 0.0, 1.0);\n}`;// Default shader parameters (can be overridden by props)\nconst getShaderParams=props=>({patternScale:props.patternScale,refraction:props.dispersion,edge:props.edge,patternBlur:props.patternBlur,liquid:props.liquify,speed:props.speed});/**\n * @framerDisableUnlink\n * @framerIntrinsicWidth 300\n * @framerIntrinsicHeight 300\n * @framerSupportedLayoutWidth any\n * @framerSupportedLayoutHeight any\n */export default function LiquidMetalLogo(props){const{imageSource,speed,dispersion,edge,patternBlur,liquify,patternScale}=props;const canvasRef=useRef(null);const[gl,setGl]=useState(null);const[uniforms,setUniforms]=useState({});const[imageData,setImageData]=useState(null);const[processing,setProcessing]=useState(false);const totalAnimationTime=useRef(0);const lastRenderTime=useRef(0);// Create default SVG image when no image is provided\nconst createDefaultSVGImage=useCallback(()=>{return new Promise((resolve,reject)=>{const svgString=`\n                <svg width=\"400\" height=\"400\" viewBox=\"0 0 400 400\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n                    <path d=\"M127.571 97.1191H272.428V169.545H200L127.571 97.1191ZM127.571 169.545H200L272.428 241.973H127.571V169.545ZM127.571 241.973H200V314.402L127.571 241.973Z\" fill=\"black\"/>\n                </svg>\n            `;const blob=new Blob([svgString],{type:\"image/svg+xml\"});const file=new File([blob],\"default.svg\",{type:\"image/svg+xml\"});// Process the SVG using the same logic as uploaded images\nparseLogoImage(file).then(resolve).catch(reject);});},[]);// Image processing function (ported from parse-logo-image.ts)\nconst parseLogoImage=useCallback(file=>{const canvas=document.createElement(\"canvas\");const ctx=canvas.getContext(\"2d\");return new Promise((resolve,reject)=>{if(!file||!ctx){reject(new Error(\"Invalid file or context\"));return;}const img=new Image;img.onload=function(){// Force SVG to load at high fidelity\nif(file.type===\"image/svg+xml\"){img.width=1e3;img.height=1e3;}const MAX_SIZE=1e3;const MIN_SIZE=500;let width=img.naturalWidth;let height=img.naturalHeight;// Calculate new dimensions\nif(width>MAX_SIZE||height>MAX_SIZE||width<MIN_SIZE||height<MIN_SIZE){if(width>height){if(width>MAX_SIZE){height=Math.round(height*MAX_SIZE/width);width=MAX_SIZE;}else if(width<MIN_SIZE){height=Math.round(height*MIN_SIZE/width);width=MIN_SIZE;}}else{if(height>MAX_SIZE){width=Math.round(width*MAX_SIZE/height);height=MAX_SIZE;}else if(height<MIN_SIZE){width=Math.round(width*MIN_SIZE/height);height=MIN_SIZE;}}}canvas.width=width;canvas.height=height;// Draw the user image on an offscreen canvas\nconst shapeCanvas=document.createElement(\"canvas\");shapeCanvas.width=width;shapeCanvas.height=height;const shapeCtx=shapeCanvas.getContext(\"2d\");shapeCtx.drawImage(img,0,0,width,height);// Build the inside/outside mask\nconst shapeImageData=shapeCtx.getImageData(0,0,width,height);const data=shapeImageData.data;const shapeMask=new Array(width*height).fill(false);for(let y=0;y<height;y++){for(let x=0;x<width;x++){const idx4=(y*width+x)*4;const r=data[idx4];const g=data[idx4+1];const b=data[idx4+2];const a=data[idx4+3];if(r===255&&g===255&&b===255&&a===255||a===0){shapeMask[y*width+x]=false;}else{shapeMask[y*width+x]=true;}}}function inside(x,y){if(x<0||x>=width||y<0||y>=height)return false;return shapeMask[y*width+x];}// Identify boundary pixels\nconst boundaryMask=new Array(width*height).fill(false);for(let y=0;y<height;y++){for(let x=0;x<width;x++){const idx=y*width+x;if(!shapeMask[idx])continue;let isBoundary=false;for(let ny=y-1;ny<=y+1&&!isBoundary;ny++){for(let nx=x-1;nx<=x+1&&!isBoundary;nx++){if(!inside(nx,ny)){isBoundary=true;}}}if(isBoundary){boundaryMask[idx]=true;}}}// Poisson solve: Δu = -C\nconst u=new Float32Array(width*height).fill(0);const newU=new Float32Array(width*height).fill(0);const C=.01;const ITERATIONS=300;function getU(x,y,arr){if(x<0||x>=width||y<0||y>=height)return 0;if(!shapeMask[y*width+x])return 0;return arr[y*width+x];}for(let iter=0;iter<ITERATIONS;iter++){for(let y=0;y<height;y++){for(let x=0;x<width;x++){const idx=y*width+x;if(!shapeMask[idx]||boundaryMask[idx]){newU[idx]=0;continue;}const sumN=getU(x+1,y,u)+getU(x-1,y,u)+getU(x,y+1,u)+getU(x,y-1,u);newU[idx]=(C+sumN)/4;}}// Swap arrays\nfor(let i=0;i<width*height;i++){u[i]=newU[i];}}// Normalize and apply nonlinear remap\nlet maxVal=0;for(let i=0;i<width*height;i++){if(u[i]>maxVal)maxVal=u[i];}const alpha=2;const outImg=ctx.createImageData(width,height);for(let y=0;y<height;y++){for(let x=0;x<width;x++){const idx=y*width+x;const px=idx*4;if(!shapeMask[idx]){outImg.data[px]=255;outImg.data[px+1]=255;outImg.data[px+2]=255;outImg.data[px+3]=255;}else{const raw=u[idx]/maxVal;const remapped=Math.pow(raw,alpha);const gray=255*(1-remapped);outImg.data[px]=gray;outImg.data[px+1]=gray;outImg.data[px+2]=gray;outImg.data[px+3]=255;}}}resolve(outImg);};img.onerror=()=>reject(new Error(\"Failed to load image\"));img.src=URL.createObjectURL(file);});},[]);// Process uploaded image or use default SVG\nuseEffect(()=>{if(!imageSource){// No image uploaded, use default SVG\nsetProcessing(true);createDefaultSVGImage().then(processedImageData=>{setImageData(processedImageData);setProcessing(false);}).catch(error=>{console.error(\"Error processing default SVG:\",error);setProcessing(false);});return;}setProcessing(true);// Convert Framer image URL to blob and process\nfetch(imageSource).then(response=>response.blob()).then(blob=>{const file=new File([blob],\"image\",{type:blob.type});return parseLogoImage(file);}).then(processedImageData=>{setImageData(processedImageData);setProcessing(false);}).catch(error=>{console.error(\"Error processing image:\",error);setProcessing(false);});},[imageSource,parseLogoImage,createDefaultSVGImage]);// Initialize WebGL\nuseEffect(()=>{if(!canvasRef.current)return;const canvas=canvasRef.current;const context=canvas.getContext(\"webgl2\",{antialias:true,alpha:true,premultipliedAlpha:false});if(!context){console.error(\"WebGL2 not supported\");return;}function createShader(gl,sourceCode,type){const shader=gl.createShader(type);if(!shader)return null;gl.shaderSource(shader,sourceCode);gl.compileShader(shader);if(!gl.getShaderParameter(shader,gl.COMPILE_STATUS)){console.error(\"Shader compilation error:\",gl.getShaderInfoLog(shader));gl.deleteShader(shader);return null;}return shader;}const vertexShader=createShader(context,vertexShaderSource,context.VERTEX_SHADER);const fragmentShader=createShader(context,liquidFragSource,context.FRAGMENT_SHADER);if(!vertexShader||!fragmentShader)return;const program=context.createProgram();if(!program)return;context.attachShader(program,vertexShader);context.attachShader(program,fragmentShader);context.linkProgram(program);if(!context.getProgramParameter(program,context.LINK_STATUS)){console.error(\"Program linking error:\",context.getProgramInfoLog(program));return;}// Get uniform locations\nconst uniformLocations={};const uniformCount=context.getProgramParameter(program,context.ACTIVE_UNIFORMS);for(let i=0;i<uniformCount;i++){const uniformInfo=context.getActiveUniform(program,i);if(uniformInfo){const location=context.getUniformLocation(program,uniformInfo.name);if(location){uniformLocations[uniformInfo.name]=location;}}}// Set up vertex buffer.\nconst vertices=new Float32Array([-1,-1,1,-1,-1,1,1,1]);const vertexBuffer=context.createBuffer();context.bindBuffer(context.ARRAY_BUFFER,vertexBuffer);context.bufferData(context.ARRAY_BUFFER,vertices,context.STATIC_DRAW);context.useProgram(program);const positionLocation=context.getAttribLocation(program,\"a_position\");context.enableVertexAttribArray(positionLocation);context.bindBuffer(context.ARRAY_BUFFER,vertexBuffer);context.vertexAttribPointer(positionLocation,2,context.FLOAT,false,0,0);// Enable blending for transparency\ncontext.enable(context.BLEND);context.blendFunc(context.SRC_ALPHA,context.ONE_MINUS_SRC_ALPHA);setGl(context);setUniforms(uniformLocations);return()=>{context.deleteProgram(program);context.deleteShader(vertexShader);context.deleteShader(fragmentShader);context.deleteBuffer(vertexBuffer);};},[]);// Update uniforms\nuseEffect(()=>{if(!gl||!uniforms||Object.keys(uniforms).length===0)return;const params=getShaderParams(props);// Set shader parameters\ngl.uniform1f(uniforms.u_patternScale,params.patternScale);gl.uniform1f(uniforms.u_refraction,params.refraction);gl.uniform1f(uniforms.u_edge,params.edge);gl.uniform1f(uniforms.u_patternBlur,params.patternBlur);gl.uniform1f(uniforms.u_liquid,params.liquid);},[gl,uniforms,props]);// Handle canvas resize and image texture\nuseEffect(()=>{if(!gl||!uniforms||!canvasRef.current||!imageData)return;const canvas=canvasRef.current;const imgRatio=imageData.width/imageData.height;// Resize canvas to match container\nconst rect=canvas.getBoundingClientRect();const size=Math.min(rect.width,rect.height)*devicePixelRatio;canvas.width=size;canvas.height=size;gl.viewport(0,0,size,size);// Set ratio uniforms\ngl.uniform1f(uniforms.u_ratio,1);gl.uniform1f(uniforms.u_img_ratio,imgRatio);// Create and upload texture\nconst texture=gl.createTexture();gl.activeTexture(gl.TEXTURE0);gl.bindTexture(gl.TEXTURE_2D,texture);gl.texParameteri(gl.TEXTURE_2D,gl.TEXTURE_MIN_FILTER,gl.LINEAR);gl.texParameteri(gl.TEXTURE_2D,gl.TEXTURE_MAG_FILTER,gl.LINEAR);gl.texParameteri(gl.TEXTURE_2D,gl.TEXTURE_WRAP_S,gl.CLAMP_TO_EDGE);gl.texParameteri(gl.TEXTURE_2D,gl.TEXTURE_WRAP_T,gl.CLAMP_TO_EDGE);gl.pixelStorei(gl.UNPACK_ALIGNMENT,1);gl.texImage2D(gl.TEXTURE_2D,0,gl.RGBA,imageData.width,imageData.height,0,gl.RGBA,gl.UNSIGNED_BYTE,imageData.data);gl.uniform1i(uniforms.u_image_texture,0);return()=>{if(texture)gl.deleteTexture(texture);};},[gl,uniforms,imageData]);// Animation loop with enhanced mobile stability\nuseEffect(()=>{if(!gl||!uniforms||!imageData)return;let animationId;const animate=currentTime=>{const deltaTime=currentTime-lastRenderTime.current;lastRenderTime.current=currentTime;// Enhanced mobile time handling\ntotalAnimationTime.current+=deltaTime*speed;// Keep time in a smaller range for better mobile precision\nconst normalizedTime=totalAnimationTime.current%1e4;gl.uniform1f(uniforms.u_time,normalizedTime);// Clear with transparent background\ngl.clearColor(0,0,0,0);gl.clear(gl.COLOR_BUFFER_BIT);// Draw\ngl.drawArrays(gl.TRIANGLE_STRIP,0,4);animationId=requestAnimationFrame(animate);};lastRenderTime.current=performance.now();animationId=requestAnimationFrame(animate);return()=>{if(animationId)cancelAnimationFrame(animationId);};},[gl,uniforms,imageData,speed]);return /*#__PURE__*/_jsxs(\"div\",{style:{width:\"100%\",height:\"100%\",display:\"flex\",alignItems:\"center\",justifyContent:\"center\",position:\"relative\"},children:[processing&&/*#__PURE__*/_jsxs(\"div\",{style:{position:\"absolute\",inset:0,display:\"flex\",alignItems:\"center\",justifyContent:\"center\",backgroundColor:\"rgba(0,0,0,0.5)\",zIndex:10},children:[/*#__PURE__*/_jsx(\"div\",{style:{width:\"32px\",height:\"32px\",border:\"3px solid rgba(255,255,255,0.3)\",borderTop:\"3px solid white\",borderRadius:\"50%\",animation:\"spin 1s linear infinite\"}}),/*#__PURE__*/_jsx(\"style\",{children:`\n                            @keyframes spin {\n                                0% { transform: rotate(0deg); }\n                                100% { transform: rotate(360deg); }\n                            }\n                        `})]}),/*#__PURE__*/_jsx(\"canvas\",{ref:canvasRef,style:{width:\"100%\",height:\"100%\",objectFit:\"contain\"}})]});}LiquidMetalLogo.defaultProps={imageSource:\"\",speed:.3,dispersion:.015,edge:.4,patternBlur:.005,liquify:.07,patternScale:2};LiquidMetalLogo.displayName=\"🚀 Liquid Metal\";addPropertyControls(LiquidMetalLogo,{imageSource:{type:ControlType.Image,title:\"Logo Image\",description:\"For better results, upload an SVG or a high resolution image\"},dispersion:{type:ControlType.Number,title:\"Dispersion\",defaultValue:.015,min:0,max:.06,step:.001,displayStepper:true},edge:{type:ControlType.Number,title:\"Edge\",defaultValue:.4,min:0,max:1,step:.01,displayStepper:true},patternBlur:{type:ControlType.Number,title:\"Pattern Blur\",defaultValue:.005,min:0,max:.05,step:.001,displayStepper:true},liquify:{type:ControlType.Number,title:\"Liquify\",defaultValue:.07,min:0,max:1,step:.01,displayStepper:true},speed:{type:ControlType.Number,title:\"Speed\",defaultValue:.3,min:0,max:1,step:.01,displayStepper:true},patternScale:{type:ControlType.Number,title:\"Pattern Scale\",defaultValue:2,min:1,max:10,step:.1,displayStepper:true,description:\"v1.1\\nShader by [paper.design](https://paper.design)\\nPorted to Framer by [Fred Moon](https://x.com/fw3d)\"}});\nexport const __FramerMetadata__ = {\"exports\":{\"default\":{\"type\":\"reactComponent\",\"name\":\"LiquidMetalLogo\",\"slots\":[],\"annotations\":{\"framerContractVersion\":\"1\",\"framerDisableUnlink\":\"* @framerIntrinsicWidth 300\",\"framerIntrinsicHeight\":\"300\",\"framerSupportedLayoutWidth\":\"any\",\"framerSupportedLayoutHeight\":\"any\"}},\"__FramerMetadata__\":{\"type\":\"variable\"}}}\n//# sourceMappingURL=./LiquidMetal.map"],"mappings":"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"}