{"version":3,"file":"LogoGradient.JWR96AHi.mjs","names":["useRef","useLayoutEffect","useEffect"],"sources":["https:/framerusercontent.com/modules/9zyIBZtySL9j2ozjOFg5/Y39Pj1U0Ql8Y2Vzxg3g1/ScrollBlur.js","https:/framerusercontent.com/modules/qbISo04IgXwHvt1f08Bw/PqHx9uwswPwEixzYIrpZ/GradientWave.js","https:/framerusercontent.com/modules/VHx6h9GDKMSkp9munUQE/iuO6cUEY1gVzApkGCZgp/LogoGradient.js"],"sourcesContent":["import{jsx as _jsx,jsxs as _jsxs}from\"react/jsx-runtime\";import{addPropertyControls,ControlType,RenderTarget}from\"framer\";import{useEffect,useLayoutEffect,useRef}from\"react\";import{animate,useMotionValue}from\"framer-motion\";// Number of stacked layers used to build the soft progressive falloff.\nconst LAYERS=6;// Avoids the SSR warning for useLayoutEffect on Framer's published export.\nconst useIsoLayoutEffect=typeof window!==\"undefined\"?useLayoutEffect:useEffect;/**\n * SCROLL BLUR\n *\n * A soft progressive blur that fills its own frame and fades in while the\n * visitor scrolls, then gently melts away a moment after they stop.\n *\n * Direction flips which edge the blur is anchored to (bottom or top); it is\n * just the gradient direction of the layer masks, mirrored.\n *\n * Tint (optional) lays a color over the blur, strongest at the anchored edge\n * and fading out the same way. Its opacity follows the scroll, so it fades in\n * and out together with the blur.\n *\n * The fade is driven by a Framer Motion value mapped onto a CSS variable that\n * scales the blur RADIUS. Fade In / Fade Out use Framer's native Transition\n * controls. (Opacity on the blur stack is deliberately NOT animated: that would\n * isolate the container and leave backdrop-filter with no page content to\n * sample. The tint is a sibling layer, not an ancestor, so animating ITS\n * opacity is safe.)\n *\n * @framerSupportedLayoutWidth any-prefer-fixed\n * @framerSupportedLayoutHeight any-prefer-fixed\n * @framerIntrinsicWidth 1200\n * @framerIntrinsicHeight 200\n */export default function ScrollBlur(props){const{blur=12,direction=\"bottom\",tintEnabled=false,tint=\"rgba(0,0,0,0.45)\",fadeIn,fadeOut}=props;const isCanvas=RenderTarget.current()===RenderTarget.canvas;const containerRef=useRef(null);const sb=useMotionValue(0)// 0..1 blur strength\n;const active=useRef(false)// currently scrolling?\n;const idle=useRef(null);const controls=useRef(null);// Mirror the motion value onto a CSS variable (clamped >= 0 so a spring\n// undershoot can't produce an invalid negative blur radius). On the canvas\n// we hold it at full strength so the blur is visible while editing.\nuseIsoLayoutEffect(()=>{const node=containerRef.current;if(!node)return;const write=v=>node.style.setProperty(\"--sb\",String(Math.max(0,v)));write(sb.get());const unsub=sb.on(\"change\",write);if(isCanvas)sb.set(1);return unsub;},[isCanvas,sb]);useEffect(()=>{if(isCanvas)return;// Keep treating it as \"still scrolling\" for a beat after the last\n// event, so it doesn't begin melting away between scroll events.\nconst HOLD_MS=180;const clearIdle=()=>{if(idle.current){clearTimeout(idle.current);idle.current=null;}};const onScroll=()=>{// Animate up only once when we transition from idle -> scrolling,\n// so continuous scrolling doesn't restart the spring every event.\nif(!active.current){active.current=true;controls.current=animate(sb,1,fadeIn);}clearIdle();idle.current=setTimeout(()=>{active.current=false;controls.current=animate(sb,0,fadeOut);},HOLD_MS);};// capture:true also catches scrolling inside an inner scroll container\n// (Framer often scrolls a wrapper element rather than the window).\nconst opts={passive:true,capture:true};window.addEventListener(\"scroll\",onScroll,opts);return()=>{window.removeEventListener(\"scroll\",onScroll,opts);clearIdle();if(controls.current)controls.current.stop();};},[isCanvas,sb,fadeIn,fadeOut]);// Static progressive-blur layers. Each layer reaches a little less far from\n// the anchored edge than the previous one and carries a stronger blur, so\n// they compound toward that edge for a seam-free falloff. The blur radius is\n// scaled by the --sb variable so the whole stack fades in and out together.\n// \"bottom\" anchors at the bottom edge (gradient to top); \"top\" mirrors it.\nconst gradientDir=direction===\"top\"?\"to bottom\":\"to top\";const layers=[];const step=100/LAYERS;for(let i=0;i<LAYERS;i++){const b=blur*(i+1)/LAYERS;const coverTop=100-i*step;const fadeStart=Math.max(0,coverTop-step);const mask=`linear-gradient(${gradientDir}, rgba(255,255,255,1) 0%, rgba(255,255,255,1) ${fadeStart}%, rgba(255,255,255,0) ${coverTop}%)`;const filter=`blur(calc(var(--sb, 0) * ${b}px))`;layers.push(/*#__PURE__*/_jsx(\"div\",{style:{position:\"absolute\",inset:0,backdropFilter:filter,WebkitBackdropFilter:filter,WebkitMaskImage:mask,maskImage:mask}},i));}// Fills its own frame — the layer's size and pinning control everything.\nconst containerStyle={position:\"relative\",width:\"100%\",height:\"100%\",overflow:\"hidden\",pointerEvents:\"none\"};// Optional tint: a sibling layer (NOT an ancestor of the blur stack, so it\n// can't break backdrop-filter) gradient-matched to the blur direction. Its\n// opacity tracks --sb, so it fades in and out on scroll with the blur.\n// Typed `any` so the CSS-variable opacity string is allowed.\nconst tintStyle={position:\"absolute\",inset:0,background:`linear-gradient(${gradientDir}, ${tint} 0%, rgba(0,0,0,0) 100%)`,opacity:\"var(--sb, 0)\",pointerEvents:\"none\"};// Canvas-only faint fill so the (otherwise transparent) component is visible\n// and grabbable when dropped. Never shown in preview or on the published site.\nconst placeholderStyle={position:\"absolute\",inset:0,background:\"rgba(138,138,155,0.12)\",borderRadius:6,pointerEvents:\"none\"};return /*#__PURE__*/_jsxs(\"div\",{ref:containerRef,style:containerStyle,children:[layers,tintEnabled?/*#__PURE__*/_jsx(\"div\",{style:tintStyle}):null,isCanvas?/*#__PURE__*/_jsx(\"div\",{style:placeholderStyle}):null]});}ScrollBlur.defaultProps={blur:12,direction:\"bottom\",tintEnabled:false,tint:\"rgba(0,0,0,0.45)\",fadeIn:{type:\"spring\",stiffness:300,damping:30},fadeOut:{type:\"spring\",stiffness:80,damping:26}};addPropertyControls(ScrollBlur,{direction:{type:ControlType.Enum,title:\"Direction\",options:[\"bottom\",\"top\"],optionTitles:[\"↓\",\"↑\"],displaySegmentedControl:true,defaultValue:\"bottom\"},blur:{type:ControlType.Number,title:\"Blur\",min:0,max:50,step:1,unit:\"px\"},tintEnabled:{type:ControlType.Boolean,title:\"Tint\",defaultValue:false,enabledTitle:\"On\",disabledTitle:\"Off\"},tint:{type:ControlType.Color,title:\"Tint Color\",defaultValue:\"rgba(0,0,0,0.45)\",hidden:props=>!props.tintEnabled},fadeIn:{type:ControlType.Transition,title:\"Fade In\",defaultValue:{type:\"spring\",stiffness:300,damping:30}},fadeOut:{type:ControlType.Transition,title:\"Fade Out\",defaultValue:{type:\"spring\",stiffness:80,damping:26}}});\nexport const __FramerMetadata__ = {\"exports\":{\"default\":{\"type\":\"reactComponent\",\"name\":\"ScrollBlur\",\"slots\":[],\"annotations\":{\"framerContractVersion\":\"1\",\"framerSupportedLayoutHeight\":\"any-prefer-fixed\",\"framerSupportedLayoutWidth\":\"any-prefer-fixed\",\"framerIntrinsicHeight\":\"200\",\"framerIntrinsicWidth\":\"1200\"}},\"__FramerMetadata__\":{\"type\":\"variable\"}}}\n//# sourceMappingURL=./ScrollBlur.map","import{defineShader,ControlType}from\"framer\";export default defineShader({title:\"Wave Gradient\",fragment:`\n#define S(a,b,t) smoothstep(a,b,t)\n\nmat2 Rot(float a) {\n    float s = sin(a), c = cos(a);\n    return mat2(c, -s, s, c);\n}\n\nvec2 hash(vec2 p) {\n    float s = u_seed;\n    vec2 k1 = vec2(2127.1 + s * 13.37, 81.17 + s * 7.31);\n    vec2 k2 = vec2(1269.5 + s * 11.13, 283.37 + s * 5.79);\n    p = vec2(dot(p, k1), dot(p, k2));\n    return fract(sin(p) * (43758.5453 + s * 1.618));\n}\n\nfloat noise(in vec2 p) {\n    vec2 i = floor(p);\n    vec2 f = fract(p);\n    vec2 u = f * f * (3.0 - 2.0 * f);\n    float n = mix(\n        mix(dot(-1.0 + 2.0 * hash(i), f),\n            dot(-1.0 + 2.0 * hash(i + vec2(1.0, 0.0)), f - vec2(1.0, 0.0)), u.x),\n        mix(dot(-1.0 + 2.0 * hash(i + vec2(0.0, 1.0)), f - vec2(0.0, 1.0)),\n            dot(-1.0 + 2.0 * hash(i + vec2(1.0, 1.0)), f - vec2(1.0, 1.0)), u.x),\n        u.y\n    );\n    return 0.5 + 0.5 * n;\n}\n\nvec3 getColor(int idx) {\n    if (u_colors_length < 1) return vec3(0.0);\n    int safeIdx = clamp(idx, 0, u_colors_length - 1);\n    return u_colors[safeIdx].rgb;\n}\n\nfloat seedF(float base) {\n    return base * (1.0 + 0.5 * sin(u_seed * 3.17 + base));\n}\n\nvec2 warpUV(vec2 uv) {\n    float t = u_time * u_waveSpeed;\n\n    float angleOffset = sin(u_seed * 2.73) * 30.0;\n    mat2 dirRot = Rot(radians(u_waveAngle + angleOffset));\n    vec2 ruv = dirRot * uv;\n\n    float fxMod = seedF(u_waveFreqX);\n    float fyMod = seedF(u_waveFreqY);\n\n    float phaseX = fract(sin(u_seed * 7.19) * 437.58) * 6.2832;\n    float phaseY = fract(cos(u_seed * 3.41) * 291.37) * 6.2832;\n\n    // Core wave with seed-dependent harmonics\n    float harmonic = sin(u_seed * 1.23) * 0.5;\n    float a = fyMod * ruv.y - sin(ruv.x * fxMod + ruv.y - t + phaseX);\n    a += harmonic * sin(ruv.x * fxMod * 2.0 + ruv.y * 0.5 + t * 0.7 + phaseY);\n\n    // Smoothstep mask (unchanged)\n    a = smoothstep(\n        cos(a) * u_maskSoftness,\n        sin(a) * u_maskSoftness + 3.,\n        cos(a - fyMod * ruv.y) - sin(a - fxMod * ruv.x)\n    );\n\n    a *= u_waveAmplitude;\n\n    uv = cos(a) * uv + sin(a) * vec2(-uv.y, uv.x);\n    return uv;\n}\n\nvoid main() {\n    vec2 fragCoord = v_uv * u_resolution;\n    vec2 uv = fragCoord / u_resolution.xy;\n    float ratio = u_resolution.x / u_resolution.y;\n    float t = u_time * u_waveSpeed;\n\n    vec2 tuv = uv - 0.5;\n\n    vec2 seedShift = vec2(sin(u_seed * 4.37), cos(u_seed * 5.91)) * 100.0;\n    float degree = noise(vec2(t * 0.1, tuv.x * tuv.y) + seedShift);\n    tuv.y *= 1.0 / ratio;\n    tuv *= Rot(radians((degree - 0.5) * 720.0 + 180.0));\n    tuv.y *= ratio;\n\n    // Seed-rotate uv2 before warping\n    vec2 uv2 = (fragCoord * 2.0 - u_resolution.xy) / (u_resolution.x + u_resolution.y) * 2.0;\n    float preRotAngle = fract(sin(u_seed * 5.63) * 173.29) * 6.2832;\n    uv2 *= Rot(preRotAngle);\n    vec2 warped = warpUV(uv2) * 0.5 + 0.5;\n\n    vec2 blendUV = mix(tuv, warped - 0.5, u_blendAmount);\n\n    float layerRot1 = -5.0 + sin(u_seed * 1.83) * 20.0;\n    float layerRot2 = 10.0 + cos(u_seed * 2.47) * 20.0;\n\n    vec3 c0 = getColor(0);\n    vec3 c1 = getColor(1);\n    vec3 c2 = getColor(2);\n    vec3 c3 = getColor(3);\n\n    vec3 layer1 = mix(c0, c2, S(-0.3, 0.3, (blendUV * Rot(radians(layerRot1))).x));\n    vec3 layer2 = mix(c3, c1, S(-0.3, 0.3, (blendUV * Rot(radians(layerRot2))).x));\n    vec3 col = mix(layer1, layer2, S(0.3, -0.3, blendUV.y));\n\n    col = mix(col, col * col + 0.5 * sqrt(col), 0.3);\n\n    fragColor = vec4(col, 1.0);\n}\n`,propertyControls:{colors:{type:ControlType.Array,title:\"Colors\",control:{type:ControlType.Color},maxCount:4,defaultValue:[\"#FF3624\",\"#9EABFF\",\"#FFAE00\",\"#E29EFF\"]},seed:{type:ControlType.Number,title:\"Seed\",defaultValue:32,min:0,max:100,step:1},waveSpeed:{type:ControlType.Number,title:\"Speed\",defaultValue:1.5,min:0,max:3,step:.01},waveFreqX:{type:ControlType.Number,title:\"Freq X\",defaultValue:.9,min:.1,max:6,step:.1},waveFreqY:{type:ControlType.Number,title:\"Freq Y\",defaultValue:6,min:.1,max:6,step:.1},waveAngle:{type:ControlType.Number,title:\"Angle\",defaultValue:105,min:-180,max:180,step:1},waveAmplitude:{type:ControlType.Number,title:\"Amplitude\",defaultValue:2.1,min:.5,max:3,step:.01},maskSoftness:{type:ControlType.Number,title:\"Softness\",defaultValue:.74,min:.01,max:2,step:.01},blendAmount:{type:ControlType.Number,title:\"Blend\",defaultValue:.54,min:0,max:1,step:.01}}});\nexport const __FramerMetadata__ = {\"exports\":{\"default\":{\"type\":\"shader\",\"name\":null,\"annotations\":{\"framerContractVersion\":\"1\"}},\"__FramerMetadata__\":{\"type\":\"variable\"}}}\n//# sourceMappingURL=./GradientWave.map","import{defineShader,ControlType}from\"framer\";export default defineShader({title:\"Logo Gradient\",heightmapSource:\"image\",mouse:\"disabledByDefault\",buffers:[{name:\"push\",resolutionScale:.5,format:\"rgba16f\",fragment:`\nvoid main() {\n    float aspect = u_resolution.x / u_resolution.y;\n    vec2 aspectFix = vec2(aspect, 1.0);\n\n    vec2 texel = 1.0 / u_resolution;\n\n    // --- Read own previous frame + neighbours ---\n    vec4 prev = texture(u_push_buffer, v_uv);\n    vec2 c  = prev.xy;\n    vec2 nl = texture(u_push_buffer, v_uv - vec2(texel.x, 0.0)).xy;\n    vec2 nr = texture(u_push_buffer, v_uv + vec2(texel.x, 0.0)).xy;\n    vec2 nd = texture(u_push_buffer, v_uv - vec2(0.0, texel.y)).xy;\n    vec2 nu = texture(u_push_buffer, v_uv + vec2(0.0, texel.y)).xy;\n\n    vec2 blurred = (nl + nr + nd + nu) * 0.25;\n    vec2 field = mix(c, blurred, 0.12);\n\n    float r = clamp(u_deltaTime * 60.0, 0.0, 3.0);\n    float decay = pow(mix(0.86, 0.985, clamp(u_mousePersist, 0.0, 1.0)), r);\n    field *= decay;\n\n    // --- Smooth the cursor velocity (EMA) ---\n    // Raw .zw arrives in uneven per-frame pulses at low speeds; the EMA\n    // spreads each pulse over a few frames so the deposit reads as a\n    // continuous stream. ~0.25 blend per 60fps frame, frame-rate independent.\n    vec2 rawVel = u_mousePosition.zw * aspectFix * u_mouseHover;\n    float smoothK = 1.0 - pow(0.75, r); //or smoothK = 1. for original no smooth feeling\n    vec2 mouseVel = mix(prev.zw, rawVel, smoothK);\n\n    float speed    = length(mouseVel);\n    float brush    = max(u_mouseRadius * 0.1, 0.001);\n\n    float speedPerSec = speed / max(u_deltaTime, 1e-4);\n    float moving      = 1.0 - exp(-speedPerSec * 0.5);\n\n    vec2 dir       = speed > 1e-5 ? mouseVel / speed : vec2(1.0, 0.0);\n    vec2 ortho     = vec2(-dir.y, dir.x);\n\n    vec2 toMouse   = (v_uv - u_mousePosition.xy) * aspectFix;\n    //toMouse       -= dir * brush * 0.2 * moving;\n\n    float along    = dot(toMouse, dir);\n    float across   = dot(toMouse, ortho);\n    float ra       = brush * (1.0 + u_mouseStretch * moving);\n    float rb       = brush;\n    float d2       = (along * along) / (ra * ra) + (across * across) / (rb * rb);\n    float falloff  = exp(-d2);\n\n    field += mouseVel * falloff * (u_mousePush * 0.1) * u_mouseHover;\n\n    field = clamp(field, -1.0, 1.0);\n\n    fragColor = vec4(field, mouseVel);\n}\n`}],fragment:`\n// === CONSTANTS ===\nconst float GOLDEN_ANGLE = 2.3999632;\nconst float TAU = 6.28318530;\n\n// === PCG hash ===\nuvec3 hash3(uvec3 v) {\n    v = v * 1664525u + 1013904223u;\n    v.x += v.y * v.z;\n    v.y += v.z * v.x;\n    v.z += v.x * v.y;\n    v ^= v >> 16u;\n    v.x += v.y * v.z;\n    v.y += v.z * v.x;\n    v.z += v.x * v.y;\n    return v;\n}\n\nvec3 seedRandom(float seedVal) {\n    uvec3 s = uvec3(\n        floatBitsToUint(seedVal),\n        floatBitsToUint(seedVal * 1.5 + 7.31),\n        floatBitsToUint(seedVal * 2.7 + 13.37)\n    );\n    s = hash3(s);\n    return vec3(s) / float(0xFFFFFFFFu);\n}\n\n// === COLOR SPACE (Oklab/LCH) ===\n\nvec3 toLinear(vec3 c) {\n    return pow(c, vec3(2.2));\n}\n\nvec3 toSrgb(vec3 c) {\n    return pow(clamp(c, 0.0, 1.0), vec3(0.4545));\n}\n\nvec3 linearToOklab(vec3 c) {\n    float l = 0.4122214708 * c.r + 0.5363325363 * c.g + 0.0514459929 * c.b;\n    float m = 0.2119034982 * c.r + 0.6806995451 * c.g + 0.1073969566 * c.b;\n    float s = 0.0883024619 * c.r + 0.2817188376 * c.g + 0.6299787005 * c.b;\n\n    l = pow(max(l, 0.0), 1.0 / 3.0);\n    m = pow(max(m, 0.0), 1.0 / 3.0);\n    s = pow(max(s, 0.0), 1.0 / 3.0);\n\n    return vec3(\n        0.2104542553 * l + 0.7936177850 * m - 0.0040720468 * s,\n        1.9779984951 * l - 2.4285922050 * m + 0.4505937099 * s,\n        0.0259040371 * l + 0.7827717662 * m - 0.8086757660 * s\n    );\n}\n\nvec3 oklabToLinear(vec3 c) {\n    float l = c.x + 0.3963377774 * c.y + 0.2158037573 * c.z;\n    float m = c.x - 0.1055613458 * c.y - 0.0638541728 * c.z;\n    float s = c.x - 0.0894841775 * c.y - 1.2914855480 * c.z;\n\n    l = l * l * l;\n    m = m * m * m;\n    s = s * s * s;\n\n    return vec3(\n        +4.0767416621 * l - 3.3077115913 * m + 0.2309699292 * s,\n        -1.2684380046 * l + 2.6097574011 * m - 0.3413193965 * s,\n        -0.0041960863 * l - 0.7034186147 * m + 1.7076147010 * s\n    );\n}\n\nvec3 oklabToLch(vec3 lab) {\n    return vec3(lab.x, length(lab.yz), atan(lab.z, lab.y));\n}\n\nvec3 lchToOklab(vec3 lch) {\n    return vec3(lch.x, lch.y * cos(lch.z), lch.y * sin(lch.z));\n}\n\nvec3 mixLch(vec3 lab0, vec3 lab1, float t) {\n    vec3 lch0 = oklabToLch(lab0);\n    vec3 lch1 = oklabToLch(lab1);\n\n    if (lch0.y < 0.05) lch0.z = lch1.z;\n    if (lch1.y < 0.05) lch1.z = lch0.z;\n\n    float dh = lch1.z - lch0.z;\n    if (dh > 3.14159265) dh -= 6.28318530;\n    if (dh < -3.14159265) dh += 6.28318530;\n\n    return lchToOklab(vec3(\n        mix(lch0.x, lch1.x, t),\n        mix(lch0.y, lch1.y, t),\n        lch0.z + dh * t\n    ));\n}\n\n// === PALETTE ===\n\nvec3 getColor(int idx) {\n    if (u_colors_length < 1) return vec3(0.0);\n    int safeIdx = clamp(idx, 0, u_colors_length - 1);\n    return u_colors[safeIdx].rgb;\n}\n\nvec3 paletteN(float t, int count) {\n    if (count < 1) return vec3(0.0);\n    if (count < 2) return toLinear(getColor(0));\n\n    float segmentSize = 1.0 / float(count - 1);\n    t = clamp(t, 0.0, 1.0);\n    int idx = min(int(floor(t / segmentSize)), count - 2);\n    float localT = clamp((t - float(idx) * segmentSize) / segmentSize, 0.0, 1.0);\n\n    vec3 lab0 = linearToOklab(toLinear(getColor(idx)));\n    vec3 lab1 = linearToOklab(toLinear(getColor(idx + 1)));\n\n    return oklabToLinear(mixLch(lab0, lab1, localT));\n}\n\n// === POST-PROCESS ===\n\nvec3 softGamutMap(vec3 linearRgb) {\n    float maxC = max(linearRgb.r, max(linearRgb.g, linearRgb.b));\n    float minC = min(linearRgb.r, min(linearRgb.g, linearRgb.b));\n\n    if (minC >= 0.0 && maxC <= 1.0) return linearRgb;\n\n    vec3 lab = linearToOklab(max(linearRgb, 0.0));\n    float L = clamp(lab.x, 0.0, 1.0);\n    float C = length(lab.yz);\n    float h = atan(lab.z, lab.y);\n\n    float maxChroma = 0.4 * (1.0 - pow(abs(2.0 * L - 1.0), 2.0));\n\n    if (C > maxChroma * 0.7) {\n        float knee = maxChroma * 0.7;\n        C = knee + (maxChroma - knee) * tanh((C - knee) / (maxChroma - knee + 0.001));\n    }\n\n    return clamp(oklabToLinear(vec3(L, C * cos(h), C * sin(h))), 0.0, 1.0);\n}\n\n// === HEIGHTMAP HELPERS ===\n\nfloat blurDepth3x3(vec2 uv, vec2 dudx, vec2 dudy, vec2 texel, float radius) {\n    vec2 r = radius * texel;\n\n    float sum = 4.0 * textureGrad(u_image_heightmap, uv, dudx, dudy).r;\n\n    sum += 2.0 * textureGrad(u_image_heightmap, uv + vec2(0.0, -r.y), dudx, dudy).r;\n    sum += 2.0 * textureGrad(u_image_heightmap, uv + vec2(0.0,  r.y), dudx, dudy).r;\n    sum += 2.0 * textureGrad(u_image_heightmap, uv + vec2(-r.x, 0.0), dudx, dudy).r;\n    sum += 2.0 * textureGrad(u_image_heightmap, uv + vec2( r.x, 0.0), dudx, dudy).r;\n\n    sum += textureGrad(u_image_heightmap, uv + vec2(-r.x, -r.y), dudx, dudy).r;\n    sum += textureGrad(u_image_heightmap, uv + vec2( r.x, -r.y), dudx, dudy).r;\n    sum += textureGrad(u_image_heightmap, uv + vec2(-r.x,  r.y), dudx, dudy).r;\n    sum += textureGrad(u_image_heightmap, uv + vec2( r.x,  r.y), dudx, dudy).r;\n\n    return sum / 16.0;\n}\n\nvec2 heightGrad(vec2 uv, vec2 dudx, vec2 dudy, vec2 texel, float blurRadius) {\n    float eps = 4.0;\n    float dR = blurDepth3x3(uv + vec2(eps * texel.x, 0.0), dudx, dudy, texel, blurRadius);\n    float dL = blurDepth3x3(uv - vec2(eps * texel.x, 0.0), dudx, dudy, texel, blurRadius);\n    float dU = blurDepth3x3(uv + vec2(0.0, eps * texel.y), dudx, dudy, texel, blurRadius);\n    float dD = blurDepth3x3(uv - vec2(0.0, eps * texel.y), dudx, dudy, texel, blurRadius);\n    return vec2(dR - dL, dU - dD) / (2.0 * eps * texel);\n}\n\n// === MAIN ===\n\nvoid main() {\n    vec2 uv = vec2(v_uv.x, 1.0 - v_uv.y);\n    vec2 texSize = vec2(textureSize(u_image_heightmap, 0));\n    float imgAspect = texSize.x / texSize.y;\n    float canvasAspect = u_resolution.x / u_resolution.y;\n\n    if (canvasAspect > imgAspect) {\n        uv.x = (uv.x - 0.5) * (canvasAspect / imgAspect) + 0.5;\n    } else {\n        uv.y = (uv.y - 0.5) * (imgAspect / canvasAspect) + 0.5;\n    }\n\n    /*\n    if (uv.x < 0.0 || uv.x > 1.0 || uv.y < 0.0 || uv.y > 1.0) {\n        fragColor = vec4(u_colorBack.rgb * u_colorBack.a, u_colorBack.a);\n        return;\n    }\n    */\n\n    // 1.0 on DPR 2+, up to 2.0 on DPR 1\n    float aaScale = max(1.0, 2.0 / u_pixelRatio);\n\n    vec2 dudx = dFdx(uv);\n    vec2 dudy = dFdy(uv);\n\n    vec4 hm = textureGrad(u_image_heightmap, uv, dudx, dudy);\n    float fw_b = 0.5 * fwidth(hm.b);\n    float hardMask = smoothstep(0.5 - fw_b, 0.5 + fw_b, hm.b);\n    float opacity = hardMask * (1.0 - hm.g);\n\n    // Only fade at the letterbox boundary, not on the axis the image fills\n    float edgeDist;\n    if (canvasAspect > imgAspect) {\n        // Letterbox bars are left/right → only fade X edges\n        edgeDist = min(uv.x, 1.0 - uv.x);\n    } else if (canvasAspect < imgAspect) {\n        // Letterbox bars are top/bottom → only fade Y edges\n        edgeDist = min(uv.y, 1.0 - uv.y);\n    } else {\n        // Aspects match — no letterboxing, no seam, no fade needed\n        edgeDist = 1.0;\n    }\n    opacity *= smoothstep(0.0, 1.0 * fwidth(edgeDist), edgeDist);\n\n    if (opacity < 0.001) {\n        fragColor = vec4(u_colorBack.rgb * u_colorBack.a, u_colorBack.a);\n        return;\n    }\n\n    vec2 texel = 1.0 / texSize;\n    int colorCount = u_colors_length;\n\n    if (colorCount < 1) {\n        fragColor = vec4(u_colorBack.rgb * u_colorBack.a, u_colorBack.a);\n        return;\n    }\n\n    float rawDepth = blurDepth3x3(uv, dudx, dudy, texel, 6.0);\n    float depth = max(rawDepth, 0.001);\n\n    vec2 grad = heightGrad(uv, dudx, dudy, texel, 6.0);\n    float gradMag = min(length(grad), 5.0);\n    vec2 gradDir = gradMag > 0.001 ? normalize(grad) : vec2(0.0);\n    vec2 contourDir = vec2(-gradDir.y, gradDir.x);\n\n    float t = mod(u_time * u_speed, 3600.0);\n\n    // Motion mode: 0 = Random, 1 = Melt\n    float isMelt = step(0.5, u_motionMode);\n\n    // Seed\n    vec3 seedOffset = seedRandom(u_seed);\n    vec3 seedOffset2 = seedRandom(u_seed + 100.0);\n    float seedAngle = u_seed * GOLDEN_ANGLE;\n    vec2 seedPhase = (seedOffset2.xy - 0.5) * TAU;\n\n    // World-space coordinates anchored to the image\n    vec2 p = (uv - 0.5) * 2.0;\n    p.x *= imgAspect;\n\n    // Seed-based rotation\n    float cs = cos(seedAngle);\n    float sn = sin(seedAngle);\n    p = mat2(cs, -sn, sn, cs) * p;\n\n    // Angle — rotates the gradient flow direction\n    float ang = u_angle * 3.14159 / 180.0;\n    float cosA = cos(ang);\n    float sinA = sin(ang);\n    p = vec2(p.x * cosA - p.y * sinA, p.x * sinA + p.y * cosA);\n\n    // === MOUSE PUSH (fluid, from push buffer) ===\n    vec2 pf = texture(u_push_buffer, v_uv).xy;\n\n    // Buffer space is v_uv (Y-up); image uv is flipped → flip the vector's Y\n    // BEFORE any rotation, or the rotations scramble the error across axes.\n    pf.y = -pf.y;\n\n    // Buffer aspect-corrects with canvas aspect; p is in image-aspect space.\n    // On the tall-canvas branch the letterbox remap doesn't cancel it out.\n    if (canvasAspect <= imgAspect) {\n        pf *= imgAspect / canvasAspect;\n    }\n\n    pf = mat2(cs, -sn, sn, cs) * pf;                                  // seed rotation\n    pf = vec2(pf.x * cosA - pf.y * sinA, pf.x * sinA + pf.y * cosA);  // angle rotation\n    p -= pf * 2.0;\n\n\n    // Turbulence time\n    float tTurb = t * mix(1.0, 0.4, isMelt);\n\n    // Melt flow offset applied to q inside turbulence, not to p\n    vec2 meltOffset = vec2(1.0, 0.0) * t * 0.4 * isMelt;\n\n    // === SHAPE-AWARE COORDINATE WARPING ===\n    float edgeProximity = 1.0 - smoothstep(0.0, 0.8, depth);\n\n    float coordScale = max(0.4, 0.1 + depth * 1.0);\n    p *= coordScale;\n\n    p += contourDir * edgeProximity * u_bend * 2.0;\n    p -= gradDir * edgeProximity * u_bend * 0.5;\n    p *= max(0.5, mix(1.0, 0.4 + 0.6 * smoothstep(0.0, 0.5, depth), u_contour));\n\n    // === TURBULENCE ===\n    int turbIter = int(u_turbIter);\n    float freq = 1.0 / max(u_turbFreq, 0.01);\n\n    vec2 q = p * u_scale + meltOffset;\n\n    float a = seedPhase.x;\n    float d = seedPhase.y;\n\n    for (int j = 2; j < 10; j++) {\n        if (j >= turbIter) break;\n        float fj = float(j);\n        q += u_turbAmp * sin(length(q) / freq * fj + tTurb + vec2(a, d) + seedOffset.xy * fj) / fj;\n        a += cos(fj + d * 1.2 + q.x * 2.0 - tTurb + seedOffset2.z);\n        d += sin(fj * q.y + a + seedOffset.z + tTurb + seedOffset2.y);\n    }\n\n    float base = length(q.yx + vec2(a, d) * 0.2) * u_waveFreq + seedOffset.x;\n    float val = 0.5 + 0.125 * sin(base + 1.0) + 0.25 * sin(base + 4.0) + 0.125 * sin(base + 9.0);\n    val = clamp((val - 0.3) / 0.4, 0.0, 1.0);\n\n    // Depth-based intensity modulation\n    float innerIntensity = smoothstep(0.0, 0.4, depth);\n    float contourHeat = (1.0 - innerIntensity) * u_contour;\n    val = mix(val, val * innerIntensity + contourHeat, 0.5 + 0.5 * u_contour);\n\n    vec3 col = paletteN(val, colorCount);\n    col = softGamutMap(col);\n    col = toSrgb(col);\n\n    /*\n    // Silhouette AA — hardMask + clamped fwidth\n    float fw = fwidth(depth);\n    float effectMask = hardMask * smoothstep(0.0, max(fw, min(2.0 * fw, 0.1)), depth);\n    opacity *= effectMask;\n    */\n\n    // Alpha compositing\n    col *= opacity;\n    vec3 bgColor = u_colorBack.rgb * u_colorBack.a;\n    col = col + bgColor * (1.0 - opacity);\n    float finalAlpha = opacity + u_colorBack.a * (1.0 - opacity);\n\n    fragColor = vec4(col, finalAlpha);\n}\n`,propertyControls:{image:{type:ControlType.ResponsiveImage,title:\"Image\",defaultValue:\"data:framer/asset-reference,7XHsXmlUUmdQM95fkSvi3LRCuSk.svg?originalFilename=Path.svg&width=32&height=48\"},colors:{type:ControlType.Array,title:\"Colors\",control:{type:ControlType.Color},maxCount:8,defaultValue:[\"#000000\",\"#0051FF\",\"#0DAAFF\",\"#BDE4FF\"]},colorBack:{type:ControlType.Color,title:\"Background\",defaultValue:\"#000000\"},seed:{type:ControlType.Number,title:\"Seed\",defaultValue:6,min:0,max:1e3,step:1,section:\"Motion\"},speed:{type:ControlType.Number,title:\"Speed\",defaultValue:.6,min:0,max:2,step:.01,section:\"Motion\"},motionMode:{type:ControlType.Enum,title:\"Motion\",options:[0,1],optionTitles:[\"Random\",\"Directional\"],defaultValue:0,section:\"Motion\"},angle:{type:ControlType.Number,title:\"Angle\",defaultValue:20,min:0,max:360,step:1,section:\"Motion\"},scale:{type:ControlType.Number,title:\"Scale\",defaultValue:1.2,min:.1,max:2,step:.01,section:\"Motion\"},turbAmp:{type:ControlType.Number,title:\"Amplitude\",defaultValue:.21,min:0,max:1,step:.01,section:\"Motion\"},turbFreq:{type:ControlType.Number,title:\"Frequency\",defaultValue:1.15,min:.1,max:2,step:.01,section:\"Motion\"},turbIter:{type:ControlType.Number,title:\"Definition\",defaultValue:7,min:3,max:8,step:1,displayStepper:true,section:\"Motion\"},waveFreq:{type:ControlType.Number,title:\"Bands\",defaultValue:2.4,min:.1,max:5,step:.1,section:\"Motion\"},bend:{type:ControlType.Number,title:\"Bevel\",defaultValue:.24,min:0,max:1,step:.01,section:\"Shape\",hiddenWhenUnset:true},contour:{type:ControlType.Number,title:\"Contour\",defaultValue:.8,min:0,max:1,step:.1,section:\"Shape\",hiddenWhenUnset:true},mousePush:{type:ControlType.Number,title:\"Push\",defaultValue:.5,min:.1,max:1,step:.1,section:\"Mouse\"},mouseRadius:{type:ControlType.Number,title:\"Radius\",defaultValue:1,min:.1,max:1,step:.1,section:\"Mouse\"},mouseStretch:{type:ControlType.Number,title:\"Stretch\",defaultValue:0,min:0,max:1,step:.1,section:\"Mouse\"},mousePersist:{type:ControlType.Number,title:\"Persistence\",defaultValue:.8,min:0,max:1,step:.01,section:\"Mouse\"}}});\nexport const __FramerMetadata__ = {\"exports\":{\"default\":{\"type\":\"shader\",\"name\":null,\"annotations\":{\"framerContractVersion\":\"1\"}},\"__FramerMetadata__\":{\"type\":\"variable\"}}}\n//# sourceMappingURL=./LogoGradient.map"],"mappings":"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"}