/** * Vertex + fragment shader sources lifted byte-for-byte from `image.html` * (lines 961–1548). All 24 effect branches are kept so future presets can * select any of them without re-touching the shader. */ export declare const VERT_SRC = "\n void main() { gl_Position = vec4(position.xy, 0.0, 1.0); }\n"; export declare const FRAG_SRC = "\n uniform vec2 u_resolution;\n uniform float u_dpr;\n uniform float u_time;\n uniform vec3 u_color1, u_color2, u_color3, u_color4, u_color5, u_color6, u_color7, u_cardBg;\n uniform float u_alpha1, u_alpha2, u_alpha3, u_alpha4, u_alpha5, u_alpha6, u_alpha7;\n uniform float u_speed, u_intensity, u_scale, u_direction;\n uniform float u_softness, u_distortion, u_complexity, u_shape, u_flicker;\n uniform float u_vignette, u_vigOpacity, u_blur, u_highlight, u_shaderOpacity;\n uniform float u_cellSize, u_gap, u_dotSize, u_dotSoftness, u_dotOpacity, u_hlScale, u_fillOpacity, u_edgeFade, u_fadeStr;\n uniform float u_dotMode;\n uniform int u_effect;\n uniform int u_sweepEase;\n\n // Reference card edge length (CSS px) at which the original preset cellSize\n // gives the canonical cell count. Cell PIXEL size stays constant across card\n // sizes by scaling gridSize proportionally to (currentCssDim / REF_DIM).\n const float REF_DIM = 320.0;\n\n /** Anisotropic cell count: returns the number of cells along x and y so that\n * each cell stays SQUARE in screen space regardless of the card's aspect\n * ratio. A 600\u00D7300 card gets twice as many cells horizontally as vertically;\n * cells stay the same physical size as on a 300\u00D7300 card. */\n vec2 gridCounts(float baseCount) {\n vec2 cssRes = u_resolution / max(u_dpr, 0.0001);\n return max(vec2(2.0), floor(baseCount * cssRes / REF_DIM));\n }\n\n vec3 mod289(vec3 x) { return x - floor(x * (1.0/289.0)) * 289.0; }\n vec2 mod289v2(vec2 x) { return x - floor(x * (1.0/289.0)) * 289.0; }\n vec3 permute(vec3 x) { return mod289((x * 34.0 + 1.0) * x); }\n\n float 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 = (x0.x > x0.y) ? vec2(1.0, 0.0) : vec2(0.0, 1.0);\n vec4 x12 = x0.xyxy + C.xxzz;\n x12.xy -= i1;\n i = mod289v2(i);\n vec3 p = permute(permute(i.y + vec3(0.0, i1.y, 1.0)) + i.x + vec3(0.0, i1.x, 1.0));\n vec3 m = max(0.5 - vec3(dot(x0,x0), dot(x12.xy,x12.xy), dot(x12.zw,x12.zw)), 0.0);\n m = m * m; m = m * m;\n vec3 x_ = 2.0 * fract(p * C.www) - 1.0;\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.0 * dot(m, g);\n }\n\n float fbm(vec2 p, float oct) {\n float val = 0.0, amp = 0.5;\n int n = int(oct);\n for (int i = 0; i < 4; i++) {\n if (i >= n) break;\n val += amp * snoise(p);\n p *= 2.0;\n amp *= 0.5;\n }\n return val;\n }\n\n float nfbm(vec2 p) { return fbm(p, 2.0 + u_complexity * 2.0); }\n\n vec3 palette(float t) {\n t = clamp(t, 0.0, 1.0);\n t = t * t * (3.0 - 2.0 * t);\n float k = 64.0;\n float w1 = u_alpha1 * exp(-k * t * t);\n float w2 = u_alpha2 * exp(-k * (t - 0.25) * (t - 0.25));\n float w3 = u_alpha3 * exp(-k * (t - 0.5) * (t - 0.5));\n float w4 = u_alpha4 * exp(-k * (t - 0.75) * (t - 0.75));\n float w5 = u_alpha5 * exp(-k * (t - 1.0) * (t - 1.0));\n float total = w1 + w2 + w3 + w4 + w5 + 0.0001;\n return (u_color1*w1 + u_color2*w2 + u_color3*w3 + u_color4*w4 + u_color5*w5) / total;\n }\n\n vec3 softBlend(float a, float b, float c) {\n a = clamp(a, 0.0, 1.0); a *= a;\n b = clamp(b, 0.0, 1.0); b *= b;\n c = clamp(c, 0.0, 1.0); c *= c;\n float d = clamp(a * 0.7 + c * 0.3, 0.0, 1.0); d *= d;\n float e = clamp(b * 0.5 + c * 0.5, 0.0, 1.0); e *= e;\n a *= u_alpha1; b *= u_alpha2; c *= u_alpha3; d *= u_alpha4; e *= u_alpha5;\n float total = a + b + c + d + e;\n float floorW = max(0.001 - total, 0.0);\n vec3 fallback = (u_color1 + u_color2 + u_color3 + u_color4 + u_color5) * 0.2;\n return (u_color1 * a + u_color2 * b + u_color3 * c + u_color4 * d + u_color5 * e + fallback * floorW) / (total + floorW);\n }\n\n vec2 warp(vec2 p, float t) {\n float str = u_distortion * 2.0;\n return vec2(\n nfbm(p + vec2(t * 0.1, 0.0)),\n nfbm(p + vec2(0.0, t * 0.12) + 5.0)\n ) * str;\n }\n\n float sweepEase(float x) {\n if (u_sweepEase == 1) return x * x * (3.0 - 2.0 * x);\n if (u_sweepEase == 2) {\n float p = 1.0 - x;\n return 1.0 - p * p * p;\n }\n if (u_sweepEase == 3) {\n return x < 0.5 ? 4.0 * x * x * x : 1.0 - pow(-2.0 * x + 2.0, 3.0) * 0.5;\n }\n if (u_sweepEase == 4) return 1.0 - pow(2.0, -10.0 * x) * (1.0 - x);\n return x;\n }\n\n float blob(vec2 p, vec2 center, float radius) {\n float r = radius * (0.5 + u_shape * 0.8);\n float soft = 0.05 + u_softness * 0.4;\n return smoothstep(r + soft, r - soft * 0.5, length(p - center));\n }\n\n vec3 computeEffect(vec2 uv, float aspect, float t, float dist, float soft, float cpx, float shp) {\n vec2 p = (uv - 0.5) * u_scale;\n p.x *= aspect;\n p += vec2(cos(u_direction), sin(u_direction)) * t * 0.15;\n vec3 col = vec3(0.0);\n\n if (u_effect == 0) {\n float val = sin(p.x * 3.0 + t) * 0.5 + 0.5;\n val += sin(p.y * 2.0 + t * 0.7) * 0.3;\n val += sin((p.x + p.y) * (1.0 + cpx * 3.0) - t * 0.5) * 0.2;\n vec2 w = warp(p, t);\n val += (w.x + w.y) * 0.15;\n col = palette(clamp(val * u_intensity, 0.0, 1.0));\n\n } else if (u_effect == 1) {\n float freq = 3.0 + cpx * 8.0;\n float val = 0.0;\n val += sin(p.x * freq + t);\n val += sin(p.y * freq + t * 1.3);\n val += sin((p.x + p.y) * freq * 0.7 + t * 0.7);\n val += sin(length(p) * freq * 0.8 - t * 1.5);\n vec2 w = warp(p, t);\n val += (w.x + w.y) * dist;\n val = val * 0.2 * u_intensity + 0.5;\n col = palette(clamp(val, 0.0, 1.0));\n\n } else if (u_effect == 2) {\n vec2 q = vec2(nfbm(p + t * 0.3), nfbm(p + vec2(5.2, 1.3) + t * 0.2));\n float val = nfbm(p + q * (1.0 + dist * 3.0) + t * 0.1);\n val = val * u_intensity * 0.5 + 0.5;\n col = palette(clamp(val, 0.0, 1.0));\n\n } else if (u_effect == 3) {\n float d = length(p);\n float val = sin(d * (3.0 + cpx * 6.0) - t * 2.0) * 0.5 + 0.5;\n val *= exp(-d * (0.3 + shp * 1.0));\n val += sin(atan(p.y, p.x) * (1.5 + cpx * 2.0) + t) * 0.15;\n col = palette(clamp(val * u_intensity, 0.0, 1.0));\n\n } else if (u_effect == 4) {\n vec2 q = vec2(nfbm(p * (0.5 + shp * 0.6) + vec2(t * 0.12, t * 0.08)), nfbm(p * (0.5 + shp * 0.6) + vec2(t * 0.09, -t * 0.11)));\n vec2 r = vec2(nfbm(p + q * (1.0 + dist * 2.0) + vec2(1.7, 9.2) + t * 0.06), nfbm(p + q * (1.0 + dist * 2.0) + vec2(8.3, 2.8) - t * 0.08));\n float val = nfbm(p + r * 2.0);\n float lo = -0.3 - soft * 0.5;\n float hi = 0.5 + soft * 0.5;\n val = smoothstep(lo, hi, val * u_intensity);\n col = palette(val);\n\n } else if (u_effect == 5) {\n float n1 = nfbm(vec2(p.x * 0.5 + t * 0.15, p.y * (1.0 + cpx * 1.5)));\n float n2 = nfbm(vec2(p.x * 0.3 - t * 0.1, p.y * (0.8 + cpx * 1.0) + 3.0));\n float band = sin(p.y * 3.0 + n1 * (1.0 + dist * 2.0) + t * 0.3) * 0.5 + 0.5;\n float shimmer = sin(p.y * 4.0 + n2 * 1.5 - t * 0.2) * 0.5 + 0.5;\n float w1 = band * (0.5 + 0.5 * sin(p.x * 1.5 + t * 0.2 + n1));\n float w2 = shimmer * (0.5 + 0.5 * cos(p.x * 1.0 - t * 0.15 + n2));\n float w3 = nfbm(p * 0.5 + t * 0.05) * 0.5 + 0.5;\n col = softBlend(w1 * u_intensity, w2 * u_intensity, w3 * 0.6 * u_intensity);\n\n } else if (u_effect == 6) {\n vec2 wp = warp(p * 1.2, t);\n float blobR = 0.15 + shp * 0.2;\n float b1 = blob(p, vec2(sin(t * 0.3) * 0.3, cos(t * 0.2) * 0.4) + wp * 0.2, blobR);\n float b2 = blob(p, vec2(cos(t * 0.25) * 0.4, sin(t * 0.35) * 0.3 - 0.2) + wp * 0.15, blobR * 1.2);\n float b3 = blob(p, vec2(-sin(t * 0.2) * 0.3, -cos(t * 0.3) * 0.35) + wp * 0.18, blobR);\n float bg = nfbm(p * 0.5 + t * 0.05) * 0.3 + 0.15;\n col = softBlend((b1 + bg * 0.5) * u_intensity, (b2 + bg * 0.3) * u_intensity, (b3 + bg * 0.4) * u_intensity);\n\n } else if (u_effect == 7) {\n float sz = 0.4 + shp * 0.6;\n float sigma = sz * sz * 2.0;\n vec2 a1 = vec2(-0.45 + sin(t * 0.07) * 0.06, 0.45 + cos(t * 0.09) * 0.05);\n vec2 a2 = vec2(0.45 + cos(t * 0.08) * 0.06, 0.45 + sin(t * 0.06) * 0.05);\n vec2 a3 = vec2(0.0 + sin(t * 0.05) * 0.1, 0.0 + cos(t * 0.07) * 0.1);\n vec2 a4 = vec2(-0.4 + cos(t * 0.06) * 0.07, -0.3 + sin(t * 0.08) * 0.06);\n vec2 a5 = vec2(0.4 + sin(t * 0.07) * 0.06, -0.4 + cos(t * 0.05) * 0.06);\n float g1 = exp(-dot(p - a1, p - a1) / sigma);\n float g2 = exp(-dot(p - a2, p - a2) / sigma);\n float g3 = exp(-dot(p - a3, p - a3) / sigma);\n float g4 = exp(-dot(p - a4, p - a4) / sigma);\n float g5 = exp(-dot(p - a5, p - a5) / sigma);\n float nudge = dist > 0.01 ? snoise(p * (0.5 + cpx) + t * 0.04) * dist * 0.08 : 0.0;\n float w1 = (g1 + g4 + nudge) * u_intensity;\n float w2 = (g2 + g5 + nudge) * u_intensity;\n float w3 = (g3 + nudge) * u_intensity;\n col = softBlend(w1, w2, w3);\n\n } else if (u_effect == 8) {\n vec2 w1 = vec2(nfbm(p * (0.7 + cpx * 0.5) + t * 0.1), nfbm(p * (0.7 + cpx * 0.5) + vec2(3.3, 7.7) + t * 0.08));\n vec2 w2 = vec2(nfbm(p * 0.6 + w1 * (1.0 + dist) + t * 0.06), nfbm(p * 0.6 + w1 * (1.0 + dist) + vec2(1.7, 4.2) - t * 0.07));\n float f1 = nfbm(p + w2 * 1.5);\n float f2 = nfbm(p + w2 * 1.5 + vec2(4.1, 2.3));\n float f3 = nfbm(p + w2 * 1.5 + vec2(7.5, 6.1));\n col = softBlend((f1 * 0.5 + 0.5) * u_intensity, (f2 * 0.5 + 0.5) * u_intensity, (f3 * 0.5 + 0.5) * u_intensity);\n\n } else if (u_effect == 9) {\n vec2 sw = vec2(sin(p.y * 2.0 + t * 0.3) * 0.15 + snoise(p * 1.5 + t * 0.15) * dist * 0.3, cos(p.x * 1.8 + t * 0.25) * 0.15 + snoise(p * 1.5 + vec2(5.0, 0.0) + t * 0.12) * dist * 0.3);\n vec2 wp = p + sw;\n float caustic = (snoise(wp * (1.5 + cpx * 2.0) + t * 0.2) * 0.5 + 0.5) + (snoise(wp * (2.0 + cpx * 2.0) - t * 0.15) * 0.5 + 0.5) * 0.5;\n caustic = caustic / 1.5;\n float depth = nfbm(vec2(p.x * 0.3, p.y * 0.8) + t * 0.05) * 0.5 + 0.5;\n col = softBlend(depth * u_intensity, (1.0 - depth) * u_intensity, caustic * u_intensity);\n\n } else if (u_effect == 10) {\n float angle = 0.6 + shp * 1.2;\n float ca = cos(angle), sa = sin(angle);\n vec2 rp = vec2(p.x * ca - p.y * sa, p.x * sa + p.y * ca);\n float n1 = nfbm(rp * 0.8 + t * 0.12) * (1.0 + dist * 2.0);\n float n2 = nfbm(rp * 0.6 + vec2(3.0, 0.0) + t * 0.1) * (1.0 + dist * 1.5);\n float wave = sin(rp.x * (2.0 + cpx * 2.0) + n1 + t * 0.3);\n float wave2 = sin(rp.x * (1.5 + cpx * 1.5) + n2 - t * 0.2);\n float ribbon1 = exp(-2.0 * (rp.y - wave * 0.35) * (rp.y - wave * 0.35)) * u_intensity;\n float ribbon2 = exp(-2.0 * (rp.y - 0.15 - wave2 * 0.3) * (rp.y - 0.15 - wave2 * 0.3)) * u_intensity;\n float bg = nfbm(p * 0.4 + t * 0.03) * 0.5 + 0.5;\n col = softBlend(ribbon1, ribbon2, bg * 0.5 * u_intensity);\n\n } else if (u_effect == 11) {\n vec2 q = vec2(nfbm(p * 0.5 + vec2(t * 0.05, 0.0)), nfbm(p * 0.5 + vec2(0.0, t * 0.07)));\n vec2 r = vec2(nfbm(p * 0.6 + q * (1.0 + dist * 1.5) + vec2(1.7, 9.2) + t * 0.03), nfbm(p * 0.6 + q * (1.0 + dist * 1.5) + vec2(8.3, 2.8) + t * 0.04));\n float f = nfbm(p + r * 1.5);\n float f2 = nfbm(p * 0.7 + r + vec2(3.0, 7.0));\n col = softBlend((f * 0.5 + 0.5) * u_intensity, (f2 * 0.5 + 0.5) * u_intensity, (nfbm(p * 0.4 - t * 0.02) * 0.5 + 0.5) * u_intensity);\n\n } else if (u_effect == 12) {\n vec2 w = warp(p * 0.5, t * 0.7);\n float fold1 = sin(p.x * (1.5 + cpx * 2.0) + w.x * 1.5 + t * 0.2) * 0.5 + 0.5;\n float fold2 = sin(p.y * (1.2 + cpx * 1.5) + w.y * 1.5 - t * 0.15) * 0.5 + 0.5;\n float fold3 = sin((p.x - p.y) * (0.8 + cpx * 0.8) + (w.x + w.y) + t * 0.1) * 0.5 + 0.5;\n col = softBlend(fold1 * u_intensity, fold2 * u_intensity, fold3 * 0.7 * u_intensity);\n\n } else if (u_effect == 13) {\n float spread = 0.25 + shp * 0.35;\n vec2 w = warp(p, t * 0.5);\n vec2 c1 = vec2(sin(t * 0.08) * spread, cos(t * 0.11) * spread) + w * 0.15;\n vec2 c2 = vec2(cos(t * 0.09) * spread * 1.3, sin(t * 0.07) * spread) + w * 0.12;\n vec2 c3 = vec2(-sin(t * 0.1) * spread, -cos(t * 0.08) * spread * 1.2) + w * 0.1;\n float falloff = 0.3 + soft * 0.7;\n float d1 = 1.0 - smoothstep(0.0, falloff, length(p - c1 + w * dist * 0.3));\n float d2 = 1.0 - smoothstep(0.0, falloff, length(p - c2 + w * dist * 0.25));\n float d3 = 1.0 - smoothstep(0.0, falloff, length(p - c3 + w * dist * 0.2));\n float detail = nfbm(p * 2.0 + t * 0.05) * cpx * 0.3;\n col = softBlend((d1 + detail) * u_intensity, (d2 + detail) * u_intensity, (d3 + detail) * u_intensity);\n\n } else if (u_effect == 14) {\n vec2 w = warp(p * 0.6, t * 0.6);\n float angle = atan(p.y + w.y * dist, p.x + w.x * dist);\n float radius = length(p);\n float field1 = sin(angle * (2.0 + cpx * 4.0) + radius * (3.0 + cpx * 3.0) + t * 0.4 + nfbm(p + t * 0.1) * dist * 2.0) * 0.5 + 0.5;\n float field2 = sin(angle * (1.5 + cpx * 2.5) - radius * 2.0 - t * 0.3 + nfbm(p * 0.6 + t * 0.08) * dist * 1.5) * 0.5 + 0.5;\n float bg = nfbm(p * 0.3 + t * 0.03) * 0.5 + 0.5;\n col = softBlend(field1 * u_intensity, field2 * u_intensity, bg * 0.5 * u_intensity);\n\n } else if (u_effect == 15) {\n vec2 drift = vec2(t * 0.06, t * 0.03);\n float c1 = nfbm((p + drift) * (0.4 + cpx * 0.5)) * 0.5 + 0.5;\n float c2 = nfbm((p + drift + vec2(3.7, 1.2)) * (0.35 + cpx * 0.4)) * 0.5 + 0.5;\n float c3 = nfbm((p + drift + vec2(7.1, 4.5)) * (0.3 + cpx * 0.35)) * 0.5 + 0.5;\n vec2 w = warp(p * 0.2, t * 0.4);\n c1 += w.x * dist * 0.3;\n c2 += w.y * dist * 0.25;\n col = softBlend(c1 * u_intensity, c2 * u_intensity, c3 * u_intensity);\n\n } else if (u_effect == 16) {\n vec2 w = warp(vec2(p.x * 0.3, p.y * 0.6), t * 0.5);\n float c1 = sin(p.x * (1.5 + cpx * 2.0) + w.x * (1.0 + dist * 2.0) + t * 0.15) * 0.5 + 0.5;\n float c2 = sin(p.x * (1.0 + cpx * 1.5) + w.y * (1.0 + dist * 1.5) - t * 0.12 + 2.0) * 0.5 + 0.5;\n float c3 = sin(p.x * (0.8 + cpx * 1.0) + (w.x + w.y) * 0.5 * (1.0 + dist) + t * 0.08 + 4.0) * 0.5 + 0.5;\n float fade = nfbm(vec2(p.x * 0.3, p.y * 0.5) + t * 0.03) * 0.5 + 0.5;\n col = softBlend(c1 * fade * u_intensity, c2 * fade * u_intensity, c3 * (1.0 - fade * 0.4) * u_intensity * 0.7);\n\n } else if (u_effect == 17) {\n vec2 w = warp(p * 0.8, t * 0.6);\n vec2 w2 = warp(p * 0.5 + w * 0.4, t * 0.4);\n float r1 = (snoise((p + w * dist * 0.5) * (1.5 + cpx * 2.0) + t * 0.1) * 0.5 + 0.5) * u_intensity;\n float r2 = (snoise((p + w2 * dist * 0.4) * (1.2 + cpx * 1.5) + t * 0.08 + 3.0) * 0.5 + 0.5) * u_intensity;\n float r3 = (snoise((p + (w + w2) * dist * 0.3) * (0.8 + cpx * 1.0) - t * 0.06 + 7.0) * 0.5 + 0.5) * u_intensity;\n col = softBlend(r1, r2, r3);\n\n } else if (u_effect == 18) {\n vec2 w = warp(p * 0.5, t * 0.5);\n float blobSize = 0.2 + shp * 0.3;\n float total1 = 0.0, total2 = 0.0;\n for (int i = 0; i < 5; i++) {\n float fi = float(i);\n vec2 c1 = vec2(sin(t * 0.1 + fi * 2.1) * 0.4, cos(t * 0.13 + fi * 1.7) * 0.35) + w * dist * 0.15;\n vec2 c2 = vec2(cos(t * 0.12 + fi * 1.9) * 0.35, sin(t * 0.09 + fi * 2.3) * 0.4) + w * dist * 0.12;\n total1 += blobSize * blobSize / (dot(p - c1, p - c1) + 0.02);\n total2 += blobSize * blobSize / (dot(p - c2, p - c2) + 0.02);\n }\n total1 = clamp(total1 * 0.25, 0.0, 1.0);\n total2 = clamp(total2 * 0.25, 0.0, 1.0);\n float total3 = nfbm(p + w * dist * 0.3 + t * 0.05) * 0.5 + 0.5;\n col = softBlend(total1 * u_intensity, total2 * u_intensity, total3 * 0.7 * u_intensity);\n\n } else if (u_effect == 19) {\n vec2 w = warp(p * 0.4, t * 0.4);\n float angle = atan(p.y, p.x);\n float radius = length(p);\n float s1 = sin(angle * (1.5 + cpx * 2.0) + radius * (3.0 + cpx * 3.0) + t * 0.3 + w.x * dist * 1.5) * 0.5 + 0.5;\n float s2 = sin(angle * (1.2 + cpx * 1.5) - radius * (2.5 + cpx * 2.5) - t * 0.25 + w.y * dist * 1.5 + 1.5) * 0.5 + 0.5;\n float s3 = sin((angle + 3.14) * (0.8 + cpx) + radius * (2.0 + cpx * 2.0) + t * 0.15 + (w.x + w.y) * dist) * 0.5 + 0.5;\n float fade = exp(-radius * (0.5 - shp * 0.3));\n col = softBlend(s1 * fade * u_intensity, s2 * fade * u_intensity, s3 * fade * 0.7 * u_intensity);\n\n } else if (u_effect == 20) {\n vec2 w = warp(p * 0.5, t * 0.4);\n vec2 wp = p + w * (0.4 + dist * 0.6);\n float scale = 0.6 + cpx * 0.8;\n float h = nfbm(wp * scale + t * 0.08);\n float eps = 0.06;\n float hx = nfbm((wp + vec2(eps, 0.0)) * scale + t * 0.08) - h;\n float hy = nfbm((wp + vec2(0.0, eps)) * scale + t * 0.08) - h;\n vec3 n = normalize(vec3(-hx * 6.0, -hy * 6.0, 1.0));\n vec3 lightDir = normalize(vec3(0.55, 0.65, 0.8));\n float light = max(dot(n, lightDir), 0.0);\n float spec = pow(light, 6.0 + shp * 26.0);\n float diffuse = light * 0.6 + 0.35;\n float fres = pow(1.0 - max(n.z, 0.0), 2.0);\n float w1 = (diffuse + spec * 0.5) * u_intensity;\n float w2 = (h * 0.5 + 0.5 + spec * 0.3 + fres * 0.3) * u_intensity;\n float w3 = (spec * 1.4 + fres * 0.5) * u_intensity;\n col = softBlend(w1, w2, w3);\n\n } else if (u_effect == 21) {\n vec2 w = warp(p * 0.4, t * 0.3);\n float angle = 0.2 + shp * 1.3;\n float ca = cos(angle), sa = sin(angle);\n vec2 rp = vec2(p.x * ca - p.y * sa, p.x * sa + p.y * ca);\n float band = sin(rp.y * (3.0 + cpx * 5.0) + w.x * (1.0 + dist * 2.5) + t * 0.35);\n float ridge = 1.0 - abs(band);\n ridge = pow(ridge, 5.0 + shp * 10.0);\n float band2 = sin(rp.y * (2.0 + cpx * 3.0) + w.y * (0.8 + dist * 2.0) - t * 0.22 + 1.4);\n float ridge2 = 1.0 - abs(band2);\n ridge2 = pow(ridge2, 3.0 + shp * 8.0);\n float bg = nfbm(p * 0.45 + t * 0.05) * 0.5 + 0.5;\n float w1 = (ridge * 1.4 + bg * 0.25) * u_intensity;\n float w2 = (ridge2 * 1.0 + bg * 0.45) * u_intensity;\n float w3 = (ridge * 0.5 + ridge2 * 0.5) * u_intensity * 0.8;\n col = softBlend(w1, w2, w3);\n\n } else if (u_effect == 22) {\n vec2 w = warp(p * 0.7, t * 0.5);\n vec2 w2 = warp(p * 0.4 + w * 0.3, t * 0.3);\n vec2 wp = p + w * (0.4 + dist * 0.6);\n float n1 = snoise(wp * (1.4 + cpx * 1.6) + t * 0.14);\n float n2 = snoise((wp + w2 * dist * 0.4) * (2.0 + cpx * 2.0) + vec2(3.0, 7.0) - t * 0.1);\n float ridge1 = 1.0 - abs(n1);\n ridge1 = pow(ridge1, 5.0 + shp * 12.0);\n float ridge2 = 1.0 - abs(n2);\n ridge2 = pow(ridge2, 4.0 + shp * 10.0);\n float base = (n1 + n2) * 0.25 + 0.5;\n float w1 = (base * 0.6 + ridge1 * 1.2) * u_intensity;\n float w2c = ((1.0 - base) * 0.6 + ridge2 * 1.0) * u_intensity;\n float w3 = (ridge1 * 0.8 + ridge2 * 0.6) * u_intensity;\n col = softBlend(w1, w2c, w3);\n\n } else if (u_effect == 23) {\n float angle = 0.1 + shp * 1.4;\n float ca = cos(angle), sa = sin(angle);\n vec2 rp = vec2(p.x * ca - p.y * sa, p.x * sa + p.y * ca);\n vec2 stretch = vec2(rp.x * (5.0 + cpx * 4.0), rp.y * (0.35 + cpx * 0.3));\n vec2 sw = warp(stretch * 0.3, t * 0.3) * dist;\n float n1 = snoise(stretch + sw + t * 0.08);\n float n2 = snoise(stretch * 1.4 + vec2(2.0, 5.0) + sw - t * 0.06);\n float streak = 1.0 - abs(n1);\n streak = pow(streak, 6.0 + shp * 12.0);\n float streak2 = 1.0 - abs(n2);\n streak2 = pow(streak2, 4.0 + shp * 8.0);\n float bg = nfbm(p * 0.4 + t * 0.04) * 0.4 + 0.4;\n float w1 = (streak * 1.4 + bg * 0.3) * u_intensity;\n float w2 = (streak2 * 0.9 + bg * 0.5) * u_intensity;\n float w3 = (streak * 0.7 + streak2 * 0.4) * u_intensity * 0.8;\n col = softBlend(w1, w2, w3);\n\n } else if (u_effect == 24) {\n vec2 w1 = warp(p * 0.55, t * 0.4);\n vec2 w2 = warp(p * 0.7 + w1 * 0.4, t * 0.3);\n vec2 wp = p + (w1 + w2) * (0.4 + dist * 0.7);\n\n float scale = 0.65 + cpx * 0.7;\n float n1 = nfbm(wp * scale + vec2(0.0, 0.0) + t * 0.10);\n float n2 = nfbm(wp * scale + vec2(3.7, 5.2) - t * 0.07);\n float n3 = nfbm(wp * scale + vec2(7.1, 2.3) + t * 0.06);\n float n4 = nfbm(wp * scale + vec2(1.8, 8.4) - t * 0.08);\n float n5 = nfbm(wp * scale + vec2(4.9, 1.1) + t * 0.05);\n float n6 = nfbm(wp * scale + vec2(6.3, 7.8) - t * 0.09);\n float n7 = nfbm(wp * scale + vec2(2.4, 4.6) + t * 0.04);\n\n float pw = 2.5 + shp * 5.0;\n n1 = pow(clamp(n1, 0.0, 1.0), pw);\n n2 = pow(clamp(n2, 0.0, 1.0), pw);\n n3 = pow(clamp(n3, 0.0, 1.0), pw);\n n4 = pow(clamp(n4, 0.0, 1.0), pw);\n n5 = pow(clamp(n5, 0.0, 1.0), pw);\n n6 = pow(clamp(n6, 0.0, 1.0), pw);\n n7 = pow(clamp(n7, 0.0, 1.0), pw);\n\n float intens = 0.5 + u_intensity * 0.9;\n float a1 = n1 * u_alpha1 * intens;\n float a2 = n2 * u_alpha2 * intens;\n float a3 = n3 * u_alpha3 * intens;\n float a4 = n4 * u_alpha4 * intens;\n float a5 = n5 * u_alpha5 * intens;\n float a6 = n6 * u_alpha6 * intens;\n float a7 = n7 * u_alpha7 * intens;\n float total = a1 + a2 + a3 + a4 + a5 + a6 + a7 + 0.001;\n col = (u_color1 * a1 + u_color2 * a2 + u_color3 * a3 + u_color4 * a4\n + u_color5 * a5 + u_color6 * a6 + u_color7 * a7) / total;\n\n } else if (u_effect == 25) {\n float d = (uv.x + (1.0 - uv.y)) * 0.5;\n float w = 0.9 / max(u_scale, 0.25);\n float cyc = t * 0.08;\n float pA = mix(-w, 1.0 + w, sweepEase(fract(cyc)));\n float pB = mix(-w, 1.0 + w, sweepEase(fract(cyc + 0.5)));\n float band = max(\n clamp(1.0 - abs(d - pA) / w, 0.0, 1.0),\n clamp(1.0 - abs(d - pB) / w, 0.0, 1.0)\n );\n float v = band * u_intensity;\n\n vec2 ggs = gridCounts(6.0 + u_cellSize * 74.0);\n if (u_dotMode > 1.5) {\n ggs = max(vec2(2.0), floor(ggs * (1.0 - u_gap * 0.8)));\n }\n vec2 cell = floor(uv * ggs);\n float clk = t * 1.6;\n // Wrap the stepped clock to keep sin() arguments small. u_time grows\n // unbounded over a session; on mediump-float GPUs (older Android, some\n // iOS) large hash inputs lose precision and the flicker bands/freezes.\n // mod(x, 1024) keeps the crossfade continuous across the wrap\n // (step 1023 fades into step 0, whose hash is the next s0).\n float step0 = mod(floor(clk), 1024.0);\n float step1 = mod(step0 + 1.0, 1024.0);\n float fz = smoothstep(0.0, 1.0, fract(clk));\n float cellSeed = dot(cell, vec2(127.1, 311.7));\n float r1 = fract(sin(cellSeed + step0 * 17.23) * 43758.5453);\n float r2 = fract(sin(cellSeed + step1 * 17.23) * 43758.5453);\n float rnd = mix(r1, r2, fz);\n v += (rnd - 0.5) * u_flicker * 0.9 * (0.15 + band * 0.85);\n\n col = palette(clamp(v, 0.0, 1.0));\n }\n\n return col;\n }\n\n void main() {\n vec2 uv = gl_FragCoord.xy / u_resolution;\n float aspect = u_resolution.x / u_resolution.y;\n float t = u_time * u_speed;\n float dist = u_distortion;\n float soft = u_softness;\n float cpx = u_complexity;\n float shp = u_shape;\n\n vec2 sampleUV = uv;\n if (u_dotMode > 0.5) {\n vec2 gs = gridCounts(6.0 + u_cellSize * 74.0);\n if (u_dotMode > 1.5) {\n gs = max(vec2(2.0), floor(gs * (1.0 - u_gap * 0.8)));\n }\n sampleUV = (floor(uv * gs) + vec2(0.5)) / gs;\n }\n\n vec3 col;\n if (u_blur < 0.01) {\n col = computeEffect(sampleUV, aspect, t, dist, soft, cpx, shp);\n } else {\n float r = u_blur * 0.02;\n col = computeEffect(sampleUV, aspect, t, dist, soft, cpx, shp) * 0.4;\n col += computeEffect(sampleUV + vec2( r, 0.0), aspect, t, dist, soft, cpx, shp) * 0.15;\n col += computeEffect(sampleUV + vec2(-r, 0.0), aspect, t, dist, soft, cpx, shp) * 0.15;\n col += computeEffect(sampleUV + vec2( 0.0, r), aspect, t, dist, soft, cpx, shp) * 0.15;\n col += computeEffect(sampleUV + vec2( 0.0, -r), aspect, t, dist, soft, cpx, shp) * 0.15;\n }\n\n vec3 baseCol = col;\n if (u_dotMode < 0.5) {\n col = pow(col, vec3(1.3));\n }\n\n // CSS-pixel distance to the nearest edge \u2014 keeps the vignette / edge-fade\n // bands a consistent physical width on every side of any aspect ratio.\n vec2 cssRes = u_resolution / max(u_dpr, 0.0001);\n vec2 cssCoord = uv * cssRes;\n float edgeDistPx = min(\n min(cssCoord.x, cssRes.x - cssCoord.x),\n min(cssCoord.y, cssRes.y - cssCoord.y)\n );\n float vigRangePx = 40.0 * (1.0 + u_vignette * 3.0);\n float vig = (edgeDistPx * edgeDistPx) / (vigRangePx * vigRangePx);\n vig = smoothstep(0.0, 1.0, vig);\n col *= mix(1.0, vig, u_vignette * u_vigOpacity);\n\n float colorAlpha = (u_alpha1 + u_alpha2 + u_alpha3 + u_alpha4 + u_alpha5) / 5.0;\n if (colorAlpha < 0.999) {\n vec3 c1d = col - u_color1, c2d = col - u_color2, c3d = col - u_color3, c4d = col - u_color4, c5d = col - u_color5;\n float prox1 = exp(-8.0 * dot(c1d, c1d));\n float prox2 = exp(-8.0 * dot(c2d, c2d));\n float prox3 = exp(-8.0 * dot(c3d, c3d));\n float prox4 = exp(-8.0 * dot(c4d, c4d));\n float prox5 = exp(-8.0 * dot(c5d, c5d));\n float pTotal = prox1 + prox2 + prox3 + prox4 + prox5 + 0.0001;\n colorAlpha = (prox1*u_alpha1 + prox2*u_alpha2 + prox3*u_alpha3 + prox4*u_alpha4 + prox5*u_alpha5) / pTotal;\n }\n float alpha = colorAlpha;\n\n if (u_dotMode > 0.5) {\n vec2 gridSize = gridCounts(6.0 + u_cellSize * 74.0);\n if (u_dotMode > 1.5) {\n gridSize = max(vec2(2.0), floor(gridSize * (1.0 - u_gap * 0.8)));\n }\n // cellLocal is in [0,1] within each cell. Because gridSize was chosen so\n // that cell PIXEL size is square, distance / mask math here works in\n // screen-square units even though we're operating in normalised cell uv.\n vec2 cellLocal = fract(uv * gridSize);\n\n float hlFactor = 0.0;\n if (u_highlight > 0.01 || u_hlScale > 0.01) {\n vec2 cellCenter = (floor(uv * gridSize) + vec2(0.5)) / gridSize;\n vec2 cp2 = (cellCenter - 0.5) * u_scale;\n cp2.x *= aspect;\n float lw = sin(cp2.x * 3.0 + t * 1.5) * 0.5 + 0.5;\n lw *= sin(cp2.y * 2.5 - t * 1.1) * 0.5 + 0.5;\n lw += (snoise(cp2 * 2.0 + t * 0.6) * 0.5 + 0.5) * 0.3;\n hlFactor = clamp(lw, 0.0, 1.0);\n hlFactor *= hlFactor;\n }\n\n float scaleBoost = 1.0 + smoothstep(0.2, 0.8, hlFactor) * u_hlScale * 1.2;\n\n float mask = 1.0;\n if (u_dotMode < 1.5) {\n float gapW = u_gap * 0.35 / scaleBoost;\n if (gapW > 0.003) {\n mask = step(gapW, cellLocal.x) * step(gapW, 1.0 - cellLocal.x)\n * step(gapW, cellLocal.y) * step(gapW, 1.0 - cellLocal.y);\n }\n } else {\n // Render the circular dot mask in screen-pixel space rather than\n // cell-local UV. We map the cell-local offset to actual pixels\n // (cellPx = u_resolution / gridSize), then apply a 1-pixel AA\n // floor to the smoothstep edge so the dot rim is crisp and\n // properly anti-aliased even at u_dotSoftness near 0. The user\n // softness slider still scales linearly on top of the floor.\n // No fwidth() / GL_OES_standard_derivatives needed - dPx is\n // already in pixel units, so a fixed 1-px edge IS pixel-perfect.\n // gridCounts() already keeps cells square in screen space, so\n // pxOffset traces true circles (not ellipses) on any aspect.\n vec2 cellPx = u_resolution / gridSize;\n vec2 pxOffset = (cellLocal - 0.5) * cellPx;\n float dPx = length(pxOffset);\n float minCellPx = min(cellPx.x, cellPx.y);\n float radiusPx = u_dotSize * 0.5 * minCellPx * scaleBoost;\n // 0.5-px AA floor (1-px total smoothstep ramp) keeps the rim\n // pixel-perfect at u_dotSoftness=0 while letting the user softness\n // value dominate at the bundled preset defaults (e.g. softness=0.1\n // on a ~28-px cell yields softPx=0.56 -> ~1.1-px ramp, matching\n // the original cell-local behaviour). A larger floor (e.g. 1.0)\n // would widen low-softness dots and visually lighten dot presets.\n float aaPx = 0.5;\n float softPx = u_dotSoftness * 0.2 * minCellPx;\n float edgePx = max(aaPx, softPx);\n mask = 1.0 - smoothstep(radiusPx - edgePx, radiusPx + edgePx, dPx);\n }\n\n if (u_highlight > 0.01) {\n float hl = hlFactor * u_highlight;\n col = col * (1.0 + hl * 2.5) + vec3(hl * hl * 0.3);\n }\n\n if (u_edgeFade > 0.5 && u_fadeStr > 0.005) {\n float ef = smoothstep(0.0, u_edgeFade, edgeDistPx);\n mask *= mix(1.0, ef, u_fadeStr);\n }\n\n float baseOpacity = (u_dotMode < 1.5) ? u_fillOpacity : 0.0;\n alpha = colorAlpha * mix(baseOpacity, u_dotOpacity, mask);\n\n float bgLum = dot(u_cardBg, vec3(0.299, 0.587, 0.114));\n float colLum = dot(baseCol, vec3(0.299, 0.587, 0.114));\n alpha *= smoothstep(0.0, 0.33, abs(colLum - bgLum));\n }\n\n gl_FragColor = vec4(col, alpha * u_shaderOpacity);\n }\n"; /** Names of every uniform sampled by the fragment shader. */ export declare const UNIFORM_NAMES: readonly string[];