{"version":3,"file":"omnedia-ngx-light-rays.mjs","sources":["../../../projects/ngx-light-rays/src/lib/ngx-light-rays.component.ts","../../../projects/ngx-light-rays/src/lib/ngx-light-rays.component.html","../../../projects/ngx-light-rays/src/public-api.ts","../../../projects/ngx-light-rays/src/omnedia-ngx-light-rays.ts"],"sourcesContent":["import {\r\n  AfterViewInit,\r\n  Component,\r\n  ElementRef,\r\n  Inject,\r\n  Input,\r\n  OnDestroy,\r\n  PLATFORM_ID,\r\n  signal,\r\n  ViewChild,\r\n} from '@angular/core';\r\nimport {CommonModule, isPlatformBrowser} from '@angular/common';\r\nimport {Mesh, Program, Renderer, Triangle} from 'ogl';\r\nimport {RaysOrigin} from './ngx-light-rays.types';\r\n\r\n@Component({\r\n  selector: 'om-light-rays',\r\n  imports: [CommonModule],\r\n  templateUrl: './ngx-light-rays.component.html',\r\n  styleUrl: './ngx-light-rays.component.scss',\r\n  standalone: true,\r\n})\r\nexport class NgxLightRaysComponent implements AfterViewInit, OnDestroy {\r\n  @ViewChild('container', {static: true}) containerRef!: ElementRef<HTMLDivElement>;\r\n\r\n  @Input() raysOrigin: RaysOrigin = 'top-center';\r\n  @Input() raysColor: string = '#ffffff';\r\n  @Input() raysSpeed = 1;\r\n  @Input() lightSpread = 1;\r\n  @Input() rayLength = 2;\r\n  @Input() pulsating = false;\r\n  @Input() fadeDistance = 1.0;\r\n  @Input() saturation = 1.0;\r\n  @Input() followMouse = false;\r\n  @Input() mouseInfluence = 0.1;\r\n  @Input() noiseAmount = 0.0;\r\n  @Input() distortion = 0.0;\r\n  @Input() styleClass?: string;\r\n\r\n  private renderer?: Renderer;\r\n  private program?: Program;\r\n  private mesh?: Mesh;\r\n  private animationId: number | null = null;\r\n  private intersectionObserver?: IntersectionObserver;\r\n\r\n  private uniforms: any | null = null;\r\n\r\n  private mouse = {x: 0.5, y: 0.5};\r\n  private smoothMouse = {x: 0.5, y: 0.5};\r\n  private mouseMoveHandler?: (e: MouseEvent) => void;\r\n\r\n  isInView = signal(false);\r\n\r\n  constructor(@Inject(PLATFORM_ID) private platformId: object) {\r\n  }\r\n\r\n  private readonly vert = `\r\nattribute vec2 position;\r\nvarying vec2 vUv;\r\nvoid main() {\r\n  vUv = position * 0.5 + 0.5;\r\n  gl_Position = vec4(position, 0.0, 1.0);\r\n}\r\n`;\r\n\r\n  private readonly frag = `\r\n  precision highp float;\r\n  uniform float iTime;\r\n  uniform vec2  iResolution;\r\n  uniform vec2  rayPos;\r\n  uniform vec2  rayDir;\r\n  uniform vec3  raysColor;\r\n  uniform float raysSpeed;\r\n  uniform float lightSpread;\r\n  uniform float rayLength;\r\n  uniform float pulsating;\r\n  uniform float fadeDistance;\r\n  uniform float saturation;\r\n  uniform vec2  mousePos;\r\n  uniform float mouseInfluence;\r\n  uniform float noiseAmount;\r\n  uniform float distortion;\r\n\r\n  varying vec2 vUv;\r\n\r\n  float noise(vec2 st) {\r\n    return fract(sin(dot(st.xy, vec2(12.9898,78.233))) * 43758.5453123);\r\n  }\r\n\r\n  float rayStrength(vec2 raySource, vec2 rayRefDirection, vec2 coord,\r\n                    float seedA, float seedB, float speed) {\r\n    vec2 sourceToCoord = coord - raySource;\r\n    vec2 dirNorm = normalize(sourceToCoord);\r\n    float cosAngle = dot(dirNorm, rayRefDirection);\r\n\r\n    float distortedAngle = cosAngle + distortion * sin(iTime * 2.0 + length(sourceToCoord) * 0.01) * 0.2;\r\n\r\n    float spreadFactor = pow(max(distortedAngle, 0.0), 1.0 / max(lightSpread, 0.001));\r\n\r\n    float distance = length(sourceToCoord);\r\n    float unit = max(iResolution.x, iResolution.y);\r\n    float maxDistance  = unit * rayLength;\r\n    float lengthFalloff = clamp((maxDistance - distance) / maxDistance, 0.0, 1.0);\r\n\r\n    float fadeMax   = unit * fadeDistance;\r\n    float fadeFalloff = clamp((fadeMax - distance) / fadeMax, 0.5, 1.0);\r\n\r\n    float pulse = pulsating > 0.5 ? (0.8 + 0.2 * sin(iTime * speed * 3.0)) : 1.0;\r\n\r\n    float baseStrength = clamp(\r\n      (0.45 + 0.15 * sin(distortedAngle * seedA + iTime * speed)) +\r\n      (0.3 + 0.2 * cos(-distortedAngle * seedB + iTime * speed)),\r\n      0.0, 1.0\r\n    );\r\n\r\n    return baseStrength * lengthFalloff * fadeFalloff * spreadFactor * pulse;\r\n  }\r\n\r\n  void mainImage(out vec4 fragColor, in vec2 fragCoord) {\r\n    vec2 coord = vec2(fragCoord.x, iResolution.y - fragCoord.y);\r\n\r\n    vec2 finalRayDir = rayDir;\r\n    if (mouseInfluence > 0.0) {\r\n      vec2 mouseScreenPos = mousePos * iResolution.xy;\r\n      vec2 mouseDirection = normalize(mouseScreenPos - rayPos);\r\n      finalRayDir = normalize(mix(rayDir, mouseDirection, mouseInfluence));\r\n    }\r\n\r\n    vec4 rays1 = vec4(1.0) * rayStrength(rayPos, finalRayDir, coord, 36.2214, 21.11349, 1.5 * raysSpeed);\r\n    vec4 rays2 = vec4(1.0) * rayStrength(rayPos, finalRayDir, coord, 22.3991, 18.0234, 1.1 * raysSpeed);\r\n\r\n    fragColor = rays1 * 0.5 + rays2 * 0.4;\r\n\r\n    if (noiseAmount > 0.0) {\r\n      float n = noise(coord * 0.01 + iTime * 0.1);\r\n      fragColor.rgb *= (1.0 - noiseAmount + noiseAmount * n);\r\n    }\r\n\r\n    vec2 rayN = normalize(finalRayDir);\r\n    float coordAlong = dot(coord - rayPos, rayN);\r\n    float extent = iResolution.x * rayLength;\r\n    float brightness = clamp(1.0 - coordAlong / extent, 0.0, 1.0);\r\n\r\n    fragColor.x *= 0.1 + brightness * 0.8;\r\n    fragColor.y *= 0.3 + brightness * 0.6;\r\n    fragColor.z *= 0.5 + brightness * 0.5;\r\n\r\n    if (saturation != 1.0) {\r\n      float gray = dot(fragColor.rgb, vec3(0.299, 0.587, 0.114));\r\n      fragColor.rgb = mix(vec3(gray), fragColor.rgb, saturation);\r\n    }\r\n\r\n    fragColor.rgb *= raysColor;\r\n  }\r\n\r\n  void main() {\r\n    vec4 color;\r\n    mainImage(color, gl_FragCoord.xy);\r\n    gl_FragColor = color;\r\n  }\r\n`;\r\n\r\n  ngAfterViewInit(): void {\r\n    if (!isPlatformBrowser(this.platformId)) return;\r\n\r\n    const container = this.containerRef.nativeElement;\r\n\r\n    this.intersectionObserver = new IntersectionObserver(\r\n      ([entry]) => {\r\n        this.isInView.set(entry.isIntersecting);\r\n        if (entry.isIntersecting) this.initAndStart();\r\n        else this.stopAndCleanup();\r\n      },\r\n      {threshold: 0.1}\r\n    );\r\n    this.intersectionObserver.observe(container);\r\n  }\r\n\r\n  private initAndStart() {\r\n    this.stopAndCleanup();\r\n\r\n    const container = this.containerRef.nativeElement;\r\n\r\n    this.renderer = new Renderer({\r\n      dpr: Math.min(window.devicePixelRatio, 2),\r\n      alpha: true,\r\n    });\r\n\r\n    const gl = this.renderer.gl;\r\n    gl.canvas.style.width = '100%';\r\n    gl.canvas.style.height = '100%';\r\n\r\n    while (container.firstChild) container.removeChild(container.firstChild);\r\n    container.appendChild(gl.canvas);\r\n\r\n    this.uniforms = {\r\n      iTime: {value: 0},\r\n      iResolution: {value: [1, 1]},\r\n\r\n      rayPos: {value: [0, 0]},\r\n      rayDir: {value: [0, 1]},\r\n\r\n      raysColor: {value: this.hexToRgb(this.raysColor)},\r\n      raysSpeed: {value: this.raysSpeed},\r\n      lightSpread: {value: this.lightSpread},\r\n      rayLength: {value: this.rayLength},\r\n      pulsating: {value: this.pulsating ? 1.0 : 0.0},\r\n      fadeDistance: {value: this.fadeDistance},\r\n      saturation: {value: this.saturation},\r\n      mousePos: {value: [0.5, 0.5]},\r\n      mouseInfluence: {value: this.mouseInfluence},\r\n      noiseAmount: {value: this.noiseAmount},\r\n      distortion: {value: this.distortion},\r\n    };\r\n\r\n    const geometry = new Triangle(gl);\r\n    this.program = new Program(gl, {\r\n      vertex: this.vert,\r\n      fragment: this.frag,\r\n      uniforms: this.uniforms,\r\n    });\r\n    this.mesh = new Mesh(gl, {geometry, program: this.program});\r\n\r\n    const updatePlacement = () => {\r\n      if (!this.renderer || !this.uniforms) return;\r\n      this.renderer.dpr = Math.min(window.devicePixelRatio, 2);\r\n      const wCSS = container.clientWidth;\r\n      const hCSS = container.clientHeight;\r\n      this.renderer.setSize(wCSS, hCSS);\r\n      const dpr = this.renderer.dpr;\r\n      const w = wCSS * dpr;\r\n      const h = hCSS * dpr;\r\n      this.uniforms.iResolution.value = [w, h];\r\n\r\n      const {anchor, dir} = this.getAnchorAndDir(this.raysOrigin, w, h);\r\n      this.uniforms.rayPos.value = anchor;\r\n      this.uniforms.rayDir.value = dir;\r\n    };\r\n\r\n    window.addEventListener('resize', updatePlacement);\r\n    this._cleanupFns.push(() => window.removeEventListener('resize', updatePlacement));\r\n    updatePlacement();\r\n\r\n    if (this.followMouse) {\r\n      this.mouseMoveHandler = (e: MouseEvent) => {\r\n        const rect = container.getBoundingClientRect();\r\n        const x = (e.clientX - rect.left) / rect.width;\r\n        const y = (e.clientY - rect.top) / rect.height;\r\n        this.mouse = {x, y};\r\n      };\r\n      window.addEventListener('mousemove', this.mouseMoveHandler);\r\n      this._cleanupFns.push(() => {\r\n        if (this.mouseMoveHandler) window.removeEventListener('mousemove', this.mouseMoveHandler);\r\n      });\r\n    }\r\n\r\n    const loop = (t: number) => {\r\n      if (!this.renderer || !this.program || !this.mesh || !this.uniforms) return;\r\n\r\n      this.uniforms.iTime.value = t * 0.001;\r\n\r\n      if (this.followMouse && this.mouseInfluence > 0.0) {\r\n        const smoothing = 0.92;\r\n        this.smoothMouse.x = this.smoothMouse.x * smoothing + this.mouse.x * (1 - smoothing);\r\n        this.smoothMouse.y = this.smoothMouse.y * smoothing + this.mouse.y * (1 - smoothing);\r\n        this.uniforms.mousePos.value = [this.smoothMouse.x, this.smoothMouse.y];\r\n      }\r\n\r\n      this.uniforms.raysColor.value = this.hexToRgb(this.raysColor);\r\n      this.uniforms.raysSpeed.value = this.raysSpeed;\r\n      this.uniforms.lightSpread.value = this.lightSpread;\r\n      this.uniforms.rayLength.value = this.rayLength;\r\n      this.uniforms.pulsating.value = this.pulsating ? 1.0 : 0.0;\r\n      this.uniforms.fadeDistance.value = this.fadeDistance;\r\n      this.uniforms.saturation.value = this.saturation;\r\n      this.uniforms.mouseInfluence.value = this.mouseInfluence;\r\n      this.uniforms.noiseAmount.value = this.noiseAmount;\r\n      this.uniforms.distortion.value = this.distortion;\r\n\r\n      try {\r\n        this.renderer.render({scene: this.mesh});\r\n        this.animationId = requestAnimationFrame(loop);\r\n      } catch (err) {\r\n        this.animationId && cancelAnimationFrame(this.animationId);\r\n        this.animationId = null;\r\n      }\r\n    };\r\n\r\n    this.animationId = requestAnimationFrame(loop);\r\n  }\r\n\r\n  private stopAndCleanup() {\r\n    if (this.animationId) {\r\n      cancelAnimationFrame(this.animationId);\r\n      this.animationId = null;\r\n    }\r\n\r\n    if (this.mouseMoveHandler) {\r\n      window.removeEventListener('mousemove', this.mouseMoveHandler);\r\n      this.mouseMoveHandler = undefined;\r\n    }\r\n\r\n    this._cleanupFns.splice(0).forEach((fn) => fn());\r\n\r\n    if (this.renderer) {\r\n      try {\r\n        const loseCtx = this.renderer.gl.getExtension('WEBGL_lose_context');\r\n        loseCtx?.loseContext();\r\n        const canvas = this.renderer.gl.canvas;\r\n        canvas?.parentNode?.removeChild(canvas);\r\n      } catch {\r\n      }\r\n    }\r\n\r\n    this.mesh = undefined;\r\n    this.program = undefined;\r\n    this.renderer = undefined;\r\n    this.uniforms = null;\r\n  }\r\n\r\n  ngOnDestroy(): void {\r\n    this.intersectionObserver?.disconnect();\r\n    this.stopAndCleanup();\r\n  }\r\n\r\n  private hexToRgb(hex: string): [number, number, number] {\r\n    const m = /^#?([a-f\\d]{2})([a-f\\d]{2})([a-f\\d]{2})$/i.exec(hex);\r\n    return m\r\n      ? [\r\n        parseInt(m[1], 16) / 255,\r\n        parseInt(m[2], 16) / 255,\r\n        parseInt(m[3], 16) / 255,\r\n      ]\r\n      : [1, 1, 1];\r\n  }\r\n\r\n  private getAnchorAndDir(\r\n    origin: RaysOrigin,\r\n    w: number,\r\n    h: number\r\n  ): { anchor: [number, number]; dir: [number, number] } {\r\n    const outside = 0.2;\r\n    switch (origin) {\r\n      case 'top-left':\r\n        return {anchor: [0, -outside * h], dir: [0, 1]};\r\n      case 'top-right':\r\n        return {anchor: [w, -outside * h], dir: [0, 1]};\r\n      case 'left':\r\n        return {anchor: [-outside * w, 0.5 * h], dir: [1, 0]};\r\n      case 'right':\r\n        return {anchor: [(1 + outside) * w, 0.5 * h], dir: [-1, 0]};\r\n      case 'bottom-left':\r\n        return {anchor: [0, (1 + outside) * h], dir: [0, -1]};\r\n      case 'bottom-center':\r\n        return {anchor: [0.5 * w, (1 + outside) * h], dir: [0, -1]};\r\n      case 'bottom-right':\r\n        return {anchor: [w, (1 + outside) * h], dir: [0, -1]};\r\n      default: // 'top-center'\r\n        return {anchor: [0.5 * w, -outside * h], dir: [0, 1]};\r\n    }\r\n  }\r\n\r\n  private _cleanupFns: Array<() => void> = [];\r\n}\r\n","<div class=\"om-light-rays\">\n  <div #container class=\"om-light-rays-background\" [ngClass]=\"styleClass\"></div>\n  <div class=\"content-inside\">\n    <ng-content></ng-content>\n  </div>\n</div>\n","/*\r\n * Public API Surface of ngx-light-rays\r\n */\r\n\r\nexport * from './lib/ngx-light-rays.component';\r\nexport * from './lib/ngx-light-rays.types';\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}