@firecms/neat 0.9.1 → 0.9.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/NeatGradient.js +6 -1
- package/dist/NeatGradient.js.map +1 -1
- package/dist/index.es.js +3 -1
- package/dist/index.es.js.map +1 -1
- package/dist/index.umd.js +1 -1
- package/dist/index.umd.js.map +1 -1
- package/package.json +1 -1
- package/src/NeatGradient.ts +6 -1
package/dist/index.umd.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.umd.js","sources":["../src/shaders.ts","../src/math.ts","../src/NeatGradient.ts"],"sourcesContent":["export const vertexShaderSource = `void main() {\n vUv = uv;\n vPosition = position;\n\n // SCROLLING LOGIC\n // Separate multipliers for wave, color, and flow offsets\n float waveOffset = -u_y_offset * u_y_offset_wave_multiplier;\n float colorOffset = -u_y_offset * u_y_offset_color_multiplier;\n float flowOffset = -u_y_offset * u_y_offset_flow_multiplier;\n\n // 1. DISPLACEMENT (WAVES)\n // We add waveOffset to Y to scroll the wave pattern\n v_displacement_amount = cnoise( vec3(\n u_wave_frequency_x * position.x + u_time,\n u_wave_frequency_y * (position.y + waveOffset) + u_time,\n u_time\n ));\n\n // 2. FLOW FIELD\n // Apply flow offset to scroll the flow field mask\n vec2 baseUv = vUv;\n baseUv.y += flowOffset / u_plane_height; // Scale to match wave speed\n vec2 flowUv = baseUv;\n\n if (u_flow_enabled > 0.5) {\n if (u_flow_ease > 0.0 || u_flow_distortion_a > 0.0) {\n vec2 ppp = -1.0 + 2.0 * baseUv;\n ppp += 0.1 * cos((1.5 * u_flow_scale) * ppp.yx + 1.1 * u_time + vec2(0.1, 1.1));\n ppp += 0.1 * cos((2.3 * u_flow_scale) * ppp.yx + 1.3 * u_time + vec2(3.2, 3.4));\n ppp += 0.1 * cos((2.2 * u_flow_scale) * ppp.yx + 1.7 * u_time + vec2(1.8, 5.2));\n ppp += u_flow_distortion_a * cos((u_flow_distortion_b * u_flow_scale) * ppp.yx + 1.4 * u_time + vec2(6.3, 3.9));\n\n float r = length(ppp);\n flowUv = mix(baseUv, vec2(baseUv.x * (1.0 - u_flow_ease) + r * u_flow_ease, baseUv.y), u_flow_ease);\n }\n }\n\n // Pass the standard flow UV to fragment shader (for texture)\n vFlowUv = flowUv;\n\n // 3. COLOR MIXING\n // We take the computed flow UVs and apply the color offset\n // Scale by plane height to match wave offset speed (world space vs UV space)\n vec3 color = u_colors[0].color;\n\n vec3 distortedPos = position;\n if (u_flat_shading < 0.5) {\n if (u_flow_enabled > 0.5) {\n if (u_flow_ease > 0.0 || u_flow_distortion_a > 0.0) {\n vec3 ppp = position / 25.0;\n ppp.xyz += 0.1 * cos((1.5 * u_flow_scale) * ppp.yxz + 1.1 * u_time + vec3(0.1, 1.1, 2.1));\n ppp.xyz += 0.1 * cos((2.3 * u_flow_scale) * ppp.zxy + 1.3 * u_time + vec3(3.2, 3.4, 1.2));\n ppp.xyz += 0.1 * cos((2.2 * u_flow_scale) * ppp.yxz + 1.7 * u_time + vec3(1.8, 5.2, 3.1));\n ppp.xyz += u_flow_distortion_a * cos((u_flow_distortion_b * u_flow_scale) * ppp.zxy + 1.4 * u_time + vec3(6.3, 3.9, 4.5));\n\n float r = length(ppp);\n distortedPos = mix(position, vec3(\n position.x * (1.0 - u_flow_ease) + r * u_flow_ease * 25.0,\n position.y,\n position.z * (1.0 - u_flow_ease) + r * u_flow_ease * 25.0\n ), u_flow_ease);\n }\n }\n }\n\n vec3 noise_cord;\n if (u_flat_shading < 0.5) {\n noise_cord = vec3(distortedPos.x / 50.0, (distortedPos.y + colorOffset) / 50.0, distortedPos.z / 50.0);\n } else {\n vec2 adjustedUv = flowUv;\n adjustedUv.y += colorOffset / u_plane_height;\n noise_cord = vec3(adjustedUv, 0.0);\n }\n\n const float minNoise = .0;\n const float maxNoise = .9;\n\n for (int i = 1; i < 6; i++) {\n if (i < u_colors_count) {\n if (u_colors[i].is_active > 0.5) {\n float noiseFlow = (1. + float(i)) / 30.;\n float noiseSpeed = (1. + float(i)) * 0.11;\n float noiseSeed = 13. + float(i) * 7.;\n\n float noise_z = u_time * noiseSpeed;\n if (u_flat_shading < 0.5) {\n noise_z = noise_cord.z * u_color_pressure.x * u_color_pressure.x + u_time * noiseSpeed;\n }\n\n float noise = snoise(\n vec3(\n noise_cord.x * u_color_pressure.x * u_color_pressure.x + u_time * noiseFlow * 2.,\n noise_cord.y * u_color_pressure.y * u_color_pressure.y,\n noise_z\n ) + noiseSeed\n ) - (.1 * float(i)) + (.5 * u_color_blending);\n\n noise = clamp(noise, minNoise, maxNoise + float(i) * 0.02);\n color = mix(color, u_colors[i].color, smoothstep(0.0, u_color_blending, noise));\n }\n }\n }\n\n v_color = color;\n\n // 4. FRESNEL (rim glow)\n // (Calculated in fragment shader using displacement slope approximation)\n\n // 5. VERTEX POSITION\n vec3 newPosition = position + normal * v_displacement_amount * u_wave_amplitude;\n vec4 mvPosition = modelViewMatrix * vec4(newPosition, 1.0);\n vViewPosition = mvPosition.xyz;\n vNormal = normalize((modelViewMatrix * vec4(normal, 0.0)).xyz);\n gl_Position = projectionMatrix * mvPosition;\n v_new_position = gl_Position;\n}\n`;\n\nexport const fragmentShaderSource = `float random(vec2 p) {\n return fract(sin(dot(p, vec2(12.9898,78.233))) * 43758.5453);\n}\n\nfloat fbm(vec3 x) {\n float value = 0.0;\n float amplitude = 0.5;\n float frequency = 1.0;\n for (int i = 0; i < 2; i++) {\n value += amplitude * snoise(x * frequency);\n frequency *= 2.0;\n amplitude *= 0.5;\n }\n return value;\n}\n\n// Branchless HSL to RGB for iridescence\nvec3 hsl2rgb(float h, float s, float l) {\n vec3 rgb = clamp(abs(mod(h * 6.0 + vec3(0.0, 4.0, 2.0), 6.0) - 3.0) - 1.0, 0.0, 1.0);\n return l + s * (rgb - 0.5) * (1.0 - abs(2.0 * l - 1.0));\n}\n\nvoid main() {\n vec2 finalUv = vFlowUv;\n \n vec3 baseColor;\n float texAlpha = 1.0;\n\n if (u_enable_procedural_texture > 0.5) {\n if (u_flat_shading < 0.5) {\n float parallaxFactor = 0.25;\n float scrollOffset = (u_y_offset * u_y_offset_color_multiplier) * parallaxFactor;\n vec3 scrolledPos = vPosition;\n scrolledPos.y -= scrollOffset;\n \n vec3 p = (scrolledPos * 1.5) / 50.0;\n vec2 uvX = p.yz + vec2(0.5);\n vec2 uvY = p.zx + vec2(0.5);\n vec2 uvZ = p.xy + vec2(0.5);\n \n vec4 colX = texture2D(u_procedural_texture, uvX);\n vec4 colY = texture2D(u_procedural_texture, uvY);\n vec4 colZ = texture2D(u_procedural_texture, uvZ);\n \n vec3 n = normalize(vNormal);\n vec3 blendWeights = abs(n);\n blendWeights = blendWeights / (blendWeights.x + blendWeights.y + blendWeights.z + 0.0001);\n \n vec4 texSample = colX * blendWeights.x + colY * blendWeights.y + colZ * blendWeights.z;\n baseColor = texSample.rgb;\n if (u_transparent_texture_void > 0.5) {\n texAlpha = texSample.a;\n }\n } else {\n vec2 ppp = -1.0 + 2.0 * finalUv;\n ppp += 0.1 * cos((1.5 * u_flow_scale) * ppp.yx + 1.1 * u_time + vec2(0.1, 1.1));\n ppp += 0.1 * cos((2.3 * u_flow_scale) * ppp.yx + 1.3 * u_time + vec2(3.2, 3.4));\n ppp += 0.1 * cos((2.2 * u_flow_scale) * ppp.yx + 1.7 * u_time + vec2(1.8, 5.2));\n ppp += u_flow_distortion_a * cos((u_flow_distortion_b * u_flow_scale) * ppp.yx + 1.4 * u_time + vec2(6.3, 3.9));\n float r = length(ppp);\n \n float vx = (finalUv.x * u_texture_ease) + (r * (1.0 - u_texture_ease));\n float vy = (finalUv.y * u_texture_ease) + (0.0 * (1.0 - u_texture_ease));\n vec2 texUv = vec2(vx, vy);\n\n float parallaxFactor = 0.25;\n texUv.y -= (u_y_offset * u_y_offset_color_multiplier / u_plane_height) * parallaxFactor;\n texUv *= 1.5;\n\n vec4 texSample = texture2D(u_procedural_texture, texUv);\n baseColor = texSample.rgb;\n if (u_transparent_texture_void > 0.5) {\n texAlpha = texSample.a;\n }\n }\n } else {\n baseColor = v_color;\n }\n\n vec3 color = baseColor;\n\n // === DOMAIN WARPING (simplified: 3 fbm calls instead of 5) ===\n if (u_domain_warp_enabled > 0.5) {\n vec3 p;\n if (u_flat_shading < 0.5) {\n p = vec3((vPosition / 50.0 + vec3(0.5)) * u_domain_warp_scale);\n p.z += u_time * 0.15;\n } else {\n p = vec3(finalUv * u_domain_warp_scale, u_time * 0.15);\n }\n vec2 q = vec2(fbm(p), fbm(p + vec3(5.2, 1.3, 0.0)));\n float f = fbm(p + vec3(4.0 * q, 0.0));\n vec3 warpColor = color * (1.0 + f * 0.8 * u_domain_warp_intensity);\n float pattern = clamp(f * f * f + 0.6 * f * f + 0.5 * f, 0.0, 1.0);\n color = mix(color, warpColor * (0.6 + pattern * 0.8), u_domain_warp_intensity * 0.7);\n }\n\n // Post-processing\n // Compute dynamic pixel-perfect normal using smooth normal\n vec3 normal = normalize(vNormal);\n vec3 viewDir = vec3(0.0, 0.0, 1.0);\n float ndotv = dot(normal, viewDir);\n \n // Cull back-faces for closed 3D shapes (Sphere=1, Torus=2, Cylinder=3)\n if (u_shape_type > 0.5 && u_shape_type < 3.5) {\n if (ndotv < 0.0) {\n discard;\n }\n } else {\n // Double-sided shapes (Plane, Ribbon): flip normal if back-facing\n if (ndotv < 0.0) {\n normal = -normal;\n ndotv = -ndotv;\n }\n }\n vec3 lightDir = normalize(vec3(1.0, 1.0, 1.0));\n float diffuse = max(dot(normal, lightDir), 0.0);\n vec3 halfDir = normalize(lightDir + viewDir);\n float specular = pow(max(dot(normal, halfDir), 0.0), 32.0);\n\n // Blend smooth 3D shading with smooth height-based wave shading\n if (u_flat_shading > 0.5) {\n // Flat / height-based wave shading (plane style)\n color += v_displacement_amount * u_highlights;\n float heightShadow = 1.0 - v_displacement_amount;\n color -= heightShadow * heightShadow * u_shadows;\n } else {\n // 3D shading\n color += specular * u_highlights;\n color += v_displacement_amount * u_highlights * 0.5;\n float heightShadow = 1.0 - v_displacement_amount;\n color -= heightShadow * heightShadow * u_shadows * 0.5;\n color -= (1.0 - diffuse) * u_shadows * 0.5;\n }\n color = saturation(color, 1.0 + u_saturation);\n color = color * u_brightness;\n\n // === IRIDESCENCE ===\n if (u_iridescence_enabled > 0.5) {\n float hue = fract(v_displacement_amount * 0.5 + 0.5 + u_time * u_iridescence_speed * 0.05);\n vec3 iriColor = hsl2rgb(hue, 0.8, 0.6);\n color = mix(color, iriColor, u_iridescence_intensity * abs(v_displacement_amount) * 0.6);\n }\n\n // === FRESNEL (Rim glow) ===\n if (u_fresnel_enabled > 0.5) {\n float slope = 1.0 - abs(v_displacement_amount);\n float fresnel = pow(max(slope, 0.0), u_fresnel_power);\n color += u_fresnel_color * fresnel * u_fresnel_intensity;\n }\n\n // === VIGNETTE ===\n if (u_vignette_intensity > 0.0) {\n vec2 vigUv = vUv;\n if (u_flat_shading < 0.5) {\n vigUv = (v_new_position.xy / v_new_position.w) * 0.5 + vec2(0.5);\n }\n float dist = length(vigUv - vec2(0.5));\n float vig = smoothstep(u_vignette_radius, u_vignette_radius * 0.3, dist);\n color *= mix(1.0, vig, u_vignette_intensity);\n }\n\n // === FAKE BLOOM ===\n if (u_bloom_intensity > 0.0) {\n float luma = dot(color, vec3(0.2126, 0.7152, 0.0722));\n float bloomMask = smoothstep(u_bloom_threshold, 1.0, luma);\n color += color * bloomMask * u_bloom_intensity;\n }\n\n // === CHROMATIC ABERRATION ===\n if (u_chromatic_aberration > 0.0) {\n float caAmount = u_chromatic_aberration * 0.008;\n vec2 caUv = vUv;\n if (u_flat_shading < 0.5) {\n caUv = (v_new_position.xy / v_new_position.w) * 0.5 + vec2(0.5);\n }\n float dist = length(caUv - vec2(0.5));\n float rShift = v_displacement_amount + caAmount * dist;\n float bShift = v_displacement_amount - caAmount * dist;\n color.r *= 1.0 + rShift * caAmount * 10.0;\n color.b *= 1.0 - bShift * caAmount * 10.0;\n }\n\n // Grain (use cheap hash noise instead of expensive fbm when static)\n float grain = 0.0;\n if (u_grain_intensity > 0.0) {\n vec2 noiseCoords = gl_FragCoord.xy / u_grain_scale;\n if (u_grain_speed != 0.0 || u_flat_shading > 0.5) {\n grain = fbm(vec3(noiseCoords, u_time * u_grain_speed));\n } else {\n // Static grain: use cheap hash instead of fbm\n grain = random(noiseCoords) - 0.5;\n }\n\n grain = grain * 0.5 + 0.5;\n grain -= 0.5;\n grain = (grain > u_grain_sparsity) ? grain : 0.0;\n grain *= u_grain_intensity;\n }\n\n color += vec3(grain);\n\n float edgeAlpha = 1.0;\n \n // Silhouette falloff for 3D shapes (skip when flat shading or fade is zero)\n if (u_silhouette_fade > 0.0 && u_flat_shading < 0.5) {\n edgeAlpha = smoothstep(0.0, u_silhouette_fade, ndotv);\n }\n \n // UV boundary falloff for open shapes\n if (u_shape_type == 3.0) { // Cylinder: fade top/bottom ends\n float vFade = smoothstep(0.0, u_cylinder_fade, vUv.y) * smoothstep(1.0, 1.0 - u_cylinder_fade, vUv.y);\n edgeAlpha *= vFade;\n } else if (u_shape_type == 4.0) { // Ribbon: fade all 4 borders\n float uFade = smoothstep(0.0, u_ribbon_fade, vUv.x) * smoothstep(1.0, 1.0 - u_ribbon_fade, vUv.x);\n float vFade = smoothstep(0.0, u_ribbon_fade, vUv.y) * smoothstep(1.0, 1.0 - u_ribbon_fade, vUv.y);\n edgeAlpha *= uFade * vFade;\n }\n\n edgeAlpha *= texAlpha;\n gl_FragColor = vec4(color, edgeAlpha);\n}\n`;\n\nexport function buildVertUniforms(): string {\n return `precision highp float;\n\nattribute vec3 position;\nattribute vec3 normal;\nattribute vec2 uv;\n\nuniform mat4 modelViewMatrix;\nuniform mat4 projectionMatrix;\n\nvarying vec2 vUv;\nvarying vec2 vFlowUv;\nvarying vec4 v_new_position;\nvarying vec3 v_color;\nvarying float v_displacement_amount;\nvarying vec3 vViewPosition;\nvarying vec3 vNormal;\nvarying vec3 vPosition;\n\nuniform float u_time;\nuniform vec2 u_resolution;\nuniform vec2 u_color_pressure;\nuniform float u_wave_frequency_x;\nuniform float u_wave_frequency_y;\nuniform float u_wave_amplitude;\nuniform float u_plane_width;\nuniform float u_plane_height;\nuniform float u_color_blending;\n\nuniform int u_colors_count;\nstruct ColorStop {\n float is_active;\n vec3 color;\n float influence;\n};\nuniform ColorStop u_colors[6];\n\nuniform float u_y_offset;\nuniform float u_y_offset_wave_multiplier;\nuniform float u_y_offset_color_multiplier;\nuniform float u_y_offset_flow_multiplier;\n\n// Flow field uniforms\nuniform float u_flow_distortion_a;\nuniform float u_flow_distortion_b;\nuniform float u_flow_scale;\nuniform float u_flow_ease;\nuniform float u_flow_enabled;\n\n// Fresnel uniforms\nuniform float u_fresnel_enabled;\nuniform float u_fresnel_power;\nuniform float u_fresnel_intensity;\nuniform vec3 u_fresnel_color;\n\nuniform float u_shape_type;\nuniform float u_flat_shading;\n`;\n}\n\nexport function buildFragUniforms(): string {\n return `precision highp float;\n\nvarying vec2 vUv;\nvarying vec2 vFlowUv;\nvarying vec4 v_new_position;\nvarying vec3 v_color;\nvarying float v_displacement_amount;\nvarying vec3 vViewPosition;\nvarying vec3 vNormal;\nvarying vec3 vPosition;\n\nuniform float u_time;\nuniform vec2 u_resolution;\nuniform float u_plane_height;\n\nuniform float u_shadows;\nuniform float u_highlights;\nuniform float u_saturation;\nuniform float u_brightness;\nuniform float u_grain_intensity; \nuniform float u_grain_sparsity; \nuniform float u_grain_scale; \nuniform float u_grain_speed; \n\nuniform float u_y_offset;\nuniform float u_y_offset_color_multiplier;\n\n// Flow field uniforms\nuniform float u_flow_distortion_a;\nuniform float u_flow_distortion_b;\nuniform float u_flow_scale;\n\n// Procedural texture uniforms\nuniform sampler2D u_procedural_texture;\nuniform float u_enable_procedural_texture;\nuniform float u_texture_ease;\n\n// Domain warping uniforms\nuniform float u_domain_warp_enabled;\nuniform float u_domain_warp_intensity;\nuniform float u_domain_warp_scale;\n\n// Vignette uniforms\nuniform float u_vignette_intensity;\nuniform float u_vignette_radius;\n\n// Fresnel uniforms (fragment side)\nuniform float u_fresnel_enabled;\nuniform float u_fresnel_power;\nuniform float u_fresnel_intensity;\nuniform vec3 u_fresnel_color;\n\n\n\n// Iridescence uniforms\nuniform float u_iridescence_enabled;\nuniform float u_iridescence_intensity;\nuniform float u_iridescence_speed;\n\n// Bloom uniforms\nuniform float u_bloom_intensity;\nuniform float u_bloom_threshold;\n\n// Chromatic aberration\nuniform float u_chromatic_aberration;\nuniform float u_shape_type;\nuniform float u_transparent_texture_void;\nuniform float u_silhouette_fade;\nuniform float u_cylinder_fade;\nuniform float u_ribbon_fade;\nuniform float u_flat_shading;\n`;\n}\n\nexport function buildNoise(): string {\n return `\n// 1. REPLACEMENT PERMUTE: \n// Uses a hash function (fract/sin) instead of a modular lookup table.\nvec4 permute(vec4 x) {\n return floor(fract(sin(x) * 43758.5453123) * 289.0);\n}\n\n// Taylor Inverse Sqrt\nvec4 taylorInvSqrt(vec4 r) {\n return 1.79284291400159 - 0.85373472095314 * r;\n}\n\n// Fade function\nvec3 fade(vec3 t) {\n return t*t*t*(t*(t*6.0-15.0)+10.0);\n}\n\n// 3D Simplex Noise\nfloat snoise(vec3 v) {\n const vec2 C = vec2(1.0/6.0, 1.0/3.0) ;\n const vec4 D = vec4(0.0, 0.5, 1.0, 2.0);\n\n // First corner\n vec3 i = floor(v + dot(v, C.yyy) );\n vec3 x0 = v - i + dot(i, C.xxx) ;\n\n // Other corners\n vec3 g = step(x0.yzx, x0.xyz);\n vec3 l = 1.0 - g;\n vec3 i1 = min( g.xyz, l.zxy );\n vec3 i2 = max( g.xyz, l.zxy );\n\n vec3 x1 = x0 - i1 + C.xxx;\n vec3 x2 = x0 - i2 + C.yyy;\n vec3 x3 = x0 - D.yyy;\n\n // Permutations\n vec4 p = permute( permute( permute(\n i.z + vec4(0.0, i1.z, i2.z, 1.0 ))\n + i.y + vec4(0.0, i1.y, i2.y, 1.0 ))\n + i.x + vec4(0.0, i1.x, i2.x, 1.0 ));\n\n // Gradients\n float n_ = 0.142857142857; // 1.0/7.0\n vec3 ns = n_ * D.wyz - D.xzx;\n\n vec4 j = p - 49.0 * floor(p * ns.z * ns.z);\n\n vec4 x_ = floor(j * ns.z);\n vec4 y_ = floor(j - 7.0 * x_ );\n\n vec4 x = x_ *ns.x + ns.yyyy;\n vec4 y = y_ *ns.x + ns.yyyy;\n vec4 h = 1.0 - abs(x) - abs(y);\n\n vec4 b0 = vec4( x.xy, y.xy );\n vec4 b1 = vec4( x.zw, y.zw );\n\n vec4 s0 = floor(b0)*2.0 + 1.0;\n vec4 s1 = floor(b1)*2.0 + 1.0;\n vec4 sh = -step(h, vec4(0.0));\n\n vec4 a0 = b0.xzyw + s0.xzyw*sh.xxyy ;\n vec4 a1 = b1.xzyw + s1.xzyw*sh.zzww ;\n\n vec3 p0 = vec3(a0.xy,h.x);\n vec3 p1 = vec3(a0.zw,h.y);\n vec3 p2 = vec3(a1.xy,h.z);\n vec3 p3 = vec3(a1.zw,h.w);\n\n // Normalise gradients\n vec4 norm = taylorInvSqrt(vec4(dot(p0,p0), dot(p1,p1), dot(p2, p2), dot(p3,p3)));\n p0 *= norm.x;\n p1 *= norm.y;\n p2 *= norm.z;\n p3 *= norm.w;\n\n // Mix final noise value\n vec4 m = max(0.6 - vec4(dot(x0,x0), dot(x1,x1), dot(x2,x2), dot(x3,x3)), 0.0);\n m = m * m;\n return 42.0 * dot( m*m, vec4( dot(p0,x0), dot(p1,x1),\n dot(p2,x2), dot(p3,x3) ) );\n}\n\n// Classic Perlin noise\nfloat cnoise(vec3 P)\n{\n vec3 Pi0 = floor(P); \n vec3 Pi1 = Pi0 + vec3(1.0); \n \n vec3 Pf0 = fract(P); \n vec3 Pf1 = Pf0 - vec3(1.0); \n vec4 ix = vec4(Pi0.x, Pi1.x, Pi0.x, Pi1.x);\n vec4 iy = vec4(Pi0.yy, Pi1.yy);\n vec4 iz0 = Pi0.zzzz;\n vec4 iz1 = Pi1.zzzz;\n\n vec4 ixy = permute(permute(ix) + iy);\n vec4 ixy0 = permute(ixy + iz0);\n vec4 ixy1 = permute(ixy + iz1);\n\n vec4 gx0 = ixy0 * (1.0 / 7.0);\n vec4 gy0 = fract(floor(gx0) * (1.0 / 7.0)) - 0.5;\n gx0 = fract(gx0);\n vec4 gz0 = vec4(0.5) - abs(gx0) - abs(gy0);\n vec4 sz0 = step(gz0, vec4(0.0));\n gx0 -= sz0 * (step(0.0, gx0) - 0.5);\n gy0 -= sz0 * (step(0.0, gy0) - 0.5);\n\n vec4 gx1 = ixy1 * (1.0 / 7.0);\n vec4 gy1 = fract(floor(gx1) * (1.0 / 7.0)) - 0.5;\n gx1 = fract(gx1);\n vec4 gz1 = vec4(0.5) - abs(gx1) - abs(gy1);\n vec4 sz1 = step(gz1, vec4(0.0));\n gx1 -= sz1 * (step(0.0, gx1) - 0.5);\n gy1 -= sz1 * (step(0.0, gy1) - 0.5);\n\n vec3 g000 = vec3(gx0.x,gy0.x,gz0.x);\n vec3 g100 = vec3(gx0.y,gy0.y,gz0.y);\n vec3 g010 = vec3(gx0.z,gy0.z,gz0.z);\n vec3 g110 = vec3(gx0.w,gy0.w,gz0.w);\n vec3 g001 = vec3(gx1.x,gy1.x,gz1.x);\n vec3 g101 = vec3(gx1.y,gy1.y,gz1.y);\n vec3 g011 = vec3(gx1.z,gy1.z,gz1.z);\n vec3 g111 = vec3(gx1.w,gy1.w,gz1.w);\n\n vec4 norm0 = taylorInvSqrt(vec4(dot(g000, g000), dot(g010, g010), dot(g100, g100), dot(g110, g110)));\n g000 *= norm0.x;\n g010 *= norm0.y;\n g100 *= norm0.z;\n g110 *= norm0.w;\n vec4 norm1 = taylorInvSqrt(vec4(dot(g001, g001), dot(g011, g011), dot(g101, g101), dot(g111, g111)));\n g001 *= norm1.x;\n g011 *= norm1.y;\n g101 *= norm1.z;\n g111 *= norm1.w;\n\n float n000 = dot(g000, Pf0);\n float n100 = dot(g100, vec3(Pf1.x, Pf0.yz));\n float n010 = dot(g010, vec3(Pf0.x, Pf1.y, Pf0.z));\n float n110 = dot(g110, vec3(Pf1.xy, Pf0.z));\n float n001 = dot(g001, vec3(Pf0.xy, Pf1.z));\n float n101 = dot(g101, vec3(Pf1.x, Pf0.y, Pf1.z));\n float n011 = dot(g011, vec3(Pf0.x, Pf1.yz));\n float n111 = dot(g111, Pf1);\n\n vec3 fade_xyz = fade(Pf0);\n vec4 n_z = mix(vec4(n000, n100, n010, n110), vec4(n001, n101, n011, n111), fade_xyz.z);\n vec2 n_yz = mix(n_z.xy, n_z.zw, fade_xyz.y);\n float n_xyz = mix(n_yz.x, n_yz.y, fade_xyz.x);\n return 2.2 * n_xyz;\n}\n`;\n}\n\nexport function buildColorFunctions(): string {\n return `\nvec3 saturation(vec3 rgb, float adjustment) {\n const vec3 W = vec3(0.2125, 0.7154, 0.0721);\n vec3 intensity = vec3(dot(rgb, W));\n return mix(intensity, rgb, adjustment);\n}\n`;\n}\n","export class Matrix4 {\n elements: Float32Array;\n constructor() {\n this.elements = new Float32Array([\n 1, 0, 0, 0,\n 0, 1, 0, 0,\n 0, 0, 1, 0,\n 0, 0, 0, 1\n ]);\n }\n identity() {\n const e = this.elements;\n e[0] = 1; e[1] = 0; e[2] = 0; e[3] = 0;\n e[4] = 0; e[5] = 1; e[6] = 0; e[7] = 0;\n e[8] = 0; e[9] = 0; e[10] = 1; e[11] = 0;\n e[12] = 0; e[13] = 0; e[14] = 0; e[15] = 1;\n return this;\n }\n translate(tx: number, ty: number, tz: number) {\n this.elements[12] += this.elements[0] * tx + this.elements[4] * ty + this.elements[8] * tz;\n this.elements[13] += this.elements[1] * tx + this.elements[5] * ty + this.elements[9] * tz;\n this.elements[14] += this.elements[2] * tx + this.elements[6] * ty + this.elements[10] * tz;\n this.elements[15] += this.elements[3] * tx + this.elements[7] * ty + this.elements[11] * tz;\n return this;\n }\n rotateX(angle: number) {\n const c = Math.cos(angle);\n const s = Math.sin(angle);\n const m12 = this.elements[4], m22 = this.elements[5], m32 = this.elements[6], m42 = this.elements[7];\n const m13 = this.elements[8], m23 = this.elements[9], m33 = this.elements[10], m43 = this.elements[11];\n this.elements[4] = c * m12 + s * m13;\n this.elements[5] = c * m22 + s * m23;\n this.elements[6] = c * m32 + s * m33;\n this.elements[7] = c * m42 + s * m43;\n this.elements[8] = c * m13 - s * m12;\n this.elements[9] = c * m23 - s * m22;\n this.elements[10] = c * m33 - s * m32;\n this.elements[11] = c * m43 - s * m42;\n return this;\n }\n rotateY(angle: number) {\n const c = Math.cos(angle);\n const s = Math.sin(angle);\n const m11 = this.elements[0], m21 = this.elements[1], m31 = this.elements[2], m41 = this.elements[3];\n const m13 = this.elements[8], m23 = this.elements[9], m33 = this.elements[10], m43 = this.elements[11];\n this.elements[0] = c * m11 - s * m13;\n this.elements[1] = c * m21 - s * m23;\n this.elements[2] = c * m31 - s * m33;\n this.elements[3] = c * m41 - s * m43;\n this.elements[8] = s * m11 + c * m13;\n this.elements[9] = s * m21 + c * m23;\n this.elements[10] = s * m31 + c * m33;\n this.elements[11] = s * m41 + c * m43;\n return this;\n }\n rotateZ(angle: number) {\n const c = Math.cos(angle);\n const s = Math.sin(angle);\n const m11 = this.elements[0], m21 = this.elements[1], m31 = this.elements[2], m41 = this.elements[3];\n const m12 = this.elements[4], m22 = this.elements[5], m32 = this.elements[6], m42 = this.elements[7];\n this.elements[0] = c * m11 + s * m12;\n this.elements[1] = c * m21 + s * m22;\n this.elements[2] = c * m31 + s * m32;\n this.elements[3] = c * m41 + s * m42;\n this.elements[4] = -s * m11 + c * m12;\n this.elements[5] = -s * m21 + c * m22;\n this.elements[6] = -s * m31 + c * m32;\n this.elements[7] = -s * m41 + c * m42;\n return this;\n }\n}\n\nexport class OrthographicCamera {\n left: number;\n right: number;\n top: number;\n bottom: number;\n near: number;\n far: number;\n position: [number, number, number];\n projectionMatrix: Matrix4;\n zoom: number;\n\n constructor(left: number, right: number, top: number, bottom: number, near: number, far: number) {\n this.left = left;\n this.right = right;\n this.top = top;\n this.bottom = bottom;\n this.near = near;\n this.far = far;\n this.position = [0, 0, 0];\n this.zoom = 1.0;\n this.projectionMatrix = new Matrix4();\n this.updateProjectionMatrix();\n }\n\n updateProjectionMatrix() {\n const w = 1.0 / (this.right - this.left);\n const h = 1.0 / (this.top - this.bottom);\n const p = 1.0 / (this.far - this.near);\n const x = (this.right + this.left) * w;\n const y = (this.top + this.bottom) * h;\n const z = (this.far + this.near) * p;\n this.projectionMatrix.elements = new Float32Array([\n 2 * w, 0, 0, 0,\n 0, 2 * h, 0, 0,\n 0, 0, -2 * p, 0,\n -x, -y, -z, 1\n ]);\n }\n}\n\nexport function updateCamera(camera: OrthographicCamera, width: number, height: number, planeWidth: number = 50, planeHeight: number = 50, shapeType: string = \"plane\", zoom: number = 1.0) {\n camera.zoom = zoom;\n const ratio = width / height;\n\n if (shapeType === \"plane\") {\n const viewPortAreaRatio = 1000000;\n const areaViewPort = width * height;\n const targetPlaneArea = areaViewPort / viewPortAreaRatio * planeWidth * planeHeight / 1.5;\n\n const targetWidth = Math.sqrt(targetPlaneArea * ratio);\n const targetHeight = targetPlaneArea / targetWidth;\n\n let left = -planeWidth / 2;\n let right = Math.min((left + targetWidth) / 1.5, planeWidth / 2);\n let top = planeHeight / 4;\n let bottom = Math.max((top - targetHeight) / 2, -planeHeight / 4);\n\n if (ratio < 1) {\n const horizontalScale = ratio;\n left = left * horizontalScale;\n right = right * horizontalScale;\n const mobileZoomFactor = 1.05;\n left = left * mobileZoomFactor;\n right = right * mobileZoomFactor;\n top = top * mobileZoomFactor;\n bottom = bottom * mobileZoomFactor;\n }\n\n camera.left = left;\n camera.right = right;\n camera.top = top;\n camera.bottom = bottom;\n } else {\n // Localized 3D shapes: Sphere, Torus, Cylinder, Ribbon.\n // Use a symmetrical, non-stretching camera frustum.\n let halfSize = 25.0; // Default for Ribbon / others\n if (shapeType === \"sphere\") {\n halfSize = 30.0;\n } else if (shapeType === \"torus\") {\n halfSize = 35.0;\n } else if (shapeType === \"cylinder\") {\n halfSize = 30.0;\n }\n\n if (ratio >= 1.0) {\n camera.left = -halfSize * ratio;\n camera.right = halfSize * ratio;\n camera.top = halfSize;\n camera.bottom = -halfSize;\n } else {\n camera.left = -halfSize;\n camera.right = halfSize;\n camera.top = halfSize / ratio;\n camera.bottom = -halfSize / ratio;\n\n // Zoom out slightly on mobile (1.05 = 5% zoom out)\n const mobileZoomFactor = 1.05;\n camera.left *= mobileZoomFactor;\n camera.right *= mobileZoomFactor;\n camera.top *= mobileZoomFactor;\n camera.bottom *= mobileZoomFactor;\n }\n }\n\n // Apply camera zoom to the boundary coordinates\n camera.left /= zoom;\n camera.right /= zoom;\n camera.top /= zoom;\n camera.bottom /= zoom;\n\n camera.near = -100;\n camera.far = 1000;\n camera.updateProjectionMatrix();\n}\n\nexport function generatePlaneGeometry(width: number, height: number, widthSegments: number, heightSegments: number) {\n const width_half = width / 2;\n const height_half = height / 2;\n const gridX = Math.floor(widthSegments);\n const gridY = Math.floor(heightSegments);\n const gridX1 = gridX + 1;\n const gridY1 = gridY + 1;\n const segment_width = width / gridX;\n const segment_height = height / gridY;\n\n const indices = [];\n const vertices = [];\n const normals = [];\n const uvs = [];\n\n for (let iy = 0; iy < gridY1; iy++) {\n const y = iy * segment_height - height_half;\n for (let ix = 0; ix < gridX1; ix++) {\n const x = ix * segment_width - width_half;\n vertices.push(x, -y, 0);\n normals.push(0, 0, 1);\n uvs.push(ix / gridX);\n uvs.push(1 - (iy / gridY));\n }\n }\n\n for (let iy = 0; iy < gridY; iy++) {\n for (let ix = 0; ix < gridX; ix++) {\n const a = ix + gridX1 * iy;\n const b = ix + gridX1 * (iy + 1);\n const c = (ix + 1) + gridX1 * (iy + 1);\n const d = (ix + 1) + gridX1 * iy;\n indices.push(a, b, d);\n indices.push(b, c, d);\n }\n }\n\n const isLarge = vertices.length / 3 > 65535;\n\n // Generate wireframe indices: for each triangle (a,b,c), emit lines a→b, b→c, c→a\n const wireframeIndices = [];\n for (let i = 0; i < indices.length; i += 3) {\n const a = indices[i];\n const b = indices[i + 1];\n const c = indices[i + 2];\n wireframeIndices.push(a, b, b, c, c, a);\n }\n\n return {\n position: new Float32Array(vertices),\n normal: new Float32Array(normals),\n uv: new Float32Array(uvs),\n index: isLarge ? new Uint32Array(indices) : new Uint16Array(indices),\n wireframeIndex: isLarge ? new Uint32Array(wireframeIndices) : new Uint16Array(wireframeIndices)\n };\n}\n\nexport function generateSphereGeometry(radius: number, widthSegments: number, heightSegments: number) {\n const vertices = [];\n const normals = [];\n const uvs = [];\n const indices = [];\n\n const widthSegmentsFloor = Math.floor(widthSegments);\n const heightSegmentsFloor = Math.floor(heightSegments);\n\n for (let iy = 0; iy <= heightSegmentsFloor; iy++) {\n const v = iy / heightSegmentsFloor;\n const theta = v * Math.PI;\n\n for (let ix = 0; ix <= widthSegmentsFloor; ix++) {\n const u = ix / widthSegmentsFloor;\n const phi = u * Math.PI * 2;\n\n const x = -radius * Math.sin(theta) * Math.cos(phi);\n const y = radius * Math.cos(theta);\n const z = radius * Math.sin(theta) * Math.sin(phi);\n\n vertices.push(x, y, z);\n \n const len = Math.sqrt(x*x + y*y + z*z);\n normals.push(x/len, y/len, z/len);\n \n uvs.push(u, 1 - v);\n }\n }\n\n for (let iy = 0; iy < heightSegmentsFloor; iy++) {\n for (let ix = 0; ix < widthSegmentsFloor; ix++) {\n const a = ix + (widthSegmentsFloor + 1) * iy;\n const b = ix + (widthSegmentsFloor + 1) * (iy + 1);\n const c = (ix + 1) + (widthSegmentsFloor + 1) * (iy + 1);\n const d = (ix + 1) + (widthSegmentsFloor + 1) * iy;\n\n indices.push(a, b, d);\n indices.push(b, c, d);\n }\n }\n\n const isLarge = vertices.length / 3 > 65535;\n const wireframeIndices = [];\n for (let i = 0; i < indices.length; i += 3) {\n const a = indices[i];\n const b = indices[i + 1];\n const c = indices[i + 2];\n wireframeIndices.push(a, b, b, c, c, a);\n }\n\n return {\n position: new Float32Array(vertices),\n normal: new Float32Array(normals),\n uv: new Float32Array(uvs),\n index: isLarge ? new Uint32Array(indices) : new Uint16Array(indices),\n wireframeIndex: isLarge ? new Uint32Array(wireframeIndices) : new Uint16Array(wireframeIndices)\n };\n}\n\nexport function generateTorusGeometry(radius: number, tube: number, radialSegments: number, tubularSegments: number) {\n const vertices = [];\n const normals = [];\n const uvs = [];\n const indices = [];\n\n const radialSegmentsFloor = Math.floor(radialSegments);\n const tubularSegmentsFloor = Math.floor(tubularSegments);\n\n for (let j = 0; j <= radialSegmentsFloor; j++) {\n const v = j / radialSegmentsFloor * Math.PI * 2;\n\n for (let i = 0; i <= tubularSegmentsFloor; i++) {\n const u = i / tubularSegmentsFloor * Math.PI * 2;\n\n const x = (radius + tube * Math.cos(v)) * Math.cos(u);\n const y = (radius + tube * Math.cos(v)) * Math.sin(u);\n const z = tube * Math.sin(v);\n\n vertices.push(x, y, z);\n\n const cx = radius * Math.cos(u);\n const cy = radius * Math.sin(u);\n const nx = x - cx;\n const ny = y - cy;\n const nz = z;\n const len = Math.sqrt(nx * nx + ny * ny + nz * nz);\n normals.push(nx / len, ny / len, nz / len);\n\n uvs.push(i / tubularSegmentsFloor, j / radialSegmentsFloor);\n }\n }\n\n for (let j = 1; j <= radialSegmentsFloor; j++) {\n for (let i = 1; i <= tubularSegmentsFloor; i++) {\n const a = (tubularSegmentsFloor + 1) * j + i - 1;\n const b = (tubularSegmentsFloor + 1) * (j - 1) + i - 1;\n const c = (tubularSegmentsFloor + 1) * (j - 1) + i;\n const d = (tubularSegmentsFloor + 1) * j + i;\n\n indices.push(a, b, d);\n indices.push(b, c, d);\n }\n }\n\n const isLarge = vertices.length / 3 > 65535;\n const wireframeIndices = [];\n for (let i = 0; i < indices.length; i += 3) {\n const a = indices[i];\n const b = indices[i + 1];\n const c = indices[i + 2];\n wireframeIndices.push(a, b, b, c, c, a);\n }\n\n return {\n position: new Float32Array(vertices),\n normal: new Float32Array(normals),\n uv: new Float32Array(uvs),\n index: isLarge ? new Uint32Array(indices) : new Uint16Array(indices),\n wireframeIndex: isLarge ? new Uint32Array(wireframeIndices) : new Uint16Array(wireframeIndices)\n };\n}\n\nexport function generateCylinderGeometry(radiusTop: number, radiusBottom: number, height: number, radialSegments: number, heightSegments: number) {\n const vertices = [];\n const normals = [];\n const uvs = [];\n const indices = [];\n\n const radialSegmentsFloor = Math.floor(radialSegments);\n const heightSegmentsFloor = Math.floor(heightSegments);\n\n const halfHeight = height / 2;\n\n for (let y = 0; y <= heightSegmentsFloor; y++) {\n const v = y / heightSegmentsFloor;\n const h = v * height - halfHeight;\n const radius = v * (radiusBottom - radiusTop) + radiusTop;\n\n for (let x = 0; x <= radialSegmentsFloor; x++) {\n const u = x / radialSegmentsFloor;\n const theta = u * Math.PI * 2;\n\n const sinTheta = Math.sin(theta);\n const cosTheta = Math.cos(theta);\n\n vertices.push(radius * sinTheta, -h, radius * cosTheta);\n normals.push(sinTheta, 0, cosTheta);\n uvs.push(u, 1 - v);\n }\n }\n\n for (let y = 0; y < heightSegmentsFloor; y++) {\n for (let x = 0; x < radialSegmentsFloor; x++) {\n const a = x + (radialSegmentsFloor + 1) * y;\n const b = x + (radialSegmentsFloor + 1) * (y + 1);\n const c = (x + 1) + (radialSegmentsFloor + 1) * (y + 1);\n const d = (x + 1) + (radialSegmentsFloor + 1) * y;\n\n indices.push(a, b, d);\n indices.push(b, c, d);\n }\n }\n\n const isLarge = vertices.length / 3 > 65535;\n const wireframeIndices = [];\n for (let i = 0; i < indices.length; i += 3) {\n const a = indices[i];\n const b = indices[i + 1];\n const c = indices[i + 2];\n wireframeIndices.push(a, b, b, c, c, a);\n }\n\n return {\n position: new Float32Array(vertices),\n normal: new Float32Array(normals),\n uv: new Float32Array(uvs),\n index: isLarge ? new Uint32Array(indices) : new Uint16Array(indices),\n wireframeIndex: isLarge ? new Uint32Array(wireframeIndices) : new Uint16Array(wireframeIndices)\n };\n}\n\nexport function generateRibbonGeometry(width: number, height: number, widthSegments: number, heightSegments: number, bend: number, twist: number) {\n const width_half = width / 2;\n const height_half = height / 2;\n const gridX = Math.floor(widthSegments);\n const gridY = Math.floor(heightSegments);\n const gridX1 = gridX + 1;\n const gridY1 = gridY + 1;\n const segment_width = width / gridX;\n const segment_height = height / gridY;\n\n const vertices = [];\n const normals = [];\n const uvs = [];\n const indices = [];\n\n for (let iy = 0; iy < gridY1; iy++) {\n const y = iy * segment_height - height_half;\n for (let ix = 0; ix < gridX1; ix++) {\n const x = ix * segment_width - width_half;\n\n let xp = x;\n let yp = y;\n let zp = 0;\n\n let nx = 0;\n let ny = 0;\n let nz = 1;\n\n if (Math.abs(bend) > 0.001) {\n const r = width / bend;\n const angle = x / r;\n xp = r * Math.sin(angle);\n zp = r * (1 - Math.cos(angle));\n\n nx = Math.sin(angle);\n nz = Math.cos(angle);\n }\n\n if (Math.abs(twist) > 0.001) {\n const angle = (y / height) * twist;\n const cosA = Math.cos(angle);\n const sinA = Math.sin(angle);\n \n const rx = xp * cosA - zp * sinA;\n const rz = xp * sinA + zp * cosA;\n xp = rx;\n zp = rz;\n\n const rnx = nx * cosA - nz * sinA;\n const rnz = nx * sinA + nz * cosA;\n nx = rnx;\n nz = rnz;\n }\n\n vertices.push(xp, -yp, zp);\n normals.push(nx, ny, nz);\n uvs.push(ix / gridX);\n uvs.push(1 - (iy / gridY));\n }\n }\n\n for (let iy = 0; iy < gridY; iy++) {\n for (let ix = 0; ix < gridX; ix++) {\n const a = ix + gridX1 * iy;\n const b = ix + gridX1 * (iy + 1);\n const c = (ix + 1) + gridX1 * (iy + 1);\n const d = (ix + 1) + gridX1 * iy;\n indices.push(a, b, d);\n indices.push(b, c, d);\n }\n }\n\n const isLarge = vertices.length / 3 > 65535;\n const wireframeIndices = [];\n for (let i = 0; i < indices.length; i += 3) {\n const a = indices[i];\n const b = indices[i + 1];\n const c = indices[i + 2];\n wireframeIndices.push(a, b, b, c, c, a);\n }\n\n return {\n position: new Float32Array(vertices),\n normal: new Float32Array(normals),\n uv: new Float32Array(uvs),\n index: isLarge ? new Uint32Array(indices) : new Uint16Array(indices),\n wireframeIndex: isLarge ? new Uint32Array(wireframeIndices) : new Uint16Array(wireframeIndices)\n };\n}\n","import { buildColorFunctions, buildNoise, buildVertUniforms, buildFragUniforms, fragmentShaderSource, vertexShaderSource } from \"./shaders\";\nimport { generatePlaneGeometry, generateSphereGeometry, generateTorusGeometry, generateCylinderGeometry, generateRibbonGeometry, OrthographicCamera, updateCamera, Matrix4 } from \"./math\";\n\nconsole.info(\n \"%c🌈 Neat Gradients%c\\n\\nLicensed under MIT + The Commons Clause.\\nFree for personal and commercial use.\\nSelling this software or its derivatives is strictly prohibited.\\nhttps://neat.firecms.co\",\n \"font-weight: bold; font-size: 14px; color: #FF5772;\", \"color: inherit;\"\n);\n\nconst PLANE_WIDTH = 50;\nconst PLANE_HEIGHT = 80;\n\n\nconst COLORS_COUNT = 6;\n\nconst LINK_ID = generateRandomString();\n\nexport interface WebGLState {\n gl: WebGLRenderingContext | WebGL2RenderingContext;\n program: WebGLProgram;\n buffers: {\n position: WebGLBuffer;\n normal: WebGLBuffer;\n uv: WebGLBuffer;\n index: WebGLBuffer;\n wireframeIndex: WebGLBuffer;\n };\n locations: {\n attributes: Record<string, number>;\n uniforms: Record<string, WebGLUniformLocation | null>;\n };\n camera: OrthographicCamera;\n indexCount: number;\n wireframeIndexCount: number;\n indexType: number;\n}\n\n\nimport { NeatConfig, NeatColor, NeatController } from \"./types\";\n\nexport class NeatGradient implements NeatController {\n\n private _ref: HTMLCanvasElement;\n\n private _speed: number = -1;\n\n private _horizontalPressure: number = -1;\n private _verticalPressure: number = -1;\n\n private _waveFrequencyX: number = -1;\n private _waveFrequencyY: number = -1;\n private _waveAmplitude: number = -1;\n\n private _shadows: number = -1;\n private _highlights: number = -1;\n private _saturation: number = -1;\n private _brightness: number = -1;\n\n private _grainScale: number = -1;\n private _grainIntensity: number = -1;\n private _grainSparsity: number = -1;\n private _grainSpeed: number = -1;\n\n private _colorBlending: number = -1;\n private _resolution: number = 1;\n\n private _colors: NeatColor[] = [];\n private _wireframe: boolean = false;\n\n private _backgroundColor: string = \"#FFFFFF\";\n private _backgroundColorRgb: [number, number, number] = [1, 1, 1];\n private _backgroundAlpha: number = 1.0;\n\n // Flow field properties\n private _flowDistortionA: number = 0;\n private _flowDistortionB: number = 0;\n private _flowScale: number = 1.0;\n private _flowEase: number = 0.0;\n private _flowEnabled: boolean = true;\n\n private glState!: WebGLState;\n\n // Texture generation properties\n private _enableProceduralTexture: boolean = false;\n private _textureVoidLikelihood: number = 0.45;\n private _textureVoidWidthMin: number = 200;\n private _textureVoidWidthMax: number = 486;\n private _textureBandDensity: number = 2.15;\n private _textureColorBlending: number = 0.01;\n private _textureSeed: number = 333;\n private _textureEase: number = 0.5;\n private _transparentTextureVoid: boolean = false;\n\n // New effects\n private _domainWarpEnabled: boolean = false;\n private _domainWarpIntensity: number = 0.5;\n private _domainWarpScale: number = 1.0;\n\n private _vignetteIntensity: number = 0.5;\n private _vignetteRadius: number = 0.8;\n\n private _fresnelEnabled: boolean = false;\n private _fresnelPower: number = 2.0;\n private _fresnelIntensity: number = 0.5;\n private _fresnelColor: string = \"#FFFFFF\";\n private _fresnelColorRgb: [number, number, number] = [1, 1, 1];\n\n private _iridescenceEnabled: boolean = false;\n private _iridescenceIntensity: number = 0.5;\n private _iridescenceSpeed: number = 1.0;\n\n private _bloomIntensity: number = 0;\n private _bloomThreshold: number = 0.7;\n private _chromaticAberration: number = 0;\n private _silhouetteFade: number = 0.25;\n private _cylinderFade: number = 0.08;\n private _ribbonFade: number = 0.05;\n private _flatShading: boolean = true;\n\n // 3D Shapes config\n private _shapeType: 'plane' | 'sphere' | 'torus' | 'cylinder' | 'ribbon' = 'plane';\n private _shapeRotationX: number = 0;\n private _shapeRotationY: number = 0;\n private _shapeRotationZ: number = 0;\n private _shapeAutoRotateSpeedX: number = 0;\n private _shapeAutoRotateSpeedY: number = 0;\n private _sphereRadius: number = 15;\n private _torusRadius: number = 15;\n private _torusTube: number = 5;\n private _cylinderRadius: number = 10;\n private _cylinderHeight: number = 40;\n private _planeBend: number = 0;\n private _planeTwist: number = 0;\n\n // Camera settings\n private _cameraLock: boolean = false;\n private _cameraX: number = 0;\n private _cameraY: number = 0;\n private _cameraZ: number = 0;\n private _cameraRotationX: number = 0;\n private _cameraRotationY: number = 0;\n private _cameraRotationZ: number = 0;\n private _cameraZoom: number = 1.0;\n\n private _proceduralTexture: WebGLTexture | null = null;\n private _proceduralBackgroundColor: string = \"#000000\";\n\n private _textureShapeTriangles: number = 20;\n private _textureShapeCircles: number = 15;\n private _textureShapeBars: number = 15;\n private _textureShapeSquiggles: number = 10;\n\n private requestRef: number = -1;\n private sizeObserver: ResizeObserver;\n\n private _initialized: boolean = false;\n private _linkElement: HTMLAnchorElement | null = null;\n private _cachedColorRgb: [number, number, number][] = [];\n\n private _yOffset: number = 0;\n private _yOffsetWaveMultiplier: number = 0.004;\n private _yOffsetColorMultiplier: number = 0.004;\n private _yOffsetFlowMultiplier: number = 0.004;\n\n // Cached offscreen canvases for procedural texture generation\n private _sourceCanvas: HTMLCanvasElement | null = null;\n private _sourceCtx: CanvasRenderingContext2D | null = null;\n private _maskedCanvas: HTMLCanvasElement | null = null;\n private _maskedCtx: CanvasRenderingContext2D | null = null;\n\n // Performance optimizations\n private _resizeTimeoutId: number | null = null;\n private _textureNeedsUpdate: boolean = false;\n private _linkCheckCounter: number = 0;\n private _colorsChanged: boolean = true;\n private _uniformsDirty: boolean = true;\n private _textureDirty: boolean = true;\n private _yOffsetDirty: boolean = false;\n private _modelViewMatrix: Matrix4 = new Matrix4();\n private _isVisible: boolean = true;\n private _visibilityObserver: IntersectionObserver | null = null;\n private _visibilityHandler: (() => void) | null = null;\n\n constructor(config: NeatConfig & { ref: HTMLCanvasElement, resolution?: number, seed?: number }) {\n\n const {\n ref,\n speed = 4,\n horizontalPressure = 3,\n verticalPressure = 3,\n waveFrequencyX = 5,\n waveFrequencyY = 5,\n waveAmplitude = 3,\n colors,\n highlights = 4,\n shadows = 4,\n colorSaturation = 0,\n colorBrightness = 1,\n colorBlending = 5,\n grainScale = 2,\n grainIntensity = 0.55,\n grainSparsity = 0.0,\n grainSpeed = 0.1,\n wireframe = false,\n backgroundColor = \"#FFFFFF\",\n backgroundAlpha = 1.0,\n resolution = 1,\n seed,\n yOffset = 0,\n yOffsetWaveMultiplier = 4,\n yOffsetColorMultiplier = 4,\n yOffsetFlowMultiplier = 4,\n // Flow field parameters\n flowDistortionA = 0,\n flowDistortionB = 0,\n flowScale = 1.0,\n flowEase = 0.0,\n flowEnabled = true,\n\n // Texture generation\n enableProceduralTexture = false,\n textureVoidLikelihood = 0.45,\n textureVoidWidthMin = 200,\n textureVoidWidthMax = 486,\n textureBandDensity = 2.15,\n textureColorBlending = 0.01,\n textureSeed = 333,\n textureEase = 0.5,\n proceduralBackgroundColor = \"#000000\",\n transparentTextureVoid = false,\n textureShapeTriangles = 20,\n textureShapeCircles = 15,\n textureShapeBars = 15,\n textureShapeSquiggles = 10,\n\n domainWarpEnabled = false,\n domainWarpIntensity = 0.5,\n domainWarpScale = 1.0,\n vignetteIntensity = 0.0,\n vignetteRadius = 0.8,\n fresnelEnabled = false,\n fresnelPower = 2.0,\n fresnelIntensity = 0.5,\n fresnelColor = \"#FFFFFF\",\n iridescenceEnabled = false,\n iridescenceIntensity = 0.5,\n iridescenceSpeed = 1.0,\n bloomIntensity = 0.0,\n bloomThreshold = 0.7,\n chromaticAberration = 0.0,\n silhouetteFade = 0.25,\n cylinderFade = 0.08,\n ribbonFade = 0.05,\n flatShading = true,\n\n // Camera configuration\n cameraLock = false,\n cameraX = 0,\n cameraY = 0,\n cameraZ = 0,\n cameraRotationX = 0,\n cameraRotationY = 0,\n cameraRotationZ = 0,\n cameraZoom = 1.0,\n\n // 3D shapes default\n shapeType = 'plane',\n shapeRotationX = 0,\n shapeRotationY = 0,\n shapeRotationZ = 0,\n shapeAutoRotateSpeedX = 0,\n shapeAutoRotateSpeedY = 0,\n sphereRadius = 15,\n torusRadius = 15,\n torusTube = 5,\n cylinderRadius = 10,\n cylinderHeight = 40,\n planeBend = 0,\n planeTwist = 0,\n } = config;\n\n\n this._ref = ref;\n\n this.destroy = this.destroy.bind(this);\n this._initScene = this._initScene.bind(this);\n\n this.speed = speed;\n this.horizontalPressure = horizontalPressure;\n this.verticalPressure = verticalPressure;\n this.waveFrequencyX = waveFrequencyX;\n this.waveFrequencyY = waveFrequencyY;\n this.waveAmplitude = waveAmplitude;\n this.colorBlending = colorBlending;\n this._resolution = resolution;\n this.grainScale = grainScale;\n this.grainIntensity = grainIntensity;\n this.grainSparsity = grainSparsity;\n this.grainSpeed = grainSpeed;\n this.colors = colors;\n this.shadows = shadows;\n this.highlights = highlights;\n this.colorSaturation = colorSaturation;\n this.colorBrightness = colorBrightness;\n this.wireframe = wireframe;\n this.backgroundColor = backgroundColor;\n this.backgroundAlpha = backgroundAlpha;\n this.yOffset = yOffset;\n this.yOffsetWaveMultiplier = yOffsetWaveMultiplier;\n this.yOffsetColorMultiplier = yOffsetColorMultiplier;\n this.yOffsetFlowMultiplier = yOffsetFlowMultiplier;\n\n // Flow field\n this.flowDistortionA = flowDistortionA;\n this.flowDistortionB = flowDistortionB;\n this.flowScale = flowScale;\n this.flowEase = flowEase;\n this.flowEnabled = flowEnabled;\n\n\n\n // Texture generation\n this.enableProceduralTexture = enableProceduralTexture;\n this.textureVoidLikelihood = textureVoidLikelihood;\n this.textureVoidWidthMin = textureVoidWidthMin;\n this.textureVoidWidthMax = textureVoidWidthMax;\n this.textureBandDensity = textureBandDensity;\n this.textureColorBlending = textureColorBlending;\n this.textureSeed = textureSeed;\n this.textureEase = textureEase;\n this._proceduralBackgroundColor = proceduralBackgroundColor;\n this.transparentTextureVoid = transparentTextureVoid;\n\n this._textureShapeTriangles = textureShapeTriangles;\n this._textureShapeCircles = textureShapeCircles;\n this._textureShapeBars = textureShapeBars;\n this._textureShapeSquiggles = textureShapeSquiggles;\n\n this.domainWarpEnabled = domainWarpEnabled;\n this.domainWarpIntensity = domainWarpIntensity;\n this.domainWarpScale = domainWarpScale;\n this.vignetteIntensity = vignetteIntensity;\n this.vignetteRadius = vignetteRadius;\n this.fresnelEnabled = fresnelEnabled;\n this.fresnelPower = fresnelPower;\n this.fresnelIntensity = fresnelIntensity;\n this.fresnelColor = fresnelColor;\n this.iridescenceEnabled = iridescenceEnabled;\n this.iridescenceIntensity = iridescenceIntensity;\n this.iridescenceSpeed = iridescenceSpeed;\n this.bloomIntensity = bloomIntensity;\n this.bloomThreshold = bloomThreshold;\n this.chromaticAberration = chromaticAberration;\n this.silhouetteFade = silhouetteFade;\n this.cylinderFade = cylinderFade;\n this.ribbonFade = ribbonFade;\n this._flatShading = flatShading;\n\n this._cameraLock = cameraLock;\n this._cameraX = cameraX;\n this._cameraY = cameraY;\n this._cameraZ = cameraZ;\n this._cameraRotationX = cameraRotationX;\n this._cameraRotationY = cameraRotationY;\n this._cameraRotationZ = cameraRotationZ;\n this._cameraZoom = cameraZoom;\n\n this._shapeType = shapeType;\n this._shapeRotationX = shapeRotationX;\n this._shapeRotationY = shapeRotationY;\n this._shapeRotationZ = shapeRotationZ;\n this._shapeAutoRotateSpeedX = shapeAutoRotateSpeedX;\n this._shapeAutoRotateSpeedY = shapeAutoRotateSpeedY;\n this._sphereRadius = sphereRadius;\n this._torusRadius = torusRadius;\n this._torusTube = torusTube;\n this._cylinderRadius = cylinderRadius;\n this._cylinderHeight = cylinderHeight;\n this._planeBend = planeBend;\n this._planeTwist = planeTwist;\n\n this.glState = this._initScene(resolution);\n\n injectSEO();\n\n let tick = seed !== undefined ? seed : getElapsedSecondsInLastHour();\n let lastTime = performance.now();\n\n const render = () => {\n\n const { gl, program, locations, indexCount, indexType } = this.glState;\n\n // Optimization: check if cached link is still valid in DOM less frequently\n this._linkCheckCounter++;\n if (this._linkCheckCounter >= 300) { // Check every ~5 seconds at 60fps\n this._linkCheckCounter = 0;\n if (!this._linkElement || !document.contains(this._linkElement)) {\n this._linkElement = addNeatLink(ref);\n }\n }\n\n if (this._initialized) {\n const timeNow = performance.now();\n tick += ((timeNow - lastTime) / 1000) * this._speed;\n lastTime = timeNow;\n\n gl.useProgram(program);\n\n gl.uniform1f(locations.uniforms['u_time'], tick);\n\n // Update modelViewMatrix in every frame to support dynamic rotation and auto-rotation\n const camera = this.glState.camera;\n const modelViewMatrix = this._modelViewMatrix;\n modelViewMatrix.identity();\n \n // 1. Camera translation (default camera distance + displacement)\n modelViewMatrix.translate(\n -camera.position[0] - this._cameraX,\n -camera.position[1] - this._cameraY,\n -camera.position[2] - this._cameraZ\n );\n modelViewMatrix.translate(0, 0, -1);\n \n // 2. Camera rotation (revolving around target)\n modelViewMatrix.rotateX(-this._cameraRotationX);\n modelViewMatrix.rotateY(-this._cameraRotationY);\n modelViewMatrix.rotateZ(-this._cameraRotationZ);\n \n let rx = this._shapeRotationX;\n let ry = this._shapeRotationY;\n let rz = this._shapeRotationZ;\n \n if (this._shapeAutoRotateSpeedX !== 0) {\n rx += tick * this._shapeAutoRotateSpeedX * 0.1;\n }\n if (this._shapeAutoRotateSpeedY !== 0) {\n ry += tick * this._shapeAutoRotateSpeedY * 0.1;\n }\n \n if (this._shapeType === 'plane' || this._shapeType === 'ribbon') {\n modelViewMatrix.rotateX(rx - Math.PI / 3.5);\n } else {\n modelViewMatrix.rotateX(rx);\n }\n modelViewMatrix.rotateY(ry);\n modelViewMatrix.rotateZ(rz);\n \n const mvLoc = locations.uniforms[\"modelViewMatrix\"];\n if (mvLoc) gl.uniformMatrix4fv(mvLoc, false, modelViewMatrix.elements);\n\n // Fast path: only upload yOffset when it changed (scroll)\n if (this._yOffsetDirty && !this._uniformsDirty) {\n gl.uniform1f(locations.uniforms['u_y_offset'], this._yOffset);\n this._yOffsetDirty = false;\n }\n\n // Only upload static uniforms when they've been modified\n if (this._uniformsDirty) {\n gl.uniform2f(locations.uniforms['u_resolution'], this._ref.clientWidth, this._ref.clientHeight);\n gl.uniform2f(locations.uniforms['u_color_pressure'], this._horizontalPressure, this._verticalPressure);\n\n gl.uniform1f(locations.uniforms['u_wave_frequency_x'], this._waveFrequencyX);\n gl.uniform1f(locations.uniforms['u_wave_frequency_y'], this._waveFrequencyY);\n gl.uniform1f(locations.uniforms['u_wave_amplitude'], this._waveAmplitude);\n gl.uniform1f(locations.uniforms['u_color_blending'], this._colorBlending);\n gl.uniform1f(locations.uniforms['u_shadows'], this._shadows);\n gl.uniform1f(locations.uniforms['u_highlights'], this._highlights);\n gl.uniform1f(locations.uniforms['u_saturation'], this._saturation);\n gl.uniform1f(locations.uniforms['u_brightness'], this._brightness);\n gl.uniform1f(locations.uniforms['u_grain_intensity'], this._grainIntensity);\n gl.uniform1f(locations.uniforms['u_grain_sparsity'], this._grainSparsity);\n gl.uniform1f(locations.uniforms['u_grain_speed'], this._grainSpeed);\n gl.uniform1f(locations.uniforms['u_grain_scale'], this._grainScale);\n gl.uniform1f(locations.uniforms['u_y_offset'], this._yOffset);\n gl.uniform1f(locations.uniforms['u_y_offset_wave_multiplier'], this._yOffsetWaveMultiplier);\n gl.uniform1f(locations.uniforms['u_y_offset_color_multiplier'], this._yOffsetColorMultiplier);\n gl.uniform1f(locations.uniforms['u_y_offset_flow_multiplier'], this._yOffsetFlowMultiplier);\n gl.uniform1f(locations.uniforms['u_flow_distortion_a'], this._flowDistortionA);\n gl.uniform1f(locations.uniforms['u_flow_distortion_b'], this._flowDistortionB);\n gl.uniform1f(locations.uniforms['u_flow_scale'], this._flowScale);\n gl.uniform1f(locations.uniforms['u_flow_ease'], this._flowEase);\n gl.uniform1f(locations.uniforms['u_flow_enabled'], this._flowEnabled ? 1.0 : 0.0);\n\n let shapeTypeVal = 0.0;\n if (this._shapeType === 'sphere') shapeTypeVal = 1.0;\n else if (this._shapeType === 'torus') shapeTypeVal = 2.0;\n else if (this._shapeType === 'cylinder') shapeTypeVal = 3.0;\n else if (this._shapeType === 'ribbon') shapeTypeVal = 4.0;\n gl.uniform1f(locations.uniforms['u_shape_type'], shapeTypeVal);\n\n gl.uniform1f(locations.uniforms['u_enable_procedural_texture'], this._enableProceduralTexture ? 1.0 : 0.0);\n gl.uniform1f(locations.uniforms['u_texture_ease'], this._textureEase);\n gl.uniform1f(locations.uniforms['u_transparent_texture_void'], this._transparentTextureVoid ? 1.0 : 0.0);\n\n gl.uniform1f(locations.uniforms['u_domain_warp_enabled'], this._domainWarpEnabled ? 1.0 : 0.0);\n gl.uniform1f(locations.uniforms['u_domain_warp_intensity'], this._domainWarpIntensity);\n gl.uniform1f(locations.uniforms['u_domain_warp_scale'], this._domainWarpScale);\n\n gl.uniform1f(locations.uniforms['u_vignette_intensity'], this._vignetteIntensity);\n gl.uniform1f(locations.uniforms['u_vignette_radius'], this._vignetteRadius);\n\n gl.uniform1f(locations.uniforms['u_fresnel_enabled'], this._fresnelEnabled ? 1.0 : 0.0);\n gl.uniform1f(locations.uniforms['u_fresnel_power'], this._fresnelPower);\n gl.uniform1f(locations.uniforms['u_fresnel_intensity'], this._fresnelIntensity);\n gl.uniform3fv(locations.uniforms['u_fresnel_color'], this._fresnelColorRgb);\n\n gl.uniform1f(locations.uniforms['u_iridescence_enabled'], this._iridescenceEnabled ? 1.0 : 0.0);\n gl.uniform1f(locations.uniforms['u_iridescence_intensity'], this._iridescenceIntensity);\n gl.uniform1f(locations.uniforms['u_iridescence_speed'], this._iridescenceSpeed);\n\n gl.uniform1f(locations.uniforms['u_bloom_intensity'], this._bloomIntensity);\n gl.uniform1f(locations.uniforms['u_bloom_threshold'], this._bloomThreshold);\n gl.uniform1f(locations.uniforms['u_chromatic_aberration'], this._chromaticAberration);\n gl.uniform1f(locations.uniforms['u_silhouette_fade'], this._silhouetteFade);\n gl.uniform1f(locations.uniforms['u_cylinder_fade'], this._cylinderFade);\n gl.uniform1f(locations.uniforms['u_ribbon_fade'], this._ribbonFade);\n gl.uniform1f(locations.uniforms['u_flat_shading'], this._flatShading ? 1.0 : 0.0);\n\n this._uniformsDirty = false;\n this._yOffsetDirty = false;\n }\n\n // Only regenerate procedural texture when needed\n if (this._textureNeedsUpdate && this._enableProceduralTexture) {\n if (this._proceduralTexture) {\n gl.deleteTexture(this._proceduralTexture);\n }\n this._proceduralTexture = this._createProceduralTexture(gl);\n this._textureNeedsUpdate = false;\n this._textureDirty = true;\n }\n\n // Procedural texture binding — only when texture changes\n if (this._textureDirty && this._proceduralTexture) {\n gl.activeTexture(gl.TEXTURE1);\n gl.bindTexture(gl.TEXTURE_2D, this._proceduralTexture);\n gl.uniform1i(locations.uniforms['u_procedural_texture'], 1);\n this._textureDirty = false;\n }\n\n // Color update — only when colors have changed\n if (this._colorsChanged) {\n this._colorsChanged = false;\n\n for (let i = 0; i < COLORS_COUNT; i++) {\n if (i < this._colors.length) {\n const c = this._colors[i];\n const rgb = this._cachedColorRgb[i] || [0, 0, 0];\n gl.uniform1f(locations.uniforms[`u_colors[${i}].is_active`], c.enabled ? 1.0 : 0.0);\n gl.uniform3fv(locations.uniforms[`u_colors[${i}].color`], rgb);\n gl.uniform1f(locations.uniforms[`u_colors[${i}].influence`], c.influence || 0);\n } else {\n gl.uniform1f(locations.uniforms[`u_colors[${i}].is_active`], 0.0);\n }\n }\n\n gl.uniform1i(locations.uniforms['u_colors_count'], COLORS_COUNT);\n }\n }\n\n\n // Draw scene\n gl.clearColor(\n this._backgroundColorRgb[0],\n this._backgroundColorRgb[1],\n this._backgroundColorRgb[2],\n this._backgroundAlpha\n );\n gl.clear(gl.COLOR_BUFFER_BIT | gl.DEPTH_BUFFER_BIT);\n\n if (this._wireframe) {\n gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this.glState.buffers.wireframeIndex);\n gl.drawElements(gl.LINES, this.glState.wireframeIndexCount, indexType, 0);\n gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this.glState.buffers.index);\n } else {\n gl.drawElements(gl.TRIANGLES, indexCount, indexType, 0);\n }\n\n if (this._isVisible) {\n this.requestRef = requestAnimationFrame(render);\n }\n };\n\n // Visibility optimization: pause rendering when off-screen or tab hidden\n this._visibilityObserver = new IntersectionObserver((entries) => {\n const wasVisible = this._isVisible;\n this._isVisible = entries[0].isIntersecting && document.visibilityState !== 'hidden';\n if (this._isVisible && !wasVisible) {\n lastTime = performance.now(); // Avoid time jump after resume\n this.requestRef = requestAnimationFrame(render);\n }\n }, { threshold: 0 });\n this._visibilityObserver.observe(ref);\n\n this._visibilityHandler = () => {\n const wasVisible = this._isVisible;\n if (document.visibilityState === 'hidden') {\n this._isVisible = false;\n } else {\n this._isVisible = true;\n if (!wasVisible) {\n lastTime = performance.now();\n this.requestRef = requestAnimationFrame(render);\n }\n }\n };\n document.addEventListener('visibilitychange', this._visibilityHandler);\n\n const setSize = () => {\n\n const { gl, camera } = this.glState;\n const width = this._ref.clientWidth;\n const height = this._ref.clientHeight;\n\n // Handle high DPI displays properly without scaling buffer resolution, matching client width\n this._ref.width = width;\n this._ref.height = height;\n\n gl.viewport(0, 0, width, height);\n\n updateCamera(camera, width, height, PLANE_WIDTH, PLANE_HEIGHT, this._shapeType, this._cameraZoom);\n\n\n\n // Recompute projection matrix on resize\n const projLoc = this.glState.locations.uniforms[\"projectionMatrix\"];\n gl.useProgram(this.glState.program);\n if (projLoc) gl.uniformMatrix4fv(projLoc, false, camera.projectionMatrix.elements);\n };\n\n // Debounce resize to prevent excessive operations\n this.sizeObserver = new ResizeObserver(() => {\n if (this._resizeTimeoutId !== null) {\n clearTimeout(this._resizeTimeoutId);\n }\n this._resizeTimeoutId = window.setTimeout(() => {\n setSize();\n this._resizeTimeoutId = null;\n }, 100); // Wait 100ms after last resize event\n });\n\n this.sizeObserver.observe(ref);\n\n\n render();\n }\n\n destroy() {\n cancelAnimationFrame(this.requestRef);\n this.sizeObserver.disconnect();\n\n // Cleanup visibility observers\n if (this._visibilityObserver) {\n this._visibilityObserver.disconnect();\n this._visibilityObserver = null;\n }\n if (this._visibilityHandler) {\n document.removeEventListener('visibilitychange', this._visibilityHandler);\n this._visibilityHandler = null;\n }\n\n // Clear resize timeout\n if (this._resizeTimeoutId !== null) {\n clearTimeout(this._resizeTimeoutId);\n this._resizeTimeoutId = null;\n }\n\n // Remove NEAT link\n if (this._linkElement && this._linkElement.parentElement) {\n this._linkElement.parentElement.removeChild(this._linkElement);\n this._linkElement = null;\n }\n\n // Cleanup WebGL resources\n if (this.glState) {\n const gl = this.glState.gl;\n gl.deleteProgram(this.glState.program);\n gl.deleteBuffer(this.glState.buffers.position);\n gl.deleteBuffer(this.glState.buffers.normal);\n gl.deleteBuffer(this.glState.buffers.uv);\n gl.deleteBuffer(this.glState.buffers.index);\n gl.deleteBuffer(this.glState.buffers.wireframeIndex);\n }\n if (this._proceduralTexture && this.glState) {\n this.glState.gl.deleteTexture(this._proceduralTexture);\n }\n }\n\n downloadAsPNG(filename = \"neat.png\") {\n const dataURL = this._ref.toDataURL(\"image/png\");\n downloadURI(dataURL, filename);\n }\n\n /**\n * Records the canvas animation as a video with a NEAT watermark overlay.\n * @param options.durationMs Recording duration in milliseconds (default 5000).\n * @param options.filename Output file name (default \"neat.firecms.co\").\n * @param options.width Output video width in pixels (default: current canvas width).\n * @param options.height Output video height in pixels (default: current canvas height).\n * @param options.format Preferred format: 'mp4' or 'webm' (default: best available).\n * @param options.onProgress Callback with progress 0-1.\n * @param options.onComplete Callback when recording finishes.\n * @returns A stop function to end recording early.\n */\n recordVideo(options: {\n durationMs?: number;\n filename?: string;\n width?: number;\n height?: number;\n format?: 'mp4' | 'webm';\n onProgress?: (progress: number) => void;\n onComplete?: () => void;\n } = {}): () => void {\n const {\n durationMs = 5000,\n filename = \"neat.firecms.co\",\n format,\n onProgress,\n onComplete,\n } = options;\n\n const source = this._ref;\n const width = options.width || source.width || source.clientWidth;\n const height = options.height || source.height || source.clientHeight;\n\n // Offscreen canvas that composites gradient + watermark each frame\n const offscreen = document.createElement(\"canvas\");\n offscreen.width = width;\n offscreen.height = height;\n const ctx = offscreen.getContext(\"2d\")!;\n\n // Use captureStream(0) — only captures a frame when we explicitly\n // call requestFrame() on the video track, so every composited frame\n // is guaranteed to be captured.\n const stream = offscreen.captureStream(0);\n const videoTrack = stream.getVideoTracks()[0];\n\n // Codec candidates ordered by preference\n const mp4Candidates = [\n \"video/mp4;codecs=avc1\",\n \"video/mp4;codecs=avc1,opus\",\n \"video/mp4\",\n ];\n const webmCandidates = [\n \"video/webm;codecs=vp9,opus\",\n \"video/webm;codecs=vp9\",\n \"video/webm;codecs=vp8,opus\",\n \"video/webm\",\n ];\n\n // Build candidate list based on preferred format\n let candidates: string[];\n if (format === 'mp4') candidates = [...mp4Candidates, ...webmCandidates];\n else if (format === 'webm') candidates = [...webmCandidates, ...mp4Candidates];\n else candidates = [...mp4Candidates, ...webmCandidates];\n\n let mimeType = \"video/webm\";\n for (const candidate of candidates) {\n if (MediaRecorder.isTypeSupported(candidate)) {\n mimeType = candidate;\n break;\n }\n }\n\n // Scale bitrate with pixel count: 8 Mbps baseline at 720p\n const pixels = width * height;\n const baseBitrate = 8_000_000;\n const basePixels = 1280 * 720;\n const videoBitsPerSecond = Math.round(baseBitrate * Math.max(1, pixels / basePixels));\n\n const recorder = new MediaRecorder(stream, {\n mimeType,\n videoBitsPerSecond,\n });\n\n const chunks: Blob[] = [];\n recorder.ondataavailable = (e) => {\n if (e.data.size > 0) chunks.push(e.data);\n };\n\n let stopped = false;\n let rafId: number;\n const startTime = performance.now();\n let lastProgressTime = 0;\n\n // Composite loop: draw source canvas + watermark overlay on each frame\n const drawFrame = () => {\n if (stopped) return;\n\n ctx.clearRect(0, 0, width, height);\n ctx.drawImage(source, 0, 0, width, height);\n\n // Watermark: \"NEAT\" in bottom-right corner\n const fontSize = Math.max(14, Math.round(height * 0.025));\n ctx.font = `bold ${fontSize}px \"Sofia Sans\", sans-serif`;\n ctx.textAlign = \"right\";\n ctx.textBaseline = \"bottom\";\n ctx.shadowColor = \"rgba(0,0,0,0.5)\";\n ctx.shadowBlur = 4;\n ctx.shadowOffsetX = 1;\n ctx.shadowOffsetY = 1;\n ctx.fillStyle = \"rgba(255,255,255,0.7)\";\n ctx.fillText(\"NEAT\", width - fontSize * 0.8, height - fontSize * 0.5);\n ctx.shadowColor = \"transparent\";\n ctx.shadowBlur = 0;\n ctx.shadowOffsetX = 0;\n ctx.shadowOffsetY = 0;\n\n // Signal the stream to capture this frame\n // @ts-ignore – requestFrame exists on CanvasCaptureMediaStreamTrack\n if (videoTrack.requestFrame) videoTrack.requestFrame();\n\n // Throttle progress to ~4 updates/sec to avoid flooding React state\n if (onProgress) {\n const now = performance.now();\n if (now - lastProgressTime > 250) {\n lastProgressTime = now;\n onProgress(Math.min(0.99, (now - startTime) / durationMs));\n }\n }\n\n rafId = requestAnimationFrame(drawFrame);\n };\n\n recorder.onstop = () => {\n stopped = true;\n cancelAnimationFrame(rafId);\n\n // Use the correct file extension for the actual format\n const isMP4 = mimeType.startsWith(\"video/mp4\");\n const ext = isMP4 ? \".mp4\" : \".webm\";\n const blobType = isMP4 ? \"video/mp4\" : \"video/webm\";\n const finalFilename = filename + ext;\n\n const blob = new Blob(chunks, { type: blobType });\n const url = URL.createObjectURL(blob);\n downloadURI(url, finalFilename);\n setTimeout(() => URL.revokeObjectURL(url), 30000);\n\n onProgress?.(1);\n onComplete?.();\n };\n\n // Start drawing frames, then start recording\n drawFrame();\n recorder.start(100); // collect data every 100ms\n\n // Auto-stop after the requested duration\n const timeoutId = window.setTimeout(() => {\n if (recorder.state === \"recording\") {\n recorder.stop();\n }\n }, durationMs);\n\n // Return a stop function for early termination\n return () => {\n clearTimeout(timeoutId);\n if (recorder.state === \"recording\") {\n recorder.stop();\n }\n };\n }\n get speed(): number {\n return this._speed * 20;\n }\n set speed(speed: number) {\n this._uniformsDirty = true;\n this._speed = speed / 20;\n }\n\n get horizontalPressure(): number {\n return this._horizontalPressure * 4;\n }\n set horizontalPressure(horizontalPressure: number) {\n this._uniformsDirty = true;\n this._horizontalPressure = horizontalPressure / 4;\n }\n\n get verticalPressure(): number {\n return this._verticalPressure * 4;\n }\n set verticalPressure(verticalPressure: number) {\n this._uniformsDirty = true;\n this._verticalPressure = verticalPressure / 4;\n }\n\n get waveFrequencyX(): number {\n return this._waveFrequencyX / 0.04;\n }\n set waveFrequencyX(waveFrequencyX: number) {\n this._uniformsDirty = true;\n this._waveFrequencyX = waveFrequencyX * 0.04;\n }\n\n get waveFrequencyY(): number {\n return this._waveFrequencyY / 0.04;\n }\n set waveFrequencyY(waveFrequencyY: number) {\n this._uniformsDirty = true;\n this._waveFrequencyY = waveFrequencyY * 0.04;\n }\n\n get waveAmplitude(): number {\n return this._waveAmplitude / 0.75;\n }\n set waveAmplitude(waveAmplitude: number) {\n this._uniformsDirty = true;\n this._waveAmplitude = waveAmplitude * .75;\n }\n\n get colors(): NeatColor[] {\n return this._colors;\n }\n set colors(colors: NeatColor[]) {\n this._uniformsDirty = true;\n this._colors = colors;\n this._cachedColorRgb = colors.map(c => this._hexToRgb(c.color));\n this._colorsChanged = true;\n }\n\n get highlights(): number {\n return this._highlights * 100;\n }\n set highlights(highlights: number) {\n this._uniformsDirty = true;\n this._highlights = highlights / 100;\n }\n\n get shadows(): number {\n return this._shadows * 100;\n }\n set shadows(shadows: number) {\n this._uniformsDirty = true;\n this._shadows = shadows / 100;\n }\n\n get colorSaturation(): number {\n return this._saturation * 10;\n }\n set colorSaturation(colorSaturation: number) {\n this._uniformsDirty = true;\n this._saturation = colorSaturation / 10;\n }\n\n get colorBrightness(): number {\n return this._brightness;\n }\n set colorBrightness(colorBrightness: number) {\n this._uniformsDirty = true;\n this._brightness = colorBrightness;\n }\n\n get colorBlending(): number {\n return this._colorBlending * 10;\n }\n set colorBlending(colorBlending: number) {\n this._uniformsDirty = true;\n this._colorBlending = colorBlending / 10;\n }\n\n get grainScale(): number {\n return this._grainScale;\n }\n set grainScale(grainScale: number) {\n this._uniformsDirty = true;\n this._grainScale = grainScale == 0 ? 1 : grainScale;\n }\n\n get grainIntensity(): number {\n return this._grainIntensity;\n }\n set grainIntensity(grainIntensity: number) {\n this._uniformsDirty = true;\n this._grainIntensity = grainIntensity;\n }\n\n get grainSparsity(): number {\n return this._grainSparsity;\n }\n set grainSparsity(grainSparsity: number) {\n this._uniformsDirty = true;\n this._grainSparsity = grainSparsity;\n }\n\n get grainSpeed(): number {\n return this._grainSpeed;\n }\n set grainSpeed(grainSpeed: number) {\n this._uniformsDirty = true;\n this._grainSpeed = grainSpeed;\n }\n\n get wireframe(): boolean {\n return this._wireframe;\n }\n set wireframe(wireframe: boolean) {\n this._uniformsDirty = true;\n this._wireframe = wireframe;\n }\n\n get resolution(): number {\n return this._resolution;\n }\n set resolution(resolution: number) {\n if (this._resolution === resolution) return;\n this._resolution = resolution;\n this._updateGeometry();\n }\n\n get backgroundColor(): string {\n return this._backgroundColor;\n }\n set backgroundColor(backgroundColor: string) {\n this._uniformsDirty = true;\n this._backgroundColor = backgroundColor;\n this._backgroundColorRgb = this._hexToRgb(backgroundColor);\n }\n\n get backgroundAlpha(): number {\n return this._backgroundAlpha;\n }\n set backgroundAlpha(backgroundAlpha: number) {\n this._uniformsDirty = true;\n this._backgroundAlpha = backgroundAlpha;\n }\n\n get yOffset(): number {\n return this._yOffset;\n }\n set yOffset(yOffset: number) {\n if (this._yOffset !== yOffset) {\n this._yOffsetDirty = true;\n this._yOffset = yOffset;\n }\n }\n\n get yOffsetWaveMultiplier(): number {\n return this._yOffsetWaveMultiplier * 1000;\n }\n\n set yOffsetWaveMultiplier(value: number) {\n this._uniformsDirty = true;\n this._yOffsetWaveMultiplier = value / 1000;\n }\n\n get yOffsetColorMultiplier(): number {\n return this._yOffsetColorMultiplier * 1000;\n }\n\n set yOffsetColorMultiplier(value: number) {\n this._uniformsDirty = true;\n this._yOffsetColorMultiplier = value / 1000;\n }\n\n get yOffsetFlowMultiplier(): number {\n return this._yOffsetFlowMultiplier * 1000;\n }\n\n set yOffsetFlowMultiplier(value: number) {\n this._uniformsDirty = true;\n this._yOffsetFlowMultiplier = value / 1000;\n }\n\n get flowDistortionA(): number {\n return this._flowDistortionA;\n }\n set flowDistortionA(value: number) {\n this._uniformsDirty = true;\n this._flowDistortionA = value;\n }\n\n get flowDistortionB(): number {\n return this._flowDistortionB;\n }\n set flowDistortionB(value: number) {\n this._uniformsDirty = true;\n this._flowDistortionB = value;\n }\n\n get flowScale(): number {\n return this._flowScale;\n }\n set flowScale(value: number) {\n this._uniformsDirty = true;\n this._flowScale = value;\n }\n\n get flowEase(): number {\n return this._flowEase;\n }\n set flowEase(value: number) {\n this._uniformsDirty = true;\n this._flowEase = value;\n }\n\n set flowEnabled(value: boolean) {\n this._uniformsDirty = true;\n this._flowEnabled = value;\n }\n\n get flowEnabled(): boolean {\n return this._flowEnabled;\n }\n\n\n\n get enableProceduralTexture(): boolean {\n return this._enableProceduralTexture;\n }\n set enableProceduralTexture(value: boolean) {\n this._uniformsDirty = true;\n this._enableProceduralTexture = value;\n if (value && !this._proceduralTexture) {\n this._textureNeedsUpdate = true;\n }\n }\n\n get textureVoidLikelihood(): number {\n return this._textureVoidLikelihood;\n }\n set textureVoidLikelihood(value: number) {\n this._uniformsDirty = true;\n this._textureVoidLikelihood = value;\n if (this._enableProceduralTexture) {\n this._textureNeedsUpdate = true;\n }\n }\n\n get textureVoidWidthMin(): number {\n return this._textureVoidWidthMin;\n }\n set textureVoidWidthMin(value: number) {\n this._uniformsDirty = true;\n this._textureVoidWidthMin = value;\n if (this._enableProceduralTexture) {\n this._textureNeedsUpdate = true;\n }\n }\n\n get textureVoidWidthMax(): number {\n return this._textureVoidWidthMax;\n }\n set textureVoidWidthMax(value: number) {\n this._uniformsDirty = true;\n this._textureVoidWidthMax = value;\n if (this._enableProceduralTexture) {\n this._textureNeedsUpdate = true;\n }\n }\n\n get textureBandDensity(): number {\n return this._textureBandDensity;\n }\n set textureBandDensity(value: number) {\n this._uniformsDirty = true;\n this._textureBandDensity = value;\n if (this._enableProceduralTexture) {\n this._textureNeedsUpdate = true;\n }\n }\n\n get textureColorBlending(): number {\n return this._textureColorBlending;\n }\n set textureColorBlending(value: number) {\n this._uniformsDirty = true;\n this._textureColorBlending = value;\n if (this._enableProceduralTexture) {\n this._textureNeedsUpdate = true;\n }\n }\n\n get textureSeed(): number {\n return this._textureSeed;\n }\n set textureSeed(value: number) {\n this._uniformsDirty = true;\n this._textureSeed = value;\n if (this._enableProceduralTexture) {\n this._textureNeedsUpdate = true;\n }\n }\n\n get textureEase(): number {\n return this._textureEase;\n }\n\n set textureEase(value: number) {\n this._uniformsDirty = true;\n this._textureEase = value;\n }\n\n get transparentTextureVoid(): boolean {\n return this._transparentTextureVoid;\n }\n\n set transparentTextureVoid(value: boolean) {\n this._uniformsDirty = true;\n this._transparentTextureVoid = value;\n if (this._enableProceduralTexture) {\n this._textureNeedsUpdate = true;\n }\n }\n\n get proceduralBackgroundColor(): string {\n return this._proceduralBackgroundColor;\n }\n set proceduralBackgroundColor(value: string) {\n this._uniformsDirty = true;\n this._proceduralBackgroundColor = value;\n if (this._enableProceduralTexture) {\n this._textureNeedsUpdate = true;\n }\n }\n\n get textureShapeTriangles(): number {\n return this._textureShapeTriangles;\n }\n set textureShapeTriangles(value: number) {\n this._uniformsDirty = true;\n this._textureShapeTriangles = value;\n if (this._enableProceduralTexture) this._textureNeedsUpdate = true;\n }\n get textureShapeCircles(): number {\n return this._textureShapeCircles;\n }\n set textureShapeCircles(value: number) {\n this._uniformsDirty = true;\n this._textureShapeCircles = value;\n if (this._enableProceduralTexture) this._textureNeedsUpdate = true;\n }\n get textureShapeBars(): number {\n return this._textureShapeBars;\n }\n set textureShapeBars(value: number) {\n this._uniformsDirty = true;\n this._textureShapeBars = value;\n if (this._enableProceduralTexture) this._textureNeedsUpdate = true;\n }\n get textureShapeSquiggles(): number {\n return this._textureShapeSquiggles;\n }\n set textureShapeSquiggles(value: number) {\n this._uniformsDirty = true;\n this._textureShapeSquiggles = value;\n if (this._enableProceduralTexture) this._textureNeedsUpdate = true;\n }\n\n _updateGeometry() {\n if (!this.glState) return;\n const gl = this.glState.gl;\n const resolution = this._resolution || 1;\n\n let geometry;\n if (this._shapeType === 'sphere') {\n geometry = generateSphereGeometry(this._sphereRadius, 120 * resolution, 120 * resolution);\n } else if (this._shapeType === 'torus') {\n geometry = generateTorusGeometry(this._torusRadius, this._torusTube, 120 * resolution, 120 * resolution);\n } else if (this._shapeType === 'cylinder') {\n geometry = generateCylinderGeometry(this._cylinderRadius, this._cylinderRadius, this._cylinderHeight, 120 * resolution, 120 * resolution);\n } else if (this._shapeType === 'ribbon') {\n geometry = generateRibbonGeometry(PLANE_WIDTH, PLANE_HEIGHT, 240 * resolution, 240 * resolution, this._planeBend, this._planeTwist);\n } else {\n geometry = generatePlaneGeometry(PLANE_WIDTH, PLANE_HEIGHT, 240 * resolution, 240 * resolution);\n }\n const { position, normal, uv, index, wireframeIndex } = geometry;\n\n gl.bindBuffer(gl.ARRAY_BUFFER, this.glState.buffers.position);\n gl.bufferData(gl.ARRAY_BUFFER, position, gl.STATIC_DRAW);\n\n gl.bindBuffer(gl.ARRAY_BUFFER, this.glState.buffers.normal);\n gl.bufferData(gl.ARRAY_BUFFER, normal, gl.STATIC_DRAW);\n\n gl.bindBuffer(gl.ARRAY_BUFFER, this.glState.buffers.uv);\n gl.bufferData(gl.ARRAY_BUFFER, uv, gl.STATIC_DRAW);\n\n gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this.glState.buffers.index);\n gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, index, gl.STATIC_DRAW);\n\n gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this.glState.buffers.wireframeIndex);\n gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, wireframeIndex, gl.STATIC_DRAW);\n\n // Restore default bound element buffer\n gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this.glState.buffers.index);\n\n this.glState.indexCount = index.length;\n this.glState.wireframeIndexCount = wireframeIndex.length;\n this.glState.indexType = (index instanceof Uint32Array) ? gl.UNSIGNED_INT : gl.UNSIGNED_SHORT;\n\n // Keep camera updated with the new shapeType and dimensions\n const width = this._ref.clientWidth;\n const height = this._ref.clientHeight;\n updateCamera(this.glState.camera, width, height, PLANE_WIDTH, PLANE_HEIGHT, this._shapeType, this._cameraZoom);\n\n // Recompute projection matrix\n const projLoc = this.glState.locations.uniforms[\"projectionMatrix\"];\n gl.useProgram(this.glState.program);\n if (projLoc) gl.uniformMatrix4fv(projLoc, false, this.glState.camera.projectionMatrix.elements);\n\n this._uniformsDirty = true;\n }\n\n _hexToRgb(hex: string): [number, number, number] {\n const bigint = parseInt(hex.replace('#', ''), 16);\n return [\n ((bigint >> 16) & 255) / 255.0,\n ((bigint >> 8) & 255) / 255.0,\n (bigint & 255) / 255.0\n ];\n }\n\n _initScene(resolution: number): WebGLState {\n\n const width = this._ref.clientWidth;\n const height = this._ref.clientHeight;\n\n const gl = this._ref.getContext(\"webgl2\", { alpha: true, preserveDrawingBuffer: true, antialias: true }) ||\n this._ref.getContext(\"webgl\", { alpha: true, preserveDrawingBuffer: true, antialias: true });\n\n if (!gl) {\n throw new Error(\"WebGL not supported\");\n }\n\n const ext = gl.getExtension(\"OES_standard_derivatives\");\n gl.getExtension(\"OES_element_index_uint\");\n\n gl.viewport(0, 0, width, height);\n\n // Generate parametric geometry based on shapeType\n let geometry;\n if (this._shapeType === 'sphere') {\n geometry = generateSphereGeometry(this._sphereRadius, 120 * resolution, 120 * resolution);\n } else if (this._shapeType === 'torus') {\n geometry = generateTorusGeometry(this._torusRadius, this._torusTube, 120 * resolution, 120 * resolution);\n } else if (this._shapeType === 'cylinder') {\n geometry = generateCylinderGeometry(this._cylinderRadius, this._cylinderRadius, this._cylinderHeight, 120 * resolution, 120 * resolution);\n } else if (this._shapeType === 'ribbon') {\n geometry = generateRibbonGeometry(PLANE_WIDTH, PLANE_HEIGHT, 240 * resolution, 240 * resolution, this._planeBend, this._planeTwist);\n } else {\n geometry = generatePlaneGeometry(PLANE_WIDTH, PLANE_HEIGHT, 240 * resolution, 240 * resolution);\n }\n const { position, normal, uv, index, wireframeIndex } = geometry;\n\n const positionBuffer = gl.createBuffer()!;\n gl.bindBuffer(gl.ARRAY_BUFFER, positionBuffer);\n gl.bufferData(gl.ARRAY_BUFFER, position, gl.STATIC_DRAW);\n\n const normalBuffer = gl.createBuffer()!;\n gl.bindBuffer(gl.ARRAY_BUFFER, normalBuffer);\n gl.bufferData(gl.ARRAY_BUFFER, normal, gl.STATIC_DRAW);\n\n const uvBuffer = gl.createBuffer()!;\n gl.bindBuffer(gl.ARRAY_BUFFER, uvBuffer);\n gl.bufferData(gl.ARRAY_BUFFER, uv, gl.STATIC_DRAW);\n\n const indexBuffer = gl.createBuffer()!;\n gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, indexBuffer);\n gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, index, gl.STATIC_DRAW);\n\n const wireframeIndexBuffer = gl.createBuffer()!;\n gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, wireframeIndexBuffer);\n gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, wireframeIndex, gl.STATIC_DRAW);\n\n // Rebind the triangle index buffer as default\n gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, indexBuffer);\n\n const vertShaderSourceCombined = buildVertUniforms() + \"\\n\" + buildNoise() + \"\\n\" + buildColorFunctions() + \"\\n\" + vertexShaderSource;\n const vertShader = gl.createShader(gl.VERTEX_SHADER)!;\n gl.shaderSource(vertShader, vertShaderSourceCombined);\n gl.compileShader(vertShader);\n if (!gl.getShaderParameter(vertShader, gl.COMPILE_STATUS)) {\n console.log(\"VERTEX_SHADER_ERROR_START\");\n console.log(\"Vertex shader error: \", gl.getShaderInfoLog(vertShader));\n console.log(\"GL Error Code:\", gl.getError());\n console.log(\"Vertex Shader Source Dump:\");\n console.log(vertShaderSourceCombined.split('\\n').map((line, i) => `${i + 1}: ${line}`).join('\\n'));\n console.log(\"VERTEX_SHADER_ERROR_END\");\n }\n\n const fragShaderSourceCombined = buildFragUniforms() + \"\\n\" + buildColorFunctions() + \"\\n\" + buildNoise() + \"\\n\" + fragmentShaderSource;\n const fragShader = gl.createShader(gl.FRAGMENT_SHADER)!;\n gl.shaderSource(fragShader, fragShaderSourceCombined);\n gl.compileShader(fragShader);\n if (!gl.getShaderParameter(fragShader, gl.COMPILE_STATUS)) {\n console.log(\"FRAGMENT_SHADER_ERROR_START\");\n console.log(\"Fragment shader error: \", gl.getShaderInfoLog(fragShader));\n console.log(\"GL Error Code:\", gl.getError());\n console.log(\"Fragment Shader Source Dump:\");\n console.log(fragShaderSourceCombined.split('\\n').map((line, i) => `${i + 1}: ${line}`).join('\\n'));\n console.log(\"FRAGMENT_SHADER_ERROR_END\");\n }\n\n const program = gl.createProgram()!;\n gl.attachShader(program, vertShader);\n gl.attachShader(program, fragShader);\n gl.linkProgram(program);\n if (!gl.getProgramParameter(program, gl.LINK_STATUS)) {\n console.log(\"PROGRAM_LINK_ERROR_START\");\n console.log(\"Program linking error: \", gl.getProgramInfoLog(program));\n console.log(\"GL Error Code:\", gl.getError());\n console.log(\"PROGRAM_LINK_ERROR_END\");\n }\n\n gl.useProgram(program);\n\n const camera = new OrthographicCamera(0, 0, 0, 0, 0, 1000);\n camera.position = [0, 0, 5];\n updateCamera(camera, width, height, PLANE_WIDTH, PLANE_HEIGHT, this._shapeType, this._cameraZoom);\n\n // Define attributes\n const aPosition = gl.getAttribLocation(program, \"position\");\n const aNormal = gl.getAttribLocation(program, \"normal\");\n const aUv = gl.getAttribLocation(program, \"uv\");\n\n gl.enableVertexAttribArray(aPosition);\n gl.bindBuffer(gl.ARRAY_BUFFER, positionBuffer);\n gl.vertexAttribPointer(aPosition, 3, gl.FLOAT, false, 0, 0);\n\n gl.enableVertexAttribArray(aNormal);\n gl.bindBuffer(gl.ARRAY_BUFFER, normalBuffer);\n gl.vertexAttribPointer(aNormal, 3, gl.FLOAT, false, 0, 0);\n\n gl.enableVertexAttribArray(aUv);\n gl.bindBuffer(gl.ARRAY_BUFFER, uvBuffer);\n gl.vertexAttribPointer(aUv, 2, gl.FLOAT, false, 0, 0);\n\n gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, indexBuffer);\n\n // modelViewMatrix is set dynamically in the render loop\n\n const projLoc = gl.getUniformLocation(program, \"projectionMatrix\");\n gl.uniformMatrix4fv(projLoc, false, camera.projectionMatrix.elements);\n\n const planeWidthLoc = gl.getUniformLocation(program, \"u_plane_width\");\n gl.uniform1f(planeWidthLoc, PLANE_WIDTH);\n\n const planeHeightLoc = gl.getUniformLocation(program, \"u_plane_height\");\n gl.uniform1f(planeHeightLoc, PLANE_HEIGHT);\n\n const colorsCountLoc = gl.getUniformLocation(program, \"u_colors_count\");\n gl.uniform1i(colorsCountLoc, COLORS_COUNT);\n\n const uniformsList = [\n \"projectionMatrix\", \"modelViewMatrix\",\n \"u_time\", \"u_resolution\", \"u_color_pressure\", \"u_wave_frequency_x\", \"u_wave_frequency_y\",\n \"u_wave_amplitude\", \"u_colors_count\", \"u_plane_width\", \"u_plane_height\", \"u_shadows\",\n \"u_highlights\", \"u_grain_intensity\", \"u_grain_sparsity\", \"u_grain_scale\", \"u_grain_speed\",\n \"u_flow_distortion_a\", \"u_flow_distortion_b\", \"u_flow_scale\", \"u_flow_ease\", \"u_flow_enabled\",\n \"u_y_offset\", \"u_y_offset_wave_multiplier\", \"u_y_offset_color_multiplier\", \"u_y_offset_flow_multiplier\",\n\n \"u_procedural_texture\", \"u_enable_procedural_texture\", \"u_texture_ease\", \"u_transparent_texture_void\", \"u_saturation\", \"u_brightness\", \"u_color_blending\",\n \"u_domain_warp_enabled\", \"u_domain_warp_intensity\", \"u_domain_warp_scale\",\n \"u_vignette_intensity\", \"u_vignette_radius\",\n \"u_fresnel_enabled\", \"u_fresnel_power\", \"u_fresnel_intensity\", \"u_fresnel_color\",\n \"u_iridescence_enabled\", \"u_iridescence_intensity\", \"u_iridescence_speed\",\n \"u_bloom_intensity\", \"u_bloom_threshold\", \"u_chromatic_aberration\",\n \"u_shape_type\", \"u_silhouette_fade\", \"u_cylinder_fade\", \"u_ribbon_fade\", \"u_flat_shading\"\n ];\n\n const locations: WebGLState[\"locations\"] = {\n attributes: { position: aPosition, normal: aNormal, uv: aUv },\n uniforms: {}\n };\n\n uniformsList.forEach(name => {\n locations.uniforms[name] = gl.getUniformLocation(program, name);\n });\n\n // Add colors uniforms manually\n for (let i = 0; i < COLORS_COUNT; i++) {\n locations.uniforms[`u_colors[${i}].is_active`] = gl.getUniformLocation(program, `u_colors[${i}].is_active`);\n locations.uniforms[`u_colors[${i}].color`] = gl.getUniformLocation(program, `u_colors[${i}].color`);\n locations.uniforms[`u_colors[${i}].influence`] = gl.getUniformLocation(program, `u_colors[${i}].influence`);\n }\n\n this._initialized = true;\n // New program needs all uniforms re-uploaded on first frame\n this._uniformsDirty = true;\n this._colorsChanged = true;\n this._textureDirty = true;\n\n // Enable alpha blending\n gl.enable(gl.BLEND);\n gl.blendFunc(gl.SRC_ALPHA, gl.ONE_MINUS_SRC_ALPHA);\n gl.enable(gl.DEPTH_TEST);\n\n return {\n gl,\n program,\n buffers: {\n position: positionBuffer,\n normal: normalBuffer,\n uv: uvBuffer,\n index: indexBuffer,\n wireframeIndex: wireframeIndexBuffer\n },\n locations,\n camera,\n indexCount: index.length,\n wireframeIndexCount: wireframeIndex.length,\n indexType: (index instanceof Uint32Array) ? gl.UNSIGNED_INT : gl.UNSIGNED_SHORT\n };\n }\n\n\n\n _createProceduralTexture(gl: WebGLRenderingContext | WebGL2RenderingContext): WebGLTexture | null {\n // Texture size - 1024 provides good balance between quality and performance\n // Reduced from 2048 for better performance\n const texSize = 1024;\n \n if (!this._sourceCanvas) {\n this._sourceCanvas = document.createElement('canvas');\n this._sourceCanvas.width = texSize;\n this._sourceCanvas.height = texSize;\n this._sourceCtx = this._sourceCanvas.getContext('2d');\n }\n const sourceCanvas = this._sourceCanvas;\n const sCtx = this._sourceCtx;\n if (!sCtx) return null;\n\n let seed = this._textureSeed;\n const baseSeed = this._textureSeed;\n\n function random() {\n const x = Math.sin(seed++) * 10000;\n return x - Math.floor(x);\n }\n\n // Helper to reset seed for isolated shape generation\n const setSeed = (offset: number) => {\n seed = baseSeed + offset;\n };\n\n const colors = this._colors.filter(c => c.enabled).map(c => c.color);\n if (colors.length === 0) return null;\n\n const shouldTile = this._shapeType !== 'plane';\n const dxs = shouldTile ? [-1, 0, 1] : [0];\n const dys = shouldTile ? [-1, 0, 1] : [0];\n\n // Helper functions\n function hexToRgb(hex: string) {\n const bigint = parseInt(hex.replace('#', ''), 16);\n return {\n r: (bigint >> 16) & 255,\n g: (bigint >> 8) & 255,\n b: bigint & 255\n };\n }\n\n function rgbToHex(r: number, g: number, b: number) {\n return \"#\" + ((1 << 24) + (Math.round(r) << 16) + (Math.round(g) << 8) + Math.round(b)).toString(16).slice(1).padStart(6, '0');\n }\n\n const getInterColor = () => {\n const c1 = colors[Math.floor(random() * colors.length)];\n const c2 = colors[Math.floor(random() * colors.length)];\n const mix = random() * this._textureColorBlending;\n const rgb1 = hexToRgb(c1);\n const rgb2 = hexToRgb(c2);\n const r = rgb1.r + (rgb2.r - rgb1.r) * mix;\n const g = rgb1.g + (rgb2.g - rgb1.g) * mix;\n const b = rgb1.b + (rgb2.b - rgb1.b) * mix;\n return rgbToHex(r, g, b);\n };\n\n // === SOURCE CANVAS ===\n // Base with procedural background color so even sparse areas pick it up\n const baseColor = this._proceduralBackgroundColor || \"#000000\";\n sCtx.fillStyle = baseColor;\n sCtx.fillRect(0, 0, texSize, texSize);\n\n // Then lay a vertical gradient of mixed colors on top for richness\n const bgGrad = sCtx.createLinearGradient(0, 0, 0, texSize);\n bgGrad.addColorStop(0, getInterColor());\n bgGrad.addColorStop(1, getInterColor());\n sCtx.fillStyle = bgGrad;\n sCtx.fillRect(0, 0, texSize, texSize);\n\n // Triangles: use configurable count\n for (let i = 0; i < this._textureShapeTriangles; i++) {\n const fillStyle = getInterColor();\n const x = random() * texSize;\n const y = random() * texSize;\n const s = 100 + random() * 300;\n const x1 = (random() - 0.5) * s;\n const y1 = (random() - 0.5) * s;\n const x2 = (random() - 0.5) * s;\n const y2 = (random() - 0.5) * s;\n\n for (const dx of dxs) {\n for (const dy of dys) {\n sCtx.fillStyle = fillStyle;\n sCtx.beginPath();\n const tx = x + dx * texSize;\n const ty = y + dy * texSize;\n sCtx.moveTo(tx, ty);\n sCtx.lineTo(tx + x1, ty + y1);\n sCtx.lineTo(tx + x2, ty + y2);\n sCtx.fill();\n }\n }\n }\n\n // Circles / rings: use configurable count\n for (let i = 0; i < this._textureShapeCircles; i++) {\n const strokeStyle = getInterColor();\n const lineWidth = 10 + random() * 50;\n const x = random() * texSize;\n const y = random() * texSize;\n const r = 50 + random() * 150;\n\n for (const dx of dxs) {\n for (const dy of dys) {\n sCtx.strokeStyle = strokeStyle;\n sCtx.lineWidth = lineWidth;\n sCtx.beginPath();\n sCtx.arc(x + dx * texSize, y + dy * texSize, r, 0, Math.PI * 2);\n sCtx.stroke();\n }\n }\n }\n\n // Bars: use configurable count\n for (let i = 0; i < this._textureShapeBars; i++) {\n const fillStyle = getInterColor();\n const x = random() * texSize;\n const y = random() * texSize;\n const rot = random() * Math.PI;\n\n for (const dx of dxs) {\n for (const dy of dys) {\n sCtx.fillStyle = fillStyle;\n sCtx.save();\n sCtx.translate(x + dx * texSize, y + dy * texSize);\n sCtx.rotate(rot);\n sCtx.fillRect(-150, -25, 300, 50);\n sCtx.restore();\n }\n }\n }\n\n // Squiggles: use configurable count\n sCtx.lineWidth = 15;\n sCtx.lineCap = 'round';\n for (let i = 0; i < this._textureShapeSquiggles; i++) {\n const strokeStyle = getInterColor();\n const x = random() * texSize;\n const y = random() * texSize;\n \n const curves: Array<{ cx1: number, cy1: number, cx2: number, cy2: number, ex: number, ey: number }> = [];\n let cx = 0;\n let cy = 0;\n for (let j = 0; j < 4; j++) {\n const ex = cx + (random() - 0.5) * 300;\n const ey = cy + (random() - 0.5) * 300;\n curves.push({\n cx1: cx + (random() - 0.5) * 300,\n cy1: cy + (random() - 0.5) * 300,\n cx2: cx + (random() - 0.5) * 300,\n cy2: cy + (random() - 0.5) * 300,\n ex: ex,\n ey: ey\n });\n cx = ex;\n cy = ey;\n }\n\n for (const dx of dxs) {\n for (const dy of dys) {\n sCtx.strokeStyle = strokeStyle;\n sCtx.beginPath();\n const tx = x + dx * texSize;\n const ty = y + dy * texSize;\n sCtx.moveTo(tx, ty);\n \n for (const curve of curves) {\n sCtx.bezierCurveTo(\n tx + curve.cx1, ty + curve.cy1,\n tx + curve.cx2, ty + curve.cy2,\n tx + curve.ex, ty + curve.ey\n );\n }\n sCtx.stroke();\n }\n }\n }\n\n // === MASKED CANVAS ===\n // Masking: Seed isolation\n setSeed(50000);\n if (!this._maskedCanvas) {\n this._maskedCanvas = document.createElement('canvas');\n this._maskedCanvas.width = texSize;\n this._maskedCanvas.height = texSize;\n this._maskedCtx = this._maskedCanvas.getContext('2d');\n }\n const canvas = this._maskedCanvas;\n const ctx = this._maskedCtx;\n if (!ctx) return null;\n\n // Start filled with the chosen void color so gaps show that color\n if (this._transparentTextureVoid) {\n ctx.clearRect(0, 0, texSize, texSize);\n } else {\n ctx.fillStyle = baseColor;\n ctx.fillRect(0, 0, texSize, texSize);\n }\n\n // Determine layout segments (matter vs void)\n let layoutHead = 0;\n const segments: Array<{ type: 'void' | 'matter', x: number, width: number }> = [];\n\n while (layoutHead < texSize) {\n const isVoid = random() < this._textureVoidLikelihood;\n if (isVoid) {\n const w = this._textureVoidWidthMin + random() * (this._textureVoidWidthMax - this._textureVoidWidthMin);\n segments.push({ type: 'void', x: layoutHead, width: w });\n layoutHead += w;\n } else {\n const w = 50 + random() * 200;\n segments.push({ type: 'matter', x: layoutHead, width: w });\n layoutHead += w;\n }\n }\n\n // Render only matter bands from the source into the masked canvas\n for (const seg of segments) {\n if (seg.type === 'matter') {\n const startX = seg.x;\n const endX = Math.min(seg.x + seg.width, texSize);\n let currentX = startX;\n\n while (currentX < endX) {\n const stripeWidth = (2 + random() * 20) / this._textureBandDensity;\n const sourceX = Math.floor(random() * texSize);\n ctx.drawImage(\n sourceCanvas,\n sourceX, 0, stripeWidth, texSize,\n currentX, 0, stripeWidth, texSize\n );\n currentX += stripeWidth;\n }\n }\n // void segments: leave as baseColor\n }\n\n const tex = gl.createTexture()!;\n gl.bindTexture(gl.TEXTURE_2D, tex);\n gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, canvas);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.REPEAT);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.REPEAT);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR_MIPMAP_LINEAR);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR);\n gl.generateMipmap(gl.TEXTURE_2D);\n\n const ext = gl.getExtension('EXT_texture_filter_anisotropic') ||\n gl.getExtension('MOZ_EXT_texture_filter_anisotropic') ||\n gl.getExtension('WEBKIT_EXT_texture_filter_anisotropic');\n if (ext) {\n const max = gl.getParameter(ext.MAX_TEXTURE_MAX_ANISOTROPY_EXT);\n gl.texParameterf(gl.TEXTURE_2D, ext.TEXTURE_MAX_ANISOTROPY_EXT, Math.min(16, max));\n }\n\n return tex;\n }\n\n get silhouetteFade(): number {\n return this._silhouetteFade;\n }\n set silhouetteFade(value: number) {\n if (this._silhouetteFade !== value) {\n this._silhouetteFade = value;\n this._uniformsDirty = true;\n }\n }\n\n get cylinderFade(): number {\n return this._cylinderFade;\n }\n set cylinderFade(value: number) {\n if (this._cylinderFade !== value) {\n this._cylinderFade = value;\n this._uniformsDirty = true;\n }\n }\n\n get ribbonFade(): number {\n return this._ribbonFade;\n }\n set ribbonFade(value: number) {\n if (this._ribbonFade !== value) {\n this._ribbonFade = value;\n this._uniformsDirty = true;\n }\n }\n\n get flatShading(): boolean {\n return this._flatShading;\n }\n set flatShading(value: boolean) {\n if (this._flatShading !== value) {\n this._flatShading = value;\n this._uniformsDirty = true;\n }\n }\n\n get domainWarpEnabled(): boolean {\n return this._domainWarpEnabled;\n }\n set domainWarpEnabled(enabled: boolean) {\n if (this._domainWarpEnabled !== enabled) {\n this._domainWarpEnabled = enabled;\n this._uniformsDirty = true;\n }\n }\n\n get domainWarpIntensity(): number {\n return this._domainWarpIntensity;\n }\n set domainWarpIntensity(intensity: number) {\n if (this._domainWarpIntensity !== intensity) {\n this._domainWarpIntensity = intensity;\n this._uniformsDirty = true;\n }\n }\n\n get domainWarpScale(): number {\n return this._domainWarpScale;\n }\n set domainWarpScale(scale: number) {\n if (this._domainWarpScale !== scale) {\n this._domainWarpScale = scale;\n this._uniformsDirty = true;\n }\n }\n\n get vignetteIntensity(): number {\n return this._vignetteIntensity;\n }\n set vignetteIntensity(intensity: number) {\n if (this._vignetteIntensity !== intensity) {\n this._vignetteIntensity = intensity;\n this._uniformsDirty = true;\n }\n }\n\n get vignetteRadius(): number {\n return this._vignetteRadius;\n }\n set vignetteRadius(radius: number) {\n if (this._vignetteRadius !== radius) {\n this._vignetteRadius = radius;\n this._uniformsDirty = true;\n }\n }\n\n get fresnelEnabled(): boolean {\n return this._fresnelEnabled;\n }\n set fresnelEnabled(enabled: boolean) {\n if (this._fresnelEnabled !== enabled) {\n this._fresnelEnabled = enabled;\n this._uniformsDirty = true;\n }\n }\n\n get fresnelPower(): number {\n return this._fresnelPower;\n }\n set fresnelPower(power: number) {\n if (this._fresnelPower !== power) {\n this._fresnelPower = power;\n this._uniformsDirty = true;\n }\n }\n\n get fresnelIntensity(): number {\n return this._fresnelIntensity;\n }\n set fresnelIntensity(intensity: number) {\n if (this._fresnelIntensity !== intensity) {\n this._fresnelIntensity = intensity;\n this._uniformsDirty = true;\n }\n }\n\n get fresnelColor(): string {\n return this._fresnelColor;\n }\n set fresnelColor(fresnelColor: string) {\n if (this._fresnelColor !== fresnelColor) {\n this._fresnelColor = fresnelColor;\n this._fresnelColorRgb = this._hexToRgb(fresnelColor);\n this._uniformsDirty = true;\n }\n }\n\n get iridescenceEnabled(): boolean {\n return this._iridescenceEnabled;\n }\n set iridescenceEnabled(enabled: boolean) {\n if (this._iridescenceEnabled !== enabled) {\n this._iridescenceEnabled = enabled;\n this._uniformsDirty = true;\n }\n }\n\n get iridescenceIntensity(): number {\n return this._iridescenceIntensity;\n }\n set iridescenceIntensity(intensity: number) {\n if (this._iridescenceIntensity !== intensity) {\n this._iridescenceIntensity = intensity;\n this._uniformsDirty = true;\n }\n }\n\n get iridescenceSpeed(): number {\n return this._iridescenceSpeed;\n }\n set iridescenceSpeed(speed: number) {\n if (this._iridescenceSpeed !== speed) {\n this._iridescenceSpeed = speed;\n this._uniformsDirty = true;\n }\n }\n\n get bloomIntensity(): number {\n return this._bloomIntensity;\n }\n set bloomIntensity(intensity: number) {\n if (this._bloomIntensity !== intensity) {\n this._bloomIntensity = intensity;\n this._uniformsDirty = true;\n }\n }\n\n get bloomThreshold(): number {\n return this._bloomThreshold;\n }\n set bloomThreshold(threshold: number) {\n if (this._bloomThreshold !== threshold) {\n this._bloomThreshold = threshold;\n this._uniformsDirty = true;\n }\n }\n\n get chromaticAberration(): number {\n return this._chromaticAberration;\n }\n set chromaticAberration(aberration: number) {\n if (this._chromaticAberration !== aberration) {\n this._chromaticAberration = aberration;\n this._uniformsDirty = true;\n }\n }\n\n // Getters and Setters for 3D Shapes\n get shapeType(): 'plane' | 'sphere' | 'torus' | 'cylinder' | 'ribbon' {\n return this._shapeType;\n }\n set shapeType(val: 'plane' | 'sphere' | 'torus' | 'cylinder' | 'ribbon') {\n if (this._shapeType !== val) {\n this._shapeType = val;\n this._updateGeometry();\n }\n }\n\n get shapeRotationX(): number { return this._shapeRotationX; }\n set shapeRotationX(val: number) {\n this._shapeRotationX = val;\n this._uniformsDirty = true;\n }\n\n get shapeRotationY(): number { return this._shapeRotationY; }\n set shapeRotationY(val: number) {\n this._shapeRotationY = val;\n this._uniformsDirty = true;\n }\n\n get shapeRotationZ(): number { return this._shapeRotationZ; }\n set shapeRotationZ(val: number) {\n this._shapeRotationZ = val;\n this._uniformsDirty = true;\n }\n\n get shapeAutoRotateSpeedX(): number { return this._shapeAutoRotateSpeedX; }\n set shapeAutoRotateSpeedX(val: number) {\n this._shapeAutoRotateSpeedX = val;\n this._uniformsDirty = true;\n }\n\n get shapeAutoRotateSpeedY(): number { return this._shapeAutoRotateSpeedY; }\n set shapeAutoRotateSpeedY(val: number) {\n this._shapeAutoRotateSpeedY = val;\n this._uniformsDirty = true;\n }\n\n get sphereRadius(): number { return this._sphereRadius; }\n set sphereRadius(val: number) {\n if (this._sphereRadius !== val) {\n this._sphereRadius = val;\n this._updateGeometry();\n }\n }\n\n get torusRadius(): number { return this._torusRadius; }\n set torusRadius(val: number) {\n if (this._torusRadius !== val) {\n this._torusRadius = val;\n this._updateGeometry();\n }\n }\n\n get torusTube(): number { return this._torusTube; }\n set torusTube(val: number) {\n if (this._torusTube !== val) {\n this._torusTube = val;\n this._updateGeometry();\n }\n }\n\n get cylinderRadius(): number { return this._cylinderRadius; }\n set cylinderRadius(val: number) {\n if (this._cylinderRadius !== val) {\n this._cylinderRadius = val;\n this._updateGeometry();\n }\n }\n\n get cylinderHeight(): number { return this._cylinderHeight; }\n set cylinderHeight(val: number) {\n if (this._cylinderHeight !== val) {\n this._cylinderHeight = val;\n this._updateGeometry();\n }\n }\n\n get planeBend(): number { return this._planeBend; }\n set planeBend(val: number) {\n if (this._planeBend !== val) {\n this._planeBend = val;\n this._updateGeometry();\n }\n }\n\n get planeTwist(): number { return this._planeTwist; }\n set planeTwist(val: number) {\n if (this._planeTwist !== val) {\n this._planeTwist = val;\n this._updateGeometry();\n }\n }\n\n // Camera Getters and Setters\n get cameraLock(): boolean { return this._cameraLock; }\n set cameraLock(val: boolean) {\n this._cameraLock = val;\n }\n\n get cameraX(): number { return this._cameraX; }\n set cameraX(val: number) {\n this._cameraX = val;\n this._uniformsDirty = true;\n }\n\n get cameraY(): number { return this._cameraY; }\n set cameraY(val: number) {\n this._cameraY = val;\n this._uniformsDirty = true;\n }\n\n get cameraZ(): number { return this._cameraZ; }\n set cameraZ(val: number) {\n this._cameraZ = val;\n this._uniformsDirty = true;\n }\n\n get cameraRotationX(): number { return this._cameraRotationX; }\n set cameraRotationX(val: number) {\n this._cameraRotationX = val;\n this._uniformsDirty = true;\n }\n\n get cameraRotationY(): number { return this._cameraRotationY; }\n set cameraRotationY(val: number) {\n this._cameraRotationY = val;\n this._uniformsDirty = true;\n }\n\n get cameraRotationZ(): number { return this._cameraRotationZ; }\n set cameraRotationZ(val: number) {\n this._cameraRotationZ = val;\n this._uniformsDirty = true;\n }\n\n get cameraZoom(): number { return this._cameraZoom; }\n set cameraZoom(val: number) {\n if (this._cameraZoom !== val) {\n this._cameraZoom = val;\n this._updateCameraFrustum();\n }\n }\n\n _updateCameraFrustum() {\n if (!this.glState) return;\n const gl = this.glState.gl;\n const width = this._ref.clientWidth;\n const height = this._ref.clientHeight;\n updateCamera(this.glState.camera, width, height, PLANE_WIDTH, PLANE_HEIGHT, this._shapeType, this._cameraZoom);\n\n const projLoc = this.glState.locations.uniforms[\"projectionMatrix\"];\n gl.useProgram(this.glState.program);\n if (projLoc) gl.uniformMatrix4fv(projLoc, false, this.glState.camera.projectionMatrix.elements);\n this._uniformsDirty = true;\n }\n}\n\n\nconst setLinkStyles = (link: HTMLAnchorElement) => {\n link.id = LINK_ID;\n link.href = \"https://neat.firecms.co\";\n link.target = \"_blank\";\n link.style.position = \"absolute\";\n link.style.display = \"block\";\n link.style.bottom = \"0\";\n link.style.right = \"0\";\n link.style.padding = \"10px\";\n link.style.color = \"#dcdcdc\";\n link.style.opacity = \"0.8\";\n link.style.fontFamily = \"sans-serif\";\n link.style.fontSize = \"16px\";\n link.style.fontWeight = \"bold\";\n link.style.textDecoration = \"none\";\n link.style.zIndex = \"10000\";\n link.style.pointerEvents = \"auto\";\n link.setAttribute(\"data-n\", \"1\");\n link.innerHTML = \"NEAT\";\n}\n\nconst addNeatLink = (ref: HTMLCanvasElement): HTMLAnchorElement => {\n const parent = ref.parentElement;\n // Ensure parent has position so absolute link is positioned relative to it\n if (parent && getComputedStyle(parent).position === \"static\") {\n parent.style.position = \"relative\";\n }\n // Search parent for existing neat link (survives HMR where LINK_ID changes)\n if (parent) {\n const existing = parent.querySelector('a[data-n]') as HTMLAnchorElement;\n if (existing) {\n setLinkStyles(existing);\n return existing;\n }\n }\n const link = document.createElement(\"a\");\n setLinkStyles(link);\n parent?.appendChild(link);\n return link;\n}\n\nfunction getElapsedSecondsInLastHour() {\n const now = new Date();\n const minutes = now.getMinutes();\n const seconds = now.getSeconds();\n return (minutes * 60) + seconds;\n}\n\nfunction generateRandomString(length: number = 6): string {\n const characters = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';\n let result = '';\n for (let i = 0; i < length; i++) {\n const randomIndex = Math.floor(Math.random() * characters.length);\n result += characters.charAt(randomIndex);\n }\n return result;\n}\n\nfunction downloadURI(uri: string, name: string) {\n const link = document.createElement(\"a\");\n link.download = name;\n link.href = uri;\n document.body.appendChild(link);\n link.click();\n document.body.removeChild(link);\n}\n\nfunction injectSEO() {\n if (document.getElementById(\"neat-seo-schema\")) return;\n\n // 1. JSON-LD Schema\n const script = document.createElement('script');\n script.id = \"neat-seo-schema\";\n script.type = 'application/ld+json';\n script.text = JSON.stringify({\n \"@context\": \"https://schema.org\",\n \"@type\": \"WebSite\",\n \"name\": \"NEAT Gradient\",\n \"url\": \"https://neat.firecms.co\",\n \"author\": {\n \"@type\": \"Organization\",\n \"name\": \"FireCMS\",\n \"url\": \"https://firecms.co\"\n },\n \"description\": \"Beautiful, fast, heavily customizable, WebGL based gradients.\"\n });\n document.head.appendChild(script);\n\n // 2. Hidden Backlink via Shadow DOM\n const hiddenContainer = document.createElement('div');\n hiddenContainer.style.position = 'absolute';\n hiddenContainer.style.width = '1px';\n hiddenContainer.style.height = '1px';\n hiddenContainer.style.padding = '0';\n hiddenContainer.style.margin = '-1px';\n hiddenContainer.style.overflow = 'hidden';\n hiddenContainer.style.clip = 'rect(0, 0, 0, 0)';\n hiddenContainer.style.whiteSpace = 'nowrap';\n hiddenContainer.style.borderWidth = '0';\n\n try {\n const shadow = hiddenContainer.attachShadow({ mode: 'closed' });\n const link = document.createElement('a');\n link.href = \"https://firecms.co\";\n link.textContent = \"FireCMS\";\n shadow.appendChild(link);\n } catch (e) {\n const link = document.createElement('a');\n link.href = \"https://firecms.co\";\n link.textContent = \"FireCMS\";\n hiddenContainer.appendChild(link);\n }\n\n document.body.appendChild(hiddenContainer);\n}\n"],"names":["vertexShaderSource","fragmentShaderSource","buildVertUniforms","buildFragUniforms","buildNoise","buildColorFunctions","Matrix4","tx","ty","tz","angle","c","s","m12","m22","m32","m42","m13","m23","m33","m43","m11","m21","m31","m41","OrthographicCamera","left","right","top","bottom","near","far","w","h","p","x","z","updateCamera","camera","width","height","planeWidth","planeHeight","shapeType","zoom","ratio","targetPlaneArea","targetWidth","targetHeight","horizontalScale","mobileZoomFactor","halfSize","generatePlaneGeometry","widthSegments","heightSegments","width_half","height_half","gridX","gridY","gridX1","gridY1","segment_width","segment_height","indices","vertices","normals","uvs","iy","y","ix","a","b","d","isLarge","wireframeIndices","i","generateSphereGeometry","radius","widthSegmentsFloor","heightSegmentsFloor","v","theta","u","phi","len","generateTorusGeometry","tube","radialSegments","tubularSegments","radialSegmentsFloor","tubularSegmentsFloor","j","cx","cy","nx","ny","nz","generateCylinderGeometry","radiusTop","radiusBottom","halfHeight","sinTheta","cosTheta","generateRibbonGeometry","bend","twist","xp","yp","zp","r","cosA","sinA","rx","rz","rnx","rnz","PLANE_WIDTH","PLANE_HEIGHT","COLORS_COUNT","LINK_ID","generateRandomString","NeatGradient","config","ref","speed","horizontalPressure","verticalPressure","waveFrequencyX","waveFrequencyY","waveAmplitude","colors","highlights","shadows","colorSaturation","colorBrightness","colorBlending","grainScale","grainIntensity","grainSparsity","grainSpeed","wireframe","backgroundColor","backgroundAlpha","resolution","seed","yOffset","yOffsetWaveMultiplier","yOffsetColorMultiplier","yOffsetFlowMultiplier","flowDistortionA","flowDistortionB","flowScale","flowEase","flowEnabled","enableProceduralTexture","textureVoidLikelihood","textureVoidWidthMin","textureVoidWidthMax","textureBandDensity","textureColorBlending","textureSeed","textureEase","proceduralBackgroundColor","transparentTextureVoid","textureShapeTriangles","textureShapeCircles","textureShapeBars","textureShapeSquiggles","domainWarpEnabled","domainWarpIntensity","domainWarpScale","vignetteIntensity","vignetteRadius","fresnelEnabled","fresnelPower","fresnelIntensity","fresnelColor","iridescenceEnabled","iridescenceIntensity","iridescenceSpeed","bloomIntensity","bloomThreshold","chromaticAberration","silhouetteFade","cylinderFade","ribbonFade","flatShading","cameraLock","cameraX","cameraY","cameraZ","cameraRotationX","cameraRotationY","cameraRotationZ","cameraZoom","shapeRotationX","shapeRotationY","shapeRotationZ","shapeAutoRotateSpeedX","shapeAutoRotateSpeedY","sphereRadius","torusRadius","torusTube","cylinderRadius","cylinderHeight","planeBend","planeTwist","injectSEO","tick","getElapsedSecondsInLastHour","lastTime","render","gl","program","locations","indexCount","indexType","addNeatLink","timeNow","modelViewMatrix","ry","mvLoc","shapeTypeVal","rgb","entries","wasVisible","setSize","projLoc","filename","dataURL","downloadURI","options","durationMs","format","onProgress","onComplete","source","offscreen","ctx","stream","videoTrack","mp4Candidates","webmCandidates","candidates","mimeType","candidate","pixels","baseBitrate","basePixels","videoBitsPerSecond","recorder","chunks","e","stopped","rafId","startTime","lastProgressTime","drawFrame","fontSize","now","isMP4","ext","blobType","finalFilename","blob","url","timeoutId","value","geometry","position","normal","uv","index","wireframeIndex","hex","bigint","positionBuffer","normalBuffer","uvBuffer","indexBuffer","wireframeIndexBuffer","vertShaderSourceCombined","vertShader","line","fragShaderSourceCombined","fragShader","aPosition","aNormal","aUv","planeWidthLoc","planeHeightLoc","colorsCountLoc","uniformsList","name","sourceCanvas","sCtx","baseSeed","random","setSeed","offset","shouldTile","dxs","dys","hexToRgb","rgbToHex","g","getInterColor","c1","c2","mix","rgb1","rgb2","baseColor","bgGrad","fillStyle","x1","y1","x2","y2","dx","dy","strokeStyle","lineWidth","rot","curves","ex","ey","curve","canvas","layoutHead","segments","seg","startX","endX","currentX","stripeWidth","sourceX","tex","max","enabled","intensity","scale","power","threshold","aberration","val","setLinkStyles","link","parent","existing","minutes","seconds","length","characters","result","randomIndex","uri","script","hiddenContainer","shadow"],"mappings":"4NAAO,MAAMA,EAAqB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,GAAAC,GAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,GAsHE,SAAAC,IAAA,CAAA,MAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,8BAAA,CAAA,SAAAC,IAAA,CAAA,MAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,8BAiOzB,CAAA,SAAAC,IAAA,CAAA,MAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAA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"}
|
|
1
|
+
{"version":3,"file":"index.umd.js","sources":["../src/shaders.ts","../src/math.ts","../src/NeatGradient.ts"],"sourcesContent":["export const vertexShaderSource = `void main() {\n vUv = uv;\n vPosition = position;\n\n // SCROLLING LOGIC\n // Separate multipliers for wave, color, and flow offsets\n float waveOffset = -u_y_offset * u_y_offset_wave_multiplier;\n float colorOffset = -u_y_offset * u_y_offset_color_multiplier;\n float flowOffset = -u_y_offset * u_y_offset_flow_multiplier;\n\n // 1. DISPLACEMENT (WAVES)\n // We add waveOffset to Y to scroll the wave pattern\n v_displacement_amount = cnoise( vec3(\n u_wave_frequency_x * position.x + u_time,\n u_wave_frequency_y * (position.y + waveOffset) + u_time,\n u_time\n ));\n\n // 2. FLOW FIELD\n // Apply flow offset to scroll the flow field mask\n vec2 baseUv = vUv;\n baseUv.y += flowOffset / u_plane_height; // Scale to match wave speed\n vec2 flowUv = baseUv;\n\n if (u_flow_enabled > 0.5) {\n if (u_flow_ease > 0.0 || u_flow_distortion_a > 0.0) {\n vec2 ppp = -1.0 + 2.0 * baseUv;\n ppp += 0.1 * cos((1.5 * u_flow_scale) * ppp.yx + 1.1 * u_time + vec2(0.1, 1.1));\n ppp += 0.1 * cos((2.3 * u_flow_scale) * ppp.yx + 1.3 * u_time + vec2(3.2, 3.4));\n ppp += 0.1 * cos((2.2 * u_flow_scale) * ppp.yx + 1.7 * u_time + vec2(1.8, 5.2));\n ppp += u_flow_distortion_a * cos((u_flow_distortion_b * u_flow_scale) * ppp.yx + 1.4 * u_time + vec2(6.3, 3.9));\n\n float r = length(ppp);\n flowUv = mix(baseUv, vec2(baseUv.x * (1.0 - u_flow_ease) + r * u_flow_ease, baseUv.y), u_flow_ease);\n }\n }\n\n // Pass the standard flow UV to fragment shader (for texture)\n vFlowUv = flowUv;\n\n // 3. COLOR MIXING\n // We take the computed flow UVs and apply the color offset\n // Scale by plane height to match wave offset speed (world space vs UV space)\n vec3 color = u_colors[0].color;\n\n vec3 distortedPos = position;\n if (u_flat_shading < 0.5) {\n if (u_flow_enabled > 0.5) {\n if (u_flow_ease > 0.0 || u_flow_distortion_a > 0.0) {\n vec3 ppp = position / 25.0;\n ppp.xyz += 0.1 * cos((1.5 * u_flow_scale) * ppp.yxz + 1.1 * u_time + vec3(0.1, 1.1, 2.1));\n ppp.xyz += 0.1 * cos((2.3 * u_flow_scale) * ppp.zxy + 1.3 * u_time + vec3(3.2, 3.4, 1.2));\n ppp.xyz += 0.1 * cos((2.2 * u_flow_scale) * ppp.yxz + 1.7 * u_time + vec3(1.8, 5.2, 3.1));\n ppp.xyz += u_flow_distortion_a * cos((u_flow_distortion_b * u_flow_scale) * ppp.zxy + 1.4 * u_time + vec3(6.3, 3.9, 4.5));\n\n float r = length(ppp);\n distortedPos = mix(position, vec3(\n position.x * (1.0 - u_flow_ease) + r * u_flow_ease * 25.0,\n position.y,\n position.z * (1.0 - u_flow_ease) + r * u_flow_ease * 25.0\n ), u_flow_ease);\n }\n }\n }\n\n vec3 noise_cord;\n if (u_flat_shading < 0.5) {\n noise_cord = vec3(distortedPos.x / 50.0, (distortedPos.y + colorOffset) / 50.0, distortedPos.z / 50.0);\n } else {\n vec2 adjustedUv = flowUv;\n adjustedUv.y += colorOffset / u_plane_height;\n noise_cord = vec3(adjustedUv, 0.0);\n }\n\n const float minNoise = .0;\n const float maxNoise = .9;\n\n for (int i = 1; i < 6; i++) {\n if (i < u_colors_count) {\n if (u_colors[i].is_active > 0.5) {\n float noiseFlow = (1. + float(i)) / 30.;\n float noiseSpeed = (1. + float(i)) * 0.11;\n float noiseSeed = 13. + float(i) * 7.;\n\n float noise_z = u_time * noiseSpeed;\n if (u_flat_shading < 0.5) {\n noise_z = noise_cord.z * u_color_pressure.x * u_color_pressure.x + u_time * noiseSpeed;\n }\n\n float noise = snoise(\n vec3(\n noise_cord.x * u_color_pressure.x * u_color_pressure.x + u_time * noiseFlow * 2.,\n noise_cord.y * u_color_pressure.y * u_color_pressure.y,\n noise_z\n ) + noiseSeed\n ) - (.1 * float(i)) + (.5 * u_color_blending);\n\n noise = clamp(noise, minNoise, maxNoise + float(i) * 0.02);\n color = mix(color, u_colors[i].color, smoothstep(0.0, u_color_blending, noise));\n }\n }\n }\n\n v_color = color;\n\n // 4. FRESNEL (rim glow)\n // (Calculated in fragment shader using displacement slope approximation)\n\n // 5. VERTEX POSITION\n vec3 newPosition = position + normal * v_displacement_amount * u_wave_amplitude;\n vec4 mvPosition = modelViewMatrix * vec4(newPosition, 1.0);\n vViewPosition = mvPosition.xyz;\n vNormal = normalize((modelViewMatrix * vec4(normal, 0.0)).xyz);\n gl_Position = projectionMatrix * mvPosition;\n v_new_position = gl_Position;\n}\n`;\n\nexport const fragmentShaderSource = `float random(vec2 p) {\n return fract(sin(dot(p, vec2(12.9898,78.233))) * 43758.5453);\n}\n\nfloat fbm(vec3 x) {\n float value = 0.0;\n float amplitude = 0.5;\n float frequency = 1.0;\n for (int i = 0; i < 2; i++) {\n value += amplitude * snoise(x * frequency);\n frequency *= 2.0;\n amplitude *= 0.5;\n }\n return value;\n}\n\n// Branchless HSL to RGB for iridescence\nvec3 hsl2rgb(float h, float s, float l) {\n vec3 rgb = clamp(abs(mod(h * 6.0 + vec3(0.0, 4.0, 2.0), 6.0) - 3.0) - 1.0, 0.0, 1.0);\n return l + s * (rgb - 0.5) * (1.0 - abs(2.0 * l - 1.0));\n}\n\nvoid main() {\n vec2 finalUv = vFlowUv;\n \n vec3 baseColor;\n float texAlpha = 1.0;\n\n if (u_enable_procedural_texture > 0.5) {\n if (u_flat_shading < 0.5) {\n float parallaxFactor = 0.25;\n float scrollOffset = (u_y_offset * u_y_offset_color_multiplier) * parallaxFactor;\n vec3 scrolledPos = vPosition;\n scrolledPos.y -= scrollOffset;\n \n vec3 p = (scrolledPos * 1.5) / 50.0;\n vec2 uvX = p.yz + vec2(0.5);\n vec2 uvY = p.zx + vec2(0.5);\n vec2 uvZ = p.xy + vec2(0.5);\n \n vec4 colX = texture2D(u_procedural_texture, uvX);\n vec4 colY = texture2D(u_procedural_texture, uvY);\n vec4 colZ = texture2D(u_procedural_texture, uvZ);\n \n vec3 n = normalize(vNormal);\n vec3 blendWeights = abs(n);\n blendWeights = blendWeights / (blendWeights.x + blendWeights.y + blendWeights.z + 0.0001);\n \n vec4 texSample = colX * blendWeights.x + colY * blendWeights.y + colZ * blendWeights.z;\n baseColor = texSample.rgb;\n if (u_transparent_texture_void > 0.5) {\n texAlpha = texSample.a;\n }\n } else {\n vec2 ppp = -1.0 + 2.0 * finalUv;\n ppp += 0.1 * cos((1.5 * u_flow_scale) * ppp.yx + 1.1 * u_time + vec2(0.1, 1.1));\n ppp += 0.1 * cos((2.3 * u_flow_scale) * ppp.yx + 1.3 * u_time + vec2(3.2, 3.4));\n ppp += 0.1 * cos((2.2 * u_flow_scale) * ppp.yx + 1.7 * u_time + vec2(1.8, 5.2));\n ppp += u_flow_distortion_a * cos((u_flow_distortion_b * u_flow_scale) * ppp.yx + 1.4 * u_time + vec2(6.3, 3.9));\n float r = length(ppp);\n \n float vx = (finalUv.x * u_texture_ease) + (r * (1.0 - u_texture_ease));\n float vy = (finalUv.y * u_texture_ease) + (0.0 * (1.0 - u_texture_ease));\n vec2 texUv = vec2(vx, vy);\n\n float parallaxFactor = 0.25;\n texUv.y -= (u_y_offset * u_y_offset_color_multiplier / u_plane_height) * parallaxFactor;\n texUv *= 1.5;\n\n vec4 texSample = texture2D(u_procedural_texture, texUv);\n baseColor = texSample.rgb;\n if (u_transparent_texture_void > 0.5) {\n texAlpha = texSample.a;\n }\n }\n } else {\n baseColor = v_color;\n }\n\n vec3 color = baseColor;\n\n // === DOMAIN WARPING (simplified: 3 fbm calls instead of 5) ===\n if (u_domain_warp_enabled > 0.5) {\n vec3 p;\n if (u_flat_shading < 0.5) {\n p = vec3((vPosition / 50.0 + vec3(0.5)) * u_domain_warp_scale);\n p.z += u_time * 0.15;\n } else {\n p = vec3(finalUv * u_domain_warp_scale, u_time * 0.15);\n }\n vec2 q = vec2(fbm(p), fbm(p + vec3(5.2, 1.3, 0.0)));\n float f = fbm(p + vec3(4.0 * q, 0.0));\n vec3 warpColor = color * (1.0 + f * 0.8 * u_domain_warp_intensity);\n float pattern = clamp(f * f * f + 0.6 * f * f + 0.5 * f, 0.0, 1.0);\n color = mix(color, warpColor * (0.6 + pattern * 0.8), u_domain_warp_intensity * 0.7);\n }\n\n // Post-processing\n // Compute dynamic pixel-perfect normal using smooth normal\n vec3 normal = normalize(vNormal);\n vec3 viewDir = vec3(0.0, 0.0, 1.0);\n float ndotv = dot(normal, viewDir);\n \n // Cull back-faces for closed 3D shapes (Sphere=1, Torus=2, Cylinder=3)\n if (u_shape_type > 0.5 && u_shape_type < 3.5) {\n if (ndotv < 0.0) {\n discard;\n }\n } else {\n // Double-sided shapes (Plane, Ribbon): flip normal if back-facing\n if (ndotv < 0.0) {\n normal = -normal;\n ndotv = -ndotv;\n }\n }\n vec3 lightDir = normalize(vec3(1.0, 1.0, 1.0));\n float diffuse = max(dot(normal, lightDir), 0.0);\n vec3 halfDir = normalize(lightDir + viewDir);\n float specular = pow(max(dot(normal, halfDir), 0.0), 32.0);\n\n // Blend smooth 3D shading with smooth height-based wave shading\n if (u_flat_shading > 0.5) {\n // Flat / height-based wave shading (plane style)\n color += v_displacement_amount * u_highlights;\n float heightShadow = 1.0 - v_displacement_amount;\n color -= heightShadow * heightShadow * u_shadows;\n } else {\n // 3D shading\n color += specular * u_highlights;\n color += v_displacement_amount * u_highlights * 0.5;\n float heightShadow = 1.0 - v_displacement_amount;\n color -= heightShadow * heightShadow * u_shadows * 0.5;\n color -= (1.0 - diffuse) * u_shadows * 0.5;\n }\n color = saturation(color, 1.0 + u_saturation);\n color = color * u_brightness;\n\n // === IRIDESCENCE ===\n if (u_iridescence_enabled > 0.5) {\n float hue = fract(v_displacement_amount * 0.5 + 0.5 + u_time * u_iridescence_speed * 0.05);\n vec3 iriColor = hsl2rgb(hue, 0.8, 0.6);\n color = mix(color, iriColor, u_iridescence_intensity * abs(v_displacement_amount) * 0.6);\n }\n\n // === FRESNEL (Rim glow) ===\n if (u_fresnel_enabled > 0.5) {\n float slope = 1.0 - abs(v_displacement_amount);\n float fresnel = pow(max(slope, 0.0), u_fresnel_power);\n color += u_fresnel_color * fresnel * u_fresnel_intensity;\n }\n\n // === VIGNETTE ===\n if (u_vignette_intensity > 0.0) {\n vec2 vigUv = vUv;\n if (u_flat_shading < 0.5) {\n vigUv = (v_new_position.xy / v_new_position.w) * 0.5 + vec2(0.5);\n }\n float dist = length(vigUv - vec2(0.5));\n float vig = smoothstep(u_vignette_radius, u_vignette_radius * 0.3, dist);\n color *= mix(1.0, vig, u_vignette_intensity);\n }\n\n // === FAKE BLOOM ===\n if (u_bloom_intensity > 0.0) {\n float luma = dot(color, vec3(0.2126, 0.7152, 0.0722));\n float bloomMask = smoothstep(u_bloom_threshold, 1.0, luma);\n color += color * bloomMask * u_bloom_intensity;\n }\n\n // === CHROMATIC ABERRATION ===\n if (u_chromatic_aberration > 0.0) {\n float caAmount = u_chromatic_aberration * 0.008;\n vec2 caUv = vUv;\n if (u_flat_shading < 0.5) {\n caUv = (v_new_position.xy / v_new_position.w) * 0.5 + vec2(0.5);\n }\n float dist = length(caUv - vec2(0.5));\n float rShift = v_displacement_amount + caAmount * dist;\n float bShift = v_displacement_amount - caAmount * dist;\n color.r *= 1.0 + rShift * caAmount * 10.0;\n color.b *= 1.0 - bShift * caAmount * 10.0;\n }\n\n // Grain (use cheap hash noise instead of expensive fbm when static)\n float grain = 0.0;\n if (u_grain_intensity > 0.0) {\n vec2 noiseCoords = gl_FragCoord.xy / u_grain_scale;\n if (u_grain_speed != 0.0 || u_flat_shading > 0.5) {\n grain = fbm(vec3(noiseCoords, u_time * u_grain_speed));\n } else {\n // Static grain: use cheap hash instead of fbm\n grain = random(noiseCoords) - 0.5;\n }\n\n grain = grain * 0.5 + 0.5;\n grain -= 0.5;\n grain = (grain > u_grain_sparsity) ? grain : 0.0;\n grain *= u_grain_intensity;\n }\n\n color += vec3(grain);\n\n float edgeAlpha = 1.0;\n \n // Silhouette falloff for 3D shapes (skip when flat shading or fade is zero)\n if (u_silhouette_fade > 0.0 && u_flat_shading < 0.5) {\n edgeAlpha = smoothstep(0.0, u_silhouette_fade, ndotv);\n }\n \n // UV boundary falloff for open shapes\n if (u_shape_type == 3.0) { // Cylinder: fade top/bottom ends\n float vFade = smoothstep(0.0, u_cylinder_fade, vUv.y) * smoothstep(1.0, 1.0 - u_cylinder_fade, vUv.y);\n edgeAlpha *= vFade;\n } else if (u_shape_type == 4.0) { // Ribbon: fade all 4 borders\n float uFade = smoothstep(0.0, u_ribbon_fade, vUv.x) * smoothstep(1.0, 1.0 - u_ribbon_fade, vUv.x);\n float vFade = smoothstep(0.0, u_ribbon_fade, vUv.y) * smoothstep(1.0, 1.0 - u_ribbon_fade, vUv.y);\n edgeAlpha *= uFade * vFade;\n }\n\n edgeAlpha *= texAlpha;\n gl_FragColor = vec4(color, edgeAlpha);\n}\n`;\n\nexport function buildVertUniforms(): string {\n return `precision highp float;\n\nattribute vec3 position;\nattribute vec3 normal;\nattribute vec2 uv;\n\nuniform mat4 modelViewMatrix;\nuniform mat4 projectionMatrix;\n\nvarying vec2 vUv;\nvarying vec2 vFlowUv;\nvarying vec4 v_new_position;\nvarying vec3 v_color;\nvarying float v_displacement_amount;\nvarying vec3 vViewPosition;\nvarying vec3 vNormal;\nvarying vec3 vPosition;\n\nuniform float u_time;\nuniform vec2 u_resolution;\nuniform vec2 u_color_pressure;\nuniform float u_wave_frequency_x;\nuniform float u_wave_frequency_y;\nuniform float u_wave_amplitude;\nuniform float u_plane_width;\nuniform float u_plane_height;\nuniform float u_color_blending;\n\nuniform int u_colors_count;\nstruct ColorStop {\n float is_active;\n vec3 color;\n float influence;\n};\nuniform ColorStop u_colors[6];\n\nuniform float u_y_offset;\nuniform float u_y_offset_wave_multiplier;\nuniform float u_y_offset_color_multiplier;\nuniform float u_y_offset_flow_multiplier;\n\n// Flow field uniforms\nuniform float u_flow_distortion_a;\nuniform float u_flow_distortion_b;\nuniform float u_flow_scale;\nuniform float u_flow_ease;\nuniform float u_flow_enabled;\n\n// Fresnel uniforms\nuniform float u_fresnel_enabled;\nuniform float u_fresnel_power;\nuniform float u_fresnel_intensity;\nuniform vec3 u_fresnel_color;\n\nuniform float u_shape_type;\nuniform float u_flat_shading;\n`;\n}\n\nexport function buildFragUniforms(): string {\n return `precision highp float;\n\nvarying vec2 vUv;\nvarying vec2 vFlowUv;\nvarying vec4 v_new_position;\nvarying vec3 v_color;\nvarying float v_displacement_amount;\nvarying vec3 vViewPosition;\nvarying vec3 vNormal;\nvarying vec3 vPosition;\n\nuniform float u_time;\nuniform vec2 u_resolution;\nuniform float u_plane_height;\n\nuniform float u_shadows;\nuniform float u_highlights;\nuniform float u_saturation;\nuniform float u_brightness;\nuniform float u_grain_intensity; \nuniform float u_grain_sparsity; \nuniform float u_grain_scale; \nuniform float u_grain_speed; \n\nuniform float u_y_offset;\nuniform float u_y_offset_color_multiplier;\n\n// Flow field uniforms\nuniform float u_flow_distortion_a;\nuniform float u_flow_distortion_b;\nuniform float u_flow_scale;\n\n// Procedural texture uniforms\nuniform sampler2D u_procedural_texture;\nuniform float u_enable_procedural_texture;\nuniform float u_texture_ease;\n\n// Domain warping uniforms\nuniform float u_domain_warp_enabled;\nuniform float u_domain_warp_intensity;\nuniform float u_domain_warp_scale;\n\n// Vignette uniforms\nuniform float u_vignette_intensity;\nuniform float u_vignette_radius;\n\n// Fresnel uniforms (fragment side)\nuniform float u_fresnel_enabled;\nuniform float u_fresnel_power;\nuniform float u_fresnel_intensity;\nuniform vec3 u_fresnel_color;\n\n\n\n// Iridescence uniforms\nuniform float u_iridescence_enabled;\nuniform float u_iridescence_intensity;\nuniform float u_iridescence_speed;\n\n// Bloom uniforms\nuniform float u_bloom_intensity;\nuniform float u_bloom_threshold;\n\n// Chromatic aberration\nuniform float u_chromatic_aberration;\nuniform float u_shape_type;\nuniform float u_transparent_texture_void;\nuniform float u_silhouette_fade;\nuniform float u_cylinder_fade;\nuniform float u_ribbon_fade;\nuniform float u_flat_shading;\n`;\n}\n\nexport function buildNoise(): string {\n return `\n// 1. REPLACEMENT PERMUTE: \n// Uses a hash function (fract/sin) instead of a modular lookup table.\nvec4 permute(vec4 x) {\n return floor(fract(sin(x) * 43758.5453123) * 289.0);\n}\n\n// Taylor Inverse Sqrt\nvec4 taylorInvSqrt(vec4 r) {\n return 1.79284291400159 - 0.85373472095314 * r;\n}\n\n// Fade function\nvec3 fade(vec3 t) {\n return t*t*t*(t*(t*6.0-15.0)+10.0);\n}\n\n// 3D Simplex Noise\nfloat snoise(vec3 v) {\n const vec2 C = vec2(1.0/6.0, 1.0/3.0) ;\n const vec4 D = vec4(0.0, 0.5, 1.0, 2.0);\n\n // First corner\n vec3 i = floor(v + dot(v, C.yyy) );\n vec3 x0 = v - i + dot(i, C.xxx) ;\n\n // Other corners\n vec3 g = step(x0.yzx, x0.xyz);\n vec3 l = 1.0 - g;\n vec3 i1 = min( g.xyz, l.zxy );\n vec3 i2 = max( g.xyz, l.zxy );\n\n vec3 x1 = x0 - i1 + C.xxx;\n vec3 x2 = x0 - i2 + C.yyy;\n vec3 x3 = x0 - D.yyy;\n\n // Permutations\n vec4 p = permute( permute( permute(\n i.z + vec4(0.0, i1.z, i2.z, 1.0 ))\n + i.y + vec4(0.0, i1.y, i2.y, 1.0 ))\n + i.x + vec4(0.0, i1.x, i2.x, 1.0 ));\n\n // Gradients\n float n_ = 0.142857142857; // 1.0/7.0\n vec3 ns = n_ * D.wyz - D.xzx;\n\n vec4 j = p - 49.0 * floor(p * ns.z * ns.z);\n\n vec4 x_ = floor(j * ns.z);\n vec4 y_ = floor(j - 7.0 * x_ );\n\n vec4 x = x_ *ns.x + ns.yyyy;\n vec4 y = y_ *ns.x + ns.yyyy;\n vec4 h = 1.0 - abs(x) - abs(y);\n\n vec4 b0 = vec4( x.xy, y.xy );\n vec4 b1 = vec4( x.zw, y.zw );\n\n vec4 s0 = floor(b0)*2.0 + 1.0;\n vec4 s1 = floor(b1)*2.0 + 1.0;\n vec4 sh = -step(h, vec4(0.0));\n\n vec4 a0 = b0.xzyw + s0.xzyw*sh.xxyy ;\n vec4 a1 = b1.xzyw + s1.xzyw*sh.zzww ;\n\n vec3 p0 = vec3(a0.xy,h.x);\n vec3 p1 = vec3(a0.zw,h.y);\n vec3 p2 = vec3(a1.xy,h.z);\n vec3 p3 = vec3(a1.zw,h.w);\n\n // Normalise gradients\n vec4 norm = taylorInvSqrt(vec4(dot(p0,p0), dot(p1,p1), dot(p2, p2), dot(p3,p3)));\n p0 *= norm.x;\n p1 *= norm.y;\n p2 *= norm.z;\n p3 *= norm.w;\n\n // Mix final noise value\n vec4 m = max(0.6 - vec4(dot(x0,x0), dot(x1,x1), dot(x2,x2), dot(x3,x3)), 0.0);\n m = m * m;\n return 42.0 * dot( m*m, vec4( dot(p0,x0), dot(p1,x1),\n dot(p2,x2), dot(p3,x3) ) );\n}\n\n// Classic Perlin noise\nfloat cnoise(vec3 P)\n{\n vec3 Pi0 = floor(P); \n vec3 Pi1 = Pi0 + vec3(1.0); \n \n vec3 Pf0 = fract(P); \n vec3 Pf1 = Pf0 - vec3(1.0); \n vec4 ix = vec4(Pi0.x, Pi1.x, Pi0.x, Pi1.x);\n vec4 iy = vec4(Pi0.yy, Pi1.yy);\n vec4 iz0 = Pi0.zzzz;\n vec4 iz1 = Pi1.zzzz;\n\n vec4 ixy = permute(permute(ix) + iy);\n vec4 ixy0 = permute(ixy + iz0);\n vec4 ixy1 = permute(ixy + iz1);\n\n vec4 gx0 = ixy0 * (1.0 / 7.0);\n vec4 gy0 = fract(floor(gx0) * (1.0 / 7.0)) - 0.5;\n gx0 = fract(gx0);\n vec4 gz0 = vec4(0.5) - abs(gx0) - abs(gy0);\n vec4 sz0 = step(gz0, vec4(0.0));\n gx0 -= sz0 * (step(0.0, gx0) - 0.5);\n gy0 -= sz0 * (step(0.0, gy0) - 0.5);\n\n vec4 gx1 = ixy1 * (1.0 / 7.0);\n vec4 gy1 = fract(floor(gx1) * (1.0 / 7.0)) - 0.5;\n gx1 = fract(gx1);\n vec4 gz1 = vec4(0.5) - abs(gx1) - abs(gy1);\n vec4 sz1 = step(gz1, vec4(0.0));\n gx1 -= sz1 * (step(0.0, gx1) - 0.5);\n gy1 -= sz1 * (step(0.0, gy1) - 0.5);\n\n vec3 g000 = vec3(gx0.x,gy0.x,gz0.x);\n vec3 g100 = vec3(gx0.y,gy0.y,gz0.y);\n vec3 g010 = vec3(gx0.z,gy0.z,gz0.z);\n vec3 g110 = vec3(gx0.w,gy0.w,gz0.w);\n vec3 g001 = vec3(gx1.x,gy1.x,gz1.x);\n vec3 g101 = vec3(gx1.y,gy1.y,gz1.y);\n vec3 g011 = vec3(gx1.z,gy1.z,gz1.z);\n vec3 g111 = vec3(gx1.w,gy1.w,gz1.w);\n\n vec4 norm0 = taylorInvSqrt(vec4(dot(g000, g000), dot(g010, g010), dot(g100, g100), dot(g110, g110)));\n g000 *= norm0.x;\n g010 *= norm0.y;\n g100 *= norm0.z;\n g110 *= norm0.w;\n vec4 norm1 = taylorInvSqrt(vec4(dot(g001, g001), dot(g011, g011), dot(g101, g101), dot(g111, g111)));\n g001 *= norm1.x;\n g011 *= norm1.y;\n g101 *= norm1.z;\n g111 *= norm1.w;\n\n float n000 = dot(g000, Pf0);\n float n100 = dot(g100, vec3(Pf1.x, Pf0.yz));\n float n010 = dot(g010, vec3(Pf0.x, Pf1.y, Pf0.z));\n float n110 = dot(g110, vec3(Pf1.xy, Pf0.z));\n float n001 = dot(g001, vec3(Pf0.xy, Pf1.z));\n float n101 = dot(g101, vec3(Pf1.x, Pf0.y, Pf1.z));\n float n011 = dot(g011, vec3(Pf0.x, Pf1.yz));\n float n111 = dot(g111, Pf1);\n\n vec3 fade_xyz = fade(Pf0);\n vec4 n_z = mix(vec4(n000, n100, n010, n110), vec4(n001, n101, n011, n111), fade_xyz.z);\n vec2 n_yz = mix(n_z.xy, n_z.zw, fade_xyz.y);\n float n_xyz = mix(n_yz.x, n_yz.y, fade_xyz.x);\n return 2.2 * n_xyz;\n}\n`;\n}\n\nexport function buildColorFunctions(): string {\n return `\nvec3 saturation(vec3 rgb, float adjustment) {\n const vec3 W = vec3(0.2125, 0.7154, 0.0721);\n vec3 intensity = vec3(dot(rgb, W));\n return mix(intensity, rgb, adjustment);\n}\n`;\n}\n","export class Matrix4 {\n elements: Float32Array;\n constructor() {\n this.elements = new Float32Array([\n 1, 0, 0, 0,\n 0, 1, 0, 0,\n 0, 0, 1, 0,\n 0, 0, 0, 1\n ]);\n }\n identity() {\n const e = this.elements;\n e[0] = 1; e[1] = 0; e[2] = 0; e[3] = 0;\n e[4] = 0; e[5] = 1; e[6] = 0; e[7] = 0;\n e[8] = 0; e[9] = 0; e[10] = 1; e[11] = 0;\n e[12] = 0; e[13] = 0; e[14] = 0; e[15] = 1;\n return this;\n }\n translate(tx: number, ty: number, tz: number) {\n this.elements[12] += this.elements[0] * tx + this.elements[4] * ty + this.elements[8] * tz;\n this.elements[13] += this.elements[1] * tx + this.elements[5] * ty + this.elements[9] * tz;\n this.elements[14] += this.elements[2] * tx + this.elements[6] * ty + this.elements[10] * tz;\n this.elements[15] += this.elements[3] * tx + this.elements[7] * ty + this.elements[11] * tz;\n return this;\n }\n rotateX(angle: number) {\n const c = Math.cos(angle);\n const s = Math.sin(angle);\n const m12 = this.elements[4], m22 = this.elements[5], m32 = this.elements[6], m42 = this.elements[7];\n const m13 = this.elements[8], m23 = this.elements[9], m33 = this.elements[10], m43 = this.elements[11];\n this.elements[4] = c * m12 + s * m13;\n this.elements[5] = c * m22 + s * m23;\n this.elements[6] = c * m32 + s * m33;\n this.elements[7] = c * m42 + s * m43;\n this.elements[8] = c * m13 - s * m12;\n this.elements[9] = c * m23 - s * m22;\n this.elements[10] = c * m33 - s * m32;\n this.elements[11] = c * m43 - s * m42;\n return this;\n }\n rotateY(angle: number) {\n const c = Math.cos(angle);\n const s = Math.sin(angle);\n const m11 = this.elements[0], m21 = this.elements[1], m31 = this.elements[2], m41 = this.elements[3];\n const m13 = this.elements[8], m23 = this.elements[9], m33 = this.elements[10], m43 = this.elements[11];\n this.elements[0] = c * m11 - s * m13;\n this.elements[1] = c * m21 - s * m23;\n this.elements[2] = c * m31 - s * m33;\n this.elements[3] = c * m41 - s * m43;\n this.elements[8] = s * m11 + c * m13;\n this.elements[9] = s * m21 + c * m23;\n this.elements[10] = s * m31 + c * m33;\n this.elements[11] = s * m41 + c * m43;\n return this;\n }\n rotateZ(angle: number) {\n const c = Math.cos(angle);\n const s = Math.sin(angle);\n const m11 = this.elements[0], m21 = this.elements[1], m31 = this.elements[2], m41 = this.elements[3];\n const m12 = this.elements[4], m22 = this.elements[5], m32 = this.elements[6], m42 = this.elements[7];\n this.elements[0] = c * m11 + s * m12;\n this.elements[1] = c * m21 + s * m22;\n this.elements[2] = c * m31 + s * m32;\n this.elements[3] = c * m41 + s * m42;\n this.elements[4] = -s * m11 + c * m12;\n this.elements[5] = -s * m21 + c * m22;\n this.elements[6] = -s * m31 + c * m32;\n this.elements[7] = -s * m41 + c * m42;\n return this;\n }\n}\n\nexport class OrthographicCamera {\n left: number;\n right: number;\n top: number;\n bottom: number;\n near: number;\n far: number;\n position: [number, number, number];\n projectionMatrix: Matrix4;\n zoom: number;\n\n constructor(left: number, right: number, top: number, bottom: number, near: number, far: number) {\n this.left = left;\n this.right = right;\n this.top = top;\n this.bottom = bottom;\n this.near = near;\n this.far = far;\n this.position = [0, 0, 0];\n this.zoom = 1.0;\n this.projectionMatrix = new Matrix4();\n this.updateProjectionMatrix();\n }\n\n updateProjectionMatrix() {\n const w = 1.0 / (this.right - this.left);\n const h = 1.0 / (this.top - this.bottom);\n const p = 1.0 / (this.far - this.near);\n const x = (this.right + this.left) * w;\n const y = (this.top + this.bottom) * h;\n const z = (this.far + this.near) * p;\n this.projectionMatrix.elements = new Float32Array([\n 2 * w, 0, 0, 0,\n 0, 2 * h, 0, 0,\n 0, 0, -2 * p, 0,\n -x, -y, -z, 1\n ]);\n }\n}\n\nexport function updateCamera(camera: OrthographicCamera, width: number, height: number, planeWidth: number = 50, planeHeight: number = 50, shapeType: string = \"plane\", zoom: number = 1.0) {\n camera.zoom = zoom;\n const ratio = width / height;\n\n if (shapeType === \"plane\") {\n const viewPortAreaRatio = 1000000;\n const areaViewPort = width * height;\n const targetPlaneArea = areaViewPort / viewPortAreaRatio * planeWidth * planeHeight / 1.5;\n\n const targetWidth = Math.sqrt(targetPlaneArea * ratio);\n const targetHeight = targetPlaneArea / targetWidth;\n\n let left = -planeWidth / 2;\n let right = Math.min((left + targetWidth) / 1.5, planeWidth / 2);\n let top = planeHeight / 4;\n let bottom = Math.max((top - targetHeight) / 2, -planeHeight / 4);\n\n if (ratio < 1) {\n const horizontalScale = ratio;\n left = left * horizontalScale;\n right = right * horizontalScale;\n const mobileZoomFactor = 1.05;\n left = left * mobileZoomFactor;\n right = right * mobileZoomFactor;\n top = top * mobileZoomFactor;\n bottom = bottom * mobileZoomFactor;\n }\n\n camera.left = left;\n camera.right = right;\n camera.top = top;\n camera.bottom = bottom;\n } else {\n // Localized 3D shapes: Sphere, Torus, Cylinder, Ribbon.\n // Use a symmetrical, non-stretching camera frustum.\n let halfSize = 25.0; // Default for Ribbon / others\n if (shapeType === \"sphere\") {\n halfSize = 30.0;\n } else if (shapeType === \"torus\") {\n halfSize = 35.0;\n } else if (shapeType === \"cylinder\") {\n halfSize = 30.0;\n }\n\n if (ratio >= 1.0) {\n camera.left = -halfSize * ratio;\n camera.right = halfSize * ratio;\n camera.top = halfSize;\n camera.bottom = -halfSize;\n } else {\n camera.left = -halfSize;\n camera.right = halfSize;\n camera.top = halfSize / ratio;\n camera.bottom = -halfSize / ratio;\n\n // Zoom out slightly on mobile (1.05 = 5% zoom out)\n const mobileZoomFactor = 1.05;\n camera.left *= mobileZoomFactor;\n camera.right *= mobileZoomFactor;\n camera.top *= mobileZoomFactor;\n camera.bottom *= mobileZoomFactor;\n }\n }\n\n // Apply camera zoom to the boundary coordinates\n camera.left /= zoom;\n camera.right /= zoom;\n camera.top /= zoom;\n camera.bottom /= zoom;\n\n camera.near = -100;\n camera.far = 1000;\n camera.updateProjectionMatrix();\n}\n\nexport function generatePlaneGeometry(width: number, height: number, widthSegments: number, heightSegments: number) {\n const width_half = width / 2;\n const height_half = height / 2;\n const gridX = Math.floor(widthSegments);\n const gridY = Math.floor(heightSegments);\n const gridX1 = gridX + 1;\n const gridY1 = gridY + 1;\n const segment_width = width / gridX;\n const segment_height = height / gridY;\n\n const indices = [];\n const vertices = [];\n const normals = [];\n const uvs = [];\n\n for (let iy = 0; iy < gridY1; iy++) {\n const y = iy * segment_height - height_half;\n for (let ix = 0; ix < gridX1; ix++) {\n const x = ix * segment_width - width_half;\n vertices.push(x, -y, 0);\n normals.push(0, 0, 1);\n uvs.push(ix / gridX);\n uvs.push(1 - (iy / gridY));\n }\n }\n\n for (let iy = 0; iy < gridY; iy++) {\n for (let ix = 0; ix < gridX; ix++) {\n const a = ix + gridX1 * iy;\n const b = ix + gridX1 * (iy + 1);\n const c = (ix + 1) + gridX1 * (iy + 1);\n const d = (ix + 1) + gridX1 * iy;\n indices.push(a, b, d);\n indices.push(b, c, d);\n }\n }\n\n const isLarge = vertices.length / 3 > 65535;\n\n // Generate wireframe indices: for each triangle (a,b,c), emit lines a→b, b→c, c→a\n const wireframeIndices = [];\n for (let i = 0; i < indices.length; i += 3) {\n const a = indices[i];\n const b = indices[i + 1];\n const c = indices[i + 2];\n wireframeIndices.push(a, b, b, c, c, a);\n }\n\n return {\n position: new Float32Array(vertices),\n normal: new Float32Array(normals),\n uv: new Float32Array(uvs),\n index: isLarge ? new Uint32Array(indices) : new Uint16Array(indices),\n wireframeIndex: isLarge ? new Uint32Array(wireframeIndices) : new Uint16Array(wireframeIndices)\n };\n}\n\nexport function generateSphereGeometry(radius: number, widthSegments: number, heightSegments: number) {\n const vertices = [];\n const normals = [];\n const uvs = [];\n const indices = [];\n\n const widthSegmentsFloor = Math.floor(widthSegments);\n const heightSegmentsFloor = Math.floor(heightSegments);\n\n for (let iy = 0; iy <= heightSegmentsFloor; iy++) {\n const v = iy / heightSegmentsFloor;\n const theta = v * Math.PI;\n\n for (let ix = 0; ix <= widthSegmentsFloor; ix++) {\n const u = ix / widthSegmentsFloor;\n const phi = u * Math.PI * 2;\n\n const x = -radius * Math.sin(theta) * Math.cos(phi);\n const y = radius * Math.cos(theta);\n const z = radius * Math.sin(theta) * Math.sin(phi);\n\n vertices.push(x, y, z);\n \n const len = Math.sqrt(x*x + y*y + z*z);\n normals.push(x/len, y/len, z/len);\n \n uvs.push(u, 1 - v);\n }\n }\n\n for (let iy = 0; iy < heightSegmentsFloor; iy++) {\n for (let ix = 0; ix < widthSegmentsFloor; ix++) {\n const a = ix + (widthSegmentsFloor + 1) * iy;\n const b = ix + (widthSegmentsFloor + 1) * (iy + 1);\n const c = (ix + 1) + (widthSegmentsFloor + 1) * (iy + 1);\n const d = (ix + 1) + (widthSegmentsFloor + 1) * iy;\n\n indices.push(a, b, d);\n indices.push(b, c, d);\n }\n }\n\n const isLarge = vertices.length / 3 > 65535;\n const wireframeIndices = [];\n for (let i = 0; i < indices.length; i += 3) {\n const a = indices[i];\n const b = indices[i + 1];\n const c = indices[i + 2];\n wireframeIndices.push(a, b, b, c, c, a);\n }\n\n return {\n position: new Float32Array(vertices),\n normal: new Float32Array(normals),\n uv: new Float32Array(uvs),\n index: isLarge ? new Uint32Array(indices) : new Uint16Array(indices),\n wireframeIndex: isLarge ? new Uint32Array(wireframeIndices) : new Uint16Array(wireframeIndices)\n };\n}\n\nexport function generateTorusGeometry(radius: number, tube: number, radialSegments: number, tubularSegments: number) {\n const vertices = [];\n const normals = [];\n const uvs = [];\n const indices = [];\n\n const radialSegmentsFloor = Math.floor(radialSegments);\n const tubularSegmentsFloor = Math.floor(tubularSegments);\n\n for (let j = 0; j <= radialSegmentsFloor; j++) {\n const v = j / radialSegmentsFloor * Math.PI * 2;\n\n for (let i = 0; i <= tubularSegmentsFloor; i++) {\n const u = i / tubularSegmentsFloor * Math.PI * 2;\n\n const x = (radius + tube * Math.cos(v)) * Math.cos(u);\n const y = (radius + tube * Math.cos(v)) * Math.sin(u);\n const z = tube * Math.sin(v);\n\n vertices.push(x, y, z);\n\n const cx = radius * Math.cos(u);\n const cy = radius * Math.sin(u);\n const nx = x - cx;\n const ny = y - cy;\n const nz = z;\n const len = Math.sqrt(nx * nx + ny * ny + nz * nz);\n normals.push(nx / len, ny / len, nz / len);\n\n uvs.push(i / tubularSegmentsFloor, j / radialSegmentsFloor);\n }\n }\n\n for (let j = 1; j <= radialSegmentsFloor; j++) {\n for (let i = 1; i <= tubularSegmentsFloor; i++) {\n const a = (tubularSegmentsFloor + 1) * j + i - 1;\n const b = (tubularSegmentsFloor + 1) * (j - 1) + i - 1;\n const c = (tubularSegmentsFloor + 1) * (j - 1) + i;\n const d = (tubularSegmentsFloor + 1) * j + i;\n\n indices.push(a, b, d);\n indices.push(b, c, d);\n }\n }\n\n const isLarge = vertices.length / 3 > 65535;\n const wireframeIndices = [];\n for (let i = 0; i < indices.length; i += 3) {\n const a = indices[i];\n const b = indices[i + 1];\n const c = indices[i + 2];\n wireframeIndices.push(a, b, b, c, c, a);\n }\n\n return {\n position: new Float32Array(vertices),\n normal: new Float32Array(normals),\n uv: new Float32Array(uvs),\n index: isLarge ? new Uint32Array(indices) : new Uint16Array(indices),\n wireframeIndex: isLarge ? new Uint32Array(wireframeIndices) : new Uint16Array(wireframeIndices)\n };\n}\n\nexport function generateCylinderGeometry(radiusTop: number, radiusBottom: number, height: number, radialSegments: number, heightSegments: number) {\n const vertices = [];\n const normals = [];\n const uvs = [];\n const indices = [];\n\n const radialSegmentsFloor = Math.floor(radialSegments);\n const heightSegmentsFloor = Math.floor(heightSegments);\n\n const halfHeight = height / 2;\n\n for (let y = 0; y <= heightSegmentsFloor; y++) {\n const v = y / heightSegmentsFloor;\n const h = v * height - halfHeight;\n const radius = v * (radiusBottom - radiusTop) + radiusTop;\n\n for (let x = 0; x <= radialSegmentsFloor; x++) {\n const u = x / radialSegmentsFloor;\n const theta = u * Math.PI * 2;\n\n const sinTheta = Math.sin(theta);\n const cosTheta = Math.cos(theta);\n\n vertices.push(radius * sinTheta, -h, radius * cosTheta);\n normals.push(sinTheta, 0, cosTheta);\n uvs.push(u, 1 - v);\n }\n }\n\n for (let y = 0; y < heightSegmentsFloor; y++) {\n for (let x = 0; x < radialSegmentsFloor; x++) {\n const a = x + (radialSegmentsFloor + 1) * y;\n const b = x + (radialSegmentsFloor + 1) * (y + 1);\n const c = (x + 1) + (radialSegmentsFloor + 1) * (y + 1);\n const d = (x + 1) + (radialSegmentsFloor + 1) * y;\n\n indices.push(a, b, d);\n indices.push(b, c, d);\n }\n }\n\n const isLarge = vertices.length / 3 > 65535;\n const wireframeIndices = [];\n for (let i = 0; i < indices.length; i += 3) {\n const a = indices[i];\n const b = indices[i + 1];\n const c = indices[i + 2];\n wireframeIndices.push(a, b, b, c, c, a);\n }\n\n return {\n position: new Float32Array(vertices),\n normal: new Float32Array(normals),\n uv: new Float32Array(uvs),\n index: isLarge ? new Uint32Array(indices) : new Uint16Array(indices),\n wireframeIndex: isLarge ? new Uint32Array(wireframeIndices) : new Uint16Array(wireframeIndices)\n };\n}\n\nexport function generateRibbonGeometry(width: number, height: number, widthSegments: number, heightSegments: number, bend: number, twist: number) {\n const width_half = width / 2;\n const height_half = height / 2;\n const gridX = Math.floor(widthSegments);\n const gridY = Math.floor(heightSegments);\n const gridX1 = gridX + 1;\n const gridY1 = gridY + 1;\n const segment_width = width / gridX;\n const segment_height = height / gridY;\n\n const vertices = [];\n const normals = [];\n const uvs = [];\n const indices = [];\n\n for (let iy = 0; iy < gridY1; iy++) {\n const y = iy * segment_height - height_half;\n for (let ix = 0; ix < gridX1; ix++) {\n const x = ix * segment_width - width_half;\n\n let xp = x;\n let yp = y;\n let zp = 0;\n\n let nx = 0;\n let ny = 0;\n let nz = 1;\n\n if (Math.abs(bend) > 0.001) {\n const r = width / bend;\n const angle = x / r;\n xp = r * Math.sin(angle);\n zp = r * (1 - Math.cos(angle));\n\n nx = Math.sin(angle);\n nz = Math.cos(angle);\n }\n\n if (Math.abs(twist) > 0.001) {\n const angle = (y / height) * twist;\n const cosA = Math.cos(angle);\n const sinA = Math.sin(angle);\n \n const rx = xp * cosA - zp * sinA;\n const rz = xp * sinA + zp * cosA;\n xp = rx;\n zp = rz;\n\n const rnx = nx * cosA - nz * sinA;\n const rnz = nx * sinA + nz * cosA;\n nx = rnx;\n nz = rnz;\n }\n\n vertices.push(xp, -yp, zp);\n normals.push(nx, ny, nz);\n uvs.push(ix / gridX);\n uvs.push(1 - (iy / gridY));\n }\n }\n\n for (let iy = 0; iy < gridY; iy++) {\n for (let ix = 0; ix < gridX; ix++) {\n const a = ix + gridX1 * iy;\n const b = ix + gridX1 * (iy + 1);\n const c = (ix + 1) + gridX1 * (iy + 1);\n const d = (ix + 1) + gridX1 * iy;\n indices.push(a, b, d);\n indices.push(b, c, d);\n }\n }\n\n const isLarge = vertices.length / 3 > 65535;\n const wireframeIndices = [];\n for (let i = 0; i < indices.length; i += 3) {\n const a = indices[i];\n const b = indices[i + 1];\n const c = indices[i + 2];\n wireframeIndices.push(a, b, b, c, c, a);\n }\n\n return {\n position: new Float32Array(vertices),\n normal: new Float32Array(normals),\n uv: new Float32Array(uvs),\n index: isLarge ? new Uint32Array(indices) : new Uint16Array(indices),\n wireframeIndex: isLarge ? new Uint32Array(wireframeIndices) : new Uint16Array(wireframeIndices)\n };\n}\n","import { buildColorFunctions, buildNoise, buildVertUniforms, buildFragUniforms, fragmentShaderSource, vertexShaderSource } from \"./shaders\";\nimport { generatePlaneGeometry, generateSphereGeometry, generateTorusGeometry, generateCylinderGeometry, generateRibbonGeometry, OrthographicCamera, updateCamera, Matrix4 } from \"./math\";\n\nconsole.info(\n \"%c🌈 Neat Gradients%c\\n\\nLicensed under MIT + The Commons Clause.\\nFree for personal and commercial use.\\nSelling this software or its derivatives is strictly prohibited.\\nhttps://neat.firecms.co\",\n \"font-weight: bold; font-size: 14px; color: #FF5772;\", \"color: inherit;\"\n);\n\nconst PLANE_WIDTH = 50;\nconst PLANE_HEIGHT = 80;\n\n\nconst COLORS_COUNT = 6;\n\nconst LINK_ID = generateRandomString();\n\nexport interface WebGLState {\n gl: WebGLRenderingContext | WebGL2RenderingContext;\n program: WebGLProgram;\n buffers: {\n position: WebGLBuffer;\n normal: WebGLBuffer;\n uv: WebGLBuffer;\n index: WebGLBuffer;\n wireframeIndex: WebGLBuffer;\n };\n locations: {\n attributes: Record<string, number>;\n uniforms: Record<string, WebGLUniformLocation | null>;\n };\n camera: OrthographicCamera;\n indexCount: number;\n wireframeIndexCount: number;\n indexType: number;\n}\n\n\nimport { NeatConfig, NeatColor, NeatController } from \"./types\";\n\nexport class NeatGradient implements NeatController {\n\n private _ref: HTMLCanvasElement;\n\n private _speed: number = -1;\n\n private _horizontalPressure: number = -1;\n private _verticalPressure: number = -1;\n\n private _waveFrequencyX: number = -1;\n private _waveFrequencyY: number = -1;\n private _waveAmplitude: number = -1;\n\n private _shadows: number = -1;\n private _highlights: number = -1;\n private _saturation: number = -1;\n private _brightness: number = -1;\n\n private _grainScale: number = -1;\n private _grainIntensity: number = -1;\n private _grainSparsity: number = -1;\n private _grainSpeed: number = -1;\n\n private _colorBlending: number = -1;\n private _resolution: number = 1;\n\n private _colors: NeatColor[] = [];\n private _wireframe: boolean = false;\n\n private _backgroundColor: string = \"#FFFFFF\";\n private _backgroundColorRgb: [number, number, number] = [1, 1, 1];\n private _backgroundAlpha: number = 1.0;\n\n // Flow field properties\n private _flowDistortionA: number = 0;\n private _flowDistortionB: number = 0;\n private _flowScale: number = 1.0;\n private _flowEase: number = 0.0;\n private _flowEnabled: boolean = true;\n\n private glState!: WebGLState;\n\n // Texture generation properties\n private _enableProceduralTexture: boolean = false;\n private _textureVoidLikelihood: number = 0.45;\n private _textureVoidWidthMin: number = 200;\n private _textureVoidWidthMax: number = 486;\n private _textureBandDensity: number = 2.15;\n private _textureColorBlending: number = 0.01;\n private _textureSeed: number = 333;\n private _textureEase: number = 0.5;\n private _transparentTextureVoid: boolean = false;\n\n // New effects\n private _domainWarpEnabled: boolean = false;\n private _domainWarpIntensity: number = 0.5;\n private _domainWarpScale: number = 1.0;\n\n private _vignetteIntensity: number = 0.5;\n private _vignetteRadius: number = 0.8;\n\n private _fresnelEnabled: boolean = false;\n private _fresnelPower: number = 2.0;\n private _fresnelIntensity: number = 0.5;\n private _fresnelColor: string = \"#FFFFFF\";\n private _fresnelColorRgb: [number, number, number] = [1, 1, 1];\n\n private _iridescenceEnabled: boolean = false;\n private _iridescenceIntensity: number = 0.5;\n private _iridescenceSpeed: number = 1.0;\n\n private _bloomIntensity: number = 0;\n private _bloomThreshold: number = 0.7;\n private _chromaticAberration: number = 0;\n private _silhouetteFade: number = 0.25;\n private _cylinderFade: number = 0.08;\n private _ribbonFade: number = 0.05;\n private _flatShading: boolean = true;\n\n // 3D Shapes config\n private _shapeType: 'plane' | 'sphere' | 'torus' | 'cylinder' | 'ribbon' = 'plane';\n private _shapeRotationX: number = 0;\n private _shapeRotationY: number = 0;\n private _shapeRotationZ: number = 0;\n private _shapeAutoRotateSpeedX: number = 0;\n private _shapeAutoRotateSpeedY: number = 0;\n private _sphereRadius: number = 15;\n private _torusRadius: number = 15;\n private _torusTube: number = 5;\n private _cylinderRadius: number = 10;\n private _cylinderHeight: number = 40;\n private _planeBend: number = 0;\n private _planeTwist: number = 0;\n\n // Camera settings\n private _cameraLock: boolean = false;\n private _cameraX: number = 0;\n private _cameraY: number = 0;\n private _cameraZ: number = 0;\n private _cameraRotationX: number = 0;\n private _cameraRotationY: number = 0;\n private _cameraRotationZ: number = 0;\n private _cameraZoom: number = 1.0;\n\n private _proceduralTexture: WebGLTexture | null = null;\n private _proceduralBackgroundColor: string = \"#000000\";\n\n private _textureShapeTriangles: number = 20;\n private _textureShapeCircles: number = 15;\n private _textureShapeBars: number = 15;\n private _textureShapeSquiggles: number = 10;\n\n private requestRef: number = -1;\n private sizeObserver: ResizeObserver;\n\n private _initialized: boolean = false;\n private _linkElement: HTMLAnchorElement | null = null;\n private _cachedColorRgb: [number, number, number][] = [];\n\n private _yOffset: number = 0;\n private _yOffsetWaveMultiplier: number = 0.004;\n private _yOffsetColorMultiplier: number = 0.004;\n private _yOffsetFlowMultiplier: number = 0.004;\n\n // Cached offscreen canvases for procedural texture generation\n private _sourceCanvas: HTMLCanvasElement | null = null;\n private _sourceCtx: CanvasRenderingContext2D | null = null;\n private _maskedCanvas: HTMLCanvasElement | null = null;\n private _maskedCtx: CanvasRenderingContext2D | null = null;\n\n // Performance optimizations\n private _resizeTimeoutId: number | null = null;\n private _textureNeedsUpdate: boolean = false;\n private _linkCheckCounter: number = 0;\n private _colorsChanged: boolean = true;\n private _uniformsDirty: boolean = true;\n private _textureDirty: boolean = true;\n private _yOffsetDirty: boolean = false;\n private _modelViewMatrix: Matrix4 = new Matrix4();\n private _isVisible: boolean = true;\n private _visibilityObserver: IntersectionObserver | null = null;\n private _visibilityHandler: (() => void) | null = null;\n\n constructor(config: NeatConfig & { ref: HTMLCanvasElement, resolution?: number, seed?: number }) {\n\n const {\n ref,\n speed = 4,\n horizontalPressure = 3,\n verticalPressure = 3,\n waveFrequencyX = 5,\n waveFrequencyY = 5,\n waveAmplitude = 3,\n colors,\n highlights = 4,\n shadows = 4,\n colorSaturation = 0,\n colorBrightness = 1,\n colorBlending = 5,\n grainScale = 2,\n grainIntensity = 0.55,\n grainSparsity = 0.0,\n grainSpeed = 0.1,\n wireframe = false,\n backgroundColor = \"#FFFFFF\",\n backgroundAlpha = 1.0,\n resolution = 1,\n seed,\n yOffset = 0,\n yOffsetWaveMultiplier = 4,\n yOffsetColorMultiplier = 4,\n yOffsetFlowMultiplier = 4,\n // Flow field parameters\n flowDistortionA = 0,\n flowDistortionB = 0,\n flowScale = 1.0,\n flowEase = 0.0,\n flowEnabled = true,\n\n // Texture generation\n enableProceduralTexture = false,\n textureVoidLikelihood = 0.45,\n textureVoidWidthMin = 200,\n textureVoidWidthMax = 486,\n textureBandDensity = 2.15,\n textureColorBlending = 0.01,\n textureSeed = 333,\n textureEase = 0.5,\n proceduralBackgroundColor = \"#000000\",\n transparentTextureVoid = false,\n textureShapeTriangles = 20,\n textureShapeCircles = 15,\n textureShapeBars = 15,\n textureShapeSquiggles = 10,\n\n domainWarpEnabled = false,\n domainWarpIntensity = 0.5,\n domainWarpScale = 1.0,\n vignetteIntensity = 0.0,\n vignetteRadius = 0.8,\n fresnelEnabled = false,\n fresnelPower = 2.0,\n fresnelIntensity = 0.5,\n fresnelColor = \"#FFFFFF\",\n iridescenceEnabled = false,\n iridescenceIntensity = 0.5,\n iridescenceSpeed = 1.0,\n bloomIntensity = 0.0,\n bloomThreshold = 0.7,\n chromaticAberration = 0.0,\n silhouetteFade = 0.25,\n cylinderFade = 0.08,\n ribbonFade = 0.05,\n flatShading = true,\n\n // Camera configuration\n cameraLock = false,\n cameraX = 0,\n cameraY = 0,\n cameraZ = 0,\n cameraRotationX = 0,\n cameraRotationY = 0,\n cameraRotationZ = 0,\n cameraZoom = 1.0,\n\n // 3D shapes default\n shapeType = 'plane',\n shapeRotationX = 0,\n shapeRotationY = 0,\n shapeRotationZ = 0,\n shapeAutoRotateSpeedX = 0,\n shapeAutoRotateSpeedY = 0,\n sphereRadius = 15,\n torusRadius = 15,\n torusTube = 5,\n cylinderRadius = 10,\n cylinderHeight = 40,\n planeBend = 0,\n planeTwist = 0,\n } = config;\n\n\n this._ref = ref;\n\n this.destroy = this.destroy.bind(this);\n this._initScene = this._initScene.bind(this);\n\n this.speed = speed;\n this.horizontalPressure = horizontalPressure;\n this.verticalPressure = verticalPressure;\n this.waveFrequencyX = waveFrequencyX;\n this.waveFrequencyY = waveFrequencyY;\n this.waveAmplitude = waveAmplitude;\n this.colorBlending = colorBlending;\n this._resolution = resolution;\n this.grainScale = grainScale;\n this.grainIntensity = grainIntensity;\n this.grainSparsity = grainSparsity;\n this.grainSpeed = grainSpeed;\n this.colors = colors;\n this.shadows = shadows;\n this.highlights = highlights;\n this.colorSaturation = colorSaturation;\n this.colorBrightness = colorBrightness;\n this.wireframe = wireframe;\n this.backgroundColor = backgroundColor;\n this.backgroundAlpha = backgroundAlpha;\n this.yOffset = yOffset;\n this.yOffsetWaveMultiplier = yOffsetWaveMultiplier;\n this.yOffsetColorMultiplier = yOffsetColorMultiplier;\n this.yOffsetFlowMultiplier = yOffsetFlowMultiplier;\n\n // Flow field\n this.flowDistortionA = flowDistortionA;\n this.flowDistortionB = flowDistortionB;\n this.flowScale = flowScale;\n this.flowEase = flowEase;\n this.flowEnabled = flowEnabled;\n\n\n\n // Texture generation\n this.enableProceduralTexture = enableProceduralTexture;\n this.textureVoidLikelihood = textureVoidLikelihood;\n this.textureVoidWidthMin = textureVoidWidthMin;\n this.textureVoidWidthMax = textureVoidWidthMax;\n this.textureBandDensity = textureBandDensity;\n this.textureColorBlending = textureColorBlending;\n this.textureSeed = textureSeed;\n this.textureEase = textureEase;\n this._proceduralBackgroundColor = proceduralBackgroundColor;\n this.transparentTextureVoid = transparentTextureVoid;\n\n this._textureShapeTriangles = textureShapeTriangles;\n this._textureShapeCircles = textureShapeCircles;\n this._textureShapeBars = textureShapeBars;\n this._textureShapeSquiggles = textureShapeSquiggles;\n\n this.domainWarpEnabled = domainWarpEnabled;\n this.domainWarpIntensity = domainWarpIntensity;\n this.domainWarpScale = domainWarpScale;\n this.vignetteIntensity = vignetteIntensity;\n this.vignetteRadius = vignetteRadius;\n this.fresnelEnabled = fresnelEnabled;\n this.fresnelPower = fresnelPower;\n this.fresnelIntensity = fresnelIntensity;\n this.fresnelColor = fresnelColor;\n this.iridescenceEnabled = iridescenceEnabled;\n this.iridescenceIntensity = iridescenceIntensity;\n this.iridescenceSpeed = iridescenceSpeed;\n this.bloomIntensity = bloomIntensity;\n this.bloomThreshold = bloomThreshold;\n this.chromaticAberration = chromaticAberration;\n this.silhouetteFade = silhouetteFade;\n this.cylinderFade = cylinderFade;\n this.ribbonFade = ribbonFade;\n this._flatShading = flatShading;\n\n this._cameraLock = cameraLock;\n this._cameraX = cameraX;\n this._cameraY = cameraY;\n this._cameraZ = cameraZ;\n this._cameraRotationX = cameraRotationX;\n this._cameraRotationY = cameraRotationY;\n this._cameraRotationZ = cameraRotationZ;\n this._cameraZoom = cameraZoom;\n\n this._shapeType = shapeType;\n this._shapeRotationX = shapeRotationX;\n this._shapeRotationY = shapeRotationY;\n this._shapeRotationZ = shapeRotationZ;\n this._shapeAutoRotateSpeedX = shapeAutoRotateSpeedX;\n this._shapeAutoRotateSpeedY = shapeAutoRotateSpeedY;\n this._sphereRadius = sphereRadius;\n this._torusRadius = torusRadius;\n this._torusTube = torusTube;\n this._cylinderRadius = cylinderRadius;\n this._cylinderHeight = cylinderHeight;\n this._planeBend = planeBend;\n this._planeTwist = planeTwist;\n\n this.glState = this._initScene(resolution);\n\n injectSEO();\n\n let tick = seed !== undefined ? seed : getElapsedSecondsInLastHour();\n let lastTime = performance.now();\n\n const render = () => {\n\n const { gl, program, locations, indexCount, indexType } = this.glState;\n\n // Optimization: check if cached link is still valid in DOM less frequently\n this._linkCheckCounter++;\n if (this._linkCheckCounter >= 300) { // Check every ~5 seconds at 60fps\n this._linkCheckCounter = 0;\n if (!this._linkElement || !document.contains(this._linkElement)) {\n this._linkElement = addNeatLink(ref);\n }\n }\n\n if (this._initialized) {\n const timeNow = performance.now();\n tick += ((timeNow - lastTime) / 1000) * this._speed;\n lastTime = timeNow;\n\n gl.useProgram(program);\n\n gl.uniform1f(locations.uniforms['u_time'], tick);\n\n // Update modelViewMatrix in every frame to support dynamic rotation and auto-rotation\n const camera = this.glState.camera;\n const modelViewMatrix = this._modelViewMatrix;\n modelViewMatrix.identity();\n \n // 1. Camera translation (default camera distance + displacement)\n modelViewMatrix.translate(\n -camera.position[0] - this._cameraX,\n -camera.position[1] - this._cameraY,\n -camera.position[2] - this._cameraZ\n );\n modelViewMatrix.translate(0, 0, -1);\n \n // 2. Camera rotation (revolving around target)\n modelViewMatrix.rotateX(-this._cameraRotationX);\n modelViewMatrix.rotateY(-this._cameraRotationY);\n modelViewMatrix.rotateZ(-this._cameraRotationZ);\n \n let rx = this._shapeRotationX;\n let ry = this._shapeRotationY;\n let rz = this._shapeRotationZ;\n \n if (this._shapeAutoRotateSpeedX !== 0) {\n rx += tick * this._shapeAutoRotateSpeedX * 0.1;\n }\n if (this._shapeAutoRotateSpeedY !== 0) {\n ry += tick * this._shapeAutoRotateSpeedY * 0.1;\n }\n \n if (this._shapeType === 'plane' || this._shapeType === 'ribbon') {\n modelViewMatrix.rotateX(rx - Math.PI / 3.5);\n } else {\n modelViewMatrix.rotateX(rx);\n }\n modelViewMatrix.rotateY(ry);\n modelViewMatrix.rotateZ(rz);\n \n const mvLoc = locations.uniforms[\"modelViewMatrix\"];\n if (mvLoc) gl.uniformMatrix4fv(mvLoc, false, modelViewMatrix.elements);\n\n // Fast path: only upload yOffset when it changed (scroll)\n if (this._yOffsetDirty && !this._uniformsDirty) {\n gl.uniform1f(locations.uniforms['u_y_offset'], this._yOffset);\n this._yOffsetDirty = false;\n }\n\n // Only upload static uniforms when they've been modified\n if (this._uniformsDirty) {\n gl.uniform2f(locations.uniforms['u_resolution'], this._ref.clientWidth, this._ref.clientHeight);\n gl.uniform2f(locations.uniforms['u_color_pressure'], this._horizontalPressure, this._verticalPressure);\n\n gl.uniform1f(locations.uniforms['u_wave_frequency_x'], this._waveFrequencyX);\n gl.uniform1f(locations.uniforms['u_wave_frequency_y'], this._waveFrequencyY);\n gl.uniform1f(locations.uniforms['u_wave_amplitude'], this._waveAmplitude);\n gl.uniform1f(locations.uniforms['u_color_blending'], this._colorBlending);\n gl.uniform1f(locations.uniforms['u_shadows'], this._shadows);\n gl.uniform1f(locations.uniforms['u_highlights'], this._highlights);\n gl.uniform1f(locations.uniforms['u_saturation'], this._saturation);\n gl.uniform1f(locations.uniforms['u_brightness'], this._brightness);\n gl.uniform1f(locations.uniforms['u_grain_intensity'], this._grainIntensity);\n gl.uniform1f(locations.uniforms['u_grain_sparsity'], this._grainSparsity);\n gl.uniform1f(locations.uniforms['u_grain_speed'], this._grainSpeed);\n gl.uniform1f(locations.uniforms['u_grain_scale'], this._grainScale);\n gl.uniform1f(locations.uniforms['u_y_offset'], this._yOffset);\n gl.uniform1f(locations.uniforms['u_y_offset_wave_multiplier'], this._yOffsetWaveMultiplier);\n gl.uniform1f(locations.uniforms['u_y_offset_color_multiplier'], this._yOffsetColorMultiplier);\n gl.uniform1f(locations.uniforms['u_y_offset_flow_multiplier'], this._yOffsetFlowMultiplier);\n gl.uniform1f(locations.uniforms['u_flow_distortion_a'], this._flowDistortionA);\n gl.uniform1f(locations.uniforms['u_flow_distortion_b'], this._flowDistortionB);\n gl.uniform1f(locations.uniforms['u_flow_scale'], this._flowScale);\n gl.uniform1f(locations.uniforms['u_flow_ease'], this._flowEase);\n gl.uniform1f(locations.uniforms['u_flow_enabled'], this._flowEnabled ? 1.0 : 0.0);\n\n let shapeTypeVal = 0.0;\n if (this._shapeType === 'sphere') shapeTypeVal = 1.0;\n else if (this._shapeType === 'torus') shapeTypeVal = 2.0;\n else if (this._shapeType === 'cylinder') shapeTypeVal = 3.0;\n else if (this._shapeType === 'ribbon') shapeTypeVal = 4.0;\n gl.uniform1f(locations.uniforms['u_shape_type'], shapeTypeVal);\n\n gl.uniform1f(locations.uniforms['u_enable_procedural_texture'], this._enableProceduralTexture ? 1.0 : 0.0);\n gl.uniform1f(locations.uniforms['u_texture_ease'], this._textureEase);\n gl.uniform1f(locations.uniforms['u_transparent_texture_void'], this._transparentTextureVoid ? 1.0 : 0.0);\n\n gl.uniform1f(locations.uniforms['u_domain_warp_enabled'], this._domainWarpEnabled ? 1.0 : 0.0);\n gl.uniform1f(locations.uniforms['u_domain_warp_intensity'], this._domainWarpIntensity);\n gl.uniform1f(locations.uniforms['u_domain_warp_scale'], this._domainWarpScale);\n\n gl.uniform1f(locations.uniforms['u_vignette_intensity'], this._vignetteIntensity);\n gl.uniform1f(locations.uniforms['u_vignette_radius'], this._vignetteRadius);\n\n gl.uniform1f(locations.uniforms['u_fresnel_enabled'], this._fresnelEnabled ? 1.0 : 0.0);\n gl.uniform1f(locations.uniforms['u_fresnel_power'], this._fresnelPower);\n gl.uniform1f(locations.uniforms['u_fresnel_intensity'], this._fresnelIntensity);\n gl.uniform3fv(locations.uniforms['u_fresnel_color'], this._fresnelColorRgb);\n\n gl.uniform1f(locations.uniforms['u_iridescence_enabled'], this._iridescenceEnabled ? 1.0 : 0.0);\n gl.uniform1f(locations.uniforms['u_iridescence_intensity'], this._iridescenceIntensity);\n gl.uniform1f(locations.uniforms['u_iridescence_speed'], this._iridescenceSpeed);\n\n gl.uniform1f(locations.uniforms['u_bloom_intensity'], this._bloomIntensity);\n gl.uniform1f(locations.uniforms['u_bloom_threshold'], this._bloomThreshold);\n gl.uniform1f(locations.uniforms['u_chromatic_aberration'], this._chromaticAberration);\n gl.uniform1f(locations.uniforms['u_silhouette_fade'], this._silhouetteFade);\n gl.uniform1f(locations.uniforms['u_cylinder_fade'], this._cylinderFade);\n gl.uniform1f(locations.uniforms['u_ribbon_fade'], this._ribbonFade);\n gl.uniform1f(locations.uniforms['u_flat_shading'], this._flatShading ? 1.0 : 0.0);\n\n this._uniformsDirty = false;\n this._yOffsetDirty = false;\n }\n\n // Only regenerate procedural texture when needed\n if (this._textureNeedsUpdate && this._enableProceduralTexture) {\n if (this._proceduralTexture) {\n gl.deleteTexture(this._proceduralTexture);\n }\n this._proceduralTexture = this._createProceduralTexture(gl);\n this._textureNeedsUpdate = false;\n this._textureDirty = true;\n }\n\n // Procedural texture binding — only when texture changes\n if (this._textureDirty && this._proceduralTexture) {\n gl.activeTexture(gl.TEXTURE1);\n gl.bindTexture(gl.TEXTURE_2D, this._proceduralTexture);\n gl.uniform1i(locations.uniforms['u_procedural_texture'], 1);\n this._textureDirty = false;\n }\n\n // Color update — only when colors have changed\n if (this._colorsChanged) {\n this._colorsChanged = false;\n\n for (let i = 0; i < COLORS_COUNT; i++) {\n if (i < this._colors.length) {\n const c = this._colors[i];\n const rgb = this._cachedColorRgb[i] || [0, 0, 0];\n gl.uniform1f(locations.uniforms[`u_colors[${i}].is_active`], c.enabled ? 1.0 : 0.0);\n gl.uniform3fv(locations.uniforms[`u_colors[${i}].color`], rgb);\n gl.uniform1f(locations.uniforms[`u_colors[${i}].influence`], c.influence || 0);\n } else {\n gl.uniform1f(locations.uniforms[`u_colors[${i}].is_active`], 0.0);\n }\n }\n\n gl.uniform1i(locations.uniforms['u_colors_count'], COLORS_COUNT);\n }\n }\n\n\n // Draw scene\n gl.clearColor(\n this._backgroundColorRgb[0],\n this._backgroundColorRgb[1],\n this._backgroundColorRgb[2],\n this._backgroundAlpha\n );\n gl.clear(gl.COLOR_BUFFER_BIT | gl.DEPTH_BUFFER_BIT);\n\n if (this._wireframe) {\n gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this.glState.buffers.wireframeIndex);\n gl.drawElements(gl.LINES, this.glState.wireframeIndexCount, indexType, 0);\n gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this.glState.buffers.index);\n } else {\n gl.drawElements(gl.TRIANGLES, indexCount, indexType, 0);\n }\n\n if (this._isVisible) {\n this.requestRef = requestAnimationFrame(render);\n }\n };\n\n // Visibility optimization: pause rendering when off-screen or tab hidden\n this._visibilityObserver = new IntersectionObserver((entries) => {\n const wasVisible = this._isVisible;\n this._isVisible = entries[0].isIntersecting && document.visibilityState !== 'hidden';\n if (this._isVisible && !wasVisible) {\n lastTime = performance.now(); // Avoid time jump after resume\n this.requestRef = requestAnimationFrame(render);\n }\n }, { threshold: 0 });\n this._visibilityObserver.observe(ref);\n\n this._visibilityHandler = () => {\n const wasVisible = this._isVisible;\n if (document.visibilityState === 'hidden') {\n this._isVisible = false;\n } else {\n this._isVisible = true;\n if (!wasVisible) {\n lastTime = performance.now();\n this.requestRef = requestAnimationFrame(render);\n }\n }\n };\n document.addEventListener('visibilitychange', this._visibilityHandler);\n\n const setSize = () => {\n\n const { gl, camera } = this.glState;\n const width = this._ref.clientWidth;\n const height = this._ref.clientHeight;\n\n // Handle high DPI displays properly without scaling buffer resolution, matching client width\n this._ref.width = width;\n this._ref.height = height;\n\n gl.viewport(0, 0, width, height);\n\n updateCamera(camera, width, height, PLANE_WIDTH, PLANE_HEIGHT, this._shapeType, this._cameraZoom);\n\n\n\n // Recompute projection matrix on resize\n const projLoc = this.glState.locations.uniforms[\"projectionMatrix\"];\n gl.useProgram(this.glState.program);\n if (projLoc) gl.uniformMatrix4fv(projLoc, false, camera.projectionMatrix.elements);\n };\n\n // Debounce resize to prevent excessive operations\n this.sizeObserver = new ResizeObserver(() => {\n if (this._resizeTimeoutId !== null) {\n clearTimeout(this._resizeTimeoutId);\n }\n this._resizeTimeoutId = window.setTimeout(() => {\n setSize();\n this._resizeTimeoutId = null;\n }, 100); // Wait 100ms after last resize event\n });\n\n this.sizeObserver.observe(ref);\n\n\n render();\n }\n\n destroy() {\n cancelAnimationFrame(this.requestRef);\n this.sizeObserver.disconnect();\n\n // Cleanup visibility observers\n if (this._visibilityObserver) {\n this._visibilityObserver.disconnect();\n this._visibilityObserver = null;\n }\n if (this._visibilityHandler) {\n document.removeEventListener('visibilitychange', this._visibilityHandler);\n this._visibilityHandler = null;\n }\n\n // Clear resize timeout\n if (this._resizeTimeoutId !== null) {\n clearTimeout(this._resizeTimeoutId);\n this._resizeTimeoutId = null;\n }\n\n // Remove NEAT link\n if (this._linkElement && this._linkElement.parentElement) {\n this._linkElement.parentElement.removeChild(this._linkElement);\n this._linkElement = null;\n }\n\n // Cleanup WebGL resources\n if (this.glState) {\n const gl = this.glState.gl;\n gl.deleteProgram(this.glState.program);\n gl.deleteBuffer(this.glState.buffers.position);\n gl.deleteBuffer(this.glState.buffers.normal);\n gl.deleteBuffer(this.glState.buffers.uv);\n gl.deleteBuffer(this.glState.buffers.index);\n gl.deleteBuffer(this.glState.buffers.wireframeIndex);\n }\n if (this._proceduralTexture && this.glState) {\n this.glState.gl.deleteTexture(this._proceduralTexture);\n }\n }\n\n downloadAsPNG(filename = \"neat.png\") {\n const dataURL = this._ref.toDataURL(\"image/png\");\n downloadURI(dataURL, filename);\n }\n\n /**\n * Records the canvas animation as a video with a NEAT watermark overlay.\n * @param options.durationMs Recording duration in milliseconds (default 5000).\n * @param options.filename Output file name (default \"neat.firecms.co\").\n * @param options.width Output video width in pixels (default: current canvas width).\n * @param options.height Output video height in pixels (default: current canvas height).\n * @param options.format Preferred format: 'mp4' or 'webm' (default: best available).\n * @param options.onProgress Callback with progress 0-1.\n * @param options.onComplete Callback when recording finishes.\n * @returns A stop function to end recording early.\n */\n recordVideo(options: {\n durationMs?: number;\n filename?: string;\n width?: number;\n height?: number;\n format?: 'mp4' | 'webm';\n onProgress?: (progress: number) => void;\n onComplete?: () => void;\n } = {}): () => void {\n const {\n durationMs = 5000,\n filename = \"neat.firecms.co\",\n format,\n onProgress,\n onComplete,\n } = options;\n\n const source = this._ref;\n const width = options.width || source.width || source.clientWidth;\n const height = options.height || source.height || source.clientHeight;\n\n // Offscreen canvas that composites gradient + watermark each frame\n const offscreen = document.createElement(\"canvas\");\n offscreen.width = width;\n offscreen.height = height;\n const ctx = offscreen.getContext(\"2d\")!;\n\n // Use captureStream(0) — only captures a frame when we explicitly\n // call requestFrame() on the video track, so every composited frame\n // is guaranteed to be captured.\n const stream = offscreen.captureStream(0);\n const videoTrack = stream.getVideoTracks()[0];\n\n // Codec candidates ordered by preference\n const mp4Candidates = [\n \"video/mp4;codecs=avc1\",\n \"video/mp4;codecs=avc1,opus\",\n \"video/mp4\",\n ];\n const webmCandidates = [\n \"video/webm;codecs=vp9,opus\",\n \"video/webm;codecs=vp9\",\n \"video/webm;codecs=vp8,opus\",\n \"video/webm\",\n ];\n\n // Build candidate list based on preferred format\n let candidates: string[];\n if (format === 'mp4') candidates = [...mp4Candidates, ...webmCandidates];\n else if (format === 'webm') candidates = [...webmCandidates, ...mp4Candidates];\n else candidates = [...mp4Candidates, ...webmCandidates];\n\n let mimeType = \"video/webm\";\n for (const candidate of candidates) {\n if (MediaRecorder.isTypeSupported(candidate)) {\n mimeType = candidate;\n break;\n }\n }\n\n // Scale bitrate with pixel count: 8 Mbps baseline at 720p\n const pixels = width * height;\n const baseBitrate = 8_000_000;\n const basePixels = 1280 * 720;\n const videoBitsPerSecond = Math.round(baseBitrate * Math.max(1, pixels / basePixels));\n\n const recorder = new MediaRecorder(stream, {\n mimeType,\n videoBitsPerSecond,\n });\n\n const chunks: Blob[] = [];\n recorder.ondataavailable = (e) => {\n if (e.data.size > 0) chunks.push(e.data);\n };\n\n let stopped = false;\n let rafId: number;\n const startTime = performance.now();\n let lastProgressTime = 0;\n\n // Composite loop: draw source canvas + watermark overlay on each frame\n const drawFrame = () => {\n if (stopped) return;\n\n ctx.clearRect(0, 0, width, height);\n ctx.drawImage(source, 0, 0, width, height);\n\n // Watermark: \"NEAT\" in bottom-right corner\n const fontSize = Math.max(14, Math.round(height * 0.025));\n ctx.font = `bold ${fontSize}px \"Sofia Sans\", sans-serif`;\n ctx.textAlign = \"right\";\n ctx.textBaseline = \"bottom\";\n ctx.shadowColor = \"rgba(0,0,0,0.5)\";\n ctx.shadowBlur = 4;\n ctx.shadowOffsetX = 1;\n ctx.shadowOffsetY = 1;\n ctx.fillStyle = \"rgba(255,255,255,0.7)\";\n ctx.fillText(\"NEAT\", width - fontSize * 0.8, height - fontSize * 0.5);\n ctx.shadowColor = \"transparent\";\n ctx.shadowBlur = 0;\n ctx.shadowOffsetX = 0;\n ctx.shadowOffsetY = 0;\n\n // Signal the stream to capture this frame\n // @ts-ignore – requestFrame exists on CanvasCaptureMediaStreamTrack\n if (videoTrack.requestFrame) videoTrack.requestFrame();\n\n // Throttle progress to ~4 updates/sec to avoid flooding React state\n if (onProgress) {\n const now = performance.now();\n if (now - lastProgressTime > 250) {\n lastProgressTime = now;\n onProgress(Math.min(0.99, (now - startTime) / durationMs));\n }\n }\n\n rafId = requestAnimationFrame(drawFrame);\n };\n\n recorder.onstop = () => {\n stopped = true;\n cancelAnimationFrame(rafId);\n\n // Use the correct file extension for the actual format\n const isMP4 = mimeType.startsWith(\"video/mp4\");\n const ext = isMP4 ? \".mp4\" : \".webm\";\n const blobType = isMP4 ? \"video/mp4\" : \"video/webm\";\n const finalFilename = filename + ext;\n\n const blob = new Blob(chunks, { type: blobType });\n const url = URL.createObjectURL(blob);\n downloadURI(url, finalFilename);\n setTimeout(() => URL.revokeObjectURL(url), 30000);\n\n onProgress?.(1);\n onComplete?.();\n };\n\n // Start drawing frames, then start recording\n drawFrame();\n recorder.start(100); // collect data every 100ms\n\n // Auto-stop after the requested duration\n const timeoutId = window.setTimeout(() => {\n if (recorder.state === \"recording\") {\n recorder.stop();\n }\n }, durationMs);\n\n // Return a stop function for early termination\n return () => {\n clearTimeout(timeoutId);\n if (recorder.state === \"recording\") {\n recorder.stop();\n }\n };\n }\n get speed(): number {\n return this._speed * 20;\n }\n set speed(speed: number) {\n this._uniformsDirty = true;\n this._speed = speed / 20;\n }\n\n get horizontalPressure(): number {\n return this._horizontalPressure * 4;\n }\n set horizontalPressure(horizontalPressure: number) {\n this._uniformsDirty = true;\n this._horizontalPressure = horizontalPressure / 4;\n }\n\n get verticalPressure(): number {\n return this._verticalPressure * 4;\n }\n set verticalPressure(verticalPressure: number) {\n this._uniformsDirty = true;\n this._verticalPressure = verticalPressure / 4;\n }\n\n get waveFrequencyX(): number {\n return this._waveFrequencyX / 0.04;\n }\n set waveFrequencyX(waveFrequencyX: number) {\n this._uniformsDirty = true;\n this._waveFrequencyX = waveFrequencyX * 0.04;\n }\n\n get waveFrequencyY(): number {\n return this._waveFrequencyY / 0.04;\n }\n set waveFrequencyY(waveFrequencyY: number) {\n this._uniformsDirty = true;\n this._waveFrequencyY = waveFrequencyY * 0.04;\n }\n\n get waveAmplitude(): number {\n return this._waveAmplitude / 0.75;\n }\n set waveAmplitude(waveAmplitude: number) {\n this._uniformsDirty = true;\n this._waveAmplitude = waveAmplitude * .75;\n }\n\n get colors(): NeatColor[] {\n return this._colors;\n }\n set colors(colors: NeatColor[]) {\n this._uniformsDirty = true;\n this._colors = colors;\n this._cachedColorRgb = colors.map(c => this._hexToRgb(c.color));\n this._colorsChanged = true;\n }\n\n get highlights(): number {\n return this._highlights * 100;\n }\n set highlights(highlights: number) {\n this._uniformsDirty = true;\n this._highlights = highlights / 100;\n }\n\n get shadows(): number {\n return this._shadows * 100;\n }\n set shadows(shadows: number) {\n this._uniformsDirty = true;\n this._shadows = shadows / 100;\n }\n\n get colorSaturation(): number {\n return this._saturation * 10;\n }\n set colorSaturation(colorSaturation: number) {\n this._uniformsDirty = true;\n this._saturation = colorSaturation / 10;\n }\n\n get colorBrightness(): number {\n return this._brightness;\n }\n set colorBrightness(colorBrightness: number) {\n this._uniformsDirty = true;\n this._brightness = colorBrightness;\n }\n\n get colorBlending(): number {\n return this._colorBlending * 10;\n }\n set colorBlending(colorBlending: number) {\n this._uniformsDirty = true;\n this._colorBlending = colorBlending / 10;\n }\n\n get grainScale(): number {\n return this._grainScale;\n }\n set grainScale(grainScale: number) {\n this._uniformsDirty = true;\n this._grainScale = grainScale == 0 ? 1 : grainScale;\n }\n\n get grainIntensity(): number {\n return this._grainIntensity;\n }\n set grainIntensity(grainIntensity: number) {\n this._uniformsDirty = true;\n this._grainIntensity = grainIntensity;\n }\n\n get grainSparsity(): number {\n return this._grainSparsity;\n }\n set grainSparsity(grainSparsity: number) {\n this._uniformsDirty = true;\n this._grainSparsity = grainSparsity;\n }\n\n get grainSpeed(): number {\n return this._grainSpeed;\n }\n set grainSpeed(grainSpeed: number) {\n this._uniformsDirty = true;\n this._grainSpeed = grainSpeed;\n }\n\n get wireframe(): boolean {\n return this._wireframe;\n }\n set wireframe(wireframe: boolean) {\n this._uniformsDirty = true;\n this._wireframe = wireframe;\n }\n\n get resolution(): number {\n return this._resolution;\n }\n set resolution(resolution: number) {\n if (this._resolution === resolution) return;\n this._resolution = resolution;\n this._updateGeometry();\n }\n\n get backgroundColor(): string {\n return this._backgroundColor;\n }\n set backgroundColor(backgroundColor: string) {\n this._uniformsDirty = true;\n this._backgroundColor = backgroundColor;\n this._backgroundColorRgb = this._hexToRgb(backgroundColor);\n }\n\n get backgroundAlpha(): number {\n return this._backgroundAlpha;\n }\n set backgroundAlpha(backgroundAlpha: number) {\n this._uniformsDirty = true;\n this._backgroundAlpha = backgroundAlpha;\n }\n\n get yOffset(): number {\n return this._yOffset;\n }\n set yOffset(yOffset: number) {\n if (this._yOffset !== yOffset) {\n this._yOffsetDirty = true;\n this._yOffset = yOffset;\n }\n }\n\n get yOffsetWaveMultiplier(): number {\n return this._yOffsetWaveMultiplier * 1000;\n }\n\n set yOffsetWaveMultiplier(value: number) {\n this._uniformsDirty = true;\n this._yOffsetWaveMultiplier = value / 1000;\n }\n\n get yOffsetColorMultiplier(): number {\n return this._yOffsetColorMultiplier * 1000;\n }\n\n set yOffsetColorMultiplier(value: number) {\n this._uniformsDirty = true;\n this._yOffsetColorMultiplier = value / 1000;\n }\n\n get yOffsetFlowMultiplier(): number {\n return this._yOffsetFlowMultiplier * 1000;\n }\n\n set yOffsetFlowMultiplier(value: number) {\n this._uniformsDirty = true;\n this._yOffsetFlowMultiplier = value / 1000;\n }\n\n get flowDistortionA(): number {\n return this._flowDistortionA;\n }\n set flowDistortionA(value: number) {\n this._uniformsDirty = true;\n this._flowDistortionA = value;\n }\n\n get flowDistortionB(): number {\n return this._flowDistortionB;\n }\n set flowDistortionB(value: number) {\n this._uniformsDirty = true;\n this._flowDistortionB = value;\n }\n\n get flowScale(): number {\n return this._flowScale;\n }\n set flowScale(value: number) {\n this._uniformsDirty = true;\n this._flowScale = value;\n }\n\n get flowEase(): number {\n return this._flowEase;\n }\n set flowEase(value: number) {\n this._uniformsDirty = true;\n this._flowEase = value;\n }\n\n set flowEnabled(value: boolean) {\n this._uniformsDirty = true;\n this._flowEnabled = value;\n }\n\n get flowEnabled(): boolean {\n return this._flowEnabled;\n }\n\n\n\n get enableProceduralTexture(): boolean {\n return this._enableProceduralTexture;\n }\n set enableProceduralTexture(value: boolean) {\n this._uniformsDirty = true;\n this._enableProceduralTexture = value;\n if (value && !this._proceduralTexture) {\n this._textureNeedsUpdate = true;\n }\n }\n\n get textureVoidLikelihood(): number {\n return this._textureVoidLikelihood;\n }\n set textureVoidLikelihood(value: number) {\n this._uniformsDirty = true;\n this._textureVoidLikelihood = value;\n if (this._enableProceduralTexture) {\n this._textureNeedsUpdate = true;\n }\n }\n\n get textureVoidWidthMin(): number {\n return this._textureVoidWidthMin;\n }\n set textureVoidWidthMin(value: number) {\n this._uniformsDirty = true;\n this._textureVoidWidthMin = value;\n if (this._enableProceduralTexture) {\n this._textureNeedsUpdate = true;\n }\n }\n\n get textureVoidWidthMax(): number {\n return this._textureVoidWidthMax;\n }\n set textureVoidWidthMax(value: number) {\n this._uniformsDirty = true;\n this._textureVoidWidthMax = value;\n if (this._enableProceduralTexture) {\n this._textureNeedsUpdate = true;\n }\n }\n\n get textureBandDensity(): number {\n return this._textureBandDensity;\n }\n set textureBandDensity(value: number) {\n this._uniformsDirty = true;\n this._textureBandDensity = value;\n if (this._enableProceduralTexture) {\n this._textureNeedsUpdate = true;\n }\n }\n\n get textureColorBlending(): number {\n return this._textureColorBlending;\n }\n set textureColorBlending(value: number) {\n this._uniformsDirty = true;\n this._textureColorBlending = value;\n if (this._enableProceduralTexture) {\n this._textureNeedsUpdate = true;\n }\n }\n\n get textureSeed(): number {\n return this._textureSeed;\n }\n set textureSeed(value: number) {\n this._uniformsDirty = true;\n this._textureSeed = value;\n if (this._enableProceduralTexture) {\n this._textureNeedsUpdate = true;\n }\n }\n\n get textureEase(): number {\n return this._textureEase;\n }\n\n set textureEase(value: number) {\n this._uniformsDirty = true;\n this._textureEase = value;\n }\n\n get transparentTextureVoid(): boolean {\n return this._transparentTextureVoid;\n }\n\n set transparentTextureVoid(value: boolean) {\n this._uniformsDirty = true;\n this._transparentTextureVoid = value;\n if (this._enableProceduralTexture) {\n this._textureNeedsUpdate = true;\n }\n }\n\n get proceduralBackgroundColor(): string {\n return this._proceduralBackgroundColor;\n }\n set proceduralBackgroundColor(value: string) {\n this._uniformsDirty = true;\n this._proceduralBackgroundColor = value;\n if (this._enableProceduralTexture) {\n this._textureNeedsUpdate = true;\n }\n }\n\n get textureShapeTriangles(): number {\n return this._textureShapeTriangles;\n }\n set textureShapeTriangles(value: number) {\n this._uniformsDirty = true;\n this._textureShapeTriangles = value;\n if (this._enableProceduralTexture) this._textureNeedsUpdate = true;\n }\n get textureShapeCircles(): number {\n return this._textureShapeCircles;\n }\n set textureShapeCircles(value: number) {\n this._uniformsDirty = true;\n this._textureShapeCircles = value;\n if (this._enableProceduralTexture) this._textureNeedsUpdate = true;\n }\n get textureShapeBars(): number {\n return this._textureShapeBars;\n }\n set textureShapeBars(value: number) {\n this._uniformsDirty = true;\n this._textureShapeBars = value;\n if (this._enableProceduralTexture) this._textureNeedsUpdate = true;\n }\n get textureShapeSquiggles(): number {\n return this._textureShapeSquiggles;\n }\n set textureShapeSquiggles(value: number) {\n this._uniformsDirty = true;\n this._textureShapeSquiggles = value;\n if (this._enableProceduralTexture) this._textureNeedsUpdate = true;\n }\n\n _updateGeometry() {\n if (!this.glState) return;\n const gl = this.glState.gl;\n const resolution = this._resolution || 1;\n\n let geometry;\n if (this._shapeType === 'sphere') {\n geometry = generateSphereGeometry(this._sphereRadius, 120 * resolution, 120 * resolution);\n } else if (this._shapeType === 'torus') {\n geometry = generateTorusGeometry(this._torusRadius, this._torusTube, 120 * resolution, 120 * resolution);\n } else if (this._shapeType === 'cylinder') {\n geometry = generateCylinderGeometry(this._cylinderRadius, this._cylinderRadius, this._cylinderHeight, 120 * resolution, 120 * resolution);\n } else if (this._shapeType === 'ribbon') {\n geometry = generateRibbonGeometry(PLANE_WIDTH, PLANE_HEIGHT, 240 * resolution, 240 * resolution, this._planeBend, this._planeTwist);\n } else {\n geometry = generatePlaneGeometry(PLANE_WIDTH, PLANE_HEIGHT, 240 * resolution, 240 * resolution);\n }\n const { position, normal, uv, index, wireframeIndex } = geometry;\n\n gl.bindBuffer(gl.ARRAY_BUFFER, this.glState.buffers.position);\n gl.bufferData(gl.ARRAY_BUFFER, position, gl.STATIC_DRAW);\n\n gl.bindBuffer(gl.ARRAY_BUFFER, this.glState.buffers.normal);\n gl.bufferData(gl.ARRAY_BUFFER, normal, gl.STATIC_DRAW);\n\n gl.bindBuffer(gl.ARRAY_BUFFER, this.glState.buffers.uv);\n gl.bufferData(gl.ARRAY_BUFFER, uv, gl.STATIC_DRAW);\n\n gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this.glState.buffers.index);\n gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, index, gl.STATIC_DRAW);\n\n gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this.glState.buffers.wireframeIndex);\n gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, wireframeIndex, gl.STATIC_DRAW);\n\n // Restore default bound element buffer\n gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this.glState.buffers.index);\n\n this.glState.indexCount = index.length;\n this.glState.wireframeIndexCount = wireframeIndex.length;\n this.glState.indexType = (index instanceof Uint32Array) ? gl.UNSIGNED_INT : gl.UNSIGNED_SHORT;\n\n // Keep camera updated with the new shapeType and dimensions\n const width = this._ref.clientWidth;\n const height = this._ref.clientHeight;\n updateCamera(this.glState.camera, width, height, PLANE_WIDTH, PLANE_HEIGHT, this._shapeType, this._cameraZoom);\n\n // Recompute projection matrix\n const projLoc = this.glState.locations.uniforms[\"projectionMatrix\"];\n gl.useProgram(this.glState.program);\n if (projLoc) gl.uniformMatrix4fv(projLoc, false, this.glState.camera.projectionMatrix.elements);\n\n this._uniformsDirty = true;\n }\n\n _hexToRgb(hex: string): [number, number, number] {\n const bigint = parseInt(hex.replace('#', ''), 16);\n return [\n ((bigint >> 16) & 255) / 255.0,\n ((bigint >> 8) & 255) / 255.0,\n (bigint & 255) / 255.0\n ];\n }\n\n _initScene(resolution: number): WebGLState {\n\n const width = this._ref.clientWidth;\n const height = this._ref.clientHeight;\n\n const gl = this._ref.getContext(\"webgl2\", { alpha: true, preserveDrawingBuffer: true, antialias: true }) ||\n this._ref.getContext(\"webgl\", { alpha: true, preserveDrawingBuffer: true, antialias: true });\n\n if (!gl) {\n throw new Error(\"WebGL not supported\");\n }\n\n const ext = gl.getExtension(\"OES_standard_derivatives\");\n gl.getExtension(\"OES_element_index_uint\");\n\n gl.viewport(0, 0, width, height);\n\n // Generate parametric geometry based on shapeType\n let geometry;\n if (this._shapeType === 'sphere') {\n geometry = generateSphereGeometry(this._sphereRadius, 120 * resolution, 120 * resolution);\n } else if (this._shapeType === 'torus') {\n geometry = generateTorusGeometry(this._torusRadius, this._torusTube, 120 * resolution, 120 * resolution);\n } else if (this._shapeType === 'cylinder') {\n geometry = generateCylinderGeometry(this._cylinderRadius, this._cylinderRadius, this._cylinderHeight, 120 * resolution, 120 * resolution);\n } else if (this._shapeType === 'ribbon') {\n geometry = generateRibbonGeometry(PLANE_WIDTH, PLANE_HEIGHT, 240 * resolution, 240 * resolution, this._planeBend, this._planeTwist);\n } else {\n geometry = generatePlaneGeometry(PLANE_WIDTH, PLANE_HEIGHT, 240 * resolution, 240 * resolution);\n }\n const { position, normal, uv, index, wireframeIndex } = geometry;\n\n const positionBuffer = gl.createBuffer()!;\n gl.bindBuffer(gl.ARRAY_BUFFER, positionBuffer);\n gl.bufferData(gl.ARRAY_BUFFER, position, gl.STATIC_DRAW);\n\n const normalBuffer = gl.createBuffer()!;\n gl.bindBuffer(gl.ARRAY_BUFFER, normalBuffer);\n gl.bufferData(gl.ARRAY_BUFFER, normal, gl.STATIC_DRAW);\n\n const uvBuffer = gl.createBuffer()!;\n gl.bindBuffer(gl.ARRAY_BUFFER, uvBuffer);\n gl.bufferData(gl.ARRAY_BUFFER, uv, gl.STATIC_DRAW);\n\n const indexBuffer = gl.createBuffer()!;\n gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, indexBuffer);\n gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, index, gl.STATIC_DRAW);\n\n const wireframeIndexBuffer = gl.createBuffer()!;\n gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, wireframeIndexBuffer);\n gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, wireframeIndex, gl.STATIC_DRAW);\n\n // Rebind the triangle index buffer as default\n gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, indexBuffer);\n\n const vertShaderSourceCombined = buildVertUniforms() + \"\\n\" + buildNoise() + \"\\n\" + buildColorFunctions() + \"\\n\" + vertexShaderSource;\n const vertShader = gl.createShader(gl.VERTEX_SHADER)!;\n gl.shaderSource(vertShader, vertShaderSourceCombined);\n gl.compileShader(vertShader);\n if (!gl.getShaderParameter(vertShader, gl.COMPILE_STATUS)) {\n console.log(\"VERTEX_SHADER_ERROR_START\");\n console.log(\"Vertex shader error: \", gl.getShaderInfoLog(vertShader));\n console.log(\"GL Error Code:\", gl.getError());\n console.log(\"Vertex Shader Source Dump:\");\n console.log(vertShaderSourceCombined.split('\\n').map((line, i) => `${i + 1}: ${line}`).join('\\n'));\n console.log(\"VERTEX_SHADER_ERROR_END\");\n }\n\n const fragShaderSourceCombined = buildFragUniforms() + \"\\n\" + buildColorFunctions() + \"\\n\" + buildNoise() + \"\\n\" + fragmentShaderSource;\n const fragShader = gl.createShader(gl.FRAGMENT_SHADER)!;\n gl.shaderSource(fragShader, fragShaderSourceCombined);\n gl.compileShader(fragShader);\n if (!gl.getShaderParameter(fragShader, gl.COMPILE_STATUS)) {\n console.log(\"FRAGMENT_SHADER_ERROR_START\");\n console.log(\"Fragment shader error: \", gl.getShaderInfoLog(fragShader));\n console.log(\"GL Error Code:\", gl.getError());\n console.log(\"Fragment Shader Source Dump:\");\n console.log(fragShaderSourceCombined.split('\\n').map((line, i) => `${i + 1}: ${line}`).join('\\n'));\n console.log(\"FRAGMENT_SHADER_ERROR_END\");\n }\n\n const program = gl.createProgram()!;\n gl.attachShader(program, vertShader);\n gl.attachShader(program, fragShader);\n gl.linkProgram(program);\n if (!gl.getProgramParameter(program, gl.LINK_STATUS)) {\n console.log(\"PROGRAM_LINK_ERROR_START\");\n console.log(\"Program linking error: \", gl.getProgramInfoLog(program));\n console.log(\"GL Error Code:\", gl.getError());\n console.log(\"PROGRAM_LINK_ERROR_END\");\n }\n\n gl.useProgram(program);\n\n const camera = new OrthographicCamera(0, 0, 0, 0, 0, 1000);\n camera.position = [0, 0, 5];\n updateCamera(camera, width, height, PLANE_WIDTH, PLANE_HEIGHT, this._shapeType, this._cameraZoom);\n\n // Define attributes\n const aPosition = gl.getAttribLocation(program, \"position\");\n const aNormal = gl.getAttribLocation(program, \"normal\");\n const aUv = gl.getAttribLocation(program, \"uv\");\n\n gl.enableVertexAttribArray(aPosition);\n gl.bindBuffer(gl.ARRAY_BUFFER, positionBuffer);\n gl.vertexAttribPointer(aPosition, 3, gl.FLOAT, false, 0, 0);\n\n gl.enableVertexAttribArray(aNormal);\n gl.bindBuffer(gl.ARRAY_BUFFER, normalBuffer);\n gl.vertexAttribPointer(aNormal, 3, gl.FLOAT, false, 0, 0);\n\n gl.enableVertexAttribArray(aUv);\n gl.bindBuffer(gl.ARRAY_BUFFER, uvBuffer);\n gl.vertexAttribPointer(aUv, 2, gl.FLOAT, false, 0, 0);\n\n gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, indexBuffer);\n\n // modelViewMatrix is set dynamically in the render loop\n\n const projLoc = gl.getUniformLocation(program, \"projectionMatrix\");\n gl.uniformMatrix4fv(projLoc, false, camera.projectionMatrix.elements);\n\n const planeWidthLoc = gl.getUniformLocation(program, \"u_plane_width\");\n gl.uniform1f(planeWidthLoc, PLANE_WIDTH);\n\n const planeHeightLoc = gl.getUniformLocation(program, \"u_plane_height\");\n gl.uniform1f(planeHeightLoc, PLANE_HEIGHT);\n\n const colorsCountLoc = gl.getUniformLocation(program, \"u_colors_count\");\n gl.uniform1i(colorsCountLoc, COLORS_COUNT);\n\n const uniformsList = [\n \"projectionMatrix\", \"modelViewMatrix\",\n \"u_time\", \"u_resolution\", \"u_color_pressure\", \"u_wave_frequency_x\", \"u_wave_frequency_y\",\n \"u_wave_amplitude\", \"u_colors_count\", \"u_plane_width\", \"u_plane_height\", \"u_shadows\",\n \"u_highlights\", \"u_grain_intensity\", \"u_grain_sparsity\", \"u_grain_scale\", \"u_grain_speed\",\n \"u_flow_distortion_a\", \"u_flow_distortion_b\", \"u_flow_scale\", \"u_flow_ease\", \"u_flow_enabled\",\n \"u_y_offset\", \"u_y_offset_wave_multiplier\", \"u_y_offset_color_multiplier\", \"u_y_offset_flow_multiplier\",\n\n \"u_procedural_texture\", \"u_enable_procedural_texture\", \"u_texture_ease\", \"u_transparent_texture_void\", \"u_saturation\", \"u_brightness\", \"u_color_blending\",\n \"u_domain_warp_enabled\", \"u_domain_warp_intensity\", \"u_domain_warp_scale\",\n \"u_vignette_intensity\", \"u_vignette_radius\",\n \"u_fresnel_enabled\", \"u_fresnel_power\", \"u_fresnel_intensity\", \"u_fresnel_color\",\n \"u_iridescence_enabled\", \"u_iridescence_intensity\", \"u_iridescence_speed\",\n \"u_bloom_intensity\", \"u_bloom_threshold\", \"u_chromatic_aberration\",\n \"u_shape_type\", \"u_silhouette_fade\", \"u_cylinder_fade\", \"u_ribbon_fade\", \"u_flat_shading\"\n ];\n\n const locations: WebGLState[\"locations\"] = {\n attributes: { position: aPosition, normal: aNormal, uv: aUv },\n uniforms: {}\n };\n\n uniformsList.forEach(name => {\n locations.uniforms[name] = gl.getUniformLocation(program, name);\n });\n\n // Add colors uniforms manually\n for (let i = 0; i < COLORS_COUNT; i++) {\n locations.uniforms[`u_colors[${i}].is_active`] = gl.getUniformLocation(program, `u_colors[${i}].is_active`);\n locations.uniforms[`u_colors[${i}].color`] = gl.getUniformLocation(program, `u_colors[${i}].color`);\n locations.uniforms[`u_colors[${i}].influence`] = gl.getUniformLocation(program, `u_colors[${i}].influence`);\n }\n\n this._initialized = true;\n // New program needs all uniforms re-uploaded on first frame\n this._uniformsDirty = true;\n this._colorsChanged = true;\n this._textureDirty = true;\n\n // Enable alpha blending\n gl.enable(gl.BLEND);\n gl.blendFunc(gl.SRC_ALPHA, gl.ONE_MINUS_SRC_ALPHA);\n gl.enable(gl.DEPTH_TEST);\n\n return {\n gl,\n program,\n buffers: {\n position: positionBuffer,\n normal: normalBuffer,\n uv: uvBuffer,\n index: indexBuffer,\n wireframeIndex: wireframeIndexBuffer\n },\n locations,\n camera,\n indexCount: index.length,\n wireframeIndexCount: wireframeIndex.length,\n indexType: (index instanceof Uint32Array) ? gl.UNSIGNED_INT : gl.UNSIGNED_SHORT\n };\n }\n\n\n\n _createProceduralTexture(gl: WebGLRenderingContext | WebGL2RenderingContext): WebGLTexture | null {\n // Texture size - 1024 provides good balance between quality and performance\n // Reduced from 2048 for better performance\n const texSize = 1024;\n \n if (!this._sourceCanvas) {\n this._sourceCanvas = document.createElement('canvas');\n this._sourceCanvas.width = texSize;\n this._sourceCanvas.height = texSize;\n this._sourceCtx = this._sourceCanvas.getContext('2d');\n }\n const sourceCanvas = this._sourceCanvas;\n const sCtx = this._sourceCtx;\n if (!sCtx) return null;\n\n let seed = this._textureSeed;\n const baseSeed = this._textureSeed;\n\n function random() {\n const x = Math.sin(seed++) * 10000;\n return x - Math.floor(x);\n }\n\n // Helper to reset seed for isolated shape generation\n const setSeed = (offset: number) => {\n seed = baseSeed + offset;\n };\n\n const colors = this._colors.filter(c => c.enabled).map(c => c.color);\n if (colors.length === 0) return null;\n\n const shouldTile = this._shapeType !== 'plane';\n const dxs = shouldTile ? [-1, 0, 1] : [0];\n const dys = shouldTile ? [-1, 0, 1] : [0];\n\n // Helper functions\n function hexToRgb(hex: string) {\n const bigint = parseInt(hex.replace('#', ''), 16);\n return {\n r: (bigint >> 16) & 255,\n g: (bigint >> 8) & 255,\n b: bigint & 255\n };\n }\n\n function rgbToHex(r: number, g: number, b: number) {\n return \"#\" + ((1 << 24) + (Math.round(r) << 16) + (Math.round(g) << 8) + Math.round(b)).toString(16).slice(1).padStart(6, '0');\n }\n\n const getInterColor = () => {\n const c1 = colors[Math.floor(random() * colors.length)];\n const c2 = colors[Math.floor(random() * colors.length)];\n const mix = random() * this._textureColorBlending;\n const rgb1 = hexToRgb(c1);\n const rgb2 = hexToRgb(c2);\n const r = rgb1.r + (rgb2.r - rgb1.r) * mix;\n const g = rgb1.g + (rgb2.g - rgb1.g) * mix;\n const b = rgb1.b + (rgb2.b - rgb1.b) * mix;\n return rgbToHex(r, g, b);\n };\n\n // === SOURCE CANVAS ===\n // Base with procedural background color so even sparse areas pick it up\n const baseColor = this._proceduralBackgroundColor || \"#000000\";\n sCtx.fillStyle = baseColor;\n sCtx.fillRect(0, 0, texSize, texSize);\n\n // Then lay a vertical gradient of mixed colors on top for richness\n const bgGrad = sCtx.createLinearGradient(0, 0, 0, texSize);\n bgGrad.addColorStop(0, getInterColor());\n bgGrad.addColorStop(1, getInterColor());\n sCtx.fillStyle = bgGrad;\n sCtx.fillRect(0, 0, texSize, texSize);\n\n // Triangles: use configurable count\n for (let i = 0; i < this._textureShapeTriangles; i++) {\n const fillStyle = getInterColor();\n const x = random() * texSize;\n const y = random() * texSize;\n const s = 100 + random() * 300;\n const x1 = (random() - 0.5) * s;\n const y1 = (random() - 0.5) * s;\n const x2 = (random() - 0.5) * s;\n const y2 = (random() - 0.5) * s;\n\n for (const dx of dxs) {\n for (const dy of dys) {\n sCtx.fillStyle = fillStyle;\n sCtx.beginPath();\n const tx = x + dx * texSize;\n const ty = y + dy * texSize;\n sCtx.moveTo(tx, ty);\n sCtx.lineTo(tx + x1, ty + y1);\n sCtx.lineTo(tx + x2, ty + y2);\n sCtx.fill();\n }\n }\n }\n\n // Circles / rings: use configurable count\n for (let i = 0; i < this._textureShapeCircles; i++) {\n const strokeStyle = getInterColor();\n const lineWidth = 10 + random() * 50;\n const x = random() * texSize;\n const y = random() * texSize;\n const r = 50 + random() * 150;\n\n for (const dx of dxs) {\n for (const dy of dys) {\n sCtx.strokeStyle = strokeStyle;\n sCtx.lineWidth = lineWidth;\n sCtx.beginPath();\n sCtx.arc(x + dx * texSize, y + dy * texSize, r, 0, Math.PI * 2);\n sCtx.stroke();\n }\n }\n }\n\n // Bars: use configurable count\n for (let i = 0; i < this._textureShapeBars; i++) {\n const fillStyle = getInterColor();\n const x = random() * texSize;\n const y = random() * texSize;\n const rot = random() * Math.PI;\n\n for (const dx of dxs) {\n for (const dy of dys) {\n sCtx.fillStyle = fillStyle;\n sCtx.save();\n sCtx.translate(x + dx * texSize, y + dy * texSize);\n sCtx.rotate(rot);\n sCtx.fillRect(-150, -25, 300, 50);\n sCtx.restore();\n }\n }\n }\n\n // Squiggles: use configurable count\n sCtx.lineWidth = 15;\n sCtx.lineCap = 'round';\n for (let i = 0; i < this._textureShapeSquiggles; i++) {\n const strokeStyle = getInterColor();\n const x = random() * texSize;\n const y = random() * texSize;\n \n const curves: Array<{ cx1: number, cy1: number, cx2: number, cy2: number, ex: number, ey: number }> = [];\n let cx = 0;\n let cy = 0;\n for (let j = 0; j < 4; j++) {\n const ex = cx + (random() - 0.5) * 300;\n const ey = cy + (random() - 0.5) * 300;\n curves.push({\n cx1: cx + (random() - 0.5) * 300,\n cy1: cy + (random() - 0.5) * 300,\n cx2: cx + (random() - 0.5) * 300,\n cy2: cy + (random() - 0.5) * 300,\n ex: ex,\n ey: ey\n });\n cx = ex;\n cy = ey;\n }\n\n for (const dx of dxs) {\n for (const dy of dys) {\n sCtx.strokeStyle = strokeStyle;\n sCtx.beginPath();\n const tx = x + dx * texSize;\n const ty = y + dy * texSize;\n sCtx.moveTo(tx, ty);\n \n for (const curve of curves) {\n sCtx.bezierCurveTo(\n tx + curve.cx1, ty + curve.cy1,\n tx + curve.cx2, ty + curve.cy2,\n tx + curve.ex, ty + curve.ey\n );\n }\n sCtx.stroke();\n }\n }\n }\n\n // === MASKED CANVAS ===\n // Masking: Seed isolation\n setSeed(50000);\n if (!this._maskedCanvas) {\n this._maskedCanvas = document.createElement('canvas');\n this._maskedCanvas.width = texSize;\n this._maskedCanvas.height = texSize;\n this._maskedCtx = this._maskedCanvas.getContext('2d');\n }\n const canvas = this._maskedCanvas;\n const ctx = this._maskedCtx;\n if (!ctx) return null;\n\n // Start filled with the chosen void color so gaps show that color\n if (this._transparentTextureVoid) {\n ctx.clearRect(0, 0, texSize, texSize);\n } else {\n ctx.fillStyle = baseColor;\n ctx.fillRect(0, 0, texSize, texSize);\n }\n\n // Determine layout segments (matter vs void)\n let layoutHead = 0;\n const segments: Array<{ type: 'void' | 'matter', x: number, width: number }> = [];\n\n while (layoutHead < texSize) {\n const isVoid = random() < this._textureVoidLikelihood;\n if (isVoid) {\n const w = this._textureVoidWidthMin + random() * (this._textureVoidWidthMax - this._textureVoidWidthMin);\n segments.push({ type: 'void', x: layoutHead, width: w });\n layoutHead += w;\n } else {\n const w = 50 + random() * 200;\n segments.push({ type: 'matter', x: layoutHead, width: w });\n layoutHead += w;\n }\n }\n\n // Render only matter bands from the source into the masked canvas\n for (const seg of segments) {\n if (seg.type === 'matter') {\n const startX = seg.x;\n const endX = Math.min(seg.x + seg.width, texSize);\n let currentX = startX;\n\n while (currentX < endX) {\n const stripeWidth = (2 + random() * 20) / this._textureBandDensity;\n const sourceX = Math.floor(random() * texSize);\n ctx.drawImage(\n sourceCanvas,\n sourceX, 0, stripeWidth, texSize,\n currentX, 0, stripeWidth, texSize\n );\n currentX += stripeWidth;\n }\n }\n // void segments: leave as baseColor\n }\n\n const tex = gl.createTexture()!;\n gl.bindTexture(gl.TEXTURE_2D, tex);\n gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, canvas);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.REPEAT);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.REPEAT);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR_MIPMAP_LINEAR);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR);\n gl.generateMipmap(gl.TEXTURE_2D);\n\n const ext = gl.getExtension('EXT_texture_filter_anisotropic') ||\n gl.getExtension('MOZ_EXT_texture_filter_anisotropic') ||\n gl.getExtension('WEBKIT_EXT_texture_filter_anisotropic');\n if (ext) {\n const max = gl.getParameter(ext.MAX_TEXTURE_MAX_ANISOTROPY_EXT);\n gl.texParameterf(gl.TEXTURE_2D, ext.TEXTURE_MAX_ANISOTROPY_EXT, Math.min(16, max));\n }\n\n return tex;\n }\n\n get silhouetteFade(): number {\n return this._silhouetteFade;\n }\n set silhouetteFade(value: number) {\n if (this._silhouetteFade !== value) {\n this._silhouetteFade = value;\n this._uniformsDirty = true;\n }\n }\n\n get cylinderFade(): number {\n return this._cylinderFade;\n }\n set cylinderFade(value: number) {\n if (this._cylinderFade !== value) {\n this._cylinderFade = value;\n this._uniformsDirty = true;\n }\n }\n\n get ribbonFade(): number {\n return this._ribbonFade;\n }\n set ribbonFade(value: number) {\n if (this._ribbonFade !== value) {\n this._ribbonFade = value;\n this._uniformsDirty = true;\n }\n }\n\n get flatShading(): boolean {\n return this._flatShading;\n }\n set flatShading(value: boolean) {\n if (this._flatShading !== value) {\n this._flatShading = value;\n this._uniformsDirty = true;\n }\n }\n\n get domainWarpEnabled(): boolean {\n return this._domainWarpEnabled;\n }\n set domainWarpEnabled(enabled: boolean) {\n if (this._domainWarpEnabled !== enabled) {\n this._domainWarpEnabled = enabled;\n this._uniformsDirty = true;\n }\n }\n\n get domainWarpIntensity(): number {\n return this._domainWarpIntensity;\n }\n set domainWarpIntensity(intensity: number) {\n if (this._domainWarpIntensity !== intensity) {\n this._domainWarpIntensity = intensity;\n this._uniformsDirty = true;\n }\n }\n\n get domainWarpScale(): number {\n return this._domainWarpScale;\n }\n set domainWarpScale(scale: number) {\n if (this._domainWarpScale !== scale) {\n this._domainWarpScale = scale;\n this._uniformsDirty = true;\n }\n }\n\n get vignetteIntensity(): number {\n return this._vignetteIntensity;\n }\n set vignetteIntensity(intensity: number) {\n if (this._vignetteIntensity !== intensity) {\n this._vignetteIntensity = intensity;\n this._uniformsDirty = true;\n }\n }\n\n get vignetteRadius(): number {\n return this._vignetteRadius;\n }\n set vignetteRadius(radius: number) {\n if (this._vignetteRadius !== radius) {\n this._vignetteRadius = radius;\n this._uniformsDirty = true;\n }\n }\n\n get fresnelEnabled(): boolean {\n return this._fresnelEnabled;\n }\n set fresnelEnabled(enabled: boolean) {\n if (this._fresnelEnabled !== enabled) {\n this._fresnelEnabled = enabled;\n this._uniformsDirty = true;\n }\n }\n\n get fresnelPower(): number {\n return this._fresnelPower;\n }\n set fresnelPower(power: number) {\n if (this._fresnelPower !== power) {\n this._fresnelPower = power;\n this._uniformsDirty = true;\n }\n }\n\n get fresnelIntensity(): number {\n return this._fresnelIntensity;\n }\n set fresnelIntensity(intensity: number) {\n if (this._fresnelIntensity !== intensity) {\n this._fresnelIntensity = intensity;\n this._uniformsDirty = true;\n }\n }\n\n get fresnelColor(): string {\n return this._fresnelColor;\n }\n set fresnelColor(fresnelColor: string) {\n if (this._fresnelColor !== fresnelColor) {\n this._fresnelColor = fresnelColor;\n this._fresnelColorRgb = this._hexToRgb(fresnelColor);\n this._uniformsDirty = true;\n }\n }\n\n get iridescenceEnabled(): boolean {\n return this._iridescenceEnabled;\n }\n set iridescenceEnabled(enabled: boolean) {\n if (this._iridescenceEnabled !== enabled) {\n this._iridescenceEnabled = enabled;\n this._uniformsDirty = true;\n }\n }\n\n get iridescenceIntensity(): number {\n return this._iridescenceIntensity;\n }\n set iridescenceIntensity(intensity: number) {\n if (this._iridescenceIntensity !== intensity) {\n this._iridescenceIntensity = intensity;\n this._uniformsDirty = true;\n }\n }\n\n get iridescenceSpeed(): number {\n return this._iridescenceSpeed;\n }\n set iridescenceSpeed(speed: number) {\n if (this._iridescenceSpeed !== speed) {\n this._iridescenceSpeed = speed;\n this._uniformsDirty = true;\n }\n }\n\n get bloomIntensity(): number {\n return this._bloomIntensity;\n }\n set bloomIntensity(intensity: number) {\n if (this._bloomIntensity !== intensity) {\n this._bloomIntensity = intensity;\n this._uniformsDirty = true;\n }\n }\n\n get bloomThreshold(): number {\n return this._bloomThreshold;\n }\n set bloomThreshold(threshold: number) {\n if (this._bloomThreshold !== threshold) {\n this._bloomThreshold = threshold;\n this._uniformsDirty = true;\n }\n }\n\n get chromaticAberration(): number {\n return this._chromaticAberration;\n }\n set chromaticAberration(aberration: number) {\n if (this._chromaticAberration !== aberration) {\n this._chromaticAberration = aberration;\n this._uniformsDirty = true;\n }\n }\n\n // Getters and Setters for 3D Shapes\n get shapeType(): 'plane' | 'sphere' | 'torus' | 'cylinder' | 'ribbon' {\n return this._shapeType;\n }\n set shapeType(val: 'plane' | 'sphere' | 'torus' | 'cylinder' | 'ribbon') {\n if (this._shapeType !== val) {\n this._shapeType = val;\n this._updateGeometry();\n }\n }\n\n get shapeRotationX(): number { return this._shapeRotationX; }\n set shapeRotationX(val: number) {\n this._shapeRotationX = val;\n this._uniformsDirty = true;\n }\n\n get shapeRotationY(): number { return this._shapeRotationY; }\n set shapeRotationY(val: number) {\n this._shapeRotationY = val;\n this._uniformsDirty = true;\n }\n\n get shapeRotationZ(): number { return this._shapeRotationZ; }\n set shapeRotationZ(val: number) {\n this._shapeRotationZ = val;\n this._uniformsDirty = true;\n }\n\n get shapeAutoRotateSpeedX(): number { return this._shapeAutoRotateSpeedX; }\n set shapeAutoRotateSpeedX(val: number) {\n this._shapeAutoRotateSpeedX = val;\n this._uniformsDirty = true;\n }\n\n get shapeAutoRotateSpeedY(): number { return this._shapeAutoRotateSpeedY; }\n set shapeAutoRotateSpeedY(val: number) {\n this._shapeAutoRotateSpeedY = val;\n this._uniformsDirty = true;\n }\n\n get sphereRadius(): number { return this._sphereRadius; }\n set sphereRadius(val: number) {\n if (this._sphereRadius !== val) {\n this._sphereRadius = val;\n this._updateGeometry();\n }\n }\n\n get torusRadius(): number { return this._torusRadius; }\n set torusRadius(val: number) {\n if (this._torusRadius !== val) {\n this._torusRadius = val;\n this._updateGeometry();\n }\n }\n\n get torusTube(): number { return this._torusTube; }\n set torusTube(val: number) {\n if (this._torusTube !== val) {\n this._torusTube = val;\n this._updateGeometry();\n }\n }\n\n get cylinderRadius(): number { return this._cylinderRadius; }\n set cylinderRadius(val: number) {\n if (this._cylinderRadius !== val) {\n this._cylinderRadius = val;\n this._updateGeometry();\n }\n }\n\n get cylinderHeight(): number { return this._cylinderHeight; }\n set cylinderHeight(val: number) {\n if (this._cylinderHeight !== val) {\n this._cylinderHeight = val;\n this._updateGeometry();\n }\n }\n\n get planeBend(): number { return this._planeBend; }\n set planeBend(val: number) {\n if (this._planeBend !== val) {\n this._planeBend = val;\n this._updateGeometry();\n }\n }\n\n get planeTwist(): number { return this._planeTwist; }\n set planeTwist(val: number) {\n if (this._planeTwist !== val) {\n this._planeTwist = val;\n this._updateGeometry();\n }\n }\n\n // Camera Getters and Setters\n get cameraLock(): boolean { return this._cameraLock; }\n set cameraLock(val: boolean) {\n this._cameraLock = val;\n }\n\n get cameraX(): number { return this._cameraX; }\n set cameraX(val: number) {\n this._cameraX = val;\n this._uniformsDirty = true;\n }\n\n get cameraY(): number { return this._cameraY; }\n set cameraY(val: number) {\n this._cameraY = val;\n this._uniformsDirty = true;\n }\n\n get cameraZ(): number { return this._cameraZ; }\n set cameraZ(val: number) {\n this._cameraZ = val;\n this._uniformsDirty = true;\n }\n\n get cameraRotationX(): number { return this._cameraRotationX; }\n set cameraRotationX(val: number) {\n this._cameraRotationX = val;\n this._uniformsDirty = true;\n }\n\n get cameraRotationY(): number { return this._cameraRotationY; }\n set cameraRotationY(val: number) {\n this._cameraRotationY = val;\n this._uniformsDirty = true;\n }\n\n get cameraRotationZ(): number { return this._cameraRotationZ; }\n set cameraRotationZ(val: number) {\n this._cameraRotationZ = val;\n this._uniformsDirty = true;\n }\n\n get cameraZoom(): number { return this._cameraZoom; }\n set cameraZoom(val: number) {\n if (this._cameraZoom !== val) {\n this._cameraZoom = val;\n this._updateCameraFrustum();\n }\n }\n\n _updateCameraFrustum() {\n if (!this.glState) return;\n const gl = this.glState.gl;\n const width = this._ref.clientWidth;\n const height = this._ref.clientHeight;\n updateCamera(this.glState.camera, width, height, PLANE_WIDTH, PLANE_HEIGHT, this._shapeType, this._cameraZoom);\n\n const projLoc = this.glState.locations.uniforms[\"projectionMatrix\"];\n gl.useProgram(this.glState.program);\n if (projLoc) gl.uniformMatrix4fv(projLoc, false, this.glState.camera.projectionMatrix.elements);\n this._uniformsDirty = true;\n }\n}\n\n\nconst setLinkStyles = (link: HTMLAnchorElement) => {\n link.id = LINK_ID;\n link.href = \"https://neat.firecms.co\";\n link.target = \"_blank\";\n link.style.position = \"absolute\";\n link.style.display = \"block\";\n link.style.bottom = \"0\";\n link.style.right = \"0\";\n link.style.padding = \"10px\";\n link.style.color = \"#dcdcdc\";\n link.style.opacity = \"0.8\";\n link.style.fontFamily = \"sans-serif\";\n link.style.fontSize = \"16px\";\n link.style.fontWeight = \"bold\";\n link.style.textDecoration = \"none\";\n link.style.zIndex = \"10000\";\n link.style.pointerEvents = \"auto\";\n link.setAttribute(\"data-n\", \"1\");\n link.innerHTML = \"NEAT\";\n}\n\nconst addNeatLink = (ref: HTMLCanvasElement): HTMLAnchorElement => {\n let parent = ref.parentElement;\n // Walk up past display:contents wrappers (e.g. Astro's <astro-island>)\n // to find the real box-generating parent for positioning the link\n while (parent && getComputedStyle(parent).display === \"contents\") {\n parent = parent.parentElement;\n }\n // Ensure parent has position so absolute link is positioned relative to it\n if (parent && getComputedStyle(parent).position === \"static\") {\n parent.style.position = \"relative\";\n }\n // Search parent for existing neat link (survives HMR where LINK_ID changes)\n if (parent) {\n const existing = parent.querySelector('a[data-n]') as HTMLAnchorElement;\n if (existing) {\n setLinkStyles(existing);\n return existing;\n }\n }\n const link = document.createElement(\"a\");\n setLinkStyles(link);\n parent?.appendChild(link);\n return link;\n}\n\nfunction getElapsedSecondsInLastHour() {\n const now = new Date();\n const minutes = now.getMinutes();\n const seconds = now.getSeconds();\n return (minutes * 60) + seconds;\n}\n\nfunction generateRandomString(length: number = 6): string {\n const characters = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';\n let result = '';\n for (let i = 0; i < length; i++) {\n const randomIndex = Math.floor(Math.random() * characters.length);\n result += characters.charAt(randomIndex);\n }\n return result;\n}\n\nfunction downloadURI(uri: string, name: string) {\n const link = document.createElement(\"a\");\n link.download = name;\n link.href = uri;\n document.body.appendChild(link);\n link.click();\n document.body.removeChild(link);\n}\n\nfunction injectSEO() {\n if (document.getElementById(\"neat-seo-schema\")) return;\n\n // 1. JSON-LD Schema\n const script = document.createElement('script');\n script.id = \"neat-seo-schema\";\n script.type = 'application/ld+json';\n script.text = JSON.stringify({\n \"@context\": \"https://schema.org\",\n \"@type\": \"WebSite\",\n \"name\": \"NEAT Gradient\",\n \"url\": \"https://neat.firecms.co\",\n \"author\": {\n \"@type\": \"Organization\",\n \"name\": \"FireCMS\",\n \"url\": \"https://firecms.co\"\n },\n \"description\": \"Beautiful, fast, heavily customizable, WebGL based gradients.\"\n });\n document.head.appendChild(script);\n\n // 2. Hidden Backlink via Shadow DOM\n const hiddenContainer = document.createElement('div');\n hiddenContainer.style.position = 'absolute';\n hiddenContainer.style.width = '1px';\n hiddenContainer.style.height = '1px';\n hiddenContainer.style.padding = '0';\n hiddenContainer.style.margin = '-1px';\n hiddenContainer.style.overflow = 'hidden';\n hiddenContainer.style.clip = 'rect(0, 0, 0, 0)';\n hiddenContainer.style.whiteSpace = 'nowrap';\n hiddenContainer.style.borderWidth = '0';\n\n try {\n const shadow = hiddenContainer.attachShadow({ mode: 'closed' });\n const link = document.createElement('a');\n link.href = \"https://firecms.co\";\n link.textContent = \"FireCMS\";\n shadow.appendChild(link);\n } catch (e) {\n const link = document.createElement('a');\n link.href = \"https://firecms.co\";\n link.textContent = \"FireCMS\";\n hiddenContainer.appendChild(link);\n }\n\n document.body.appendChild(hiddenContainer);\n}\n"],"names":["vertexShaderSource","fragmentShaderSource","buildVertUniforms","buildFragUniforms","buildNoise","buildColorFunctions","Matrix4","tx","ty","tz","angle","c","s","m12","m22","m32","m42","m13","m23","m33","m43","m11","m21","m31","m41","OrthographicCamera","left","right","top","bottom","near","far","w","h","p","x","z","updateCamera","camera","width","height","planeWidth","planeHeight","shapeType","zoom","ratio","targetPlaneArea","targetWidth","targetHeight","horizontalScale","mobileZoomFactor","halfSize","generatePlaneGeometry","widthSegments","heightSegments","width_half","height_half","gridX","gridY","gridX1","gridY1","segment_width","segment_height","indices","vertices","normals","uvs","iy","y","ix","a","b","d","isLarge","wireframeIndices","i","generateSphereGeometry","radius","widthSegmentsFloor","heightSegmentsFloor","v","theta","u","phi","len","generateTorusGeometry","tube","radialSegments","tubularSegments","radialSegmentsFloor","tubularSegmentsFloor","j","cx","cy","nx","ny","nz","generateCylinderGeometry","radiusTop","radiusBottom","halfHeight","sinTheta","cosTheta","generateRibbonGeometry","bend","twist","xp","yp","zp","r","cosA","sinA","rx","rz","rnx","rnz","PLANE_WIDTH","PLANE_HEIGHT","COLORS_COUNT","LINK_ID","generateRandomString","NeatGradient","config","ref","speed","horizontalPressure","verticalPressure","waveFrequencyX","waveFrequencyY","waveAmplitude","colors","highlights","shadows","colorSaturation","colorBrightness","colorBlending","grainScale","grainIntensity","grainSparsity","grainSpeed","wireframe","backgroundColor","backgroundAlpha","resolution","seed","yOffset","yOffsetWaveMultiplier","yOffsetColorMultiplier","yOffsetFlowMultiplier","flowDistortionA","flowDistortionB","flowScale","flowEase","flowEnabled","enableProceduralTexture","textureVoidLikelihood","textureVoidWidthMin","textureVoidWidthMax","textureBandDensity","textureColorBlending","textureSeed","textureEase","proceduralBackgroundColor","transparentTextureVoid","textureShapeTriangles","textureShapeCircles","textureShapeBars","textureShapeSquiggles","domainWarpEnabled","domainWarpIntensity","domainWarpScale","vignetteIntensity","vignetteRadius","fresnelEnabled","fresnelPower","fresnelIntensity","fresnelColor","iridescenceEnabled","iridescenceIntensity","iridescenceSpeed","bloomIntensity","bloomThreshold","chromaticAberration","silhouetteFade","cylinderFade","ribbonFade","flatShading","cameraLock","cameraX","cameraY","cameraZ","cameraRotationX","cameraRotationY","cameraRotationZ","cameraZoom","shapeRotationX","shapeRotationY","shapeRotationZ","shapeAutoRotateSpeedX","shapeAutoRotateSpeedY","sphereRadius","torusRadius","torusTube","cylinderRadius","cylinderHeight","planeBend","planeTwist","injectSEO","tick","getElapsedSecondsInLastHour","lastTime","render","gl","program","locations","indexCount","indexType","addNeatLink","timeNow","modelViewMatrix","ry","mvLoc","shapeTypeVal","rgb","entries","wasVisible","setSize","projLoc","filename","dataURL","downloadURI","options","durationMs","format","onProgress","onComplete","source","offscreen","ctx","stream","videoTrack","mp4Candidates","webmCandidates","candidates","mimeType","candidate","pixels","baseBitrate","basePixels","videoBitsPerSecond","recorder","chunks","e","stopped","rafId","startTime","lastProgressTime","drawFrame","fontSize","now","isMP4","ext","blobType","finalFilename","blob","url","timeoutId","value","geometry","position","normal","uv","index","wireframeIndex","hex","bigint","positionBuffer","normalBuffer","uvBuffer","indexBuffer","wireframeIndexBuffer","vertShaderSourceCombined","vertShader","line","fragShaderSourceCombined","fragShader","aPosition","aNormal","aUv","planeWidthLoc","planeHeightLoc","colorsCountLoc","uniformsList","name","sourceCanvas","sCtx","baseSeed","random","setSeed","offset","shouldTile","dxs","dys","hexToRgb","rgbToHex","g","getInterColor","c1","c2","mix","rgb1","rgb2","baseColor","bgGrad","fillStyle","x1","y1","x2","y2","dx","dy","strokeStyle","lineWidth","rot","curves","ex","ey","curve","canvas","layoutHead","segments","seg","startX","endX","currentX","stripeWidth","sourceX","tex","max","enabled","intensity","scale","power","threshold","aberration","val","setLinkStyles","link","parent","existing","minutes","seconds","length","characters","result","randomIndex","uri","script","hiddenContainer","shadow"],"mappings":"4NAAO,MAAMA,EAAqB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,GAAAC,GAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,GAsHE,SAAAC,IAAA,CAAA,MAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,8BAAA,CAAA,SAAAC,IAAA,CAAA,MAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,8BAiOzB,CAAA,SAAAC,IAAA,CAAA,MAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAA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"}
|