precision mediump float;
uniform float u_time;
uniform vec2 u_mouse;
uniform vec2 u_resolution;
varying vec2 v_uv;
void main() {
vec2 uv = (v_uv - 0.5) * vec2(u_resolution.x / u_resolution.y, 1.0);
float pattern = sin((uv.x + uv.y) * 10.0 + u_time) * 0.5 + 0.5;
vec3 bgColor = mix(vec3(0.1, 0.05, 0.2), vec3(0.3, 0.1, 0.4), pattern);
vec2 mousePos = (u_mouse - 0.5) * vec2(u_resolution.x / u_resolution.y, 1.0);
float circleRadius = 0.15 + 0.03 * sin(u_time * 2.0);
float distToMouse = length(uv - mousePos);
float circleMask = smoothstep(circleRadius, circleRadius - 0.02, distToMouse);
vec3 circleColor = vec3(0.8, 0.5, 1.0);
vec3 colorMix = mix(bgColor, circleColor, circleMask);
float aberrationStrength = 0.005 + 0.01 * smoothstep(0.0, 0.5, distToMouse);
vec2 offsetR = vec2(aberrationStrength, 0.0);
vec2 offsetB = vec2(-aberrationStrength, 0.0);
float maskR = smoothstep(circleRadius, circleRadius - 0.02, length(uv - (mousePos + offsetR)));
float maskG = circleMask;
float maskB = smoothstep(circleRadius, circleRadius - 0.02, length(uv - (mousePos + offsetB)));
float r = mix(bgColor.r, circleColor.r, maskR);
float g = mix(bgColor.g, circleColor.g, maskG);
float b = mix(bgColor.b, circleColor.b, maskB);
vec3 finalColor = vec3(r, g, b);
gl_FragColor = vec4(finalColor, 1.0);
#include <colorspace_fragment>
}