{"version":3,"file":"DispersionRings.nO2y6wfN.mjs","names":[],"sources":["https:/framerusercontent.com/modules/VMKsfJdfTvRVeIoDd5X9/fXq10iSPqH2cgEWzpK4N/DispersionRings.js"],"sourcesContent":["// Dispersion Rings\nimport{defineShader,ControlType}from\"framer\";export default defineShader({title:\"Rings\",fragment:`\nconst int SAMPLES = 8;\nconst float EPHEMERAL_DRIP = 1.0;\n\n// === PCG hash - https://www.jcgt.org/published/0009/03/02/\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\nuvec3 seed;\nvec3 random3f() {\n    seed = hash3(seed);\n    return vec3(seed) / float(-1u);\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// === PALETTE SAMPLING ===\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 getColor(0);\n    t = clamp(t, 0.0, 1.0) * float(count - 1);\n    int idx = min(int(floor(t)), count - 2);\n    float localT = fract(t);\n    localT = localT * localT * (3.0 - 2.0 * localT);\n    return mix(getColor(idx), getColor(idx + 1), localT);\n}\n\n// === Gradient Flow ===\nfloat getGradientT(vec2 uv, float t, vec2 dir1, vec2 dir2, vec3 freqs, vec2 dir3) {\n    vec2 suv = uv * 1.;\n    \n    float flow = dot(suv, dir1) + sin(dot(suv, dir2) * freqs.x + t) * 0.3 + t * 0.2;\n    float flow2 = dot(suv, dir2.yx) + cos(dot(suv, dir1.yx) * freqs.y - t * 0.8) * 0.25;\n    \n    float gradT = sin(flow * 1.5) * 0.5 + 0.5;\n    gradT += cos(flow2 * 1.2) * 1.3;\n    gradT += sin(dot(suv, dir3) * freqs.z + t * 3.5) * 1.2;\n    \n    return smoothstep(0.0, 4.12, gradT);\n}\n\n// === RING LENS ===\nvoid applyRingLens(vec2 pp, vec2 fragCoord, vec2 r, float iorOffset, out vec2 warpedUV, out float edgeFactor) {\n    float radiusSq = u_ringRadius * u_ringRadius;\n    \n    vec2 lensUV = (fragCoord - vec2(r.x * 0.5, 0.0)) / r.y * u_lensScale;\n    float dist = length(lensUV);\n    \n    float fw = fwidth(dist / u_ringSpacing) * u_ringSpacing;\n    \n    float ringDist = mod(dist, u_ringSpacing) / u_ringSpacing;\n    float ringShifted = ringDist - 0.5;\n    float localR = ringShifted * 2.0;\n    \n    float sp = radiusSq - localR * localR;\n    \n    float edgeSdf = abs(localR) - u_ringRadius;\n    float edgeAA = smoothstep(fw, -fw, edgeSdf);\n    \n    float lensAmount = smoothstep(0., 0.3, sp);\n    edgeFactor = (1.0 - smoothstep(0.0, radiusSq, sp)) * lensAmount * edgeAA;\n    \n    vec2 dir = lensUV / max(dist, 0.001);\n    \n    warpedUV = pp;\n    if (sp > 0.0) {\n        float lens = sqrt(sp) / max(u_ringRadius, 0.001);\n        float baseWarp = mix(1.0, u_ringWarpStrength, lens);\n        float warpAmount = baseWarp * (1.0 + iorOffset);\n        float ringCenter = (floor(dist / u_ringSpacing) + 0.5) * u_ringSpacing;\n        vec2 offset = pp - dir * ringCenter;\n        warpedUV = dir * ringCenter + offset * warpAmount;\n    }\n}\n\nvoid main() {\n    vec2 fragCoord = v_uv * u_resolution;\n    seed = uvec3(uvec2(fragCoord), uint(fract(u_time) * 1000.0));\n    \n    vec2 r = u_resolution;\n    vec2 p = (fragCoord * 2.0 - r) / r.y;\n    float t = u_time * u_speed;\n    \n    int colorCount = u_colors_length;\n    \n    // Early out: no colors -> black\n    if (colorCount < 1) {\n        fragColor = vec4(0.0, 0.0, 0.0, 1.0);\n        return;\n    }\n    \n    // Seed-based flow directions (precomputed once)\n    vec3 seedOff1 = seedRandom(u_seed);\n    vec3 seedOff2 = seedRandom(u_seed + 100.0);\n    \n    float angle1 = seedOff1.x * 6.28;\n    float angle2 = seedOff1.y * 6.28;\n    vec2 dir1 = vec2(cos(angle1), sin(angle1));\n    vec2 dir2 = vec2(cos(angle2), sin(angle2));\n    vec2 dir3 = dir1 + dir2;\n    vec3 freqs = vec3(\n        1.0 + seedOff1.z * 2.0,\n        1.0 + seedOff2.x * 1.5,\n        1.5 + seedOff2.y * 2.0\n    );\n    \n    float dice = random3f().x;\n    \n    vec3 ringIorOffsets = vec3(-1.0, 0.0, 1.0) * u_ringDispersion;\n    \n    vec3 col = vec3(0.0);\n    \n    for (int i = 0; i < SAMPLES; i++) {\n        float ephemeral = (float(i) + dice) / float(SAMPLES);\n        float sqEph = ephemeral * ephemeral;\n        \n        vec2 pt = p;\n        pt.x += u_ephemeralAmp * sqEph * sin(p.y * 2.0 + t);\n        pt.y += u_ephemeralAmp * sqEph * cos(p.x * 1.5 - t) * 0.5;\n        pt.y -= (1.0 - exp(-EPHEMERAL_DRIP * sqEph)) * abs(pt.y) * sign(pt.y) * 0.3;\n        \n        vec3 tint = smoothstep(1.0, 0.0, abs(3.0 * ephemeral - vec3(1.0, 1.5, 2.0)));\n        \n        vec3 gradTs = vec3(0.0);\n        vec3 edgeFactors = vec3(0.0);\n        \n        for (int c = 0; c < 3; c++) {\n            vec2 pp = pt * u_lensScale;\n            vec2 warpedUV;\n            float edgeFactor;\n            applyRingLens(pp, fragCoord, r, ringIorOffsets[c], warpedUV, edgeFactor);\n            \n            vec2 gradUV = warpedUV / u_lensScale;\n            gradTs[c] = getGradientT(gradUV, t * 0.8, dir1, dir2, freqs, dir3);\n            edgeFactors[c] = edgeFactor;\n        }\n        \n        vec3 convergentColor = paletteN(gradTs.g, colorCount);\n        float edgeMix = max(max(edgeFactors.r, edgeFactors.g), edgeFactors.b);\n        \n        vec3 dispersedColor = vec3(\n            paletteN(gradTs.r, colorCount).r,\n            convergentColor.g,\n            paletteN(gradTs.b, colorCount).b\n        );\n        \n        vec3 finalColor = mix(convergentColor, dispersedColor, edgeMix * 2.0);\n        \n        vec3 rainbow = (gradTs - gradTs.g) * 3.0;\n        finalColor += rainbow * edgeMix * u_edgeDisp;\n        \n        col += tint * finalColor * (3.0 / float(SAMPLES));\n    }\n    \n    fragColor = vec4(col, 1.0);\n}\n`,propertyControls:{colors:{type:ControlType.Array,title:\"Colors\",control:{type:ControlType.Color},maxCount:8,defaultValue:[\"#91FFCC\",\"#FFB938\",\"#FF4242\"]},seed:{type:ControlType.Number,title:\"Seed\",defaultValue:47,min:0,max:1e3,step:1},speed:{type:ControlType.Number,title:\"Speed\",defaultValue:.5,min:0,max:2,step:.01},ephemeralAmp:{type:ControlType.Number,title:\"Ephemeral\",defaultValue:.12,min:0,max:.5,step:.01},lensScale:{type:ControlType.Number,title:\"Scale\",defaultValue:10,min:.1,max:10,step:.1},ringSpacing:{type:ControlType.Number,title:\"Spacing\",defaultValue:1.5,min:.1,max:5,step:.1},ringRadius:{type:ControlType.Number,title:\"Radius\",defaultValue:1,min:.1,max:2,step:.01},ringWarpStrength:{type:ControlType.Number,title:\"Warp\",defaultValue:4,min:0,max:5,step:.1},ringDispersion:{type:ControlType.Number,title:\"Dispersion\",defaultValue:.4,min:0,max:1,step:.01},edgeDisp:{type:ControlType.Number,title:\"Edges\",defaultValue:1.3,min:0,max:5,step:.1}}});\nexport const __FramerMetadata__ = {\"exports\":{\"default\":{\"type\":\"shader\",\"name\":null,\"annotations\":{\"framerContractVersion\":\"1\"}},\"__FramerMetadata__\":{\"type\":\"variable\"}}}\n//# sourceMappingURL=./DispersionRings.map"],"mappings":"+HAC6C,GAAe,EAAa,CAAC,MAAM,QAAQ,SAAS;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAmL/F,iBAAiB,CAAC,OAAO,CAAC,KAAK,EAAY,MAAM,MAAM,SAAS,QAAQ,CAAC,KAAK,EAAY,MAAM,CAAC,SAAS,EAAE,aAAa,CAAC,UAAU,UAAU,UAAU,CAAC,CAAC,KAAK,CAAC,KAAK,EAAY,OAAO,MAAM,OAAO,aAAa,GAAG,IAAI,EAAE,IAAI,IAAI,KAAK,EAAE,CAAC,MAAM,CAAC,KAAK,EAAY,OAAO,MAAM,QAAQ,aAAa,GAAG,IAAI,EAAE,IAAI,EAAE,KAAK,IAAI,CAAC,aAAa,CAAC,KAAK,EAAY,OAAO,MAAM,YAAY,aAAa,IAAI,IAAI,EAAE,IAAI,GAAG,KAAK,IAAI,CAAC,UAAU,CAAC,KAAK,EAAY,OAAO,MAAM,QAAQ,aAAa,GAAG,IAAI,GAAG,IAAI,GAAG,KAAK,GAAG,CAAC,YAAY,CAAC,KAAK,EAAY,OAAO,MAAM,UAAU,aAAa,IAAI,IAAI,GAAG,IAAI,EAAE,KAAK,GAAG,CAAC,WAAW,CAAC,KAAK,EAAY,OAAO,MAAM,SAAS,aAAa,EAAE,IAAI,GAAG,IAAI,EAAE,KAAK,IAAI,CAAC,iBAAiB,CAAC,KAAK,EAAY,OAAO,MAAM,OAAO,aAAa,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,GAAG,CAAC,eAAe,CAAC,KAAK,EAAY,OAAO,MAAM,aAAa,aAAa,GAAG,IAAI,EAAE,IAAI,EAAE,KAAK,IAAI,CAAC,SAAS,CAAC,KAAK,EAAY,OAAO,MAAM,QAAQ,aAAa,IAAI,IAAI,EAAE,IAAI,EAAE,KAAK,GAAG,CAAC,CAAC,CAAC"}