Description
Details
Details
Description:
I'm encountering an error with particle rendering in an Angular 18 environment. Despite having the error, the particles are rendering, but it would be nicer not having that error
Steps to Reproduce:
Set up an Angular 18 project environment.
Integrate particle rendering functionality.
Environment:
Angular CLI: 18.0.2
Node: 18.19.33
TS 5.4.5
OS: macOS x64
Angular: 17.3.0
... animations, cdk, common, compiler, compiler-cli, core, forms
... material, platform-browser, platform-browser-dynamic, router
Package Version
@angular-devkit/build-angular@18.0.2
@angular/animations@18.0.1
@angular/cli@18.0.2
@angular/common@18.0.1
@angular/compiler-cli@18.0.1
@angular/compiler@18.0.1
@angular/core@18.0.1
@angular/forms@18.0.1
@angular/platform-browser-dynamic@18.0.1
@angular/platform-browser@18.0.1
@angular/platform-server@18.0.1
@angular/router@18.0.1
@angular/ssr@18.0.2
Particle rendering library/version: @tsparticles/angular
Additional Information:
These are the libraries and versions used:
@tsparticles/angular@3.0.0
@tsparticles/engine@3.4.0
@tsparticles/slim@3.4.0
My component:
import { AfterViewInit, Component, Inject, PLATFORM_ID } from '@angular/core';
import {
MoveDirection,
OutMode,
CollisionMode,
LimitMode,
DestroyType,
AnimationMode,
StartValueType,
InteractivityDetect,
DivType,
PixelMode,
Move,
} from '@tsparticles/engine';
import { NgParticlesService, NgxParticlesModule } from '@tsparticles/angular';
import { loadSlim } from '@tsparticles/slim';
import { isPlatformBrowser } from '@angular/common';
@Component({
selector: 'app-home',
standalone: true,
imports: [NgxParticlesModule],
templateUrl: './home.component.html',
styleUrls: ['./home.component.scss'],
})
export class HomeComponent implements AfterViewInit {
id = 'tsparticles';
particlesOptions = {
autoPlay: true,
background: {
color: {
value: '#11294D',
},
opacity: 1,
},
clear: true,
delay: 0,
fullScreen: {
enable: true,
zIndex: 0,
},
detectRetina: true,
duration: 0,
fpsLimit: 120,
interactivity: {
detectsOn: InteractivityDetect.window,
events: {
onClick: {
enable: false,
mode: 'push',
},
onDiv: {
enable: false,
type: DivType.circle,
},
onHover: {
enable: true,
mode: 'bubble',
parallax: {
enable: false,
force: 2,
smooth: 10,
},
},
resize: {
delay: 0.5,
enable: true,
},
},
modes: {
trail: {
delay: 1,
pauseOnStop: false,
quantity: 1,
},
attract: {
distance: 200,
duration: 0.4,
easing: 'ease-out-quad',
factor: 1,
maxSpeed: 30,
speed: 0.3,
},
bounce: {
distance: 200,
},
bubble: {
distance: 400,
duration: 2,
mix: true,
opacity: 0.8,
color: {
value: '#ff0000',
},
size: 40,
divs: {
distance: 200,
duration: 0.4,
mix: false,
},
},
connect: {
distance: 80,
links: {
opacity: 0.5,
},
radius: 60,
},
grab: {
distance: 400,
links: {
blink: false,
consent: false,
opacity: 1,
},
},
push: {
default: true,
quantity: 4,
},
remove: {
quantity: 2,
},
repulse: {
distance: 200,
duration: 0.4,
factor: 100,
speed: 1,
maxSpeed: 30,
easing: 'ease-out-quad',
divs: {
distance: 200,
duration: 0.4,
factor: 100,
speed: 1,
maxSpeed: 30,
easing: 'ease-out-quad',
selectors: {},
},
},
slow: {
factor: 3,
radius: 200,
},
light: {
area: {
gradient: {
start: {
value: '#ffffff',
},
stop: {
value: '#000000',
},
},
radius: 1000,
},
shadow: {
color: {
value: '#000000',
},
length: 2000,
},
},
},
},
particles: {
bounce: {
horizontal: {
value: 1,
},
vertical: {
value: 1,
},
},
collisions: {
absorb: {
speed: 2,
},
bounce: {
horizontal: {
value: 1,
},
vertical: {
value: 1,
},
},
enable: false,
maxSpeed: 30,
mode: CollisionMode.bounce,
overlap: {
enable: true,
retries: 0,
},
},
color: {
value: '#f56e0f',
animation: {
h: {
count: 0,
enable: false,
speed: 1,
decay: 0,
delay: 0,
sync: true,
offset: 0,
},
s: {
count: 0,
enable: false,
speed: 1,
decay: 0,
delay: 0,
sync: true,
offset: 0,
},
l: {
count: 0,
enable: false,
speed: 1,
decay: 0,
delay: 0,
sync: true,
offset: 0,
},
},
},
effect: {
close: true,
fill: true,
},
move: {
angle: {
offset: 0,
value: 90,
},
attract: {
distance: 200,
enable: false,
rotate: {
x: 3000,
y: 3000,
},
},
center: {
x: 50,
y: 50,
mode: PixelMode.percent,
radius: 0,
},
decay: 0,
direction: MoveDirection.none,
drift: 0,
enable: true,
gravity: {
acceleration: 9.81,
enable: false,
inverse: false,
maxSpeed: 50,
},
path: {
clamp: true,
delay: {
value: 0,
},
enable: false,
},
outModes: {
default: OutMode.out,
},
random: false,
size: false,
speed: 5,
spin: {
acceleration: 0,
enable: false,
},
straight: false,
trail: {
enable: false,
length: 10,
fill: {},
},
vibrate: false,
warp: false,
},
number: {
density: {
enable: true,
width: 1920,
height: 1080,
},
limit: {
mode: LimitMode.delete,
value: 0,
},
value: 6,
},
opacity: {
value: {
min: 0.3,
max: 0.7,
},
animation: {
count: 0,
enable: false,
speed: 2,
decay: 0,
delay: 0,
sync: false,
mode: AnimationMode.auto,
startValue: StartValueType.random,
destroy: DestroyType.none,
},
},
reduceDuplicates: false,
shadow: {
blur: 0,
color: {
value: '#000',
},
enable: false,
offset: {
x: 0,
y: 0,
},
},
shape: {
close: true,
fill: true,
options: {
polygon: {
sides: 6,
},
},
type: 'polygon',
},
size: {
value: {
min: 100,
max: 150,
},
animation: {
count: 0,
enable: false,
speed: 3,
decay: 0,
delay: 0,
sync: false,
mode: AnimationMode.auto,
startValue: StartValueType.random,
destroy: DestroyType.none,
},
},
stroke: {
width: 0,
},
zIndex: {
value: 0,
opacityRate: 1,
sizeRate: 1,
velocityRate: 1,
},
destroy: {
bounds: {},
mode: 'none',
split: {
count: 1,
factor: {
value: 3,
},
rate: {
value: {
min: 4,
max: 9,
},
},
sizeOffset: true,
},
},
roll: {
darken: {
enable: false,
value: 0,
},
enable: false,
enlighten: {
enable: false,
value: 0,
},
mode: 'vertical',
speed: 25,
},
tilt: {
value: 0,
animation: {
enable: false,
speed: 0,
decay: 0,
sync: false,
},
direction: -90,
enable: false,
},
twinkle: {
lines: {
enable: false,
frequency: 0.05,
opacity: 1,
},
particles: {
enable: false,
frequency: 0.05,
opacity: 1,
},
},
wobble: {
distance: 5,
enable: false,
speed: {
angle: 50,
move: 10,
},
},
life: {
count: 0,
delay: {
value: 0,
sync: false,
},
duration: {
value: 0,
sync: false,
},
},
rotate: {
value: 0,
animation: {
enable: false,
speed: 0,
decay: 0,
sync: false,
},
direction: -90,
path: false,
},
orbit: {
animation: {
count: 0,
enable: false,
speed: 1,
decay: 0,
delay: 0,
sync: false,
},
enable: false,
opacity: 1,
rotation: {
value: 45,
},
width: 1,
},
links: {
blink: false,
color: {
value: '#ffffff',
},
consent: false,
distance: 200,
enable: false,
frequency: 1,
opacity: 1,
shadow: {
blur: 5,
color: {
value: '#000',
},
enable: false,
},
triangles: {
enable: false,
frequency: 1,
},
width: 2,
warp: false,
},
repulse: {
value: 0,
enabled: false,
distance: 1,
duration: 1,
factor: 1,
speed: 1,
},
},
pauseOnBlur: true,
pauseOnOutsideViewport: true,
smooth: false,
zLayers: 100,
name: 'Bubble',
motion: {
disable: false,
reduce: {
factor: 4,
value: true,
},
},
};
constructor(
private readonly ngParticlesService: NgParticlesService,
@Inject(PLATFORM_ID) private platformId: Object
) {}
ngAfterViewInit(): void {
if (isPlatformBrowser(this.platformId)) {
import('@tsparticles/angular').then(() => {
this.ngParticlesService.init(async (engine) => {
await loadSlim(engine);
});
});
}
}
}
The HTML is just
<ngx-particles [id]="id" [options]="particlesOptions"></ngx-particles>
Thanks in advance to anyone willing to help!