{"version":3,"file":"LogoCrystal.aCuz18Yh.mjs","names":[],"sources":["https:/framerusercontent.com/modules/SbAj54M8qnD3NTdxfCeC/saVnVp18ygsrMWxFLwDd/LogoCrystal.js"],"sourcesContent":["import{defineShader,ControlType}from\"framer\";export default defineShader({title:\"Logo Crystal\",heightmapSource:\"image\",fragment:`\nconst float DEG2RAD = 0.01745329;\nconst float IOR_BASE = 1.5;\nconst vec3  BORDER_COLOR = vec3(1.0);\n\n// === HELPERS ===\n\n// --- value noise + FBM ---\nfloat hash21(vec2 p) {\n    return fract(sin(dot(p, vec2(127.1, 311.7))) * 43758.5453);\n}\n\nfloat valueNoise(vec2 p) {\n    vec2 i = floor(p);\n    vec2 f = fract(p);\n    f = f * f * (3.0 - 2.0 * f);\n\n    float a = hash21(i);\n    float b = hash21(i + vec2(1.0, 0.0));\n    float c = hash21(i + vec2(0.0, 1.0));\n    float d = hash21(i + vec2(1.0, 1.0));\n\n    return mix(mix(a, b, f.x), mix(c, d, f.x), f.y);\n}\n\n// FBM\nfloat fbm(vec2 p) {\n    float v = 0.0;\n    float a = 0.5;\n    mat2 rot = mat2(0.8, 0.6, -0.6, 0.8);\n    for (int i = 0; i < 2; i++) {\n        v += a * valueNoise(p);\n        p = rot * p * 2.0;\n        a *= 0.5;\n    }\n    return v;\n}\n\n// 9-tap weighted blur of the depth (R) channel.\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) {\n    float eps = 12.0;\n    float dR = blurDepth3x3(uv + vec2(eps * texel.x, 0.0), dudx, dudy, texel, 12.0);\n    float dL = blurDepth3x3(uv - vec2(eps * texel.x, 0.0), dudx, dudy, texel, 12.0);\n    float dU = blurDepth3x3(uv + vec2(0.0, eps * texel.y), dudx, dudy, texel, 12.0);\n    float dD = blurDepth3x3(uv - vec2(0.0, eps * texel.y), dudx, dudy, texel, 12.0);\n    return vec2(dR - dL, dU - dD) / (2.0 * eps * texel);\n}\n\n// === MAIN ===\n\nvoid main() {\n    vec2 res = u_resolution;\n    vec2 fragCoord = gl_FragCoord.xy;\n\n    vec2 screenUV = fragCoord / res;\n    screenUV.y = 1.0 - screenUV.y;\n\n    // === COVER-FIT BACKGROUND TEXTURE ===\n    vec2 bgRes = vec2(textureSize(u_bgTexture, 0));\n    vec2 bgRatio = res / bgRes;\n    float bgMaxRatio = max(bgRatio.x, bgRatio.y);\n    vec2 cover = bgRatio / bgMaxRatio;\n\n    float scale = max(u_bgScale, 1.0);\n\n    vec2 maxOff = max(vec2(0.0), 0.5 * (1.0 - cover / scale));\n    vec2 offset = vec2(u_bgOffsetX, -u_bgOffsetY) * maxOff;\n\n    vec2 centered = (screenUV - 0.5) * cover / scale - offset;\n\n    // Sweep\n    float sweepPhase = mod(u_time * u_bgSweep * 0.02 * u_bgSpeed, 1.0) * 360.0;\n    float rotAngle = (u_bgAngle + sweepPhase) * DEG2RAD;\n    float cs = cos(rotAngle);\n    float sn = sin(rotAngle);\n    centered = mat2(cs, -sn, sn, cs) * centered;\n\n    // FBM-based domain warp\n    if (u_bgWarp > 0.001) {\n        vec2 seedOffset = vec2(u_noiseSeed * 13.7, u_noiseSeed * 29.3);\n        vec2 fbmCoord = centered * u_noiseScale + seedOffset;\n        float t = mod(u_time, 3600.0) * u_bgSpeed;\n        float fx = fbm(fbmCoord + vec2(t * 0.1, 0.0));\n        float fy = fbm(fbmCoord + vec2(0.0, t * 0.13) + vec2(7.3, 11.7));\n        centered += (vec2(fx, fy) - 0.5) * 0.04 * u_bgWarp;\n    }\n\n    vec2 bgUV = centered + 0.5;\n\n    vec2 bgDudx = dFdx(bgUV);\n    vec2 bgDudy = dFdy(bgUV);\n\n    // === HEIGHTMAP UV ===\n    vec2 uv = vec2(v_uv.x, 1.0 - v_uv.y);\n    vec2 hmRes = vec2(textureSize(u_image_heightmap, 0));\n    float imgAspect    = hmRes.x / hmRes.y;\n    float canvasAspect = res.x / res.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    float aaScale = max(1.0, 2.0 / u_pixelRatio);\n\n    vec2 dudx = dFdx(uv);\n    vec2 dudy = dFdy(uv);\n    vec2 texel = 1.0 / hmRes;\n\n    vec4 hm = textureGrad(u_image_heightmap, uv, dudx, dudy);\n    float fw_b = fwidth(hm.b) / aaScale;\n    float hardMask = smoothstep(0.5 - fw_b, 0.5 + fw_b, hm.b);\n    float opacity = hardMask * (1.0 - hm.g);\n\n    float edgeDist;\n    if (canvasAspect > imgAspect) {\n        edgeDist = min(uv.x, 1.0 - uv.x);\n    } else if (canvasAspect < imgAspect) {\n        edgeDist = min(uv.y, 1.0 - uv.y);\n    } else {\n        edgeDist = 1.0;\n    }\n    opacity *= smoothstep(0., fwidth(edgeDist), edgeDist);\n\n    // === OUTSIDE-OF-LOGO COLOR ===\n    bool clip = u_clipBackground > 0.5;\n\n    if (opacity < 0.001) {\n        vec3 outsideRGB;\n        float outsideAlpha;\n        if (clip) {\n            outsideRGB = u_colorBack.rgb;\n            outsideAlpha = u_colorBack.a;\n        } else {\n            outsideRGB = textureGrad(u_bgTexture, bgUV, bgDudx, bgDudy).rgb;\n            outsideAlpha = 1.0;\n        }\n        fragColor = vec4(outsideRGB * outsideAlpha, outsideAlpha);\n        return;\n    }\n\n    vec3 outsideRGB = clip ? u_colorBack.rgb : textureGrad(u_bgTexture, bgUV, bgDudx, bgDudy).rgb;\n    float outsideAlpha = clip ? u_colorBack.a : 1.0;\n\n    // === BEVEL / NORMAL ===\n    float depth = max(blurDepth3x3(uv, dudx, dudy, texel, 6.0), 0.001);\n\n    vec2  grad   = heightGrad(uv, dudx, dudy, texel);\n    float gradMag = min(length(grad), 5.);\n\n    vec2 refractDir = gradMag > 0.001 ? grad : vec2(0.0);\n    vec2 dispersionDir = gradMag > 0.001 ? grad / gradMag : vec2(0.0);\n\n    float boundaryFade = smoothstep(0.0, 0.05, depth);\n\n    float falloffNorm = clamp(u_falloff / 20.0, 0.0, 1.0);\n    float lensExp = mix(0.3, 3.0, falloffNorm);\n    float lens    = pow(clamp(depth, 0.0, 1.0), lensExp);\n    float edgeShape = (1.0 - lens) * boundaryFade;\n\n    //Smoothen the edges\n    float outerSoft = smoothstep(0.0, mix(0.001, 0.5, 2.), depth);\n    edgeShape *= outerSoft;\n    gradMag *= outerSoft;\n\n    float contourMod = u_contour * 0.1 * boundaryFade;\n\n    float dispersionGate = smoothstep(0.0, 0.5, gradMag * u_contour * 2.0) * boundaryFade;\n\n    // === REFRACT BACKGROUND ===\n    vec2  aspectComp = vec2(1.0 / canvasAspect, 1.0);\n    float convexSign = u_convex > 0.5 ? 1.0 : -1.0;\n\n    vec2 baseDelta = -convexSign * refractDir * edgeShape * contourMod * 2.0 * u_strength * aspectComp;\n\n    vec3 refracted;\n    if (u_dispersion <= 0.01) {\n        refracted = textureGrad(u_bgTexture, bgUV + baseDelta, bgDudx, bgDudy).rgb;\n    } else {\n        vec3 wavelengths = vec3(0.65, 0.55, 0.45);\n        float dispersionScaled = u_dispersion * 0.1;\n        float iorMid = IOR_BASE + dispersionScaled / 0.3025;\n\n        refracted = vec3(0.0);\n        for (int c = 0; c < 3; c++) {\n            float wl  = wavelengths[c];\n            float ior = IOR_BASE + dispersionScaled / (wl * wl);\n\n            float channelOffset = (ior - iorMid) * 2.0 * dispersionGate * u_strength;\n            vec2 sampleUV = bgUV + baseDelta + dispersionDir * channelOffset * aspectComp;\n\n            refracted[c] = textureGrad(u_bgTexture, sampleUV, bgDudx, bgDudy)[c];\n        }\n    }\n\n    // === RIM / BORDER ===\n\n    float rim = smoothstep(0.2, 0.9, gradMag) * edgeShape;\n    vec3 col = refracted * (1.0 + rim * u_rimStrength);\n\n    //col += rim * u_softness; //optional \n\n    float borderOuterFade = smoothstep(0.0, 0.15, depth);\n    float innerIntensity = smoothstep(0.0, 0.6, depth);\n    float borderBand = pow(1.0 - innerIntensity, 2.0) * borderOuterFade;\n\n    vec2 outwardDir = gradMag > 0.001 ? -refractDir / gradMag : vec2(0.0);\n    vec3 borderTint = textureGrad(u_bgTexture, bgUV + outwardDir * 0.05 * aspectComp, bgDudx, bgDudy).rgb;\n    borderTint *= 4.;\n    col = mix(col, borderTint, borderBand * u_borderStrength);\n\n    // === FILTERS ===\n    col *= u_brightness;\n    col = (col - 0.5) * u_contrast + 0.5;\n    float lum = dot(col, vec3(0.299, 0.587, 0.114));\n    col = mix(vec3(lum), col, u_saturation);\n\n    col = clamp(col, 0.0, 1.0);\n\n    // === COMPOSITE ===\n    vec3  finalRGB = mix(outsideRGB, col, opacity);\n    float finalA   = mix(outsideAlpha, 1.0, opacity);\n    fragColor = vec4(finalRGB * finalA / max(finalA, 0.0001), finalA);\n}\n`,propertyControls:{image:{type:ControlType.ResponsiveImage,title:\"Logo\",defaultValue:\"data:framer/asset-reference,7XHsXmlUUmdQM95fkSvi3LRCuSk.svg?originalFilename=Path.svg&width=32&height=48\"},bgTexture:{type:ControlType.ResponsiveImage,title:\"Image\",defaultValue:\"data:framer/asset-reference,r9R0BfFW0wzdsNVqqTWrcR5ttgo.png?originalFilename=stellars-2.png&width=2944&height=1648\"},colorBack:{type:ControlType.Color,title:\"Background\",defaultValue:\"rgba(0,0,0,1)\"},bgScale:{type:ControlType.Number,title:\"Scale\",defaultValue:1.2,min:1,max:5,step:.01},bgOffsetX:{type:ControlType.Number,title:\"Offset X\",defaultValue:-.2,min:-1,max:1,step:.01},bgOffsetY:{type:ControlType.Number,title:\"Offset Y\",defaultValue:1,min:-1,max:1,step:.01},bgAngle:{type:ControlType.Number,title:\"Angle\",defaultValue:0,min:0,max:360,step:1},bgWarp:{type:ControlType.Number,title:\"Amount\",defaultValue:12,min:0,max:20,step:.5,section:\"Distort\"},noiseSeed:{type:ControlType.Number,title:\"Seed\",defaultValue:0,min:0,max:100,step:1,section:\"Distort\"},bgSpeed:{type:ControlType.Number,title:\"Speed\",defaultValue:.3,min:0,max:3,step:.1,section:\"Distort\"},noiseScale:{type:ControlType.Number,title:\"Scale\",defaultValue:.5,min:.5,max:12,step:.1,section:\"Distort\"},bgSweep:{type:ControlType.Number,title:\"Sweep\",defaultValue:0,min:-1,max:1,step:.1,section:\"Distort\"},clipBackground:{type:ControlType.Boolean,title:\"Clip BG\",defaultValue:true,enabledTitle:\"Logo\",disabledTitle:\"Full\",hidden:true},falloff:{type:ControlType.Number,title:\"Bevel\",defaultValue:3,min:0,max:20,step:.1,section:\"Glass\"},contour:{type:ControlType.Number,title:\"Contour\",defaultValue:.5,min:0,max:1,step:.01,section:\"Glass\"},strength:{type:ControlType.Number,title:\"Refraction\",defaultValue:.3,min:0,max:8,step:.01,section:\"Glass\"},dispersion:{type:ControlType.Number,title:\"Dispersion\",defaultValue:0,min:0,max:1,step:.01,section:\"Glass\"},convex:{type:ControlType.Boolean,title:\"Convex\",defaultValue:false,section:\"Glass\"},rimStrength:{type:ControlType.Number,title:\"Rim\",defaultValue:2,min:0,max:4,step:.01,section:\"Glass\"},borderStrength:{type:ControlType.Number,title:\"Outline\",defaultValue:1,min:0,max:1,step:.01,section:\"Glass\"},brightness:{type:ControlType.Number,title:\"Brightness\",defaultValue:1,min:.5,max:2,step:.01,section:\"Filters\",hiddenWhenUnset:true},contrast:{type:ControlType.Number,title:\"Contrast\",defaultValue:1,min:0,max:3,step:.01,section:\"Filters\",hiddenWhenUnset:true},saturation:{type:ControlType.Number,title:\"Saturation\",defaultValue:1,min:0,max:3,step:.01,section:\"Filters\",hiddenWhenUnset:true}}});\nexport const __FramerMetadata__ = {\"exports\":{\"default\":{\"type\":\"shader\",\"name\":null,\"annotations\":{\"framerContractVersion\":\"1\"}},\"__FramerMetadata__\":{\"type\":\"variable\"}}}\n//# sourceMappingURL=./LogoCrystal.map"],"mappings":"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"}