{"version":3,"file":"LogoSpectrum.CiJYxXDI.mjs","names":[],"sources":["https:/framerusercontent.com/modules/I22n4QdurBc6QkKK5QWM/GofSZVmNMLDQqprXB0qq/LogoSpectrum.js"],"sourcesContent":["import{defineShader,ControlType}from\"framer\";export default defineShader({title:\"Logo Spectrum\",heightmapSource:\"image\",fragment:`\nconst float DEG2RAD = 0.01745329;\nconst float TWO_PI = 6.28318530718;\n\nfloat blurDepth3x3(vec2 uv, vec2 dudx, vec2 dudy, vec2 texel, float radius) {\n    vec2 r = radius * texel;\n    float sum = 4.0 * textureGrad(u_image_heightmap, uv, 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(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    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    return sum / 16.0;\n}\n\nvec2 heightGrad(vec2 uv, vec2 dudx, vec2 dudy, vec2 texel, float blurRadius) {\n    float eps = 12.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\nfloat hash21(vec2 p) {\n    return fract(sin(dot(p, vec2(127.1, 311.7))) * 43758.5453);\n}\n\n// --- cyclic noise -----------------------------------------------\nmat3 getOrthogonalBasis(vec3 z) {\n    z = normalize(z);\n    vec3 up = abs(z.y) < 0.99 ? vec3(0.0, 1.0, 0.0) : vec3(0.0, 0.0, 1.0);\n    vec3 x = normalize(cross(up, z));\n    return mat3(x, cross(z, x), z);\n}\n\nvec3 cyclicNoise(vec3 p, float pump) {\n    vec4 sum = vec4(0.0);\n    mat3 basis = getOrthogonalBasis(vec3(-1.0, 2.0, -3.0));\n    for (int i = 0; i < 5; i++) {\n        p *= basis;\n        p += sin(p.yzx);\n        sum += vec4(cross(cos(p), sin(p.zxy)), 1.0);\n        sum *= pump;\n        p *= 2.0;\n    }\n    return sum.xyz / sum.w;\n}\n\nvoid main() {\n    // === HEIGHTMAP UV (aspect-corrected) ===\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    // Logo-space scan coordinate (locked to the logo, not the canvas).\n    // x is scaled by the logo's aspect so the scan direction is geometrically\n    // correct, and y is flipped to match the previous screenY orientation.\n    vec2 scanUV = vec2(uv.x * imgAspect, 1.0 - uv.y);\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    float edgeDist = canvasAspect > imgAspect\n        ? min(uv.x, 1.0 - uv.x)\n        : min(uv.y, 1.0 - uv.y);\n    opacity *= smoothstep(0.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    float depth = max(blurDepth3x3(uv, dudx, dudy, texel, 6.0), 0.001);\n\n    vec2 hGrad = heightGrad(uv, dudx, dudy, texel, 12.0);\n    float gradMag = length(hGrad);\n    vec2 gradDir = gradMag > 0.001 ? hGrad : vec2(0.0);\n    vec2 contourDir = vec2(-gradDir.y, gradDir.x);\n\n    float edgeProximity = 1.0 - smoothstep(0.0, u_edge, depth);\n\n    float t = u_time * u_speed * 10.0;\n\n    float angleRad = (u_angle + u_time * u_sweepSpeed * u_speed * 60.0) * DEG2RAD;\n    vec2 scanDir = vec2(cos(angleRad), sin(angleRad));\n    float scanBase = dot(scanUV, scanDir);\n\n    float deflection = (depth - 0.5) * u_deflection * 0.06;\n\n    float outerSoft = smoothstep(0.0, mix(0.001, 0.5, 2.), depth);\n\n    float bevelEnv = smoothstep(0.0, 0.55, edgeProximity);\n    bevelEnv      *= bevelEnv;\n    bevelEnv      *= outerSoft; \n    float bevelOffset = dot(contourDir, scanDir) * bevelEnv * u_bend * 0.07 * 0.5\n                     -  dot(gradDir,    scanDir) * bevelEnv * u_bend * 0.025 * 0.5;\n\n    float lineY = scanBase + deflection + bevelOffset + u_offset;\n\n    float viscN        = clamp(u_viscosity / 3.0, 0.0, 1.0);\n    float lineWidthExp = mix(20.0, 1.0, viscN);\n    float bloomWeight  = mix(0.15, 0.7, viscN);\n    float softExp      = mix(2.4, 1.1, viscN);\n    float densityPhase = u_density * 180.0;\n\n    // ---- SDF-based scan lines with cyclic-noise displacement -----------\n    float phase = (lineY - t * 0.025) * densityPhase - 1.5707963;\n\n    // Noise coordinate also lives in logo-space so distortion is locked to logo.\n    vec3 np = vec3(scanUV * u_noiseScale, u_time * 0.15 * u_distortSpeed);\n\n    // Clean SDF → glow.\n    float sdClean = phase - TWO_PI * floor(phase / TWO_PI + 0.5);\n    float peakClean = 0.5 + 0.5 * cos(sdClean);\n\n    // Distort gating — when the boolean is off, both noise and dispersion zero out.\n    float noiseAmt   = u_distort > 0.5 ? u_noiseAmount : 0.0;\n    float dispAmpVal = u_distort > 0.5 ? u_dispersion  : 0.0;\n\n    // Line core with optional ephemeral dispersion trail.\n    float peakNoisy = 0.0;\n    float peakNoisyWeight = 0.0;\n    int SAMPLES = dispAmpVal > 0.001 ? 5 : 1;\n    float dispAmp = dispAmpVal;\n\n    for (int i = 0; i < 5; i++) {\n        if (i >= SAMPLES) break;\n\n        // ephemeral ramp: 0 at head, ~1 at tail\n        float eph = SAMPLES > 1 ? float(i) / float(SAMPLES - 1) : 0.0;\n        float sqEph = eph * eph;\n\n        // Slightly time-offset slice per sample — creates the drip/trail.\n        vec3 npS = np + vec3(0.0, 0.0, -sqEph * dispAmp * 0.8);\n\n        vec3 n3 = cyclicNoise(npS, 1.5);\n        // Project noise onto scan direction so it wiggles lines sideways.\n        float n = dot(n3.xy, scanDir);\n\n        float amp = 1.0 + dispAmp * sqEph * 0.6;\n        float sdNoisy = sdClean + n * noiseAmt * amp * TWO_PI * 0.5;\n\n        float w = mix(1.0, 1.0 - sqEph * 0.5, dispAmp);\n        peakNoisy += (0.5 + 0.5 * cos(sdNoisy)) * w;\n        peakNoisyWeight += w;\n    }\n    peakNoisy /= max(peakNoisyWeight, 0.001);\n\n    float fadeRamp = smoothstep(0.0, 0.4, depth);\n    float lineFade = mix(1.0, fadeRamp, clamp(u_lineFade, 0.0, 1.0));\n\n    float line     = pow(peakNoisy, lineWidthExp) * lineFade;\n    float lineSoft = pow(peakNoisy, softExp) * lineFade;\n    float lineGlow = pow(peakNoisy, 0.45) * lineFade;\n\n    float coarseMod = mix(0.9, 1.1, 0.5 + 0.5 * sin(lineY * densityPhase * 0.08 + t * 0.4));\n\n    float contourHeat = (1.0 - smoothstep(0.0, 0.25, depth)) * u_contour;\n\n    vec3 tint = u_baseColor.rgb;\n    float centerBoost = mix(0.75, 1.1, smoothstep(0.0, 0.35, depth));\n    float floorGlow = 0.05 * smoothstep(0.0, 0.4, depth);\n\n    float grain = hash21(v_uv * vec2(1920.0, 1080.0) + floor(t * 12.0));\n    float grainMod = 1.0 + (grain - 0.5) * 2.0 * u_grain * 0.25;\n\n    float bodyIntensity = (\n        floorGlow\n        + (line + lineSoft * bloomWeight + lineGlow * u_glow * 0.35) * u_exposure\n        + contourHeat * 1.4\n    ) * centerBoost * coarseMod * grainMod;\n\n    vec3 rimHot = vec3(contourHeat * line * u_exposure * 0.9);\n    vec3 peakHighlight = vec3(smoothstep(0.7, 1.0, line) * u_glow * u_exposure * 0.6);\n\n    vec3 bodyCol = tint * bodyIntensity + rimHot + peakHighlight;\n\n    float luma = dot(bodyCol, vec3(0.2126, 0.7152, 0.0722));\n    bodyCol = mix(vec3(luma), bodyCol, u_saturation);\n    bodyCol += tint * u_ambient * depth;\n\n    bodyCol = bodyCol / (1.0 + max(bodyCol - 1.0, 0.0));\n\n    vec3 bgColor = u_colorBack.rgb * u_colorBack.a;\n    float bgAlpha = u_colorBack.a;\n\n    vec3 finalCol = bgColor * (1.0 - opacity) + bodyCol * opacity;\n    float finalAlpha = bgAlpha + opacity * (1.0 - bgAlpha);\n\n    fragColor = vec4(finalCol, finalAlpha);\n}\n`,propertyControls:{image:{type:ControlType.ResponsiveImage,title:\"Image\",defaultValue:\"data:framer/asset-reference,7XHsXmlUUmdQM95fkSvi3LRCuSk.svg?originalFilename=Path.svg&width=32&height=48\"},colorBack:{type:ControlType.Color,title:\"Background\",defaultValue:\"#000000\"},baseColor:{type:ControlType.Color,title:\"Surface\",defaultValue:\"#444444\"},speed:{type:ControlType.Number,title:\"Speed\",defaultValue:.3,min:0,max:2,step:.1},offset:{type:ControlType.Number,title:\"Offset\",defaultValue:.21,min:0,max:1,step:.01,hiddenWhenUnset:true},angle:{type:ControlType.Number,title:\"Angle\",defaultValue:225,min:0,max:360,step:1},sweepSpeed:{type:ControlType.Number,title:\"Sweep\",defaultValue:0,min:-1,max:1,step:.1},glow:{type:ControlType.Number,title:\"Glow\",defaultValue:.7,min:0,max:2,step:.01,hidden:true},bend:{type:ControlType.Number,title:\"Bevel\",defaultValue:.34,min:0,max:1,step:.01,section:\"Shape\"},edge:{type:ControlType.Number,title:\"Edge\",defaultValue:1,min:0,max:1,step:.01,section:\"Shape\"},contour:{type:ControlType.Number,title:\"Contour\",defaultValue:1,min:0,max:3,step:.01,section:\"Shape\"},density:{type:ControlType.Number,title:\"Density\",defaultValue:.08,min:.01,max:.2,step:.01},viscosity:{type:ControlType.Number,title:\"Glow\",defaultValue:.5,min:0,max:2,step:.01},deflection:{type:ControlType.Number,title:\"Deflection\",defaultValue:3,min:0,max:3,step:.05},distort:{type:ControlType.Boolean,title:\"Distort\",defaultValue:false,enabledTitle:\"Yes\",disabledTitle:\"No\"},noiseAmount:{type:ControlType.Number,title:\"Amount\",defaultValue:.5,min:0,max:4,step:.1,hidden:props=>!props.distort},distortSpeed:{type:ControlType.Number,title:\"Speed\",defaultValue:1,min:0,max:2,step:.1,hidden:props=>!props.distort},noiseScale:{type:ControlType.Number,title:\"Scale\",defaultValue:1.5,min:.1,max:8,step:.1,hidden:props=>!props.distort},dispersion:{type:ControlType.Number,title:\"Ephemeral\",defaultValue:0,min:0,max:1,step:.01,hidden:props=>!props.distort},lineFade:{type:ControlType.Number,title:\"Line Fade\",defaultValue:0,min:0,max:1,step:.01,hidden:true},grain:{type:ControlType.Number,title:\"Grain\",defaultValue:0,min:0,max:1,step:.01,hiddenWhenUnset:true},ambient:{type:ControlType.Number,title:\"Ambient\",defaultValue:0,min:0,max:.2,step:.01,section:\"Filters\",hidden:true},saturation:{type:ControlType.Number,title:\"Saturation\",defaultValue:1.2,min:0,max:3,step:.01,section:\"Filters\",hidden:true},exposure:{type:ControlType.Number,title:\"Exposure\",defaultValue:1.4,min:.2,max:4,step:.05,section:\"Filters\",hidden:true}}});\nexport const __FramerMetadata__ = {\"exports\":{\"default\":{\"type\":\"shader\",\"name\":null,\"annotations\":{\"framerContractVersion\":\"1\"}},\"__FramerMetadata__\":{\"type\":\"variable\"}}}\n//# sourceMappingURL=./LogoSpectrum.map"],"mappings":"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"}