{
	"$schema": "https://ui.shadcn.com/schema/registry-item.json",
	"name": "Aurora-JS-CSS",
	"title": "Aurora",
	"description": "Flowing aurora gradient background.",
	"type": "registry:component",
	"files": [
		{
			"type": "registry:component",
			"path": "Aurora/Aurora.css",
			"content": ".aurora-container {\n  width: 100%;\n  height: 100%;\n}\n"
		},
		{
			"type": "registry:component",
			"path": "Aurora/Aurora.jsx",
			"content": "import { Renderer, Program, Mesh, Color, Triangle } from 'ogl';\nimport { useEffect, useRef } from 'react';\n\nimport './Aurora.css';\n\nconst VERT = `#version 300 es\nin vec2 position;\nvoid main() {\n  gl_Position = vec4(position, 0.0, 1.0);\n}\n`;\n\nconst FRAG = `#version 300 es\nprecision highp float;\n\nuniform float uTime;\nuniform float uAmplitude;\nuniform vec3 uColorStops[3];\nuniform vec2 uResolution;\nuniform float uBlend;\n\nout vec4 fragColor;\n\nvec3 permute(vec3 x) {\n  return mod(((x * 34.0) + 1.0) * x, 289.0);\n}\n\nfloat snoise(vec2 v){\n  const vec4 C = vec4(\n      0.211324865405187, 0.366025403784439,\n      -0.577350269189626, 0.024390243902439\n  );\n  vec2 i  = floor(v + dot(v, C.yy));\n  vec2 x0 = v - i + dot(i, C.xx);\n  vec2 i1 = (x0.x > x0.y) ? vec2(1.0, 0.0) : vec2(0.0, 1.0);\n  vec4 x12 = x0.xyxy + C.xxzz;\n  x12.xy -= i1;\n  i = mod(i, 289.0);\n\n  vec3 p = permute(\n      permute(i.y + vec3(0.0, i1.y, 1.0))\n    + i.x + vec3(0.0, i1.x, 1.0)\n  );\n\n  vec3 m = max(\n      0.5 - vec3(\n          dot(x0, x0),\n          dot(x12.xy, x12.xy),\n          dot(x12.zw, x12.zw)\n      ), \n      0.0\n  );\n  m = m * m;\n  m = m * m;\n\n  vec3 x = 2.0 * fract(p * C.www) - 1.0;\n  vec3 h = abs(x) - 0.5;\n  vec3 ox = floor(x + 0.5);\n  vec3 a0 = x - ox;\n  m *= 1.79284291400159 - 0.85373472095314 * (a0*a0 + h*h);\n\n  vec3 g;\n  g.x  = a0.x  * x0.x  + h.x  * x0.y;\n  g.yz = a0.yz * x12.xz + h.yz * x12.yw;\n  return 130.0 * dot(m, g);\n}\n\nstruct ColorStop {\n  vec3 color;\n  float position;\n};\n\n#define COLOR_RAMP(colors, factor, finalColor) {              \\\n  int index = 0;                                            \\\n  for (int i = 0; i < 2; i++) {                               \\\n     ColorStop currentColor = colors[i];                    \\\n     bool isInBetween = currentColor.position <= factor;    \\\n     index = int(mix(float(index), float(i), float(isInBetween))); \\\n  }                                                         \\\n  ColorStop currentColor = colors[index];                   \\\n  ColorStop nextColor = colors[index + 1];                  \\\n  float range = nextColor.position - currentColor.position; \\\n  float lerpFactor = (factor - currentColor.position) / range; \\\n  finalColor = mix(currentColor.color, nextColor.color, lerpFactor); \\\n}\n\nvoid main() {\n  vec2 uv = gl_FragCoord.xy / uResolution;\n  \n  ColorStop colors[3];\n  colors[0] = ColorStop(uColorStops[0], 0.0);\n  colors[1] = ColorStop(uColorStops[1], 0.5);\n  colors[2] = ColorStop(uColorStops[2], 1.0);\n  \n  vec3 rampColor;\n  COLOR_RAMP(colors, uv.x, rampColor);\n  \n  float height = snoise(vec2(uv.x * 2.0 + uTime * 0.1, uTime * 0.25)) * 0.5 * uAmplitude;\n  height = exp(height);\n  height = (uv.y * 2.0 - height + 0.2);\n  float intensity = 0.6 * height;\n  \n  float midPoint = 0.20;\n  float auroraAlpha = smoothstep(midPoint - uBlend * 0.5, midPoint + uBlend * 0.5, intensity);\n  \n  vec3 auroraColor = intensity * rampColor;\n  \n  fragColor = vec4(auroraColor * auroraAlpha, auroraAlpha);\n}\n`;\n\nexport default function Aurora(props) {\n  const { colorStops = ['#5227FF', '#7cff67', '#5227FF'], amplitude = 1.0, blend = 0.5 } = props;\n  const propsRef = useRef(props);\n  propsRef.current = props;\n\n  const ctnDom = useRef(null);\n\n  useEffect(() => {\n    const ctn = ctnDom.current;\n    if (!ctn) return;\n\n    const renderer = new Renderer({\n      alpha: true,\n      premultipliedAlpha: true,\n      antialias: true\n    });\n    const gl = renderer.gl;\n    gl.clearColor(0, 0, 0, 0);\n    gl.enable(gl.BLEND);\n    gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA);\n    gl.canvas.style.backgroundColor = 'transparent';\n\n    let program;\n\n    function resize() {\n      if (!ctn) return;\n      const width = ctn.offsetWidth;\n      const height = ctn.offsetHeight;\n      renderer.setSize(width, height);\n      if (program) {\n        program.uniforms.uResolution.value = [width, height];\n      }\n    }\n    window.addEventListener('resize', resize);\n\n    const geometry = new Triangle(gl);\n    if (geometry.attributes.uv) {\n      delete geometry.attributes.uv;\n    }\n\n    const colorStopsArray = colorStops.map(hex => {\n      const c = new Color(hex);\n      return [c.r, c.g, c.b];\n    });\n\n    program = new Program(gl, {\n      vertex: VERT,\n      fragment: FRAG,\n      uniforms: {\n        uTime: { value: 0 },\n        uAmplitude: { value: amplitude },\n        uColorStops: { value: colorStopsArray },\n        uResolution: { value: [ctn.offsetWidth, ctn.offsetHeight] },\n        uBlend: { value: blend }\n      }\n    });\n\n    const mesh = new Mesh(gl, { geometry, program });\n    ctn.appendChild(gl.canvas);\n\n    let animateId = 0;\n    const update = t => {\n      animateId = requestAnimationFrame(update);\n      const { time = t * 0.01, speed = 1.0 } = propsRef.current;\n      program.uniforms.uTime.value = time * speed * 0.1;\n      program.uniforms.uAmplitude.value = propsRef.current.amplitude ?? 1.0;\n      program.uniforms.uBlend.value = propsRef.current.blend ?? blend;\n      const stops = propsRef.current.colorStops ?? colorStops;\n      program.uniforms.uColorStops.value = stops.map(hex => {\n        const c = new Color(hex);\n        return [c.r, c.g, c.b];\n      });\n      renderer.render({ scene: mesh });\n    };\n    animateId = requestAnimationFrame(update);\n\n    resize();\n\n    return () => {\n      cancelAnimationFrame(animateId);\n      window.removeEventListener('resize', resize);\n      if (ctn && gl.canvas.parentNode === ctn) {\n        ctn.removeChild(gl.canvas);\n      }\n      gl.getExtension('WEBGL_lose_context')?.loseContext();\n    };\n    // eslint-disable-next-line react-hooks/exhaustive-deps\n  }, [amplitude]);\n\n  return <div ref={ctnDom} className=\"aurora-container\" />;\n}\n"
		}
	],
	"registryDependencies": [],
	"dependencies": [
		"ogl@^1.0.11"
	]
}