@omnedia/ngx-particles
Version:
A simple component library to create a container with an animated background.
1 lines • 19.2 kB
Source Map (JSON)
{"version":3,"file":"omnedia-ngx-particles.mjs","sources":["../../../projects/ngx-particles/src/lib/ngx-particles.component.ts","../../../projects/ngx-particles/src/lib/ngx-particles.component.html","../../../projects/ngx-particles/src/public-api.ts","../../../projects/ngx-particles/src/omnedia-ngx-particles.ts"],"sourcesContent":["import {CommonModule, isPlatformBrowser} from \"@angular/common\";\r\nimport {\r\n AfterViewInit,\r\n ChangeDetectionStrategy,\r\n Component,\r\n ElementRef,\r\n HostListener,\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 {Circle} from \"./ngx-particles.types\";\r\n\r\n@Component({\r\n selector: \"om-particles\",\r\n standalone: true,\r\n imports: [CommonModule],\r\n templateUrl: \"./ngx-particles.component.html\",\r\n styleUrl: \"./ngx-particles.component.scss\",\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n})\r\nexport class NgxParticlesComponent implements AfterViewInit, OnDestroy {\r\n @ViewChild(\"OmParticlesCanvas\")\r\n canvasRef!: ElementRef<HTMLCanvasElement>;\r\n\r\n @ViewChild(\"OmParticlesWrapper\")\r\n wrapperRef!: ElementRef<HTMLElement>;\r\n\r\n @Input(\"quantity\")\r\n quantity = 100;\r\n\r\n @Input(\"size\")\r\n size = 0.4;\r\n\r\n @Input(\"circleColor\")\r\n color = \"#9c9c9c\";\r\n\r\n @Input(\"staticity\")\r\n staticity = 50;\r\n\r\n @Input(\"ease\")\r\n ease = 50;\r\n\r\n @Input(\"particleSpeed\")\r\n particleSpeed = 1;\r\n\r\n @Input(\"vx\")\r\n vx = 0;\r\n\r\n @Input(\"vy\")\r\n vy = 0;\r\n\r\n private mousePosition: { x: number; y: number } = {x: 0, y: 0};\r\n private mouse: { x: number; y: number } = {x: 0, y: 0};\r\n\r\n private circles: Circle[] = [];\r\n\r\n @HostListener(\"mousemove\", [\"$event\"])\r\n onClick(event: MouseEvent) {\r\n this.mousePosition = {\r\n x: event.clientX,\r\n y: event.clientY,\r\n };\r\n\r\n this.onMouseMove();\r\n }\r\n\r\n private isInView = signal(false);\r\n private isAnimating = signal(false);\r\n private animationFrameId?: number;\r\n private intersectionObserver?: IntersectionObserver;\r\n\r\n constructor(\r\n @Inject(PLATFORM_ID) private platformId: object\r\n ) {\r\n }\r\n\r\n ngAfterViewInit(): void {\r\n this.setCanvasSize();\r\n this.animate();\r\n\r\n if (isPlatformBrowser(this.platformId)) {\r\n this.intersectionObserver = new IntersectionObserver(([entry]) => {\r\n this.renderContents(entry.isIntersecting);\r\n });\r\n this.intersectionObserver.observe(this.canvasRef.nativeElement);\r\n }\r\n\r\n window.addEventListener(\"resize\", () => this.setCanvasSize());\r\n }\r\n\r\n ngOnDestroy(): void {\r\n window.removeEventListener(\"resize\", () => this.setCanvasSize());\r\n\r\n if (this.intersectionObserver) {\r\n this.intersectionObserver.disconnect();\r\n }\r\n\r\n if (this.animationFrameId) {\r\n cancelAnimationFrame(this.animationFrameId);\r\n }\r\n }\r\n\r\n renderContents(isIntersecting: boolean) {\r\n if (isIntersecting && !this.isInView()) {\r\n this.isInView.set(true);\r\n\r\n if (!this.isAnimating()) {\r\n this.animationFrameId = requestAnimationFrame(() => this.animate());\r\n }\r\n } else if (!isIntersecting) {\r\n this.isInView.set(false);\r\n }\r\n }\r\n\r\n private setCanvasSize(): void {\r\n this.canvasRef.nativeElement.width =\r\n this.wrapperRef.nativeElement.getBoundingClientRect().width;\r\n this.canvasRef.nativeElement.height =\r\n this.wrapperRef.nativeElement.getBoundingClientRect().height;\r\n\r\n this.circles = [];\r\n this.drawParticles();\r\n }\r\n\r\n private drawParticles(): void {\r\n this.clearContext();\r\n\r\n for (let i = 0; i < this.quantity; i++) {\r\n const circle = this.circleParams();\r\n this.drawCircle(circle);\r\n }\r\n }\r\n\r\n private circleParams(): Circle {\r\n const x = Math.floor(Math.random() * this.canvasRef.nativeElement.width);\r\n const y = Math.floor(Math.random() * this.canvasRef.nativeElement.height);\r\n const translateX = 0;\r\n const translateY = 0;\r\n const pSize = Math.floor(Math.random() * 2) + this.size;\r\n const alpha = 0;\r\n const targetAlpha = parseFloat((Math.random() * 0.6 + 0.1).toFixed(1));\r\n const dx = (Math.random() - 0.5) * 0.1;\r\n const dy = (Math.random() - 0.5) * 0.1;\r\n const magnetism = 0.1 + Math.random() * 4;\r\n\r\n return {\r\n x,\r\n y,\r\n translateX,\r\n translateY,\r\n size: pSize,\r\n alpha,\r\n targetAlpha,\r\n dx,\r\n dy,\r\n magnetism,\r\n };\r\n }\r\n\r\n private drawCircle(circle: Circle, update = false): void {\r\n const context = this.canvasRef.nativeElement.getContext(\"2d\");\r\n\r\n if (!context) {\r\n return;\r\n }\r\n\r\n const {x, y, translateX, translateY, size, alpha} = circle;\r\n const rgb = this.hexToRgb(this.color);\r\n\r\n context.translate(translateX, translateY);\r\n context.beginPath();\r\n context.arc(x, y, size, 0, 2 * Math.PI);\r\n context.fillStyle = `rgba(${rgb.join(\", \")}, ${alpha})`;\r\n context.fill();\r\n context.setTransform(1, 0, 0, 1, 0, 0);\r\n\r\n if (!update) {\r\n this.circles.push(circle);\r\n }\r\n }\r\n\r\n private animate(): void {\r\n if (!this.isInView()) {\r\n this.isAnimating.set(false);\r\n return;\r\n }\r\n\r\n this.isAnimating.set(true);\r\n\r\n this.clearContext();\r\n\r\n this.circles.forEach((circle: Circle, i: number) => {\r\n // Handle the alpha value\r\n const edge = [\r\n circle.x + circle.translateX - circle.size, // distance from left edge\r\n this.canvasRef.nativeElement.width -\r\n circle.x -\r\n circle.translateX -\r\n circle.size, // distance from right edge\r\n circle.y + circle.translateY - circle.size, // distance from top edge\r\n this.canvasRef.nativeElement.height -\r\n circle.y -\r\n circle.translateY -\r\n circle.size, // distance from bottom edge\r\n ];\r\n\r\n const closestEdge = edge.reduce((a, b) => Math.min(a, b));\r\n const remapClosestEdge = parseFloat(\r\n this.remapValue(closestEdge, 0, 20, 0, 1).toFixed(2)\r\n );\r\n\r\n if (remapClosestEdge > 1) {\r\n circle.alpha += 0.02;\r\n if (circle.alpha > circle.targetAlpha) {\r\n circle.alpha = circle.targetAlpha;\r\n }\r\n } else {\r\n circle.alpha = circle.targetAlpha * remapClosestEdge;\r\n }\r\n\r\n circle.x += (circle.dx + this.vx) * this.particleSpeed;\r\n circle.y += (circle.dy + this.vy) * this.particleSpeed;\r\n circle.translateX +=\r\n (this.mouse.x / (this.staticity / circle.magnetism) -\r\n circle.translateX) /\r\n this.ease;\r\n circle.translateY +=\r\n (this.mouse.y / (this.staticity / circle.magnetism) -\r\n circle.translateY) /\r\n this.ease;\r\n\r\n this.drawCircle(circle, true);\r\n\r\n // circle gets out of the canvas\r\n if (\r\n circle.x < -circle.size ||\r\n circle.x > this.canvasRef.nativeElement.width + circle.size ||\r\n circle.y < -circle.size ||\r\n circle.y > this.canvasRef.nativeElement.height + circle.size\r\n ) {\r\n // remove the circle from the array\r\n this.circles.splice(i, 1);\r\n // create a new circle\r\n const newCircle = this.circleParams();\r\n this.drawCircle(newCircle);\r\n // update the circle position\r\n }\r\n });\r\n\r\n this.animationFrameId = requestAnimationFrame(() => this.animate());\r\n }\r\n\r\n private clearContext(): void {\r\n const context = this.canvasRef.nativeElement.getContext(\"2d\");\r\n\r\n if (!context) {\r\n return;\r\n }\r\n\r\n context.clearRect(\r\n 0,\r\n 0,\r\n this.canvasRef.nativeElement.width,\r\n this.canvasRef.nativeElement.height\r\n );\r\n }\r\n\r\n private onMouseMove(): void {\r\n const rect = this.canvasRef.nativeElement.getBoundingClientRect();\r\n const {w, h} = {\r\n w: this.canvasRef.nativeElement.width,\r\n h: this.canvasRef.nativeElement.height,\r\n };\r\n\r\n const x = this.mousePosition.x - rect.left - w / 2;\r\n const y = this.mousePosition.y - rect.top - h / 2;\r\n\r\n const inside = x < w / 2 && x > -w / 2 && y < h / 2 && y > -h / 2;\r\n\r\n if (inside) {\r\n this.mouse = {x: x, y: y};\r\n }\r\n }\r\n\r\n private remapValue(\r\n value: number,\r\n start1: number,\r\n end1: number,\r\n start2: number,\r\n end2: number\r\n ): number {\r\n const remapped =\r\n ((value - start1) * (end2 - start2)) / (end1 - start1) + start2;\r\n\r\n return remapped > 0 ? remapped : 0;\r\n }\r\n\r\n private hexToRgb(hex: string): number[] {\r\n hex = hex.replace(\"#\", \"\");\r\n\r\n if (hex.length === 3) {\r\n hex = hex\r\n .split(\"\")\r\n .map((char) => char + char)\r\n .join(\"\");\r\n }\r\n\r\n const hexInt = parseInt(hex, 16);\r\n const red = (hexInt >> 16) & 255;\r\n const green = (hexInt >> 8) & 255;\r\n const blue = hexInt & 255;\r\n return [red, green, blue];\r\n }\r\n}\r\n","<div class=\"om-particles\" #OmParticlesWrapper>\r\n <div class=\"om-particles-background\">\r\n <canvas #OmParticlesCanvas></canvas>\r\n </div>\r\n\r\n <ng-content></ng-content>\r\n</div>\r\n","/*\r\n * Public API Surface of ngx-particles\r\n */\r\n\r\nexport * from \"./lib/ngx-particles.component\";\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}